diff --git a/src/resources/objects/weapon/WeaponMessageBuilder.java b/src/resources/objects/weapon/WeaponMessageBuilder.java index a67444cd..03377c62 100644 --- a/src/resources/objects/weapon/WeaponMessageBuilder.java +++ b/src/resources/objects/weapon/WeaponMessageBuilder.java @@ -21,14 +21,10 @@ ******************************************************************************/ package resources.objects.weapon; -import java.nio.ByteOrder; import java.util.Map; -import org.apache.mina.core.buffer.IoBuffer; - import engine.resources.objects.Builder; import resources.objects.tangible.TangibleMessageBuilder; -import resources.datatables.Elemental; public class WeaponMessageBuilder extends TangibleMessageBuilder { @@ -40,105 +36,6 @@ public class WeaponMessageBuilder extends TangibleMessageBuilder { super(); } - public IoBuffer buildBaseline3() { - WeaponObject weapon = (WeaponObject) object; - IoBuffer buffer = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.setAutoExpand(true); - buffer.putShort((short) 0x14); - buffer.putFloat(0); - buffer.put(getAsciiString(weapon.getStfFilename())); - buffer.putInt(0); - buffer.put(getAsciiString(weapon.getStfName())); - if(weapon.getCustomName() == null || weapon.getCustomName().length() < 1) - buffer.putInt(0); - else - buffer.put(getUnicodeString(weapon.getCustomName())); - buffer.putInt(object.getVolume()); - buffer.putInt(0); - buffer.putInt(0); // unknowns - if(weapon.getCustomization() == null || weapon.getCustomization().length < 1) - buffer.putShort((short) 0); - else { - buffer.putShort((short) weapon.getCustomization().length); - buffer.put(weapon.getCustomization()); - } - buffer.putInt(0); - buffer.putInt(0); - buffer.putInt(weapon.getOptionsBitmask()); - buffer.putInt(0); - buffer.putInt(weapon.getConditionDamage()); - buffer.putInt(0x64); - buffer.put((byte) (weapon.isStaticObject() ? 1 : 0)); - buffer.putFloat(weapon.getAttackSpeed()); - buffer.putInt(0); - buffer.putInt(0); - buffer.putFloat(weapon.getMaxRange()); - buffer.putInt(0); - if( weapon.getElementalType() != null) // Weapon particle effect - buffer.putInt(Elemental.getElementalNum(weapon.getElementalType())); - else - buffer.putInt(Elemental.getElementalNum(weapon.getDamageType())); - buffer.putInt(0); - - int size = buffer.position(); - buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size); - - buffer.flip(); - buffer = createBaseline("WEAO", (byte) 3, buffer, size); - - return buffer; - } - - public IoBuffer buildBaseline6() { - WeaponObject weapon = (WeaponObject) object; - IoBuffer buffer = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.setAutoExpand(true); - buffer.putShort((short) 9); - buffer.putInt(0x43); - buffer.put(getAsciiString(weapon.getDetailFilename())); - buffer.putInt(0); - buffer.put(getAsciiString(weapon.getDetailName())); - buffer.put((byte) 0); - buffer.putLong(0); - buffer.putInt(0); - buffer.putLong(0); - buffer.putLong(0); // unks - buffer.putLong(0); - buffer.putInt(weapon.getWeaponType()); - - int size = buffer.position(); - buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size); - - buffer.flip(); - buffer = createBaseline("WEAO", (byte) 6, buffer, size); - - return buffer; - } - - public IoBuffer buildBaseline8() { - IoBuffer buffer = bufferPool.allocate(2, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putShort((short) 0); - int size = buffer.position(); - buffer = IoBuffer.allocate(size).put(buffer.array(), 0, size); - - buffer.flip(); - buffer = createBaseline("WEAO", (byte) 8, buffer, size); - - return buffer; - } - - public IoBuffer buildBaseline9() { - IoBuffer buffer = bufferPool.allocate(2, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putShort((short) 0); - int size = buffer.position(); - buffer = IoBuffer.allocate(size).put(buffer.array(), 0, size); - - buffer.flip(); - buffer = createBaseline("WEAO", (byte) 9, buffer, size); - - return buffer; - } - @Override public void buildBaseline3(Map baselineBuilders, Map deltaBuilders) { super.buildBaseline3(baselineBuilders, deltaBuilders); diff --git a/src/resources/objects/weapon/WeaponObject.java b/src/resources/objects/weapon/WeaponObject.java index a06010ec..4f7402b6 100644 --- a/src/resources/objects/weapon/WeaponObject.java +++ b/src/resources/objects/weapon/WeaponObject.java @@ -22,13 +22,13 @@ package resources.objects.weapon; import java.io.Serializable; -import java.util.Vector; +import org.apache.mina.core.buffer.IoBuffer; + +import engine.resources.objects.Baseline; +import resources.datatables.Elemental; import resources.datatables.WeaponType; import resources.objects.tangible.TangibleObject; - -import com.sleepycat.persist.model.NotPersistent; - import engine.clients.Client; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; @@ -37,36 +37,115 @@ import engine.resources.scene.Quaternion; public class WeaponObject extends TangibleObject implements Serializable { private static final long serialVersionUID = 1L; - - // TODO: Thread safety - @NotPersistent private transient WeaponMessageBuilder messageBuilder; public WeaponObject(long objectID, Planet planet, String template) { super(objectID, planet, new Point3D(0, 0, 0), new Quaternion(1, 0, 1, 0), template); - messageBuilder = new WeaponMessageBuilder(this); if (this.getClass().getSimpleName().equals("WeaponObject")) setIntAttribute("volume", 1); setStringAttribute("cat_wpn_damage.damage", "0-0"); } - + public WeaponObject(long objectID, Planet planet, Point3D position, Quaternion orientation, String template) { super(objectID, planet, position, orientation, template); - messageBuilder = new WeaponMessageBuilder(this); if (this.getClass().getSimpleName().equals("WeaponObject")) setIntAttribute("volume", 1); setStringAttribute("cat_wpn_damage.damage", "0-0"); } public WeaponObject() { super(); - messageBuilder = new WeaponMessageBuilder(this); + } + + public void initAfterDBLoad() { + super.initAfterDBLoad(); } @Override - public void initAfterDBLoad() { - super.init(); - messageBuilder = new WeaponMessageBuilder(this); - defendersList = new Vector(); + public Baseline getOtherVariables() { + Baseline baseline = super.getOtherVariables(); + return baseline; + } + + @Override + public Baseline getBaseline3() { + Baseline baseline = super.getBaseline3(); + baseline.put("attackSpeed", (float) 0); + baseline.put("14", 0); + baseline.put("15", 0); + baseline.put("maxRange", (float) 0); + baseline.put("17", 0); // Could be lightsaber color? Seen as 2 on a saber + baseline.put("weaponParticleEffect", 0); + baseline.put("19", 0); // something to do with particle color + return baseline; + } + + @Override + public Baseline getBaseline6() { + Baseline baseline = super.getBaseline6(); + baseline.put("weaponType", 6); + return baseline; + } + + @Override + public Baseline getBaseline8() { + Baseline baseline = super.getBaseline8(); + return baseline; + } + + @Override + public Baseline getBaseline9() { + Baseline baseline = super.getBaseline9(); + return baseline; + } + + public float getAttackSpeed() { + return (float) getBaseline(3).get("attackSpeed"); + } + + public void setAttackSpeed(float attackSpeed) { + if ((int) attackSpeed != attackSpeed) { + setFloatAttribute("cat_wpn_damage.wpn_attack_speed", attackSpeed); + } else { + setIntAttribute("cat_wpn_damage.wpn_attack_speed", (int) attackSpeed); + } + + setIntAttribute("cat_wpn_damage.dps", getDamagePerSecond()); + notifyClients(getBaseline(3).set("attackSpeed", attackSpeed), false); + } + + public float getMaxRange() { + return (float) getBaseline(3).get("maxRange"); + } + + public void setMaxRange(float maxRange) { + if ((int) maxRange != maxRange) { + setStringAttribute("cat_wpn_damage.wpn_range", "0-" + String.valueOf(maxRange) + "m"); + } else { + setStringAttribute("cat_wpn_damage.wpn_range", "0-" + String.valueOf((int) maxRange) + "m"); + } + + notifyClients(getBaseline(3).set("maxRange", maxRange), false); + } + + public int getWeaponParticleEffect() { + return (int) getBaseline(3).get("weaponParticleEffect"); + } + + public void setWeaponParticleEffect(int weaponParticleEffect) { + notifyClients(getBaseline(3).set("weaponParticleEffect", weaponParticleEffect), false); + } + + public int getWeaponType() { + if (getStringAttribute("cat_wpn_damage.wpn_category") == null) { + System.err.println("Error: Weapon Type not defined for " + getTemplate()); + } + + return (int) getBaseline(6).get("weaponType"); + } + + public void setWeaponType(int weaponType) { + setStringAttribute("cat_wpn_damage.wpn_category", "@obj_attr_n:wpn_category_" + weaponType); + notifyClients(getBaseline(6).set("weaponType", weaponType), false); } public int getMaxDamage() { @@ -81,9 +160,8 @@ public class WeaponObject extends TangibleObject implements Serializable { public int getMinDamage() { return Integer.parseInt(getStringAttribute("cat_wpn_damage.damage").split("-")[0]); } - + public void setMinDamage(int minDamage) { - setStringAttribute("cat_wpn_damage.damage", String.valueOf(minDamage) + "-" + String.valueOf(getMaxDamage())); setIntAttribute("cat_wpn_damage.dps", getDamagePerSecond()); } @@ -91,20 +169,23 @@ public class WeaponObject extends TangibleObject implements Serializable { public int getElementalDamage() { return getIntAttribute("cat_wpn_damage.wpn_elemental_value"); } - + public void setElementalDamage(int elementalDamage) { setIntAttribute("cat_wpn_damage.wpn_elemental_value", elementalDamage); setIntAttribute("cat_wpn_damage.dps", getDamagePerSecond()); } - + public String getElementalType() { - if (getStringAttribute("cat_wpn_damage.wpn_elemental_type") != null ) + if (getStringAttribute("cat_wpn_damage.wpn_elemental_type") != null) { return getStringAttribute("cat_wpn_damage.wpn_elemental_type").replace("@obj_attr_n:elemental_", ""); + } + return null; } public void setElementalType(String elementalType) { setStringAttribute("cat_wpn_damage.wpn_elemental_type", "@obj_attr_n:elemental_" + elementalType); + setWeaponParticleEffect(Elemental.getElementalNum(getElementalType())); } public String getDamageType() { @@ -113,93 +194,70 @@ public class WeaponObject extends TangibleObject implements Serializable { public void setDamageType(String damageType) { setStringAttribute("cat_wpn_damage.wpn_damage_type", "@obj_attr_n:armor_eff_" + damageType); + setWeaponParticleEffect(Elemental.getElementalNum(getDamageType())); } public int getDamagePerSecond() { - if(getAttributes().containsKey("cat_wpn_damage.damage") && getAttributes().containsKey("cat_wpn_damage.wpn_attack_speed")) { - - if (getElementalType() != null ) + if (getAttributes().containsKey("cat_wpn_damage.damage") && getAttributes().containsKey("cat_wpn_damage.wpn_attack_speed")) { + if (getElementalType() != null) { return (int) (((getMaxDamage() + getElementalDamage() + getMinDamage() + getElementalDamage()) / 2 + getElementalDamage()) * (1 / getAttackSpeed())); - else + } else { return (int) (((getMaxDamage() + getMinDamage()) / 2 ) * (1 / getAttackSpeed())); - } else - return 0; - } - - public int getWeaponType() { - if (getStringAttribute("cat_wpn_damage.wpn_category") == null) { - System.err.println("Error: Weapon Type not defined for " + getTemplate()); - return 6; + } + } else { + return 0; } - - return Integer.parseInt(getStringAttribute("cat_wpn_damage.wpn_category").replace("@obj_attr_n:wpn_category_", "")); } - public void setWeaponType(int weaponType) { - setStringAttribute("cat_wpn_damage.wpn_category", "@obj_attr_n:wpn_category_" + weaponType); - } - - @Override - public void sendBaselines(Client destination) { - - if(destination == null || destination.getSession() == null) - return; - - destination.getSession().write(messageBuilder.buildBaseline3()); - destination.getSession().write(messageBuilder.buildBaseline6()); - destination.getSession().write(messageBuilder.buildBaseline8()); - destination.getSession().write(messageBuilder.buildBaseline9()); - - - } - - public float getAttackSpeed() { - return getFloatAttribute("cat_wpn_damage.wpn_attack_speed"); - } - - public void setAttackSpeed(float attackSpeed) { - if((int) attackSpeed != attackSpeed) - setFloatAttribute("cat_wpn_damage.wpn_attack_speed", attackSpeed); - else - setIntAttribute("cat_wpn_damage.wpn_attack_speed", (int) attackSpeed); - - setIntAttribute("cat_wpn_damage.dps", getDamagePerSecond()); - } - - public WeaponMessageBuilder getMessageBuilder() { - return messageBuilder; - } - - public float getMaxRange() { - return Float.parseFloat(getStringAttribute("cat_wpn_damage.wpn_range").replace("0-", "").replace("m", "")); - } - - public void setMaxRange(float maxRange) { - if((int) maxRange != maxRange) - setStringAttribute("cat_wpn_damage.wpn_range", "0-" + String.valueOf(maxRange) + "m"); - else - setStringAttribute("cat_wpn_damage.wpn_range", "0-" + String.valueOf((int) maxRange) + "m"); - } - public boolean isMelee() { - int weaponType = getWeaponType(); - if(weaponType == WeaponType.ONEHANDEDMELEE || weaponType == WeaponType.TWOHANDEDMELEE || weaponType == WeaponType.UNARMED || weaponType == WeaponType.POLEARMMELEE || weaponType == WeaponType.ONEHANDEDSABER || weaponType == WeaponType.TWOHANDEDSABER || weaponType == WeaponType.POLEARMSABER) + if (weaponType == WeaponType.ONEHANDEDMELEE || weaponType == WeaponType.TWOHANDEDMELEE || weaponType == WeaponType.UNARMED || weaponType == WeaponType.POLEARMMELEE || weaponType == WeaponType.ONEHANDEDSABER || weaponType == WeaponType.TWOHANDEDSABER || weaponType == WeaponType.POLEARMSABER) { return true; + } return false; - } public boolean isRanged() { - int weaponType = getWeaponType(); - if(weaponType == WeaponType.RIFLE || weaponType == WeaponType.CARBINE || weaponType == WeaponType.PISTOL || weaponType == WeaponType.FLAMETHROWER || weaponType == WeaponType.HEAVYWEAPON) + if (weaponType == WeaponType.RIFLE || weaponType == WeaponType.CARBINE || weaponType == WeaponType.PISTOL || weaponType == WeaponType.FLAMETHROWER || weaponType == WeaponType.HEAVYWEAPON) { return true; - + } + return false; - } + + @Override + public void notifyClients(IoBuffer buffer, boolean notifySelf) { + notifyObservers(buffer, notifySelf); + } + + @Override + public WeaponMessageBuilder getMessageBuilder() { + synchronized(objectMutex) { + if (messageBuilder == null) { + messageBuilder = new WeaponMessageBuilder(this); + } + + return messageBuilder; + } + } + + @Override + public void sendBaselines(Client destination) { + if (destination != null && destination.getSession() != null) { + destination.getSession().write(getBaseline(3).getBaseline()); + destination.getSession().write(getBaseline(6).getBaseline()); + + Client parent = ((getGrandparent() == null) ? null : getGrandparent().getClient()); + + if (parent != null && destination == parent) { + destination.getSession().write(getBaseline(8).getBaseline()); + destination.getSession().write(getBaseline(9).getBaseline()); + } + } + } + }