diff --git a/src/main/java/com/comandante/creeper/command/BackCommand.java b/src/main/java/com/comandante/creeper/command/BackCommand.java index c15120bdf0cd3884173fc9e7889916899e0b8aa5..aead2c1ddceb19e8932a44472366a35e17307f20 100644 --- a/src/main/java/com/comandante/creeper/command/BackCommand.java +++ b/src/main/java/com/comandante/creeper/command/BackCommand.java @@ -27,7 +27,6 @@ public class BackCommand extends Command { return; } Room returnRoom = player.getPreviousRoom(); - player.removeActiveAlertStatus(); PlayerMovement playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), returnRoom.getRoomId(), "fleed to where they came from.", "up"); player.movePlayer(playerMovement); }); diff --git a/src/main/java/com/comandante/creeper/command/MovementCommand.java b/src/main/java/com/comandante/creeper/command/MovementCommand.java index ff8a125ebd21a03f89cd65dc8eb5160d0f5a7e22..329460fc2d1be8ecde4aad26dbc09c17d2114885 100644 --- a/src/main/java/com/comandante/creeper/command/MovementCommand.java +++ b/src/main/java/com/comandante/creeper/command/MovementCommand.java @@ -44,7 +44,7 @@ public class MovementCommand extends Command { MovementCommand.this.write("You are dead and can not move."); return; } - if (player.isActiveAlertNpcStatus()) { + if (player.isAlertedNpcPresentInCurrentRoom()) { MovementCommand.this.write("You are unable to progress, but can return to where you came from by typing \"back\"."); return; } diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java index 7583b864b407895fbe3b955fb344f116039d29ff..87be794be33b11c3ba2861fc0026773438c9da23 100644 --- a/src/main/java/com/comandante/creeper/managers/GameManager.java +++ b/src/main/java/com/comandante/creeper/managers/GameManager.java @@ -726,7 +726,7 @@ public class GameManager { sb.append(Color.GREEN + "F" + Color.RESET); } } - if (player.isActiveAlertNpcStatus()) { + if (player.isAlertedNpcPresentInCurrentRoom()) { sb.append(" "); sb.append(Color.RED + "ALERT" + Color.RESET); } diff --git a/src/main/java/com/comandante/creeper/player/Player.java b/src/main/java/com/comandante/creeper/player/Player.java index 0b970850d7d7cd1092d856b6e5cea0a741b202f8..82c58fa05e91602f697dfb165f96eea15149c9f9 100644 --- a/src/main/java/com/comandante/creeper/player/Player.java +++ b/src/main/java/com/comandante/creeper/player/Player.java @@ -49,6 +49,7 @@ public class Player extends CreeperEntity { private int tickBucket = 0; private int fightTickBucket = 0; private boolean hasAlertedNpc; + private final Set<Npc> alertedNpcs = Sets.newHashSet(); private Room previousRoom; private final ScheduledThreadPoolExecutor scheduledExecutor = new ScheduledThreadPoolExecutor(1000); @@ -355,24 +356,44 @@ public class Player extends CreeperEntity { return Lists.newArrayList(playerMetadata.getLearnedSpells()); } + public boolean isActiveAlertNpcStatus(Npc npc) { + synchronized (interner.intern(playerId)) { + return alertedNpcs.contains(npc); + } + } + public boolean isActiveAlertNpcStatus() { synchronized (interner.intern(playerId)) { - return hasAlertedNpc; + return alertedNpcs.size() > 0; } } - public void setIsActiveAlertNpcStatus() { + public boolean isAlertedNpcPresentInCurrentRoom() { + return currentRoom.getPresentNpcs().stream().filter(this::isActiveAlertNpcStatus).count() > 0; + } + + public void setIsActiveAlertNpcStatus(Npc npc) { synchronized (interner.intern(playerId)) { - hasAlertedNpc = true; + alertedNpcs.add(npc); } } public void removeActiveAlertStatus() { synchronized (interner.intern(playerId)) { - hasAlertedNpc = false; + alertedNpcs.clear(); } } + public void removeActiveAlertStatus(Npc npc) { + synchronized (interner.intern(playerId)) { + alertedNpcs.clear(); + } + } + + public Set<Npc> getAlertedNpcs() { + return alertedNpcs; + } + public void addInventoryId(String inventoryId) { synchronized (interner.intern(playerId)) { PlayerMetadata playerMetadata = getPlayerMetadata(); @@ -497,6 +518,9 @@ public class Player extends CreeperEntity { if (coolDown.isActive()) { coolDown.decrementTick(); } else { + if (coolDown.equals(CoolDownType.DEATH)) { + gameManager.getChannelUtils().write(playerId, "You have risen from the dead.\r\n"); + } iterator.remove(); } } @@ -585,8 +609,9 @@ public class Player extends CreeperEntity { 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(); + setIsActiveAlertNpcStatus(npc); scheduledExecutor.schedule(() -> { + removeActiveAlertStatus(npc); if (!getCurrentRoom().getRoomId().equals(originalRoom.getRoomId())) { return; } diff --git a/src/main/java/com/comandante/creeper/world/Room.java b/src/main/java/com/comandante/creeper/world/Room.java index aadb5b44b338e3760bda9980e859c7322a2899ec..5bd55bf92747e6c1535f190e4d4be8e6bae259ed 100644 --- a/src/main/java/com/comandante/creeper/world/Room.java +++ b/src/main/java/com/comandante/creeper/world/Room.java @@ -6,6 +6,7 @@ import com.comandante.creeper.Items.ItemType; import com.comandante.creeper.entity.CreeperEntity; import com.comandante.creeper.managers.GameManager; import com.comandante.creeper.merchant.Merchant; +import com.comandante.creeper.npc.Npc; import com.comandante.creeper.spawner.ItemSpawner; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -15,6 +16,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; public abstract class Room extends CreeperEntity { @@ -260,6 +262,10 @@ public abstract class Room extends CreeperEntity { return gameManager; } + public List<Npc> getPresentNpcs() { + return npcIds.stream().map(s -> gameManager.getEntityManager().getNpcEntity(s)).collect(Collectors.toList()); + } + @Override public void run() { for (String itemId : itemIds) {