Example #1
0
            public override void FireEvent()
            {
                try
                {
                    if (aclient.Player == null)
                    {
                        this.Kill();
                        return;
                    }

                    attacker         = aclient.Player;
                    attacker.InRound = false;
                    target           = (LivingObject)ObjectManager.GetWorldObjectByGUID(aclient.Player.Target);
                    if (attacker.Dead)
                    {
                        this.Kill(); return;
                    }

                    if ((!attacker.Attacking) || target.Dead)
                    {
                        this.Kill();
                        return;
                    }
                    //Console.WriteLine("Fire combat event attacker: " + attacker.Name + " -> " + target.Name);

                    float angle  = (float)(aclient.Player.Position.Angle(target.Position) * 180 / Math.PI);
                    float facing = (float)(aclient.Player.Facing * 180 / Math.PI) % 360;

                    if (angle < 0)
                    {
                        angle += 360;
                    }

                    // Try to normalize so that foc (field of combat)
                    // is between 30 and -30 deg
                    float dif = (angle - facing) % 360;
                    if (dif > 180)
                    {
                        dif = 360 - dif;
                    }

                    if (Math.Abs(dif) > 35)
                    {
                        //Console.WriteLine("Look where you are fighting: " + attacker.Name + " -> " + target.Name);
                    }
                    else
                    {
                        uint hitflag;
                        uint victimstate;
                        int  damage;
                        int  blocked;
                        StatManager.CalculateMeleeDamage(attacker, target, out hitflag, out victimstate, out damage, out blocked);
                        if (aclient.Player.Position.Distance(target.Position) + aclient.Player.Position.Distance(aclient.Player.LastPosition) <= 2.5)                       //So they dont get free hits from 20 feet away
                        {
                            attacker.InRound = true;

                            ServerPacket pkg2 = new ServerPacket(SMSG.ATTACKERSTATEUPDATE);
                            pkg2.Write((uint)hitflag);
                            pkg2.Write(attacker.GUID);
                            pkg2.Write(target.GUID);
                            pkg2.Write((int)damage);
                            pkg2.Write((byte)1);
                            pkg2.Write((uint)0);
                            pkg2.Write((float)damage);
                            pkg2.Write((int)damage);
                            pkg2.Write((int)0);
                            pkg2.Write((uint)victimstate);
                            pkg2.Write((uint)0);
                            pkg2.Write((uint)0);
                            pkg2.Write((uint)0);
                            pkg2.Write((int)blocked);
                            pkg2.Finish();
                            attacker.MapTile.Map.Send(pkg2, attacker.Position, 25.0f);

                            if (target.ObjectType == OBJECTTYPE.UNIT)
                            {
                                UnitBase uobj = (UnitBase)target;
                                uobj.DealDamage(attacker, damage);
                                if (uobj.Dead)
                                {
                                    attacker.StopCombat();
                                }
                            }
                        }
                        else
                        {
                            //Console.WriteLine("Your are to far away to hit mob: " + attacker.Name + " -> " + target.Name);
                        }
                    }
                    aclient.Player.LastPosition = aclient.Player.Position;
                    int nextEvent = (attacker.InRound?attacker.BaseAttackTime:1000);
                    eventTime = DateTime.Now.Add(TimeSpan.FromMilliseconds(nextEvent));
                    EventManager.AddEvent(this);
                    return;
                }
                catch (Exception e)
                {
                    this.Kill();
                    Console.WriteLine("This exception happened in Combat Event. Probably, someone just disconnected while in combat. It won't crash server though!");
                    Console.WriteLine(e);
                    return;
                }
            }
Example #2
0
            public override void FireEvent()
            {
                try
                {
                    attacker.InRound   = false;
                    attacker.DidAttack = false;
                    if (aclient.Player == null)
                    {
                        this.Kill();
                        return;
                    }
                    //Console.WriteLine("CombatEvent.FireEvent (" + aclient.Player.Name + "): " + attacker.Name);

                    aclient = WorldServer.GetClientByCharacterID((uint)attacker.Target);
                    if (attacker.Dead)
                    {
                        this.Kill(); return;
                    }
                    target = aclient.Player;
                }
                catch (Exception) { this.Kill(); return; }

                if (aclient.Player.Position.Distance(attacker.Position) > 50)
                {
                    Console.WriteLine("Ennemy out of range! Stopping attack");
                    this.Kill();
                    return;
                }

                if (aclient.Player.Dead || aclient.Player.RezSickness)
                {
                    this.Kill(); return;
                }

                uint hitflag;
                uint victimstate;
                int  damage;
                int  blocked;

                attacker.InRound = true;
                StatManager.CalculateMeleeDamage(attacker, target, out hitflag, out victimstate, out damage, out blocked);
                if (aclient.Player.Position.Distance(attacker.Position) < 2.75f)                 //So they dont get free hits from 20 feet away
                {
                    attacker.DidAttack = true;
                    ServerPacket pkg2 = new ServerPacket(SMSG.ATTACKERSTATEUPDATE);
                    pkg2.Write((uint)hitflag);
                    pkg2.Write(attacker.GUID);
                    pkg2.Write(target.GUID);
                    pkg2.Write((int)damage);
                    pkg2.Write((byte)1);
                    pkg2.Write((uint)0);
                    pkg2.Write((float)damage);
                    pkg2.Write((int)damage);
                    pkg2.Write((int)0);
                    pkg2.Write((uint)victimstate);
                    pkg2.Write((uint)0);
                    pkg2.Write((uint)0);
                    pkg2.Write((uint)0);
                    pkg2.Write((int)0);
                    pkg2.Finish();
                    attacker.MapTile.Map.Send(pkg2, attacker.Position, 25.0f);

                    target.DealDamage(attacker, damage);
                    if (target.Dead)
                    {
                        attacker.StopCombat();
                    }
                }
                else
                {
                    ChasingEvent chase = new ChasingEvent(attacker);
                    chase.FireEvent();
                }

                int nextEvent = (attacker.DidAttack?attacker.BaseAttackTime:1000);

                eventTime = DateTime.Now.Add(TimeSpan.FromMilliseconds(nextEvent));
                EventManager.AddEvent(this);
                return;
            }