fixed tower spawning issues
This commit is contained in:
parent
5e5f36153e
commit
5ef254b75f
@ -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)
|
||||
));
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user