Beispiel #1
0
        public void MaievSendTransfer(ref WS_PlayerData.CharacterObject objCharacter)
        {
            if (!objCharacter.WardenData.Ready)
            {
                throw new ApplicationException("Maiev.mod not ready!");
            }
            FileStream file = new($"warden\\{WorldServiceLocator._WS_Warden.Maiev.ModuleName}.bin", FileMode.Open, FileAccess.Read);

            checked
            {
                int size;
                for (size = (int)file.Length; size > 500; size -= 500)
                {
                    Packets.PacketClass r = new(Opcodes.SMSG_WARDEN_DATA);
                    r.AddInt8(1);
                    r.AddInt16(500);
                    int i = 1;
                    do
                    {
                        r.AddInt8((byte)file.ReadByte());
                        i++;
                    }while (i <= 500);
                    WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_WARDEN_DATA [data]", objCharacter.client.IP, objCharacter.client.Port);
                    WorldServiceLocator._WS_Warden.SendWardenPacket(ref objCharacter, ref r);
                }
                if (size > 0)
                {
                    Packets.PacketClass r2 = new(Opcodes.SMSG_WARDEN_DATA);
                    r2.AddInt8(1);
                    r2.AddUInt16((ushort)size);
                    int num = size;
                    for (int j = 1; j <= num; j++)
                    {
                        r2.AddInt8((byte)file.ReadByte());
                    }
                    WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_WARDEN_DATA [done]", objCharacter.client.IP, objCharacter.client.Port);
                    WorldServiceLocator._WS_Warden.SendWardenPacket(ref objCharacter, ref r2);
                }
            }
        }
Beispiel #2
0
        public void UpdateItemCount(ref WS_PlayerData.CharacterObject objCharacter)
        {
            byte i = 0;

            do
            {
                checked
                {
                    if (ObjectivesItem[i] != 0)
                    {
                        ProgressItem[i] = (byte)objCharacter.ItemCOUNT(ObjectivesItem[i]);
                        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "ITEM COUNT UPDATED TO: {0}", ProgressItem[i]);
                    }
                    i = (byte)unchecked ((uint)(i + 1));
                }
            }while (i <= 3u);
            if ((ObjectiveFlags & 2) == 0)
            {
                Explored = true;
            }
            IsCompleted();
        }
 public void ClientLogin(uint id, ulong guid)
 {
     WorldServiceLocator._WorldServer.Log.WriteLine(LogType.NETWORK, "[{0:000000}] Client login [0x{1:X}]", id, guid);
     try
     {
         ClientClass client = WorldServiceLocator._WorldServer.CLIENTs[id];
         WS_PlayerData.CharacterObject Character = new WS_PlayerData.CharacterObject(ref client, guid);
         WorldServiceLocator._WorldServer.CHARACTERs_Lock.AcquireWriterLock(WorldServiceLocator._Global_Constants.DEFAULT_LOCK_TIMEOUT);
         WorldServiceLocator._WorldServer.CHARACTERs[guid] = Character;
         WorldServiceLocator._WorldServer.CHARACTERs_Lock.ReleaseWriterLock();
         WorldServiceLocator._Functions.SendCorpseReclaimDelay(ref client, ref Character);
         WorldServiceLocator._WS_PlayerHelper.InitializeTalentSpells(Character);
         Character.Login();
         WorldServiceLocator._WorldServer.Log.WriteLine(LogType.USER, "[{0}:{1}] Player login complete [0x{2:X}]", client.IP, client.Port, guid);
     }
     catch (Exception ex)
     {
         ProjectData.SetProjectError(ex);
         Exception e = ex;
         WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "Error on login: {0}", e.ToString());
         ProjectData.ClearProjectError();
     }
 }
Beispiel #4
0
        public void Initialize(ref WS_PlayerData.CharacterObject objCharacter)
        {
            if (ObjectivesDeliver > 0)
            {
                ItemObject tmpItem = new(ObjectivesDeliver, objCharacter.GUID);
                if (!objCharacter.ItemADD(ref tmpItem))
                {
                    tmpItem.Delete();
                    Packets.PacketClass response = new(Opcodes.SMSG_QUESTGIVER_QUEST_FAILED);
                    response.AddInt32(ID);
                    response.AddInt32(4);
                    objCharacter.client.Send(ref response);
                    response.Dispose();
                    return;
                }
                objCharacter.LogLootItem(tmpItem, 1, Recieved: true, Created: false);
            }
            byte i = 0;

            do
            {
                checked
                {
                    if (ObjectivesItem[i] != 0)
                    {
                        ProgressItem[i] = (byte)objCharacter.ItemCOUNT(ObjectivesItem[i]);
                    }
                    i = (byte)unchecked ((uint)(i + 1));
                }
            }while (i <= 3u);
            if (((uint)ObjectiveFlags & 2u) != 0)
            {
                Explored = false;
            }
            IsCompleted();
        }
 public override void OnEnterCombat()
 {
     base.OnEnterCombat();
     foreach (var Unit in aiHateTable)
     {
         if (Unit.Key is not WS_PlayerData.CharacterObject)
         {
             continue;
         }
         WS_PlayerData.CharacterObject characterObject = (WS_PlayerData.CharacterObject)Unit.Key;
         if (characterObject.IsInGroup)
         {
             var array = characterObject.Group.LocalMembers.ToArray();
             foreach (var member in array)
             {
                 if (WorldServiceLocator._WorldServer.CHARACTERs.ContainsKey(member) && WorldServiceLocator._WorldServer.CHARACTERs[member].MapID == characterObject.MapID && WorldServiceLocator._WorldServer.CHARACTERs[member].instance == characterObject.instance)
                 {
                     aiHateTable.Add(WorldServiceLocator._WorldServer.CHARACTERs[member], 0);
                 }
             }
             break;
         }
     }
 }
Beispiel #6
0
 public void InitializeTalentSpells(WS_PlayerData.CharacterObject objCharacter)
 {
     WS_Spells.SpellTargets t             = new WS_Spells.SpellTargets();
     WS_Base.BaseUnit       objCharacter2 = objCharacter;
     t.SetTarget_SELF(ref objCharacter2);
     objCharacter = (WS_PlayerData.CharacterObject)objCharacter2;
     foreach (KeyValuePair <int, WS_Spells.CharacterSpell> Spell in objCharacter.Spells)
     {
         if (WorldServiceLocator._WS_Spells.SPELLs.ContainsKey(Spell.Key) && WorldServiceLocator._WS_Spells.SPELLs[Spell.Key].IsPassive)
         {
             if (!objCharacter.HavePassiveAura(Spell.Key) && WorldServiceLocator._WS_Spells.SPELLs[Spell.Key].CanCast(ref objCharacter, t, FirstCheck: false) == SpellFailedReason.SPELL_NO_ERROR)
             {
                 WS_Spells.SpellInfo spellInfo = WorldServiceLocator._WS_Spells.SPELLs[Spell.Key];
                 WS_Base.BaseObject  caster    = objCharacter;
                 spellInfo.Apply(ref caster, t);
                 objCharacter = (WS_PlayerData.CharacterObject)caster;
             }
             else if (objCharacter.HavePassiveAura(Spell.Key) && WorldServiceLocator._WS_Spells.SPELLs[Spell.Key].CanCast(ref objCharacter, t, FirstCheck: false) != SpellFailedReason.SPELL_NO_ERROR)
             {
                 objCharacter.RemoveAuraBySpell(Spell.Key);
             }
         }
     }
 }
