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; } }
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; }