diff --git a/src/main/java/com/comandante/creeper/ConfigureCommands.java b/src/main/java/com/comandante/creeper/ConfigureCommands.java index 6fb2fe3fbe2b5a94788f1d6ba8d6f7ca60b166b8..dc186d2f089ce6a54e64c55eae29e875ab50d242 100644 --- a/src/main/java/com/comandante/creeper/ConfigureCommands.java +++ b/src/main/java/com/comandante/creeper/ConfigureCommands.java @@ -93,5 +93,6 @@ public class ConfigureCommands { creeperCommandRegistry.addCommand(new CardsCommand(gameManager)); creeperCommandRegistry.addCommand(new SpellsCommand(gameManager)); creeperCommandRegistry.addCommand(new LeaveCommand(gameManager)); + creeperCommandRegistry.addCommand(new BackCommand(gameManager)); } } diff --git a/src/main/java/com/comandante/creeper/command/BackCommand.java b/src/main/java/com/comandante/creeper/command/BackCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..e7fa4d66209a28dc4df4fd1533b7b557c1b10e74 --- /dev/null +++ b/src/main/java/com/comandante/creeper/command/BackCommand.java @@ -0,0 +1,32 @@ +package com.comandante.creeper.command; + +import com.comandante.creeper.managers.GameManager; +import com.comandante.creeper.player.PlayerMovement; +import com.comandante.creeper.world.Room; +import org.jboss.netty.channel.ChannelHandlerContext; +import org.jboss.netty.channel.MessageEvent; + +import java.util.Arrays; +import java.util.List; + +public class BackCommand extends Command { + + final static List<String> validTriggers = Arrays.asList("back", "b"); + final static String description = "Return to where you came from."; + final static String correctUsage = "back"; + + public BackCommand(GameManager gameManager) { + super(gameManager, validTriggers, description, correctUsage); + } + + @Override + public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { + execCommand(ctx, e, () -> { + 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); + }); + } + +} \ No newline at end of file diff --git a/src/main/java/com/comandante/creeper/command/MovementCommand.java b/src/main/java/com/comandante/creeper/command/MovementCommand.java index 7750b369ae1bea2c40214c418471bd7c9c54ab77..ff8a125ebd21a03f89cd65dc8eb5160d0f5a7e22 100644 --- a/src/main/java/com/comandante/creeper/command/MovementCommand.java +++ b/src/main/java/com/comandante/creeper/command/MovementCommand.java @@ -44,6 +44,10 @@ public class MovementCommand extends Command { MovementCommand.this.write("You are dead and can not move."); return; } + if (player.isActiveAlertNpcStatus()) { + MovementCommand.this.write("You are unable to progress, but can return to where you came from by typing \"back\"."); + return; + } for (String effectId : playerManager.getPlayerMetadata(playerId).getEffects()) { Effect effect = gameManager.getEntityManager().getEffectEntity(effectId); if (effect.isFrozenMovement()) { diff --git a/src/main/java/com/comandante/creeper/command/admin/BuildCommand.java b/src/main/java/com/comandante/creeper/command/admin/BuildCommand.java index df593275aa70eba2f309db101db3d050feb43265..e7f43e3a49d2f9f27b491938624c378a6ec1469d 100644 --- a/src/main/java/com/comandante/creeper/command/admin/BuildCommand.java +++ b/src/main/java/com/comandante/creeper/command/admin/BuildCommand.java @@ -15,7 +15,7 @@ import java.util.stream.Collectors; public class BuildCommand extends Command { - final static List<String> validTriggers = Arrays.asList("build", "b"); + final static List<String> validTriggers = Arrays.asList("build"); final static String description = "Build new rooms in the world."; final static String correctUsage = "build [n|s|e|w|enter <name>|notable <name>]"; final static Set<PlayerRole> roles = Sets.newHashSet(PlayerRole.ADMIN); diff --git a/src/main/java/com/comandante/creeper/player/CoolDownType.java b/src/main/java/com/comandante/creeper/player/CoolDownType.java index 1e1d98d34e673b7a25a00896434258c7f373595b..2993ef20b5e7a2988fd2593b1d917efc2578a097 100644 --- a/src/main/java/com/comandante/creeper/player/CoolDownType.java +++ b/src/main/java/com/comandante/creeper/player/CoolDownType.java @@ -10,7 +10,8 @@ public enum CoolDownType { FORAGE_SUPERSHORT("forage-supershort", 1), SPELL("",0), NPC_FIGHT("fight",30), - NPC_ROAM("npc-roam", 600); + NPC_ROAM("npc-roam", 1200), + NPC_ALERTED("npc-alerted", 30); private final String name; private final int ticks; diff --git a/src/main/java/com/comandante/creeper/player/NpcAggroCountDown.java b/src/main/java/com/comandante/creeper/player/NpcAggroCountDown.java new file mode 100644 index 0000000000000000000000000000000000000000..f507cad0ea3e9c9c95ffa0fbd79bb5f72f9ea6e6 --- /dev/null +++ b/src/main/java/com/comandante/creeper/player/NpcAggroCountDown.java @@ -0,0 +1,38 @@ +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 7f123c381d2bed25bee058906fca48f7eeb1b7b7..2dcfb547e9241c3e6534f4412bd3a4ca42f36ad5 100644 --- a/src/main/java/com/comandante/creeper/player/Player.java +++ b/src/main/java/com/comandante/creeper/player/Player.java @@ -46,6 +46,9 @@ 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; public Player(String playerName, GameManager gameManager) { this.playerName = playerName; @@ -164,7 +167,6 @@ public class Player extends CreeperEntity { gameManager.writeToPlayerCurrentRoom(getPlayerId(), getPlayerName() + " is now dead." + "\r\n"); PlayerMovement playerMovement = new PlayerMovement(this, gameManager.getRoomManager().getPlayerCurrentRoom(this).get().getRoomId(), GameManager.LOBBY_ID, "vanished into the ether.", ""); movePlayer(playerMovement); - gameManager.currentRoomLogic(getPlayerId()); String prompt = gameManager.buildPrompt(playerId); gameManager.getChannelUtils().write(getPlayerId(), prompt, true); } @@ -197,6 +199,18 @@ public class Player extends CreeperEntity { return false; } + public Room getPreviousRoom() { + synchronized (interner.intern(playerId)) { + return previousRoom; + } + } + + public void setPreviousRoom(Room previousRoom) { + synchronized (interner.intern(playerId)) { + this.previousRoom = previousRoom; + } + } + private void addHealth(long addAmt, PlayerMetadata playerMetadata) { long currentHealth = playerMetadata.getStats().getCurrentHealth(); Stats statsModifier = getPlayerStatsWithEquipmentAndLevel(); @@ -337,6 +351,24 @@ public class Player extends CreeperEntity { return Lists.newArrayList(playerMetadata.getLearnedSpells()); } + public boolean isActiveAlertNpcStatus() { + synchronized (interner.intern(playerId)) { + return hasAlertedNpc; + } + } + + public void setIsActiveAlertNpcStatus() { + synchronized (interner.intern(playerId)) { + hasAlertedNpc = true; + } + } + + public void removeActiveAlertStatus() { + synchronized (interner.intern(playerId)) { + hasAlertedNpc = false; + } + } + public void addInventoryId(String inventoryId) { synchronized (interner.intern(playerId)) { PlayerMetadata playerMetadata = getPlayerMetadata(); @@ -517,6 +549,7 @@ public class Player extends CreeperEntity { gameManager.getChannelUtils().write(next.getPlayerId(), sb.toString(), true); } destinationRoom.addPresentPlayer(playerMovement.getPlayer().getPlayerId()); + setPreviousRoom(currentRoom); playerMovement.getPlayer().setCurrentRoom(destinationRoom); for (Player next : gameManager.getRoomManager().getPresentPlayers(destinationRoom)) { if (next.getPlayerId().equals(playerMovement.getPlayer().getPlayerId())) { @@ -526,7 +559,9 @@ 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()); - processNpcAggro(); + if (!isActive(CoolDownType.DEATH)) { + processNpcAggro(); + } } } @@ -540,8 +575,11 @@ public class Player extends CreeperEntity { .collect(Collectors.toList()); aggresiveRoomNpcs.forEach(npc -> { - gameManager.writeToPlayerCurrentRoom(getPlayerId(), getPlayerName() + " has angered a " + npc.getColorName() + "\r\n"); - addActiveFight(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(); }); } diff --git a/world/npcs/redeyedbear.json b/world/npcs/redeyedbear.json index e525cf35f46088eea0bc93bda17b6a251575a01d..18ad613dbfa99cf33e46d6193b57b5b21eb09885 100644 --- a/world/npcs/redeyedbear.json +++ b/world/npcs/redeyedbear.json @@ -19,7 +19,7 @@ "armorRating": 20, "currentHealth": 150, "currentMana": 105, - "experience": 22500, + "experience": 90000, "maxHealth": 150, "maxMana": 105, "meleSkill": 22,