From 13657d345b4eb424b204f26c4b016306a6f06738 Mon Sep 17 00:00:00 2001
From: Chris Kearney <chris@kearneymail.com>
Date: Sun, 14 Aug 2016 21:55:28 -0700
Subject: [PATCH] aggro code refinements/improvements

---
 .../creeper/player/NpcAggroCountDown.java     | 38 -------------
 .../com/comandante/creeper/player/Player.java | 53 ++++++++++++-------
 .../creeper/player/PlayerStats.java           |  1 -
 .../creeper/spawner/NpcSpawner.java           |  2 +
 4 files changed, 35 insertions(+), 59 deletions(-)
 delete mode 100644 src/main/java/com/comandante/creeper/player/NpcAggroCountDown.java

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 f507cad0..00000000
--- 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 be4d5200..8836327e 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 f13ba40e..7f2ea2fe 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 b479ec54..513e05a8 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();
     }
 
-- 
GitLab