From 2d36c55f5c388dc7bfa86f45400c8e6e7b91e64c Mon Sep 17 00:00:00 2001 From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com> Date: Mon, 11 Sep 2017 15:18:36 -0400 Subject: [PATCH] refactor: made equipment an adjacency. --- .../storage/graphdb/model/EquipmentData.java | 99 +++++++++++++++++++ .../storage/graphdb/model/ItemData.java | 40 ++++++-- 2 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java new file mode 100644 index 00000000..67d2cc50 --- /dev/null +++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java @@ -0,0 +1,99 @@ +/** + * 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.model; + +import com.syncleus.aethermud.items.Equipment; +import com.syncleus.aethermud.items.EquipmentSlotType; +import com.syncleus.aethermud.storage.graphdb.DataUtils; +import com.syncleus.ferma.AbstractVertexFrame; +import com.syncleus.ferma.annotations.Adjacency; +import com.syncleus.ferma.annotations.GraphElement; +import com.syncleus.ferma.annotations.Property; +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; + +@GraphElement +public abstract class EquipmentData extends AbstractVertexFrame { + @Property("EquipmentSlotType") + public abstract void setEquipmentSlotType(EquipmentSlotType slotType); + + @Property("EquipmentSlotType") + public abstract EquipmentSlotType getEquipmentSlotType(); + + @Adjacency(label = "stats", direction = Direction.OUT) + public abstract <N extends StatData> Iterator<? extends N> getStatDataIterator(Class<? extends N> type); + + public StatData getStatData() { + Iterator<? extends StatData> allStats = this.getStatDataIterator(StatData.class); + if( allStats.hasNext() ) + return allStats.next(); + else + return null; + } + + @Adjacency(label = "stats", direction = Direction.OUT) + public abstract StatData addStatData(StatData stats); + + @Adjacency(label = "stats", direction = Direction.OUT) + public abstract void removeStatData(StatData stats); + + public void setStatsData(StatData stats) { + DataUtils.setAllElements(Collections.singletonList(stats), () -> this.getStatDataIterator(StatData.class), statsData -> this.addStatData(statsData), () -> createStatData() ); + } + + public StatData createStatData() { + if( this.getStatData() != null ) + throw new IllegalStateException("Already has stats, can't create another"); + final StatData stats = this.getGraph().addFramedVertex(StatData.class); + stats.setAgile(0); + stats.setAim(0); + stats.setArmorRating(0); + stats.setCurrentHealth(0); + stats.setCurrentMana(0); + stats.setExperience(0); + stats.setForaging(0); + stats.setIntelligence(0); + stats.setInventorySize(0); + stats.setMaxEffects(0); + stats.setMaxHealth(0); + stats.setMaxMana(0); + stats.setMeleeSkill(0); + stats.setNumberOfWeaponRolls(0); + stats.setStrength(0); + stats.setWeaponRatingMax(0); + stats.setWeaponRatingMin(0); + stats.setWillpower(0); + this.addStatData(stats); + return stats; + } + + public static void copyEquipment(EquipmentData dest, Equipment src) { + try { + PropertyUtils.copyProperties(dest, src); + StatData.copyStats(dest.getStatData(), src.getStats()); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + throw new IllegalStateException("Could not copy properties", e); + } + } + + public static Equipment copyEquipment(EquipmentData src) { + return new Equipment(src.getEquipmentSlotType(), StatData.copyStats(src.getStatData())); + } +} diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java index 94777f74..6db2519c 100644 --- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java +++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java @@ -82,12 +82,6 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame { @Property("ItemHalfLifeTicks") public abstract int getItemHalfLifeTicks(); - @Property("Equipment") - public abstract Equipment getEquipment(); - - @Property("Equipment") - public abstract void setEquipment(Equipment equipment); - @Property("HasBeenWithPlayer") public abstract void setHasBeenWithPlayer(boolean hasBeenWithPlayer); @@ -130,6 +124,35 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame { @Property("HasBeenWithPlayer") public abstract boolean isHasBeenWithPlayer(); + @Adjacency(label = "Equipment", direction = Direction.OUT) + public abstract <N extends EquipmentData> Iterator<? extends N> getEquipmentDataIterator(Class<? extends N> type); + + public EquipmentData getEquipmentData() { + Iterator<? extends EquipmentData> allEquipment = this.getEquipmentDataIterator(EquipmentData.class); + if( allEquipment.hasNext() ) + return allEquipment.next(); + else + return null; + } + + @Adjacency(label = "Equipment", direction = Direction.OUT) + public abstract EquipmentData addEquipmentData(EquipmentData equipment); + + @Adjacency(label = "Equipment", direction = Direction.OUT) + public abstract void removeEquipmentData(EquipmentData equipment); + + public void setEquipmentData(EquipmentData equipment) { + DataUtils.setAllElements(Collections.singletonList(equipment), () -> this.getEquipmentDataIterator(EquipmentData.class), equipmentData -> this.addEquipmentData(equipmentData), () -> createEquipmentData() ); + } + + public EquipmentData createEquipmentData() { + if( this.getEquipmentData() != null ) + throw new IllegalStateException("Already has stats, can't create another"); + final EquipmentData equipment = this.getGraph().addFramedVertex(EquipmentData.class); + this.addEquipmentData(equipment); + return equipment; + } + @Adjacency(label = "Effect", direction = Direction.OUT) public abstract EffectData addEffectData(EffectData effects); @@ -236,6 +259,7 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame { PropertyUtils.copyProperties(dest, src); StatData.copyStats(dest.createItemApplyStatData(), src.getItemApplyStats()); LootData.copyLoot(dest.createLoottData(), src.getLoot()); + EquipmentData.copyEquipment(dest.createEquipmentData(), src.getEquipment()); for(Effect effect : src.getEffects()) EffectData.copyEffect(dest.createEffectData(), effect); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { @@ -248,6 +272,10 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame { try { PropertyUtils.copyProperties(retVal, src); + EquipmentData equipmentData = src.getEquipmentData(); + if(equipmentData != null) + retVal.setEquipment(EquipmentData.copyEquipment(equipmentData)); + LootData lootData = src.getLootData(); if(lootData != null) retVal.setLoot(LootData.copyLoot(lootData)); -- GitLab