Esempio n. 1
0
        BattlenetRpcErrorCode HandleLogon(LogonRequest logonRequest, NoData response)
        {
            if (logonRequest.Program != "WoW")
            {
                Log.outDebug(LogFilter.Session, $"Battlenet.LogonRequest: {GetClientInfo()} attempted to log in with game other than WoW (using {logonRequest.Program})!");
                return(BattlenetRpcErrorCode.BadProgram);
            }

            if (logonRequest.Platform != "Win" && logonRequest.Platform != "Wn64" && logonRequest.Platform != "Mc64")
            {
                Log.outDebug(LogFilter.Session, $"Battlenet.LogonRequest: {GetClientInfo()} attempted to log in from an unsupported platform (using {logonRequest.Platform})!");
                return(BattlenetRpcErrorCode.BadPlatform);
            }

            if (!SharedConst.IsValidLocale(logonRequest.Locale.ToEnum <Locale>()))
            {
                Log.outDebug(LogFilter.Session, $"Battlenet.LogonRequest: {GetClientInfo()} attempted to log in with unsupported locale (using {logonRequest.Locale})!");
                return(BattlenetRpcErrorCode.BadLocale);
            }

            locale = logonRequest.Locale;
            os     = logonRequest.Platform;
            build  = (uint)logonRequest.ApplicationVersion;

            var endpoint = Global.LoginServiceMgr.GetAddressForClient(GetRemoteIpEndPoint().Address);

            ChallengeExternalRequest externalChallenge = new ChallengeExternalRequest();

            externalChallenge.PayloadType = "web_auth_url";
            externalChallenge.Payload     = ByteString.CopyFromUtf8($"https://{endpoint.Address}:{endpoint.Port}/bnetserver/login/");

            SendRequest((uint)OriginalHash.ChallengeListener, 3, externalChallenge);
            return(BattlenetRpcErrorCode.Ok);
        }
        public void LoadCreatureTextLocales()
        {
            uint oldMSTime = Time.GetMSTime();

            mLocaleTextMap.Clear(); // for reload case

            SQLResult result = DB.World.Query("SELECT CreatureId, GroupId, ID, Locale, Text FROM creature_text_locale");

            if (result.IsEmpty())
                return;

            do
            {
                uint creatureId = result.Read<uint>(0);
                uint groupId = result.Read<byte>(1);
                uint id = result.Read<byte>(2);
                string localeName = result.Read<string>(3);
                Locale locale = localeName.ToEnum<Locale>();
                if (!SharedConst.IsValidLocale(locale) || locale == Locale.enUS)
                    continue;

                var key = new CreatureTextId(creatureId, groupId, id);
                if (!mLocaleTextMap.ContainsKey(key))
                    mLocaleTextMap[key] = new CreatureTextLocale();

                CreatureTextLocale data = mLocaleTextMap[key];
                ObjectManager.AddLocaleString(result.Read<string>(4), locale, data.Text);

            } while (result.NextRow());

            Log.outInfo(LogFilter.ServerLoading, "Loaded {0} creature localized texts in {1} ms", mLocaleTextMap.Count, Time.GetMSTimeDiffToNow(oldMSTime));
        }
Esempio n. 3
0
        public void SetVisible(FactionTemplateRecord factionTemplateEntry)
        {
            if (factionTemplateEntry.Faction == 0)
            {
                return;
            }

            var factionEntry = CliDB.FactionStorage.LookupByKey(factionTemplateEntry.Faction);

            if (factionEntry.Id != 0)
            {
                // Never show factions of the opposing team
                if (!Convert.ToBoolean(factionEntry.ReputationRaceMask[1] & SharedConst.GetMaskForRace(_player.GetRace())) && factionEntry.ReputationBase[1] == Reputation_Bottom)
                {
                    SetVisible(factionEntry);
                }
            }
        }
Esempio n. 4
0
        // this allows calculating base reputations to offline players, just by race and class
        public static int GetBaseReputationOf(FactionRecord factionEntry, Race race, Class playerClass)
        {
            if (factionEntry == null)
            {
                return(0);
            }

            ulong raceMask  = (ulong)SharedConst.GetMaskForRace(race);
            uint  classMask = (1u << ((int)playerClass - 1));

            for (int i = 0; i < 4; i++)
            {
                if ((factionEntry.ReputationClassMask[i] == 0 || factionEntry.ReputationClassMask[i].HasAnyFlag((short)classMask)) &&
                    (factionEntry.ReputationRaceMask[i] == 0 || factionEntry.ReputationRaceMask[i].HasAnyFlag((uint)raceMask)))
                {
                    return(factionEntry.ReputationBase[i]);
                }
            }

            return(0);
        }
