Exemplo n.º 1
0
        public void doDamage(ulong GUID)
        {
            int dmg = 0;

            StatManager.CalculateSpellDamage(client.Player, null, spell, out dmg);

            ServerPacket pkg9 = new ServerPacket(SMSG.SPELLNONMELEEDAMAGELOG);

            // Target GUID
            pkg9.Write((ulong)GUID);
            // Caster GUID
            pkg9.Write((ulong)client.Player.GUID);
            // spellID
            pkg9.Write((short)spellId);
            // Fill the hole
            pkg9.Write((UInt16)0);
            // damage done
            pkg9.Write((short)dmg);
            // Fill the hole
            pkg9.Write((UInt16)0);
            // flag?
            pkg9.Write((byte)0x01);
            // damage absorbed
            pkg9.Write((UInt32)0);
            pkg9.Write((byte)0);
            pkg9.Write((byte)0);
            // damage blocked
            pkg9.Write((UInt32)0);
            pkg9.Write((byte)0);
            pkg9.Finish();

            client.Player.MapTile.Map.Send(pkg9, client.Player.Position, 25.0f);
            client.Player.UpdateData();

//			LivingObject targetObject = (LivingObject)ObjectManager.GetWorldObjectByGUID(GUID);
//			if (targetObject.ObjectType==OBJECTTYPE.UNIT)

            UnitBase uobj = (UnitBase)ObjectManager.GetWorldObject(OBJECTTYPE.UNIT, GUID);

            if (uobj != null)
            {
                client.Player.LastPosition = client.Player.Position;;
//				UnitBase uobj = (UnitBase)targetObject;
                if (!uobj.Attacking)
                {
                    uobj.StartCombat(client.Player.GUID);
                }

                uobj.DealDamage(client.Player, dmg);

                if (uobj.Dead && this.player.Selection != null && this.player.Selection.GUID == GUID)
                {
                    this.player.StopCombat();
                }
            }
        }
Exemplo n.º 2
0
        public override void FireEvent()
        {
            BinWriter pkg2 = new BinWriter();

            pkg2.Write(spellId);
            pkg2.Write((byte)0);
            pkg2.Write((byte)0);
            pkg2.Write((byte)8);
            client.Send(SMSG.CAST_RESULT, pkg2);

            ServerPacket pkg5 = new ServerPacket(SMSG.SPELL_GO);

            pkg5.Write((ulong)client.Player.GUID);
            pkg5.Write((ulong)client.Player.GUID);
            pkg5.Write((short)spellId);
            pkg5.Write((UInt32)0);

            if ((flags & 0x40) > 0)
            {
                targetsInRange = client.Player.MapTile.Map.GetObjectsInRange(OBJECTTYPE.UNIT, destinationVector, 25.0f);
                Console.WriteLine("Targets in range :  " + targetsInRange.Count);
                pkg5.Write((byte)targetsInRange.Count);
                IEnumerator e = targetsInRange.GetEnumerator();
                while (e.MoveNext())
                {
                    pkg5.Write(((UnitBase)e.Current).GUID);
                }
            }
            else
            {
                pkg5.Write((byte)0x01);
                if (target == 0)
                {
                    pkg5.Write(client.Player.GUID);
                }
                else
                {
                    pkg5.Write(target);
                }
            }
            //Missed targets count
            pkg5.Write((byte)0x00);

            //Flag
            pkg5.Write(flags);

            // If we got a single target spell
            if ((flags & 0x8802) > 0)
            {
                if (target == 0)
                {
                    pkg5.Write(client.Player.GUID);
                }
                else
                {
                    pkg5.Write(target); Chat.System(client, "Target:" + target);
                }
            }

            // If we got an area spell
            if ((flags & 0x40) > 0)
            {
                pkg5.WriteVector(destinationVector);
            }
            pkg5.Finish();
            client.Player.MapTile.Map.Send(pkg5, client.Player.Position, 25.0f);

            DBSpell spell;

            try
            {
                spell = (DBSpell)DBManager.spellsDB[(uint)spellId];
            }
            catch (Exception e)
            {
                Console.WriteLine("Spell wasn't found in DB !!! Be sure you got the spell DB!");
                Console.WriteLine(e);
                return;
            }
            if (spell == null)
            {
                Chat.System(client, "Spell:" + spellId + " not found during fire"); return;
            }
            ;

            if (spell.Description.IndexOf("damage") > -1 && targetsInRange == null)
            {
                doDamage(target);
            }
            else if (spell.Description.IndexOf("damage") > -1 && targetsInRange != null)
            {
                IEnumerator e = targetsInRange.GetEnumerator();
                while (e.MoveNext())
                {
                    doDamage(((UnitBase)e.Current).GUID);
                }
            }
            else if (spell.Description.IndexOf("heal") > -1 || spell.Description.IndexOf("Heal") > -1)
            {
                int dmg = 0;
                StatManager.CalculateSpellDamage(client.Player, null, spell, out dmg);

                ServerPacket pkg9 = new ServerPacket(SMSG.SPELLNONMELEEDAMAGELOG);
                // Target GUID
                pkg9.Write((ulong)target);
                // Caster GUID
                pkg9.Write((ulong)client.Player.GUID);
                // spellID
                pkg9.Write((short)spellId);
                // Fill the hole
                pkg9.Write((UInt16)0);
                // damage done
                pkg9.Write(dmg);
                // Fill the hole
                pkg9.Write((UInt16)0);
                // flag?
                pkg9.Write((byte)0x01);
                // damage absorbed
                pkg9.Write((UInt32)0);
                pkg9.Write((byte)0);
                pkg9.Write((byte)0);
                // damage blocked
                pkg9.Write((UInt32)0);
                pkg9.Write((byte)0);
                pkg9.Finish();
                client.Player.MapTile.Map.Send(pkg9, client.Player.Position, 25.0f);
//				LivingObject targetObject = (LivingObject)ObjectManager.GetWorldObjectByGUID(target);
//				if((targetObject is PlayerObject)targetObject.Health += dmg;
                PlayerObject targetObject = (PlayerObject)ObjectManager.GetWorldObject(OBJECTTYPE.PLAYER, target);
                if (targetObject != null)
                {
                    targetObject.Health += dmg;
                }
            }

            client.Player.Power -= (int)spell.ManaCost;
            client.Player.UpdateData();
        }