From 864c4a9e5538d8d3a22b0899614c3876d41d975d Mon Sep 17 00:00:00 2001 From: Chris Kearney <chris@kearneymail.com> Date: Sun, 14 Aug 2016 19:43:12 -0700 Subject: [PATCH] back command and a better aggro thing --- .../comandante/creeper/ConfigureCommands.java | 1 + .../creeper/command/BackCommand.java | 32 +++++++++++++ .../creeper/command/MovementCommand.java | 4 ++ .../creeper/command/admin/BuildCommand.java | 2 +- .../creeper/player/CoolDownType.java | 3 +- .../creeper/player/NpcAggroCountDown.java | 38 +++++++++++++++ .../com/comandante/creeper/player/Player.java | 46 +++++++++++++++++-- world/npcs/redeyedbear.json | 2 +- 8 files changed, 121 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/comandante/creeper/command/BackCommand.java create mode 100644 src/main/java/com/comandante/creeper/player/NpcAggroCountDown.java diff --git a/src/main/java/com/comandante/creeper/ConfigureCommands.java b/src/main/java/com/comandante/creeper/ConfigureCommands.java index 6fb2fe3f..dc186d2f 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 00000000..e7fa4d66 --- /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 7750b369..ff8a125e 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 df593275..e7f43e3a 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 1e1d98d3..2993ef20 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 00000000..f507cad0 --- /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 7f123c38..2dcfb547 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 e525cf35..18ad613d 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, -- GitLab