diff --git a/src/main/java/com/comandante/creeper/player/NpcAggroCountDown.java b/src/main/java/com/comandante/creeper/player/NpcAggroCountDown.java deleted file mode 100644 index f507cad0ea3e9c9c95ffa0fbd79bb5f72f9ea6e6..0000000000000000000000000000000000000000 --- a/src/main/java/com/comandante/creeper/player/NpcAggroCountDown.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.comandante.creeper.player; - -import com.comandante.creeper.managers.GameManager; -import com.comandante.creeper.npc.Npc; -import com.comandante.creeper.server.Color; -import com.comandante.creeper.world.Room; -import com.google.common.util.concurrent.AbstractExecutionThreadService; - -public class NpcAggroCountDown extends AbstractExecutionThreadService { - - private final int delaySeconds; - private final GameManager gameManager; - private final Player player; - private final Npc npc; - private final Room originalRoom; - - public NpcAggroCountDown(int delaySeconds, GameManager gameManager, Player player, Npc npc, Room originalRoom) { - this.delaySeconds = delaySeconds; - this.gameManager = gameManager; - this.player = player; - this.npc = npc; - this.originalRoom = originalRoom; - } - - @Override - protected void run() throws Exception { - try { - Thread.sleep(delaySeconds * 1000); - if (!player.getCurrentRoom().getRoomId().equals(originalRoom.getRoomId())) { - return; - } - gameManager.writeToPlayerCurrentRoom(player.getPlayerId(), player.getPlayerName() + " has " + Color.BOLD_ON + Color.RED + "angered" + Color.RESET + " a " + npc.getColorName() + "\r\n"); - player.addActiveFight(npc); - } finally { - this.shutDown(); - } - } -} diff --git a/src/main/java/com/comandante/creeper/player/Player.java b/src/main/java/com/comandante/creeper/player/Player.java index be4d5200268e26d7dd1d676a0668526a31f43479..8836327efc102ff2a238a95e4c5f30b4a5bd1734 100644 --- a/src/main/java/com/comandante/creeper/player/Player.java +++ b/src/main/java/com/comandante/creeper/player/Player.java @@ -29,6 +29,8 @@ import org.nocrala.tools.texttablefmt.Table; import java.text.NumberFormat; import java.util.*; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; public class Player extends CreeperEntity { @@ -46,9 +48,10 @@ public class Player extends CreeperEntity { private Set<CoolDown> coolDowns = Collections.synchronizedSet(new HashSet<CoolDown>()); private int tickBucket = 0; private int fightTickBucket = 0; - private List<NpcAggroCountDown> aggroCountDowns = Lists.newArrayList(); private boolean hasAlertedNpc; private Room previousRoom; + private final ScheduledThreadPoolExecutor scheduledExecutor = new ScheduledThreadPoolExecutor(1000); + public Player(String playerName, GameManager gameManager) { this.playerName = playerName; @@ -162,6 +165,7 @@ public class Player extends CreeperEntity { playerMetadata.setGold(newGold); gameManager.getPlayerManager().savePlayerMetadata(playerMetadata); gameManager.getChannelUtils().write(getPlayerId(), "You just " + Color.BOLD_ON + Color.RED + "lost " + Color.RESET + newGold + Color.YELLOW + " gold" + Color.RESET + "!\r\n"); + removeActiveAlertStatus(); CoolDown death = new CoolDown(CoolDownType.DEATH); addCoolDown(death); gameManager.writeToPlayerCurrentRoom(getPlayerId(), getPlayerName() + " is now dead." + "\r\n"); @@ -559,28 +563,37 @@ public class Player extends CreeperEntity { setReturnDirection(java.util.Optional.of(playerMovement.getReturnDirection())); gameManager.currentRoomLogic(playerId, gameManager.getRoomManager().getRoom(playerMovement.getDestinationRoomId())); gameManager.getRoomManager().getRoom(playerMovement.getDestinationRoomId()); - if (!isActive(CoolDownType.DEATH)) { - processNpcAggro(); - } + processNpcAggro(); } } - private void processNpcAggro() { - List<Npc> aggresiveRoomNpcs = currentRoom.getNpcIds().stream() - .map(npcId -> gameManager.getEntityManager().getNpcEntity(npcId)) - .filter(npc -> npc.getTemperament().equals(Temperament.AGGRESSIVE)) - .filter(npc -> {Npc.NpcLevelColor levelColor = npc.getLevelColor((int) Levels.getLevel(getPlayerStatsWithEquipmentAndLevel().getExperience())); - return !levelColor.equals(Npc.NpcLevelColor.WHITE); - }) - .collect(Collectors.toList()); - - aggresiveRoomNpcs.forEach(npc -> { - gameManager.writeToPlayerCurrentRoom(getPlayerId(), getPlayerName() + " has alerted a " + npc.getColorName() + "\r\n"); - gameManager.getChannelUtils().write(playerId, "You can return to your previous location by typing \"back\"" + "\r\n"); - setIsActiveAlertNpcStatus(); - NpcAggroCountDown npcAggroCountDown = new NpcAggroCountDown(5, gameManager, this, npc, currentRoom); - npcAggroCountDown.startAsync(); - }); + public void processNpcAggro() { + synchronized (interner.intern(playerId)) { + if (isActive(CoolDownType.DEATH)) { + return; + } + List<Npc> aggresiveRoomNpcs = currentRoom.getNpcIds().stream() + .map(npcId -> gameManager.getEntityManager().getNpcEntity(npcId)) + .filter(npc -> npc.getTemperament().equals(Temperament.AGGRESSIVE)) + .filter(npc -> { + Npc.NpcLevelColor levelColor = npc.getLevelColor((int) Levels.getLevel(getPlayerStatsWithEquipmentAndLevel().getExperience())); + return !levelColor.equals(Npc.NpcLevelColor.WHITE); + }) + .collect(Collectors.toList()); + + aggresiveRoomNpcs.forEach(npc -> { + gameManager.writeToPlayerCurrentRoom(getPlayerId(), getPlayerName() + " has alerted a " + npc.getColorName() + "\r\n"); + gameManager.getChannelUtils().write(playerId, "You can return to your previous location by typing \"back\"" + "\r\n"); + setIsActiveAlertNpcStatus(); + scheduledExecutor.schedule(() -> { + if (!getCurrentRoom().getRoomId().equals(currentRoom.getRoomId())) { + return; + } + gameManager.writeToPlayerCurrentRoom(getPlayerId(), getPlayerName() + " has " + Color.BOLD_ON + Color.RED + "ANGERED" + Color.RESET + " a " + npc.getColorName() + "\r\n"); + addActiveFight(npc); + }, 5, TimeUnit.SECONDS); + }); + } } public Item getInventoryItem(String itemKeyword) { diff --git a/src/main/java/com/comandante/creeper/player/PlayerStats.java b/src/main/java/com/comandante/creeper/player/PlayerStats.java index f13ba40e5f2497b18318faa5c9d7d41cf85d1352..7f2ea2fe9d6a07c324fb32509075dda7b5bae7c5 100644 --- a/src/main/java/com/comandante/creeper/player/PlayerStats.java +++ b/src/main/java/com/comandante/creeper/player/PlayerStats.java @@ -23,5 +23,4 @@ public class PlayerStats { .setForaging(0) .setInventorySize(10) .setMaxEffects(4); - } diff --git a/src/main/java/com/comandante/creeper/spawner/NpcSpawner.java b/src/main/java/com/comandante/creeper/spawner/NpcSpawner.java index b479ec54ef7b5ef6a8170169f99f658b03c3ccb7..513e05a878f988c03678587262a20104e7b628ed 100644 --- a/src/main/java/com/comandante/creeper/spawner/NpcSpawner.java +++ b/src/main/java/com/comandante/creeper/spawner/NpcSpawner.java @@ -7,6 +7,7 @@ import com.comandante.creeper.entity.CreeperEntity; import com.comandante.creeper.managers.GameManager; import com.comandante.creeper.npc.Npc; import com.comandante.creeper.npc.NpcBuilder; +import com.comandante.creeper.player.Player; import com.comandante.creeper.world.Area; import com.comandante.creeper.world.Room; @@ -76,6 +77,7 @@ public class NpcSpawner extends CreeperEntity { gameManager.getEntityManager().addEntity(newNpc); room.addPresentNpc(newNpc.getEntityId()); gameManager.writeToRoom(room.getRoomId(), newNpc.getColorName() + " appears." + "\r\n"); + gameManager.getRoomManager().getPresentPlayers(room).forEach(Player::processNpcAggro); Main.metrics.counter(MetricRegistry.name(NpcSpawner.class, npc.getName() + "-spawn")).inc(); }