Skip to content

Commit 8aef04a

Browse files
committed
Fixed chunk listener to protect chunk but let player interact with non harmful stuff
1 parent c67794d commit 8aef04a

File tree

1 file changed

+90
-68
lines changed

1 file changed

+90
-68
lines changed

src/main/java/de/lars/utilsmanager/features/chunk/ChunkOwnerListener.java

Lines changed: 90 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import de.lars.apimanager.apis.chunkAPI.ChunkAPI;
44
import de.lars.apimanager.apis.languageAPI.LanguageAPI;
55
import de.lars.apimanager.apis.rankAPI.RankAPI;
6-
import de.lars.utilsmanager.UtilsManager;
7-
import de.lars.utilsmanager.util.Statements;
6+
import de.lars.utilsmanager.utils.Statements;
87
import net.kyori.adventure.text.Component;
98
import net.kyori.adventure.text.format.NamedTextColor;
109
import org.bukkit.*;
1110
import org.bukkit.block.Block;
11+
import org.bukkit.block.data.BlockData;
12+
import org.bukkit.block.data.Openable;
13+
import org.bukkit.block.data.type.Bed;
14+
import org.bukkit.block.data.type.Switch;
1215
import org.bukkit.entity.*;
1316
import org.bukkit.event.EventHandler;
1417
import org.bukkit.event.Listener;
@@ -19,14 +22,43 @@
1922
import org.bukkit.event.entity.*;
2023
import org.bukkit.event.player.PlayerInteractEvent;
2124

22-
import java.util.Iterator;
23-
import java.util.List;
24-
import java.util.Objects;
25-
import java.util.UUID;
26-
import java.util.concurrent.atomic.AtomicBoolean;
25+
import java.util.*;
2726

