From 0b55d6782943ce41f2900861dc4ccf068135aca0 Mon Sep 17 00:00:00 2001 From: jakub Date: Thu, 5 Mar 2026 20:28:32 +0100 Subject: [PATCH] - Region Boilerplate --- pom.xml | 14 +- .../xyz/soukup/ecoCraftCore/EcoCraftCore.java | 8 +- .../ecoCraftCore/database/DaoRegistry.java | 18 ++ .../ecoCraftCore/database/objects/Region.java | 160 ++++++++++++++++++ .../database/objects/RegionMember.java | 65 +++++++ .../regions/RegionAdminCommand.java | 5 + .../ecoCraftCore/regions/RegionEvents.java | 36 ++++ 7 files changed, 292 insertions(+), 14 deletions(-) create mode 100644 src/main/java/xyz/soukup/ecoCraftCore/database/objects/Region.java create mode 100644 src/main/java/xyz/soukup/ecoCraftCore/database/objects/RegionMember.java create mode 100644 src/main/java/xyz/soukup/ecoCraftCore/regions/RegionAdminCommand.java create mode 100644 src/main/java/xyz/soukup/ecoCraftCore/regions/RegionEvents.java diff --git a/pom.xml b/pom.xml index 757f316..5cb3fe3 100644 --- a/pom.xml +++ b/pom.xml @@ -79,22 +79,10 @@ - src/main/resources true - - **/*.yml - - - - - - src/main/resources - false - - **/*.slime - + diff --git a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java index 8839e05..ae099c3 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java @@ -56,8 +56,10 @@ public final class EcoCraftCore extends JavaPlugin { this.getLogger().info("plugin starting out"); plugin = this; + config = getConfig(); + this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); PacketEvents.setAPI(SpigotPacketEventsBuilder.build(this)); @@ -65,8 +67,8 @@ public final class EcoCraftCore extends JavaPlugin { PacketEvents.getAPI().init(); try { + plugin.saveConfig(); saveIslandTemplates(); - saveDefaultConfig(); Messages.init(); prepareDatabase(); registerCommands(); @@ -195,6 +197,8 @@ public final class EcoCraftCore extends JavaPlugin { TableUtils.createTableIfNotExists(connectionSource, Account.class); TableUtils.createTableIfNotExists(connectionSource, Island.class); TableUtils.createTableIfNotExists(connectionSource, TeleportRequest.class); + TableUtils.createTableIfNotExists(connectionSource, Region.class); + TableUtils.createTableIfNotExists(connectionSource, RegionMember.class); DaoRegistry.setActiveServerDao(DaoManager.createDao(connectionSource, ActiveServer.class)); DaoRegistry.setTransactionDao(DaoManager.createDao(connectionSource, Transaction.class)); @@ -203,6 +207,8 @@ public final class EcoCraftCore extends JavaPlugin { DaoRegistry.setVirtualChestDao(DaoManager.createDao(connectionSource, VirtualChest.class)); DaoRegistry.setAccountDao(DaoManager.createDao(connectionSource, Account.class)); DaoRegistry.setTeleportRequestsDao(DaoManager.createDao(connectionSource, TeleportRequest.class)); + DaoRegistry.setRegionDao(DaoManager.createDao(connectionSource, Region.class)); + DaoRegistry.setRegionMemberDao(DaoManager.createDao(connectionSource, RegionMember.class)); ActiveServer activeServer = new ActiveServer(config.getString("server.name")); activeServer.save(); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/database/DaoRegistry.java b/src/main/java/xyz/soukup/ecoCraftCore/database/DaoRegistry.java index e5009df..9b62b01 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/database/DaoRegistry.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/database/DaoRegistry.java @@ -12,6 +12,24 @@ public class DaoRegistry { private static Dao islandDao; private static Dao teleportRequestsDao; private static Dao activeServerDao; + private static Dao regionDao; + private static Dao regionMemberDao; + + public static Dao getRegionMemberDao() { + return regionMemberDao; + } + + public static void setRegionMemberDao(Dao regionMemberDao) { + DaoRegistry.regionMemberDao = regionMemberDao; + } + + public static Dao getRegionDao() { + return regionDao; + } + + public static void setRegionDao(Dao regionDao) { + DaoRegistry.regionDao = regionDao; + } public static Dao getTeleportRequestsDao() { return teleportRequestsDao; diff --git a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Region.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Region.java new file mode 100644 index 0000000..3a60612 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Region.java @@ -0,0 +1,160 @@ +package xyz.soukup.ecoCraftCore.database.objects; + +import com.j256.ormlite.dao.ForeignCollection; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.field.ForeignCollectionField; +import com.j256.ormlite.table.DatabaseTable; +import xyz.soukup.ecoCraftCore.database.DaoRegistry; + +import java.util.HashMap; +import java.util.List; + +@DatabaseTable(tableName = "regions") +public class Region { + + public static final HashMap> cache = new HashMap<>(); + + @DatabaseField(generatedId = true) + private int id; + + @DatabaseField(canBeNull = false) + private String island; + + @DatabaseField(columnName = "region_type", canBeNull = false) + private int regionType; + + @DatabaseField(canBeNull = false) + private int x1; + + @DatabaseField(canBeNull = false) + private int y1; + + @DatabaseField(canBeNull = false) + private int x2; + + @DatabaseField(canBeNull = false) + private int y2; + + @ForeignCollectionField(eager = true) + private ForeignCollection regionMembers; + + @DatabaseField() + private Integer value; + + public Region() { + + } + + public Region(String island, int regionType, int x1, int y1, int x2, int y2) { + this.island = island; + this.regionType = regionType; + this.x1 = Math.min(x1, x2); + this.y1 = Math.min(y1, y2); + this.x2 = Math.max(x1, x2) ; + this.y2 = Math.max(y1, y2); + + } + + public int getRegionType() { + return regionType; + } + + public int getX1() { + return x1; + } + + public int getY1() { + return y1; + } + + public int getX2() { + return x2; + } + + public int getY2() { + return y2; + } + + public ForeignCollection getRegionMembers() { + return regionMembers; + } + + public Integer getValue() { + return value; + } + + public String getIsland() { + return island; + } + + + + + + public void setRegionType(int regionType) { + this.regionType = regionType; + } + + public void setValue(Integer value) { + this.value = value; + } + + public void save(){ + try { + DaoRegistry.getRegionDao().createOrUpdate(this); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public boolean isInside(int x, int y) { + return x >= this.x1 && x <= this.x2 && y >= this.y1 && y <= this.y2; + } + + public static Region findById(int id) { + try { + return DaoRegistry.getRegionDao().queryForId(id); + } catch (Exception e) { + return null; + } + } + + public static void cacheRegions(String island) { + try { + List regions = DaoRegistry.getRegionDao().queryBuilder() + .where() + .eq("island", island) + .query(); + cache.put(island, regions); + } catch (Exception e) { + + } + } + + public static Region findRegion(int x, int y, String island) { + + Region region = null; + Integer highestType = -1; + + if (!cache.containsKey(island)) { + cacheRegions(island); + } + + for (Region cachedRegion : cache.get(island)) { + if (!cachedRegion.isInside(x, y)) { + continue; + } + if (highestType >= cachedRegion.getRegionType()){ + continue; + } + region = cachedRegion; + } + + return region; + + + } + + +} + diff --git a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/RegionMember.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/RegionMember.java new file mode 100644 index 0000000..148a40c --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/RegionMember.java @@ -0,0 +1,65 @@ +package xyz.soukup.ecoCraftCore.database.objects; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import xyz.soukup.ecoCraftCore.database.DaoRegistry; + +import java.sql.SQLException; + +@DatabaseTable(tableName = "region_members") +public class RegionMember { + + @DatabaseField(generatedId = true) + private int id; + + @DatabaseField(foreign = true, foreignAutoRefresh = true, index = true) + private Region region; + + @DatabaseField(columnName = "member_type", canBeNull = false) + private String membertype; + + @DatabaseField(columnName = "member_name", canBeNull = false) + private String memberName; + + @DatabaseField(columnName = "membership_type", canBeNull = false) + private String membershipType; + + public RegionMember(){ + + } + + public RegionMember(Region region, String membertype, String memberName, String membershipType){ + this.region = region; + this.membertype = membertype; + this.memberName = memberName; + this.membershipType = membershipType; + } + + public Region getRegion() { + return region; + } + + public String getMembertype() { + return membertype; + } + + public String getName() { + return memberName; + } + + public String getMembershipType() { + return membershipType; + } + + public void setMembershipType(String membershipType) { + this.membershipType = membershipType; + } + + public void save(){ + try { + DaoRegistry.getRegionMemberDao().createOrUpdate(this); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionAdminCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionAdminCommand.java new file mode 100644 index 0000000..6cdd22a --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionAdminCommand.java @@ -0,0 +1,5 @@ +package xyz.soukup.ecoCraftCore.regions; + +public class RegionAdminCommand { + +} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionEvents.java b/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionEvents.java new file mode 100644 index 0000000..1e5f8ad --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionEvents.java @@ -0,0 +1,36 @@ +package xyz.soukup.ecoCraftCore.regions; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import xyz.soukup.ecoCraftCore.database.objects.Region; +import xyz.soukup.ecoCraftCore.database.objects.RegionMember; + +public class RegionEvents implements Listener { + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event){ + event.setCancelled(!isRegionMember(event.getClickedBlock().getWorld().getName(), event.getPlayer(), event.getClickedBlock().getX(), event.getClickedBlock().getY())); + } + + + private boolean isRegionMember(String island, Player player, int x, int y){ + Region region = Region.findRegion(x, y, island); + + if (region == null){ + return false; + } + + String name = player.getName(); + + for (RegionMember regionMember : region.getRegionMembers()){ + if (regionMember.getMembertype().equals("player") && regionMember.getName().equals(name)){ + return true; + } + } + + return false; + } +}