First, initial commit of the revamp. Currently using old legacy code-base, trying to rebase from that.

This commit is contained in:
2026-02-12 13:32:36 +01:00
parent 2fc2b7ce97
commit f4fb42952f
6 changed files with 44 additions and 29 deletions

1
.idea/gradle.xml generated
View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings"> <component name="GradleSettings">
<option name="linkedExternalProjectsSettings"> <option name="linkedExternalProjectsSettings">
<GradleProjectSettings> <GradleProjectSettings>

View File

@@ -17,7 +17,7 @@ public class TowerBossDeathListener implements Listener {
@EventHandler @EventHandler
public void onBossDeath(final EntityDeathEvent event) { public void onBossDeath(final EntityDeathEvent event) {
if (!(event.getEntity() instanceof IronGolem golem)) { if (!(event.getEntity() instanceof final IronGolem golem)) {
return; return;
} }
@@ -30,7 +30,10 @@ public class TowerBossDeathListener implements Listener {
return; return;
} }
var deepTower = data.split(";");
boolean underground = Boolean.parseBoolean(deepTower[3]);
// Tower Collapse Start // Tower Collapse Start
TowerDestroyer.startCollapse(golem.getLocation(), event.getEntity().getKiller()); TowerDestroyer.startCollapse(golem.getLocation(), event.getEntity().getKiller(), underground);
} }
} }

View File

@@ -1,18 +1,22 @@
package fyi.tiko.battletowers.boss; package fyi.tiko.battletowers.boss;
import static fyi.tiko.battletowers.BattleTowersPlugin.instance; import fyi.tiko.battletowers.BattleTowersPlugin;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World;
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;
public class TowerBossSpawner { public class TowerBossSpawner {
public static void spawnDormantBoss(org.bukkit.World world, public static void spawnDormantBoss(
World world,
Location loc, Location loc,
int towerX, int towerY, int towerZ) { int towerX,
int towerY,
int towerZ,
boolean underground
) {
IronGolem golem = world.spawn(loc, IronGolem.class); IronGolem golem = world.spawn(loc, IronGolem.class);
// ===== Boss Stats like Forge ===== // ===== Boss Stats like Forge =====
@@ -30,9 +34,9 @@ public class TowerBossSpawner {
// Save tower coords inside entity // Save tower coords inside entity
golem.getPersistentDataContainer().set( golem.getPersistentDataContainer().set(
instance().towerKey(), BattleTowersPlugin.instance().towerKey(),
PersistentDataType.STRING, PersistentDataType.STRING,
towerX + ";" + towerY + ";" + towerZ towerX + ";" + towerY + ";" + towerZ + ";" + underground
); );
} }

View File

@@ -1,7 +1,6 @@
package fyi.tiko.battletowers.boss; package fyi.tiko.battletowers.boss;
import static fyi.tiko.battletowers.BattleTowersPlugin.instance; import fyi.tiko.battletowers.BattleTowersPlugin;
import fyi.tiko.battletowers.data.Towers; import fyi.tiko.battletowers.data.Towers;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
@@ -11,7 +10,7 @@ import org.bukkit.scheduler.BukkitRunnable;
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, boolean deep) {
World world = center.getWorld(); World world = center.getWorld();
world.getNearbyEntities(center, 15, 15, 15).forEach(entity -> { world.getNearbyEntities(center, 15, 15, 15).forEach(entity -> {
@@ -33,11 +32,11 @@ public class TowerDestroyer {
return; return;
} }
double y = center.getY() - (floor * Towers.FLOOR_HEIGHT); double y = !deep ? (center.getY() - (floor * Towers.FLOOR_HEIGHT)) : center.getY() + (floor * Towers.FLOOR_HEIGHT);
world.createExplosion(center.getX(), y, center.getZ(), 10f); world.createExplosion(center.getX(), y, center.getZ(), 10f);
floor--; floor--;
} }
}.runTaskTimer(instance(), 20 * 15, 20 * 5); }.runTaskTimer(BattleTowersPlugin.instance(), 20 * 15, 20 * 5);
} }
} }

View File

