From 095f48bd1afb73f24417818516a2bc53b0721d90 Mon Sep 17 00:00:00 2001 From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com> Date: Sat, 2 Sep 2017 22:08:25 -0400 Subject: [PATCH] fix: cooldowns are now being properly removed --- .../java/com/syncleus/aethermud/Main.java | 9 +- .../command/commands/DropCommand.java | 4 +- .../command/commands/EquipCommand.java | 6 +- .../command/commands/InventoryCommand.java | 4 +- .../command/commands/LootCommand.java | 10 +- .../command/commands/PickUpCommand.java | 4 +- .../command/commands/ShowCommand.java | 4 +- .../command/commands/UnequipCommand.java | 6 +- .../command/commands/UseCommand.java | 4 +- .../syncleus/aethermud/core/GameManager.java | 16 +- .../aethermud/entity/EntityManager.java | 10 +- .../aethermud/items/ForageManager.java | 3 +- .../com/syncleus/aethermud/items/Item.java | 248 +++++---------- .../syncleus/aethermud/items/ItemBuilder.java | 4 +- .../aethermud/items/ItemDecayManager.java | 6 +- .../syncleus/aethermud/items/ItemPojo.java | 287 ++++++++++++++++++ .../aethermud/items/ItemUseAction.java | 4 +- .../aethermud/items/ItemUseHandler.java | 4 +- .../syncleus/aethermud/items/LootManager.java | 6 +- .../items/use/DefaultApplyEffectsStats.java | 5 +- .../items/use/DirtyBombUseAction.java | 4 +- .../use/LightningSpellBookUseAction.java | 6 +- .../items/use/ResetAllEffectsUseAction.java | 4 +- .../items/use/StickOfJusticeUseAction.java | 6 +- .../merchant/MerchantCommandHandler.java | 14 +- .../aethermud/merchant/MerchantManager.java | 4 +- .../merchant/lockers/GetCommand.java | 6 +- .../merchant/lockers/PutCommand.java | 4 +- .../com/syncleus/aethermud/npc/NpcSpawn.java | 13 +- .../com/syncleus/aethermud/player/Player.java | 67 ++-- .../aethermud/player/PlayerManagement.java | 12 +- .../aethermud/spawner/ItemSpawner.java | 12 +- .../aethermud/storage/AetherMudStorage.java | 13 +- .../aethermud/storage/ItemSerializer.java | 12 +- .../graphdb/GraphDbAetherMudStorage.java | 80 ++--- .../aethermud/storage/graphdb/ItemData.java | 186 ++++++++++++ .../aethermud/storage/graphdb/PlayerData.java | 7 +- .../syncleus/aethermud/world/model/Room.java | 6 +- .../aethermud/player/PlayerManagerTest.java | 3 +- .../CombatSimulationDetails.java | 8 +- .../combatsimuation/NpcTestHarness.java | 17 +- 41 files changed, 727 insertions(+), 401 deletions(-) create mode 100644 src/main/java/com/syncleus/aethermud/items/ItemPojo.java create mode 100644 src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java diff --git a/src/main/java/com/syncleus/aethermud/Main.java b/src/main/java/com/syncleus/aethermud/Main.java index 0725957f..0cf2f7ac 100644 --- a/src/main/java/com/syncleus/aethermud/Main.java +++ b/src/main/java/com/syncleus/aethermud/Main.java @@ -61,7 +61,7 @@ public class Main { final public static Set<Character> vowels = new HashSet<Character>(Arrays.asList('a', 'e', 'i', 'o', 'u')); public static final String DEFAULT_GRAPH_DB_FILE = "aethermud-graph.json"; - public static final Set<Class<?>> FRAMED_TYPES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(new Class<?>[]{PlayerData.class, NpcData.class, StatsData.class}))); + public static final Set<Class<?>> FRAMED_TYPES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(new Class<?>[]{PlayerData.class, NpcData.class, StatsData.class, ItemData.class}))); public static String getCreeperVersion() { @@ -93,11 +93,6 @@ public class Main { Files.isDirectory().apply(new File("world/")); - DB db = DBMaker.fileDB(new File("world/" + aetherMudConfiguration.databaseFileName)) - .transactionEnable() - .closeOnJvmShutdown() - .make(); - Graph graph = TinkerGraph.open(); File f = new File(DEFAULT_GRAPH_DB_FILE); if(f.exists() && !f.isDirectory()) { @@ -109,7 +104,7 @@ public class Main { } WrappedFramedGraph<Graph> framedGraph = new DelegatingFramedGraph(graph, FRAMED_TYPES); - GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(db, framedGraph); + GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(framedGraph); graphStorage.startAsync(); graphStorage.awaitRunning(); diff --git a/src/main/java/com/syncleus/aethermud/command/commands/DropCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/DropCommand.java index 1e382f17..0c039644 100644 --- a/src/main/java/com/syncleus/aethermud/command/commands/DropCommand.java +++ b/src/main/java/com/syncleus/aethermud/command/commands/DropCommand.java @@ -15,7 +15,7 @@ */ package com.syncleus.aethermud.command.commands; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.core.GameManager; import com.google.common.base.Joiner; import org.jboss.netty.channel.ChannelHandlerContext; @@ -43,7 +43,7 @@ public class DropCommand extends Command { } originalMessageParts.remove(0); String itemTarget = Joiner.on(" ").join(originalMessageParts); - for (Item item : player.getInventory()) { + for (ItemPojo item : player.getInventory()) { if (item.getItemTriggers().contains(itemTarget)) { item.setWithPlayer(false); gameManager.placeItemInRoom(currentRoom.getRoomId(), item.getItemId()); diff --git a/src/main/java/com/syncleus/aethermud/command/commands/EquipCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/EquipCommand.java index 19ed11e6..ea73fb37 100644 --- a/src/main/java/com/syncleus/aethermud/command/commands/EquipCommand.java +++ b/src/main/java/com/syncleus/aethermud/command/commands/EquipCommand.java @@ -15,7 +15,7 @@ */ package com.syncleus.aethermud.command.commands; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.core.GameManager; import com.google.common.base.Joiner; import org.jboss.netty.channel.ChannelHandlerContext; @@ -43,9 +43,9 @@ public class EquipCommand extends Command { } originalMessageParts.remove(0); String itemTarget = Joiner.on(" ").join(originalMessageParts); - List<Item> inventory = player.getInventory(); + List<ItemPojo> inventory = player.getInventory(); if (inventory != null) { - for (Item item : inventory) { + for (ItemPojo item : inventory) { if (item.getItemTriggers().contains(itemTarget)) { if (item.getEquipment() == null) { write("Item is not equipable."); diff --git a/src/main/java/com/syncleus/aethermud/command/commands/InventoryCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/InventoryCommand.java index 6cc9d39e..9e86eba5 100644 --- a/src/main/java/com/syncleus/aethermud/command/commands/InventoryCommand.java +++ b/src/main/java/com/syncleus/aethermud/command/commands/InventoryCommand.java @@ -16,7 +16,7 @@ package com.syncleus.aethermud.command.commands; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.core.GameManager; import org.apache.commons.lang.StringUtils; import org.jboss.netty.channel.ChannelHandlerContext; @@ -40,7 +40,7 @@ public class InventoryCommand extends Command { @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { this.execCommand(ctx, e, () -> { - List<Item> inventory = player.getInventory(); + List<ItemPojo> inventory = player.getInventory(); if (inventory == null) { write("You aren't carrying anything."); return; diff --git a/src/main/java/com/syncleus/aethermud/command/commands/LootCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/LootCommand.java index e33e6ece..84855b3f 100644 --- a/src/main/java/com/syncleus/aethermud/command/commands/LootCommand.java +++ b/src/main/java/com/syncleus/aethermud/command/commands/LootCommand.java @@ -16,7 +16,7 @@ package com.syncleus.aethermud.command.commands; import com.syncleus.aethermud.core.GameManager; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.items.Loot; import com.syncleus.aethermud.server.communication.Color; import org.jboss.netty.channel.ChannelHandlerContext; @@ -42,8 +42,8 @@ public class LootCommand extends Command { public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { execCommand(ctx, e, () -> { if (originalMessageParts.size() > 1) { - for (Item item : player.getInventory()) { - if (item.getInternalItemName().equals(Item.CORPSE_INTENAL_NAME)) { + for (ItemPojo item : player.getInventory()) { + if (item.getInternalItemName().equals(ItemPojo.CORPSE_INTENAL_NAME)) { Loot loot = item.getLoot(); if (loot != null) { int gold = lootManager.lootGoldAmountReturn(loot); @@ -51,8 +51,8 @@ public class LootCommand extends Command { write("You looted " + NumberFormat.getNumberInstance(Locale.US).format(gold) + Color.YELLOW + " gold" + Color.RESET + " from a " + item.getItemName() + ".\r\n"); player.incrementGold(gold); } - Set<Item> items = lootManager.lootItemsReturn(loot); - for (Item i: items) { + Set<ItemPojo> items = lootManager.lootItemsReturn(loot); + for (ItemPojo i: items) { gameManager.acquireItem(player, i.getItemId(), true); write("You looted " + i.getItemName() + " from a " + item.getItemName() + ".\r\n"); } diff --git a/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java index 0475bfd8..f70bb59e 100644 --- a/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java +++ b/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java @@ -15,7 +15,7 @@ */ package com.syncleus.aethermud.command.commands; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.core.GameManager; import com.google.common.base.Joiner; import org.jboss.netty.channel.ChannelHandlerContext; @@ -43,7 +43,7 @@ public class PickUpCommand extends Command { originalMessageParts.remove(0); String desiredPickUpItem = Joiner.on(" ").join(originalMessageParts); for (String next : itemIds) { - Optional<Item> itemEntityOptional = entityManager.getItemEntity(next); + Optional<ItemPojo> itemEntityOptional = entityManager.getItemEntity(next); if (!itemEntityOptional.isPresent()) { continue; } diff --git a/src/main/java/com/syncleus/aethermud/command/commands/ShowCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/ShowCommand.java index 4324607d..666d746f 100644 --- a/src/main/java/com/syncleus/aethermud/command/commands/ShowCommand.java +++ b/src/main/java/com/syncleus/aethermud/command/commands/ShowCommand.java @@ -15,7 +15,7 @@ */ package com.syncleus.aethermud.command.commands; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.core.GameManager; import com.google.common.base.Joiner; import org.jboss.netty.channel.ChannelHandlerContext; @@ -41,7 +41,7 @@ public class ShowCommand extends Command { } originalMessageParts.remove(0); String target = Joiner.on(" ").join(originalMessageParts); - for (Item next : player.getInventory()) { + for (ItemPojo next : player.getInventory()) { for (String s : next.getItemTriggers()) { if (s.equalsIgnoreCase(target)) { writeToRoom(player.getPlayerName() + " whips out " + next.getItemName() + ".\r\n"); diff --git a/src/main/java/com/syncleus/aethermud/command/commands/UnequipCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/UnequipCommand.java index 56dbe5df..042bea43 100644 --- a/src/main/java/com/syncleus/aethermud/command/commands/UnequipCommand.java +++ b/src/main/java/com/syncleus/aethermud/command/commands/UnequipCommand.java @@ -16,7 +16,7 @@ package com.syncleus.aethermud.command.commands; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.core.GameManager; import com.google.common.base.Joiner; import org.jboss.netty.channel.ChannelHandlerContext; @@ -44,8 +44,8 @@ public class UnequipCommand extends Command { } originalMessageParts.remove(0); String itemTarget = Joiner.on(" ").join(originalMessageParts); - Set<Item> equipment = player.getEquipment(); - for (Item item : equipment) { + Set<ItemPojo> equipment = player.getEquipment(); + for (ItemPojo item : equipment) { if (item.getItemTriggers().contains(itemTarget)) { player.unEquip(item); return; diff --git a/src/main/java/com/syncleus/aethermud/command/commands/UseCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/UseCommand.java index 882d53d7..06361512 100644 --- a/src/main/java/com/syncleus/aethermud/command/commands/UseCommand.java +++ b/src/main/java/com/syncleus/aethermud/command/commands/UseCommand.java @@ -17,7 +17,7 @@ package com.syncleus.aethermud.command.commands; import com.syncleus.aethermud.core.GameManager; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.google.common.base.Joiner; import com.google.common.base.Strings; import org.apache.commons.lang.StringUtils; @@ -49,7 +49,7 @@ public class UseCommand extends Command { return; } - Optional<Item> inventoryItemOptional = player.getInventoryItem(useItemOn.getItem()); + Optional<ItemPojo> inventoryItemOptional = player.getInventoryItem(useItemOn.getItem()); if (!inventoryItemOptional.isPresent()) { write("Useable item is not found in your inventory.\r\n"); return; diff --git a/src/main/java/com/syncleus/aethermud/core/GameManager.java b/src/main/java/com/syncleus/aethermud/core/GameManager.java index 894fcc4c..6b7188fe 100644 --- a/src/main/java/com/syncleus/aethermud/core/GameManager.java +++ b/src/main/java/com/syncleus/aethermud/core/GameManager.java @@ -351,12 +351,12 @@ public class GameManager { } for (String itemId : playerCurrentRoom.getItemIds()) { - Optional<Item> itemOptional = entityManager.getItemEntity(itemId); + Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId); if (!itemOptional.isPresent()) { playerCurrentRoom.removePresentItem(itemId); continue; } - Item item = itemOptional.get(); + ItemPojo item = itemOptional.get(); sb.append(" ").append(item.getRestingName()).append("\r\n"); } @@ -473,11 +473,11 @@ public class GameManager { } public void placeItemInRoom(Integer roomId, String itemId) { - Optional<Item> itemOptional = entityManager.getItemEntity(itemId); + Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId); if (!itemOptional.isPresent()) { return; } - Item item = itemOptional.get(); + ItemPojo item = itemOptional.get(); roomManager.getRoom(roomId).addPresentItem(item.getItemId()); } @@ -502,21 +502,21 @@ public class GameManager { synchronized (interner.intern(itemId)) { Stats playerStatsWithEquipmentAndLevel = player.getPlayerStatsWithEquipmentAndLevel(); if (player.getInventory().size() < playerStatsWithEquipmentAndLevel.getInventorySize()) { - Optional<Item> itemOptional = entityManager.getItemEntity(itemId); + Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId); if (!itemOptional.isPresent()) { return false; } - Item itemEntity = itemOptional.get(); + ItemPojo itemEntity = itemOptional.get(); itemEntity.setWithPlayer(true); player.addInventoryId(itemId); entityManager.saveItem(itemEntity); return true; } else { - Optional<Item> itemOptional = entityManager.getItemEntity(itemId); + Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId); if (!itemOptional.isPresent()) { return false; } - Item itemEntity = itemOptional.get(); + ItemPojo itemEntity = itemOptional.get(); channelUtils.write(player.getPlayerId(), "Your inventory is full, drop some items to free up room.\r\n"); if (isFromLoot) { player.getCurrentRoom().addPresentItem(itemId); diff --git a/src/main/java/com/syncleus/aethermud/entity/EntityManager.java b/src/main/java/com/syncleus/aethermud/entity/EntityManager.java index 870ad518..ce252743 100644 --- a/src/main/java/com/syncleus/aethermud/entity/EntityManager.java +++ b/src/main/java/com/syncleus/aethermud/entity/EntityManager.java @@ -18,11 +18,13 @@ package com.syncleus.aethermud.entity; import com.syncleus.aethermud.Main; import com.syncleus.aethermud.core.SentryManager; import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.items.ItemBuilder; import com.syncleus.aethermud.npc.NpcSpawn; import com.syncleus.aethermud.player.Player; import com.syncleus.aethermud.player.PlayerManager; import com.syncleus.aethermud.storage.AetherMudStorage; +import com.syncleus.aethermud.storage.graphdb.ItemData; import com.syncleus.aethermud.world.RoomManager; import com.syncleus.aethermud.world.model.Room; import org.apache.log4j.Logger; @@ -78,11 +80,11 @@ public class EntityManager { } } - public void saveItem(Item item) { + public void saveItem(ItemPojo item) { aetherMudStorage.saveItemEntity(item); } - public void removeItem(Item item) { + public void removeItem(ItemPojo item) { aetherMudStorage.removeItem(item.getItemId()); } @@ -90,8 +92,8 @@ public class EntityManager { aetherMudStorage.removeItem(itemId); } - public Optional<Item> getItemEntity(String itemId) { - Optional<Item> item = aetherMudStorage.getItemEntity(itemId); + public Optional<ItemPojo> getItemEntity(String itemId) { + Optional<ItemData> item = aetherMudStorage.getItemEntity(itemId); return item.map(itemName -> new ItemBuilder().from(itemName).create()); } diff --git a/src/main/java/com/syncleus/aethermud/items/ForageManager.java b/src/main/java/com/syncleus/aethermud/items/ForageManager.java index 1d6a30b7..74d8e74e 100644 --- a/src/main/java/com/syncleus/aethermud/items/ForageManager.java +++ b/src/main/java/com/syncleus/aethermud/items/ForageManager.java @@ -16,7 +16,6 @@ package com.syncleus.aethermud.items; import com.syncleus.aethermud.core.GameManager; -import com.syncleus.aethermud.player.CoolDownPojo; import com.syncleus.aethermud.player.CoolDownType; import com.syncleus.aethermud.player.Player; import com.syncleus.aethermud.server.communication.Color; @@ -93,7 +92,7 @@ public class ForageManager { totalForageXp += forage.getForageExperience(); for (long i = 0; i < numberToHarvest; i++) { countOfForagesFound++; - Item item = new ItemBuilder().from(itemMetadata).create(); + ItemPojo item = new ItemBuilder().from(itemMetadata).create(); gameManager.getEntityManager().saveItem(item); gameManager.acquireItem(player, item.getItemId()); } diff --git a/src/main/java/com/syncleus/aethermud/items/Item.java b/src/main/java/com/syncleus/aethermud/items/Item.java index bc109e20..6e3e73ea 100644 --- a/src/main/java/com/syncleus/aethermud/items/Item.java +++ b/src/main/java/com/syncleus/aethermud/items/Item.java @@ -15,180 +15,86 @@ */ package com.syncleus.aethermud.items; - import com.syncleus.aethermud.core.service.TimeTracker; import com.syncleus.aethermud.stats.Stats; -import com.syncleus.aethermud.storage.graphdb.StatsData; -import com.google.common.collect.Lists; -import java.io.Serializable; import java.util.List; import java.util.Set; -import java.util.UUID; - -public class Item implements Serializable { - - private final String itemName; - private final String itemDescription; - private final String internalItemName; - private final List<String> itemTriggers; - private final String restingName; - private final String itemId; - private int numberOfUses; - private boolean isWithPlayer; - private final Loot loot; - private final int itemHalfLifeTicks; - private Equipment equipment; - private final Rarity rarity; - private final int valueInGold; - private Set<Effect> effects; - private boolean hasBeenWithPlayer; - private final int maxUses; - private final boolean isDisposable; - private Set<TimeTracker.TimeOfDay> validTimeOfDays; - private final Stats itemApplyStats; - - public static final String CORPSE_INTENAL_NAME = "corpse"; - - protected Item(String itemName, String itemDescription, String internalItemName, List<String> itemTriggers, String restingName, String itemId, int numberOfUses, boolean isWithPlayer, Loot loot, int itemHalfLifeTicks, Equipment equipment, Rarity rarity, int valueInGold, Set<Effect> effects, boolean hasBeenWithPlayer, int maxUses, boolean isDisposable, Set<TimeTracker.TimeOfDay> validTimeOfDays, Stats itemApplyStats) { - this.itemName = itemName; - this.itemDescription = itemDescription; - this.internalItemName = internalItemName; - this.itemTriggers = itemTriggers; - this.restingName = restingName; - this.itemId = itemId; - this.numberOfUses = numberOfUses; - this.isWithPlayer = isWithPlayer; - this.loot = loot; - this.itemHalfLifeTicks = itemHalfLifeTicks; - this.equipment = equipment; - this.rarity = rarity; - this.valueInGold = valueInGold; - this.effects = effects; - this.hasBeenWithPlayer = hasBeenWithPlayer; - this.maxUses = maxUses; - this.isDisposable = isDisposable; - this.validTimeOfDays = validTimeOfDays; - this.itemApplyStats = itemApplyStats; - } - - public Stats getItemApplyStats() { - return itemApplyStats; - } - - public Set<TimeTracker.TimeOfDay> getValidTimeOfDays() { - return validTimeOfDays; - } - - public boolean isDisposable() { - return isDisposable; - } - - public int getMaxUses() { - return maxUses; - } - - public boolean isWithPlayer() { - return isWithPlayer; - } - - public void setWithPlayer(boolean isWithPlayer) { - if (isWithPlayer) { - setHasBeenWithPlayer(); - } - this.isWithPlayer = isWithPlayer; - } - - public int getNumberOfUses() { - return numberOfUses; - } - - public void setNumberOfUses(int numberOfUses) { - this.numberOfUses = numberOfUses; - } - - public String getItemId() { - return itemId; - } - - - public String getInternalItemName() { - return internalItemName; - } - - public String getItemName() { - return itemName; - } - - public String getItemDescription() { - return itemDescription; - } - - public List<String> getItemTriggers() { - return itemTriggers; - } - - public String getRestingName() { - return restingName; - } - - public int getItemHalfLifeTicks() { - return itemHalfLifeTicks; - } - - public Loot getLoot() { - return loot; - } - - public void setEquipment(Equipment equipment) { - this.equipment = equipment; - } - - public Equipment getEquipment() { - return equipment; - } - - public Rarity getRarity() { - return rarity; - } - - public int getValueInGold() { - return valueInGold; - } - - public void setEffects(Set<Effect> effects) { - this.effects = effects; - } - - public Set<Effect> getEffects() { - return effects; - } - - public void setHasBeenWithPlayer() { - hasBeenWithPlayer = true; - } - - public boolean isHasBeenWithPlayer() { - return hasBeenWithPlayer; - } - - public static Item createCorpseItem(String name, Loot loot) { - - Item item = new ItemBuilder() - .internalItemName(Item.CORPSE_INTENAL_NAME) - .itemName(name + " corpse") - .itemDescription("a bloody corpse") - .itemTriggers(Lists.newArrayList("corpse", "c", name, name + " corpse")) - .itemId(UUID.randomUUID().toString()) - .itemHalfLifeTicks(120) - .rarity(Rarity.BASIC) - .valueInGold(5) - .isDisposable(false) - .restingName("a corpse lies on the ground.") - .loot(loot) - .create(); - - return item; - - } + +public interface Item { + Stats getItemApplyStats(); + + Set<TimeTracker.TimeOfDay> getValidTimeOfDays(); + + boolean isDisposable(); + + int getMaxUses(); + + boolean isWithPlayer(); + + void setWithPlayer(boolean isWithPlayer); + + int getNumberOfUses(); + + void setNumberOfUses(int numberOfUses); + + String getItemId(); + + String getInternalItemName(); + + String getItemName(); + + String getItemDescription(); + + List<String> getItemTriggers(); + + String getRestingName(); + + int getItemHalfLifeTicks(); + + Loot getLoot(); + + void setEquipment(Equipment equipment); + + void setHasBeenWithPlayer(boolean hasBeenWithPlayer); + + void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays); + + Equipment getEquipment(); + + Rarity getRarity(); + + int getValueInGold(); + + void setEffects(Set<Effect> effects); + + Set<Effect> getEffects(); + + void setItemName(String itemName); + + void setItemDescription(String itemDescription); + + void setInternalItemName(String internalItemName); + + void setItemTriggers(List<String> itemTriggers); + + void setRestingName(String restingName); + + void setItemId(String itemId); + + void setLoot(Loot loot); + + void setItemHalfLifeTicks(int itemHalfLifeTicks); + + void setRarity(Rarity rarity); + + void setValueInGold(int valueInGold); + + void setMaxUses(int maxUses); + + void setDisposable(boolean disposable); + + void setItemApplyStats(Stats itemApplyStats); + + boolean isHasBeenWithPlayer(); } diff --git a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java index ef1e3d4b..070c943c 100644 --- a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java +++ b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java @@ -189,8 +189,8 @@ public class ItemBuilder { return this; } - public Item create() { - return new Item(itemName, itemDescription, internalItemName, itemTriggers, restingName, itemId, numberOfUses, isWithPlayer, loot, itemHalfLifeTicks, equipment, rarity, valueInGold, effects, hasBeenWithPlayer, maxUses, isDisposable, validTimeOfDays, itemApplyStats); + public ItemPojo create() { + return new ItemPojo(itemName, itemDescription, internalItemName, itemTriggers, restingName, itemId, numberOfUses, isWithPlayer, loot, itemHalfLifeTicks, equipment, rarity, valueInGold, effects, hasBeenWithPlayer, maxUses, isDisposable, validTimeOfDays, itemApplyStats); } diff --git a/src/main/java/com/syncleus/aethermud/items/ItemDecayManager.java b/src/main/java/com/syncleus/aethermud/items/ItemDecayManager.java index e4a46875..afdc4468 100644 --- a/src/main/java/com/syncleus/aethermud/items/ItemDecayManager.java +++ b/src/main/java/com/syncleus/aethermud/items/ItemDecayManager.java @@ -38,7 +38,7 @@ public class ItemDecayManager extends AetherMudEntity { this.gameManager = gameManager; } - public void addItem(Item item) { + public void addItem(ItemPojo item) { item.setWithPlayer(false); itemDecayTracker.put(item.getItemId(), new DecayProgress(item.getItemHalfLifeTicks())); } @@ -58,12 +58,12 @@ public class ItemDecayManager extends AetherMudEntity { ConcurrentHashMap<String, DecayProgress> itemDecayTracker1 = getItemDecayTracker(); for (Map.Entry<String, DecayProgress> next : itemDecayTracker1.entrySet()) { DecayProgress decayProgress = next.getValue(); - Optional<Item> itemOptional = entityManager.getItemEntity(next.getKey()); + Optional<ItemPojo> itemOptional = entityManager.getItemEntity(next.getKey()); if (!itemOptional.isPresent()) { removeItemFromDecayManager(next.getKey()); continue; } - Item item = itemOptional.get(); + ItemPojo item = itemOptional.get(); if (item.isWithPlayer()) { removeItemFromDecayManager(item.getItemId()); continue; diff --git a/src/main/java/com/syncleus/aethermud/items/ItemPojo.java b/src/main/java/com/syncleus/aethermud/items/ItemPojo.java new file mode 100644 index 00000000..aa79826b --- /dev/null +++ b/src/main/java/com/syncleus/aethermud/items/ItemPojo.java @@ -0,0 +1,287 @@ +/** + * Copyright 2017 Syncleus, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.syncleus.aethermud.items; + + +import com.syncleus.aethermud.core.service.TimeTracker; +import com.syncleus.aethermud.stats.Stats; +import com.google.common.collect.Lists; + +import java.io.Serializable; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public class ItemPojo implements Serializable, Item { + + private String itemName; + private String itemDescription; + private String internalItemName; + private List<String> itemTriggers; + private String restingName; + private String itemId; + private int numberOfUses; + private boolean isWithPlayer; + private Loot loot; + private int itemHalfLifeTicks; + private Equipment equipment; + private Rarity rarity; + private int valueInGold; + private Set<Effect> effects; + private boolean hasBeenWithPlayer; + private int maxUses; + private boolean isDisposable; + private Set<TimeTracker.TimeOfDay> validTimeOfDays; + private Stats itemApplyStats; + + public static final String CORPSE_INTENAL_NAME = "corpse"; + + protected ItemPojo(String itemName, String itemDescription, String internalItemName, List<String> itemTriggers, String restingName, String itemId, int numberOfUses, boolean isWithPlayer, Loot loot, int itemHalfLifeTicks, Equipment equipment, Rarity rarity, int valueInGold, Set<Effect> effects, boolean hasBeenWithPlayer, int maxUses, boolean isDisposable, Set<TimeTracker.TimeOfDay> validTimeOfDays, Stats itemApplyStats) { + this.itemName = itemName; + this.itemDescription = itemDescription; + this.internalItemName = internalItemName; + this.itemTriggers = itemTriggers; + this.restingName = restingName; + this.itemId = itemId; + this.numberOfUses = numberOfUses; + this.isWithPlayer = isWithPlayer; + this.loot = loot; + this.itemHalfLifeTicks = itemHalfLifeTicks; + this.equipment = equipment; + this.rarity = rarity; + this.valueInGold = valueInGold; + this.effects = effects; + this.hasBeenWithPlayer = hasBeenWithPlayer; + this.maxUses = maxUses; + this.isDisposable = isDisposable; + this.validTimeOfDays = validTimeOfDays; + this.itemApplyStats = itemApplyStats; + } + + @Override + public Stats getItemApplyStats() { + return itemApplyStats; + } + + @Override + public Set<TimeTracker.TimeOfDay> getValidTimeOfDays() { + return validTimeOfDays; + } + + @Override + public boolean isDisposable() { + return isDisposable; + } + + @Override + public int getMaxUses() { + return maxUses; + } + + @Override + public boolean isWithPlayer() { + return isWithPlayer; + } + + @Override + public void setWithPlayer(boolean isWithPlayer) { + if (isWithPlayer) { + setHasBeenWithPlayer(true); + } + this.isWithPlayer = isWithPlayer; + } + + @Override + public int getNumberOfUses() { + return numberOfUses; + } + + @Override + public void setNumberOfUses(int numberOfUses) { + this.numberOfUses = numberOfUses; + } + + @Override + public String getItemId() { + return itemId; + } + + + @Override + public String getInternalItemName() { + return internalItemName; + } + + @Override + public String getItemName() { + return itemName; + } + + @Override + public String getItemDescription() { + return itemDescription; + } + + @Override + public List<String> getItemTriggers() { + return itemTriggers; + } + + @Override + public String getRestingName() { + return restingName; + } + + @Override + public int getItemHalfLifeTicks() { + return itemHalfLifeTicks; + } + + @Override + public Loot getLoot() { + return loot; + } + + @Override + public void setEquipment(Equipment equipment) { + this.equipment = equipment; + } + + @Override + public void setHasBeenWithPlayer(boolean hasBeenWithPlayer) { + this.hasBeenWithPlayer = hasBeenWithPlayer; + } + + @Override + public void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays) { + this.validTimeOfDays = validTimeOfDays; + } + + @Override + public Equipment getEquipment() { + return equipment; + } + + @Override + public Rarity getRarity() { + return rarity; + } + + @Override + public int getValueInGold() { + return valueInGold; + } + + @Override + public void setEffects(Set<Effect> effects) { + this.effects = effects; + } + + @Override + public Set<Effect> getEffects() { + return effects; + } + + @Override + public void setItemName(String itemName) { + this.itemName = itemName; + } + + @Override + public void setItemDescription(String itemDescription) { + this.itemDescription = itemDescription; + } + + @Override + public void setInternalItemName(String internalItemName) { + this.internalItemName = internalItemName; + } + + @Override + public void setItemTriggers(List<String> itemTriggers) { + this.itemTriggers = itemTriggers; + } + + @Override + public void setRestingName(String restingName) { + this.restingName = restingName; + } + + @Override + public void setItemId(String itemId) { + this.itemId = itemId; + } + + @Override + public void setLoot(Loot loot) { + this.loot = loot; + } + + @Override + public void setItemHalfLifeTicks(int itemHalfLifeTicks) { + this.itemHalfLifeTicks = itemHalfLifeTicks; + } + + @Override + public void setRarity(Rarity rarity) { + this.rarity = rarity; + } + + @Override + public void setValueInGold(int valueInGold) { + this.valueInGold = valueInGold; + } + + @Override + public void setMaxUses(int maxUses) { + this.maxUses = maxUses; + } + + @Override + public void setDisposable(boolean disposable) { + isDisposable = disposable; + } + + @Override + public void setItemApplyStats(Stats itemApplyStats) { + this.itemApplyStats = itemApplyStats; + } + + @Override + public boolean isHasBeenWithPlayer() { + return hasBeenWithPlayer; + } + + public static ItemPojo createCorpseItem(String name, Loot loot) { + + ItemPojo item = new ItemBuilder() + .internalItemName(ItemPojo.CORPSE_INTENAL_NAME) + .itemName(name + " corpse") + .itemDescription("a bloody corpse") + .itemTriggers(Lists.newArrayList("corpse", "c", name, name + " corpse")) + .itemId(UUID.randomUUID().toString()) + .itemHalfLifeTicks(120) + .rarity(Rarity.BASIC) + .valueInGold(5) + .isDisposable(false) + .restingName("a corpse lies on the ground.") + .loot(loot) + .create(); + + return item; + + } +} diff --git a/src/main/java/com/syncleus/aethermud/items/ItemUseAction.java b/src/main/java/com/syncleus/aethermud/items/ItemUseAction.java index ec3ebe0e..0877b9d6 100644 --- a/src/main/java/com/syncleus/aethermud/items/ItemUseAction.java +++ b/src/main/java/com/syncleus/aethermud/items/ItemUseAction.java @@ -24,9 +24,9 @@ import java.util.Set; public interface ItemUseAction { String getInternalItemName(); - void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn); + void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn); - void postExecuteAction(GameManager gameManager, Player player, Item item); + void postExecuteAction(GameManager gameManager, Player player, ItemPojo item); Set<Effect> getEffects(); diff --git a/src/main/java/com/syncleus/aethermud/items/ItemUseHandler.java b/src/main/java/com/syncleus/aethermud/items/ItemUseHandler.java index de09eaa8..00d95a2f 100644 --- a/src/main/java/com/syncleus/aethermud/items/ItemUseHandler.java +++ b/src/main/java/com/syncleus/aethermud/items/ItemUseHandler.java @@ -35,7 +35,7 @@ public class ItemUseHandler { this.gameManager = gameManager; } - public void handle(Player player, Item item, UseCommand.UseItemOn useItemOn) { + public void handle(Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) { ItemUseAction itemUseAction = null; Optional<ItemMetadata> itemMetadataOptional = gameManager.getItemStorage().get(item.getInternalItemName()); if (!itemMetadataOptional.isPresent()) { @@ -61,7 +61,7 @@ public class ItemUseHandler { } } - public static void incrementUses(Item item) { + public static void incrementUses(ItemPojo item) { item.setNumberOfUses(item.getNumberOfUses() + 1); } } diff --git a/src/main/java/com/syncleus/aethermud/items/LootManager.java b/src/main/java/com/syncleus/aethermud/items/LootManager.java index ac9705af..d2420296 100644 --- a/src/main/java/com/syncleus/aethermud/items/LootManager.java +++ b/src/main/java/com/syncleus/aethermud/items/LootManager.java @@ -48,8 +48,8 @@ public class LootManager { return randInt(loot.getLootGoldMin(), loot.getLootGoldMax()); } - public Set<Item> lootItemsReturn(Loot loot) { - Set<Item> lootItems = Sets.newHashSet(); + public Set<ItemPojo> lootItemsReturn(Loot loot) { + Set<ItemPojo> lootItems = Sets.newHashSet(); for (String internalItemName: loot.getInternalItemNames()) { Optional<ItemMetadata> itemMetadataOptional = gameManager.getItemStorage().get(internalItemName); if (!itemMetadataOptional.isPresent()) { @@ -57,7 +57,7 @@ public class LootManager { } ItemMetadata itemMetadata = itemMetadataOptional.get(); if (lootDropSuccess(itemMetadata.getRarity().getPercentToLoot())) { - Item i = new ItemBuilder().from(itemMetadata).create(); + ItemPojo i = new ItemBuilder().from(itemMetadata).create(); gameManager.getEntityManager().saveItem(i); lootItems.add(i); } diff --git a/src/main/java/com/syncleus/aethermud/items/use/DefaultApplyEffectsStats.java b/src/main/java/com/syncleus/aethermud/items/use/DefaultApplyEffectsStats.java index b514f87c..5062ed72 100644 --- a/src/main/java/com/syncleus/aethermud/items/use/DefaultApplyEffectsStats.java +++ b/src/main/java/com/syncleus/aethermud/items/use/DefaultApplyEffectsStats.java @@ -20,7 +20,6 @@ import com.syncleus.aethermud.core.GameManager; import com.syncleus.aethermud.items.*; import com.syncleus.aethermud.player.Player; import com.syncleus.aethermud.stats.Stats; -import com.syncleus.aethermud.storage.graphdb.StatsData; import org.apache.log4j.Logger; import java.util.Set; @@ -44,7 +43,7 @@ public class DefaultApplyEffectsStats implements ItemUseAction { } @Override - public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) { + public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) { String playerName = player.getPlayerName(); gameManager.writeToPlayerCurrentRoom(player.getPlayerId(), playerName + " uses " + item.getItemName() + ".\r\n"); @@ -61,7 +60,7 @@ public class DefaultApplyEffectsStats implements ItemUseAction { } @Override - public void postExecuteAction(GameManager gameManager, Player player, Item item) { + public void postExecuteAction(GameManager gameManager, Player player, ItemPojo item) { ItemUseHandler.incrementUses(item); if (item.isDisposable()) { if (item.getNumberOfUses() < item.getMaxUses()) { diff --git a/src/main/java/com/syncleus/aethermud/items/use/DirtyBombUseAction.java b/src/main/java/com/syncleus/aethermud/items/use/DirtyBombUseAction.java index 9ce835a8..f70f2e0c 100644 --- a/src/main/java/com/syncleus/aethermud/items/use/DirtyBombUseAction.java +++ b/src/main/java/com/syncleus/aethermud/items/use/DirtyBombUseAction.java @@ -44,7 +44,7 @@ public class DirtyBombUseAction implements ItemUseAction { } @Override - public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) { + public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) { Room currentRoom = player.getCurrentRoom(); if (currentRoom.getRoomId().equals(1)) { gameManager.writeToPlayerCurrentRoom(player.getPlayerId(), player.getPlayerName() + " tried to detonate a " + item.getItemName() + "!"); @@ -74,7 +74,7 @@ public class DirtyBombUseAction implements ItemUseAction { } @Override - public void postExecuteAction(GameManager gameManager, Player player, Item item) { + public void postExecuteAction(GameManager gameManager, Player player, ItemPojo item) { ItemUseHandler.incrementUses(item); if (item.isDisposable()) { if (item.getNumberOfUses() < item.getMaxUses()) { diff --git a/src/main/java/com/syncleus/aethermud/items/use/LightningSpellBookUseAction.java b/src/main/java/com/syncleus/aethermud/items/use/LightningSpellBookUseAction.java index 614692c8..430a6f65 100644 --- a/src/main/java/com/syncleus/aethermud/items/use/LightningSpellBookUseAction.java +++ b/src/main/java/com/syncleus/aethermud/items/use/LightningSpellBookUseAction.java @@ -18,7 +18,7 @@ package com.syncleus.aethermud.items.use; import com.syncleus.aethermud.command.commands.UseCommand; import com.syncleus.aethermud.core.GameManager; import com.syncleus.aethermud.items.Effect; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.items.ItemMetadata; import com.syncleus.aethermud.items.ItemUseAction; import com.syncleus.aethermud.player.Player; @@ -42,7 +42,7 @@ public class LightningSpellBookUseAction implements ItemUseAction { } @Override - public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) { + public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) { if (player.getLearnedSpells().contains(LightningSpell.name)) { gameManager.getChannelUtils().write(player.getPlayerId(), "You already know how to use " + LightningSpell.name); dontDelete = true; @@ -53,7 +53,7 @@ public class LightningSpellBookUseAction implements ItemUseAction { } @Override - public void postExecuteAction(GameManager gameManager, Player player, Item item) { + public void postExecuteAction(GameManager gameManager, Player player, ItemPojo item) { if (!dontDelete) { player.removeInventoryId(item.getItemId()); gameManager.getEntityManager().removeItem(item); diff --git a/src/main/java/com/syncleus/aethermud/items/use/ResetAllEffectsUseAction.java b/src/main/java/com/syncleus/aethermud/items/use/ResetAllEffectsUseAction.java index e5fe47c0..3530b2db 100644 --- a/src/main/java/com/syncleus/aethermud/items/use/ResetAllEffectsUseAction.java +++ b/src/main/java/com/syncleus/aethermud/items/use/ResetAllEffectsUseAction.java @@ -36,13 +36,13 @@ public class ResetAllEffectsUseAction implements ItemUseAction { } @Override - public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) { + public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) { player.resetEffects(); gameManager.getChannelUtils().write(player.getPlayerId(), "All Effects are removed." + "\r\n"); } @Override - public void postExecuteAction(GameManager gameManager, Player player, Item item) { + public void postExecuteAction(GameManager gameManager, Player player, ItemPojo item) { ItemUseHandler.incrementUses(item); if (item.isDisposable()) { if (item.getNumberOfUses() < item.getMaxUses()) { diff --git a/src/main/java/com/syncleus/aethermud/items/use/StickOfJusticeUseAction.java b/src/main/java/com/syncleus/aethermud/items/use/StickOfJusticeUseAction.java index de9251ab..45efbe1b 100644 --- a/src/main/java/com/syncleus/aethermud/items/use/StickOfJusticeUseAction.java +++ b/src/main/java/com/syncleus/aethermud/items/use/StickOfJusticeUseAction.java @@ -18,7 +18,7 @@ package com.syncleus.aethermud.items.use; import com.syncleus.aethermud.command.commands.UseCommand; import com.syncleus.aethermud.core.GameManager; import com.syncleus.aethermud.items.Effect; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.items.ItemMetadata; import com.syncleus.aethermud.items.ItemUseAction; import com.syncleus.aethermud.player.Player; @@ -41,7 +41,7 @@ public class StickOfJusticeUseAction implements ItemUseAction { @Override - public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) { + public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) { if (!useItemOn.getTarget().isPresent()) { gameManager.getChannelUtils().write(player.getPlayerId(), "You must use the Stick Of Justice on someone who deserves it."); @@ -60,7 +60,7 @@ public class StickOfJusticeUseAction implements ItemUseAction { } @Override - public void postExecuteAction(GameManager gameManager, Player player, Item item) { + public void postExecuteAction(GameManager gameManager, Player player, ItemPojo item) { } @Override diff --git a/src/main/java/com/syncleus/aethermud/merchant/MerchantCommandHandler.java b/src/main/java/com/syncleus/aethermud/merchant/MerchantCommandHandler.java index f2bdf84c..47f6ae88 100644 --- a/src/main/java/com/syncleus/aethermud/merchant/MerchantCommandHandler.java +++ b/src/main/java/com/syncleus/aethermud/merchant/MerchantCommandHandler.java @@ -17,7 +17,7 @@ package com.syncleus.aethermud.merchant; import com.syncleus.aethermud.command.commands.CommandAuditLog; import com.syncleus.aethermud.core.GameManager; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.player.Player; import com.syncleus.aethermud.server.model.CreeperSession; import com.syncleus.aethermud.server.communication.Color; @@ -70,7 +70,7 @@ public class MerchantCommandHandler extends SimpleChannelUpstreamHandler { Integer desiredItem = Integer.parseInt(split[1]); if (inventoryMenu.containsKey(desiredItem)) { InventoryItemForSale inventoryItemForSale = inventoryMenu.get(desiredItem); - Item item = inventoryItemForSale.getItem(); + ItemPojo item = inventoryItemForSale.getItem(); playerByUsername.incrementGold(inventoryItemForSale.getCost()); gameManager.getChannelUtils().write(playerByUsername.getPlayerId(), "You have received: " + inventoryItemForSale.getCost() + Color.YELLOW + " gold" + Color.RESET + " for " + item.getItemName() + "\r\n"); playerByUsername.removeInventoryId(item.getItemId()); @@ -103,9 +103,9 @@ public class MerchantCommandHandler extends SimpleChannelUpstreamHandler { public Map<Integer, InventoryItemForSale> getInventoryMenu(Player player) { Map<Integer, InventoryItemForSale> inventoryItemsForSale = Maps.newHashMap(); - List<Item> inventory = player.getInventory(); + List<ItemPojo> inventory = player.getInventory(); int inv = 1; - for (Item itemEntity : inventory) { + for (ItemPojo itemEntity : inventory) { int valueInGold = itemEntity.getValueInGold(); if (valueInGold == 0) { valueInGold = itemEntity.getValueInGold(); @@ -150,10 +150,10 @@ public class MerchantCommandHandler extends SimpleChannelUpstreamHandler { } class InventoryItemForSale { - private final Item item; + private final ItemPojo item; private final Integer cost; - public InventoryItemForSale(Integer cost, Item item) { + public InventoryItemForSale(Integer cost, ItemPojo item) { this.cost = cost; this.item = item; } @@ -162,7 +162,7 @@ public class MerchantCommandHandler extends SimpleChannelUpstreamHandler { return cost; } - public Item getItem() { + public ItemPojo getItem() { return item; } } diff --git a/src/main/java/com/syncleus/aethermud/merchant/MerchantManager.java b/src/main/java/com/syncleus/aethermud/merchant/MerchantManager.java index 88abba2c..ffba3520 100644 --- a/src/main/java/com/syncleus/aethermud/merchant/MerchantManager.java +++ b/src/main/java/com/syncleus/aethermud/merchant/MerchantManager.java @@ -19,7 +19,7 @@ package com.syncleus.aethermud.merchant; import com.codahale.metrics.Timer; import com.syncleus.aethermud.Main; import com.syncleus.aethermud.core.GameManager; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.items.ItemBuilder; import com.syncleus.aethermud.items.ItemMetadata; import com.syncleus.aethermud.player.Player; @@ -65,7 +65,7 @@ public class MerchantManager { PlayerData playerData = playerMetadataOptional.get(); long availableGold = playerData.getGold(); if (availableGold >= price) { - Item item = new ItemBuilder().from(itemMetadata).create(); + ItemPojo item = new ItemBuilder().from(itemMetadata).create(); gameManager.getEntityManager().saveItem(item); gameManager.acquireItem(player, item.getItemId()); player.incrementGold(-price); diff --git a/src/main/java/com/syncleus/aethermud/merchant/lockers/GetCommand.java b/src/main/java/com/syncleus/aethermud/merchant/lockers/GetCommand.java index 073e500c..fa034376 100644 --- a/src/main/java/com/syncleus/aethermud/merchant/lockers/GetCommand.java +++ b/src/main/java/com/syncleus/aethermud/merchant/lockers/GetCommand.java @@ -15,7 +15,7 @@ */ package com.syncleus.aethermud.merchant.lockers; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.core.GameManager; import com.syncleus.aethermud.storage.graphdb.PlayerData; import com.google.common.base.Joiner; @@ -48,11 +48,11 @@ public class GetCommand extends LockerCommand { } PlayerData playerData = playerMetadataOptional.get(); for (String entityId: playerData.getLockerInventory()) { - Optional<Item> itemEntityOptional = gameManager.getEntityManager().getItemEntity(entityId); + Optional<ItemPojo> itemEntityOptional = gameManager.getEntityManager().getItemEntity(entityId); if (!itemEntityOptional.isPresent()) { continue; } - Item itemEntity = itemEntityOptional.get(); + ItemPojo itemEntity = itemEntityOptional.get(); if (itemEntity.getItemTriggers().contains(desiredRetrieveOption)) { player.transferItemFromLocker(entityId); write(itemEntity.getItemName() + " retrieved from locker.\r\n"); diff --git a/src/main/java/com/syncleus/aethermud/merchant/lockers/PutCommand.java b/src/main/java/com/syncleus/aethermud/merchant/lockers/PutCommand.java index fac19012..2db8730d 100644 --- a/src/main/java/com/syncleus/aethermud/merchant/lockers/PutCommand.java +++ b/src/main/java/com/syncleus/aethermud/merchant/lockers/PutCommand.java @@ -15,7 +15,7 @@ */ package com.syncleus.aethermud.merchant.lockers; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.core.GameManager; import com.google.common.base.Joiner; import org.jboss.netty.channel.ChannelHandlerContext; @@ -39,7 +39,7 @@ public class PutCommand extends LockerCommand { configure(e); originalMessageParts.remove(0); String desiredDropOffItem = Joiner.on(" ").join(originalMessageParts); - for (Item item : player.getInventory()) { + for (ItemPojo item : player.getInventory()) { if (item.getItemTriggers().contains(desiredDropOffItem)) { item.setWithPlayer(false); player.transferItemToLocker(item.getItemId()); diff --git a/src/main/java/com/syncleus/aethermud/npc/NpcSpawn.java b/src/main/java/com/syncleus/aethermud/npc/NpcSpawn.java index 781e47c2..098aeb9e 100644 --- a/src/main/java/com/syncleus/aethermud/npc/NpcSpawn.java +++ b/src/main/java/com/syncleus/aethermud/npc/NpcSpawn.java @@ -22,7 +22,7 @@ import com.syncleus.aethermud.core.GameManager; import com.syncleus.aethermud.core.SentryManager; import com.syncleus.aethermud.entity.AetherMudEntity; import com.syncleus.aethermud.items.Effect; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.items.Loot; import com.syncleus.aethermud.player.CoolDownPojo; import com.syncleus.aethermud.player.CoolDownType; @@ -224,6 +224,7 @@ public class NpcSpawn extends AetherMudEntity { } } } catch (Exception e) { + e.printStackTrace(); SentryManager.logSentry(this.getClass(), e, "Problem processing NPC Stat Change!"); } } @@ -274,30 +275,22 @@ public class NpcSpawn extends AetherMudEntity { private void killNpc(Player player) { - System.out.println("killed"); isAlive.set(false); player.removeActiveAlertStatus(this); Map<String, Double> damagePercents; - Item corpse = Item.createCorpseItem(getName(), getLoot()); + ItemPojo corpse = ItemPojo.createCorpseItem(getName(), getLoot()); if (!player.isActive(CoolDownType.DEATH)) { gameManager.writeToPlayerCurrentRoom(player.getPlayerId(), getDieMessage() + "\r\n"); } - System.out.println("more"); damagePercents = gameManager.processExperience(this, getCurrentRoom()); - System.out.println("more."); gameManager.getEntityManager().saveItem(corpse); - System.out.println("more.."); Integer roomId = gameManager.getRoomManager().getNpcCurrentRoom(this).get().getRoomId(); - System.out.println("more..."); Room room = gameManager.getRoomManager().getRoom(roomId); - System.out.println("and more...."); room.addPresentItem(corpse.getItemId()); gameManager.getItemDecayManager().addItem(corpse); getCurrentRoom().removePresentNpc(getEntityId()); gameManager.getEntityManager().deleteNpcEntity(getEntityId()); - System.out.println("removing active fight: " + player.getActiveFights().size()); player.removeActiveFight(this); - System.out.println("removed active fight: " + player.getActiveFights().size()); for (Map.Entry<String, Double> playerDamagePercent : damagePercents.entrySet()) { Player p = gameManager.getPlayerManager().getPlayer(playerDamagePercent.getKey()); if (p == null) { diff --git a/src/main/java/com/syncleus/aethermud/player/Player.java b/src/main/java/com/syncleus/aethermud/player/Player.java index 0753d94f..c4589603 100644 --- a/src/main/java/com/syncleus/aethermud/player/Player.java +++ b/src/main/java/com/syncleus/aethermud/player/Player.java @@ -697,7 +697,6 @@ public class Player extends AetherMudEntity { } PlayerData playerData = playerMetadataOptional.get(); Set<CoolDownData> coolDowns = playerData.getCoolDowns(); - log.info("removing cooldowns: " + coolDowns.size()); for(final CoolDownData coolDown : coolDowns) { if (coolDown.isActive()) { coolDown.decrementTick(); @@ -706,14 +705,10 @@ public class Player extends AetherMudEntity { gameManager.getChannelUtils().write(playerId, "You have risen from the dead.\r\n"); } - log.info("removed: " + coolDown.getName()); playerData.removeCoolDown(coolDown); } } savePlayerMetadata(); - - coolDowns = playerData.getCoolDowns(); - log.info(">removing cooldowns: " + coolDowns.size()); } } @@ -862,7 +857,7 @@ public class Player extends AetherMudEntity { } } - public Optional<Item> getInventoryItem(String itemKeyword) { + public Optional<ItemPojo> getInventoryItem(String itemKeyword) { synchronized (interner.intern(playerId)) { Optional<PlayerData> playerMetadataOptional = getPlayerMetadata(); if (!playerMetadataOptional.isPresent()) { @@ -870,12 +865,12 @@ public class Player extends AetherMudEntity { } PlayerData playerData = playerMetadataOptional.get(); for (String itemId : playerData.getInventory()) { - Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); + Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); if (!itemOptional.isPresent()) { log.info("Orphaned inventoryId:" + itemId + " player: " + getPlayerName()); continue; } - Item itemEntity = itemOptional.get(); + ItemPojo itemEntity = itemOptional.get(); if (itemEntity.getItemTriggers().contains(itemKeyword)) { return Optional.of(itemEntity); } @@ -891,10 +886,10 @@ public class Player extends AetherMudEntity { public List<String> getRolledUpLockerInventory() { synchronized (interner.intern(playerId)) { List<String> rolledUp = Lists.newArrayList(); - List<Item> inventory = getLockerInventory(); + List<ItemPojo> inventory = getLockerInventory(); Map<String, Integer> itemAndCounts = Maps.newHashMap(); if (inventory != null) { - for (Item item : inventory) { + for (ItemPojo item : inventory) { StringBuilder invItem = new StringBuilder(); invItem.append(item.getItemName()); int maxUses = item.getMaxUses(); @@ -929,18 +924,18 @@ public class Player extends AetherMudEntity { } } - public List<Item> getLockerInventory() { + public List<ItemPojo> getLockerInventory() { synchronized (interner.intern(playerId)) { Optional<PlayerData> playerMetadataOptonal = getPlayerMetadata(); if (!playerMetadataOptonal.isPresent()) { return Lists.newArrayList(); } PlayerData playerData = playerMetadataOptonal.get(); - List<Item> inventoryItems = Lists.newArrayList(); + List<ItemPojo> inventoryItems = Lists.newArrayList(); List<String> inventory = playerData.getLockerInventory(); if (inventory != null) { for (String itemId : inventory) { - Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); + Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); if (!itemOptional.isPresent()) { log.info("Orphaned inventoryId:" + itemId + " player: " + getPlayerName()); continue; @@ -948,7 +943,7 @@ public class Player extends AetherMudEntity { inventoryItems.add(itemOptional.get()); } } - inventoryItems.sort(Comparator.comparing(Item::getItemName)); + inventoryItems.sort(Comparator.comparing(ItemPojo::getItemName)); return inventoryItems; } } @@ -956,10 +951,10 @@ public class Player extends AetherMudEntity { public List<String> getRolledUpIntentory() { synchronized (interner.intern(playerId)) { List<String> rolledUp = Lists.newArrayList(); - List<Item> inventory = getInventory(); + List<ItemPojo> inventory = getInventory(); Map<String, Integer> itemAndCounts = Maps.newHashMap(); if (inventory != null) { - for (Item item : inventory) { + for (ItemPojo item : inventory) { StringBuilder invItem = new StringBuilder(); invItem.append(item.getItemName()); int maxUses = item.getMaxUses(); @@ -994,18 +989,18 @@ public class Player extends AetherMudEntity { } } - public List<Item> getInventory() { + public List<ItemPojo> getInventory() { synchronized (interner.intern(playerId)) { Optional<PlayerData> playerMetadataOptional = getPlayerMetadata(); if (!playerMetadataOptional.isPresent()) { return Lists.newArrayList(); } PlayerData playerData = playerMetadataOptional.get(); - List<Item> inventoryItems = Lists.newArrayList(); + List<ItemPojo> inventoryItems = Lists.newArrayList(); List<String> inventory = playerData.getInventory(); if (inventory != null) { for (String itemId : inventory) { - Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); + Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); if (!itemOptional.isPresent()) { log.info("Orphaned inventoryId:" + itemId + " player: " + getPlayerName()); continue; @@ -1013,23 +1008,23 @@ public class Player extends AetherMudEntity { inventoryItems.add(itemOptional.get()); } } - inventoryItems.sort(Comparator.comparing(Item::getItemName)); + inventoryItems.sort(Comparator.comparing(ItemPojo::getItemName)); return inventoryItems; } } - public Set<Item> getEquipment() { + public Set<ItemPojo> getEquipment() { synchronized (interner.intern(playerId)) { Optional<PlayerData> playerMetadataOptional = getPlayerMetadata(); if (!playerMetadataOptional.isPresent()) { return Sets.newHashSet(); } PlayerData playerData = playerMetadataOptional.get(); - Set<Item> equipmentItems = Sets.newHashSet(); + Set<ItemPojo> equipmentItems = Sets.newHashSet(); List<String> equipment = playerData.getPlayerEquipment(); if (equipment != null) { for (String itemId : equipment) { - Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); + Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); if (!itemOptional.isPresent()) { log.info("Orphaned equipmentId:" + itemId + " player: " + getPlayerName()); continue; @@ -1041,14 +1036,14 @@ public class Player extends AetherMudEntity { } } - public void equip(Item item) { + public void equip(ItemPojo item) { synchronized (interner.intern(playerId)) { if (item.getEquipment() == null) { return; } Equipment equipment = item.getEquipment(); EquipmentSlotType equipmentSlotType = equipment.getEquipmentSlotType(); - Optional<Item> slotItemOptional = getSlotItem(equipmentSlotType); + Optional<ItemPojo> slotItemOptional = getSlotItem(equipmentSlotType); if (slotItemOptional.isPresent()) { if (!unEquip(slotItemOptional.get())) { return; @@ -1060,7 +1055,7 @@ public class Player extends AetherMudEntity { } } - public Optional<Item> getSlotItem(EquipmentSlotType slot) { + public Optional<ItemPojo> getSlotItem(EquipmentSlotType slot) { Optional<PlayerData> playerMetadataOptional = getPlayerMetadata(); if (!playerMetadataOptional.isPresent()) { return Optional.empty(); @@ -1070,11 +1065,11 @@ public class Player extends AetherMudEntity { return Optional.empty(); } for (String item : playerData.getPlayerEquipment()) { - Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(item); + Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(item); if (!itemOptional.isPresent()) { continue; } - Item itemEntity = itemOptional.get(); + ItemPojo itemEntity = itemOptional.get(); EquipmentSlotType equipmentSlotType = itemEntity.getEquipment().getEquipmentSlotType(); if (equipmentSlotType.equals(slot)) { return Optional.of(itemEntity); @@ -1083,7 +1078,7 @@ public class Player extends AetherMudEntity { return Optional.empty(); } - public boolean unEquip(Item item) { + public boolean unEquip(ItemPojo item) { synchronized (interner.intern(playerId)) { gameManager.getChannelUtils().write(playerId, "Un-equipping " + item.getItemName() + "\r\n"); if (gameManager.acquireItem(this, item.getItemId())) { @@ -1164,11 +1159,11 @@ public class Player extends AetherMudEntity { return playerStats; } for (String equipId : playerEquipment) { - Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(equipId); + Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(equipId); if (!itemOptional.isPresent()) { continue; } - Item itemEntity = itemOptional.get(); + ItemPojo itemEntity = itemOptional.get(); Equipment equipment = itemEntity.getEquipment(); Stats stats = equipment.getStats(); StatsHelper.combineStats(newStats, stats); @@ -1217,7 +1212,7 @@ public class Player extends AetherMudEntity { List<EquipmentSlotType> all = EquipmentSlotType.getAll(); for (EquipmentSlotType slot : all) { t.addCell(capitalize(slot.getName())); - Optional<Item> slotItemOptional = getSlotItem(slot); + Optional<ItemPojo> slotItemOptional = getSlotItem(slot); if (slotItemOptional.isPresent()) { t.addCell(slotItemOptional.get().getItemName()); } else { @@ -1321,17 +1316,11 @@ public class Player extends AetherMudEntity { } public void removeActiveFight(NpcSpawn npcSpawn) { - System.out.println("trying to remove a fight..."); synchronized (interner.intern(playerId)) { - System.out.println("still trying..."); Iterator<Map.Entry<Long, ActiveFight>> iterator = activeFights.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Long, ActiveFight> next = iterator.next(); - System.out.println("considering this one?"); - if (next.getValue().getNpcId().equals(npcSpawn.getEntityId())) { -// if (next.getValue().isPrimary()) { -// } - System.out.println("removed a fight"); + if (next.getValue().getNpcId().orElse("").equals(npcSpawn.getEntityId())) { iterator.remove(); } } diff --git a/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java b/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java index 163e0807..eedbef64 100644 --- a/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java +++ b/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java @@ -17,7 +17,7 @@ package com.syncleus.aethermud.player; import com.google.common.collect.Sets; import com.syncleus.aethermud.core.GameManager; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.items.ItemBuilder; import com.syncleus.aethermud.items.ItemMetadata; import com.syncleus.aethermud.server.communication.Color; @@ -259,11 +259,11 @@ public class PlayerManagement implements PlayerManagementMBean { PlayerData playerData = playerMetadataOptional.get(); List<String> inventory = playerData.getInventory(); for (String itemId : inventory) { - Optional<Item> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId); + Optional<ItemPojo> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId); if (!itemEntityOptional.isPresent()) { continue; } - Item itemEntity = itemEntityOptional.get(); + ItemPojo itemEntity = itemEntityOptional.get(); String itemName = itemEntity.getItemName(); final String msgWithoutColorCodes = itemName.replaceAll("\u001B\\[[;\\d]*m", ""); @@ -282,11 +282,11 @@ public class PlayerManagement implements PlayerManagementMBean { PlayerData playerData = playerMetadataOptional.get(); List<String> inventory = playerData.getLockerInventory(); for (String itemId : inventory) { - Optional<Item> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId); + Optional<ItemPojo> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId); if (!itemEntityOptional.isPresent()) { continue; } - Item itemEntity = itemEntityOptional.get(); + ItemPojo itemEntity = itemEntityOptional.get(); String itemName = itemEntity.getItemName(); final String msgWithoutColorCodes = itemName.replaceAll("\u001B\\[[;\\d]*m", ""); @@ -301,7 +301,7 @@ public class PlayerManagement implements PlayerManagementMBean { if (!itemMetadata.isPresent()) { return "No such item exists with internal name: " + internalItemName; } - Item item = new ItemBuilder().from(itemMetadata.get()).create(); + ItemPojo item = new ItemBuilder().from(itemMetadata.get()).create(); gameManager.getEntityManager().saveItem(item); synchronized (findInterner().intern(playerId)) { Optional<PlayerData> playerMetadataOptional = gameManager.getPlayerManager().getPlayerMetadata(playerId); diff --git a/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java b/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java index 2c4e50a5..a0eabf93 100644 --- a/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java +++ b/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java @@ -19,7 +19,7 @@ import com.codahale.metrics.MetricRegistry; import com.syncleus.aethermud.Main; import com.syncleus.aethermud.core.GameManager; import com.syncleus.aethermud.entity.AetherMudEntity; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.items.ItemBuilder; import com.syncleus.aethermud.items.ItemMetadata; import com.syncleus.aethermud.world.model.Area; @@ -80,7 +80,7 @@ public class ItemSpawner extends AetherMudEntity { private void createAndAddItem() { ArrayList<Room> rooms = Lists.newArrayList(Iterators.filter(gameManager.getRoomManager().getRoomsByArea(spawnArea).iterator(), getRoomsWithRoom())); Room room = rooms.get(random.nextInt(rooms.size())); - Item item = new ItemBuilder().from(itemMetadata).create(); + ItemPojo item = new ItemBuilder().from(itemMetadata).create(); gameManager.getEntityManager().saveItem(item); gameManager.placeItemInRoom(room.getRoomId(), item.getItemId()); Main.metrics.counter(MetricRegistry.name(ItemSpawner.class, item.getItemName() + "-spawn")).inc(); @@ -92,11 +92,11 @@ public class ItemSpawner extends AetherMudEntity { for (Room room : roomsByArea) { if (room.getAreas().contains(spawnArea)) { for (String i : room.getItemIds()) { - Optional<Item> currentItemOptional = gameManager.getEntityManager().getItemEntity(i); + Optional<ItemPojo> currentItemOptional = gameManager.getEntityManager().getItemEntity(i); if (!currentItemOptional.isPresent()) { continue; } - Item currentItem = currentItemOptional.get(); + ItemPojo currentItem = currentItemOptional.get(); if (currentItem.getInternalItemName().equals(itemMetadata.getInternalItemName())) { numberCurrentlyInArea++; } @@ -113,11 +113,11 @@ public class ItemSpawner extends AetherMudEntity { int count = 0; Set<String> itemIds = room.getItemIds(); for (String itemId : itemIds) { - Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); + Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); if (!itemOptional.isPresent()) { continue; } - Item item = itemOptional.get(); + ItemPojo item = itemOptional.get(); if (item.getInternalItemName().equals(itemMetadata.getInternalItemName())) { count++; } diff --git a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java index 88dd3996..c7450f34 100644 --- a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java +++ b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java @@ -17,13 +17,14 @@ package com.syncleus.aethermud.storage; import com.google.common.util.concurrent.Service; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; +import com.syncleus.aethermud.storage.graphdb.ItemData; import com.syncleus.aethermud.storage.graphdb.PlayerData; import java.util.Map; import java.util.Optional; -public interface AetherMudStorage extends Service{ +public interface AetherMudStorage extends Service { PlayerData newPlayerData(); @@ -31,13 +32,13 @@ public interface AetherMudStorage extends Service{ Map<String, PlayerData> getAllPlayerMetadata(); - void removePlayerMetadata(String playerId); + void saveItemEntity(ItemPojo item); - void saveItemEntity(Item item); - - Optional<Item> getItemEntity(String itemId); + Optional<ItemData> getItemEntity(String itemId); void removeItem(String itemId); + ItemData newItem(); + void persist(); } diff --git a/src/main/java/com/syncleus/aethermud/storage/ItemSerializer.java b/src/main/java/com/syncleus/aethermud/storage/ItemSerializer.java index 5c62765f..cf6d0eea 100644 --- a/src/main/java/com/syncleus/aethermud/storage/ItemSerializer.java +++ b/src/main/java/com/syncleus/aethermud/storage/ItemSerializer.java @@ -15,7 +15,7 @@ */ package com.syncleus.aethermud.storage; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.jetbrains.annotations.NotNull; @@ -26,18 +26,18 @@ import org.mapdb.Serializer; import java.io.IOException; import java.io.Serializable; -public class ItemSerializer implements Serializer<Item>, Serializable { +public class ItemSerializer implements Serializer<ItemPojo>, Serializable { private final static Gson GSON = new GsonBuilder().create(); @Override - public void serialize(@NotNull DataOutput2 out, @NotNull Item value) throws IOException { - out.writeUTF(GSON.toJson(value, Item.class)); + public void serialize(@NotNull DataOutput2 out, @NotNull ItemPojo value) throws IOException { + out.writeUTF(GSON.toJson(value, ItemPojo.class)); } @Override - public Item deserialize(@NotNull DataInput2 input, int available) throws IOException { - return GSON.fromJson(input.readUTF(), Item.class); + public ItemPojo deserialize(@NotNull DataInput2 input, int available) throws IOException { + return GSON.fromJson(input.readUTF(), ItemPojo.class); } @Override diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java index dc3aed67..7f467397 100644 --- a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java +++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java @@ -15,18 +15,17 @@ */ package com.syncleus.aethermud.storage.graphdb; +import com.google.api.client.util.Sets; import com.google.common.util.concurrent.AbstractIdleService; import com.syncleus.aethermud.Main; -import com.syncleus.aethermud.items.Effect; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.player.PlayerRole; import com.syncleus.aethermud.storage.AetherMudStorage; -import com.syncleus.aethermud.storage.EffectSerializer; import com.syncleus.aethermud.storage.ItemSerializer; import com.syncleus.aethermud.storage.MapDbAutoCommitService; -import com.syncleus.ferma.DelegatingFramedGraph; -import com.syncleus.ferma.FramedGraph; import com.syncleus.ferma.WrappedFramedGraph; +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.PropertyUtils; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.io.IoCore; import org.mapdb.DB; @@ -34,36 +33,17 @@ import org.mapdb.HTreeMap; import org.mapdb.Serializer; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.*; +import java.util.function.Consumer; //TODO : multiple instances of this class could create conflicts in the DB public class GraphDbAetherMudStorage extends AbstractIdleService implements AetherMudStorage { private final WrappedFramedGraph<Graph> framedGraph; - private final DB db; - private final MapDbAutoCommitService mapDbAutoCommitService; - - private final HTreeMap<String, Item> items; - - private final static String ITEM_MAP = "itemMap"; - private final static String EFFECTS_MAP = "effectsMap"; - private final boolean autoPersist; - - public GraphDbAetherMudStorage(DB db, WrappedFramedGraph<Graph> framedGraph){ - this(db, framedGraph, true); - } - - public GraphDbAetherMudStorage(DB db, WrappedFramedGraph<Graph> framedGraph, boolean autoPersist) { - this.db = db; - this.autoPersist = autoPersist; - this.items = db.hashMap(ITEM_MAP) - .keySerializer(Serializer.STRING) - .valueSerializer(new ItemSerializer()) - .createOrOpen(); - - this.mapDbAutoCommitService = new MapDbAutoCommitService(db); + public GraphDbAetherMudStorage(WrappedFramedGraph<Graph> framedGraph) { this.framedGraph = framedGraph; } @@ -84,35 +64,19 @@ public class GraphDbAetherMudStorage extends AbstractIdleService implements Aeth final Map<String, PlayerData> retVal = new HashMap<>(datas.size()); for( PlayerData data : datas ) { retVal.put(data.getPlayerId(), data); - for(PlayerRole role : data.getPlayerRoleSet()) - System.out.println("role: " + role); } return retVal; } @Override - public void removePlayerMetadata(String playerId) { - final PlayerData data = framedGraph.traverse((g) -> g.V().has("playerId", playerId)).next(PlayerData.class); - data.remove(); - - if (this.autoPersist) { - this.persist(); - } - } - - @Override - public void saveItemEntity(Item item) { - this.items.put(item.getItemId(), item); - } - - @Override - public Optional<Item> getItemEntity(String itemId) { - return Optional.ofNullable(this.items.get(itemId)); + public Optional<ItemData> getItemEntity(String itemId) { + return Optional.ofNullable(framedGraph.traverse((g) -> framedGraph.getTypeResolver().hasType(g.V(), ItemData.class)).nextOrDefault(ItemData.class, null)); } @Override public void removeItem(String itemId) { - this.items.remove(itemId); + this.getItemEntity(itemId).ifPresent((i) -> i.remove()); + } public void persist() { @@ -124,14 +88,24 @@ public class GraphDbAetherMudStorage extends AbstractIdleService implements Aeth } @Override - protected void startUp() throws Exception { - mapDbAutoCommitService.startAsync(); + public ItemData newItem() { + return framedGraph.addFramedVertex(ItemData.class); + } + + @Override + public void saveItemEntity(ItemPojo item) { + try { + BeanUtils.copyProperties(this.newItem(), item); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new IllegalStateException("Could not copy bean", e); + } + } + + @Override + protected void startUp() { } @Override - protected void shutDown() throws Exception { - mapDbAutoCommitService.stopAsync(); - mapDbAutoCommitService.awaitTerminated(); - db.commit(); + protected void shutDown() { } } diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java new file mode 100644 index 00000000..61ca32f3 --- /dev/null +++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java @@ -0,0 +1,186 @@ +/** + * Copyright 2017 Syncleus, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.syncleus.aethermud.storage.graphdb; + +import com.syncleus.aethermud.core.service.TimeTracker; +import com.syncleus.aethermud.items.*; +import com.syncleus.aethermud.stats.Stats; +import com.syncleus.ferma.AbstractVertexFrame; +import com.syncleus.ferma.annotations.Property; + +import java.util.List; +import java.util.Set; + +public abstract class ItemData extends AbstractVertexFrame implements Item { + @Override + @Property("Stats") + public abstract Stats getItemApplyStats(); + + @Override + public void setItemApplyStats(Stats itemApplyStats) { + this.traverse((v) -> v.property("Stats", itemApplyStats)); + } + + @Override + @Property("ValidTimeOfDays") + public abstract Set<TimeTracker.TimeOfDay> getValidTimeOfDays(); + + @Override + @Property("Disposable") + public abstract boolean isDisposable(); + + @Override + @Property("MaxUses") + public abstract int getMaxUses(); + + @Override + @Property("WithPlayer") + public abstract boolean isWithPlayer(); + + @Override + @Property("WithPlayer") + public abstract void setWithPlayer(boolean isWithPlayer); + + @Override + @Property("NumberOfUses") + public abstract int getNumberOfUses(); + + @Override + @Property("NumberOfUses") + public abstract void setNumberOfUses(int numberOfUses); + + @Override + @Property("ItemId") + public abstract String getItemId(); + + @Override + @Property("InternalItemName") + public abstract String getInternalItemName(); + + @Override + @Property("ItemName") + public abstract String getItemName(); + + @Override + @Property("ItemDescription") + public abstract String getItemDescription(); + + @Override + @Property("ItemTriggers") + public abstract List<String> getItemTriggers(); + + @Override + @Property("RestingName") + public abstract String getRestingName(); + + @Override + @Property("ItemHalfLifeTicks") + public abstract int getItemHalfLifeTicks(); + + @Override + @Property("Loot") + public abstract Loot getLoot(); + + @Override + public void setEquipment(Equipment equipment) { + this.traverse((v) -> v.property("Equipment", equipment)); + } + + @Override + @Property("HasBeenWithPlayer") + public abstract void setHasBeenWithPlayer(boolean hasBeenWithPlayer); + + @Override + public void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays) { + this.traverse((v) -> v.property("ValidTimeOfDays", validTimeOfDays)); + } + + @Override + @Property("Equipment") + public abstract Equipment getEquipment(); + + @Override + @Property("Rarity") + public abstract Rarity getRarity(); + + @Override + @Property("ValueInGold") + public abstract int getValueInGold(); + + @Override + public void setEffects(Set<Effect> effects) { + this.traverse((v) -> v.property("Effects", effects)); + } + + @Override + @Property("Effects") + public abstract Set<Effect> getEffects(); + + @Override + @Property("ItemName") + public abstract void setItemName(String itemName); + + @Override + @Property("ItemDescription") + public abstract void setItemDescription(String itemDescription); + + @Override + @Property("InternalItemName") + public abstract void setInternalItemName(String internalItemName); + + @Override + public void setItemTriggers(List<String> itemTriggers) { + this.traverse((v) -> v.property("ItemTriggers", itemTriggers)); + } + + @Override + @Property("RestingName") + public abstract void setRestingName(String restingName); + + @Override + @Property("ItemId") + public abstract void setItemId(String itemId); + + @Override + public void setLoot(Loot loot) { + this.traverse((v) -> v.property("Loot", loot)); + } + + @Override + @Property("ItemHalfLifeTicks") + public abstract void setItemHalfLifeTicks(int itemHalfLifeTicks); + + @Override + public void setRarity(Rarity rarity) { + this.traverse((v) -> v.property("Rarity", rarity)); + } + + @Override + @Property("ValueInGold") + public abstract void setValueInGold(int valueInGold); + + @Override + @Property("MaxUses") + public abstract void setMaxUses(int maxUses); + + @Override + @Property("Disposable") + public abstract void setDisposable(boolean disposable); + + @Override + @Property("HasBeenWithPlayer") + public abstract boolean isHasBeenWithPlayer(); +} diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/PlayerData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/PlayerData.java index e557be11..165c1b83 100644 --- a/src/main/java/com/syncleus/aethermud/storage/graphdb/PlayerData.java +++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/PlayerData.java @@ -148,7 +148,6 @@ public abstract class PlayerData extends AbstractVertexFrame { public abstract void addCoolDown(CoolDownData coolDown); public void setCoolDowns(Map<CoolDownType, CoolDownData> coolDowns) { - System.out.println("setting cooldowns: " + coolDowns.size()); Iterator<? extends CoolDownData> existingCoolDowns = getCoolDowns(CoolDownData.class); while(existingCoolDowns.hasNext()) { CoolDownData existingCoolDown = existingCoolDowns.next(); @@ -165,7 +164,6 @@ public abstract class PlayerData extends AbstractVertexFrame { } public CoolDownData createCoolDown(CoolDownType type) { - System.out.println("creating cool down"); Iterator<? extends CoolDownData> coolDowns = getCoolDowns(CoolDownData.class); while(coolDowns.hasNext()) { CoolDownData coolDown = coolDowns.next(); @@ -184,7 +182,6 @@ public abstract class PlayerData extends AbstractVertexFrame { } public CoolDownData createCoolDown(CoolDown coolDownSource) { - System.out.println("creating cool down"); Iterator<? extends CoolDownData> coolDowns = getCoolDowns(CoolDownData.class); while(coolDowns.hasNext()) { CoolDownData coolDown = coolDowns.next(); @@ -248,8 +245,8 @@ public abstract class PlayerData extends AbstractVertexFrame { try { PropertyUtils.copyProperties(this.createStats(), stats); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - throw new IllegalStateException("Could not copy properties") - ; } + throw new IllegalStateException("Could not copy properties"); + } } } diff --git a/src/main/java/com/syncleus/aethermud/world/model/Room.java b/src/main/java/com/syncleus/aethermud/world/model/Room.java index 35f29e3a..67ef5a3d 100644 --- a/src/main/java/com/syncleus/aethermud/world/model/Room.java +++ b/src/main/java/com/syncleus/aethermud/world/model/Room.java @@ -19,7 +19,7 @@ import com.syncleus.aethermud.core.GameManager; import com.syncleus.aethermud.core.service.TimeTracker; import com.syncleus.aethermud.entity.AetherMudEntity; import com.syncleus.aethermud.items.Forage; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.merchant.Merchant; import com.syncleus.aethermud.npc.NpcSpawn; import com.syncleus.aethermud.player.Player; @@ -295,12 +295,12 @@ public abstract class Room extends AetherMudEntity { @Override public void run() { for (String itemId : itemIds) { - Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); + Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId); if (!itemOptional.isPresent()) { removePresentItem(itemId); continue; } - Item itemEntity = itemOptional.get(); + ItemPojo itemEntity = itemOptional.get(); if (itemEntity.isHasBeenWithPlayer()) { continue; } diff --git a/src/test/java/com/syncleus/aethermud/player/PlayerManagerTest.java b/src/test/java/com/syncleus/aethermud/player/PlayerManagerTest.java index 53e37b09..aa8845e4 100644 --- a/src/test/java/com/syncleus/aethermud/player/PlayerManagerTest.java +++ b/src/test/java/com/syncleus/aethermud/player/PlayerManagerTest.java @@ -50,9 +50,8 @@ public class PlayerManagerTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - DB db = DBMaker.memoryDB().transactionEnable().make(); WrappedFramedGraph<Graph> framedGraph = new DelegatingFramedGraph(TinkerGraph.open(), Main.FRAMED_TYPES); - GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(db, framedGraph, false); + GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(framedGraph); playerManager = new PlayerManager(graphStorage, sessionManager); } diff --git a/src/test/java/com/syncleus/aethermud/player/combatsimuation/CombatSimulationDetails.java b/src/test/java/com/syncleus/aethermud/player/combatsimuation/CombatSimulationDetails.java index 194fdeee..07591e44 100644 --- a/src/test/java/com/syncleus/aethermud/player/combatsimuation/CombatSimulationDetails.java +++ b/src/test/java/com/syncleus/aethermud/player/combatsimuation/CombatSimulationDetails.java @@ -15,7 +15,7 @@ */ package com.syncleus.aethermud.player.combatsimuation; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.npc.NpcSpawn; import java.util.Set; @@ -24,10 +24,10 @@ public class CombatSimulationDetails { private final int level; private final int totalIterations; - private final Set<Item> equipmentSet; + private final Set<ItemPojo> equipmentSet; private final NpcSpawn npcSpawn; - public CombatSimulationDetails(int level, Set<Item> equipmentSet, NpcSpawn npcSpawn) { + public CombatSimulationDetails(int level, Set<ItemPojo> equipmentSet, NpcSpawn npcSpawn) { this.level = level; this.totalIterations = 1000; this.equipmentSet = equipmentSet; @@ -46,7 +46,7 @@ public class CombatSimulationDetails { return npcSpawn; } - public Set<Item> getEquipmentSet() { + public Set<ItemPojo> getEquipmentSet() { return equipmentSet; } } diff --git a/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java b/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java index a22ab3e1..04adfd14 100644 --- a/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java +++ b/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java @@ -21,7 +21,7 @@ import com.syncleus.aethermud.configuration.AetherMudConfiguration; import com.syncleus.aethermud.core.GameManager; import com.syncleus.aethermud.core.SessionManager; import com.syncleus.aethermud.entity.EntityManager; -import com.syncleus.aethermud.items.Item; +import com.syncleus.aethermud.items.ItemPojo; import com.syncleus.aethermud.npc.NpcSpawn; import com.syncleus.aethermud.npc.NpcBuilder; import com.syncleus.aethermud.player.*; @@ -131,18 +131,18 @@ public class NpcTestHarness { processRunAndVerify(npcSpawnFromFile, 10, getMidLevelArmorSet(), 100f, 0f, 10, 0, 24, 18); } - private Set<Item> getEarlyLevelArmorSet() { + private Set<ItemPojo> getEarlyLevelArmorSet() { // return Sets.newHashSet(ItemType.BERSERKER_BATON.create(), ItemType.BERSEKER_BOOTS.create(), ItemType.BERSEKER_SHORTS.create()); return Sets.newConcurrentHashSet(); } - private Set<Item> getMidLevelArmorSet() { - Set<Item> armorSet = getEarlyLevelArmorSet(); + private Set<ItemPojo> getMidLevelArmorSet() { + Set<ItemPojo> armorSet = getEarlyLevelArmorSet(); // armorSet.addAll(Sets.newHashSet(ItemType.BERSERKER_BRACERS.create(), ItemType.BERSERKER_CHEST.create())); return armorSet; } - private void processRunAndVerify(NpcSpawn testNpcSpawn, int desiredLevel, Set<Item> equipment, float winPctMax, float winPctMin, int maxRounds, int minRounds, int maxAvgGold, int minAvgGold) throws Exception { + private void processRunAndVerify(NpcSpawn testNpcSpawn, int desiredLevel, Set<ItemPojo> equipment, float winPctMax, float winPctMin, int maxRounds, int minRounds, int maxAvgGold, int minAvgGold) throws Exception { CombatSimulationDetails combatSimulationDetailsLevel = new CombatSimulationDetails(desiredLevel, equipment, testNpcSpawn); CombatSimulationResult combatSimulationResultLevel = executeCombat(combatSimulationDetailsLevel); printCombatResults(combatSimulationDetailsLevel, combatSimulationResultLevel); @@ -176,7 +176,7 @@ public class NpcTestHarness { playerWins++; int gold = (int) gameManager.getLootManager().lootGoldAmountReturn(npcSpawn.getLoot()); totalGold += gold; - Set<Item> items = gameManager.getLootManager().lootItemsReturn(npcSpawn.getLoot()); + Set<ItemPojo> items = gameManager.getLootManager().lootItemsReturn(npcSpawn.getLoot()); items.forEach(item -> { if (!drops.containsKey(item.getItemName())) { drops.put(item.getItemName(), new AtomicInteger(1)); @@ -248,7 +248,7 @@ public class NpcTestHarness { return player; } - private void equipArmor(Player player, Set<Item> equipment) { + private void equipArmor(Player player, Set<ItemPojo> equipment) { equipment.forEach(item -> { entityManager.saveItem(item); gameManager.acquireItem(player, item.getItemId()); @@ -331,9 +331,8 @@ public class NpcTestHarness { } }; AetherMudConfiguration aetherMudConfiguration = new AetherMudConfiguration(new MapConfiguration(Maps.newHashMap())); - DB db = DBMaker.memoryDB().transactionEnable().closeOnJvmShutdown().make(); WrappedFramedGraph<Graph> framedGraph = new DelegatingFramedGraph(TinkerGraph.open(), Main.FRAMED_TYPES); - GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(db, framedGraph); + GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(framedGraph); PlayerManager playerManager = new PlayerManager(graphStorage, new SessionManager()); RoomManager roomManager = new RoomManager(playerManager); MapsManager mapsManager = new MapsManager(aetherMudConfiguration, roomManager); -- GitLab