public static void SendAttackerStateUpdate(DamageAction action)
 {
     if (action.Attacker is Character && action.Victim is NPC)
     {
         var atacker = (Character)action.Attacker;
         var victim  = (NPC)action.Victim;
         using (var packet = new RealmPacketOut(RealmServerOpCode.MonstrTakeDmg)) //4029
         {
             packet.WriteInt16(atacker.SessionId);                                //{killerSessId}default value : 17 Len : 2
             packet.WriteInt16(victim.UniqIdOnMap);                               //{monstrMapId}default value : 125 Len : 2
             packet.WriteInt32(victim.UniqWorldEntityId);                         //value name : unk6 default value : 0Len : 4
             if (action.VictimState == VictimState.Evade)
             {
                 packet.WriteInt32(-1);
             }
             else if (action.VictimState == VictimState.Block)
             {
                 packet.WriteInt32(-2);
             }
             else if (action.VictimState == VictimState.Immune)
             {
                 packet.WriteInt32(-3);
             }
             else if (action.VictimState == VictimState.Deflect || action.VictimState == VictimState.Dodge || action.VictimState == VictimState.Interrupt || action.VictimState == VictimState.Parry)
             {
                 packet.WriteInt32(-1);
             }
             else
             {
                 packet.WriteUInt32(action.ActualDamage + (action.IsCritical?2147483648:0)); //{AmountOfDmg}default value : 482 Len : 4
             }
             packet.WriteSkip(unk8);                                                         //value name : unk8 default value : unk8Len : 21
             victim.SendPacketToArea(packet);
         }
         return;
     }
     else if (action.Attacker is NPC && action.Victim is Character)
     {
         var atacker = (NPC)action.Attacker;
         var victim  = (Character)action.Victim;
         var dmg     = 0;
         if (action.VictimState == VictimState.Evade)
         {
             dmg = -1;
         }
         else if (action.VictimState == VictimState.Block)
         {
             dmg = -2;
         }
         else if (action.VictimState == VictimState.Immune)
         {
             dmg = -3;
         }
         else if (action.VictimState == VictimState.Miss || action.VictimState == VictimState.Deflect || action.VictimState == VictimState.Dodge || action.VictimState == VictimState.Interrupt || action.VictimState == VictimState.Parry)
         {
             dmg = 0;
         }
         else
         {
             dmg = (int)(action.ActualDamage + (action.IsCritical?2147483648:0));     //{AmountOfDmg}default value : 482 Len : 4
         }
         Asda2MovmentHandler.SendMonstMoveOrAtackResponse(victim.SessionId, atacker, dmg, atacker.Asda2Position, true);
     }
     else if (action.Attacker is Character && action.Victim is Character)
     {
         var dmg = 0;
         if (action.VictimState == VictimState.Evade)
         {
             dmg = -1;
         }
         else if (action.VictimState == VictimState.Block)
         {
             dmg = -2;
         }
         else if (action.VictimState == VictimState.Immune)
         {
             dmg = -3;
         }
         else if (action.VictimState == VictimState.Miss || action.VictimState == VictimState.Deflect || action.VictimState == VictimState.Dodge || action.VictimState == VictimState.Interrupt || action.VictimState == VictimState.Parry)
         {
             dmg = 0;
         }
         else
         {
             dmg = (int)(action.ActualDamage + (action.IsCritical ? 2147483648 : 0)); //{AmountOfDmg}default value : 482 Len : 4
         }
         using (var packet = new RealmPacketOut(RealmServerOpCode.AtackCharacterRes)) //4204
         {
             packet.WriteInt16(action.Attacker.CharacterMaster.SessionId);            //{atackerSessId}default value : 11 Len : 2
             packet.WriteInt16(action.Victim.CharacterMaster.SessionId);              //{victimSessId}default value : 105 Len : 2
             packet.WriteInt32(0);                                                    //value name : unk6 default value : 0Len : 4
             packet.WriteInt32(dmg);                                                  //{dmg}default value : 1 Len : 4
             packet.WriteByte(0);                                                     //value name : unk8 default value : 0Len : 1
             packet.WriteInt16(-1);                                                   //value name : unk9 default value : -1Len : 2
             packet.WriteInt32(0);                                                    //value name : unk4 default value : 0Len : 4
             action.Victim.CharacterMaster.SendPacketToArea(packet, true, true);
         }
     }
 }
