diff --git a/src/main/java/com/comandante/creeper/ConfigureCommands.java b/src/main/java/com/comandante/creeper/ConfigureCommands.java index e2d958230dddba233a33d44df9cf44bfd2d4e0ff..648ca6e9448f89b3a794c6e3249d3f528595538f 100755 --- a/src/main/java/com/comandante/creeper/ConfigureCommands.java +++ b/src/main/java/com/comandante/creeper/ConfigureCommands.java @@ -85,5 +85,7 @@ public class ConfigureCommands { creeperCommandRegistry.addCommand(new ShowCommand(gameManager)); creeperCommandRegistry.addCommand(new CoolDownCommand(gameManager)); creeperCommandRegistry.addCommand(new SystemInfo(gameManager)); + creeperCommandRegistry.addCommand(new SetCommand(gameManager)); + creeperCommandRegistry.addCommand(new DelCommand(gameManager)); } } diff --git a/src/main/java/com/comandante/creeper/command/DelCommand.java b/src/main/java/com/comandante/creeper/command/DelCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..6842ac7d2e0d11618cceaf5c112d8c688661d581 --- /dev/null +++ b/src/main/java/com/comandante/creeper/command/DelCommand.java @@ -0,0 +1,57 @@ +package com.comandante.creeper.command; + + +import com.comandante.creeper.managers.GameManager; +import com.comandante.creeper.player.PlayerSettings; +import com.google.api.client.util.Lists; +import com.google.common.base.Joiner; +import org.jboss.netty.channel.ChannelHandlerContext; +import org.jboss.netty.channel.MessageEvent; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class DelCommand extends Command { + final static List<String> validTriggers = Arrays.asList("del"); + final static String description = "Delete a user preference"; + final static String correctUsage = "del || del auto_map"; + + public DelCommand(GameManager gameManager) { + super(gameManager, validTriggers, description, correctUsage); + } + + @Override + public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { + configure(e); + try { + if (originalMessageParts.size() <= 1) { + write(returnAllSettings()); + return; + } + originalMessageParts.remove(0); + String desiredSettingName = originalMessageParts.get(0); + player.removePlayerSetting(desiredSettingName); + write("Setting removed.\r\n"); + } finally { + super.messageReceived(ctx, e); + } + } + + private String returnAllSettings() { + Map<String, String> playerSettings = player.getPlayerSettings(); + List<String> settings = Lists.newArrayList(); + for (Map.Entry<String, String> next : playerSettings.entrySet()) { + String key = next.getKey(); + String value = next.getValue(); + settings.add(key + " : " + value); + } + Collections.sort(settings); + StringBuilder sb = new StringBuilder(); + for (String s: settings) { + sb.append(s).append("\r\n"); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/comandante/creeper/command/SetCommand.java b/src/main/java/com/comandante/creeper/command/SetCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..21a3ef52089f02863f8f25b08b7de499337627fe --- /dev/null +++ b/src/main/java/com/comandante/creeper/command/SetCommand.java @@ -0,0 +1,79 @@ +package com.comandante.creeper.command; + +import com.comandante.creeper.Items.Item; +import com.comandante.creeper.managers.GameManager; +import com.comandante.creeper.player.PlayerSettings; +import com.google.api.client.util.Lists; +import com.google.common.base.Joiner; +import org.jboss.netty.channel.ChannelHandlerContext; +import org.jboss.netty.channel.MessageEvent; + +import java.util.*; + + +public class SetCommand extends Command { + final static List<String> validTriggers = Arrays.asList("set"); + final static String description = "Set a user preference"; + final static String correctUsage = "set || set auto_map 5"; + + public SetCommand(GameManager gameManager) { + super(gameManager, validTriggers, description, correctUsage); + } + + @Override + public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { + configure(e); + try { + write("'set help' for full settings help.\r\n"); + if (originalMessageParts.size() <= 1) { + write(returnAllSettings()); + return; + } + if (originalMessageParts.size() > 1 && originalMessageParts.get(1).equalsIgnoreCase("help")) { + write(returnAllSettingsHelp()); + return; + } + originalMessageParts.remove(0); + String desiredSettingName = originalMessageParts.get(0); + originalMessageParts.remove(0); + String desiredSettingValue = Joiner.on(" ").join(originalMessageParts); + boolean b = player.setPlayerSetting(desiredSettingName, desiredSettingValue); + if (b) { + write("Setting successfully set.\r\n"); + } else { + write ("Unknown Setting.\r\n"); + } + } finally { + super.messageReceived(ctx, e); + } + } + + private String returnAllSettings() { + Map<String, String> playerSettings = player.getPlayerSettings(); + List<String> settings = Lists.newArrayList(); + for (Map.Entry<String, String> next : playerSettings.entrySet()) { + String key = next.getKey(); + String value = next.getValue(); + settings.add(key + " : " + value); + } + Collections.sort(settings); + StringBuilder sb = new StringBuilder(); + for (String s: settings) { + sb.append(s).append("\r\n"); + } + return sb.toString(); + } + + private String returnAllSettingsHelp() { + List<String> settings = Lists.newArrayList(); + for (PlayerSettings playerSettings : PlayerSettings.values()) { + settings.add(playerSettings.getSettingName() + " - " + playerSettings.getSettingDescription()); + } + Collections.sort(settings); + StringBuilder sb = new StringBuilder(); + for (String s: settings) { + sb.append(s).append("\r\n"); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java index 4c7f302136b0f27c3a6ef0280653f92a77fbde95..215f741d70c0e6410a7e49ef65a1f532551798ae 100755 --- a/src/main/java/com/comandante/creeper/managers/GameManager.java +++ b/src/main/java/com/comandante/creeper/managers/GameManager.java @@ -312,10 +312,11 @@ public class GameManager { sb.append(playerCurrentRoom.getRoomTitle()); sb.append(RESET); sb.append("\r\n\r\n"); - //java.lang.String wrap(java.lang.String str, int wrapLength, java.lang.String newLineStr, boolean wrapLongWords) sb.append(WordUtils.wrap(playerCurrentRoom.getRoomDescription(), 80, "\r\n", true)).append("\r\n").append("\r\n"); - if (playerCurrentRoom.getMapData().isPresent()) { - sb.append(mapsManager.drawMap(playerCurrentRoom.getRoomId(), new Coords(5, 5))).append("\r\n"); + String auto_map = player.getPlayerSetting("auto_map"); + if (playerCurrentRoom.getMapData().isPresent() && auto_map != null) { + int i = Integer.parseInt(auto_map); + sb.append(mapsManager.drawMap(playerCurrentRoom.getRoomId(), new Coords(i, i))).append("\r\n"); } sb.append(getExits(playerCurrentRoom, player)).append("\r\n"); diff --git a/src/main/java/com/comandante/creeper/merchant/NigelBartender.java b/src/main/java/com/comandante/creeper/merchant/NigelBartender.java index 4347ee169b845a8001f0b1a28b3f792bfc6cecb9..5392754067936e22e158919011d6b647934c1785 100644 --- a/src/main/java/com/comandante/creeper/merchant/NigelBartender.java +++ b/src/main/java/com/comandante/creeper/merchant/NigelBartender.java @@ -14,7 +14,7 @@ import static com.comandante.creeper.server.Color.BOLD_ON; public class NigelBartender extends Merchant { private final static long phraseIntervalMs = 300000; private final static String NAME = "nigel the bartender"; - private final static String welcomeMessage = " N I G E L 'S B A R "; + private final static String welcomeMessage = "\r\n N I G E L 'S B A R \r\n"; private final static Set<String> validTriggers = new HashSet<String>(Arrays.asList(new String[] {"nigel", "bartender", "barkeep", "Nigel", "NIGEL", NAME} )); diff --git a/src/main/java/com/comandante/creeper/player/Player.java b/src/main/java/com/comandante/creeper/player/Player.java index 608bfb17953d6b123421ed5cec3006f0ae095008..38b6960cef30f133228fdec4db0703ec53f211ea 100755 --- a/src/main/java/com/comandante/creeper/player/Player.java +++ b/src/main/java/com/comandante/creeper/player/Player.java @@ -797,6 +797,32 @@ public class Player extends CreeperEntity { } } + public boolean setPlayerSetting(String key, String value) { + boolean success; + synchronized (interner.intern(playerId)) { + PlayerMetadata playerMetadata = getPlayerMetadata(); + success = playerMetadata.setSetting(key, value); + savePlayerMetadata(playerMetadata); + } + return success; + } + + public String getPlayerSetting(String key) { + return getPlayerMetadata().getSetting(key); + } + + public void removePlayerSetting(String key) { + synchronized (interner.intern(playerId)) { + PlayerMetadata playerMetadata = getPlayerMetadata(); + playerMetadata.deleteSetting(key); + savePlayerMetadata(playerMetadata); + } + } + + public Map<String, String> getPlayerSettings() { + return getPlayerMetadata().getPlayerSettings(); + } + public void removeActiveFight(Npc npc) { synchronized (interner.intern(playerId)) { Iterator<Map.Entry<Long, ActiveFight>> iterator = activeFights.entrySet().iterator(); diff --git a/src/main/java/com/comandante/creeper/player/PlayerMetadata.java b/src/main/java/com/comandante/creeper/player/PlayerMetadata.java index 44279f751ac671000d6f2afad54f5a1e8e3cc083..f929c8c023d92f339ae31e176772f4e574e0dca6 100644 --- a/src/main/java/com/comandante/creeper/player/PlayerMetadata.java +++ b/src/main/java/com/comandante/creeper/player/PlayerMetadata.java @@ -3,13 +3,11 @@ package com.comandante.creeper.player; import com.comandante.creeper.stat.Stats; import com.google.api.client.util.Lists; +import com.google.api.client.util.Maps; import com.google.common.collect.Sets; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; +import java.util.*; public class PlayerMetadata implements Serializable { @@ -25,6 +23,7 @@ public class PlayerMetadata implements Serializable { private String[] playerEquipment; private List<String> effects; private boolean isMarkedForDelete; + private Map<String, String> playerSettings; public PlayerMetadata(String playerName, String password, String playerId, Stats stats, int gold, Set<PlayerRole> playerRoleSet, String[] playerEquipment, int goldInBank) { this.playerName = playerName; @@ -59,6 +58,9 @@ public class PlayerMetadata implements Serializable { if (playerMetadata.effects != null) { this.effects = Lists.newArrayList(playerMetadata.getEffects()); } + if (playerMetadata.playerSettings != null) { + this.playerSettings = new HashMap<String, String>(playerMetadata.getPlayerSettings()); + } this.isMarkedForDelete = new Boolean(playerMetadata.isMarkedForDelete); } @@ -218,4 +220,38 @@ public class PlayerMetadata implements Serializable { protected void resetEffects(){ this.effects = Lists.newArrayList(); } + + public boolean setSetting(String key, String value) { + if (playerSettings.size() >= 100) { + return false; + } + if (playerSettings == null) { + this.playerSettings = Maps.newHashMap(); + } + PlayerSettings byKey = PlayerSettings.getByKey(key); + if (byKey == null) { + return false; + } + if (byKey.getType().equals(Integer.TYPE)) { + try { + int i = Integer.parseInt(value); + } catch (NumberFormatException e) { + return false; + } + } + playerSettings.put(key, value); + return true; + } + + public String getSetting(String key) { + return playerSettings.get(key); + } + + public Map<String, String> getPlayerSettings() { + return playerSettings; + } + + public void deleteSetting(String key) { + playerSettings.remove(key); + } } diff --git a/src/main/java/com/comandante/creeper/player/PlayerSettings.java b/src/main/java/com/comandante/creeper/player/PlayerSettings.java new file mode 100644 index 0000000000000000000000000000000000000000..a99e44ecaf04b7f778c8e5c691658ce81d90371d --- /dev/null +++ b/src/main/java/com/comandante/creeper/player/PlayerSettings.java @@ -0,0 +1,39 @@ +package com.comandante.creeper.player; + +import java.lang.reflect.Type; + +public enum PlayerSettings { + AUTO_MAP("auto_map", "Automatically draws the creeper map on the CurrentRoomLogic function.", Integer.TYPE); + + private final String settingName; + private final String settingDescription; + private final Type type; + + PlayerSettings(String settingName, String settingDescription, Type type) { + this.settingName = settingName; + this.settingDescription = settingDescription; + this.type = type; + } + + public static PlayerSettings getByKey(String key) { + PlayerSettings[] values = values(); + for (PlayerSettings playerSettings: values) { + if (playerSettings.settingName.equals(key)) { + return playerSettings; + } + } + return null; + } + + public String getSettingName() { + return settingName; + } + + public String getSettingDescription() { + return settingDescription; + } + + public Type getType() { + return type; + } +}