Public Repository for the Magicbane Shadowbane Emulator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

347 lines
11 KiB

// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.net.client.msg;
import engine.net.AbstractConnection;
import engine.net.ByteBufferReader;
import engine.net.ByteBufferWriter;
import engine.net.client.Protocol;
import engine.objects.AbstractCharacter;
import engine.objects.AbstractWorldObject;
import engine.objects.PlayerCharacter;
public class TargetedActionMsg extends ClientNetMsg {
public static int un2cnt = 65;
//attack animations
//64: overhead RH swing 1h RH axe?
//65: overhead LH swing
//66: underhand RH uppercut
//67: shoulder high RH swing
//68: underhand RH swing
//69: sweeping LH swing
//70: overhead circle RH swing
//71: RH across body and back swing
//72: RH 1h overhead to 2h swing
//73: RH overhead to cross body swing (bm?)
//74: 2h low stab to cross body slash
//75: unarmed punch unarmed RH
//76: unarmed RH punch LH punch
//77: unarmed LH jab
//78: unarmed LH jab, RH uppercut
//79: kick
//80: roundhouse kick
//81: dagger RH stab dagger RH
//82: dagger LH stab
//83: dagger slash
//84: dagger hard stab
//85: Polearm/staff overhead swing Polearm, Staff
//86: Polearm/staff side swing
//87: Polearm/staff step into overhead swing
//88: swinging RH stab
//89: swinging LF stab
//90: swinging RH stab (faster)
//91: 1H slash across body and back (sword?)
//92: spear stab spear
//93: spear low stab step into
//94: spear swing leg stab
//95: unarmed overhead swing RH, underhand swing LH
//96: inverted weapon across body followed by roundhouse LH swing
//97: step back followed by overhead roundhouse swing 2H
//98: underhand slash (1h sword) 1H RH Sword
//99: fast LH swing (dagger or sword?)
//100: 1h swing RH (sword) 1h axe?
//101: 1h overhead swing (club or sword)
//102: fast 1h underhand swing (club or sword)
//103: step into RH slash 1h
//104: 1h overhead to cross body slash RH
//105: 2h overhead swing (axe, hammer, sword) 2H Axe, Hammer, Sword
//106: step into 2h swing
//107: step int 2h overhead swing
//108: step into 2h swing
//109: bow draw and fire bow
//110: crossbow draw and fire crossbow
//115: throwing axe/hammer?
//116: overhand throwing dagger?
//117: throwing dagger
private int sourceType;
private int sourceID;
private int targetType;
private int targetID;
private float locX;
private float locZ;
private int unknown01 = 14;
private int unknown02 = 100; //source animation
private float unknown03 = 1f;
private float sourceStamina = 1f; // attackers stamina after attack
private int unknown05 = 6; //signify passive defense
private int unknown06 = 10; //target animation
private float newHealth = 10f; // health after damage
private float damage = 0f; // damage, 0 for miss
/**
* This is the general purpose constructor.
*/
public TargetedActionMsg(int sourceType, int sourceID, int targetType, int targetID, float locX, float locZ, float sourceStamina,
float newHealth, float damage) {
super(Protocol.TARGETEDACTION);
this.sourceType = sourceType;
this.sourceID = sourceID;
this.targetType = targetType;
this.targetID = targetID;
this.sourceStamina = sourceStamina;
this.locX = locX;
this.locZ = locZ;
this.newHealth = newHealth;
this.damage = damage;
//this.unknown02 = TargetedActionMsg.un2cnt;
}
/**
* This is a helper constructor. Designed to send an UPDATE only. Damage for
* this constructor is hard coded to ZERO.
*/
public TargetedActionMsg(PlayerCharacter pc) {
super(Protocol.TARGETEDACTION);
this.sourceType = pc.getObjectType().ordinal();
this.sourceID = pc.getObjectUUID();
this.targetType = pc.getObjectType().ordinal();
this.targetID = pc.getObjectUUID();
this.sourceStamina = pc.getStamina();
this.locX = pc.getLoc().x;
this.locZ = pc.getLoc().z;
this.newHealth = pc.getCurrentHitpoints();
this.damage = 0.0f;
}
public TargetedActionMsg(PlayerCharacter pc,int unknown06) {
super(Protocol.TARGETEDACTION);
this.sourceType = pc.getObjectType().ordinal();
this.sourceID = pc.getObjectUUID();
this.targetType = pc.getObjectType().ordinal();
this.targetID = pc.getObjectUUID();
this.sourceStamina = pc.getStamina();
this.locX = pc.getLoc().x;
this.locZ = pc.getLoc().z;
this.newHealth = pc.getCurrentHitpoints();
this.damage = 0.0f;
}
public TargetedActionMsg(AbstractCharacter source, AbstractWorldObject target, Float damage, int swingAnimation) {
super(Protocol.TARGETEDACTION);
if (source != null) {
this.sourceType = source.getObjectType().ordinal();
this.sourceID = source.getObjectUUID();
this.sourceStamina = source.getStamina();
} else {
this.sourceType = 0;
this.sourceID = 0;
this.sourceStamina = 0;
}
if (target != null) {
this.targetType = target.getObjectType().ordinal();
this.targetID = target.getObjectUUID();
this.locX = target.getLoc().x;
this.locZ = target.getLoc().z;
this.newHealth = target.getHealth();
this.damage = damage;
} else {
this.targetType = 0;
this.targetID = 0;
this.locX = 50000f;
this.locZ = -50000f;
this.newHealth = 1f;
this.damage = damage;
}
this.unknown02 = swingAnimation;
//this.unknown02 = TargetedActionMsg.un2cnt;
}
public TargetedActionMsg(AbstractCharacter source, AbstractWorldObject target, Float damage, int swingAnimation, int dead) {
super(Protocol.TARGETEDACTION);
if (source != null) {
this.sourceType = source.getObjectType().ordinal();
this.sourceID = source.getObjectUUID();
this.sourceStamina = source.getStamina();
} else {
this.sourceType = 0;
this.sourceID = 0;
this.sourceStamina = 0;
}
if (target != null) {
this.targetType = target.getObjectType().ordinal();
this.targetID = target.getObjectUUID();
this.locX = target.getLoc().x;
this.locZ = target.getLoc().z;
this.newHealth = target.getCurrentHitpoints();
this.damage = damage;
this.unknown06 = dead;
} else {
this.targetType = 0;
this.targetID = 0;
this.locX = 50000f;
this.locZ = -50000f;
this.newHealth = 1f;
this.damage = damage;
}
this.unknown02 = swingAnimation;
//this.unknown02 = TargetedActionMsg.un2cnt;
}
/**
* Added in an attempt to have mobs fall over after death.
*/
public TargetedActionMsg(AbstractWorldObject target, boolean kill) {
this(null, target, 0f, 75);
if (kill){
this.newHealth = -1f;
this.sourceType = 0x101;
this.sourceID = 0x101;
}
}
/**
* This constructor can be used to create CombatMessages that indicate a block or parry has occurred.<br>
* <br>
* Set passiveAnimation to 21 for block.<br>
* Set passiveAnimation to 22 for parry.<br>
*/
public TargetedActionMsg(AbstractCharacter source, int swingAnimation, AbstractWorldObject target, int passiveAnimation) {
this(source, target, 0.0f, swingAnimation);
this.unknown05 = passiveAnimation;
this.unknown06 = 0;
}
/**
* This constructor is used by NetMsgFactory. It attempts to deserialize the
* ByteBuffer into a message. If a BufferUnderflow occurs (based on reading
* past the limit) then this constructor Throws that Exception to the
* caller.
*/
public TargetedActionMsg(AbstractConnection origin, ByteBufferReader reader) {
super(Protocol.TARGETEDACTION, origin, reader);
}
/**
* Serializes the subclass specific items to the supplied NetMsgWriter.
*/
@Override
protected void _serialize(ByteBufferWriter writer) {
writer.putInt(this.sourceType);
writer.putInt(this.sourceID);
writer.putInt(this.targetType);
writer.putInt(this.targetID);
writer.putFloat(this.locX);
writer.putFloat(this.locZ);
writer.putInt(this.unknown01);
writer.putInt(this.unknown02);
writer.putFloat(this.unknown03);
writer.putFloat(this.sourceStamina);
writer.putInt(this.unknown05);
// writer.putInt(this.unknown06);
if (this.newHealth < 0)
writer.putInt(55);
else if(damage != 0 && this.unknown05 < 20)
writer.putInt(60);
else
writer.putInt(this.unknown06);
writer.putFloat(this.newHealth);
writer.putFloat(this.damage);
}
/**
* Deserializes the subclass specific items from the supplied NetMsgReader.
*/
@Override
protected void _deserialize(ByteBufferReader reader) {
this.sourceType = reader.getInt();
this.sourceID = reader.getInt();
this.targetType = reader.getInt();
this.targetID = reader.getInt();
this.locX = reader.getFloat();
this.locZ = reader.getFloat();
this.unknown01 = reader.getInt();
this.unknown02 = reader.getInt();
this.unknown03 = reader.getFloat();
this.sourceStamina = reader.getFloat();
this.unknown05 = reader.getInt();
this.unknown06 = reader.getInt();
this.newHealth = reader.getFloat();
this.damage = reader.getFloat();
}
/**
* @return the sourceType
*/
public int getSourceType() {
return sourceType;
}
/**
* @return the sourceID
*/
public int getSourceID() {
return sourceID;
}
/**
* @return the targetType
*/
public int getTargetType() {
return targetType;
}
/**
* @return the targetID
*/
public int getTargetID() {
return targetID;
}
public void setSourceType(int value) {
this.sourceType = value;
}
public void setSourceID(int value) {
this.sourceID = value;
}
public void setTargetType(int value) {
this.targetType = value;
}
public void setTargetID(int value) {
this.targetID = value;
}
public float getDamage() {
return damage;
}
}