diff --git a/src/main/java/com/comandante/creeper/MBeanRefresherService.java b/src/main/java/com/comandante/creeper/MBeanRefresherService.java new file mode 100644 index 0000000000000000000000000000000000000000..91b6a7c170789d383d156d6c2c5e9261b4b6db9e --- /dev/null +++ b/src/main/java/com/comandante/creeper/MBeanRefresherService.java @@ -0,0 +1,27 @@ +package com.comandante.creeper; + + +import com.comandante.creeper.managers.GameManager; +import com.google.common.util.concurrent.AbstractScheduledService; +import org.mapdb.DB; + +import java.util.concurrent.TimeUnit; + +public class MBeanRefresherService extends AbstractScheduledService { + + private final GameManager gameManager; + + public MBeanRefresherService(GameManager gameManager) { + this.gameManager = gameManager; + } + + @Override + protected void runOneIteration() throws Exception { + gameManager.getPlayerManagementManager().createAndRegisterAllPlayerManagementMBeans(); + } + + @Override + protected Scheduler scheduler() { + return Scheduler.newFixedRateSchedule(2, 2, TimeUnit.MINUTES); + } +} diff --git a/src/main/java/com/comandante/creeper/Main.java b/src/main/java/com/comandante/creeper/Main.java index fb7e1ef2b1c39a8ddeeb9d79971baf272566f2de..1704c5a22c3694764097ac5018b4a3dbcf6c7a78 100644 --- a/src/main/java/com/comandante/creeper/Main.java +++ b/src/main/java/com/comandante/creeper/Main.java @@ -99,9 +99,8 @@ public class Main { worldExporter.readWorldFromDisk(); startUpMessage("Creating and registering Player Management MBeans."); - PlayerManagementManager playerManagementManager = new PlayerManagementManager(gameManager); - playerManagementManager.processPlayersMarkedForDeletion(); - playerManagementManager.createAndRegisterAllPlayerManagementMBeans(); + gameManager.getPlayerManagementManager().processPlayersMarkedForDeletion(); + gameManager.getPlayerManagementManager().createAndRegisterAllPlayerManagementMBeans(); startUpMessage("Configuring commands"); ConfigureCommands.configure(gameManager); @@ -139,6 +138,10 @@ public class Main { startUpMessage("Starting irc server."); configureIrc(gameManager); } + + MBeanRefresherService mBeanRefresherService = new MBeanRefresherService(gameManager); + mBeanRefresherService.startAsync(); + startUpMessage("MBean Refresher Service started."); } public static void startUpMessage(String message) { diff --git a/src/main/java/com/comandante/creeper/command/LookCommand.java b/src/main/java/com/comandante/creeper/command/LookCommand.java index a3d053f0ff69745c99aef3e6f458d11b083960eb..e1906d972bb749763671d4074e8f24403cc76832 100644 --- a/src/main/java/com/comandante/creeper/command/LookCommand.java +++ b/src/main/java/com/comandante/creeper/command/LookCommand.java @@ -30,6 +30,10 @@ public class LookCommand extends Command { } originalMessageParts.remove(0); String target = Joiner.on(" ").join(originalMessageParts); + if (target.equalsIgnoreCase("self")) { + write(player.getLookString() + "\r\n"); + return; + } //Notables for (Map.Entry<String, String> notable : currentRoom.getNotables().entrySet()) { if (notable.getKey().equalsIgnoreCase(target)) { @@ -39,7 +43,7 @@ public class LookCommand extends Command { //Players Set<Player> presentPlayers = roomManager.getPresentPlayers(currentRoom); for (Player presentPlayer : presentPlayers) { - if (presentPlayer != null && presentPlayer.getPlayerName().equals(target)) { + if (presentPlayer != null && presentPlayer.getPlayerName().equalsIgnoreCase(target)) { write(presentPlayer.getLookString() + "\r\n"); if (!presentPlayer.getPlayerId().equals(playerId)) { channelUtils.write(presentPlayer.getPlayerId(), player.getPlayerName() + " looks at you.", true); @@ -50,7 +54,7 @@ public class LookCommand extends Command { for (String npcId : npcIds) { Npc currentNpc = gameManager.getEntityManager().getNpcEntity(npcId); if (currentNpc.getValidTriggers().contains(target)) { - write(gameManager.getLookString(currentNpc) + "\r\n"); + write(gameManager.getLookString(currentNpc, player) + "\r\n"); } } } finally { diff --git a/src/main/java/com/comandante/creeper/command/admin/SystemInfo.java b/src/main/java/com/comandante/creeper/command/SystemInfo.java old mode 100755 new mode 100644 similarity index 96% rename from src/main/java/com/comandante/creeper/command/admin/SystemInfo.java rename to src/main/java/com/comandante/creeper/command/SystemInfo.java index 19a45f77d72853987038e2179bf076415c70a47c..64e9fab8a16a65d71ab39999829dfbc6c0cc060e --- a/src/main/java/com/comandante/creeper/command/admin/SystemInfo.java +++ b/src/main/java/com/comandante/creeper/command/SystemInfo.java @@ -1,4 +1,4 @@ -package com.comandante.creeper.command.admin; +package com.comandante.creeper.command; import com.comandante.creeper.Main; import com.comandante.creeper.command.Command; @@ -21,10 +21,9 @@ public class SystemInfo extends Command { final static List<String> validTriggers = Arrays.asList("sysinfo", "systeminfo", "sys"); final static String description = "Display System information."; final static String correctUsage = "systeminfo"; - final static Set<PlayerRole> roles = Sets.newHashSet(PlayerRole.ADMIN); public SystemInfo(GameManager gameManager) { - super(gameManager, validTriggers, description, correctUsage, roles); + super(gameManager, validTriggers, description, correctUsage); } @Override diff --git a/src/main/java/com/comandante/creeper/command/admin/UsersCommand.java b/src/main/java/com/comandante/creeper/command/UsersCommand.java old mode 100755 new mode 100644 similarity index 95% rename from src/main/java/com/comandante/creeper/command/admin/UsersCommand.java rename to src/main/java/com/comandante/creeper/command/UsersCommand.java index 18e629efd66b2be39063fdf754aad74d98924e20..ad5371b3e74b08c1e1a8dfa4c601c20b1f91156e --- a/src/main/java/com/comandante/creeper/command/admin/UsersCommand.java +++ b/src/main/java/com/comandante/creeper/command/UsersCommand.java @@ -1,4 +1,4 @@ -package com.comandante.creeper.command.admin; +package com.comandante.creeper.command; import com.comandante.creeper.command.Command; import com.comandante.creeper.managers.GameManager; @@ -25,10 +25,9 @@ public class UsersCommand extends Command { final static List<String> validTriggers = Arrays.asList("users"); final static String description = "Display extended inforation about who is logged in."; final static String correctUsage = "users"; - final static Set<PlayerRole> roles = Sets.newHashSet(PlayerRole.ADMIN); public UsersCommand(GameManager gameManager) { - super(gameManager, validTriggers, description, correctUsage, roles); + super(gameManager, validTriggers, description, correctUsage); } @Override diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java index a3af98697c22b79b54d6cf912a498fbe3c008ca8..1e977b3f1bbcc91cdcc851ffc0d89a538c18c08d 100755 --- a/src/main/java/com/comandante/creeper/managers/GameManager.java +++ b/src/main/java/com/comandante/creeper/managers/GameManager.java @@ -67,6 +67,7 @@ public class GameManager { private final TimeTracker timeTracker; private final ItemUseHandler itemUseHandler; private final NpcMover npcMover; + private final PlayerManagementManager playerManagementManager; public GameManager(CreeperConfiguration creeperConfiguration, RoomManager roomManager, PlayerManager playerManager, EntityManager entityManager, MapsManager mapsManager, ChannelUtils channelUtils) { this.roomManager = roomManager; @@ -92,6 +93,11 @@ public class GameManager { this.entityManager.addEntity(itemDecayManager); this.itemUseHandler = new ItemUseHandler(this); this.npcMover = new NpcMover(this); + this.playerManagementManager = new PlayerManagementManager(this); + } + + public PlayerManagementManager getPlayerManagementManager() { + return playerManagementManager; } public NpcMover getNpcMover() { @@ -410,11 +416,15 @@ public class GameManager { } } - public String getLookString(Npc npc) { + public String getLookString(Npc npc, Player player) { StringBuilder sb = new StringBuilder(); // passing an empty createState because of the "difference calculation" sb.append(Color.MAGENTA + "-+=[ " + Color.RESET).append(npc.getColorName()).append(Color.MAGENTA + " ]=+- " + Color.RESET).append("\r\n"); - sb.append("Level: " + npc.getLevel()).append("\r\n"); + ExperienceManager.ExperienceType experienceType = ExperienceManager.getExperienceType(npc, player); + sb.append(experienceType.getColor()); + sb.append("Level: ").append(npc.getLevel()); + sb.append(Color.RESET); + sb.append("\r\n"); sb.append(Color.MAGENTA + "Stats--------------------------------" + Color.RESET).append("\r\n"); sb.append(buildLookString(npc.getColorName(), npc.getStats(), new StatsBuilder().createStats())).append("\r\n"); if (npc.getEffects() != null && npc.getEffects().size() > 0) { @@ -616,14 +626,15 @@ public class GameManager { PlayerMetadata playerMetadata = getPlayerManager().getPlayerMetadata(playerId); long amount = damageEntry.getValue(); double pct = (double) amount / totalDamageDone; + Player player = getPlayerManager().getPlayer(playerId); if (pct >= .90) { - damagePcts.put(playerId, npc.getPctOFExperience(1, Levels.getLevel(playerMetadata.getStats().getExperience()))); + damagePcts.put(playerId, npc.getPctOFExperience(1, player)); } else if (pct >= 0.25) { - damagePcts.put(playerId, npc.getPctOFExperience(.8, Levels.getLevel(playerMetadata.getStats().getExperience()))); + damagePcts.put(playerId, npc.getPctOFExperience(.8, player)); } else if (pct >= 0.10) { - damagePcts.put(playerId, npc.getPctOFExperience(.5, Levels.getLevel(playerMetadata.getStats().getExperience()))); + damagePcts.put(playerId, npc.getPctOFExperience(.5, player)); } else { - damagePcts.put(playerId, npc.getPctOFExperience(.25, Levels.getLevel(playerMetadata.getStats().getExperience()))); + damagePcts.put(playerId, npc.getPctOFExperience(.25, player)); } } return damagePcts; diff --git a/src/main/java/com/comandante/creeper/npc/Npc.java b/src/main/java/com/comandante/creeper/npc/Npc.java index 41913f252752995716819006361cfe246fe254bf..b6b57dd6c09bee959e5b0810e1fbde5f247de816 100644 --- a/src/main/java/com/comandante/creeper/npc/Npc.java +++ b/src/main/java/com/comandante/creeper/npc/Npc.java @@ -9,6 +9,7 @@ import com.comandante.creeper.managers.GameManager; import com.comandante.creeper.managers.SentryManager; import com.comandante.creeper.player.CoolDown; import com.comandante.creeper.player.CoolDownType; +import com.comandante.creeper.player.ExperienceManager; import com.comandante.creeper.player.Player; import com.comandante.creeper.server.Color; import com.comandante.creeper.spawner.SpawnRule; @@ -232,12 +233,12 @@ public class Npc extends CreeperEntity { return effects; } - public long getExperience() { - return getStats().getExperience(); + public long getExperience(Player player) { + return ExperienceManager.getXp(this, player); } - public double getPctOFExperience(double pct, long playerLevel) { - return getExperience() * pct; + public double getPctOFExperience(double pct, Player player) { + return getExperience(player) * pct; } public void addDamageToMap(String playerId, long amt) { diff --git a/src/main/java/com/comandante/creeper/player/ExperienceManager.java b/src/main/java/com/comandante/creeper/player/ExperienceManager.java index 5269af8068b29fa1789d88c808759dd45ce46bab..4c88a998cc24fe125ee666b80fbbd2b5bde81d45 100644 --- a/src/main/java/com/comandante/creeper/player/ExperienceManager.java +++ b/src/main/java/com/comandante/creeper/player/ExperienceManager.java @@ -1,26 +1,47 @@ package com.comandante.creeper.player; import com.comandante.creeper.npc.Npc; +import com.comandante.creeper.server.Color; public class ExperienceManager { // http://wowwiki.wikia.com/wiki/Formulas:Mob_XP - enum ExperienceType { - RED, - ORANGE, - YELLOW, - GREEN, - GRAY; + public enum ExperienceType { + RED(Color.RED), + CYAN(Color.CYAN), + YELLOW(Color.YELLOW), + GREEN(Color.GREEN), + GRAY(Color.WHITE); + + String color; + + ExperienceType(String color) { + this.color = color; + } + + public String getColor() { + return color; + } + } + + public static long getXp(Npc npc, Player player) { + if (player.getLevel() == npc.getLevel()) { + return getBaseXp(player.getLevel()); + } else if (player.getLevel() < npc.getLevel()) { + return getHigherLevelNpcXp(npc.getLevel(), player.getLevel()); + } else { + return getLowerLevelNpcXp(npc.getLevel(), player.getLevel()); + } } - private ExperienceType getExperienceType(Npc npc, Player player) { + public static ExperienceType getExperienceType(Npc npc, Player player) { long npcLevel = npc.getLevel(); long playerLevel = player.getLevel(); if (npcLevel >= (playerLevel + 5)) { return ExperienceType.RED; } else if ((npcLevel == (playerLevel + 3)) || npcLevel == (playerLevel + 4)) { - return ExperienceType.ORANGE; + return ExperienceType.CYAN; } else if ((npcLevel == (playerLevel + 2)) || (npcLevel == (playerLevel - 2))) { return ExperienceType.YELLOW; } else if ((npcLevel <= (playerLevel - 3)) && npcLevel > getGrayLevel(playerLevel)) { @@ -76,19 +97,26 @@ public class ExperienceManager { } else { return 18; } + } + public static long getBaseXp(long playerLevel) { + return (playerLevel * 5) + 235; } + public static long getHigherLevelNpcXp(long npcLevel, long playerLevel) { + return (long) (getBaseXp(playerLevel) * (1 + .05 * (npcLevel - playerLevel))); + } + + public static long getLowerLevelNpcXp(long npcLevel, long playerLevel) { + if (getGrayLevel(playerLevel) >= npcLevel) { + return 0; + } + return getBaseXp(playerLevel) * (1 - (playerLevel - npcLevel)/getZeroDifference(playerLevel)); + } public static void main(String[] args) { for (int i = 0; i < 70; i++) { System.out.println("Level: " + i + " Gray Level: " + getGrayLevel(i) + " zero-difference:" + getZeroDifference(i) ); } } - - //public long getBasicExperienceGained(Npc npc, Player player) { - // long level = player.getLevel(); - -// } - } diff --git a/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java b/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java index 3a5bc235c6c2b0f6f18f3349cfffaa18e2c1b4a0..2d7689282dbc2dc56c8c3f78366ac07e22b04cdb 100644 --- a/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java +++ b/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java @@ -24,7 +24,10 @@ public class PlayerManagementManager { String playerId = entry.getKey(); PlayerMetadata playerMetadata = entry.getValue(); PlayerManagement playerManagement = new PlayerManagement(gameManager, playerId); - mbs.registerMBean(playerManagement, new ObjectName("CreeperManagement:00=Players,name=" + playerMetadata.getPlayerName())); + ObjectName objectName = new ObjectName("CreeperManagement:00=Players,name=" + playerMetadata.getPlayerName()); + if (!mbs.isRegistered(objectName)) { + mbs.registerMBean(playerManagement, objectName); + } } } diff --git a/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java b/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java index efd8a6caf6ca29b2483a470f9ae7e0f5ce3151ab..56ef4df0cc6bcb5fb22aea53394965bc8fb0117e 100644 --- a/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java +++ b/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java @@ -15,37 +15,6 @@ public class CreeperAuthenticationHandler extends SimpleChannelUpstreamHandler { private final CreeperAuthenticator creeperAuthenticator; private static final Logger log = Logger.getLogger(CreeperAuthenticationHandler.class); - - - private static final String LOGO = " ,---__,------__---.\r\n" + - " ,'////<: = ]\\\\\\\\\\`.\r\n" + - " ///__---^~~\"\"\"~~^---__\\\\\\\r\n" + - " //,' D E T E C T I V E `.\\\\\r\n" + - " / \\ __---^~~~^---__ / \\\r\n" + - " /,. \\,' /.-----.\\ `./ ,.\\\r\n" + - " // `. MMM ,^. MMM ,' \\\\\r\n" + - "//.--. ~~^^---^~ ~^---^^~~ .--.\\\\\r\n" + - "/ '> \\ __--'^^~~~^^`--__ / <' \\\r\n" + - "\\ / _-^ o L I c ^-_ \\ /\r\n" + - " \\ ,' P __--^^^^^--__ E `. /\r\n" + - " \\ \\ ,-^ ^-. / /\r\n" + - " i \\,' ,^-__-^~/\\^-__-^. `./ i\r\n" + - " | /|#`|`.| ||**\\ */-\\ |\r\n" + - " ! '>#| `|`.||--/* \\*<' !\r\n" + - " / /|#|_|#_|||________\\ \\ - Creeper Rule Violators -\r\n" + - " / \\ * *||.| |#| |/ \\ - WILL BE PLACED IN MUD JAIL-\r\n" + - "i \\**\\ */-[]|`.|#| / i\r\n" + - "| \\-/* \\/~~\\`|`.|/ |\r\n" + - "| /`. `. ./_[]_\\.`,' ,'\\ |\r\n" + - "! / `-. ^|______|^ ,-' \\ !\r\n" + - " \\ `. ~~^--_____--^~~ ,' /\r\n" + - " \\ `-_ CREEPER _-' /\r\n" + - " `. ^~--._________.--~^ ,'\r\n" + - " ^-_ _-^\r\n" + - " ^~--__ 4 2 0 __--~^\r\n" + - " `. ,'\r\n" + - " `-'\r\n"; - public CreeperAuthenticationHandler(GameManager gameManager) { this.gameManager = gameManager; this.creeperAuthenticator = new GameAuth(gameManager); @@ -64,7 +33,6 @@ public class CreeperAuthenticationHandler extends SimpleChannelUpstreamHandler { public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { StringBuilder stringBuilder = new StringBuilder(); stringBuilder - .append(LOGO) .append(RESET + "\r\n") .append("First time here? Type \"tupac\".\r\n") .append("username: ");