Beispiel #7
0
    public bool CheckAmmoCompatibility(ref WS_PlayerData.CharacterObject objCharacter, int AmmoID)
    {
        if (!WorldServiceLocator._WorldServer.ITEMDatabase.ContainsKey(AmmoID))
        {
            return(false);
        }
        if (!objCharacter.Items.ContainsKey(17) || objCharacter.Items[17].IsBroken())
        {
            return(false);
        }
        if (objCharacter.Items[17].ItemInfo.ObjectClass != ITEM_CLASS.ITEM_CLASS_WEAPON)
        {
            return(false);
        }
        switch (objCharacter.Items[17].ItemInfo.SubClass)
        {
        case ITEM_SUBCLASS.ITEM_SUBCLASS_LIQUID:
        case ITEM_SUBCLASS.ITEM_SUBCLASS_CROSSBOW:
            if (WorldServiceLocator._WorldServer.ITEMDatabase[AmmoID].SubClass != ITEM_SUBCLASS.ITEM_SUBCLASS_LIQUID)
            {
                return(false);
            }
            break;

        case ITEM_SUBCLASS.ITEM_SUBCLASS_POTION:
            if (WorldServiceLocator._WorldServer.ITEMDatabase[AmmoID].SubClass != ITEM_SUBCLASS.ITEM_SUBCLASS_POTION)
            {
                return(false);
            }
            break;

        default:
            return(false);
        }
        return(true);
    }
        public void InitializeReputations(ref WS_PlayerData.CharacterObject objCharacter)
        {
            byte i = 0;

            do
            {
                objCharacter.Reputation[i] = new WS_PlayerHelper.TReputation
                {
                    Value = 0,
                    Flags = 0
                };
                checked
                {
                    foreach (KeyValuePair <int, WS_DBCDatabase.TFaction> tmpFactionInfo in WorldServiceLocator._WS_DBCDatabase.FactionInfo)
                    {
                        if (tmpFactionInfo.Value.VisibleID != i)
                        {
                            continue;
                        }
                        byte j = 0;
                        do
                        {
                            if (WorldServiceLocator._Functions.HaveFlag((uint)tmpFactionInfo.Value.flags[j], (byte)((int)objCharacter.Race - 1)))
                            {
                                objCharacter.Reputation[i].Flags = tmpFactionInfo.Value.rep_flags[j];
                                objCharacter.Reputation[i].Value = tmpFactionInfo.Value.rep_stats[j];
                                break;
                            }
                            j = (byte)unchecked ((uint)(j + 1));
                        }while (j <= 3u);
                        break;
                    }
                    i = (byte)unchecked ((uint)(i + 1));
                }
            }while (i <= 63u);
        }
Beispiel #9
0
        public bool CanSeeQuest(ref WS_PlayerData.CharacterObject objCharacter)
        {
            bool retValue = true;

            checked
            {
                if (objCharacter.Level + 6 < Level_Start)
                {
                    retValue = false;
                }
            }
            if (RequiredClass > 0 && RequiredClass != (int)objCharacter.Classe)
            {
                retValue = false;
            }
            if (ZoneOrSort < 0)
            {
                WS_Quests tmpQuest = new WS_Quests();
                byte      reqSort  = tmpQuest.ClassByQuestSort(checked (-ZoneOrSort));
                if (reqSort > 0 && reqSort != (uint)objCharacter.Classe)
                {
                    retValue = false;
                }
            }
            if (RequiredRace != 0 && (RequiredRace & objCharacter.RaceMask) == 0)
            {
                retValue = false;
            }
            if (RequiredTradeSkill > 0)
            {
                if (!objCharacter.Skills.ContainsKey(RequiredTradeSkill))
                {
                    retValue = false;
                }
                if (objCharacter.Skills[RequiredTradeSkill].Current < RequiredTradeSkillValue)
                {
                    retValue = false;
                }
            }
            if (RequiredMinReputation_Faction > 0 && objCharacter.GetReputationValue(RequiredMinReputation_Faction) < RequiredMinReputation)
            {
                retValue = false;
            }
            if (RequiredMaxReputation_Faction > 0 && objCharacter.GetReputationValue(RequiredMaxReputation_Faction) >= RequiredMaxReputation)
            {
                retValue = false;
            }
            if (PreQuests.Count > 0)
            {
                foreach (int QuestID in PreQuests)
                {
                    if (QuestID > 0)
                    {
                        if (!objCharacter.QuestsCompleted.Contains(QuestID))
                        {
                            retValue = false;
                        }
                    }
                    else if (QuestID < 0 && objCharacter.QuestsCompleted.Contains(QuestID))
                    {
                        retValue = false;
                    }
                }
            }
            if (objCharacter.QuestsCompleted.Contains(ID))
            {
                retValue = false;
            }
            if (objCharacter.IsQuestInProgress(ID))
            {
                retValue = false;
            }
            return(retValue);
        }
 public virtual void OnQuestItem(ref WS_PlayerData.CharacterObject objCharacter, int ItemID, int ItemCount)
 {
 }
 public void InstanceMapLeave(WS_PlayerData.CharacterObject objChar)
 {
 }
Beispiel #12
0
        public Packets.PacketClass BuildPartyMemberStats(ref WS_PlayerData.CharacterObject objCharacter, uint flag)
        {
            Opcodes opCode = Opcodes.SMSG_PARTY_MEMBER_STATS;

            if (flag is 1015 or 524279)
            {
                opCode = Opcodes.SMSG_PARTY_MEMBER_STATS_FULL;
                if (objCharacter.ManaType != 0)
                {
                    flag |= 8u;
                }
            }
            Packets.PacketClass packet = new(opCode);
            packet.AddPackGUID(objCharacter.GUID);
            packet.AddUInt32(flag);
            if ((flag & (true ? 1u : 0u)) != 0)
            {
                byte memberFlags = 1;
                if (objCharacter.isPvP)
                {
                    memberFlags = (byte)(memberFlags | 2);
                }
                if (objCharacter.DEAD)
                {
                    memberFlags = (byte)(memberFlags | 0x10);
                }
                packet.AddInt8(memberFlags);
            }
            checked
            {
                if ((flag & 2u) != 0)
                {
                    packet.AddUInt16((ushort)objCharacter.Life.Current);
                }
                if ((flag & 4u) != 0)
                {
                    packet.AddUInt16((ushort)objCharacter.Life.Maximum);
                }
                if ((flag & 8u) != 0)
                {
                    packet.AddInt8((byte)objCharacter.ManaType);
                }
                if ((flag & 0x10u) != 0)
                {
                    if (objCharacter.ManaType == ManaTypes.TYPE_RAGE)
                    {
                        packet.AddUInt16((ushort)objCharacter.Rage.Current);
                    }
                    else if (objCharacter.ManaType == ManaTypes.TYPE_ENERGY)
                    {
                        packet.AddUInt16((ushort)objCharacter.Energy.Current);
                    }
                    else
                    {
                        packet.AddUInt16((ushort)objCharacter.Mana.Current);
                    }
                }
                if ((flag & 0x20u) != 0)
                {
                    if (objCharacter.ManaType == ManaTypes.TYPE_RAGE)
                    {
                        packet.AddUInt16((ushort)objCharacter.Rage.Maximum);
                    }
                    else if (objCharacter.ManaType == ManaTypes.TYPE_ENERGY)
                    {
                        packet.AddUInt16((ushort)objCharacter.Energy.Maximum);
                    }
                    else
                    {
                        packet.AddUInt16((ushort)objCharacter.Mana.Maximum);
                    }
                }
                if ((flag & 0x40u) != 0)
                {
                    packet.AddUInt16(objCharacter.Level);
                }
                if ((flag & 0x80u) != 0)
                {
                    packet.AddUInt16((ushort)objCharacter.ZoneID);
                }
                if ((flag & 0x100u) != 0)
                {
                    packet.AddInt16((short)objCharacter.positionX);
                    packet.AddInt16((short)objCharacter.positionY);
                }
                if ((flag & 0x200u) != 0)
                {
                    ulong auraMask2 = 0uL;
                    int   auraPos2  = packet.Data.Length;
                    packet.AddUInt64(0uL);
                    int num = WorldServiceLocator._Global_Constants.MAX_AURA_EFFECTs_VISIBLE - 1;
                    for (int j = 0; j <= num; j++)
                    {
                        if (objCharacter.ActiveSpells[j] != null)
                        {
                            unchecked
                            {
                                auraMask2 |= (ulong)(1L << checked ((int)(ulong)j));
                            }
                            packet.AddUInt16((ushort)objCharacter.ActiveSpells[j].SpellID);
                            packet.AddInt8(1);
                        }
                    }
                    packet.AddUInt64(auraMask2, auraPos2);
                }
                if ((flag & 0x400u) != 0)
                {
                    if (objCharacter.Pet != null)
                    {
                        packet.AddUInt64(objCharacter.Pet.GUID);
                    }
                    else
                    {
                        packet.AddInt64(0L);
                    }
                }
                if ((flag & 0x800u) != 0)
                {
                    if (objCharacter.Pet != null)
                    {
                        packet.AddString(objCharacter.Pet.PetName);
                    }
                    else
                    {
                        packet.AddString("");
                    }
                }
                if ((flag & 0x1000u) != 0)
                {
                    if (objCharacter.Pet != null)
                    {
                        packet.AddUInt16((ushort)objCharacter.Pet.Model);
                    }
                    else
                    {
                        packet.AddInt16(0);
                    }
                }
                if ((flag & 0x2000u) != 0)
                {
                    if (objCharacter.Pet != null)
                    {
                        packet.AddUInt16((ushort)objCharacter.Pet.Life.Current);
                    }
                    else
                    {
                        packet.AddInt16(0);
                    }
                }
                if ((flag & 0x4000u) != 0)
                {
                    if (objCharacter.Pet != null)
                    {
                        packet.AddUInt16((ushort)objCharacter.Pet.Life.Maximum);
                    }
                    else
                    {
                        packet.AddInt16(0);
                    }
                }
                if ((flag & 0x8000u) != 0)
                {
                    if (objCharacter.Pet != null)
                    {
                        packet.AddInt8(2);
                    }
                    else
                    {
                        packet.AddInt8(0);
                    }
                }
                if ((flag & 0x10000u) != 0)
                {
                    if (objCharacter.Pet != null)
                    {
                        packet.AddUInt16((ushort)objCharacter.Pet.Mana.Current);
                    }
                    else
                    {
                        packet.AddInt16(0);
                    }
                }
                if ((flag & 0x20000u) != 0)
                {
                    if (objCharacter.Pet != null)
                    {
                        packet.AddUInt16((ushort)objCharacter.Pet.Mana.Maximum);
                    }
                    else
                    {
                        packet.AddInt16(0);
                    }
                }
                if ((flag & 0x40000u) != 0)
                {
                    if (objCharacter.Pet != null)
                    {
                        ulong auraMask = 0uL;
                        int   auraPos  = packet.Data.Length;
                        packet.AddUInt64(0uL);
                        int num2 = WorldServiceLocator._Global_Constants.MAX_AURA_EFFECTs_VISIBLE - 1;
                        for (int i = 0; i <= num2; i++)
                        {
                            if (objCharacter.Pet.ActiveSpells[i] != null)
                            {
                                unchecked
                                {
                                    auraMask |= (ulong)(1L << checked ((int)(ulong)i));
                                }
                                packet.AddUInt16((ushort)objCharacter.Pet.ActiveSpells[i].SpellID);
                                packet.AddInt8(1);
                            }
                        }
                        packet.AddUInt64(auraMask, auraPos);
                    }
                    else
                    {
                        packet.AddInt64(0L);
                    }
                }
                return(packet);
            }
        }
