diff --git a/src/resources/objects/weapon/WeaponMessageBuilder.java b/src/resources/objects/weapon/WeaponMessageBuilder.java index 03377c62..a67444cd 100644 --- a/src/resources/objects/weapon/WeaponMessageBuilder.java +++ b/src/resources/objects/weapon/WeaponMessageBuilder.java @@ -21,10 +21,14 @@ ******************************************************************************/ 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 { @@ -36,6 +40,105 @@ 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 4f7402b6..a06010ec 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,115 +37,36 @@ 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); } + @Override public void initAfterDBLoad() { - super.initAfterDBLoad(); - } - - @Override - 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); + super.init(); + messageBuilder = new WeaponMessageBuilder(this); + defendersList = new Vector(); } public int getMaxDamage() { @@ -160,8 +81,9 @@ 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()); } @@ -169,23 +91,20 @@ 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() { @@ -194,70 +113,93 @@ 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; + } 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; } + + 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()); - } - } - } - }