Esempio n. 5
0
        int GetFactionDataIndexForRaceAndClass(FactionRecord factionEntry)
        {
            if (factionEntry == null)
            {
                return(-1);
            }

            long  raceMask  = SharedConst.GetMaskForRace(_player.GetRace());
            short classMask = (short)_player.GetClassMask();

            for (int i = 0; i < 4; i++)
            {
                if ((factionEntry.ReputationRaceMask[i].HasAnyFlag(raceMask) || (factionEntry.ReputationRaceMask[i] == 0 && factionEntry.ReputationClassMask[i] != 0)) &&
                    (factionEntry.ReputationClassMask[i].HasAnyFlag(classMask) || factionEntry.ReputationClassMask[i] == 0))
                {
                    return(i);
                }
            }

            return(-1);
        }
Esempio n. 6
0
        uint GetDefaultStateFlags(FactionRecord factionEntry)
        {
            if (factionEntry == null)
            {
                return(0);
            }

            long raceMask  = SharedConst.GetMaskForRace(_player.GetRace());
            uint classMask = _player.GetClassMask();

            for (int i = 0; i < 4; i++)
            {
                if ((Convert.ToBoolean(factionEntry.ReputationRaceMask[i] & raceMask) ||
                     (factionEntry.ReputationRaceMask[i] == 0 &&
                      factionEntry.ReputationClassMask[i] != 0)) &&
                    (Convert.ToBoolean(factionEntry.ReputationClassMask[i] & classMask) ||
                     factionEntry.ReputationClassMask[i] == 0))
                {
                    return(factionEntry.ReputationFlags[i]);
                }
            }
            return(0);
        }
Esempio n. 7
0
        public int GetBaseReputation(FactionRecord factionEntry)
        {
            if (factionEntry == null)
            {
                return(0);
            }

            long raceMask  = SharedConst.GetMaskForRace(_player.GetRace());
            uint classMask = _player.GetClassMask();

            for (var i = 0; i < 4; i++)
            {
                if ((Convert.ToBoolean(factionEntry.ReputationRaceMask[i] & raceMask) ||
                     (factionEntry.ReputationRaceMask[i] == 0 && factionEntry.ReputationClassMask[i] != 0)) &&
                    (Convert.ToBoolean(factionEntry.ReputationClassMask[i] & classMask) ||
                     factionEntry.ReputationClassMask[i] == 0))
                {
                    return(factionEntry.ReputationBase[i]);
                }
            }

            // in faction.dbc exist factions with (RepListId >=0, listed in character reputation list) with all BaseRepRaceMask[i] == 0
            return(0);
        }
