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 -> {
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)
));

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