Beispiel #13
0
 public void SendInitialSpells(ref WS_Network.ClientClass client, ref WS_PlayerData.CharacterObject Character)
 {
     Packets.PacketClass packet = new Packets.PacketClass(Opcodes.SMSG_INITIAL_SPELLS);
     checked
     {
         try
         {
             packet.AddInt8(0);
             int countPos = packet.Data.Length;
             packet.AddInt16(0);
             int spellCount = 0;
             Dictionary <int, KeyValuePair <uint, int> > spellCooldowns = new Dictionary <int, KeyValuePair <uint, int> >();
             foreach (KeyValuePair <int, WS_Spells.CharacterSpell> Spell in Character.Spells)
             {
                 if (Spell.Value.Active == 1)
                 {
                     packet.AddUInt16((ushort)Spell.Key);
                     packet.AddInt16(0);
                     spellCount++;
                     if (Spell.Value.Cooldown != 0)
                     {
                         spellCooldowns.Add(Spell.Key, new KeyValuePair <uint, int>(Spell.Value.Cooldown, 0));
                     }
                 }
             }
             packet.AddInt16((short)spellCount, countPos);
             spellCount = 0;
             countPos   = packet.Data.Length;
             packet.AddInt16(0);
             foreach (KeyValuePair <int, KeyValuePair <uint, int> > Cooldown in spellCooldowns)
             {
                 if (WorldServiceLocator._WS_Spells.SPELLs.ContainsKey(Cooldown.Key))
                 {
                     packet.AddUInt16((ushort)Cooldown.Key);
                     int timeLeft = 0;
                     if (Cooldown.Value.Key > WorldServiceLocator._Functions.GetTimestamp(DateAndTime.Now))
                     {
                         timeLeft = (int)(checked (Cooldown.Value.Key - WorldServiceLocator._Functions.GetTimestamp(DateAndTime.Now)) * 1000L);
                     }
                     packet.AddUInt16((ushort)Cooldown.Value.Value);
                     packet.AddUInt16((ushort)WorldServiceLocator._WS_Spells.SPELLs[Cooldown.Key].Category);
                     if (WorldServiceLocator._WS_Spells.SPELLs[Cooldown.Key].CategoryCooldown > 0)
                     {
                         packet.AddInt32(0);
                         packet.AddInt32(timeLeft);
                     }
                     else
                     {
                         packet.AddInt32(timeLeft);
                         packet.AddInt32(0);
                     }
                     spellCount++;
                 }
             }
             packet.AddInt16((short)spellCount, countPos);
             client.Send(ref packet);
         }
         finally
         {
             packet.Dispose();
         }
     }
 }
            private void Regenerate(object state)
            {
                if (RegenerationWorking)
                {
                    WorldServiceLocator._WorldServer.Log.WriteLine(LogType.WARNING, "Update: Regenerator skipping update");
                    return;
                }
                RegenerationWorking = true;
                NextGroupUpdate     = !NextGroupUpdate;
                checked
                {
                    try
                    {
                        WorldServiceLocator._WorldServer.CHARACTERs_Lock.AcquireReaderLock(WorldServiceLocator._Global_Constants.DEFAULT_LOCK_TIMEOUT);
                        foreach (KeyValuePair <ulong, WS_PlayerData.CharacterObject> Character in WorldServiceLocator._WorldServer.CHARACTERs)
                        {
                            if (Character.Value.DEAD || Character.Value.underWaterTimer != null || Character.Value.LogoutTimer != null || Character.Value.client == null)
                            {
                                continue;
                            }
                            WS_PlayerData.CharacterObject value = Character.Value;
                            BaseMana    = value.Mana.Current;
                            BaseRage    = value.Rage.Current;
                            BaseEnergy  = value.Energy.Current;
                            BaseLife    = value.Life.Current;
                            _updateFlag = false;
                            if (value.ManaType == ManaTypes.TYPE_RAGE)
                            {
                                switch (value.cUnitFlags & 0x80000)
                                {
                                case 0:
                                    if (value.Rage.Current > 0)
                                    {
                                        value.Rage.Current -= 25;
                                    }

                                    break;

                                default:
                                    if (value.RageRegenBonus != 0)
                                    {
                                        value.Rage.Increment(value.RageRegenBonus);
                                    }

                                    break;
                                }
                            }
                            if (value.ManaType == ManaTypes.TYPE_ENERGY && value.Energy.Current < value.Energy.Maximum)
                            {
                                value.Energy.Increment(20);
                            }
                            if (value.ManaRegen == 0)
                            {
                                value.UpdateManaRegen();
                            }
                            if (value.spellCastManaRegeneration == 0)
                            {
                                if ((value.ManaType == ManaTypes.TYPE_MANA || value.Classe == Classes.CLASS_DRUID) && value.Mana.Current < value.Mana.Maximum)
                                {
                                    value.Mana.Increment(value.ManaRegen * 2);
                                }
                            }
                            else
                            {
                                if ((value.ManaType == ManaTypes.TYPE_MANA || value.Classe == Classes.CLASS_DRUID) && value.Mana.Current < value.Mana.Maximum)
                                {
                                    value.Mana.Increment(value.ManaRegenInterrupt * 2);
                                }
                                if (value.spellCastManaRegeneration < 2)
                                {
                                    value.spellCastManaRegeneration = 0;
                                }
                                else
                                {
                                    value.spellCastManaRegeneration -= 2;
                                }
                            }
                            if (value.Life.Current < value.Life.Maximum && (value.cUnitFlags & 0x80000) == 0)
                            {
                                switch (value.Classe)
                                {
                                case Classes.CLASS_MAGE:
                                    value.Life.Increment((int)Math.Round(value.Spirit.Base * 0.1 * value.LifeRegenerationModifier) + value.LifeRegenBonus);
                                    break;

                                case Classes.CLASS_PRIEST:
                                    value.Life.Increment((int)Math.Round(value.Spirit.Base * 0.1 * value.LifeRegenerationModifier) + value.LifeRegenBonus);
                                    break;

                                case Classes.CLASS_WARLOCK:
                                    value.Life.Increment((int)Math.Round(value.Spirit.Base * 0.11 * value.LifeRegenerationModifier) + value.LifeRegenBonus);
                                    break;

                                case Classes.CLASS_DRUID:
                                    value.Life.Increment((int)Math.Round(value.Spirit.Base * 0.11 * value.LifeRegenerationModifier) + value.LifeRegenBonus);
                                    break;

                                case Classes.CLASS_SHAMAN:
                                    value.Life.Increment((int)Math.Round(value.Spirit.Base * 0.11 * value.LifeRegenerationModifier) + value.LifeRegenBonus);
                                    break;

                                case Classes.CLASS_ROGUE:
                                    value.Life.Increment((int)Math.Round(value.Spirit.Base * 0.5 * value.LifeRegenerationModifier) + value.LifeRegenBonus);
                                    break;

                                case Classes.CLASS_WARRIOR:
                                    value.Life.Increment((int)Math.Round(value.Spirit.Base * 0.8 * value.LifeRegenerationModifier) + value.LifeRegenBonus);
                                    break;

                                case Classes.CLASS_HUNTER:
                                    value.Life.Increment((int)Math.Round(value.Spirit.Base * 0.25 * value.LifeRegenerationModifier) + value.LifeRegenBonus);
                                    break;

                                case Classes.CLASS_PALADIN:
                                    value.Life.Increment((int)Math.Round(value.Spirit.Base * 0.25 * value.LifeRegenerationModifier) + value.LifeRegenBonus);
                                    break;
                                }
                            }
                            if (BaseMana != value.Mana.Current)
                            {
                                _updateFlag            = true;
                                value.GroupUpdateFlag |= 16u;
                                value.SetUpdateFlag(23, value.Mana.Current);
                            }
                            if ((BaseRage != value.Rage.Current) || ((value.cUnitFlags & 0x80000) == 0x80000))
                            {
                                _updateFlag            = true;
                                value.GroupUpdateFlag |= 16u;
                                value.SetUpdateFlag(24, value.Rage.Current);
                            }
                            if (BaseEnergy != value.Energy.Current)
                            {
                                _updateFlag            = true;
                                value.GroupUpdateFlag |= 16u;
                                value.SetUpdateFlag(26, value.Energy.Current);
                            }
                            if (BaseLife != value.Life.Current)
                            {
                                _updateFlag = true;
                                value.SetUpdateFlag(22, value.Life.Current);
                                value.GroupUpdateFlag |= 2u;
                            }
                            if (_updateFlag)
                            {
                                value.SendCharacterUpdate();
                            }
                            if (value.DuelOutOfBounds != 11)
                            {
                                value.DuelOutOfBounds -= 2;
                                if (value.DuelOutOfBounds == 0)
                                {
                                    WorldServiceLocator._WS_Spells.DuelComplete(ref value.DuelPartner, ref value.client.Character);
                                }
                            }
                            value.CheckCombat();
                            if (NextGroupUpdate)
                            {
                                value.GroupUpdate();
                            }
                            if (value.guidsForRemoving.Count > 0)
                            {
                                value.SendOutOfRangeUpdate();
                            }
                            value = null;
                        }
                        if (WorldServiceLocator._WorldServer.CHARACTERs_Lock.IsReaderLockHeld)
                        {
                            WorldServiceLocator._WorldServer.CHARACTERs_Lock.ReleaseReaderLock();
                        }
                    }
                    catch (Exception ex2)
                    {
                        ProjectData.SetProjectError(ex2);
                        Exception ex = ex2;
                        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.WARNING, "Error at regenerate.{0}", Environment.NewLine + ex);
                        ProjectData.ClearProjectError();
                    }
                    RegenerationWorking = false;
                }
            }
