Skip to content

Commit d6bb6bd

Browse files
Merge branch 'Norbit4:master' into ver/1.0
2 parents f76eaff + 2bdcd9c commit d6bb6bd

11 files changed

Lines changed: 222 additions & 28 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ plugins {
44
}
55

66
group = 'pl.norbit'
7-
version = 'v2.0.0'
7+
version = 'v2.0.3'
88

99
repositories {
1010
mavenCentral()

src/main/java/pl/norbit/treecuter/TreeCuter.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,7 @@ public void onEnable() {
4646
}
4747

4848
private void registerCommand(){
49-
var command = getCommand("treecuter");
50-
var treeCuterCommand = new TreeCuterCommand();
51-
52-
command.setExecutor(treeCuterCommand);
49+
getCommand("treecuter").setExecutor(new TreeCuterCommand());
5350
}
5451

5552
private void registerPapi(){
@@ -90,7 +87,9 @@ private boolean checkPlugin(String pluginName) {
9087

9188
if(plugin != null && plugin.isEnabled()){
9289
var logger = getServer().getLogger();
93-
logger.info("Hooked to: " + pluginName);
90+
String message = "Hooked to: " + pluginName;
91+
92+
logger.info(message);
9493
return true;
9594
}
9695
return false;

src/main/java/pl/norbit/treecuter/api/listeners/TreeCutEvent.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@
99
import org.jetbrains.annotations.NotNull;
1010

1111
import java.util.List;
12-
import java.util.Set;
1312

1413
public class TreeCutEvent extends Event implements Cancellable {
1514
private static final HandlerList handlers = new HandlerList();
1615
/**
1716
* -- GETTER --
18-
* Get set of wood blocks.
17+
* Get list of wood blocks.
1918
*/
2019
@Getter
2120
private final List<Block> blocks;

src/main/java/pl/norbit/treecuter/api/listeners/TreeGlowEvent.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@
99
import org.jetbrains.annotations.NotNull;
1010

1111
import java.util.List;
12-
import java.util.Set;
13-
1412

1513
public class TreeGlowEvent extends Event implements Cancellable {
1614
private static final HandlerList handlers = new HandlerList();
1715
/**
1816
* -- GETTER --
19-
* Get set of wood blocks.
17+
* Get list of wood blocks.
2018
*/
2119
@Getter
2220
private final List<Block> blocks;

src/main/java/pl/norbit/treecuter/config/Settings.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import pl.norbit.treecuter.service.TreePlanterService;
1515

1616
import java.util.*;
17+
import java.util.logging.Logger;
1718

1819
public class Settings {
1920

@@ -68,6 +69,9 @@ public class Settings {
6869
@Getter
6970
private static List<Material> autoPlantSapling;
7071

72+
@Getter
73+
private static Map<Material, List<String>> actionsTypeMap;
74+
7175
//block worlds
7276
private static List<String> blockWorlds;
7377

@@ -117,10 +121,20 @@ public class Settings {
117121

118122
private static List<CutShape> woodBlocks;
119123

124+
@Getter
125+
private static boolean actionsEnabled;
126+
@Getter
127+
private static List<String> actions;
128+
120129
private Settings() {
121130
throw new IllegalStateException("This class cannot be instantiated");
122131
}
123132

133+
134+
public static List<String> getActions(Material material){
135+
return actionsTypeMap.get(material);
136+
}
137+
124138
public static Optional<ItemStack> getCustomToolForKey(String key){
125139
return woodBlocks.stream()
126140
.filter(shape -> shape.getId().equalsIgnoreCase(key))
@@ -199,6 +213,9 @@ public static void loadConfig(boolean reload) {
199213
placeholderToggleOn = config.getString("placeholder.toggle-on");
200214
placeholderToggleOff = config.getString("placeholder.toggle-off");
201215

216+
actions = config.getStringList("actions.action-list.global");
217+
actionsEnabled = config.getBoolean("actions.enable");
218+
202219
acceptTools = new ArrayList<>();
203220
acceptWoodBlocks = new ArrayList<>();
204221
acceptLeavesBlocks = new ArrayList<>();
@@ -266,6 +283,7 @@ public static void loadConfig(boolean reload) {
266283

267284
ConfigurationSection section = config.getConfigurationSection("wood-blocks");
268285

286+
269287
if (section == null) {
270288
javaPlugin.getLogger().warning("No wood blocks found in config");
271289
}else {
@@ -282,10 +300,35 @@ public static void loadConfig(boolean reload) {
282300
}
283301
}
284302

303+
loadActionsTypes(config.getConfigurationSection("actions.action-list.types"));
304+
285305
if(autoPlant) TreePlanterService.start();
286306
else TreePlanterService.stop();
287307
}
288308

309+
public static void loadActionsTypes(ConfigurationSection section) {
310+
actionsTypeMap = new EnumMap<>(Material.class);
311+
312+
if (section == null) {
313+
return;
314+
}
315+
316+
Logger logger = TreeCuter.getInstance().getLogger();
317+
318+
for (String key : section.getKeys(false)) {
319+
Material material = Material.getMaterial(key.toUpperCase());
320+
321+
if (material == null) {
322+
logger.warning("Wrong action material: " + key);
323+
continue;
324+
}
325+
326+
List<String> commands = section.getStringList(key);
327+
actionsTypeMap.put(material, commands);
328+
}
329+
}
330+
331+
289332
private static CutShape getCutShape(ConfigurationSection section, String key) {
290333
CutShape cutShape = new CutShape();
291334
cutShape.setId(key);

src/main/java/pl/norbit/treecuter/listeners/BlockBreakListener.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ public void onBlockBreak(BlockBreakEvent e) {
3030

3131
var item = p.getInventory().getItemInMainHand();
3232

33-
CutShape woodBlocks = Settings.getCutShape(b, item);
33+
CutShape shape = Settings.getCutShape(b, item);
3434

35-
if (woodBlocks == null){
35+
if (shape == null){
3636
return;
3737
}
3838

39-
TreeCutService.cutTree(p);
39+
TreeCutService.cutTree(p, shape);
4040
}
4141
}

src/main/java/pl/norbit/treecuter/listeners/BlockInteractListener.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,16 @@ public void onBlockInteract(PlayerInteractEvent e) {
4646
return;
4747
}
4848

49-
if (Settings.isWorldGuardEnabled() && (!WorldGuardUtils.canBreak(b.getLocation(), p))){
50-
return;
51-
}
52-
5349
String worldName = p.getWorld().getName();
5450

5551
if(Settings.isBlockedWorld(worldName)){
5652
return;
5753
}
5854

55+
if(Settings.isShiftMining() && (!p.isSneaking())){
56+
return;
57+
}
58+
5959
if(Settings.isUsePermissions() && (!PermissionsUtils.hasPermission(p, Settings.getPermission()))){
6060
return;
6161
}
@@ -68,7 +68,7 @@ public void onBlockInteract(PlayerInteractEvent e) {
6868
return;
6969
}
7070

71-
if(Settings.isShiftMining() && (!p.isSneaking())){
71+
if (Settings.isWorldGuardEnabled() && (!WorldGuardUtils.canBreak(b.getLocation(), p))){
7272
return;
7373
}
7474

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package pl.norbit.treecuter.service;
2+
3+
import org.bukkit.Material;
4+
import org.bukkit.Server;
5+
import org.bukkit.block.Block;
6+
import org.bukkit.command.ConsoleCommandSender;
7+
import org.bukkit.entity.Player;
8+
import pl.norbit.treecuter.config.Settings;
9+
import pl.norbit.treecuter.config.model.CutShape;
10+
11+
import java.util.List;
12+
import java.util.Map;
13+
import java.util.stream.Collectors;
14+
15+
public class ActionsService {
16+
private record MaterialCount(Material material, long count) { }
17+
18+
private ActionsService() {
19+
throw new IllegalStateException("Utility class");
20+
}
21+
22+
public static void triggerActions(Player p, CutShape shape, List<Block> blocks){
23+
if(!Settings.isActionsEnabled()){
24+
return;
25+
}
26+
27+
String playerName = p.getName();
28+
Server server = p.getServer();
29+
ConsoleCommandSender consoleSender = server.getConsoleSender();
30+
String id = shape.getId();
31+
32+
//global actions
33+
Settings.getActions().forEach(action ->{
34+
String command = action
35+
.replace("{player}", playerName)
36+
.replace("{shape}", id)
37+
.replace("{count}", String.valueOf(blocks.size()));
38+
39+
server.dispatchCommand(consoleSender, command);
40+
});
41+
42+
//material specific actions
43+
countMaterials(blocks).forEach(mCount -> Settings.getActions(mCount.material)
44+
.forEach(action -> {
45+
String command = action
46+
.replace("{player}", playerName)
47+
.replace("{shape}", id)
48+
.replace("{count}", String.valueOf(mCount.count()));
49+
50+
server.dispatchCommand(consoleSender, command);
51+
}));
52+
}
53+
54+
private static List<MaterialCount> countMaterials(List<Block> blocks) {
55+
Map<Material, Long> counts = blocks.stream()
56+
.collect(Collectors.groupingBy(
57+
Block::getType,
58+
Collectors.counting()
59+
));
60+
61+
return counts.entrySet().stream()
62+
.map(e -> new MaterialCount(e.getKey(), e.getValue()))
63+
.toList();
64+
}
65+
}

src/main/java/pl/norbit/treecuter/service/TreeCutService.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package pl.norbit.treecuter.service;
22

3+
import org.bukkit.Bukkit;
34
import org.bukkit.Material;
5+
import org.bukkit.Server;
46
import org.bukkit.block.Block;
57
import org.bukkit.entity.Player;
8+
import org.bukkit.event.block.BlockBreakEvent;
69
import org.bukkit.inventory.ItemStack;
710
import org.bukkit.inventory.PlayerInventory;
811
import org.bukkit.plugin.PluginManager;
@@ -24,8 +27,6 @@
2427

2528
public class TreeCutService {
2629

27-
// private static final Map<UUID, List<Block>> selectedBlocks = new HashMap<>();
28-
// private static final Map<UUID, Block> mainBlocks = new HashMap<>();
2930
private static final Map<UUID, SelectedBreak> selectedMap = new HashMap<>();
3031
private static final PluginManager pluginManager = TreeCuter.getInstance().getServer().getPluginManager();
3132
private static final List<BreakTask> breakTasks = new CopyOnWriteArrayList<>();
@@ -152,7 +153,7 @@ private static boolean lastBlocksIsSame(UUID playerUUID, Block mainBlock, List<B
152153
* When player has no selected blocks, do nothing.
153154
* @param p Player
154155
*/
155-
public static void cutTree(Player p) {
156+
public static void cutTree(Player p, CutShape shape) {
156157
if(p == null){
157158
return;
158159
}
@@ -190,6 +191,8 @@ public static void cutTree(Player p) {
190191
updateItem(p, size - 1);
191192

192193
selectedMap.remove(p.getUniqueId());
194+
195+
ActionsService.triggerActions(p, shape, blocks);
193196
}
194197

195198
private static void breakBlock(Player p, Block b){
@@ -206,6 +209,10 @@ private static void breakBlock(Player p, Block b){
206209
if(mat == Material.AIR){
207210
return;
208211
}
212+
213+
//simulate event for plugins compatibility
214+
// simulateBlockBreakEvent(p, b);
215+
209216
//log block break to CoreProtect
210217
CoreProtectService.logBreak(p.getName(), b.getState());
211218

@@ -215,6 +222,14 @@ private static void breakBlock(Player p, Block b){
215222
} else b.breakNaturally();
216223
}
217224

225+
private static void simulateBlockBreakEvent(Player p, Block b){
226+
BlockBreakEvent e = new BlockBreakEvent(b, p);
227+
TreeCuter.getInstance().getServer().getPluginManager().callEvent(e);
228+
229+
e.setDropItems(false);
230+
e.setExpToDrop(0);
231+
}
232+
218233
private static void updateItem(Player p, int durabilityDamage){
219234
PlayerInventory inventory = p.getInventory();
220235

src/main/java/pl/norbit/treecuter/utils/WorldGuardUtils.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,41 @@
1010
import com.sk89q.worldguard.protection.managers.RegionManager;
1111
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
1212
import org.bukkit.Location;
13+
import org.bukkit.World;
1314
import org.bukkit.entity.Player;
1415

1516
import java.util.Collection;
17+
import java.util.HashMap;
1618
import java.util.List;
19+
import java.util.Map;
1720

1821
public class WorldGuardUtils {
22+
private static final Map<String, RegionManager> REGION_CACHE = new HashMap<>();
1923

2024
private WorldGuardUtils() {
2125
throw new IllegalStateException("This class cannot be instantiated");
2226
}
2327

24-
public static boolean canBreak(Location loc, Player p) {
28+
public static RegionManager getRegionManager(World world) {
29+
var cached = REGION_CACHE.get(world.getName());
30+
31+
if(cached != null){
32+
return cached;
33+
}
34+
2535
var container = WorldGuard.getInstance().getPlatform().getRegionContainer();
36+
var current = container.get(BukkitAdapter.adapt(world));
37+
REGION_CACHE.put(world.getName(), current);
38+
39+
return current;
40+
}
2641

42+
public static boolean canBreak(Location loc, Player p) {
2743
if(p.isOp()){
2844
return true;
2945
}
3046

31-
var regionManager = container.get(BukkitAdapter.adapt(loc.getWorld()));
47+
var regionManager = getRegionManager(loc.getWorld());
3248

3349
if (regionManager == null){
3450
return true;
@@ -52,6 +68,10 @@ private static boolean canBreakInRegion(Player p, ProtectedRegion region) {
5268
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(p);
5369
StateFlag.State flag = region.getFlag(Flags.BLOCK_BREAK);
5470

71+
if(region.isOwner(localPlayer)){
72+
return true;
73+
}
74+
5575
if(region.isMember(localPlayer) && flag != StateFlag.State.DENY){
5676
return true;
5777
}

0 commit comments

Comments
 (0)