Example #1
0
        public void LoadFromDB(SQLResult result)
        {
            // Set initial reputations (so everything is nifty before DB data load)
            Initialize();

            if (!result.IsEmpty())
            {
                do
                {
                    var factionEntry = CliDB.FactionStorage.LookupByKey(result.Read <uint>(0));
                    if (factionEntry != null && factionEntry.CanHaveReputation())
                    {
                        var faction = _factions.LookupByKey((uint)factionEntry.ReputationIndex);
                        if (faction == null)
                        {
                            continue;
                        }
                        // update standing to current
                        faction.Standing = result.Read <int>(1);

                        // update counters
                        if (factionEntry.FriendshipRepID == 0)
                        {
                            int            BaseRep  = GetBaseReputation(factionEntry);
                            ReputationRank old_rank = ReputationToRank(factionEntry, BaseRep);
                            ReputationRank new_rank = ReputationToRank(factionEntry, BaseRep + faction.Standing);
                            UpdateRankCounters(old_rank, new_rank);
                        }

                        ReputationFlags dbFactionFlags = (ReputationFlags)result.Read <uint>(2);

                        if (dbFactionFlags.HasFlag(ReputationFlags.Visible))
                        {
                            SetVisible(faction);                    // have internal checks for forced invisibility
                        }
                        if (dbFactionFlags.HasFlag(ReputationFlags.Inactive))
                        {
                            SetInactive(faction, true);                    // have internal checks for visibility requirement
                        }
                        if (dbFactionFlags.HasFlag(ReputationFlags.AtWar)) // DB at war
                        {
                            SetAtWar(faction, true);                       // have internal checks for FACTION_FLAG_PEACE_FORCED
                        }
                        else                                               // DB not at war
                        {
                            // allow remove if visible (and then not FACTION_FLAG_INVISIBLE_FORCED or FACTION_FLAG_HIDDEN)
                            if (faction.Flags.HasFlag(ReputationFlags.Visible))
                            {
                                SetAtWar(faction, false);            // have internal checks for FACTION_FLAG_PEACE_FORCED
                            }
                        }

                        // set atWar for hostile
                        if (GetRank(factionEntry) <= ReputationRank.Hostile)
                        {
                            SetAtWar(faction, true);
                        }

                        // reset changed flag if values similar to saved in DB
                        if (faction.Flags == dbFactionFlags)
                        {
                            faction.needSend = false;
                            faction.needSave = false;
                        }
                    }
                } while (result.NextRow());
            }
        }