private static void OnEntityAttack(EntityActionRequest pkt, Entity srcEntity, Entity dstEntity) { Entity target; if (dstEntity) { // only if damage and do not have endure // and damage isn't absorbed (healing) if (pkt.damage > 0 && pkt.action != 9 && pkt.action != 4) { dstEntity.ChangeMotion(SpriteMotion.Hit, SpriteMotion.Standby); } target = pkt.damage > 0 ? dstEntity : srcEntity; if (target) { switch (pkt.action) { // regular damage (and endure) case 9: case 0: target.Damage(pkt.damage, Core.Tick + pkt.attackMT); break; // double attack case 8: // Display combo only if entity is mob and the attack don't miss if (dstEntity.Type == EntityType.MOB && pkt.damage > 0) { dstEntity.Damage(pkt.damage / 2, Core.Tick + pkt.attackMT * 1, DamageType.COMBO); dstEntity.Damage(pkt.damage, Core.Tick + pkt.attackMT * 2, DamageType.COMBO | DamageType.COMBO_FINAL); } target.Damage(pkt.damage / 2, Core.Tick + pkt.attackMT * 1); target.Damage(pkt.damage / 2, Core.Tick + pkt.attackMT * 2); break; // TODO: critical damage case 10: target.Damage(pkt.damage, Core.Tick + pkt.attackMT); break; // TODO: lucky miss case 11: target.Damage(0, Core.Tick + pkt.attackMT); break; } } srcEntity.LookTo(dstEntity.transform.position); } srcEntity.AttackSpeed = (short)pkt.attackMT; srcEntity.ChangeMotion(SpriteMotion.Attack1, SpriteMotion.Standby); }
public void Read(MemoryStreamReader fp, int size) { ActionRequest = new EntityActionRequest() { GID = fp.ReadUInt(), targetGID = fp.ReadUInt(), startTime = fp.ReadUInt(), sourceSpeed = (ushort)fp.ReadInt(), targetSpeed = (ushort)fp.ReadInt(), damage = fp.ReadShort(), count = fp.ReadShort(), action = (ActionRequestType)fp.ReadByte(), leftDamage = fp.ReadShort() }; }
public bool Read(BinaryReader fp) { ActionRequest = new EntityActionRequest() { GID = fp.ReadULong(), targetGID = fp.ReadULong(), startTime = fp.ReadULong(), attackMT = fp.ReadLong(), attackedMT = fp.ReadLong(), damage = fp.ReadShort(), count = fp.ReadShort(), action = fp.ReadUByte(), leftDamage = fp.ReadShort() }; return(true); }
public void Read(MemoryStreamReader br, int size) { ActionRequest = new EntityActionRequest() { GID = br.ReadUInt(), targetGID = br.ReadUInt(), startTime = br.ReadUInt(), sourceSpeed = (ushort)br.ReadInt(), targetSpeed = (ushort)br.ReadInt(), damage = br.ReadInt() }; br.Seek(1, SeekOrigin.Current); ActionRequest.count = br.ReadShort(); ActionRequest.action = (ActionRequestType)br.ReadByte(); ActionRequest.leftDamage = br.ReadInt(); }
public bool Read(BinaryReader br) { ActionRequest = new EntityActionRequest() { GID = br.ReadULong(), targetGID = br.ReadULong(), startTime = br.ReadULong(), attackMT = br.ReadLong(), attackedMT = br.ReadLong(), damage = br.ReadLong() }; br.Seek(1, SeekOrigin.Current); ActionRequest.count = br.ReadShort(); ActionRequest.action = br.ReadUByte(); ActionRequest.leftDamage = br.ReadLong(); return(true); }
private void OnEntityAttack(EntityActionRequest pkt, Entity srcEntity, Entity dstEntity) { Entity target; if (dstEntity) { // only if damage and do not have endure // and damage isn't absorbed (healing) if (pkt.damage > 0 && pkt.action != ActionRequestType.ATTACK_MULTIPLE_NOMOTION && pkt.action != ActionRequestType.ATTACK_NOMOTION) { dstEntity.ChangeMotion( new EntityViewer.MotionRequest { Motion = SpriteMotion.Hit, delay = Core.Tick + pkt.sourceSpeed }, new EntityViewer.MotionRequest { Motion = SpriteMotion.Standby, delay = Core.Tick + pkt.sourceSpeed * 2 } ); } target = pkt.damage > 0 ? dstEntity : srcEntity; // Process damage if (target) { switch (pkt.action) { // regular damage (and endure) case ActionRequestType.ATTACK_MULTIPLE_NOMOTION: case ActionRequestType.ATTACK: target.Damage(pkt.damage, Core.Tick + pkt.sourceSpeed); break; // double attack case ActionRequestType.ATTACK_MULTIPLE: // Display combo only if entity is mob and the attack don't miss if (dstEntity.Type == EntityType.MOB && pkt.damage > 0) { dstEntity.Damage(pkt.damage / 2, Core.Tick + pkt.sourceSpeed * 1, DamageType.COMBO); dstEntity.Damage(pkt.damage, Core.Tick + pkt.sourceSpeed * 2, DamageType.COMBO | DamageType.COMBO_FINAL); } target.Damage(pkt.damage / 2, Core.Tick + pkt.sourceSpeed * 1); target.Damage(pkt.damage / 2, Core.Tick + pkt.sourceSpeed * 2); break; // TODO: critical damage case ActionRequestType.ATTACK_CRITICAL: target.Damage(pkt.damage, Core.Tick + pkt.sourceSpeed); break; // TODO: lucky miss case ActionRequestType.ATTACK_LUCKY: target.Damage(0, Core.Tick + pkt.sourceSpeed); break; } } srcEntity.LookTo(dstEntity.transform.position); } srcEntity.SetAttackSpeed(pkt.sourceSpeed); srcEntity.ChangeMotion( new EntityViewer.MotionRequest { Motion = SpriteMotion.Attack }, new EntityViewer.MotionRequest { Motion = SpriteMotion.Standby, delay = Core.Tick + pkt.sourceSpeed } ); }