From 628f73fe63ca44d4189abb31b3b98cad5ce1a04d Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com>
Date: Sun, 3 Sep 2017 19:02:23 -0400
Subject: [PATCH] fix: fixed item effects (I think).

---
 .../com/syncleus/aethermud/items/Item.java    |  4 +-
 .../syncleus/aethermud/items/ItemBuilder.java |  7 +-
 .../syncleus/aethermud/items/ItemPojo.java    |  8 +--
 .../aethermud/storage/graphdb/ItemData.java   | 65 +++++++++++++++----
 4 files changed, 63 insertions(+), 21 deletions(-)

diff --git a/src/main/java/com/syncleus/aethermud/items/Item.java b/src/main/java/com/syncleus/aethermud/items/Item.java
index 3ea5f860..7a146b20 100644
--- a/src/main/java/com/syncleus/aethermud/items/Item.java
+++ b/src/main/java/com/syncleus/aethermud/items/Item.java
@@ -70,9 +70,9 @@ public interface Item {
 
     int getValueInGold();
 
-    void setEffects(Set<EffectPojo> effects);
+    void setEffects(Set<Effect> effects);
 
-    Set<EffectPojo> getEffects();
+    Set<Effect> getEffects();
 
     void setItemName(String itemName);
 
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
index 013e931c..0184646b 100644
--- a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
+++ b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
@@ -40,7 +40,7 @@ public class ItemBuilder {
     private Equipment equipment;
     private Rarity rarity;
     private int valueInGold;
-    private Set<EffectPojo> effects;
+    private Set<Effect> effects;
     private boolean hasBeenWithPlayer;
     private int maxUses;
     private boolean isDisposable;
@@ -65,7 +65,8 @@ public class ItemBuilder {
         this.isDisposable = itemMetadata.isDisposable();
         this.equipment = itemMetadata.getEquipment();
         this.validTimeOfDays = itemMetadata.getValidTimeOfDays();
-        this.effects = itemMetadata.getEffects();
+        Set<EffectPojo> effects = itemMetadata.getEffects();
+        this.effects = (effects != null ? Sets.newHashSet(itemMetadata.getEffects()) : null );
         this.itemApplyStats = itemMetadata.getItemApplyStats();
         return this;
     }
@@ -160,7 +161,7 @@ public class ItemBuilder {
         return this;
     }
 
-    public ItemBuilder effects(Set<EffectPojo> effects) {
+    public ItemBuilder effects(Set<Effect> effects) {
         this.effects = effects;
         return this;
     }
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemPojo.java b/src/main/java/com/syncleus/aethermud/items/ItemPojo.java
index 5c5122ef..e6eb897a 100644
--- a/src/main/java/com/syncleus/aethermud/items/ItemPojo.java
+++ b/src/main/java/com/syncleus/aethermud/items/ItemPojo.java
@@ -40,7 +40,7 @@ public class ItemPojo implements Serializable, Item {
     private Equipment equipment;
     private Rarity rarity;
     private int valueInGold;
-    private Set<EffectPojo> effects;
+    private Set<Effect> effects;
     private boolean hasBeenWithPlayer;
     private int maxUses;
     private boolean isDisposable;
@@ -49,7 +49,7 @@ public class ItemPojo implements Serializable, Item {
 
     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<EffectPojo> effects, boolean hasBeenWithPlayer, int maxUses, boolean isDisposable, Set<TimeTracker.TimeOfDay> validTimeOfDays, Stats itemApplyStats) {
+    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;
@@ -191,12 +191,12 @@ public class ItemPojo implements Serializable, Item {
     }
 
     @Override
-    public void setEffects(Set<EffectPojo> effects) {
+    public void setEffects(Set<Effect> effects) {
         this.effects = effects;
     }
 
     @Override
-    public Set<EffectPojo> getEffects() {
+    public Set<Effect> getEffects() {
         return effects;
     }
 
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 5366297b..cafc92e0 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java
@@ -15,6 +15,7 @@
  */
 package com.syncleus.aethermud.storage.graphdb;
 
+import com.google.common.collect.Sets;
 import com.syncleus.aethermud.core.service.TimeTracker;
 import com.syncleus.aethermud.items.*;
 import com.syncleus.aethermud.stats.Stats;
@@ -126,14 +127,6 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
     @Property("ValueInGold")
     public abstract int getValueInGold();
 
-    @Override
-    @Property("Effects")
-    public abstract void setEffects(Set<EffectPojo> effects);
-
-    @Override
-    @Property("Effects")
-    public abstract Set<EffectPojo> getEffects();
-
     @Override
     @Property("ItemName")
     public abstract void setItemName(String itemName);
@@ -179,7 +172,56 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
     @Property("HasBeenWithPlayer")
     public abstract boolean isHasBeenWithPlayer();
 
-    @Adjacency(label = "Stats", direction = Direction.OUT)
+    @Adjacency(label = "Effects", direction = Direction.OUT)
+    public abstract EffectData addEffect(EffectData effects);
+
+    @Adjacency(label = "Effects", direction = Direction.OUT)
+    public abstract void removeEffect(EffectData stats);
+
+    @Adjacency(label = "Effects", direction = Direction.OUT)
+    public abstract <N extends EffectData> Iterator<? extends N> getEffects(Class<? extends N> type);
+
+    @Override
+    public Set<Effect> getEffects() {
+        return Sets.newHashSet(this.getEffects(EffectData.class));
+    }
+
+    @Override
+    public void setEffects(Set<Effect> effects) {
+        Iterator<? extends EffectData> existingAll = this.getEffects(EffectData.class);
+        if( existingAll != null ) {
+            while( existingAll.hasNext() ) {
+                EffectData existing = existingAll.next();
+                this.removeEffect(existing);
+                existing.remove();
+            }
+
+        }
+
+        if( effects == null || effects.size() == 0 ) {
+            return;
+        }
+
+        for( Effect effect : effects ) {
+            if (effect instanceof EffectData) {
+                this.addEffect((EffectData) effect);
+            } else {
+                try {
+                    PropertyUtils.copyProperties(this.createEffect(), effect);
+                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+                    throw new IllegalStateException("Could not copy properties");
+                }
+            }
+        }
+    }
+
+    public EffectData createEffect() {
+        final EffectData effect = this.getGraph().addFramedVertex(EffectData.class);
+        this.addEffect(effect);
+        return effect;
+    }
+
+    @Adjacency(label = "ItemApplyStats", direction = Direction.OUT)
     public abstract <N extends StatsData> Iterator<? extends N> getAllItemApplyStats(Class<? extends N> type);
 
     public Stats getItemApplyStats() {
@@ -190,10 +232,10 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
             return null;
     }
 
-    @Adjacency(label = "Stats", direction = Direction.OUT)
+    @Adjacency(label = "ItemApplyStats", direction = Direction.OUT)
     public abstract StatsData addStats(StatsData stats);
 
-    @Adjacency(label = "Stats", direction = Direction.OUT)
+    @Adjacency(label = "ItemApplyStats", direction = Direction.OUT)
     public abstract void removeStats(StatsData stats);
 
     public void setItemApplyStats(Stats stats) {
@@ -212,7 +254,6 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
             return;
         }
 
-        StatsData statsData;
         if( stats instanceof StatsData ) {
             this.addStats((StatsData) stats);
         }
-- 
GitLab