From e38e7f3040ccfff82c6acc994c3c35511bbfa56d Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Tue, 3 Jul 2018 22:06:13 +0200 Subject: [PATCH] Fixed combat crashes --- .../swg/zone/guild/GuildRequestMessage.java | 64 ----- .../combat/CombatAction.java | 39 +-- .../object_controller/combat/CombatSpam.java | 238 +++++------------- 3 files changed, 65 insertions(+), 276 deletions(-) delete mode 100644 src/main/java/com/projectswg/common/network/packets/swg/zone/guild/GuildRequestMessage.java diff --git a/src/main/java/com/projectswg/common/network/packets/swg/zone/guild/GuildRequestMessage.java b/src/main/java/com/projectswg/common/network/packets/swg/zone/guild/GuildRequestMessage.java deleted file mode 100644 index 0e32c3d..0000000 --- a/src/main/java/com/projectswg/common/network/packets/swg/zone/guild/GuildRequestMessage.java +++ /dev/null @@ -1,64 +0,0 @@ -/*********************************************************************************** - * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * - * * - * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * - * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * - * Our goal is to create an emulator which will provide a server for players to * - * continue playing a game similar to the one they used to play. We are basing * - * it on the final publish of the game prior to end-game events. * - * * - * This file is part of Holocore. * - * * - * -------------------------------------------------------------------------------- * - * * - * Holocore is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Affero General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * Holocore is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU Affero General Public License for more details. * - * * - * You should have received a copy of the GNU Affero General Public License * - * along with Holocore. If not, see . * - * * - ***********************************************************************************/ -package com.projectswg.common.network.packets.swg.zone.guild; - -import com.projectswg.common.network.NetBuffer; -import com.projectswg.common.network.packets.SWGPacket; - -public class GuildRequestMessage extends SWGPacket { - - public static final int CRC = getCrc("GuildRequestMessage"); - - private long objectId; - - public GuildRequestMessage() { - - } - - @Override - public void decode(NetBuffer data) { - if (!super.checkDecode(data, CRC)) - return; - - objectId = data.getLong(); - } - - @Override - public NetBuffer encode() { - int length = 14; - NetBuffer data = NetBuffer.allocate(length); - data.addShort(2); - data.addInt(CRC); - data.addLong(objectId); - return data; - } - - public long getObjectId() { - return objectId; - } -} \ No newline at end of file diff --git a/src/main/java/com/projectswg/common/network/packets/swg/zone/object_controller/combat/CombatAction.java b/src/main/java/com/projectswg/common/network/packets/swg/zone/object_controller/combat/CombatAction.java index 2454a60..317015a 100644 --- a/src/main/java/com/projectswg/common/network/packets/swg/zone/object_controller/combat/CombatAction.java +++ b/src/main/java/com/projectswg/common/network/packets/swg/zone/object_controller/combat/CombatAction.java @@ -44,12 +44,9 @@ public class CombatAction extends ObjectController { private long attackerId; private long weaponId; private Posture posture; - private Point3D position; - private long cell; private TrailLocation trail; private byte clientEffectId; private int commandCrc; - private boolean useLocation; private Set defenders; public CombatAction(long objectId) { @@ -73,11 +70,6 @@ public class CombatAction extends ObjectController { trail = TrailLocation.getTrailLocation(data.getByte()); clientEffectId = data.getByte(); commandCrc = data.getInt(); - useLocation = data.getBoolean(); - if (useLocation) { - position = data.getEncodable(Point3D.class); - cell = data.getLong(); - } int count = data.getShort(); for (int i = 0; i < count; i++) { Defender d = new Defender(); @@ -93,7 +85,7 @@ public class CombatAction extends ObjectController { @Override public NetBuffer encode() { - NetBuffer data = NetBuffer.allocate(HEADER_LENGTH + 30 + defenders.size() * 14 + (useLocation ? 20 : 0)); + NetBuffer data = NetBuffer.allocate(HEADER_LENGTH + 29 + defenders.size() * 14); encodeHeader(data); data.addInt(actionCrc); data.addLong(attackerId); @@ -102,11 +94,6 @@ public class CombatAction extends ObjectController { data.addByte(trail.getNum()); data.addByte(clientEffectId); data.addInt(commandCrc); - data.addBoolean(useLocation); - if (useLocation) { - data.addEncodable(position); - data.addLong(cell); - } data.addShort(defenders.size()); for (Defender d : defenders) { data.addLong(d.getCreatureId()); @@ -135,14 +122,6 @@ public class CombatAction extends ObjectController { return posture; } - public Point3D getPosition() { - return position; - } - - public long getCell() { - return cell; - } - public TrailLocation getTrail() { return trail; } @@ -155,10 +134,6 @@ public class CombatAction extends ObjectController { return commandCrc; } - public boolean isUseLocation() { - return useLocation; - } - public Set getDefenders() { return defenders; } @@ -179,14 +154,6 @@ public class CombatAction extends ObjectController { this.posture = posture; } - public void setPosition(Point3D position) { - this.position = position; - } - - public void setCell(long cell) { - this.cell = cell; - } - public void setTrail(TrailLocation trail) { this.trail = trail; } @@ -199,10 +166,6 @@ public class CombatAction extends ObjectController { this.commandCrc = commandCrc; } - public void setUseLocation(boolean useLocation) { - this.useLocation = useLocation; - } - public void addDefender(Defender defender) { defenders.add(defender); } diff --git a/src/main/java/com/projectswg/common/network/packets/swg/zone/object_controller/combat/CombatSpam.java b/src/main/java/com/projectswg/common/network/packets/swg/zone/object_controller/combat/CombatSpam.java index 917c0a8..d84190a 100644 --- a/src/main/java/com/projectswg/common/network/packets/swg/zone/object_controller/combat/CombatSpam.java +++ b/src/main/java/com/projectswg/common/network/packets/swg/zone/object_controller/combat/CombatSpam.java @@ -26,8 +26,7 @@ ***********************************************************************************/ package com.projectswg.common.network.packets.swg.zone.object_controller.combat; -import com.projectswg.common.data.combat.*; -import com.projectswg.common.data.encodables.oob.OutOfBandPackage; +import com.projectswg.common.data.combat.AttackInfo; import com.projectswg.common.data.encodables.oob.StringId; import com.projectswg.common.data.location.Point3D; import com.projectswg.common.network.NetBuffer; @@ -37,22 +36,40 @@ public class CombatSpam extends ObjectController { public static final int CRC = 0x0134; - private byte dataType; private long attacker; - private Point3D attackerPosition; private long defender; - private Point3D defenderPosition; private long weapon; - private StringId weaponName; - private StringId attackName; - private AttackInfo info; - private OutOfBandPackage spamMessage; - private CombatSpamType spamType; + private int damage; + private StringId spam; + private byte colorFlag; // 0=white, 1=auto green/red, 11=yellow. TODO ENUM! + private String customString; // String to display in combat spam public CombatSpam(long objectId) { super(objectId, CRC); } + /** + * + * @param receiver object ID of the SWGObject that should receive this packet + * @param attacker object ID for attacker + * @param defender object ID for defender + * @param weapon object ID of attacker's weapon used to attack the defender + * @param damage done to defender by attacker + * @param spam message to show in combat log + * @param colorFlag of damage flytext + * @param customString optional string to display in the combat log + */ + public CombatSpam(long receiver, long attacker, long defender, long weapon, int damage, StringId spam, byte colorFlag, String customString) { + super(receiver, CRC); + this.attacker = attacker; + this.defender = defender; + this.weapon = weapon; + this.damage = damage; + this.spam = spam; + this.colorFlag = colorFlag; + this.customString = customString; + } + public CombatSpam(NetBuffer data) { super(CRC); decode(data); @@ -61,212 +78,85 @@ public class CombatSpam extends ObjectController { @Override public void decode(NetBuffer data) { decodeHeader(data); - info = new AttackInfo(); - dataType = data.getByte(); attacker = data.getLong(); - attackerPosition = data.getEncodable(Point3D.class); defender = data.getLong(); - defenderPosition = data.getEncodable(Point3D.class); - if (isAttackDataWeaponObject(dataType) || isAttackWeaponName(dataType)) { - if (isAttackDataWeaponObject(dataType)) - weapon = data.getLong(); - else - weaponName = data.getEncodable(StringId.class); - attackName = data.getEncodable(StringId.class); - info.setSuccess(data.getBoolean()); - if (info.isSuccess()) { - info.setArmor(data.getLong()); - info.setRawDamage(data.getInt()); - info.setDamageType(DamageType.getDamageType(data.getInt())); - info.setElementalDamage(data.getInt()); - info.setElementalDamageType(DamageType.getDamageType(data.getInt())); - info.setBleedDamage(data.getInt()); - info.setCriticalDamage(data.getInt()); - info.setBlockedDamage(data.getInt()); - info.setFinalDamage(data.getInt()); - info.setHitLocation(HitLocation.getHitLocation(data.getInt())); - info.setCrushing(data.getBoolean()); - info.setStrikethrough(data.getBoolean()); - info.setStrikethroughAmount(data.getFloat()); - info.setEvadeResult(data.getBoolean()); - info.setEvadeAmount(data.getFloat()); - info.setBlockResult(data.getBoolean()); - info.setBlock(data.getInt()); - } else { - info.setDodge(data.getBoolean()); - info.setParry(data.getBoolean()); - } - } else if (isMessageData(dataType)) { - spamMessage = data.getEncodable(OutOfBandPackage.class); - } - info.setCritical(data.getBoolean()); - info.setGlancing(data.getBoolean()); - info.setProc(data.getBoolean()); - spamType = CombatSpamType.getCombatSpamType(data.getInt()); + weapon = data.getLong(); + + damage = data.getInt(); + spam = data.getEncodable(StringId.class); + colorFlag = data.getByte(); + customString = data.getUnicode(); } @Override public NetBuffer encode() { - NetBuffer data = NetBuffer.allocate(getEncodeSize()); + NetBuffer data = NetBuffer.allocate(HEADER_LENGTH + 33 + spam.getLength()); encodeHeader(data); - data.addByte(dataType); data.addLong(attacker); - data.addEncodable(attackerPosition); data.addLong(defender); - data.addEncodable(defenderPosition); - if (isAttackDataWeaponObject(dataType) || isAttackWeaponName(dataType)) { - if (isAttackDataWeaponObject(dataType)) - data.addLong(weapon); - else - data.addEncodable(weaponName); - data.addEncodable(attackName); - data.addBoolean(info.isSuccess()); - if (info.isSuccess()) { - data.addLong(info.getArmor()); - data.addInt(info.getRawDamage()); - data.addInt(info.getDamageType().getNum()); - data.addInt(info.getElementalDamage()); - data.addInt(info.getElementalDamageType().getNum()); - data.addInt(info.getBleedDamage());; - data.addInt(info.getCriticalDamage()); - data.addInt(info.getBlockedDamage()); - data.addInt(info.getFinalDamage()); - data.addInt(info.getHitLocation().getNum()); - data.addBoolean(info.isCrushing()); - data.addBoolean(info.isStrikethrough()); - data.addFloat((float) info.getStrikethroughAmount()); - data.addBoolean(info.isEvadeResult()); - data.addFloat((float) info.getEvadeAmount()); - data.addBoolean(info.isBlockResult()); - data.addInt(info.getBlock()); - } else { - data.addBoolean(info.isDodge()); - data.addBoolean(info.isParry()); - } - } else if (isMessageData(dataType)) { - data.addEncodable(spamMessage); - } - data.addBoolean(info.isCritical()); - data.addBoolean(info.isGlancing()); - data.addBoolean(info.isProc()); - data.addInt(spamType.getNum()); + data.addLong(weapon); + data.addInt(damage); + data.addEncodable(spam); + data.addByte(colorFlag); + data.addUnicode(customString); + return data; } - private int getEncodeSize() { - int size = HEADER_LENGTH + 24 + attackerPosition.getLength() + defenderPosition.getLength(); - if (isAttackDataWeaponObject(dataType)) - size += 9 + attackName.getLength() + (info.isSuccess() ? 60 : 2); - else if (isAttackWeaponName(dataType)) - size += 1 + attackName.getLength() + weaponName.getLength() + (info.isSuccess() ? 60 : 2); - else if (isMessageData(dataType)) - size += spamMessage.getLength(); - return size; + public StringId getSpam() { + return spam; } - public byte getDataType() { - return dataType; + public void setSpam(StringId spam) { + this.spam = spam; + } + + public byte getColorFlag() { + return colorFlag; + } + + public void setColorFlag(byte colorFlag) { + this.colorFlag = colorFlag; + } + + public String getCustomString() { + return customString; + } + + public void setCustomString(String customString) { + this.customString = customString; } public long getAttacker() { return attacker; } - public Point3D getAttackerPosition() { - return attackerPosition; - } - public long getDefender() { return defender; } - public Point3D getDefenderPosition() { - return defenderPosition; - } - public long getWeapon() { return weapon; } - public StringId getWeaponName() { - return weaponName; - } - - public StringId getAttackName() { - return attackName; - } - - public AttackInfo getInfo() { - return info; - } - - public OutOfBandPackage getSpamMessage() { - return spamMessage; - } - - public CombatSpamType getSpamType() { - return spamType; - } - - public void setDataType(byte dataType) { - this.dataType = dataType; - } - public void setAttacker(long attacker) { this.attacker = attacker; } - public void setAttackerPosition(Point3D attackerPosition) { - this.attackerPosition = attackerPosition; - } - public void setDefender(long defender) { this.defender = defender; } - public void setDefenderPosition(Point3D defenderPosition) { - this.defenderPosition = defenderPosition; - } - public void setWeapon(long weapon) { this.weapon = weapon; } - public void setWeaponName(StringId weaponName) { - this.weaponName = weaponName; + public int getDamage() { + return damage; } - public void setAttackName(StringId attackName) { - this.attackName = attackName; + public void setDamage(int damage) { + this.damage = damage; } - - public void setInfo(AttackInfo info) { - this.info = info; - } - - public void setSpamMessage(OutOfBandPackage spamMessage) { - this.spamMessage = spamMessage; - } - - /** - * Controls the color of the combat log entry shown in the client - * @param spamType color to show this entry in - */ - public void setSpamType(CombatSpamType spamType) { - this.spamType = spamType; - } - - private boolean isAttackDataWeaponObject(byte b) { - return b == 0; - } - - private boolean isAttackWeaponName(byte b) { - return b == 1; - } - - private boolean isMessageData(byte b) { - return b == 2; - } - }