fixed tower spawning issues

This commit is contained in:
Lars Neuhaus 2025-04-14 17:26:59 +02:00
parent 5e5f36153e
commit 5ef254b75f
2 changed files with 21 additions and 9 deletions

View File

@ -57,7 +57,7 @@ public class Towerdefense extends StatelessGame {
this.getPlayers().forEach(player -> { this.getPlayers().forEach(player -> {
TowerdefenseRoom newRoom = new TowerdefenseRoom(player, this); TowerdefenseRoom newRoom = new TowerdefenseRoom(player, this);
this.instances.add(newRoom); this.instances.add(newRoom);
player.setInstance(newRoom); player.setInstance(newRoom, new Pos(0, 1, 0));
newRoom.startWave(List.of( newRoom.startWave(List.of(
new GroupFactory(new EnemyFactory(EntityType.VILLAGER, 2, 0.1), 1, 800) new GroupFactory(new EnemyFactory(EntityType.VILLAGER, 2, 0.1), 1, 800)
)); ));

View File

@ -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.entity.projectile.ProjectileCollideWithEntityEvent;
import net.minestom.server.event.inventory.InventoryPreClickEvent; import net.minestom.server.event.inventory.InventoryPreClickEvent;
import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.event.item.ItemDropEvent;
import net.minestom.server.event.item.PlayerBeginItemUseEvent;
import net.minestom.server.event.player.*; import net.minestom.server.event.player.*;
import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.item.ItemAnimation;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
import net.minestom.server.timer.TaskSchedule; 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.BLOCK_INTERACTION_RANGE).setBaseValue(reach);
this.player.getAttribute(Attribute.ENTITY_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(
this.player.getInventory().addItemStack(ItemStack.of(Material.BARRIER).withCustomName(Component.text("Löschen", TextColor.color(255,0,0)))); 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) -> { this.game.getAvailableTowers().forEach((material, tower) -> {
int price = this.game.getPrices().get(tower); int price = this.game.getPrices().get(tower);
this.player.getInventory().addItemStack(ItemStack.of(material).withMaxStackSize(price).withAmount(price)); 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(PlayerHandAnimationEvent.class, event -> this.useItem())
.addListener(ItemDropEvent.class, CommonEventHandles::cancel) .addListener(ItemDropEvent.class, CommonEventHandles::cancel)
.addListener(InventoryPreClickEvent.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() { private void useItem() {
Material itemInHand = this.player.getItemInMainHand().material(); Material itemInHand = this.player.getItemInMainHand().material();
if(itemInHand.equals(Material.SPECTRAL_ARROW)) { if(itemInHand.equals(Material.BOW)) {
this.playerAttack(); this.playerAttack();
return; return;
} }
@ -117,7 +126,7 @@ public class TowerdefenseRoom extends InstanceContainer {
projectile.setAerodynamics(new Aerodynamics(0, 1, 0)); projectile.setAerodynamics(new Aerodynamics(0, 1, 0));
Vec projectileVelocity = p.getPosition().direction().normalize().mul(20); Vec projectileVelocity = p.getPosition().direction().normalize().mul(20);
projectile.setVelocity(projectileVelocity); projectile.setVelocity(projectileVelocity.add(this.player.getVelocity()));
projectile.scheduleRemove(Duration.ofSeconds(5)); projectile.scheduleRemove(Duration.ofSeconds(5));
projectile.setInstance(this, p.getPosition().add(0, p.getEyeHeight(), 0)); projectile.setInstance(this, p.getPosition().add(0, p.getEyeHeight(), 0));
projectile.eventNode() projectile.eventNode()
@ -136,7 +145,7 @@ public class TowerdefenseRoom extends InstanceContainer {
this.player.setLevel(this.money); this.player.setLevel(this.money);
} }
private void placeTower() { private synchronized void placeTower() {
if(!this.canPlaceActiveTower()) { if(!this.canPlaceActiveTower()) {
if(this.cursor.isCursorActive() && !this.enoughMoneyForActiveTower()) { if(this.cursor.isCursorActive() && !this.enoughMoneyForActiveTower()) {
this.player.sendActionBar(Component.text("Nicht genug Geld!", TextColor.color(255,0,0))); this.player.sendActionBar(Component.text("Nicht genug Geld!", TextColor.color(255,0,0)));
@ -154,10 +163,12 @@ public class TowerdefenseRoom extends InstanceContainer {
.newInstance(); .newInstance();
this.setBlock(this.cursor.getTargetBlockPosition(), Block.BLUE_WOOL); this.setBlock(this.cursor.getTargetBlockPosition(), Block.BLUE_WOOL);
tower.setInstance(this, this.cursor.getPosition()); tower.setInstance(this, this.cursor.getPosition());
System.out.println("PLACE");
this.towers.add(tower); this.towers.add(tower);
this.addMoney(-this.game.getPrices().get(tower.getClass())); this.addMoney(-this.game.getPrices().get(tower.getClass()));
} catch (Exception ignored) { } catch (Exception ignored) {
} }
this.cursor.updateCursorPosition(this.player);
} }
private void removeTower() { private void removeTower() {
@ -201,15 +212,16 @@ public class TowerdefenseRoom extends InstanceContainer {
this.changeEnemyGoal(enemy, 0); 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) { if(positionIndex == this.game.getMazePath().size()-1) {
this.enemies.remove(enemy); this.enemies.remove(enemy);
enemy.remove(); enemy.remove();
float damage = (float) Math.ceil(enemy.getHealth()/10); float damage = (float) Math.ceil(enemy.getHealth()/10);
if(this.player.getHealth() - damage <= 0) { if(this.player.getHealth() - damage <= 0) {
this.player.setInstance(this.game);
this.getEnemies().forEach(Entity::remove); this.getEnemies().forEach(Entity::remove);
this.towers.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); this.game.getScore().insertResult(this.player);
return; return;
} }