From 5ef254b75fa3985af04a4f5548b2e0a471a1a504 Mon Sep 17 00:00:00 2001 From: lars Date: Mon, 14 Apr 2025 17:26:59 +0200 Subject: [PATCH] fixed tower spawning issues --- .../types/towerdefense/Towerdefense.java | 2 +- .../types/towerdefense/TowerdefenseRoom.java | 28 +++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/Towerdefense.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/Towerdefense.java index e4222a5..86be4c3 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/Towerdefense.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/Towerdefense.java @@ -57,7 +57,7 @@ public class Towerdefense extends StatelessGame { this.getPlayers().forEach(player -> { TowerdefenseRoom newRoom = new TowerdefenseRoom(player, this); this.instances.add(newRoom); - player.setInstance(newRoom); + player.setInstance(newRoom, new Pos(0, 1, 0)); newRoom.startWave(List.of( new GroupFactory(new EnemyFactory(EntityType.VILLAGER, 2, 0.1), 1, 800) )); diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/TowerdefenseRoom.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/TowerdefenseRoom.java index f4b67c9..c42a954 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/TowerdefenseRoom.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/TowerdefenseRoom.java @@ -18,9 +18,11 @@ import net.minestom.server.event.entity.projectile.ProjectileCollideWithBlockEve import net.minestom.server.event.entity.projectile.ProjectileCollideWithEntityEvent; import net.minestom.server.event.inventory.InventoryPreClickEvent; import net.minestom.server.event.item.ItemDropEvent; +import net.minestom.server.event.item.PlayerBeginItemUseEvent; import net.minestom.server.event.player.*; import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.block.Block; +import net.minestom.server.item.ItemAnimation; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; import net.minestom.server.timer.TaskSchedule; @@ -52,8 +54,12 @@ public class TowerdefenseRoom extends InstanceContainer { this.player.getAttribute(Attribute.BLOCK_INTERACTION_RANGE).setBaseValue(reach); this.player.getAttribute(Attribute.ENTITY_INTERACTION_RANGE).setBaseValue(reach); - this.player.getInventory().addItemStack(ItemStack.of(Material.SPECTRAL_ARROW).withCustomName(Component.text("Schießen", TextColor.color(255, 180, 0)))); - this.player.getInventory().addItemStack(ItemStack.of(Material.BARRIER).withCustomName(Component.text("Löschen", TextColor.color(255,0,0)))); + this.player.getInventory().addItemStack( + ItemStack.of(Material.BOW).withCustomName(Component.text("Schießen", TextColor.color(255, 180, 0))) + ); + this.player.getInventory().addItemStack( + ItemStack.of(Material.BARRIER).withCustomName(Component.text("Löschen", TextColor.color(255,0,0))) + ); this.game.getAvailableTowers().forEach((material, tower) -> { int price = this.game.getPrices().get(tower); this.player.getInventory().addItemStack(ItemStack.of(material).withMaxStackSize(price).withAmount(price)); @@ -91,12 +97,15 @@ public class TowerdefenseRoom extends InstanceContainer { .addListener(PlayerHandAnimationEvent.class, event -> this.useItem()) .addListener(ItemDropEvent.class, CommonEventHandles::cancel) .addListener(InventoryPreClickEvent.class, CommonEventHandles::cancel) - .addListener(PlayerSwapItemEvent.class, CommonEventHandles::cancel); + .addListener(PlayerSwapItemEvent.class, CommonEventHandles::cancel) + .addListener(PlayerBeginItemUseEvent.class, event -> { + if(event.getAnimation().equals(ItemAnimation.BOW)) event.setCancelled(true); + }); } private void useItem() { Material itemInHand = this.player.getItemInMainHand().material(); - if(itemInHand.equals(Material.SPECTRAL_ARROW)) { + if(itemInHand.equals(Material.BOW)) { this.playerAttack(); return; } @@ -117,7 +126,7 @@ public class TowerdefenseRoom extends InstanceContainer { projectile.setAerodynamics(new Aerodynamics(0, 1, 0)); Vec projectileVelocity = p.getPosition().direction().normalize().mul(20); - projectile.setVelocity(projectileVelocity); + projectile.setVelocity(projectileVelocity.add(this.player.getVelocity())); projectile.scheduleRemove(Duration.ofSeconds(5)); projectile.setInstance(this, p.getPosition().add(0, p.getEyeHeight(), 0)); projectile.eventNode() @@ -136,7 +145,7 @@ public class TowerdefenseRoom extends InstanceContainer { this.player.setLevel(this.money); } - private void placeTower() { + private synchronized void placeTower() { if(!this.canPlaceActiveTower()) { if(this.cursor.isCursorActive() && !this.enoughMoneyForActiveTower()) { this.player.sendActionBar(Component.text("Nicht genug Geld!", TextColor.color(255,0,0))); @@ -154,10 +163,12 @@ public class TowerdefenseRoom extends InstanceContainer { .newInstance(); this.setBlock(this.cursor.getTargetBlockPosition(), Block.BLUE_WOOL); tower.setInstance(this, this.cursor.getPosition()); + System.out.println("PLACE"); this.towers.add(tower); this.addMoney(-this.game.getPrices().get(tower.getClass())); } catch (Exception ignored) { } + this.cursor.updateCursorPosition(this.player); } private void removeTower() { @@ -201,15 +212,16 @@ public class TowerdefenseRoom extends InstanceContainer { this.changeEnemyGoal(enemy, 0); } - private void changeEnemyGoal(EntityCreature enemy, int positionIndex) { + private synchronized void changeEnemyGoal(EntityCreature enemy, int positionIndex) { if(positionIndex == this.game.getMazePath().size()-1) { this.enemies.remove(enemy); enemy.remove(); float damage = (float) Math.ceil(enemy.getHealth()/10); if(this.player.getHealth() - damage <= 0) { - this.player.setInstance(this.game); this.getEnemies().forEach(Entity::remove); this.towers.forEach(Entity::remove); + this.player.setInstance(this.game).thenRun(() -> MinecraftServer.getInstanceManager().unregisterInstance(this)); + this.player.heal(); this.game.getScore().insertResult(this.player); return; }