diff --git a/pom.xml b/pom.xml
index 1fe00e093652f5fd5aaf2a7726dadd270b4b88ea..32f785faa3efc5ac0ff1b6aeae699a9db6c9a934 100644
--- a/pom.xml
+++ b/pom.xml
@@ -187,7 +187,7 @@
<dependency>
<groupId>com.syncleus.ferma</groupId>
<artifactId>ferma</artifactId>
- <version>3.0.3</version>
+ <version>3.0.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.tinkerpop</groupId>
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 f70bb59e7112f3b15c50fa7139e8878b39f9a3d0..136efc4780556b009b9e506c2f9e64872c6ff736 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java
@@ -47,6 +47,8 @@ public class PickUpCommand extends Command {
if (!itemEntityOptional.isPresent()) {
continue;
}
+ if( itemEntityOptional.get().getItemTriggers() == null )
+ throw new IllegalStateException("Item triggers cant be null");
if (itemEntityOptional.get().getItemTriggers().contains(desiredPickUpItem)) {
if (gameManager.acquireItemFromRoom(player, next)) {
String playerName = player.getPlayerName();
diff --git a/src/main/java/com/syncleus/aethermud/core/GameManager.java b/src/main/java/com/syncleus/aethermud/core/GameManager.java
index 6b7188fee9d655cfe1c0baf062de57fdaadb459e..143f136300450fc8fae1f38e0b978ff039e6c22f 100644
--- a/src/main/java/com/syncleus/aethermud/core/GameManager.java
+++ b/src/main/java/com/syncleus/aethermud/core/GameManager.java
@@ -475,7 +475,7 @@ public class GameManager {
public void placeItemInRoom(Integer roomId, String itemId) {
Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId);
if (!itemOptional.isPresent()) {
- return;
+ throw new IllegalArgumentException("itemId not valid.");
}
ItemPojo item = itemOptional.get();
roomManager.getRoom(roomId).addPresentItem(item.getItemId());
diff --git a/src/main/java/com/syncleus/aethermud/entity/EntityManager.java b/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
index ce2527432b24ec455a5b987392feb3c92da386e8..fbe4d987bd3374cc5a4f3d7af0c231f6ea050e5d 100644
--- a/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
+++ b/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
@@ -17,7 +17,6 @@ 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;
@@ -42,7 +41,6 @@ public class EntityManager {
private static final Logger log = Logger.getLogger(EntityManager.class);
-
private final AetherMudStorage aetherMudStorage;
private final RoomManager roomManager;
private final PlayerManager playerManager;
@@ -80,8 +78,8 @@ public class EntityManager {
}
}
- public void saveItem(ItemPojo item) {
- aetherMudStorage.saveItemEntity(item);
+ public ItemData saveItem(ItemPojo item) {
+ return aetherMudStorage.saveItem(item);
}
public void removeItem(ItemPojo item) {
diff --git a/src/main/java/com/syncleus/aethermud/items/Item.java b/src/main/java/com/syncleus/aethermud/items/Item.java
index 6e3e73ea5fc62e6503947fb422ebaf0152ffbe44..c32ecfeca07b65e044c1c1582589f8a0657366c2 100644
--- a/src/main/java/com/syncleus/aethermud/items/Item.java
+++ b/src/main/java/com/syncleus/aethermud/items/Item.java
@@ -48,6 +48,8 @@ public interface Item {
List<String> getItemTriggers();
+ void setItemTriggers(List<String> itemTriggers);
+
String getRestingName();
int getItemHalfLifeTicks();
@@ -76,8 +78,6 @@ public interface Item {
void setInternalItemName(String internalItemName);
- void setItemTriggers(List<String> itemTriggers);
-
void setRestingName(String restingName);
void setItemId(String itemId);
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
index 070c943cf67455a6fef9956a13fa1d5c66b8db41..960d1cf400e7bba2f2b74c72c58e4aeb091f939e 100644
--- a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
+++ b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
@@ -190,7 +190,7 @@ public class ItemBuilder {
}
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);
+ 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/spawner/ItemSpawner.java b/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
index a0eabf93c5bccf4c8f20d2d3e245e833b07eea84..85ab9971a5eb6ec509436565db7850f68470f292 100644
--- a/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
+++ b/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
@@ -18,15 +18,19 @@ package com.syncleus.aethermud.spawner;
import com.codahale.metrics.MetricRegistry;
import com.syncleus.aethermud.Main;
import com.syncleus.aethermud.core.GameManager;
+import com.syncleus.aethermud.core.SentryManager;
import com.syncleus.aethermud.entity.AetherMudEntity;
+import com.syncleus.aethermud.entity.EntityManager;
import com.syncleus.aethermud.items.ItemPojo;
import com.syncleus.aethermud.items.ItemBuilder;
import com.syncleus.aethermud.items.ItemMetadata;
+import com.syncleus.aethermud.storage.graphdb.ItemData;
import com.syncleus.aethermud.world.model.Area;
import com.syncleus.aethermud.world.model.Room;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
+import org.apache.log4j.Logger;
import java.util.ArrayList;
import java.util.Optional;
@@ -34,7 +38,7 @@ import java.util.Random;
import java.util.Set;
public class ItemSpawner extends AetherMudEntity {
-
+ private static final Logger LOGGER = Logger.getLogger(ItemSpawner.class);
private final ItemMetadata itemMetadata;
private final SpawnRule spawnRule;
private final GameManager gameManager;
@@ -58,22 +62,27 @@ public class ItemSpawner extends AetherMudEntity {
@Override
public void run() {
- incTicks();
- if (noTicks >= spawnRule.getSpawnIntervalTicks()) {
- int randomPercentage = spawnRule.getRandomChance();
- int numberOfAttempts = spawnRule.getMaxInstances() - counterNumberInArea();
- for (int i = 0; i < numberOfAttempts; i++) {
- if (random.nextInt(100) < randomPercentage || randomPercentage == 100) {
- if (itemMetadata.getValidTimeOfDays() != null && itemMetadata.getValidTimeOfDays().size() > 0) {
- if (itemMetadata.getValidTimeOfDays().contains(gameManager.getTimeTracker().getTimeOfDay())) {
+ try {
+ incTicks();
+ if (noTicks >= spawnRule.getSpawnIntervalTicks()) {
+ int randomPercentage = spawnRule.getRandomChance();
+ int numberOfAttempts = spawnRule.getMaxInstances() - counterNumberInArea();
+ for (int i = 0; i < numberOfAttempts; i++) {
+ if (random.nextInt(100) < randomPercentage || randomPercentage == 100) {
+ if (itemMetadata.getValidTimeOfDays() != null && itemMetadata.getValidTimeOfDays().size() > 0) {
+ if (itemMetadata.getValidTimeOfDays().contains(gameManager.getTimeTracker().getTimeOfDay())) {
+ createAndAddItem();
+ }
+ } else {
createAndAddItem();
}
- } else {
- createAndAddItem();
}
+ noTicks = 0;
}
- noTicks = 0;
}
+ } catch (Exception e) {
+ LOGGER.error("Problem with item spawner ticker!", e);
+ SentryManager.logSentry(this.getClass(), e, "Problem with item spawner!");
}
}
@@ -81,7 +90,7 @@ public class ItemSpawner extends AetherMudEntity {
ArrayList<Room> rooms = Lists.newArrayList(Iterators.filter(gameManager.getRoomManager().getRoomsByArea(spawnArea).iterator(), getRoomsWithRoom()));
Room room = rooms.get(random.nextInt(rooms.size()));
ItemPojo item = new ItemBuilder().from(itemMetadata).create();
- gameManager.getEntityManager().saveItem(item);
+ ItemData itemData = gameManager.getEntityManager().saveItem(item);
gameManager.placeItemInRoom(room.getRoomId(), item.getItemId());
Main.metrics.counter(MetricRegistry.name(ItemSpawner.class, item.getItemName() + "-spawn")).inc();
}
diff --git a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
index c7450f3460de514d30cf93e5154fd3938113146b..7f28864912688f3c172e0e407273ed2b73d9ff19 100644
--- a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
@@ -32,13 +32,11 @@ public interface AetherMudStorage extends Service {
Map<String, PlayerData> getAllPlayerMetadata();
- void saveItemEntity(ItemPojo item);
+ ItemData saveItem(ItemPojo item);
Optional<ItemData> getItemEntity(String itemId);
void removeItem(String itemId);
- ItemData newItem();
-
void persist();
}
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 848205f9f785b7a4206ef87ae3fb27f47b90022f..4d05d318c37164f22e0d717861fb1330e430d367 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
@@ -21,6 +21,7 @@ import com.syncleus.aethermud.items.ItemPojo;
import com.syncleus.aethermud.storage.AetherMudStorage;
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;
@@ -61,7 +62,7 @@ public class GraphDbAetherMudStorage extends AbstractIdleService implements Aeth
@Override
public Optional<ItemData> getItemEntity(String itemId) {
- return Optional.ofNullable(framedGraph.traverse((g) -> framedGraph.getTypeResolver().hasType(g.V(), ItemData.class)).nextOrDefault(ItemData.class, null));
+ return Optional.ofNullable(framedGraph.traverse((g) -> framedGraph.getTypeResolver().hasType(g.V(), ItemData.class).has("ItemId", itemId)).nextOrDefault(ItemData.class, null));
}
@Override
@@ -79,17 +80,15 @@ public class GraphDbAetherMudStorage extends AbstractIdleService implements Aeth
}
@Override
- public ItemData newItem() {
- return framedGraph.addFramedVertex(ItemData.class);
- }
-
- @Override
- public void saveItemEntity(ItemPojo item) {
+ public ItemData saveItem(ItemPojo item) {
+ ItemData itemData = framedGraph.addFramedVertex(ItemData.class);
try {
- BeanUtils.copyProperties(this.newItem(), item);
- } catch (IllegalAccessException | InvocationTargetException e) {
- throw new IllegalStateException("Could not copy bean", e);
+ PropertyUtils.copyProperties(itemData, item);
+ } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+ throw new IllegalStateException("Could not copy beans", e);
}
+ itemData.setItemTriggers(item.getItemTriggers());
+ return itemData;
}
@Override
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java
index 61ca32f39190c5e51c1c1cf07a6cdc56c2e920fb..51ae99860d7e508884fff437f28fbc46ac4f4ff1 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java
@@ -38,6 +38,10 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
@Property("ValidTimeOfDays")
public abstract Set<TimeTracker.TimeOfDay> getValidTimeOfDays();
+ @Override
+ @Property("ValidTimeOfDays")
+ public abstract void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays);
+
@Override
@Property("Disposable")
public abstract boolean isDisposable();
@@ -82,6 +86,10 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
@Property("ItemTriggers")
public abstract List<String> getItemTriggers();
+ @Override
+ @Property("ItemTriggers")
+ public abstract void setItemTriggers(List<String> itemTriggers);
+
@Override
@Property("RestingName")
public abstract String getRestingName();
@@ -95,22 +103,20 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
public abstract Loot getLoot();
@Override
- public void setEquipment(Equipment equipment) {
- this.traverse((v) -> v.property("Equipment", equipment));
- }
+ @Property("Loot")
+ public abstract void setLoot(Loot loot);
@Override
- @Property("HasBeenWithPlayer")
- public abstract void setHasBeenWithPlayer(boolean hasBeenWithPlayer);
+ @Property("Equipment")
+ public abstract Equipment getEquipment();
@Override
- public void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays) {
- this.traverse((v) -> v.property("ValidTimeOfDays", validTimeOfDays));
- }
+ @Property("Equipment")
+ public abstract void setEquipment(Equipment equipment);
@Override
- @Property("Equipment")
- public abstract Equipment getEquipment();
+ @Property("HasBeenWithPlayer")
+ public abstract void setHasBeenWithPlayer(boolean hasBeenWithPlayer);
@Override
@Property("Rarity")
@@ -121,9 +127,8 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
public abstract int getValueInGold();
@Override
- public void setEffects(Set<Effect> effects) {
- this.traverse((v) -> v.property("Effects", effects));
- }
+ @Property("Effects")
+ public abstract void setEffects(Set<Effect> effects);
@Override
@Property("Effects")
@@ -141,11 +146,6 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
@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);
@@ -154,11 +154,6 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
@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);