Beispiel #15
0
 public virtual bool OnQuestHello(ref WS_PlayerData.CharacterObject objCharacter, ulong cGUID)
 {
     return(true);
 }
 public virtual void OnQuestExplore(ref WS_PlayerData.CharacterObject objCharacter, int AreaID)
 {
 }
 public virtual void OnQuestEmote(ref WS_PlayerData.CharacterObject objCharacter, ref WS_Creatures.CreatureObject Creature, int EmoteID)
 {
 }
 public virtual void OnQuestCastSpell(ref WS_PlayerData.CharacterObject objCharacter, ref WS_GameObjects.GameObject GameObject, int SpellID)
 {
 }
 public virtual void OnQuestCastSpell(ref WS_PlayerData.CharacterObject objCharacter, ref WS_Creatures.CreatureObject Creature, int SpellID)
 {
 }
 public virtual void OnQuestKill(ref WS_PlayerData.CharacterObject objCharacter, ref WS_Creatures.CreatureObject Creature)
 {
 }
        public void CalculateOnLevelUP(ref WS_PlayerData.CharacterObject objCharacter)
        {
            int baseInt  = objCharacter.Intellect.Base;
            int baseSpi  = objCharacter.Spirit.Base;
            int baseAgi  = objCharacter.Agility.Base;
            int baseLife = objCharacter.Life.Maximum;

            checked
            {
                switch (objCharacter.Classe)
                {
                case Classes.CLASS_DRUID:
                    if (objCharacter.Level <= 17)
                    {
                        objCharacter.Life.Base += 17;
                    }
                    else
                    {
                        objCharacter.Life.Base += objCharacter.Level;
                    }
                    if (objCharacter.Level <= 25)
                    {
                        objCharacter.Mana.Base += 20 + objCharacter.Level;
                    }
                    else
                    {
                        objCharacter.Mana.Base += 45;
                    }
                    objCharacter.Strength.Base  += gainStat(objCharacter.Level, 2.1E-05, 0.003009, 0.486493, -0.400003);
                    objCharacter.Intellect.Base += gainStat(objCharacter.Level, 3.8E-05, 0.005145, 0.871006, -0.832029);
                    objCharacter.Agility.Base   += gainStat(objCharacter.Level, 4.1E-05, 0.00044, 0.512076, -1.000317);
                    objCharacter.Stamina.Base   += gainStat(objCharacter.Level, 2.3E-05, 0.003345, 0.56005, -0.562058);
                    objCharacter.Spirit.Base    += gainStat(objCharacter.Level, 5.9E-05, 0.004044, 1.04, -1.488504);
                    break;

                case Classes.CLASS_HUNTER:
                    if (objCharacter.Level <= 13)
                    {
                        objCharacter.Life.Base += 17;
                    }
                    else
                    {
                        objCharacter.Life.Base += objCharacter.Level + 4;
                    }
                    if (objCharacter.Level <= 27)
                    {
                        objCharacter.Mana.Base += 18 + objCharacter.Level;
                    }
                    else
                    {
                        objCharacter.Mana.Base += 45;
                    }
                    objCharacter.Strength.Base  += gainStat(objCharacter.Level, 2.2E-05, 0.0018, 0.407867, -0.550889);
                    objCharacter.Intellect.Base += gainStat(objCharacter.Level, 2E-05, 0.003007, 0.505215, -0.500642);
                    objCharacter.Agility.Base   += gainStat(objCharacter.Level, 4E-05, 0.007416, 1.125108, -1.003045);
                    objCharacter.Stamina.Base   += gainStat(objCharacter.Level, 3.1E-05, 0.00448, 0.78004, -0.800471);
                    objCharacter.Spirit.Base    += gainStat(objCharacter.Level, 1.7E-05, 0.003803, 0.536846, -0.490026);
                    break;

                case Classes.CLASS_MAGE:
                    if (objCharacter.Level <= 25)
                    {
                        objCharacter.Life.Base += 15;
                    }
                    else
                    {
                        objCharacter.Life.Base += objCharacter.Level - 8;
                    }
                    if (objCharacter.Level <= 27)
                    {
                        objCharacter.Mana.Base += 23 + objCharacter.Level;
                    }
                    else
                    {
                        objCharacter.Mana.Base += 51;
                    }
                    objCharacter.Strength.Base  += gainStat(objCharacter.Level, 2E-06, 0.001003, 0.10089, -0.076055);
                    objCharacter.Intellect.Base += gainStat(objCharacter.Level, 4E-05, 0.007416, 1.125108, -1.003045);
                    objCharacter.Agility.Base   += gainStat(objCharacter.Level, 8E-06, 0.001001, 0.16319, -0.06428);
                    objCharacter.Stamina.Base   += gainStat(objCharacter.Level, 6E-06, 0.002031, 0.27836, -0.340077);
                    objCharacter.Spirit.Base    += gainStat(objCharacter.Level, 3.9E-05, 0.006981, 1.09009, -1.00607);
                    break;

                case Classes.CLASS_PALADIN:
                    if (objCharacter.Level <= 14)
                    {
                        objCharacter.Life.Base += 18;
                    }
                    else
                    {
                        objCharacter.Life.Base += objCharacter.Level + 4;
                    }
                    if (objCharacter.Level <= 25)
                    {
                        objCharacter.Mana.Base += 17 + objCharacter.Level;
                    }
                    else
                    {
                        objCharacter.Mana.Base += 42;
                    }
                    objCharacter.Strength.Base  += gainStat(objCharacter.Level, 3.7E-05, 0.005455, 0.940039, -1.00009);
                    objCharacter.Intellect.Base += gainStat(objCharacter.Level, 2.3E-05, 0.003345, 0.56005, -0.562058);
                    objCharacter.Agility.Base   += gainStat(objCharacter.Level, 2E-05, 0.003007, 0.505215, -0.500642);
                    objCharacter.Stamina.Base   += gainStat(objCharacter.Level, 3.8E-05, 0.005145, 0.871006, -0.832029);
                    objCharacter.Spirit.Base    += gainStat(objCharacter.Level, 3.2E-05, 0.003025, 0.61589, -0.640307);
                    break;

                case Classes.CLASS_PRIEST:
                    if (objCharacter.Level <= 22)
                    {
                        objCharacter.Life.Base += 15;
                    }
                    else
                    {
                        objCharacter.Life.Base += objCharacter.Level - 6;
                    }
                    if (objCharacter.Level <= 33)
                    {
                        objCharacter.Mana.Base += 22 + objCharacter.Level;
                    }
                    else
                    {
                        objCharacter.Mana.Base += 54;
                    }
                    if (objCharacter.Level == 34)
                    {
                        objCharacter.Mana.Base += 15;
                    }
                    objCharacter.Strength.Base  += gainStat(objCharacter.Level, 8E-06, 0.001001, 0.16319, -0.06428);
                    objCharacter.Intellect.Base += gainStat(objCharacter.Level, 3.9E-05, 0.006981, 1.09009, -1.00607);
                    objCharacter.Agility.Base   += gainStat(objCharacter.Level, 2.2E-05, 2.2E-05, 0.260756, -0.494);
                    objCharacter.Stamina.Base   += gainStat(objCharacter.Level, 2.4E-05, 0.000981, 0.364935, -0.5709);
                    objCharacter.Spirit.Base    += gainStat(objCharacter.Level, 4E-05, 0.007416, 1.125108, -1.003045);
                    break;

                case Classes.CLASS_ROGUE:
                    if (objCharacter.Level <= 15)
                    {
                        objCharacter.Life.Base += 17;
                    }
                    else
                    {
                        objCharacter.Life.Base += objCharacter.Level + 2;
                    }
                    objCharacter.Strength.Base  += gainStat(objCharacter.Level, 2.5E-05, 0.00417, 0.654096, -0.601491);
                    objCharacter.Intellect.Base += gainStat(objCharacter.Level, 8E-06, 0.001001, 0.16319, -0.06428);
                    objCharacter.Agility.Base   += gainStat(objCharacter.Level, 3.8E-05, 0.007834, 1.191028, -1.20394);
                    objCharacter.Stamina.Base   += gainStat(objCharacter.Level, 3.2E-05, 0.003025, 0.61589, -0.640307);
                    objCharacter.Spirit.Base    += gainStat(objCharacter.Level, 2.4E-05, 0.000981, 0.364935, -0.5709);
                    break;

                case Classes.CLASS_SHAMAN:
                    if (objCharacter.Level <= 16)
                    {
                        objCharacter.Life.Base += 17;
                    }
                    else
                    {
                        objCharacter.Life.Base += objCharacter.Level + 1;
                    }
                    if (objCharacter.Level <= 32)
                    {
                        objCharacter.Mana.Base += 19 + objCharacter.Level;
                    }
                    else
                    {
                        objCharacter.Mana.Base += 52;
                    }
                    objCharacter.Strength.Base  += gainStat(objCharacter.Level, 3.5E-05, 0.003641, 0.73431, -0.800626);
                    objCharacter.Intellect.Base += gainStat(objCharacter.Level, 3.1E-05, 0.00448, 0.78004, -0.800471);
                    objCharacter.Agility.Base   += gainStat(objCharacter.Level, 2.2E-05, 0.0018, 0.407867, -0.550889);
                    objCharacter.Stamina.Base   += gainStat(objCharacter.Level, 2E-05, 0.00603, 0.80957, -0.80922);
                    objCharacter.Spirit.Base    += gainStat(objCharacter.Level, 3.8E-05, 0.005145, 0.871006, -0.832029);
                    break;

                case Classes.CLASS_WARLOCK:
                    if (objCharacter.Level <= 17)
                    {
                        objCharacter.Life.Base += 15;
                    }
                    else
                    {
                        objCharacter.Life.Base += objCharacter.Level - 2;
                    }
                    if (objCharacter.Level <= 30)
                    {
                        objCharacter.Mana.Base += 21 + objCharacter.Level;
                    }
                    else
                    {
                        objCharacter.Mana.Base += 51;
                    }
                    objCharacter.Strength.Base  += gainStat(objCharacter.Level, 6E-06, 0.002031, 0.27836, -0.340077);
                    objCharacter.Intellect.Base += gainStat(objCharacter.Level, 5.9E-05, 0.004044, 1.04, -1.488504);
                    objCharacter.Agility.Base   += gainStat(objCharacter.Level, 2.4E-05, 0.000981, 0.364935, -0.5709);
                    objCharacter.Stamina.Base   += gainStat(objCharacter.Level, 2.1E-05, 0.003009, 0.486493, -0.400003);
                    objCharacter.Spirit.Base    += gainStat(objCharacter.Level, 4E-05, 0.006404, 1.038791, -1.039076);
                    break;

                case Classes.CLASS_WARRIOR:
                    if (objCharacter.Level <= 14)
                    {
                        objCharacter.Life.Base += 19;
                    }
                    else
                    {
                        objCharacter.Life.Base += objCharacter.Level + 10;
                    }
                    objCharacter.Strength.Base  += gainStat(objCharacter.Level, 3.9E-05, 0.006902, 1.0800399999999999, -1.051701);
                    objCharacter.Intellect.Base += gainStat(objCharacter.Level, 2E-06, 0.001003, 0.10089, -0.076055);
                    objCharacter.Agility.Base   += gainStat(objCharacter.Level, 2.2E-05, 0.0046, 0.655333, -0.600356);
                    objCharacter.Stamina.Base   += gainStat(objCharacter.Level, 5.9E-05, 0.004044, 1.04, -1.488504);
                    objCharacter.Spirit.Base    += gainStat(objCharacter.Level, 6E-06, 0.002031, 0.27836, -0.340077);
                    break;
                }
                if (objCharacter.Agility.Base != baseAgi)
                {
                    objCharacter.Resistances[0].Base += (objCharacter.Agility.Base - baseAgi) * 2;
                }
                if (objCharacter.Spirit.Base != baseSpi)
                {
                    objCharacter.Life.Base += 10 * (objCharacter.Spirit.Base - baseSpi);
                }
                if (objCharacter.Intellect.Base != baseInt && objCharacter.ManaType == ManaTypes.TYPE_MANA)
                {
                    objCharacter.Mana.Base += 15 * (objCharacter.Intellect.Base - baseInt);
                }
                objCharacter.Damage.Minimum       += 1f;
                objCharacter.RangedDamage.Minimum += 1f;
                objCharacter.Damage.Maximum       += 1f;
                objCharacter.RangedDamage.Maximum += 1f;
                if (objCharacter.Level > 9)
                {
                    objCharacter.TalentPoints++;
                }
                foreach (KeyValuePair <int, WS_PlayerHelper.TSkill> Skill in objCharacter.Skills)
                {
                    if (WorldServiceLocator._WS_DBCDatabase.SkillLines[Skill.Key] == 6)
                    {
                        Skill.Value.Base += 5;
                    }
                }
            }
        }
 public virtual void OnQuestComplete(ref WS_PlayerData.CharacterObject objCharacter)
 {
 }
