static void OnGroupCreate(WORLDMSG msgID, BinReader data) { uint charID = data.ReadUInt32(); WorldClient client = WorldServer.GetClientByCharacterID(charID); uint leaderID = data.ReadUInt32(); WorldClient leader = WorldServer.GetClientByCharacterID(leaderID); if (leader == null) { Console.WriteLine("Leader not found"); return; } if (leader.Player.Group == null) { leader.Player.Group = new GroupObject(client.Player, leader.Player); } else { for (uint i = 0; i < leader.Player.Group.Size; i++) { if (leader.Player.Group.Members[i].CharacterID == charID) { return; } } leader.Player.Group.AddMember(client.Player); } client.Player.Group = leader.Player.Group; leader.Player.IsLeader = true; client.Player.Group.LeaderGUID = leader.Player.GUID; client.Player.Group.SendGroupList(); }
public CombatEvent(PlayerObject player) : base(TimeSpan.FromMilliseconds(1)) { aclient = WorldServer.GetClientByCharacterID((uint)player.GUID); aclient.Player.LastPosition = aclient.Player.Position; //target = (LivingObject)ObjectManager.GetWorldObjectByGUID(aclient.Player.Target); //Console.WriteLine("New combat event attacker: " + player.Name + " -> " + target.Name); }
public override void FireEvent() { // Mob has changed target if (this.currenttarget != mob.Target) { client = (WorldClient)WorldServer.GetClientByCharacterID((uint)this.mob.Target); if (client == null) { this.mob.StopCombat(); } else { this.currenttarget = mob.Target; } } //Console.WriteLine("ChasingEvent.FireEvent (" + (client != null ? client.Player.Name : "") + "): " + mob.Name); if (client != null && client.Player.InWorld && !client.Player.Dead && !mob.Dead) { try { float distance = client.Player.Position.Distance(mob.Position); // if(distance > 4) // { int time = (int)((distance / mob.RunningSpeed) * 1000); ServerPacket pkg = new ServerPacket(SMSG.MONSTER_MOVE); pkg.Write((char)0xFF); pkg.Write(mob.GUID); pkg.WriteVector(mob.Position); pkg.Write(mob.Facing); pkg.Write((byte)0); pkg.Write(0x100); pkg.Write(time); pkg.Write(1); if (client != null && client.Player != null) { mob.Position.Translate(client.Player.Position, 1.5f - (client.Player.Position.Distance(client.Player.LastPosition) * 0.5f)); } pkg.Write(mob.Position.X); pkg.Write(mob.Position.Y); pkg.Write(mob.Position.Z); pkg.Finish(); mob.MapTile.SendSurrounding(pkg); mob.UpdateData(); client.Player.UpdateData(); } catch (Exception exp) { DebugLogger.Logger.Log("", exp); } // eventTime = DateTime.Now.Add(TimeSpan.FromSeconds(1)); // EventManager.AddEvent(this); } }
static void OnPlayerLeaveWorld(WORLDMSG msgID, BinReader data) { uint id = data.ReadUInt32(); WorldClient client = WorldServer.GetClientByCharacterID(id); if (client == null) { Console.WriteLine("Failed to leave world. Client didn't exist on worldserver."); return; } client.LeaveWorld(); }
public void updateTime() { BinWriter w = new BinWriter(); w.Write(WorldClock.GetTimeStamp()); WorldServer.GetClientByCharacterID((uint)this.GUID).Send(SMSG.GAMETIME_UPDATE, w); /* //BinWriter w = LoginClient.NewPacket(SMSG.LOGIN_SETTIMESPEED); * /*w.Write((float)0); * w.Write((int)0);*/ /*w.Write((byte)1); * w.Write((byte)1); * w.Write((byte)1); * w.Write((byte)1); * w.Write((byte)1); * w.Write((byte)1); * w.Write((byte)1); * w.Write((byte)1); * Send(w); * * DateTime time = WorldServer.m_clock.time; //Moved this code to WorldClock, so I could use the timestamp in other places. * uint timeSeq = 0; * * // 4 bytes of packed time data. the bits are: * // high 2 bits - unknown * timeSeq|=(uint)0; * // next 5 bits - year * timeSeq<<=5; * timeSeq|=(uint)1; * // next 4 bits - month * timeSeq<<=4; * timeSeq|=(uint)time.Month; * // next 7 bits - day of month * timeSeq<<=7; * timeSeq|=(uint)time.Day; * // next 3 bits - day of week * timeSeq<<=3; * timeSeq|=(uint)time.DayOfWeek; * // next 5 bits - hours * timeSeq<<=5; * timeSeq|=(uint)((time.Hour==0) ? 24 : time.Hour ); * // low 6 bits - minutes * timeSeq<<=6; * timeSeq|=(uint)time.Minute; * * BinWriter w = new BinWriter(); * w.Write(timeSeq); * WorldServer.GetClientByCharacterID((uint)this.GUID).Send(SMSG.GAMETIME_UPDATE,w); */ }
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; }
public CombatEvent(UnitBase monster) : base(TimeSpan.FromMilliseconds(1)) { attacker = monster; aclient = (WorldClient)WorldServer.GetClientByCharacterID((uint)attacker.Target); //Console.WriteLine("New combat event attacker: " + attacker.Name + " -> " + aclient.Player.Name); }
public void DealDamage(PlayerObject pobj, int damage) { if (!this.Dead) { if (m_agrotable[pobj.CharacterID] == null) { m_agrotable.Add(pobj.CharacterID, damage); } else { int damagedealt = (int)m_agrotable[pobj.CharacterID]; damagedealt += damage; m_agrotable[pobj.CharacterID] = damagedealt; } this.Health -= damage; if (this.Health < 1) { this.Roaming = false; EventManager.AddEvent(new CorpseDespawnEvent((UnitBase)this)); this.Health = 0; this.StandState = UNITSTANDSTATE.DEAD; this.Dead = true; this.DynamicFlags = 1; // If set to 1 there will be loot. this.LootOwner = pobj.GUID; this.UpdateData(); try { // Give xp to the right people. int exp = StatManager.CalculateExp(this, pobj); int maxdamage = 0; Hashtable expdividergroup = new Hashtable(); Hashtable expdividersolo = new Hashtable(); foreach (DictionaryEntry de in m_agrotable) { maxdamage += (int)de.Value; WorldClient aclient = WorldServer.GetClientByCharacterID((uint)de.Key); if (aclient.Player.Group == null) { expdividersolo.Add(aclient.Player.CharacterID, (int)de.Value); } else { if (expdividergroup[aclient.Player.Group.LeaderGUID] == null) { expdividergroup.Add(aclient.Player.Group.LeaderGUID, (int)de.Value); } else { int damagedealt = (int)expdividergroup[aclient.Player.Group.LeaderGUID]; damagedealt += (int)de.Value; expdividergroup[aclient.Player.Group.LeaderGUID] = damagedealt; } } } // Solo players foreach (DictionaryEntry de in expdividersolo) { float expbit = ((int)de.Value / (float)maxdamage); WorldClient aclient = WorldServer.GetClientByCharacterID((uint)de.Key); if (aclient != null) { aclient.Player.GainXp(Convert.ToInt32(exp * expbit), this.GUID); } } // Group players foreach (DictionaryEntry de in expdividergroup) { WorldClient aclient = WorldServer.GetClientByCharacterID(Convert.ToUInt32((ulong)de.Key)); if (aclient != null) { GroupObject gobj = aclient.Player.Group; float expbit = (((int)de.Value / (float)maxdamage) / (float)gobj.Size); for (int i = 0; i < gobj.Size; i++) { gobj.Members[i].GainXp(Convert.ToInt32(exp * expbit), this.GUID); } } } } catch (Exception exp) { DebugLogger.Logger.Log("", exp); } } else { this.UpdateData(); if (this.MobsRegenEvent == null) { this.MobsRegenEvent = new MobsRegenEvent(this); EventManager.AddEvent(this.MobsRegenEvent); } } } }