Esempio n. 8
0
        public bool Meets(ConditionSourceInfo sourceInfo)
        {
            Cypher.Assert(ConditionTarget < SharedConst.MaxConditionTargets);
            WorldObject obj = sourceInfo.mConditionTargets[ConditionTarget];

            // object not present, return false
            if (obj == null)
            {
                Log.outDebug(LogFilter.Condition, "Condition object not found for condition (Entry: {0} Type: {1} Group: {2})", SourceEntry, SourceType, SourceGroup);
                return(false);
            }
            bool condMeets = false;

            Player player = obj.ToPlayer();
            Unit   unit   = obj.ToUnit();

            switch (ConditionType)
            {
            case ConditionTypes.None:
                condMeets = true;                                        // empty condition, always met
                break;

            case ConditionTypes.Aura:
                if (unit != null)
                {
                    condMeets = unit.HasAuraEffect(ConditionValue1, (byte)ConditionValue2);
                }
                break;

            case ConditionTypes.Item:
                if (player != null)
                {
                    // don't allow 0 items (it's checked during table load)
                    Cypher.Assert(ConditionValue2 != 0);
                    bool checkBank = ConditionValue3 != 0 ? true : false;
                    condMeets = player.HasItemCount(ConditionValue1, ConditionValue2, checkBank);
                }
                break;

            case ConditionTypes.ItemEquipped:
                if (player != null)
                {
                    condMeets = player.HasItemOrGemWithIdEquipped(ConditionValue1, 1);
                }
                break;

            case ConditionTypes.Zoneid:
                condMeets = obj.GetZoneId() == ConditionValue1;
                break;

            case ConditionTypes.ReputationRank:
                if (player != null)
                {
                    var faction = CliDB.FactionStorage.LookupByKey(ConditionValue1);
                    if (faction != null)
                    {
                        condMeets = Convert.ToBoolean(ConditionValue2 & (1 << (int)player.GetReputationMgr().GetRank(faction)));
                    }
                }
                break;

            case ConditionTypes.Achievement:
                if (player != null)
                {
                    condMeets = player.HasAchieved(ConditionValue1);
                }
                break;

            case ConditionTypes.Team:
                if (player != null)
                {
                    condMeets = (uint)player.GetTeam() == ConditionValue1;
                }
                break;

            case ConditionTypes.Class:
                if (unit != null)
                {
                    condMeets = Convert.ToBoolean(unit.GetClassMask() & ConditionValue1);
                }
                break;

            case ConditionTypes.Race:
                if (unit != null)
                {
                    condMeets = Convert.ToBoolean(SharedConst.GetMaskForRace(unit.GetRace()) & ConditionValue1);
                }
                break;

            case ConditionTypes.Gender:
                if (player != null)
                {
                    condMeets = player.GetGender() == (Gender)ConditionValue1;
                }
                break;

            case ConditionTypes.Skill:
                if (player != null)
                {
                    condMeets = player.HasSkill((SkillType)ConditionValue1) && player.GetBaseSkillValue((SkillType)ConditionValue1) >= ConditionValue2;
                }
                break;

            case ConditionTypes.QuestRewarded:
                if (player != null)
                {
                    condMeets = player.GetQuestRewardStatus(ConditionValue1);
                }
                break;

            case ConditionTypes.QuestTaken:
                if (player != null)
                {
                    QuestStatus status = player.GetQuestStatus(ConditionValue1);
                    condMeets = (status == QuestStatus.Incomplete);
                }
                break;

            case ConditionTypes.QuestComplete:
                if (player != null)
                {
                    QuestStatus status = player.GetQuestStatus(ConditionValue1);
                    condMeets = (status == QuestStatus.Complete && !player.GetQuestRewardStatus(ConditionValue1));
                }
                break;

            case ConditionTypes.QuestNone:
                if (player != null)
                {
                    QuestStatus status = player.GetQuestStatus(ConditionValue1);
                    condMeets = (status == QuestStatus.None);
                }
                break;

            case ConditionTypes.ActiveEvent:
                condMeets = Global.GameEventMgr.IsActiveEvent((ushort)ConditionValue1);
                break;

            case ConditionTypes.InstanceInfo:
            {
                var map = obj.GetMap();
                if (map.IsDungeon())
                {
                    InstanceScript instance = ((InstanceMap)map).GetInstanceScript();
                    if (instance != null)
                    {
                        switch ((InstanceInfo)ConditionValue3)
                        {
                        case InstanceInfo.Data:
                            condMeets = instance.GetData(ConditionValue1) == ConditionValue2;
                            break;

                        case InstanceInfo.Data64:
                            condMeets = instance.GetData64(ConditionValue1) == ConditionValue2;
                            break;

                        case InstanceInfo.BossState:
                            condMeets = instance.GetBossState(ConditionValue1) == (EncounterState)ConditionValue2;
                            break;
                        }
                    }
                }
                break;
            }

            case ConditionTypes.Mapid:
                condMeets = obj.GetMapId() == ConditionValue1;
                break;

            case ConditionTypes.Areaid:
                condMeets = obj.GetAreaId() == ConditionValue1;
                break;

            case ConditionTypes.Spell:
                if (player != null)
                {
                    condMeets = player.HasSpell(ConditionValue1);
                }
                break;

            case ConditionTypes.Level:
                if (unit != null)
                {
                    condMeets = MathFunctions.CompareValues((ComparisionType)ConditionValue2, unit.GetLevel(), ConditionValue1);
                }
                break;

            case ConditionTypes.DrunkenState:
                if (player != null)
                {
                    condMeets = (uint)Player.GetDrunkenstateByValue(player.GetDrunkValue()) >= ConditionValue1;
                }
                break;

            case ConditionTypes.NearCreature:
                condMeets = obj.FindNearestCreature(ConditionValue1, ConditionValue2, ConditionValue3 == 0 ? true : false) != null;
                break;

            case ConditionTypes.NearGameobject:
                condMeets = obj.FindNearestGameObject(ConditionValue1, ConditionValue2) != null;
                break;

            case ConditionTypes.ObjectEntryGuid:
                if ((uint)obj.GetTypeId() == ConditionValue1)
                {
                    condMeets = ConditionValue2 == 0 || (obj.GetEntry() == ConditionValue2);

                    if (ConditionValue3 != 0)
                    {
                        switch (obj.GetTypeId())
                        {
                        case TypeId.Unit:
                            condMeets &= obj.ToCreature().GetSpawnId() == ConditionValue3;
                            break;

                        case TypeId.GameObject:
                            condMeets &= obj.ToGameObject().GetSpawnId() == ConditionValue3;
                            break;
                        }
                    }
                }
                break;

            case ConditionTypes.TypeMask:
                condMeets = Convert.ToBoolean((TypeMask)ConditionValue1 & obj.ObjectTypeMask);
                break;

            case ConditionTypes.RelationTo:
            {
                WorldObject toObject = sourceInfo.mConditionTargets[ConditionValue1];
                if (toObject != null)
                {
                    Unit toUnit = toObject.ToUnit();
                    if (toUnit != null && unit != null)
                    {
                        switch ((RelationType)ConditionValue2)
                        {
                        case RelationType.Self:
                            condMeets = unit == toUnit;
                            break;

                        case RelationType.InParty:
                            condMeets = unit.IsInPartyWith(toUnit);
                            break;

                        case RelationType.InRaidOrParty:
                            condMeets = unit.IsInRaidWith(toUnit);
                            break;

                        case RelationType.OwnedBy:
                            condMeets = unit.GetOwnerGUID() == toUnit.GetGUID();
                            break;

                        case RelationType.PassengerOf:
                            condMeets = unit.IsOnVehicle(toUnit);
                            break;

                        case RelationType.CreatedBy:
                            condMeets = unit.GetCreatorGUID() == toUnit.GetGUID();
                            break;
                        }
                    }
                }
                break;
            }

            case ConditionTypes.ReactionTo:
            {
                WorldObject toObject = sourceInfo.mConditionTargets[ConditionValue1];
                if (toObject != null)
                {
                    Unit toUnit = toObject.ToUnit();
                    if (toUnit != null && unit != null)
                    {
                        condMeets = Convert.ToBoolean((1 << (int)unit.GetReactionTo(toUnit)) & ConditionValue2);
                    }
                }
                break;
            }

            case ConditionTypes.DistanceTo:
            {
                WorldObject toObject = sourceInfo.mConditionTargets[ConditionValue1];
                if (toObject != null)
                {
                    condMeets = MathFunctions.CompareValues((ComparisionType)ConditionValue3, obj.GetDistance(toObject), ConditionValue2);
                }
                break;
            }

            case ConditionTypes.Alive:
                if (unit != null)
                {
                    condMeets = unit.IsAlive();
                }
                break;

            case ConditionTypes.HpVal:
                if (unit != null)
                {
                    condMeets = MathFunctions.CompareValues((ComparisionType)ConditionValue2, unit.GetHealth(), ConditionValue1);
                }
                break;

            case ConditionTypes.HpPct:
                if (unit != null)
                {
                    condMeets = MathFunctions.CompareValues((ComparisionType)ConditionValue2, unit.GetHealthPct(), ConditionValue1);
                }
                break;

            case ConditionTypes.WorldState:
                condMeets = (ConditionValue2 == Global.WorldMgr.GetWorldState((WorldStates)ConditionValue1));
                break;

            case ConditionTypes.PhaseId:
                condMeets = obj.GetPhaseShift().HasPhase(ConditionValue1);
                break;

            case ConditionTypes.Title:
                if (player != null)
                {
                    condMeets = player.HasTitle(ConditionValue1);
                }
                break;

            case ConditionTypes.UnitState:
                if (unit != null)
                {
                    condMeets = unit.HasUnitState((UnitState)ConditionValue1);
                }
                break;

            case ConditionTypes.CreatureType:
            {
                Creature creature = obj.ToCreature();
                if (creature)
                {
                    condMeets = (uint)creature.GetCreatureTemplate().CreatureType == ConditionValue1;
                }
                break;
            }

            case ConditionTypes.RealmAchievement:
            {
                AchievementRecord achievement = CliDB.AchievementStorage.LookupByKey(ConditionValue1);
                if (achievement != null && Global.AchievementMgr.IsRealmCompleted(achievement))
                {
                    condMeets = true;
                }
                break;
            }

            case ConditionTypes.InWater:
                if (unit)
                {
                    condMeets = unit.IsInWater();
                }
                break;

            case ConditionTypes.TerrainSwap:
                condMeets = obj.GetPhaseShift().HasVisibleMapId(ConditionValue1);
                break;

            case ConditionTypes.StandState:
            {
                if (unit)
                {
                    if (ConditionValue1 == 0)
                    {
                        condMeets = (unit.GetStandState() == (UnitStandStateType)ConditionValue2);
                    }
                    else if (ConditionValue2 == 0)
                    {
                        condMeets = unit.IsStandState();
                    }
                    else if (ConditionValue2 == 1)
                    {
                        condMeets = unit.IsSitState();
                    }
                }
                break;
            }

            case ConditionTypes.DailyQuestDone:
            {
                if (player)
                {
                    condMeets = player.IsDailyQuestDone(ConditionValue1);
                }
                break;
            }

            case ConditionTypes.Charmed:
            {
                if (unit)
                {
                    condMeets = unit.IsCharmed();
                }
                break;
            }

            case ConditionTypes.PetType:
            {
                if (player)
                {
                    Pet pet = player.GetPet();
                    if (pet)
                    {
                        condMeets = (((1 << (int)pet.GetPetType()) & ConditionValue1) != 0);
                    }
                }
                break;
            }

            case ConditionTypes.Taxi:
            {
                if (player)
                {
                    condMeets = player.IsInFlight();
                }
                break;
            }

            case ConditionTypes.Queststate:
            {
                if (player)
                {
                    if (
                        (Convert.ToBoolean(ConditionValue2 & (1 << (int)QuestStatus.None)) && (player.GetQuestStatus(ConditionValue1) == QuestStatus.None)) ||
                        (Convert.ToBoolean(ConditionValue2 & (1 << (int)QuestStatus.Complete)) && (player.GetQuestStatus(ConditionValue1) == QuestStatus.Complete)) ||
                        (Convert.ToBoolean(ConditionValue2 & (1 << (int)QuestStatus.Incomplete)) && (player.GetQuestStatus(ConditionValue1) == QuestStatus.Incomplete)) ||
                        (Convert.ToBoolean(ConditionValue2 & (1 << (int)QuestStatus.Failed)) && (player.GetQuestStatus(ConditionValue1) == QuestStatus.Failed)) ||
                        (Convert.ToBoolean(ConditionValue2 & (1 << (int)QuestStatus.Rewarded)) && player.GetQuestRewardStatus(ConditionValue1))
                        )
                    {
                        condMeets = true;
                    }
                }
                break;
            }

            case ConditionTypes.ObjectiveComplete:
            {
                if (player)
                {
                    QuestObjective questObj = Global.ObjectMgr.GetQuestObjective(ConditionValue1);
                    if (questObj == null)
                    {
                        break;
                    }

                    condMeets = (!player.GetQuestRewardStatus(questObj.QuestID) && player.IsQuestObjectiveComplete(questObj));
                }
                break;
            }

            case ConditionTypes.DifficultyId:
            {
                condMeets = (uint)obj.GetMap().GetDifficultyID() == ConditionValue1;
                break;
            }

            default:
                condMeets = false;
                break;
            }

            if (NegativeCondition)
            {
                condMeets = !condMeets;
            }

            if (!condMeets)
            {
                sourceInfo.mLastFailedCondition = this;
            }

            bool script = Global.ScriptMgr.OnConditionCheck(this, sourceInfo); // Returns true by default.

            return(condMeets && script);
        }