Beispiel #23
0
 public void AddToWorld()
 {
     WorldServiceLocator._WS_Maps.GetMapTile(positionX, positionY, ref CellX, ref CellY);
     if (WorldServiceLocator._WS_Maps.Maps[MapID].Tiles[CellX, CellY] == null)
     {
         WorldServiceLocator._WS_CharMovement.MAP_Load(CellX, CellY, MapID);
     }
     WorldServiceLocator._WS_Maps.Maps[MapID].Tiles[CellX, CellY].CorpseObjectsHere.Add(GUID);
     Packets.PacketClass packet = new Packets.PacketClass(Opcodes.SMSG_UPDATE_OBJECT);
     checked
     {
         try
         {
             Packets.UpdateClass tmpUpdate = new Packets.UpdateClass(WorldServiceLocator._Global_Constants.FIELD_MASK_SIZE_CORPSE);
             try
             {
                 packet.AddInt32(1);
                 packet.AddInt8(0);
                 FillAllUpdateFlags(ref tmpUpdate);
                 Packets.UpdateClass updateClass  = tmpUpdate;
                 CorpseObject        updateObject = this;
                 updateClass.AddToPacket(ref packet, ObjectUpdateType.UPDATETYPE_CREATE_OBJECT, ref updateObject);
             }
             finally
             {
                 tmpUpdate.Dispose();
             }
             short i = -1;
             do
             {
                 short j = -1;
                 do
                 {
                     if ((short)unchecked (CellX + i) >= 0 && (short)unchecked (CellX + i) <= 63 && (short)unchecked (CellY + j) >= 0 && (short)unchecked (CellY + j) <= 63 && WorldServiceLocator._WS_Maps.Maps[MapID].Tiles[(short)unchecked (CellX + i), (short)unchecked (CellY + j)] != null && WorldServiceLocator._WS_Maps.Maps[MapID].Tiles[(short)unchecked (CellX + i), (short)unchecked (CellY + j)].PlayersHere.Count > 0)
                     {
                         WS_Maps.TMapTile tMapTile = WorldServiceLocator._WS_Maps.Maps[MapID].Tiles[(short)unchecked (CellX + i), (short)unchecked (CellY + j)];
                         ulong[]          list     = tMapTile.PlayersHere.ToArray();
                         ulong[]          array    = list;
                         foreach (ulong plGUID in array)
                         {
                             int num;
                             if (WorldServiceLocator._WorldServer.CHARACTERs.ContainsKey(plGUID))
                             {
                                 WS_PlayerData.CharacterObject characterObject = WorldServiceLocator._WorldServer.CHARACTERs[plGUID];
                                 WS_Base.BaseObject            objCharacter    = this;
                                 num = (characterObject.CanSee(ref objCharacter) ? 1 : 0);
                             }
                             else
                             {
                                 num = 0;
                             }
                             if (num != 0)
                             {
                                 WorldServiceLocator._WorldServer.CHARACTERs[plGUID].client.SendMultiplyPackets(ref packet);
                                 WorldServiceLocator._WorldServer.CHARACTERs[plGUID].corpseObjectsNear.Add(GUID);
                                 SeenBy.Add(plGUID);
                             }
                         }
                     }
                     j = (short)unchecked (j + 1);
                 }while (j <= 1);
                 i = (short)unchecked (i + 1);
             }while (i <= 1);
         }
         finally
         {
             packet.Dispose();
         }
     }
 }
