start of the refactoring

This commit is contained in:
tiko
2026-02-04 15:12:11 +01:00
parent 8601626b16
commit 754795c958
14 changed files with 137 additions and 74 deletions

View File

@@ -10,8 +10,11 @@ repositories {
name = "papermc" name = "papermc"
url = uri("https://repo.papermc.io/repository/maven-public/") url = uri("https://repo.papermc.io/repository/maven-public/")
} }
mavenCentral()
} }
dependencies { dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") 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")
} }

View File

@@ -1,28 +1,23 @@
package fyi.tiko.battletowers; 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.Bukkit;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@Getter
@Accessors(fluent = true)
public final class BattleTowersPlugin extends JavaPlugin { public final class BattleTowersPlugin extends JavaPlugin {
@Getter
private static BattleTowersPlugin instance; private static BattleTowersPlugin instance;
public static BattleTowersPlugin instance() {
return instance;
}
private TowerLootManager lootManager; private TowerLootManager lootManager;
private NamespacedKey towerKey; private NamespacedKey towerKey;
public NamespacedKey towerKey() {
return towerKey;
}
public TowerLootManager getLootManager() {
return lootManager;
}
@Override @Override
public void onEnable() { public void onEnable() {
instance = this; instance = this;
@@ -32,9 +27,8 @@ public final class BattleTowersPlugin extends JavaPlugin {
towerKey = new NamespacedKey(this, "tower_location"); towerKey = new NamespacedKey(this, "tower_location");
lootManager = new TowerLootManager(); lootManager = new TowerLootManager();
Bukkit.getWorlds().forEach(world -> { // todo: entweder als world-populator oder direkt im event maybe?
world.getPopulators().add(new TowerPopulator()); Bukkit.getWorlds().forEach(world -> world.getPopulators().add(new TowerPopulator()));
});
getServer().getPluginManager().registerEvents( getServer().getPluginManager().registerEvents(
new TowerChestListener(), this new TowerChestListener(), this

View File

@@ -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);
}
}

View File

@@ -1,4 +1,4 @@
package fyi.tiko.battletowers; package fyi.tiko.battletowers.boss;
import org.bukkit.entity.IronGolem; import org.bukkit.entity.IronGolem;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;

View File

@@ -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.Location;
import org.bukkit.attribute.Attribute; import org.bukkit.attribute.Attribute;
import org.bukkit.entity.IronGolem; import org.bukkit.entity.IronGolem;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import static fyi.tiko.battletowers.BattleTowersPlugin.instance;
public class TowerBossSpawner { public class TowerBossSpawner {
public static void spawnDormantBoss(org.bukkit.World world, public static void spawnDormantBoss(org.bukkit.World world,
Location loc, Location loc,
int towerX, int towerY, int towerZ) { int towerX, int towerY, int towerZ) {
IronGolem golem = world.spawn(loc, IronGolem.class); IronGolem golem = world.spawn(loc, IronGolem.class);
@@ -30,21 +30,23 @@ public class TowerBossSpawner {
// Save tower coords inside entity // Save tower coords inside entity
golem.getPersistentDataContainer().set( golem.getPersistentDataContainer().set(
instance().towerKey(), instance().towerKey(),
PersistentDataType.STRING, PersistentDataType.STRING,
towerX + ";" + towerY + ";" + towerZ towerX + ";" + towerY + ";" + towerZ
); );
} }
public static void wakeUp(IronGolem golem) { public static void wakeUp(IronGolem golem) {
if (golem.hasAI()) return; if (golem.hasAI()) {
return;
}
golem.setAI(true); golem.setAI(true);
golem.getWorld().playSound( golem.getWorld().playSound(
golem.getLocation(), golem.getLocation(),
"entity.iron_golem.repair", "entity.iron_golem.repair",
3f, 0.6f 3f, 0.6f
); );
} }
} }

View File

@@ -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.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import static fyi.tiko.battletowers.BattleTowersPlugin.instance;
public class TowerDestroyer { 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... // 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) { public static void startCollapse(Location center, Player killer) {
World world = center.getWorld(); 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("<red>A Battletower's Guardian has fallen! The tower will collapse...");
});
new BukkitRunnable() { new BukkitRunnable() {
int floor = Towers.FLOOR_AMOUNT_PER_TOWER;
int floor = 6;
@Override @Override
public void run() { public void run() {
@@ -29,9 +33,8 @@ public class TowerDestroyer {
return; return;
} }
double y = center.getY() - (floor * 7); double y = center.getY() - (floor * Towers.FLOOR_HEIGHT);
world.createExplosion(center.getX(), y, center.getZ(), 10f);
world.createExplosion(center, 10f);
floor--; floor--;
} }

View File

@@ -0,0 +1,4 @@
package fyi.tiko.battletowers.data;
public class TowerRegistry {
}

View File

@@ -1,4 +1,4 @@
package fyi.tiko.battletowers; package fyi.tiko.battletowers.data;
import org.bukkit.Material; import org.bukkit.Material;

View File

@@ -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;
}

View File

@@ -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 java.util.Random;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@@ -91,9 +96,10 @@ public class TowerGenerator {
return y; return y;
} }
// 1:1 Block Placement Core // todo: alles weg von World#setBlockData() stattdessen: LimitedRegion#setBlockData()
public void generate(World world, int ix, int jy, int kz, TowerType towerChosen, boolean underground) {
// 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 towerWallBlock = towerChosen.wall();
Material towerLightBlock = towerChosen.light(); Material towerLightBlock = towerChosen.light();
Material towerFloorBlock = towerChosen.floor(); Material towerFloorBlock = towerChosen.floor();
@@ -384,7 +390,7 @@ public class TowerGenerator {
boolean underground, boolean underground,
boolean topFloor boolean topFloor
) { ) {
TowerLootManager loot = BattleTowersPlugin.instance().getLootManager(); TowerLootManager loot = BattleTowersPlugin.instance().lootManager();
TowerStageItemManager floorChestManager; TowerStageItemManager floorChestManager;
// 1. Loot-Logik (Original Forge Style) // 1. Loot-Logik (Original Forge Style)

View File

@@ -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);
}
}

View File

@@ -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.entity.IronGolem;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;

View File

@@ -1,7 +1,6 @@
package fyi.tiko.battletowers; package fyi.tiko.battletowers.loot;
import fyi.tiko.battletowers.BattleTowersPlugin; import fyi.tiko.battletowers.BattleTowersPlugin;
import java.util.Random; import java.util.Random;
public class TowerLootManager { public class TowerLootManager {

View File

@@ -1,4 +1,4 @@
package fyi.tiko.battletowers; package fyi.tiko.battletowers.loot;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;