Exemple #2
0
 public static void SendAttackerStateUpdate(DamageAction action)
 {
     if (action.Attacker is Character && action.Victim is NPC)
     {
         Character attacker = (Character)action.Attacker;
         NPC       victim   = (NPC)action.Victim;
         using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.MonstrTakeDmg))
         {
             packet.WriteInt16(attacker.SessionId);
             packet.WriteInt16(victim.UniqIdOnMap);
             packet.WriteInt32(victim.UniqWorldEntityId);
             if (action.VictimState == VictimState.Evade)
             {
                 packet.WriteInt32(-1);
             }
             else if (action.VictimState == VictimState.Block)
             {
                 packet.WriteInt32(-2);
             }
             else if (action.VictimState == VictimState.Immune)
             {
                 packet.WriteInt32(-3);
             }
             else if (action.VictimState == VictimState.Deflect || action.VictimState == VictimState.Dodge ||
                      (action.VictimState == VictimState.Interrupt || action.VictimState == VictimState.Parry))
             {
                 packet.WriteInt32(-1);
             }
             else
             {
                 packet.WriteUInt32((long)action.ActualDamage + (action.IsCritical ? 2147483648L : 0L));
             }
             packet.WriteSkip(Asda2CombatHandler.unk8);
             victim.SendPacketToArea(packet, true, true, Locale.Any, new float?());
         }
     }
     else if (action.Attacker is NPC && action.Victim is Character)
     {
         NPC       attacker = (NPC)action.Attacker;
         Character victim   = (Character)action.Victim;
         int       dmg      = action.VictimState != VictimState.Evade
             ? (action.VictimState != VictimState.Block
                 ? (action.VictimState != VictimState.Immune
                     ? (action.VictimState == VictimState.Miss || action.VictimState == VictimState.Deflect ||
                        (action.VictimState == VictimState.Dodge ||
                         action.VictimState == VictimState.Interrupt) || action.VictimState == VictimState.Parry
                         ? 0
                         : (int)((long)action.ActualDamage + (action.IsCritical ? 2147483648L : 0L)))
                     : -3)
                 : -2)
             : -1;
         Asda2MovmentHandler.SendMonstMoveOrAtackResponse(victim.SessionId, attacker, dmg,
                                                          attacker.Asda2Position, true);
     }
     else
     {
         if (!(action.Attacker is Character) || !(action.Victim is Character))
         {
             return;
         }
         int val = action.VictimState != VictimState.Evade
             ? (action.VictimState != VictimState.Block
                 ? (action.VictimState != VictimState.Immune
                     ? (action.VictimState == VictimState.Miss || action.VictimState == VictimState.Deflect ||
                        (action.VictimState == VictimState.Dodge ||
                         action.VictimState == VictimState.Interrupt) || action.VictimState == VictimState.Parry
                         ? 0
                         : (int)((long)action.ActualDamage + (action.IsCritical ? 2147483648L : 0L)))
                     : -3)
                 : -2)
             : -1;
         using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.AtackCharacterRes))
         {
             packet.WriteInt16(action.Attacker.CharacterMaster.SessionId);
             packet.WriteInt16(action.Victim.CharacterMaster.SessionId);
             packet.WriteInt32(0);
             packet.WriteInt32(val);
             packet.WriteByte(0);
             packet.WriteInt16(-1);
             packet.WriteInt32(0);
             action.Victim.CharacterMaster.SendPacketToArea(packet, true, true, Locale.Any, new float?());
         }
     }
 }