@@ -1,8 +1,8 @@
package fyi.tiko.battletowers.generation; package fyi.tiko.battletowers.generation;
import fyi.tiko.battletowers.BattleTowersPlugin; import fyi.tiko.battletowers.BattleTowersPlugin;
import fyi.tiko.battletowers.data.TowerType;
import fyi.tiko.battletowers.boss.TowerBossSpawner; import fyi.tiko.battletowers.boss.TowerBossSpawner;
import fyi.tiko.battletowers.data.TowerType;
import fyi.tiko.battletowers.loot.TowerLootManager; import fyi.tiko.battletowers.loot.TowerLootManager;
import fyi.tiko.battletowers.loot.TowerStageItemManager; import fyi.tiko.battletowers.loot.TowerStageItemManager;
import java.util.Random; import java.util.Random;
@@ -334,7 +334,7 @@ public class TowerGenerator {
// ===== TOP FLOOR → BOSS GOLEM ===== // ===== TOP FLOOR → BOSS GOLEM =====
TowerBossSpawner.spawnDormantBoss(world, TowerBossSpawner.spawnDormantBoss(world,
new Location(world, ix + 0.5, builderHeight + 6, kz + 0.5), new Location(world, ix + 0.5, builderHeight + 6, kz + 0.5),
ix, builderHeight + 6, kz); ix, builderHeight + 6, kz, underground);
} else { } else {
@@ -354,7 +354,6 @@ public class TowerGenerator {
// oder nutzen einfach deine Logik weiter, aber rufen es sicher auf. // oder nutzen einfach deine Logik weiter, aber rufen es sicher auf.
placeFloorChests(world, ix, builderHeight, kz, floor, underground, topFloor); placeFloorChests(world, ix, builderHeight, kz, floor, underground, topFloor);
// ============================ // ============================
// CHEST PETAL (PODEST) - WIEDER EINGEFÜGT // CHEST PETAL (PODEST) - WIEDER EINGEFÜGT
// ============================ // ============================
@@ -446,18 +445,24 @@ public class TowerGenerator {
boolean underground) { boolean underground) {
var state = world.getBlockAt(x, y, z).getState(); var state = world.getBlockAt(x, y, z).getState();
if (!(state instanceof org.bukkit.block.Chest chest)) return; if (!(state instanceof org.bukkit.block.Chest chest)) {
return;
}
int attempts = BattleTowersPlugin.instance() int attempts = BattleTowersPlugin.instance()
.getConfig() .getConfig()
.getInt("tower.itemGenerateAttemptsPerFloor"); .getInt("tower.itemGenerateAttemptsPerFloor");
if (underground) attempts *= 2; if (underground) {
attempts *= 2;
}
for (int i = 0; i < attempts; i++) { for (int i = 0; i < attempts; i++) {
ItemStack item = manager.getStageItem(random); ItemStack item = manager.getStageItem(random);
if (item == null) continue; if (item == null) {
continue;
}
chest.getInventory().setItem( chest.getInventory().setItem(
random.nextInt(chest.getInventory().getSize()), random.nextInt(chest.getInventory().getSize()),

View File

@@ -8,7 +8,6 @@ import org.bukkit.generator.WorldInfo;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class TowerPopulator extends BlockPopulator { public class TowerPopulator extends BlockPopulator {
private final TowerGenerator generator = new TowerGenerator(); private final TowerGenerator generator = new TowerGenerator();
/* /*
@@ -35,19 +34,23 @@ public class TowerPopulator extends BlockPopulator {
int chunkZ, int chunkZ,
@NotNull LimitedRegion limitedRegion @NotNull LimitedRegion limitedRegion
) { ) {
// Chance pro Chunk (1/250) // 1. Chance prüfen
if (random.nextInt(250) != 0) { if (random.nextInt(250) != 0) {
return; return;
} }
// Chunk-Koordinaten -> Block-Koordinaten (Chunk-Mitte) // 2. Wir nutzen die Mitte des Chunks
int x = chunkX * 16 + 8; int blockX = (chunkX << 4) + 8;
int z = chunkZ * 16 + 8; int blockZ = (chunkZ << 4) + 8;
// Welt aus Region holen // 3. WICHTIG: Prüfen, ob der gesamte Tower-Bereich (Radius 8) in der Region ist
World world = limitedRegion.getWorld(); // LimitedRegion deckt meist 3x3 Chunks ab, aber sicher ist sicher:
if (!limitedRegion.isInRegion(blockX + 7, 64, blockZ + 7) ||
!limitedRegion.isInRegion(blockX - 7, 64, blockZ - 7)) {
return;
}
// Tower spawnen // 4. Nur noch die Region und World Info übergeben, nicht die ganze World wenn möglich
generator.trySpawnTower(world, random, x, z); generator.trySpawnTower(limitedRegion, limitedRegion.getWorld(), random, blockX, blockZ);
} }
} }