public ZonePlayer(short entityId, Data.Character toon, ushort zoneId, Client client) : base(entityId, toon.Name, toon.Surname, toon.X, toon.Y, toon.Z, toon.Heading.Value) { this.Client = client; _acctId = toon.AccountID; _charId = toon.CharacterID; _acctStatus = toon.Account.Status; _connState = ZoneConnectionState.Connecting; // TODO: change storage to the cached profile _pp.ZoneId = (ushort)zoneId; this.Class = toon.Class.Value; this.Level = toon.CharLevel; _pp.XP = toon.XP; // Bypass property setter to avoid packet sending _pp.Points = toon.PracticePoints.Value; _pp.STR = (uint)toon.STR.Value; _pp.STA = (uint)toon.STA.Value; _pp.DEX = (uint)toon.DEX.Value; _pp.AGI = (uint)toon.AGI.Value; _pp.INT = (uint)toon.INT.Value; _pp.WIS = (uint)toon.WIS.Value; _pp.CHA = (uint)toon.CHA.Value; this.Race = toon.Race.Value; _baseRace = toon.Race.Value; this.Gender = toon.Gender.Value; _baseGender = toon.Gender.Value; this.Deity = (uint)toon.Deity.Value; _hairColor = toon.HairColor.Value; _hairStyle = toon.HairStyle.Value; _beardColor = toon.BeardColor.Value; _beard = toon.Beard.Value; _eyeColor1 = toon.EyeColor1.Value; _eyeColor2 = toon.EyeColor2.Value; _luclinFace = toon.Face.Value; this.GMStatus = toon.GMStatus; this.Platinum = toon.Platinum; this.Gold = toon.Gold; this.Silver = toon.Silver; this.Copper = toon.Copper; _pp.Birthday = Utility.TimeTFromDateTime(toon.CreatedDate); _pp.LastLogin = _pp.Birthday; //_pp.TimePlayedMin = 0; _pp.HungerLevel = (uint)toon.HungerLevel.Value; _pp.ThirstLevel = (uint)toon.ThirstLevel.Value; _pp.Languages = Encoding.ASCII.GetBytes(toon.Languages); if (this.X == -1 && this.Y == -1 && this.Z == -1) // -1 is what these were set to on char creation { // set to zone safe points this.X = toon.Zone.SafeX; this.Y = toon.Zone.SafeY; this.Z = toon.Zone.SafeZ; _log.Debug("Char coords set to safe points"); } // TODO: factions // TODO: old emu has code for invalid Z position fix _invMgr = new InventoryManager(toon.InventoryItems, this); _invMgr.ItemChargeUsed += new EventHandler<ItemChargeUseEventArgs>(InvMgr_ItemChargeUsed); _invMgr.ItemMoved += new EventHandler<ItemMoveEventArgs>(InvMgr_ItemMoved); // TODO: guild stuff _pp.GuildRank = (byte)Guild.GuildRank.None; // TODO: implement guild tables and fetch this live _size = Mob.GetSize((CharRaces)_race); // TODO: AAs // Spells foreach (ScribedSpell ss in toon.ScribedSpells) _pp.SpellBook[ss.SlotID] = ss.SpellID; foreach (MemorizedSpell ms in toon.MemorizedSpells) { _pp.MemSpells[ms.SlotID] = ms.SpellID; _memdSpells[ms.SlotID] = ms.Spell; } // TODO: buffs? for (int i = 0; i < Character.MAX_BUFF; i++) // blank out the buffs spell id Buffer.BlockCopy(BitConverter.GetBytes((uint)Spell.BLANK_SPELL), 0, _pp.BuffsBlob, (20 * i) + 4, 4); //_pp.BuffsBlob[i] = 0xFF; // TODO: binds _pp.Binds[0].ZoneId = (uint)zoneId; _pp.Binds[0].X = this.X; _pp.Binds[0].Y = this.Y; _pp.Binds[0].Z = this.Z; _pp.Binds[0].Heading = this.Heading; _pp.Mana = 0u; // TODO: Mana _pp.HP = (uint)toon.HP.Value; _curHP = toon.HP.Value; // Bypass property settors to avoid packet sending CalcStatModifiers(); // Calculate stats (ac, attack, hp, bonuses, etc.) if (_pp.HP <= 0) { _pp.HP = (uint)this.MaxHP; // If they were dead, let's set things back to full _curHP = this.MaxHP; } _pp.Endurance = _maxEndurance; // TODO: group shit // TODO: once zone init is coded, do underworld checks // Skills for (int i = 0; i < toon.Skills.Length; i++) _pp.Skills[i] = (uint)toon.Skills[i]; // may want to turn the db representation into an nchar if skill levels get > 255 // TODO: tribute _pp.TributeTimeRemaining = uint.MaxValue; InitPlayerProfile(); // Init timers int autoSaveInterval = WorldServer.ServerConfig.AutosaveIntervalSec * 1000; _autoSaveTimer = new Timer(new TimerCallback(AutosaveTimerCallback), null, autoSaveInterval, autoSaveInterval); _ldTimer = new SimpleTimer(0); _deadTimer = new SimpleTimer(0); _hpUpdateTimer = new SimpleTimer(0); _campTimer = new SimpleTimer(0); _msgMgr = new MessagingManager(this); }
/// <summary>Sends the provided packet to all clients that meet the specified zone connection state.</summary> internal void QueuePacketToClients(Mob sender, EQRawApplicationPacket packet, ZoneConnectionState reqConnState, bool skipSender) { QueuePacketToClients(sender, packet, reqConnState, skipSender, true); }
internal void QueuePacketToClients(Mob sender, EQRawApplicationPacket packet, ZoneConnectionState reqConnState, bool skipSender, bool ackReq) { foreach (Client client in this.GetConnectedClients()) { if (client.ZonePlayer == null || (client.ZonePlayer == sender && skipSender)) continue; // Don't send to a client before its zonePlayer is set or to self if skip set QueuePacketToClient(client, packet, ackReq, reqConnState); } }
internal void QueuePacketToClient(Client client, EQRawApplicationPacket appPacket, bool ackReq, ZoneConnectionState reqConnState) { // TODO: when messaging filters are in, add support here // See if the packet should be deferred for later sending when the client is "connected" if (reqConnState == ZoneConnectionState.All || client.ZonePlayer.ConnectionState == reqConnState) client.SendApplicationPacket(appPacket); else client.ZonePlayer.AddDeferredPacket(new DeferredPacket(appPacket, true)); }