diff --git a/src/main/java/com/syncleus/aethermud/player/Player.java b/src/main/java/com/syncleus/aethermud/player/Player.java index 83c741db3d03d9f0f911dd77856097d8b9ca6682..8569237ce8a21ecfd9e7e352e5a9edb3a0ae6500 100644 --- a/src/main/java/com/syncleus/aethermud/player/Player.java +++ b/src/main/java/com/syncleus/aethermud/player/Player.java @@ -977,7 +977,7 @@ public class Player extends AetherMudEntity { } if (playerData.getEffects() != null) { for (EffectData effect : playerData.getEffects()) { - StatsHelper.combineStats(newStats, StatData.copyStats(effect.getDurationStats())); + StatsHelper.combineStats(newStats, StatData.copyStats(effect.getDurationStatData())); } } return newStats; diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java index c5ad8669a863ad03422dc58b876febb29f2ff5ec..acddb917a69929ccb6691fb6eb1b65fb630a56dd 100644 --- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java +++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java @@ -17,6 +17,7 @@ package com.syncleus.aethermud.storage.graphdb.model; import com.syncleus.aethermud.items.Effect; import com.syncleus.aethermud.stats.Stats; +import com.syncleus.aethermud.storage.graphdb.DataUtils; import com.syncleus.ferma.annotations.Adjacency; import com.syncleus.ferma.annotations.GraphElement; import com.syncleus.ferma.annotations.Property; @@ -25,6 +26,7 @@ import org.apache.commons.beanutils.PropertyUtils; import org.apache.tinkerpop.gremlin.structure.Direction; import java.lang.reflect.InvocationTargetException; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -73,50 +75,37 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame { public abstract void setFrozenMovement(boolean frozenMovement); @Adjacency(label = "ApplyStatsOnTick", direction = Direction.OUT) - public abstract <N extends StatData> Iterator<? extends N> getAllApplyStatsOnTick(Class<? extends N> type); + public abstract <N extends StatData> Iterator<? extends N> getApplyStatOnTickDataIterator(Class<? extends N> type); - public Stats getApplyStatsOnTick() { - Iterator<? extends StatData> allStats = this.getAllApplyStatsOnTick(StatData.class); + public StatData getApplyStatOnTickData() { + Iterator<? extends StatData> allStats = this.getApplyStatOnTickDataIterator(StatData.class); if (allStats.hasNext()) - return StatData.copyStats(allStats.next()); + return allStats.next(); else return null; } @Adjacency(label = "ApplyStatsOnTick", direction = Direction.OUT) - public abstract StatData addApplyStatsOnTick(StatData stats); + public abstract StatData addApplyStatOnTickData(StatData stats); @Adjacency(label = "ApplyStatsOnTick", direction = Direction.OUT) - public abstract void removeApplyStatsOnTick(StatData stats); - - public void setApplyStatsOnTick(Stats stats) { - Iterator<? extends StatData> existingAll = this.getAllApplyStatsOnTick(StatData.class); - if (existingAll != null) { - while (existingAll.hasNext()) { - StatData existing = existingAll.next(); - this.removeApplyStatsOnTick(existing); - existing.remove(); - } - } - if (stats == null) { - this.addApplyStatsOnTick(this.createOrphanStats()); - return; - } + public abstract void removeApplyStatOnTickData(StatData stats); - StatData createdData = this.createOrphanStats(); - try { - PropertyUtils.copyProperties(createdData, stats); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - throw new IllegalStateException("Could not copy properties"); - } - this.addApplyStatsOnTick(createdData); + public void setApplyStatOnTickData(StatData stat) { + DataUtils.setAllElements(Collections.singletonList(stat), () -> this.getApplyStatOnTickDataIterator(StatData.class), applyStat -> this.addApplyStatOnTickData(applyStat), () -> createApplyStatOnTickData() ); + } + + private StatData createApplyStatOnTickData() { + StatData statData = this.createOrphanStats(); + this.addApplyStatOnTickData(statData); + return statData; } @Adjacency(label = "DurationStats", direction = Direction.OUT) - public abstract <N extends StatData> Iterator<? extends N> getAllDurationStats(Class<? extends N> type); + public abstract <N extends StatData> Iterator<? extends N> getDurationStatDataIterator(Class<? extends N> type); - public StatData getDurationStats() { - Iterator<? extends StatData> allStats = this.getAllDurationStats(StatData.class); + public StatData getDurationStatData() { + Iterator<? extends StatData> allStats = this.getDurationStatDataIterator(StatData.class); if (allStats.hasNext()) return allStats.next(); else @@ -124,36 +113,23 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame { } @Adjacency(label = "DurationStats", direction = Direction.OUT) - public abstract StatData addDurationStats(StatData stats); + public abstract StatData addDurationStatData(StatData stats); @Adjacency(label = "DurationStats", direction = Direction.OUT) - public abstract void removeDurationStats(StatData stats); - - public void setDurationStats(Stats stats) { - Iterator<? extends StatData> existingAll = this.getAllDurationStats(StatData.class); - if (existingAll != null) { - while (existingAll.hasNext()) { - StatData existing = existingAll.next(); - this.removeDurationStats(existing); - existing.remove(); - } - } - if (stats == null) { - this.addApplyStatsOnTick(this.createOrphanStats()); - return; - } + public abstract void removeDurationStatData(StatData stats); - StatData createdData = this.createOrphanStats(); - try { - PropertyUtils.copyProperties(createdData, stats); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - throw new IllegalStateException("Could not copy properties"); - } - this.addDurationStats(createdData); + public void setDurationStatData(StatData stat) { + DataUtils.setAllElements(Collections.singletonList(stat), () -> this.getDurationStatDataIterator(StatData.class), durationStat -> this.addDurationStatData(durationStat), () -> createDurationStatData() ); + } + + private StatData createDurationStatData() { + StatData statData = this.createOrphanStats(); + this.addDurationStatData(statData); + return statData; } private StatData createOrphanStats() { - if (this.getDurationStats() != null) + if (this.getDurationStatData() != null) throw new IllegalStateException("Already has stats, can't create another"); final StatData stats = this.getGraph().addFramedVertex(StatData.class); stats.setAgile(0); @@ -180,8 +156,8 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame { public static void copyEffect(EffectData dest, Effect src) { try { PropertyUtils.copyProperties(dest, src); - dest.setApplyStatsOnTick(src.getApplyStatsOnTick()); - dest.setDurationStats(src.getDurationStats()); + StatData.copyStats(dest.createApplyStatOnTickData(), src.getApplyStatsOnTick()); + StatData.copyStats(dest.createDurationStatData(), src.getDurationStats()); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { throw new IllegalStateException("Could not copy properties", e); } @@ -191,12 +167,10 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame { Effect retVal = new Effect(); try { PropertyUtils.copyProperties(retVal, src); - Stats durationStats = new Stats(); - PropertyUtils.copyProperties(durationStats, src.getDurationStats()); - retVal.setDurationStats(durationStats); - Stats applyStats = new Stats(); - PropertyUtils.copyProperties(applyStats, src.getApplyStatsOnTick()); - retVal.setApplyStatsOnTick(applyStats); + + retVal.setDurationStats(StatData.copyStats(src.getDurationStatData())); + retVal.setApplyStatsOnTick(StatData.copyStats(src.getApplyStatOnTickData())); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { throw new IllegalStateException("Could not copy properties", e); }