From 4d7507c557c129ed1fd1fe5213799fbf34928539 Mon Sep 17 00:00:00 2001 From: Jascha Starke Date: Mon, 12 Aug 2013 15:50:05 +0200 Subject: [PATCH] ItemFrame support in BlockState Reworked DocComments for plib-1.1 --- TODO.txt | 4 - pom.xml | 4 +- .../FeatureBlockItemSpawn.java | 22 +++- .../limitedcreative/LimitedCreative.java | 10 ++ .../limitedcreative/ModBlockStates.java | 3 +- .../blockstate/BlockStateConfig.java | 1 + .../blockstate/HangingListener.java | 118 ++++++++++++++++++ .../blockstate/PlayerListener.java | 78 +++++++----- .../cmdblocker/CmdBlockList.java | 6 +- .../cmdblocker/CmdBlockerConfig.java | 1 + .../limitedcreative/gmperm/GMPermConfig.java | 1 + .../inventories/ArmoryConfig.java | 1 + .../inventories/InventoryConfig.java | 2 +- .../limitedcreative/limits/BlackList.java | 5 +- .../limits/BlackListEntity.java | 5 +- .../limitedcreative/limits/LimitConfig.java | 6 +- .../limitedcreative/regions/RegionConfig.java | 1 + 17 files changed, 218 insertions(+), 50 deletions(-) delete mode 100644 TODO.txt create mode 100644 src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/HangingListener.java diff --git a/TODO.txt b/TODO.txt deleted file mode 100644 index 53e0377..0000000 --- a/TODO.txt +++ /dev/null @@ -1,4 +0,0 @@ - - cleanup localize-messages - - region command descriptions - - rework german localization - - fix DocComment formatting for config and permissions \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2bbda4c..21c910f 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ UTF-8 - 1.0-SNAPSHOT + 1.1-SNAPSHOT @@ -72,7 +72,7 @@ org.bukkit bukkit - 1.6.2-R0.1-SNAPSHOT + 1.6.2-R0.1 diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/FeatureBlockItemSpawn.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/FeatureBlockItemSpawn.java index 4139f88..b0aad75 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/FeatureBlockItemSpawn.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/FeatureBlockItemSpawn.java @@ -27,18 +27,30 @@ public class FeatureBlockItemSpawn extends CoreModule implement public boolean isBlocked(Location l, Material type) { cleanup(); + if (isDebug()) + getLog().debug("Checking ItemBlocked: " + l.toString() + " - " + type.toString()); for (BlockItemDrop block : list) { - if (block.getLocation().equals(l) && (block.getType() == null || block.getType().equals(type))) + if (isDebug()) + getLog().debug(" - " + block.toString()); + if (block.getLocation().equals(l) && (block.getType() == null || block.getType().equals(type))) { + if (isDebug()) + getLog().debug(" blocked!"); return true; + } } + if (isDebug()); + getLog().debug(" allowed"); return false; } private void cleanup() { Iterator i = list.iterator(); while (i.hasNext()) { BlockItemDrop block = i.next(); - if (block.getTimestamp() < System.currentTimeMillis() - TIME_OFFSET) + if (block.getTimestamp() < System.currentTimeMillis() - TIME_OFFSET) { + if (isDebug()) + getLog().debug("Removing outdated BlokItemDrop: " + block.toString()); i.remove(); + } } } @@ -60,6 +72,9 @@ public class FeatureBlockItemSpawn extends CoreModule implement public long getTimestamp() { return timestamp; } + public String toString() { + return Long.toString(timestamp) + ": " + l.toString() + (type != null ? " - " + type.toString() : ""); + } } public void block(Block block, Player player) { @@ -76,6 +91,9 @@ public class FeatureBlockItemSpawn extends CoreModule implement public void block(Block block) { block(block, null); } + public void block(Location l) { + list.add(new BlockItemDrop(l, null)); + } public void block(Location l, Material type) { list.add(new BlockItemDrop(l, type)); } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java index e808682..d8b391e 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java @@ -5,6 +5,7 @@ import de.jaschastarke.I18n; import de.jaschastarke.bukkit.lib.Core; import de.jaschastarke.bukkit.lib.PluginLang; import de.jaschastarke.bukkit.lib.configuration.command.ConfigCommand; +import de.jaschastarke.utils.ClassDescriptorStorage; public class LimitedCreative extends Core { protected Config config = null; @@ -42,6 +43,15 @@ public class LimitedCreative extends Core { new Backdoor().install(); } + @Override + public ClassDescriptorStorage getDocCommentStorage() { + if (cds == null) { + cds = new ClassDescriptorStorage(); + cds.getResourceBundle().addResourceBundle("lang.doccomments"); + } + return cds; + } + @Override public boolean isDebug() { return config.getDebug(); diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModBlockStates.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModBlockStates.java index e3adfb9..8aa331a 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModBlockStates.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModBlockStates.java @@ -7,6 +7,7 @@ import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockStateCommand; import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockStateConfig; import de.jaschastarke.minecraft.limitedcreative.blockstate.DBQueries; import de.jaschastarke.minecraft.limitedcreative.blockstate.DependencyListener; +import de.jaschastarke.minecraft.limitedcreative.blockstate.HangingListener; import de.jaschastarke.minecraft.limitedcreative.blockstate.PlayerListener; import de.jaschastarke.minecraft.limitedcreative.blockstate.worldedit.LCEditSessionFactory; import de.jaschastarke.modularize.IModule; @@ -39,6 +40,7 @@ public class ModBlockStates extends CoreModule { plugin.getPluginConfig().registerSection(config); listeners.addListener(new BlockListener(this)); + listeners.addListener(new HangingListener(this)); listeners.addListener(new PlayerListener(this)); listeners.addListener(new DependencyListener(this)); @@ -63,7 +65,6 @@ public class ModBlockStates extends CoreModule { getLog().warn(plugin.getLocale().trans("block_state.warning.worldedit_sessionfactory_failed", e.getMessage())); } - plugin.getCommandHandler().registerCommand(command); plugin.getMainCommand().registerCommand(new AliasHelpedCommand(command, "blockstate", new String[]{"bs"})); diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockStateConfig.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockStateConfig.java index 3991d58..6827dfb 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockStateConfig.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockStateConfig.java @@ -25,6 +25,7 @@ public class BlockStateConfig extends Configuration implements IConfigurationSub protected ModuleEntry entry; public BlockStateConfig(ModBlockStates mod, ModuleEntry modEntry) { + super(mod.getPlugin()); this.mod = mod; entry = modEntry; } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/HangingListener.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/HangingListener.java new file mode 100644 index 0000000..ebeba05 --- /dev/null +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/HangingListener.java @@ -0,0 +1,118 @@ +package de.jaschastarke.minecraft.limitedcreative.blockstate; + +import java.sql.SQLException; +import java.util.Date; + +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.entity.ItemFrame; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.hanging.HangingPlaceEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; + +import de.jaschastarke.minecraft.limitedcreative.ModBlockStates; +import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState.Source; + +public class HangingListener implements Listener { + private ModBlockStates mod; + public HangingListener(ModBlockStates mod) { + this.mod = mod; + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + if (event.getRightClicked() instanceof ItemFrame) { + try { + BlockState s = mod.getQueries().find(event.getRightClicked().getLocation()); + if (s != null) { + if (mod.isDebug()) + mod.getLog().debug("Modifying hanging: " + s.toString()); + + if ((s.getGameMode() == GameMode.CREATIVE || s.getSource() == Source.EDIT) && event.getPlayer().getGameMode() != GameMode.CREATIVE) { + if (mod.isDebug()) + mod.getLog().debug("... was placed by creative. Modify prevented"); + event.setCancelled(true); + return; + } else { + s.setPlayer(event.getPlayer()); + s.setDate(new Date()); + mod.getQueries().update(s); + } + } else { + s = new BlockState(); + s.setLocation(event.getRightClicked().getLocation().getBlock().getLocation()); + s.setPlayer(event.getPlayer()); + s.setDate(new Date()); + + if (mod.isDebug()) + mod.getLog().debug("Saving BlockState: " + s.toString()); + + mod.getQueries().insert(s); + } + } catch (SQLException e) { + mod.getLog().warn("DB-Error while onHangingInteract: "+e.getMessage()); + event.setCancelled(true); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onHangingBreak(HangingBreakEvent event) { + if (event.getEntity() instanceof ItemFrame) { + try { + BlockState s = mod.getQueries().find(event.getEntity().getLocation()); + if (s != null) { + if (mod.isDebug()) + mod.getLog().debug("Breaking hanging: " + s.toString()); + + if (s.getGameMode() == GameMode.CREATIVE || s.getSource() == Source.EDIT) { + if (mod.isDebug()) + mod.getLog().debug("... was placed by creative. Drop prevented"); + //mod.getBlockSpawn().block(event.getEntity().getLocation().getBlock().getLocation()); + mod.getBlockSpawn().block(event.getEntity().getLocation().getBlock().getLocation(), Material.ITEM_FRAME); + mod.getBlockSpawn().block(event.getEntity().getLocation().getBlock().getLocation(), ((ItemFrame) event.getEntity()).getItem().getType()); + } + + mod.getQueries().delete(s); + } + } catch (SQLException e) { + mod.getLog().warn("DB-Error while onHangingBreak: "+e.getMessage()); + event.setCancelled(true); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onHangingPlace(HangingPlaceEvent event) { + if (event.getEntity() instanceof ItemFrame) { + try { + BlockState s = mod.getQueries().find(event.getEntity().getLocation()); + boolean update = false; + if (s != null) { + // This shouldn't happen + if (mod.isDebug()) + mod.getLog().debug("Replacing current BlockState: " + s.toString()); + update = true; + } else { + s = new BlockState(); + s.setLocation(event.getEntity().getLocation().getBlock().getLocation()); + } + s.setPlayer(event.getPlayer()); + s.setDate(new Date()); + if (mod.isDebug()) + mod.getLog().debug("Saving BlockState: " + s.toString()); + + if (update) + mod.getQueries().update(s); + else + mod.getQueries().insert(s); + } catch (SQLException e) { + mod.getLog().warn("DB-Error while onHangingPlace: "+e.getMessage()); + event.setCancelled(true); + } + } + } +} diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/PlayerListener.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/PlayerListener.java index 2528e78..a40df61 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/PlayerListener.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/PlayerListener.java @@ -3,11 +3,17 @@ package de.jaschastarke.minecraft.limitedcreative.blockstate; import java.sql.SQLException; import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.entity.ItemFrame; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import de.jaschastarke.bukkit.lib.chat.ChatFormattings; @@ -26,37 +32,49 @@ public class PlayerListener implements Listener { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { Block b = event.getClickedBlock(); if (b != null && event.getPlayer().getItemInHand().getType().equals(mod.getConfig().getTool()) && mod.getPlugin().getPermManager().hasPermission(event.getPlayer(), BlockStatePermissions.TOOL)) { - try { - BlockState s = mod.getQueries().find(b.getLocation()); - InGameFormatter f = new InGameFormatter(mod.getPlugin().getLang()); - String ret = null; - if (s == null || s.getSource() == Source.UNKNOWN) { - ret = f.formatString(ChatFormattings.ERROR, f.getString("block_state.tool_info.unknown", b.getType().toString())); - } else { - String k = "block_state.tool_info." + s.getSource().name().toLowerCase(); - String gm = s.getGameMode().toString().toLowerCase(); - switch (s.getGameMode()) { - case CREATIVE: - gm = ChatColor.GOLD + gm + ChatColor.RESET; - case SURVIVAL: - gm = ChatColor.GREEN + gm + ChatColor.RESET; - case ADVENTURE: - gm = ChatColor.DARK_GREEN + gm + ChatColor.RESET; - default: - break; - } - - ret = f.formatString(ChatFormattings.INFO, f.getString(k, b.getType().toString(), - s.getPlayerName(), - gm, - s.getDate())); - } - if (ret != null) - event.getPlayer().sendMessage(ret); - } catch (SQLException e) { - mod.getLog().warn("DB-Error while onPlayerInteract: "+e.getMessage()); - } + showInfo(event.getPlayer(), b.getLocation(), b.getType()); } } } + @EventHandler(priority = EventPriority.HIGH) + public void onInteractEntity(PlayerInteractEntityEvent event) { + Entity e = event.getRightClicked(); + if (e != null && e instanceof ItemFrame && event.getPlayer().getItemInHand().getType().equals(mod.getConfig().getTool()) && mod.getPlugin().getPermManager().hasPermission(event.getPlayer(), BlockStatePermissions.TOOL)) { + showInfo(event.getPlayer(), e.getLocation(), Material.ITEM_FRAME); + event.setCancelled(true); + } + } + + private void showInfo(Player pl, Location loc, Material type) { + try { + BlockState s = mod.getQueries().find(loc); + InGameFormatter f = new InGameFormatter(mod.getPlugin().getLang()); + String ret = null; + if (s == null || s.getSource() == Source.UNKNOWN) { + ret = f.formatString(ChatFormattings.ERROR, f.getString("block_state.tool_info.unknown", type.toString())); + } else { + String k = "block_state.tool_info." + s.getSource().name().toLowerCase(); + String gm = s.getGameMode().toString().toLowerCase(); + switch (s.getGameMode()) { + case CREATIVE: + gm = ChatColor.GOLD + gm + ChatColor.RESET; + case SURVIVAL: + gm = ChatColor.GREEN + gm + ChatColor.RESET; + case ADVENTURE: + gm = ChatColor.DARK_GREEN + gm + ChatColor.RESET; + default: + break; + } + + ret = f.formatString(ChatFormattings.INFO, f.getString(k, type.toString(), + s.getPlayerName(), + gm, + s.getDate())); + } + if (ret != null) + pl.sendMessage(ret); + } catch (SQLException e) { + mod.getLog().warn("DB-Error while onPlayerInteract: "+e.getMessage()); + } + } } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/cmdblocker/CmdBlockList.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/cmdblocker/CmdBlockList.java index 1fb8c77..9d1cdcd 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/cmdblocker/CmdBlockList.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/cmdblocker/CmdBlockList.java @@ -12,11 +12,11 @@ public class CmdBlockList extends ArrayList implements Configura private static final long serialVersionUID = -125544131527849084L; @Override - public void add(String cmd) throws InvalidValueException { + public boolean add(String cmd) throws InvalidValueException { if (cmd.startsWith("^")) { - add(new RegexpBlockEntry(cmd)); + return add(new RegexpBlockEntry(cmd)); } else { - add(new StringBlockEntry(cmd)); + return add(new StringBlockEntry(cmd)); } } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/cmdblocker/CmdBlockerConfig.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/cmdblocker/CmdBlockerConfig.java index d1fda51..9a950e3 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/cmdblocker/CmdBlockerConfig.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/cmdblocker/CmdBlockerConfig.java @@ -24,6 +24,7 @@ public class CmdBlockerConfig extends Configuration implements IConfigurationSub protected ModuleEntry entry; public CmdBlockerConfig(ModCmdBlocker modCmdBlocker, ModuleEntry modEntry) { + super(modCmdBlocker.getPlugin()); mod = modCmdBlocker; entry = modEntry; } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/gmperm/GMPermConfig.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/gmperm/GMPermConfig.java index 54f3e53..227f8bc 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/gmperm/GMPermConfig.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/gmperm/GMPermConfig.java @@ -26,6 +26,7 @@ public class GMPermConfig extends Configuration implements IConfigurationSubGrou protected ModuleEntry entry; public GMPermConfig(ModGameModePerm modGameModePerm, ModuleEntry modEntry) { + super(modGameModePerm.getPlugin()); mod = modGameModePerm; entry = modEntry; } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/inventories/ArmoryConfig.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/inventories/ArmoryConfig.java index 2fd41f9..f5c8092 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/inventories/ArmoryConfig.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/inventories/ArmoryConfig.java @@ -26,6 +26,7 @@ import de.jaschastarke.minecraft.limitedcreative.ModInventories; public class ArmoryConfig extends Configuration implements IConfigurationSubGroup { protected ModInventories mod; public ArmoryConfig(ModInventories modInventories) { + super(modInventories.getPlugin()); mod = modInventories; } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/inventories/InventoryConfig.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/inventories/InventoryConfig.java index c2e4298..5413419 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/inventories/InventoryConfig.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/inventories/InventoryConfig.java @@ -20,11 +20,11 @@ import de.jaschastarke.modularize.ModuleEntry.ModuleState; */ @ArchiveDocComments public class InventoryConfig extends Configuration implements IConfigurationSubGroup { - protected ModInventories mod; protected ModuleEntry entry; public InventoryConfig(ModInventories modInventories, ModuleEntry modEntry) { + super(modInventories.getPlugin()); mod = modInventories; entry = modEntry; } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/BlackList.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/BlackList.java index d85067a..a5b894c 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/BlackList.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/BlackList.java @@ -108,10 +108,11 @@ public class BlackList extends ArrayList implements Confi } @Override // ConfigurableList, not List - public void add(String e) throws InvalidValueException { + public boolean add(String e) throws InvalidValueException { if (!contains(e)) { - add(new Blacklisted(e)); + return add(new Blacklisted(e)); } + return false; } @Override // ConfigurableList, not List diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/BlackListEntity.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/BlackListEntity.java index 3d3b68f..e3ed81d 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/BlackListEntity.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/BlackListEntity.java @@ -100,10 +100,11 @@ public class BlackListEntity extends ArrayList impl } @Override // ConfigurableList, not List - public void add(String e) throws InvalidValueException { + public boolean add(String e) throws InvalidValueException { if (!contains(e)) { - add(new Blacklisted(e)); + return add(new Blacklisted(e)); } + return false; } @Override // ConfigurableList, not List diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/LimitConfig.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/LimitConfig.java index c6e0dc5..9e6c37b 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/LimitConfig.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/LimitConfig.java @@ -23,12 +23,12 @@ import de.jaschastarke.modularize.ModuleEntry.ModuleState; */ @ArchiveDocComments public class LimitConfig extends Configuration implements IConfigurationSubGroup { - protected ModCreativeLimits mod; protected ModuleEntry entry; - public LimitConfig(ModCreativeLimits modInventories, ModuleEntry modEntry) { - mod = modInventories; + public LimitConfig(ModCreativeLimits modCreativeLimits, ModuleEntry modEntry) { + super(modCreativeLimits.getPlugin()); + mod = modCreativeLimits; entry = modEntry; } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/regions/RegionConfig.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/regions/RegionConfig.java index e3a38b0..34a4c1f 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/regions/RegionConfig.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/regions/RegionConfig.java @@ -25,6 +25,7 @@ public class RegionConfig extends Configuration implements IConfigurationSubGrou protected ModuleEntry entry; public RegionConfig(ModRegions modRegions, ModuleEntry modEntry) { + super(modRegions.getPlugin()); mod = modRegions; entry = modEntry; }