Beispiel #24
0
        public void Update()
        {
            checked
            {
                var num = WorldServiceLocator._Global_Constants.MAX_AURA_EFFECTs - 1;
                for (var i = 0; i <= num; i++)
                {
                    if (ActiveSpells[i] == null)
                    {
                        continue;
                    }
                    if (ActiveSpells[i].SpellDuration == WorldServiceLocator._Global_Constants.SPELL_DURATION_INFINITE)
                    {
                        ActiveSpells[i].SpellDuration = Duration;
                    }
                    if (ActiveSpells[i].SpellDuration != WorldServiceLocator._Global_Constants.SPELL_DURATION_INFINITE)
                    {
                        ActiveSpells[i].SpellDuration -= 1000;
                        byte k = 0;
                        do
                        {
                            if (ActiveSpells[i] != null && ActiveSpells[i].Aura[k] != null && ActiveSpells[i].Aura_Info[k].Amplitude != 0 && checked (Duration - ActiveSpells[i].SpellDuration) % ActiveSpells[i].Aura_Info[k].Amplitude == 0)
                            {
                                var obj = ActiveSpells[i].Aura[k];
                                WS_Base.BaseUnit   Target      = this;
                                ref var            spellCaster = ref ActiveSpells[i].SpellCaster;
                                WS_Base.BaseObject baseObject  = spellCaster;
                                obj(ref Target, ref baseObject, ref ActiveSpells[i].Aura_Info[k], ActiveSpells[i].SpellID, ActiveSpells[i].StackCount + 1, AuraAction.AURA_UPDATE);
                                spellCaster = (WS_Base.BaseUnit)baseObject;
                            }
                            k = (byte)unchecked ((uint)(k + 1));
                        }while (k <= 2u);
                        if (ActiveSpells[i] != null && ActiveSpells[i].SpellDuration <= 0 && ActiveSpells[i].SpellDuration != WorldServiceLocator._Global_Constants.SPELL_DURATION_INFINITE)
                        {
                            RemoveAura(i, ref ActiveSpells[i].SpellCaster, RemovedByDuration: true);
                        }
                    }
                    byte j = 0;
                    do
                    {
                        if (ActiveSpells[i] != null && ActiveSpells[i].Aura_Info[j] != null && ActiveSpells[i].Aura_Info[j].ID == SpellEffects_Names.SPELL_EFFECT_APPLY_AREA_AURA)
                        {
                            List <WS_Base.BaseUnit> Targets = new();
                            switch (Caster)
                            {
                            case WS_PlayerData.CharacterObject _:
                            {
                                var wS_Spells = WorldServiceLocator._WS_Spells;
                                WS_PlayerData.CharacterObject objCharacter = (WS_PlayerData.CharacterObject)Caster;
                                Targets = wS_Spells.GetPartyMembersAtPoint(ref objCharacter, ActiveSpells[i].Aura_Info[j].GetRadius, positionX, positionY, positionZ);
                                break;
                            }

                            default:
                            {
                                var wS_Spells2          = WorldServiceLocator._WS_Spells;
                                WS_Base.BaseUnit Target = this;
                                Targets = wS_Spells2.GetFriendAroundMe(ref Target, ActiveSpells[i].Aura_Info[j].GetRadius);
                                break;
                            }
                            }
                            foreach (var item in new List <WS_Base.BaseUnit>())
                            {
                                var Unit = item;
                                if (!Unit.HaveAura(ActiveSpells[i].SpellID))
                                {
                                    var wS_Spells3 = WorldServiceLocator._WS_Spells;
                                    WS_Base.BaseObject baseObject = this;
                                    wS_Spells3.ApplyAura(ref Unit, ref baseObject, ref ActiveSpells[i].Aura_Info[j], ActiveSpells[i].SpellID);
                                }
                            }
                        }
                        j = (byte)unchecked ((uint)(j + 1));
                    }while (j <= 2u);
                }
            }
Beispiel #25
0
 public void MaievSendUnk(ref WS_PlayerData.CharacterObject objCharacter)
 {
     Packets.PacketClass unk = new(Opcodes.SMSG_WARDEN_DATA);
     try
     {
         unk.AddInt8(3);
         unk.AddByteArray(new byte[56]
         {
             20,
             0,
             96,
             208,
             254,
             44,
             1,
             0,
             2,
             0,
             32,
             26,
             54,
             0,
             192,
             227,
             53,
             0,
             80,
             241,
             53,
             0,
             192,
             245,
             53,
             0,
             3,
             8,
             0,
             119,
             108,
             147,
             169,
             4,
             0,
             0,
             96,
             168,
             64,
             0,
             1,
             3,
             8,
             0,
             54,
             133,
             234,
             240,
             1,
             1,
             0,
             144,
             244,
             69,
             0,
             1
         });
         WorldServiceLocator._WS_Warden.SendWardenPacket(ref objCharacter, ref unk);
     }
     finally
     {
         unk.Dispose();
     }
 }
            public void Check()
            {
                if (Looters.Count != Rolls.Count)
                {
                    return;
                }
                byte maxRollType = 0;

                foreach (KeyValuePair <WS_PlayerData.CharacterObject, int> looter2 in Looters)
                {
                    if (looter2.Value == 1)
                    {
                        maxRollType = 1;
                    }
                    if (looter2.Value == 2 && maxRollType != 1)
                    {
                        maxRollType = 2;
                    }
                }
                if (maxRollType == 0)
                {
                    LootObject.GroupLootInfo.Remove(LootSlot);
                    Packets.PacketClass response2 = new(Opcodes.SMSG_LOOT_ALL_PASSED);
                    response2.AddUInt64(LootObject.GUID);
                    response2.AddInt32(LootSlot);
                    response2.AddInt32(Item.ItemID);
                    response2.AddInt32(0);
                    response2.AddInt32(0);
                    Broadcast(ref response2);
                    response2.Dispose();
                    return;
                }
                WS_PlayerData.CharacterObject looterCharacter = null;
                checked
                {
                    int maxRoll = -1;
                    foreach (KeyValuePair <WS_PlayerData.CharacterObject, int> looter in Looters)
                    {
                        if (looter.Value == maxRollType)
                        {
                            byte rollValue = (byte)WorldServiceLocator._WorldServer.Rnd.Next(0, 100);
                            if (rollValue > maxRoll)
                            {
                                maxRoll         = rollValue;
                                looterCharacter = looter.Key;
                            }
                            Packets.PacketClass response = new(Opcodes.SMSG_LOOT_ROLL);
                            response.AddUInt64(LootObject.GUID);
                            response.AddInt32(LootSlot);
                            response.AddUInt64(looter.Key.GUID);
                            response.AddInt32(Item.ItemID);
                            response.AddInt32(0);
                            response.AddInt32(0);
                            response.AddInt8(rollValue);
                            response.AddInt8((byte)looter.Value);
                            Broadcast(ref response);
                            response.Dispose();
                        }
                    }
                    ItemObject itemObject = new(Item.ItemID, looterCharacter.GUID)
                    {
                        StackCount = Item.ItemCount
                    };
                    ItemObject          tmpItem = itemObject;
                    Packets.PacketClass wonItem = new(Opcodes.SMSG_LOOT_ROLL_WON);
                    wonItem.AddUInt64(LootObject.GUID);
                    wonItem.AddInt32(LootSlot);
                    wonItem.AddInt32(Item.ItemID);
                    wonItem.AddInt32(0);
                    wonItem.AddInt32(0);
                    wonItem.AddUInt64(looterCharacter.GUID);
                    wonItem.AddInt8((byte)maxRoll);
                    wonItem.AddInt8(maxRollType);
                    Broadcast(ref wonItem);
                    if (looterCharacter.ItemADD(ref tmpItem))
                    {
                        looterCharacter.LogLootItem(tmpItem, Item.ItemCount, Recieved: false, Created: false);
                        LootObject.GroupLootInfo.Remove(LootSlot);
                        LootObject.Items[LootSlot] = null;
                    }
                    else
                    {
                        tmpItem.Delete();
                        LootObject.GroupLootInfo.Remove(LootSlot);
                    }
                }
            }
Beispiel #27
0
        public void SendInitWorldStates(ref WS_Network.ClientClass client, ref WS_PlayerData.CharacterObject Character)
        {
            Character.ZoneCheck();
            ushort NumberOfFields;

            switch (Character.ZoneID)
            {
            case 0:
            case 1:
            case 4:
            case 8:
            case 10:
            case 11:
            case 12:
            case 36:
            case 38:
            case 40:
            case 41:
            case 51:
            case 267:
            case 1519:
            case 1537:
            case 2257:
            case 2918:
                NumberOfFields = 6;
                break;

            case 2597:
                NumberOfFields = 81;
                break;

            case 3277:
                NumberOfFields = 14;
                break;

            case 3358:
            case 3820:
                NumberOfFields = 38;
                break;

            case 3483:
                NumberOfFields = 22;
                break;

            case 3519:
                NumberOfFields = 36;
                break;

            case 3521:
                NumberOfFields = 35;
                break;

            case 3698:
            case 3702:
            case 3968:
                NumberOfFields = 9;
                break;

            case 3703:
                NumberOfFields = 9;
                break;

            default:
                NumberOfFields = 10;
                break;
            }
            Packets.PacketClass packet = new Packets.PacketClass(Opcodes.SMSG_INIT_WORLD_STATES);
            try
            {
                packet.AddUInt32(Character.MapID);
                packet.AddInt32(Character.ZoneID);
                packet.AddInt32(Character.AreaID);
                packet.AddUInt16(NumberOfFields);
                packet.AddUInt32(2264u);
                packet.AddUInt32(0u);
                packet.AddUInt32(2263u);
                packet.AddUInt32(0u);
                packet.AddUInt32(2262u);
                packet.AddUInt32(0u);
                packet.AddUInt32(2261u);
                packet.AddUInt32(0u);
                packet.AddUInt32(2260u);
                packet.AddUInt32(0u);
                packet.AddUInt32(2259u);
                packet.AddUInt32(0u);
                switch (Character.ZoneID)
                {
                case 3968:
                    packet.AddUInt32(3000u);
                    packet.AddUInt32(0u);
                    packet.AddUInt32(3001u);
                    packet.AddUInt32(0u);
                    packet.AddUInt32(3002u);
                    packet.AddUInt32(0u);
                    break;

                default:
                    packet.AddUInt32(2324u);
                    packet.AddUInt32(0u);
                    packet.AddUInt32(2323u);
                    packet.AddUInt32(0u);
                    packet.AddUInt32(2322u);
                    packet.AddUInt32(0u);
                    packet.AddUInt32(2325u);
                    packet.AddUInt32(0u);
                    break;

                case 1:
                case 11:
                case 12:
                case 38:
                case 40:
                case 51:
                case 1519:
                case 1537:
                case 2257:
                case 2597:
                case 3277:
                case 3358:
                case 3820:
                    break;
                }
                client.Send(ref packet);
            }
            finally
            {
                packet.Dispose();
            }
        }
Beispiel #28
0
            public void AddToWorld()
            {
                WorldServiceLocator._WS_Maps.GetMapTile(positionX, positionY, ref CellX, ref CellY);
                if (WorldServiceLocator._WS_Maps.Maps[MapID].Tiles[CellX, CellY] == null)
                {
                    WorldServiceLocator._WS_CharMovement.MAP_Load(CellX, CellY, MapID);
                }
                try
                {
                    WorldServiceLocator._WS_Maps.Maps[MapID].Tiles[CellX, CellY].DynamicObjectsHere.Add(GUID);
                }
                catch (Exception projectError)
                {
                    ProjectData.SetProjectError(projectError);
                    WorldServiceLocator._WorldServer.Log.WriteLine(LogType.WARNING, "AddToWorld failed MapId: {0} Tile XY: {1} {2} GUID: {3}", MapID, CellX, CellY, GUID);
                    ProjectData.ClearProjectError();
                    return;
                }
                Packets.PacketClass packet = new Packets.PacketClass(Opcodes.SMSG_UPDATE_OBJECT);
                packet.AddInt32(1);
                packet.AddInt8(0);
                Packets.UpdateClass tmpUpdate = new Packets.UpdateClass(WorldServiceLocator._Global_Constants.FIELD_MASK_SIZE_DYNAMICOBJECT);
                FillAllUpdateFlags(ref tmpUpdate);
                Packets.UpdateClass updateClass  = tmpUpdate;
                DynamicObjectObject updateObject = this;

                updateClass.AddToPacket(ref packet, ObjectUpdateType.UPDATETYPE_CREATE_OBJECT_SELF, ref updateObject);
                tmpUpdate.Dispose();
                short i = -1;

                checked
                {
                    do
                    {
                        short j = -1;
                        do
                        {
                            if ((short)unchecked (CellX + i) >= 0 && (short)unchecked (CellX + i) <= 63 && (short)unchecked (CellY + j) >= 0 && (short)unchecked (CellY + j) <= 63 && WorldServiceLocator._WS_Maps.Maps[MapID].Tiles[(short)unchecked (CellX + i), (short)unchecked (CellY + j)] != null && WorldServiceLocator._WS_Maps.Maps[MapID].Tiles[(short)unchecked (CellX + i), (short)unchecked (CellY + j)].PlayersHere.Count > 0)
                            {
                                WS_Maps.TMapTile tMapTile = WorldServiceLocator._WS_Maps.Maps[MapID].Tiles[(short)unchecked (CellX + i), (short)unchecked (CellY + j)];
                                ulong[]          list     = tMapTile.PlayersHere.ToArray();
                                ulong[]          array    = list;
                                foreach (ulong plGUID in array)
                                {
                                    int num;
                                    if (WorldServiceLocator._WorldServer.CHARACTERs.ContainsKey(plGUID))
                                    {
                                        WS_PlayerData.CharacterObject characterObject = WorldServiceLocator._WorldServer.CHARACTERs[plGUID];
                                        WS_Base.BaseObject            objCharacter    = this;
                                        num = (characterObject.CanSee(ref objCharacter) ? 1 : 0);
                                    }
                                    else
                                    {
                                        num = 0;
                                    }
                                    if (num != 0)
                                    {
                                        WorldServiceLocator._WorldServer.CHARACTERs[plGUID].client.SendMultiplyPackets(ref packet);
                                        WorldServiceLocator._WorldServer.CHARACTERs[plGUID].dynamicObjectsNear.Add(GUID);
                                        SeenBy.Add(plGUID);
                                    }
                                }
                            }
                            j = (short)unchecked (j + 1);
                        }while (j <= 1);
                        i = (short)unchecked (i + 1);
                    }while (i <= 1);
                    packet.Dispose();
                }
            }
            private void UpdateSpells(ref WS_Base.BaseUnit objCharacter)
            {
                if (objCharacter is WS_Totems.TotemObject @object)
                {
                    @object.Update();
                    return;
                }
                checked
                {
                    for (int i = 0; i <= WorldServiceLocator._Global_Constants.MAX_AURA_EFFECTs - 1; i++)
                    {
                        if (objCharacter.ActiveSpells[i] == null)
                        {
                            continue;
                        }
                        if (objCharacter.ActiveSpells[i].SpellDuration != WorldServiceLocator._Global_Constants.SPELL_DURATION_INFINITE)
                        {
                            objCharacter.ActiveSpells[i].SpellDuration -= 1000;
                            byte j = 0;
                            do
                            {
                                if (objCharacter.ActiveSpells[i] != null && objCharacter.ActiveSpells[i].Aura[j] != null && objCharacter.ActiveSpells[i].Aura_Info[j] != null && objCharacter.ActiveSpells[i].Aura_Info[j].Amplitude != 0 && checked (objCharacter.ActiveSpells[i].GetSpellInfo.GetDuration - objCharacter.ActiveSpells[i].SpellDuration) % objCharacter.ActiveSpells[i].Aura_Info[j].Amplitude == 0)
                                {
                                    ref WS_Base.BaseUnit spellCaster = ref objCharacter.ActiveSpells[i].SpellCaster;
                                    WS_Base.BaseObject   Caster      = spellCaster;
                                    objCharacter.ActiveSpells[i].Aura[j](ref objCharacter, ref Caster, ref objCharacter.ActiveSpells[i].Aura_Info[j], objCharacter.ActiveSpells[i].SpellID, objCharacter.ActiveSpells[i].StackCount + 1, AuraAction.AURA_UPDATE);
                                    ref WS_Base.BaseUnit reference = ref spellCaster;
                                    reference = (WS_Base.BaseUnit)Caster;
                                }
                                j = (byte)unchecked ((uint)(j + 1));
                            }while (j <= 2u);
                            if (objCharacter.ActiveSpells[i] != null && objCharacter.ActiveSpells[i].SpellDuration <= 0 && objCharacter.ActiveSpells[i].SpellDuration != WorldServiceLocator._Global_Constants.SPELL_DURATION_INFINITE)
                            {
                                objCharacter.RemoveAura(i, ref objCharacter.ActiveSpells[i].SpellCaster, RemovedByDuration: true);
                            }
                        }
                        byte k = 0;
                        do
                        {
                            if (objCharacter.ActiveSpells[i] != null && objCharacter.ActiveSpells[i].Aura_Info[k] != null && objCharacter.ActiveSpells[i].Aura_Info[k].ID == SpellEffects_Names.SPELL_EFFECT_APPLY_AREA_AURA)
                            {
                                if (objCharacter.ActiveSpells[i].SpellCaster == objCharacter)
                                {
                                    List <WS_Base.BaseUnit> Targets = new List <WS_Base.BaseUnit>();
                                    switch (objCharacter)
                                    {
                                    case WS_PlayerData.CharacterObject _:
                                    {
                                        WS_Spells wS_Spells = WorldServiceLocator._WS_Spells;
                                        WS_PlayerData.CharacterObject objCharacter2 = (WS_PlayerData.CharacterObject)objCharacter;
                                        Targets = wS_Spells.GetPartyMembersAroundMe(ref objCharacter2, objCharacter.ActiveSpells[i].Aura_Info[k].GetRadius);
                                        break;
                                    }

                                    case WS_Totems.TotemObject _ when((WS_Totems.TotemObject) objCharacter).Caster != null && ((WS_Totems.TotemObject)objCharacter).Caster is WS_PlayerData.CharacterObject:
                                    {
                                        WS_Spells                     wS_Spells2          = WorldServiceLocator._WS_Spells;
                                        ref WS_Base.BaseUnit          caster2             = ref ((WS_Totems.TotemObject)objCharacter).Caster;
                                        ref WS_Base.BaseUnit          reference           = ref caster2;
                                        WS_PlayerData.CharacterObject objCharacter2       = (WS_PlayerData.CharacterObject)caster2;
                                        List <WS_Base.BaseUnit>       partyMembersAtPoint = wS_Spells2.GetPartyMembersAtPoint(ref objCharacter2, objCharacter.ActiveSpells[i].Aura_Info[k].GetRadius, objCharacter.positionX, objCharacter.positionY, objCharacter.positionZ);
                                        reference = objCharacter2;
                                        Targets   = partyMembersAtPoint;
                                        break;
                                    }
                                    }
                                    foreach (WS_Base.BaseUnit item in Targets)
                                    {
                                        WS_Base.BaseUnit Unit = item;
                                        if (!Unit.HaveAura(objCharacter.ActiveSpells[i].SpellID))
                                        {
                                            WS_Spells          wS_Spells3 = WorldServiceLocator._WS_Spells;
                                            WS_Base.BaseObject Caster     = objCharacter;
                                            wS_Spells3.ApplyAura(ref Unit, ref Caster, ref objCharacter.ActiveSpells[i].Aura_Info[k], objCharacter.ActiveSpells[i].SpellID);
                                            objCharacter = (WS_Base.BaseUnit)Caster;
                                        }
                                    }
                                }
                                else if (objCharacter.ActiveSpells[i].SpellCaster != null && objCharacter.ActiveSpells[i].SpellCaster.Exist)
                                {
                                    WS_PlayerData.CharacterObject caster = null;
                                    switch (objCharacter.ActiveSpells[i].SpellCaster)
                                    {
                                    case WS_PlayerData.CharacterObject _:
                                        caster = (WS_PlayerData.CharacterObject)objCharacter.ActiveSpells[i].SpellCaster;
                                        break;

                                    case WS_Totems.TotemObject _ when((WS_Totems.TotemObject) objCharacter.ActiveSpells[i].SpellCaster).Caster != null && ((WS_Totems.TotemObject)objCharacter.ActiveSpells[i].SpellCaster).Caster is WS_PlayerData.CharacterObject object1:
                                        caster = object1;

                                        break;
                                    }
                                    if (caster == null || caster.Group == null || !caster.Group.LocalMembers.Contains(objCharacter.GUID))
                                    {
                                        objCharacter.RemoveAura(i, ref objCharacter.ActiveSpells[i].SpellCaster);
                                    }
                                    else if (!objCharacter.ActiveSpells[i].SpellCaster.HaveAura(objCharacter.ActiveSpells[i].SpellID))
                                    {
                                        objCharacter.RemoveAura(i, ref objCharacter.ActiveSpells[i].SpellCaster);
                                    }
                                    else if (WorldServiceLocator._WS_Combat.GetDistance(objCharacter, objCharacter.ActiveSpells[i].SpellCaster) > objCharacter.ActiveSpells[i].Aura_Info[k].GetRadius)
                                    {
                                        objCharacter.RemoveAura(i, ref objCharacter.ActiveSpells[i].SpellCaster);
                                    }
                                }
                                else
                                {
                                    objCharacter.RemoveAura(i, ref objCharacter.ActiveSpells[i].SpellCaster);
                                }
                            }
 public virtual void OnQuestCancel(ref WS_PlayerData.CharacterObject objCharacter)
 {
 }