Skip to content

Commit 034b2ee

Browse files
authored
Prevent creating POS in protected land (#150)
2 parents 02eaa42 + dce5958 commit 034b2ee

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;
@@ -19,6 +23,7 @@
1923
import java.util.ArrayList;
2024
import java.util.Arrays;
2125
import java.util.Date;
26+
import java.util.List;
2227
import java.util.Optional;
2328
import java.util.Set;
2429

@@ -71,6 +76,8 @@ public boolean execute(final @NotNull CommandSender sender, final @NotNull Strin
7176
if (block.isEmpty()) return sendMessage(sender, BankAccounts.getInstance().config().messagesErrorsAsyncFailed());
7277
if (!(block.get() instanceof final @NotNull Chest chest))
7378
return sendMessage(sender, BankAccounts.getInstance().config().messagesErrorsPosNotChest());
79+
if (!canOpenChest(player, chest))
80+
return true;
7481
if (chest.getInventory() instanceof DoubleChestInventory)
7582
return sendMessage(sender, BankAccounts.getInstance().config().messagesErrorsPosDoubleChest());
7683
if (chest.getInventory().isEmpty()) return sendMessage(sender, BankAccounts.getInstance().config().messagesErrorsPosEmpty());
@@ -88,6 +95,31 @@ public boolean execute(final @NotNull CommandSender sender, final @NotNull Strin
8895
return sendMessage(sender, BankAccounts.getInstance().config().messagesPosCreated(pos));
8996
}
9097

98+
private static boolean canOpenChest(final @NotNull Player player, final @NotNull Chest chest) {
99+
return BankAccounts.runOnMain(() -> {
100+
final @NotNull Block block = chest.getBlock();
101+
102+
final @NotNull PlayerInteractEvent event = new PlayerInteractEvent(
103+
player,
104+
Action.RIGHT_CLICK_BLOCK,
105+
player.getInventory().getItemInMainHand(),
106+
block,
107+
getTargetedFace(player).orElse(BlockFace.NORTH)
108+
);
109+
110+
BankAccounts.getInstance().getServer().getPluginManager().callEvent(event);
111+
return event.useInteractedBlock() != Event.Result.DENY;
112+
}).orElse(false);
113+
}
114+
115+
private static @NotNull Optional<@NotNull BlockFace> getTargetedFace(final @NotNull Player player) {
116+
final @NotNull List<@NotNull Block> lastTwoTargetBlocks = player.getLastTwoTargetBlocks(null, 5);
117+
if (lastTwoTargetBlocks.size() != 2 || !lastTwoTargetBlocks.get(1).getType().isOccluding()) return Optional.empty();
118+
final @NotNull Block targetBlock = lastTwoTargetBlocks.get(1);
119+
final @NotNull Block adjacentBlock = lastTwoTargetBlocks.get(0);
120+
return Optional.ofNullable(targetBlock.getFace(adjacentBlock));
121+
}
122+
91123
@Override
92124
public @NotNull ArrayList<@NotNull String> tab(final @NotNull CommandSender sender, final @NotNull String @NotNull [] args) {
93125
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)