2827
public class ChunkOwnerListener implements Listener {
2928

29+
private static final Set<Material> SAFE_INTERACTABLES = EnumSet.of(
30+
Material.OAK_DOOR, Material.SPRUCE_DOOR, Material.BIRCH_DOOR, Material.JUNGLE_DOOR,
31+
Material.ACACIA_DOOR, Material.DARK_OAK_DOOR, Material.CRIMSON_DOOR, Material.WARPED_DOOR,
32+
Material.IRON_DOOR,
33+
Material.OAK_TRAPDOOR, Material.SPRUCE_TRAPDOOR, Material.BIRCH_TRAPDOOR,
34+
Material.JUNGLE_TRAPDOOR, Material.ACACIA_TRAPDOOR, Material.DARK_OAK_TRAPDOOR,
35+
Material.CRIMSON_TRAPDOOR, Material.WARPED_TRAPDOOR, Material.IRON_TRAPDOOR,
36+
Material.OAK_FENCE_GATE, Material.SPRUCE_FENCE_GATE, Material.BIRCH_FENCE_GATE,
37+
Material.JUNGLE_FENCE_GATE, Material.ACACIA_FENCE_GATE, Material.DARK_OAK_FENCE_GATE,
38+
Material.CRIMSON_FENCE_GATE, Material.WARPED_FENCE_GATE,
39+
40+
Material.LEVER,
41+
Material.STONE_BUTTON, Material.OAK_BUTTON, Material.SPRUCE_BUTTON, Material.BIRCH_BUTTON,
42+
Material.JUNGLE_BUTTON, Material.ACACIA_BUTTON, Material.DARK_OAK_BUTTON,
43+
Material.CRIMSON_BUTTON, Material.WARPED_BUTTON,
44+
45+
Material.BELL, Material.CAULDRON, Material.WATER_CAULDRON,
46+
Material.LAVA_CAULDRON, Material.POWDER_SNOW_CAULDRON
47+
);
48+
49+
private static final Set<Material> ITEM_STORAGE_BLOCKS = EnumSet.of(
50+
Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL,
51+
Material.SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.ORANGE_SHULKER_BOX,
52+
Material.MAGENTA_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX,
53+
Material.LIME_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.GRAY_SHULKER_BOX,
54+
Material.LIGHT_GRAY_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.PURPLE_SHULKER_BOX,
55+
Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.GREEN_SHULKER_BOX,
56+
Material.RED_SHULKER_BOX, Material.BLACK_SHULKER_BOX,
57+
Material.HOPPER, Material.DROPPER, Material.DISPENSER,
58+
Material.BLAST_FURNACE, Material.FURNACE, Material.SMOKER,
59+
Material.BREWING_STAND, Material.LECTERN, Material.COMPOSTER
60+
);
61+
3062
@EventHandler
3163
public void onBlockBreak(BlockBreakEvent event) {
3264
Chunk chunk = event.getBlock().getChunk();
@@ -87,83 +119,73 @@ public void onBlockPlace(BlockPlaceEvent event) {
87119

88120
@EventHandler
89121
public void onPlayerInteract(PlayerInteractEvent event) {
90-
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
91-
if (event.getClickedBlock() == null) return;
92-
93122
Player player = event.getPlayer();
94-
Block clicked = event.getClickedBlock();
95-
96-
if (!isContainer(clicked)) return;
97123

98-
if (player.hasPermission("plugin.maintenance")) return;
99-
100-
Chunk chunk = clicked.getChunk();
101-
UUID owner = ChunkAPI.getApi().getChunkOwner(chunk);
102-
if (owner == null) return;
124+
if (event.getClickedBlock() == null) {
125+
return;
126+
}
127+
if (RankAPI.getApi().getRankId(player) >= 9) {
128+
return;
129+
}
103130

104-
String uuidStr = player.getUniqueId().toString();
105-
List<String> friends = ChunkAPI.getApi().getFriends(chunk);
131+
Block block = event.getClickedBlock();
132+
Chunk chunk = block.getChunk();
106133

107-
if (friends.contains(uuidStr) || friends.contains("*")) return;
108-
if (owner.toString().equals(uuidStr)) return;
134+
if (ChunkAPI.getApi().getChunkOwner(chunk) == null) {
135+
return;
136+
}
109137

110-
event.setCancelled(true);
111-
OfflinePlayer offOwner = Bukkit.getOfflinePlayer(owner);
112-
if (LanguageAPI.getApi().getLanguage(player) == 2) {
113-
player.sendMessage(Statements.getPrefix()
114-
.append(Component.text("Der Chunk gehört nicht dir und du bist auch kein Freund oder Vertrauter! Besitzer: ", NamedTextColor.RED))
115-
.append(Component.text(offOwner.getName() + "!", NamedTextColor.DARK_PURPLE))
116-
.append(Component.text("(" + chunk + ")", NamedTextColor.YELLOW)));
117-
} else {
118-
player.sendMessage(Statements.getPrefix()
119-
.append(Component.text("This chunk isn´t yours and you aren´t a friend or trusted! Owner: ", NamedTextColor.RED))
120-
.append(Component.text(offOwner.getName() + "!", NamedTextColor.DARK_PURPLE))
121-
.append(Component.text("(" + chunk + ")", NamedTextColor.YELLOW)));
138+
if (ChunkAPI.getApi().getFriends(chunk).contains(player.getUniqueId().toString()) || ChunkAPI.getApi().getFriends(chunk).contains("*")) {
139+
return;
122140
}
123-
}
124141

125-
@EventHandler
126-
public void onEntityExplode(EntityExplodeEvent event) {
127-
Entity entity = event.getEntity();
128-
List<org.bukkit.block.Block> blocks = event.blockList();
142+
if (Objects.equals(ChunkAPI.getApi().getChunkOwner(chunk).toString(), player.getUniqueId().toString())) {
143+
return;
144+
}
129145

130-
Iterator<Block> iterator = blocks.iterator();
131-
while (iterator.hasNext()) {
132-
org.bukkit.block.Block block = iterator.next();
133-
Chunk chunk = block.getChunk();
134-
UUID owner = ChunkAPI.getApi().getChunkOwner(chunk);
146+
Material type = block.getType();
135147

136-
if (owner != null) {
137-
iterator.remove();
148+
if (ITEM_STORAGE_BLOCKS.contains(type)) {
149+
OfflinePlayer owner = Bukkit.getOfflinePlayer(ChunkAPI.getApi().getChunkOwner(chunk));
150+
if (LanguageAPI.getApi().getLanguage(player) == 2) {
151+
player.sendMessage(Statements.getPrefix().append(Component.text("Der Chunk gehört nicht dir und du bist auch kein Freund oder Vertrauter! Besitzer: ", NamedTextColor.RED))
152+
.append(Component.text(owner.getName() + "!", NamedTextColor.DARK_PURPLE))
153+
.append(Component.text("(" + chunk + ")", NamedTextColor.YELLOW)));
154+
} else {
155+
player.sendMessage(Statements.getPrefix().append(Component.text("This chunk isn´t yours and you aren´t a friend or trusted! Owner: ", NamedTextColor.RED))
156+
.append(Component.text(owner.getName() + "!", NamedTextColor.DARK_PURPLE))
157+
.append(Component.text("(" + chunk + ")", NamedTextColor.YELLOW)));
138158
}
159+
event.setCancelled(true);
160+
return;
139161
}
140-
}
141-
142-
@EventHandler
143-
public void onBlockExplode(BlockExplodeEvent event) {
144-
List<org.bukkit.block.Block> blocks = event.blockList();
145162

146-
Iterator<org.bukkit.block.Block> iterator = blocks.iterator();
147-
while (iterator.hasNext()) {
148-
org.bukkit.block.Block block = iterator.next();
149-
Chunk chunk = block.getChunk();
150-
UUID owner = ChunkAPI.getApi().getChunkOwner(chunk);
163+
if (isSafeBlock(block)) {
164+
return;
165+
}
151166

152-
if (owner != null) {
153-
iterator.remove();
154-
}
167+
OfflinePlayer owner = Bukkit.getOfflinePlayer(ChunkAPI.getApi().getChunkOwner(chunk));
168+
if (LanguageAPI.getApi().getLanguage(player) == 2) {
169+
player.sendMessage(Statements.getPrefix().append(Component.text("Der Chunk gehört nicht dir und du bist auch kein Freund oder Vertrauter! Besitzer: ", NamedTextColor.RED))
170+
.append(Component.text(owner.getName() + "!", NamedTextColor.DARK_PURPLE))
171+
.append(Component.text("(" + chunk + ")", NamedTextColor.YELLOW)));
172+
} else {
173+
player.sendMessage(Statements.getPrefix().append(Component.text("This chunk isn´t yours and you aren´t a friend or trusted! Owner: ", NamedTextColor.RED))
174+
.append(Component.text(owner.getName() + "!", NamedTextColor.DARK_PURPLE))
175+
.append(Component.text("(" + chunk + ")", NamedTextColor.YELLOW)));
155176
}
177+
event.setCancelled(true);
156178
}
157179

158-
public static boolean isContainer(Block block) {
159-
if (block == null) return false;
160-
Material m = block.getType();
161-
return m == Material.CHEST
162-
|| m == Material.TRAPPED_CHEST
163-
|| m == Material.BARREL
164-
|| m == Material.SHULKER_BOX
165-
|| m == Material.WHITE_SHULKER_BOX
166-
|| m == Material.LECTERN;
180+
private boolean isSafeBlock(Block block) {
181+
Material mat = block.getType();
182+
BlockData data = block.getBlockData();
183+
184+
if (SAFE_INTERACTABLES.contains(mat)) return true;
185+
if (data instanceof Openable) return true;
186+
if (data instanceof Switch) return true;
187+
if (data instanceof Bed) return true;
188+
return false;
167189
}
168190

169191
/*@EventHandler

0 commit comments

Comments
 (0)