Skip to content

Commit d7c67a2

Browse files
committed
Merge branch 'master' into improve-commands
2 parents 22a6a66 + 034b2ee commit d7c67a2

File tree

4 files changed

+96
-58
lines changed

4 files changed

+96
-58
lines changed

src/main/java/pro/cloudnode/smp/bankaccounts/BankAccounts.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import pro.cloudnode.smp.bankaccounts.events.BlockBreak;
2424
import pro.cloudnode.smp.bankaccounts.events.GUI;
2525
import pro.cloudnode.smp.bankaccounts.events.Join;
26-
import pro.cloudnode.smp.bankaccounts.events.PlayerInteract;
26+
import pro.cloudnode.smp.bankaccounts.events.POSOpen;
2727
import pro.cloudnode.smp.bankaccounts.integrations.PAPIIntegration;
2828
import pro.cloudnode.smp.bankaccounts.integrations.VaultIntegration;
2929

@@ -89,7 +89,7 @@ public void onEnable() {
8989
final @NotNull Listener[] events = new Listener[]{
9090
new Join(),
9191
new BlockBreak(),
92-
new PlayerInteract(),
92+
new POSOpen(),
9393
new GUI()
9494
};
9595
for (final @NotNull Listener event : events) getServer().getPluginManager().registerEvents(event, this);

src/main/java/pro/cloudnode/smp/bankaccounts/commands/POSCommand.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package pro.cloudnode.smp.bankaccounts.commands;
22

33
import org.bukkit.block.Block;
4+
import org.bukkit.block.BlockFace;
45
import org.bukkit.block.BlockState;
56
import org.bukkit.block.Chest;
67
import org.bukkit.command.CommandSender;
78
import org.bukkit.entity.Player;
9+
import org.bukkit.event.Event;
10+
import org.bukkit.event.block.Action;
11+
import org.bukkit.event.player.PlayerInteractEvent;
812
import org.bukkit.inventory.DoubleChestInventory;
913
import org.jetbrains.annotations.NotNull;
1014
import org.jetbrains.annotations.Nullable;
@@ -21,6 +25,7 @@
2125
import java.util.ArrayList;
2226
import java.util.Arrays;
2327
import java.util.Date;
28+
import java.util.List;
2429
import java.util.Optional;
2530
import java.util.Set;
2631

@@ -73,6 +78,8 @@ public final class POSCommand extends Command {
7378
if (block.isEmpty()) return new Message(sender, BankAccounts.getInstance().config().messagesErrorsAsyncFailed());
7479
if (!(block.get() instanceof final @NotNull Chest chest))
7580
return new Message(sender, BankAccounts.getInstance().config().messagesErrorsPosNotChest());
81+
if (!canOpenChest(player, chest))
82+
return CommandResult.DO_NOTHING;
7683
if (chest.getInventory() instanceof DoubleChestInventory)
7784
return new Message(sender, BankAccounts.getInstance().config().messagesErrorsPosDoubleChest());
7885
if (chest.getInventory().isEmpty()) return new Message(sender, BankAccounts.getInstance().config().messagesErrorsPosEmpty());
@@ -90,6 +97,31 @@ public final class POSCommand extends Command {
9097
return new Message(sender, BankAccounts.getInstance().config().messagesPosCreated(pos));
9198
}
9299

100+
private static boolean canOpenChest(final @NotNull Player player, final @NotNull Chest chest) {
101+
return BankAccounts.runOnMain(() -> {
102+
final @NotNull Block block = chest.getBlock();
103+
104+
final @NotNull PlayerInteractEvent event = new PlayerInteractEvent(
105+
player,
106+
Action.RIGHT_CLICK_BLOCK,
107+
player.getInventory().getItemInMainHand(),
108+
block,
109+
getTargetedFace(player).orElse(BlockFace.NORTH)
110+
);
111+
112+
BankAccounts.getInstance().getServer().getPluginManager().callEvent(event);
113+
return event.useInteractedBlock() != Event.Result.DENY;
114+
}).orElse(false);
115+
}
116+
117+
private static @NotNull Optional<@NotNull BlockFace> getTargetedFace(final @NotNull Player player) {
118+
final @NotNull List<@NotNull Block> lastTwoTargetBlocks = player.getLastTwoTargetBlocks(null, 5);
119+
if (lastTwoTargetBlocks.size() != 2 || !lastTwoTargetBlocks.get(1).getType().isOccluding()) return Optional.empty();
120+
final @NotNull Block targetBlock = lastTwoTargetBlocks.get(1);
121+
final @NotNull Block adjacentBlock = lastTwoTargetBlocks.get(0);
122+
return Optional.ofNullable(targetBlock.getFace(adjacentBlock));
123+
}
124+
93125
@Override
94126
public @NotNull ArrayList<@NotNull String> tab(final @NotNull CommandSender sender, final @NotNull String @NotNull [] args) {
95127
final @NotNull ArrayList<@NotNull String> suggestions = new ArrayList<>();
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package pro.cloudnode.smp.bankaccounts.events;
2+
3+
import org.bukkit.block.Block;
4+
import org.bukkit.block.Chest;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.event.Event;
7+
import org.bukkit.event.EventHandler;
8+
import org.bukkit.event.Listener;
9+
import org.bukkit.event.block.Action;
10+
import org.bukkit.event.player.PlayerInteractEvent;
11+
import org.bukkit.inventory.DoubleChestInventory;
12+
import org.bukkit.inventory.ItemStack;
13+
import org.jetbrains.annotations.NotNull;
14+
import org.jetbrains.annotations.Nullable;
15+
import pro.cloudnode.smp.bankaccounts.Account;
16+
import pro.cloudnode.smp.bankaccounts.BankAccounts;
17+
import pro.cloudnode.smp.bankaccounts.POS;
18+
import pro.cloudnode.smp.bankaccounts.Permissions;
19+
20+
import java.util.Optional;
21+
22+
public final class POSOpen implements Listener {
23+
@EventHandler
24+
public void openPOS(final @NotNull PlayerInteractEvent event) {
25+
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
26+
final @Nullable Block block = event.getClickedBlock();
27+
if (block == null) return;
28+
if (!(block.getState() instanceof final @NotNull Chest chest)) return;
29+
if (chest.getInventory().isEmpty()) return;
30+
if (chest.getInventory() instanceof DoubleChestInventory) return;
31+
32+
final @NotNull Optional<POS> pos = POS.get(block);
33+
if (pos.isEmpty()) return;
34+
35+
event.setUseInteractedBlock(Event.Result.DENY);
36+
37+
final @NotNull Player player = event.getPlayer();
38+
if (player.getUniqueId().equals(pos.get().seller.owner.getUniqueId())) {
39+
POS.openOwnerGui(player, chest, pos.get());
40+
return;
41+
}
42+
if (!player.hasPermission(Permissions.POS_USE)) {
43+
player.sendMessage(BankAccounts.getInstance().config().messagesErrorsPosNoPermission());
44+
return;
45+
}
46+
final @NotNull ItemStack heldItem = player.getInventory().getItemInMainHand();
47+
if (heldItem.getType() != BankAccounts.getInstance().config().instrumentsMaterial()) {
48+
player.sendMessage(BankAccounts.getInstance().config().messagesErrorsNoCard());
49+
return;
50+
}
51+
final @NotNull Optional<@NotNull Account> account = Account.get(heldItem);
52+
if (account.isEmpty()) player.sendMessage(BankAccounts.getInstance().config().messagesErrorsPosInvalidCard());
53+
else {
54+
if (!player.hasPermission(Permissions.POS_USE_OTHER) && !account.get().owner.getUniqueId()
55+
.equals(player.getUniqueId())) {
56+
player.sendMessage(BankAccounts.getInstance().config().messagesErrorsNotAccountOwner());
57+
return;
58+
}
59+
POS.openBuyGui(player, chest, pos.get(), account.get());
60+
}
61+
}
62+
}

src/main/java/pro/cloudnode/smp/bankaccounts/events/PlayerInteract.java

Lines changed: 0 additions & 56 deletions
This file was deleted.

0 commit comments

Comments
 (0)