diff --git a/build.gradle.kts b/build.gradle.kts index 5b7f587..d17d812 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,8 +10,11 @@ repositories { name = "papermc" url = uri("https://repo.papermc.io/repository/maven-public/") } + mavenCentral() } dependencies { compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") + compileOnly("org.projectlombok:lombok:1.18.42") + annotationProcessor("org.projectlombok:lombok:1.18.42") } diff --git a/src/main/java/fyi/tiko/battletowers/BattleTowersPlugin.java b/src/main/java/fyi/tiko/battletowers/BattleTowersPlugin.java index 4214ac5..7720d1b 100644 --- a/src/main/java/fyi/tiko/battletowers/BattleTowersPlugin.java +++ b/src/main/java/fyi/tiko/battletowers/BattleTowersPlugin.java @@ -1,28 +1,23 @@ package fyi.tiko.battletowers; +import fyi.tiko.battletowers.boss.TowerBossDeathListener; +import fyi.tiko.battletowers.generation.TowerPopulator; +import fyi.tiko.battletowers.loot.TowerChestListener; +import fyi.tiko.battletowers.loot.TowerLootManager; +import lombok.Getter; +import lombok.experimental.Accessors; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.plugin.java.JavaPlugin; +@Getter +@Accessors(fluent = true) public final class BattleTowersPlugin extends JavaPlugin { - + @Getter private static BattleTowersPlugin instance; - - public static BattleTowersPlugin instance() { - return instance; - } - private TowerLootManager lootManager; private NamespacedKey towerKey; - public NamespacedKey towerKey() { - return towerKey; - } - - public TowerLootManager getLootManager() { - return lootManager; - } - @Override public void onEnable() { instance = this; @@ -32,9 +27,8 @@ public final class BattleTowersPlugin extends JavaPlugin { towerKey = new NamespacedKey(this, "tower_location"); lootManager = new TowerLootManager(); - Bukkit.getWorlds().forEach(world -> { - world.getPopulators().add(new TowerPopulator()); - }); + // todo: entweder als world-populator oder direkt im event maybe? + Bukkit.getWorlds().forEach(world -> world.getPopulators().add(new TowerPopulator())); getServer().getPluginManager().registerEvents( new TowerChestListener(), this diff --git a/src/main/java/fyi/tiko/battletowers/TowerPopulator.java b/src/main/java/fyi/tiko/battletowers/TowerPopulator.java deleted file mode 100644 index b432066..0000000 --- a/src/main/java/fyi/tiko/battletowers/TowerPopulator.java +++ /dev/null @@ -1,24 +0,0 @@ -package fyi.tiko.battletowers; - -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.generator.BlockPopulator; - -import java.util.Random; - -public class TowerPopulator extends BlockPopulator { - - private final TowerGenerator generator = new TowerGenerator(); - - @Override - public void populate(World world, Random random, Chunk chunk) { - - // Chance pro Chunk (erstmal test) - if (random.nextInt(250) != 0) return; - - int x = chunk.getX() * 16 + 8; - int z = chunk.getZ() * 16 + 8; - - generator.trySpawnTower(world, random, x, z); - } -} diff --git a/src/main/java/fyi/tiko/battletowers/TowerBossDeathListener.java b/src/main/java/fyi/tiko/battletowers/boss/TowerBossDeathListener.java similarity index 95% rename from src/main/java/fyi/tiko/battletowers/TowerBossDeathListener.java rename to src/main/java/fyi/tiko/battletowers/boss/TowerBossDeathListener.java index 828e38a..730f894 100644 --- a/src/main/java/fyi/tiko/battletowers/TowerBossDeathListener.java +++ b/src/main/java/fyi/tiko/battletowers/boss/TowerBossDeathListener.java @@ -1,4 +1,4 @@ -package fyi.tiko.battletowers; +package fyi.tiko.battletowers.boss; import org.bukkit.entity.IronGolem; import org.bukkit.event.EventHandler; diff --git a/src/main/java/fyi/tiko/battletowers/TowerBossSpawner.java b/src/main/java/fyi/tiko/battletowers/boss/TowerBossSpawner.java similarity index 71% rename from src/main/java/fyi/tiko/battletowers/TowerBossSpawner.java rename to src/main/java/fyi/tiko/battletowers/boss/TowerBossSpawner.java index 4afabdd..ccfe675 100644 --- a/src/main/java/fyi/tiko/battletowers/TowerBossSpawner.java +++ b/src/main/java/fyi/tiko/battletowers/boss/TowerBossSpawner.java @@ -1,17 +1,17 @@ -package fyi.tiko.battletowers; +package fyi.tiko.battletowers.boss; + +import static fyi.tiko.battletowers.BattleTowersPlugin.instance; import org.bukkit.Location; import org.bukkit.attribute.Attribute; import org.bukkit.entity.IronGolem; import org.bukkit.persistence.PersistentDataType; -import static fyi.tiko.battletowers.BattleTowersPlugin.instance; - public class TowerBossSpawner { public static void spawnDormantBoss(org.bukkit.World world, - Location loc, - int towerX, int towerY, int towerZ) { + Location loc, + int towerX, int towerY, int towerZ) { IronGolem golem = world.spawn(loc, IronGolem.class); @@ -30,21 +30,23 @@ public class TowerBossSpawner { // Save tower coords inside entity golem.getPersistentDataContainer().set( - instance().towerKey(), - PersistentDataType.STRING, - towerX + ";" + towerY + ";" + towerZ + instance().towerKey(), + PersistentDataType.STRING, + towerX + ";" + towerY + ";" + towerZ ); } public static void wakeUp(IronGolem golem) { - if (golem.hasAI()) return; + if (golem.hasAI()) { + return; + } golem.setAI(true); golem.getWorld().playSound( - golem.getLocation(), - "entity.iron_golem.repair", - 3f, 0.6f + golem.getLocation(), + "entity.iron_golem.repair", + 3f, 0.6f ); } } diff --git a/src/main/java/fyi/tiko/battletowers/TowerDestroyer.java b/src/main/java/fyi/tiko/battletowers/boss/TowerDestroyer.java similarity index 58% rename from src/main/java/fyi/tiko/battletowers/TowerDestroyer.java rename to src/main/java/fyi/tiko/battletowers/boss/TowerDestroyer.java index f315d5e..a14fc09 100644 --- a/src/main/java/fyi/tiko/battletowers/TowerDestroyer.java +++ b/src/main/java/fyi/tiko/battletowers/boss/TowerDestroyer.java @@ -1,25 +1,29 @@ -package fyi.tiko.battletowers; +package fyi.tiko.battletowers.boss; -import org.bukkit.Bukkit; +import static fyi.tiko.battletowers.BattleTowersPlugin.instance; + +import fyi.tiko.battletowers.data.Towers; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; -import static fyi.tiko.battletowers.BattleTowersPlugin.instance; - public class TowerDestroyer { // TODO: die einzelnen floors werden nicht kaputt gemacht, sondern nur ganz oben + nachricht nur an spielern in reichweite von X blöcken... public static void startCollapse(Location center, Player killer) { - World world = center.getWorld(); - Bukkit.broadcastMessage("§cA Battletower's Guardian has fallen! The Tower will collapse..."); + world.getNearbyEntities(center, 15, 15, 15).forEach(entity -> { + if (!(entity instanceof Player player)) { + return; + } + + player.sendRichMessage("A Battletower's Guardian has fallen! The tower will collapse..."); + }); new BukkitRunnable() { - - int floor = 6; + int floor = Towers.FLOOR_AMOUNT_PER_TOWER; @Override public void run() { @@ -29,9 +33,8 @@ public class TowerDestroyer { return; } - double y = center.getY() - (floor * 7); - - world.createExplosion(center, 10f); + double y = center.getY() - (floor * Towers.FLOOR_HEIGHT); + world.createExplosion(center.getX(), y, center.getZ(), 10f); floor--; } diff --git a/src/main/java/fyi/tiko/battletowers/data/TowerRegistry.java b/src/main/java/fyi/tiko/battletowers/data/TowerRegistry.java new file mode 100644 index 0000000..091f56a --- /dev/null +++ b/src/main/java/fyi/tiko/battletowers/data/TowerRegistry.java @@ -0,0 +1,4 @@ +package fyi.tiko.battletowers.data; + +public class TowerRegistry { +} diff --git a/src/main/java/fyi/tiko/battletowers/TowerType.java b/src/main/java/fyi/tiko/battletowers/data/TowerType.java similarity index 96% rename from src/main/java/fyi/tiko/battletowers/TowerType.java rename to src/main/java/fyi/tiko/battletowers/data/TowerType.java index ea40be1..fdeb6b0 100644 --- a/src/main/java/fyi/tiko/battletowers/TowerType.java +++ b/src/main/java/fyi/tiko/battletowers/data/TowerType.java @@ -1,4 +1,4 @@ -package fyi.tiko.battletowers; +package fyi.tiko.battletowers.data; import org.bukkit.Material; diff --git a/src/main/java/fyi/tiko/battletowers/data/Towers.java b/src/main/java/fyi/tiko/battletowers/data/Towers.java new file mode 100644 index 0000000..18b508b --- /dev/null +++ b/src/main/java/fyi/tiko/battletowers/data/Towers.java @@ -0,0 +1,22 @@ +package fyi.tiko.battletowers.data; + +/** + * Represents constant values that are used across the plugin. + */ +public final class Towers { + private Towers() { + + } + /** + * The height a floor should receive. + */ + public static final int FLOOR_HEIGHT = 7; + + /** + * The amount of floors a battle tower should have, excluding the boss floor. + */ + public static final int FLOOR_AMOUNT_PER_TOWER = 6; + + + +} diff --git a/src/main/java/fyi/tiko/battletowers/TowerGenerator.java b/src/main/java/fyi/tiko/battletowers/generation/TowerGenerator.java similarity index 97% rename from src/main/java/fyi/tiko/battletowers/TowerGenerator.java rename to src/main/java/fyi/tiko/battletowers/generation/TowerGenerator.java index d7cef30..b16fa5d 100644 --- a/src/main/java/fyi/tiko/battletowers/TowerGenerator.java +++ b/src/main/java/fyi/tiko/battletowers/generation/TowerGenerator.java @@ -1,5 +1,10 @@ -package fyi.tiko.battletowers; +package fyi.tiko.battletowers.generation; +import fyi.tiko.battletowers.BattleTowersPlugin; +import fyi.tiko.battletowers.data.TowerType; +import fyi.tiko.battletowers.boss.TowerBossSpawner; +import fyi.tiko.battletowers.loot.TowerLootManager; +import fyi.tiko.battletowers.loot.TowerStageItemManager; import java.util.Random; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -91,9 +96,10 @@ public class TowerGenerator { return y; } - // ✅ 1:1 Block Placement Core - public void generate(World world, int ix, int jy, int kz, TowerType towerChosen, boolean underground) { + // todo: alles weg von World#setBlockData() stattdessen: LimitedRegion#setBlockData() + // 1:1 Block Placement Core + public void generate(World world, int ix, int jy, int kz, TowerType towerChosen, boolean underground) { Material towerWallBlock = towerChosen.wall(); Material towerLightBlock = towerChosen.light(); Material towerFloorBlock = towerChosen.floor(); @@ -384,7 +390,7 @@ public class TowerGenerator { boolean underground, boolean topFloor ) { - TowerLootManager loot = BattleTowersPlugin.instance().getLootManager(); + TowerLootManager loot = BattleTowersPlugin.instance().lootManager(); TowerStageItemManager floorChestManager; // 1. Loot-Logik (Original Forge Style) diff --git a/src/main/java/fyi/tiko/battletowers/generation/TowerPopulator.java b/src/main/java/fyi/tiko/battletowers/generation/TowerPopulator.java new file mode 100644 index 0000000..1659326 --- /dev/null +++ b/src/main/java/fyi/tiko/battletowers/generation/TowerPopulator.java @@ -0,0 +1,53 @@ +package fyi.tiko.battletowers.generation; + +import java.util.Random; +import org.bukkit.World; +import org.bukkit.generator.BlockPopulator; +import org.bukkit.generator.LimitedRegion; +import org.bukkit.generator.WorldInfo; +import org.jetbrains.annotations.NotNull; + +public class TowerPopulator extends BlockPopulator { + + private final TowerGenerator generator = new TowerGenerator(); + + /* + @Override + public void populate(@NotNull World world, Random random, @NotNull Chunk chunk) { + + // Chance pro Chunk (erstmal test) + if (random.nextInt(250) != 0) { + return; + } + + int x = chunk.getX() * 16 + 8; + int z = chunk.getZ() * 16 + 8; + + generator.trySpawnTower(world, random, x, z); + } + */ + + @Override + public void populate( + @NotNull WorldInfo worldInfo, + @NotNull Random random, + int chunkX, + int chunkZ, + @NotNull LimitedRegion limitedRegion + ) { + // Chance pro Chunk (1/250) + if (random.nextInt(250) != 0) { + return; + } + + // Chunk-Koordinaten -> Block-Koordinaten (Chunk-Mitte) + int x = chunkX * 16 + 8; + int z = chunkZ * 16 + 8; + + // Welt aus Region holen + World world = limitedRegion.getWorld(); + + // Tower spawnen + generator.trySpawnTower(world, random, x, z); + } +} diff --git a/src/main/java/fyi/tiko/battletowers/TowerChestListener.java b/src/main/java/fyi/tiko/battletowers/loot/TowerChestListener.java similarity index 89% rename from src/main/java/fyi/tiko/battletowers/TowerChestListener.java rename to src/main/java/fyi/tiko/battletowers/loot/TowerChestListener.java index fa27b35..0195dfe 100644 --- a/src/main/java/fyi/tiko/battletowers/TowerChestListener.java +++ b/src/main/java/fyi/tiko/battletowers/loot/TowerChestListener.java @@ -1,5 +1,6 @@ -package fyi.tiko.battletowers; +package fyi.tiko.battletowers.loot; +import fyi.tiko.battletowers.boss.TowerBossSpawner; import org.bukkit.entity.IronGolem; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; diff --git a/src/main/java/fyi/tiko/battletowers/TowerLootManager.java b/src/main/java/fyi/tiko/battletowers/loot/TowerLootManager.java similarity index 97% rename from src/main/java/fyi/tiko/battletowers/TowerLootManager.java rename to src/main/java/fyi/tiko/battletowers/loot/TowerLootManager.java index edd182d..ecac14b 100644 --- a/src/main/java/fyi/tiko/battletowers/TowerLootManager.java +++ b/src/main/java/fyi/tiko/battletowers/loot/TowerLootManager.java @@ -1,7 +1,6 @@ -package fyi.tiko.battletowers; +package fyi.tiko.battletowers.loot; import fyi.tiko.battletowers.BattleTowersPlugin; - import java.util.Random; public class TowerLootManager { diff --git a/src/main/java/fyi/tiko/battletowers/TowerStageItemManager.java b/src/main/java/fyi/tiko/battletowers/loot/TowerStageItemManager.java similarity index 98% rename from src/main/java/fyi/tiko/battletowers/TowerStageItemManager.java rename to src/main/java/fyi/tiko/battletowers/loot/TowerStageItemManager.java index 7a109c5..d6f0d96 100644 --- a/src/main/java/fyi/tiko/battletowers/TowerStageItemManager.java +++ b/src/main/java/fyi/tiko/battletowers/loot/TowerStageItemManager.java @@ -1,4 +1,4 @@ -package fyi.tiko.battletowers; +package fyi.tiko.battletowers.loot; import org.bukkit.Material; import org.bukkit.inventory.ItemStack;