Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
 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()
     };
 }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
    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
        }
            );
    }