From 438c960d8807669cf2d4a02c3deeec10160fc3b9 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Sun, 6 Apr 2014 16:29:31 -0400 Subject: [PATCH] Buffs refactored to use DatatableVisitor on server load Originally, everytime a new Buff instance was created, it would loop through the Datatable Visitor everytime. Now it's only done once on server startup and put into a buffMap. A copy of the base buff is then done through the constructor of Buff class should a new instance of that buff type needs to be created from the one inside the map. --- src/resources/objects/Buff.java | 43 ++++++++++++++++++++----- src/services/BuffService.java | 56 +++++++++++++++++++++++++++++++-- src/services/DevService.java | 3 +- 3 files changed, 91 insertions(+), 11 deletions(-) diff --git a/src/resources/objects/Buff.java b/src/resources/objects/Buff.java index 9a1c70ee..f8fc8dff 100644 --- a/src/resources/objects/Buff.java +++ b/src/resources/objects/Buff.java @@ -71,7 +71,36 @@ public class Buff implements IDelta { private long groupBufferId; private int buffCRC; - public Buff(String buffName, long ownerId) { + public Buff(Buff baseBuff, long ownerId) { + this.buffName = baseBuff.getBuffName(); + this.buffCRC = baseBuff.getBuffCRC(); + this.group1 = baseBuff.getGroup1(); + this.group2 = baseBuff.getGroup2(); + this.priority = baseBuff.getPriority(); + this.duration = baseBuff.getDuration(); + this.effect1Name = baseBuff.getEffect1Name(); + this.effect1Value = baseBuff.getEffect1Value(); + this.effect2Name = baseBuff.getEffect2Name(); + this.effect2Value = baseBuff.getEffect2Value(); + this.effect3Name = baseBuff.getEffect3Name(); + this.effect3Value = baseBuff.getEffect3Value(); + this.effect4Name = baseBuff.getEffect4Name(); + this.effect4Value = baseBuff.getEffect4Value(); + this.effect5Name = baseBuff.getEffect5Name(); + this.effect5Value = baseBuff.getEffect5Value(); + this.callback = baseBuff.getCallback(); + this.particleEffect = baseBuff.getParticleEffect(); + this.isDebuff = baseBuff.isDebuff(); + this.removeOnDeath = baseBuff.isRemoveOnDeath(); + this.isRemovableByPlayer = baseBuff.isRemovableByPlayer(); + this.maxStacks = baseBuff.getMaxStacks(); + this.isPersistent = baseBuff.isPersistent(); + this.removeOnRespec = baseBuff.isRemoveOnRespec(); + this.aiRemoveOnEndCombat = baseBuff.isAiRemoveOnEndCombat(); + this.decayOnPvPDeath = baseBuff.isDecayOnPvPDeath(); + } + + /*public Buff(String buffName, long ownerId) { this.buffName = buffName; this.ownerId = ownerId; @@ -119,12 +148,8 @@ public class Buff implements IDelta { } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } - - + }*/ - - } - public Buff() { } @Override @@ -159,7 +184,7 @@ public class Buff implements IDelta { this.group1 = group1; } - public float getPriority() { + public int getPriority() { return priority; } @@ -454,5 +479,9 @@ public class Buff implements IDelta { public int getBuffCRC() { return buffCRC; } + + public void setBuffCRC(int buffCRC) { + this.buffCRC = buffCRC; + } } diff --git a/src/services/BuffService.java b/src/services/BuffService.java index ff0c51af..97032e4e 100644 --- a/src/services/BuffService.java +++ b/src/services/BuffService.java @@ -22,6 +22,7 @@ package services; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -37,6 +38,9 @@ import resources.objects.creature.CreatureObject; import resources.objects.group.GroupObject; import resources.objects.player.PlayerObject; import main.NGECore; +import engine.clientdata.ClientFileManager; +import engine.clientdata.visitors.DatatableVisitor; +import engine.resources.common.CRC; import engine.resources.objects.SWGObject; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -45,10 +49,13 @@ public class BuffService implements INetworkDispatch { private NGECore core; private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - + private ConcurrentHashMap buffMap = new ConcurrentHashMap(); + public BuffService(NGECore core) { this.core = core; core.commandService.registerCommand("removeBuff"); + + loadBuffs(); } @Override @@ -80,7 +87,7 @@ public class BuffService implements INetworkDispatch { return; }*/ - final Buff buff = new Buff(buffName, buffer.getObjectID()); + Buff buff = buffMap.get(buffName); if(buff.isGroupBuff()) { addGroupBuff(buffer, buffName, buffer); return true; @@ -100,7 +107,7 @@ public class BuffService implements INetworkDispatch { return null; } - final Buff buff = new Buff(buffName, target.getObjectID()); + final Buff buff = new Buff(buffMap.get(buffName), target.getObjectID()); if(target.getSlottedObject("ghost") != null) buff.setTotalPlayTime(((PlayerObject) target.getSlottedObject("ghost")).getTotalPlayTime()); else @@ -311,4 +318,47 @@ public class BuffService implements INetworkDispatch { } } + + private void loadBuffs() { + try { + DatatableVisitor visitor = ClientFileManager.loadFile("datatables/buff/buff.iff", DatatableVisitor.class); + for(int i = 0; i < visitor.getRowCount(); i++) { + Buff buff = new Buff(); + + String name = (String) visitor.getObject(i, 0); + + buff.setBuffName(name); + buff.setBuffCRC(CRC.StringtoCRC(name)); + buff.setGroup1((String) visitor.getObject(i, 1)); + buff.setGroup2((String) visitor.getObject(i, 2)); + buff.setPriority((int) visitor.getObject(i, 4)); + buff.setDuration((Float) visitor.getObject(i, 6)); + buff.setEffect1Name((String) visitor.getObject(i, 7)); + buff.setEffect1Value((Float) visitor.getObject(i, 8)); + buff.setEffect2Name((String) visitor.getObject(i, 9)); + buff.setEffect2Value((Float) visitor.getObject(i, 10)); + buff.setEffect3Name((String) visitor.getObject(i, 11)); + buff.setEffect3Value((Float) visitor.getObject(i, 12)); + buff.setEffect4Name((String) visitor.getObject(i, 13)); + buff.setEffect4Value((Float) visitor.getObject(i, 14)); + buff.setEffect5Name((String) visitor.getObject(i, 15)); + buff.setEffect5Value((Float) visitor.getObject(i, 16)); + buff.setCallback((String) visitor.getObject(i, 18)); + buff.setParticleEffect((String) visitor.getObject(i, 19)); + buff.setDebuff((Boolean) visitor.getObject(i, 22)); + buff.setRemoveOnDeath((Integer) visitor.getObject(i, 25) != 0); + buff.setRemovableByPlayer((Integer) visitor.getObject(i, 26) != 0); + buff.setMaxStacks((Integer) visitor.getObject(i, 28)); + buff.setPersistent((Integer) visitor.getObject(i, 29) != 0); + buff.setRemoveOnRespec((Integer) visitor.getObject(i, 31) != 0); + buff.setAiRemoveOnEndCombat((Integer) visitor.getObject(i, 32) != 0); + buff.setDecayOnPvPDeath((Integer) visitor.getObject(i, 33) != 0); + + buffMap.put(name, buff); + } + + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + } } diff --git a/src/services/DevService.java b/src/services/DevService.java index 16754e29..0cde2b83 100644 --- a/src/services/DevService.java +++ b/src/services/DevService.java @@ -249,6 +249,7 @@ public class DevService implements INetworkDispatch { inventory.add(pistol); + /* == Disabled until Elemental Damage is implemented. == SWGObject heavy = core.objectService.createObject("object/weapon/ranged/heavy/shared_som_lava_cannon_generic.iff", planet); heavy.setIntAttribute("required_combat_level", 90); heavy.setFloatAttribute("cat_wpn_damage.wpn_attack_speed", 1); @@ -256,7 +257,7 @@ public class DevService implements INetworkDispatch { heavy.setStringAttribute("cat_wpn_damage.wpn_damage_type", "Energy"); heavy.setStringAttribute("cat_wpn_damage.damage", "700-1400"); - inventory.add(heavy); + inventory.add(heavy);*/ return; case 40: TangibleObject ring = (TangibleObject) core.objectService.createObject("object/tangible/wearables/ring/shared_ring_s01.iff", planet);