private Faction(HashSet<Faction> enemies, HashSet<Faction> friends, HashSet<Faction> neutrals) { Enemies = enemies; Friends = friends; Neutrals = neutrals; Entry = new FactionEntry { Name = "Null Faction" }; Template = new FactionTemplateEntry { EnemyFactions = new FactionId[0], FriendlyFactions = new FactionId[0] }; }
bool SetOneFactionReputation(FactionEntry factionEntry, int standing, bool incremental) { var itr = _factions.LookupByKey((uint)factionEntry.reputationListID); if (itr != null) { int BaseRep = GetBaseReputation(factionEntry); if (incremental) { // int32 *= float cause one point loss? standing = (int)(Math.Floor((float)standing * 1 + 0.5f));//sWorld->getRate(RATE_REPUTATION_GAIN) + 0.5f)); standing += itr.Standing + BaseRep; } if (standing > Reputation_Cap) { standing = Reputation_Cap; } else if (standing < Reputation_Bottom) { standing = Reputation_Bottom; } ReputationRank old_rank = ReputationToRank(itr.Standing + BaseRep); ReputationRank new_rank = ReputationToRank(standing); itr.Standing = standing - BaseRep; itr.needSend = true; itr.needSave = true; SetVisible(itr); if (new_rank <= ReputationRank.Hostile) { SetAtWar(itr, true); } if (new_rank > old_rank) { _sendFactionIncreased = true; } UpdateRankCounters(old_rank, new_rank); //_player->ReputationChanged(factionEntry); //_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS, factionEntry->ID); //_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION, factionEntry->ID); //_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION, factionEntry->ID); //_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION, factionEntry->ID); //_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION, factionEntry->ID); return(true); } return(false); }
public Faction(FactionEntry entry, FactionTemplateEntry template) { Entry = entry; Template = template; Id = entry.Id; ReputationIndex = entry.FactionIndex; IsAlliance = template.FactionGroup.HasFlag(FactionGroupMask.Alliance); IsHorde = template.FactionGroup.HasFlag(FactionGroupMask.Horde); }
//uint GetReputationRankStrIndex(FactionEntry factionEntry) //{ //return ReputationRankStrIndex[GetRank(factionEntry)]; //} public bool IsAtWar(FactionEntry factionEntry) { if (factionEntry == null) { return(false); } FactionState factionState = GetState(factionEntry); if (factionState != null) { return(Convert.ToBoolean(factionState.Flags & FactionFlags.AtWar)); } return(false); }
void SetVisible(FactionEntry factionEntry) { if (factionEntry.reputationListID < 0) { return; } var itr = _factions.LookupByKey((uint)factionEntry.reputationListID); if (itr == null) { return; } SetVisible(itr); }
int GetReputation(FactionEntry factionEntry) { // Faction without recorded reputation. Just ignore. if (factionEntry.ID == 0) { return(0); } FactionState state = GetState(factionEntry); if (state != null) { return(GetBaseReputation(factionEntry) + state.Standing); } return(0); }
uint GetDefaultStateFlags(FactionEntry factionEntry) { if (factionEntry == null) { return(0); } uint raceMask = _player.getRaceMask(); uint classMask = _player.getClassMask(); for (int i = 0; i < 4; i++) { if (Convert.ToBoolean(factionEntry.BaseRepRaceMask[i] & raceMask) || (factionEntry.BaseRepRaceMask[i] == 0 && factionEntry.BaseRepClassMask[i] != 0 && Convert.ToBoolean(factionEntry.BaseRepClassMask[i] & classMask) || factionEntry.BaseRepClassMask[i] == 0)) { return(factionEntry.ReputationFlags[i]); } } return(0); }
int GetBaseReputation(FactionEntry factionEntry) { if (factionEntry.ID == 0) { return(0); } uint raceMask = _player.getRaceMask(); uint classMask = _player.getClassMask(); for (var i = 0; i < 4; i++) { if (Convert.ToBoolean(factionEntry.BaseRepRaceMask[i] & raceMask) || (factionEntry.BaseRepRaceMask[i] == 0 && factionEntry.BaseRepClassMask[i] != 0) && Convert.ToBoolean(factionEntry.BaseRepClassMask[i] & classMask) || factionEntry.BaseRepClassMask[i] == 0) { return(factionEntry.BaseRepValue[i]); } } // in faction.dbc exist factions with (RepListId >=0, listed in character reputation list) with all BaseRepRaceMask[i] == 0 return(0); }
public bool SetReputation(FactionEntry factionEntry, int standing, bool incremental = true) { //sScriptMgr->OnPlayerReputationChange(_player, factionEntry->ID, standing, incremental); bool res = false; // if spillover definition exists in DB, override DBC var repTemplate = Cypher.ObjMgr.GetRepSpillover(factionEntry.ID); if (repTemplate != null) { for (var i = 0; i < 5; ++i) { if (repTemplate.faction[i] != 0) { if (_player.GetReputationRank(repTemplate.faction[i]) <= (ReputationRank)repTemplate.faction_rank[i]) { // bonuses are already given, so just modify standing by rate int spilloverRep = (int)(standing * repTemplate.faction_rate[i]); SetOneFactionReputation(DBCStorage.FactionStorage.LookupByKey(repTemplate.faction[i]), spilloverRep, incremental); } } } } else { float spillOverRepOut = (float)standing; // check for sub-factions that receive spillover //might be slow var flist = DBCStorage.FactionStorage.Where(p => p.Value.team == factionEntry.team); // if has no sub-factions, check for factions with same parent if (flist.Count() == 0 && factionEntry.team != 0 && factionEntry.spilloverRateOut != 0.0f) { spillOverRepOut *= factionEntry.spilloverRateOut; FactionEntry parent = DBCStorage.FactionStorage.LookupByKey(factionEntry.team); if (parent.ID != 0) { var parentState = _factions.LookupByKey((uint)parent.reputationListID); // some team factions have own reputation standing, in this case do not spill to other sub-factions if (parentState != null && Convert.ToBoolean(parentState.Flags & FactionFlags.Special)) { SetOneFactionReputation(parent, (int)spillOverRepOut, incremental); } else // spill to "sister" factions { flist = DBCStorage.FactionStorage.Where(p => p.Value.team == factionEntry.team); } } } if (flist.Count() != 0) { // Spillover to affiliated factions foreach (var itr in flist) { var factionEntryCalc = DBCStorage.FactionStorage.LookupByKey(itr.Key); if (factionEntryCalc.ID != 0) { if (factionEntryCalc.ID == factionEntry.ID || GetRank(factionEntryCalc) > (ReputationRank)factionEntryCalc.spilloverMaxRankIn) { continue; } int spilloverRep = (int)(spillOverRepOut * factionEntryCalc.spilloverRateIn); if (spilloverRep != 0 || !incremental) { res = SetOneFactionReputation(factionEntryCalc, spilloverRep, incremental); } } } } } // spillover done, update faction itself var faction = _factions.LookupByKey((uint)factionEntry.reputationListID); if (faction != null) { res = SetOneFactionReputation(factionEntry, standing, incremental); // only this faction gets reported to client, even if it has no own visible standing SendState(faction); } return(res); }
bool ModifyReputation(FactionEntry factionEntry, int standing) { return(SetReputation(factionEntry, standing, true)); }
//Sets bool SetReputation(FactionEntry factionEntry, int standing) { return(SetReputation(factionEntry, standing, false)); }
public ReputationRank GetRank(FactionEntry factionEntry) { int reputation = GetReputation(factionEntry); return(ReputationToRank(reputation)); }
FactionState GetState(FactionEntry factionEntry) { return(factionEntry.CanHaveReputation() ? GetState(factionEntry.reputationListID) : null); }
//Gets ReputationRank GetBaseRank(FactionEntry factionEntry) { int reputation = GetBaseReputation(factionEntry); return(ReputationToRank(reputation)); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void World_HandleCharCreate(NetState netState, PacketReader packetReader) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleCharEnum(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandleCharEnum(...) - extendData.IsLoggedIn == false error!"); return; } string strName = packetReader.ReadUTF8StringSafe(); byte iRace = packetReader.ReadByte(); byte iClass = packetReader.ReadByte(); byte iGender = packetReader.ReadByte(); byte iSkin = packetReader.ReadByte(); byte iFace = packetReader.ReadByte(); byte iHairStyle = packetReader.ReadByte(); byte iHairColor = packetReader.ReadByte(); byte iFacialHair = packetReader.ReadByte(); byte iOutFitId = packetReader.ReadByte(); if (WorldPacketHandlers.VerifyName(strName) == false) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } if (ProcessServer.WowZoneCluster.World.GlobalPlayerInfo.GetPlayerInfo(strName) != null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } WowCharacterCreateInfo wowCharacterCreateInfo = ProcessServer.WowZoneCluster.World.GlobalCreateInfo.GetCreateInfo(iRace, iClass); if (wowCharacterCreateInfo == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } if ((iRace == WowRace.BloodElf || iRace == WowRace.Draenei) && extendData.CommonData.IsTBC == false) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } WowCharacterLevelInfo[] wowCharacterLevelInfo = ProcessServer.WowZoneCluster.World.GlobalLevelInfo.GetLevelInfo(iRace, iClass); if (wowCharacterLevelInfo == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } WowCharacter wowPlayerInfo = new WowCharacter(); wowPlayerInfo.Serial = 0; wowPlayerInfo.IsTBC = extendData.CommonData.IsTBC; wowPlayerInfo.AccountGuid = extendData.CommonData.AccountsGuid; wowPlayerInfo.Name = strName; wowPlayerInfo.Race = iRace; wowPlayerInfo.Class = iClass; wowPlayerInfo.Gender = iGender; wowPlayerInfo.Skin = iSkin; wowPlayerInfo.Face = iFace; wowPlayerInfo.HairStyle = iHairStyle; wowPlayerInfo.HairColor = iHairColor; wowPlayerInfo.FacialHair = iFacialHair; wowPlayerInfo.X = wowCharacterCreateInfo.PositionX; wowPlayerInfo.Y = wowCharacterCreateInfo.PositionY; wowPlayerInfo.Z = wowCharacterCreateInfo.PositionZ; wowPlayerInfo.MapId = wowCharacterCreateInfo.Map; wowPlayerInfo.ZoneId = wowCharacterCreateInfo.Zone; wowPlayerInfo.BindX = 0; wowPlayerInfo.BindY = 0; wowPlayerInfo.BindZ = 0; wowPlayerInfo.BindMapId = 0; wowPlayerInfo.BindZoneId = 0; ChrRacesEntry chrRacesEntry = DBCInstances.ChrRacesEntry.LookupIDEntry(iRace); if (chrRacesEntry == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } if (chrRacesEntry.m_TeamId == 7) { wowPlayerInfo.TeamId = WowTeam.ALLIANCE; } else { wowPlayerInfo.TeamId = WowTeam.HORDE; } ChrClassesEntry chrClassesEntry = DBCInstances.ChrClassesEntry.LookupIDEntry(iClass); if (chrClassesEntry == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } wowPlayerInfo.PowerType = chrClassesEntry.m_PowerType; switch (iRace) { case (byte)WowRace.Tauren: wowPlayerInfo.TaxiMask[0] = 1 << (22 - 1); break; case (byte)WowRace.Human: wowPlayerInfo.TaxiMask[0] = 1 << (2 - 1); break; case (byte)WowRace.Dwarf: wowPlayerInfo.TaxiMask[0] = 1 << (6 - 1); break; case (byte)WowRace.Gnome: wowPlayerInfo.TaxiMask[0] = 1 << (6 - 1); break; case (byte)WowRace.Orc: wowPlayerInfo.TaxiMask[0] = 1 << (23 - 1); break; case (byte)WowRace.Troll: wowPlayerInfo.TaxiMask[0] = 1 << (23 - 1); break; case (byte)WowRace.Undead: wowPlayerInfo.TaxiMask[0] = 1 << (11 - 1); break; case (byte)WowRace.Nightelf: wowPlayerInfo.TaxiMask[0] = 1 << (27 - 1); break; case (byte)WowRace.BloodElf: wowPlayerInfo.TaxiMask[2] = 1 << (18 - 1); break; case (byte)WowRace.Draenei: wowPlayerInfo.TaxiMask[2] = 1 << (30 - 1); break; } wowPlayerInfo.Size = (iRace == WowRace.Tauren) ? 1.3f : 1.0f; wowPlayerInfo.Health = wowCharacterLevelInfo[0].Health; wowPlayerInfo.Mana = wowCharacterLevelInfo[0].Mana; wowPlayerInfo.Rage = 0; wowPlayerInfo.Focus = 0; wowPlayerInfo.Energy = 0; wowPlayerInfo.MaxHealth = wowCharacterLevelInfo[0].Health; wowPlayerInfo.MaxMana = wowCharacterLevelInfo[0].Mana; wowPlayerInfo.MaxRage = 0; wowPlayerInfo.MaxFocus = 0; wowPlayerInfo.MaxEnergy = 0; wowPlayerInfo.BaseHealth = wowCharacterLevelInfo[0].Health; wowPlayerInfo.BaseMana = wowCharacterLevelInfo[0].Mana; wowPlayerInfo.FactionTemplate = 0; wowPlayerInfo.Level = 1; wowPlayerInfo.Strength = wowCharacterLevelInfo[0].Strength; wowPlayerInfo.Agility = wowCharacterLevelInfo[0].Agility; wowPlayerInfo.Stamina = wowCharacterLevelInfo[0].Stamina; wowPlayerInfo.Intellect = wowCharacterLevelInfo[0].Intellect; wowPlayerInfo.Spirit = wowCharacterLevelInfo[0].Spirit; wowPlayerInfo.BoundingRadius = 0.388999998569489f; wowPlayerInfo.CombatReach = 1.5f; if (iGender == 0) { wowPlayerInfo.DisplayId = wowCharacterCreateInfo.MaleDisplayId; wowPlayerInfo.NativeDisplayId = wowCharacterCreateInfo.MaleDisplayId; } else { wowPlayerInfo.DisplayId = wowCharacterCreateInfo.FemaleDisplayId; wowPlayerInfo.NativeDisplayId = wowCharacterCreateInfo.FemaleDisplayId; } wowPlayerInfo.AttackPower = 0; wowPlayerInfo.NextLevelXP = 400; wowPlayerInfo.MaxLevel = 10; for (uint iIndex = 0; iIndex < DBCInstances.FactionEntry.Count; iIndex++) { FactionEntry factionEntry = DBCInstances.FactionEntry.LookupRowEntry(iIndex); if (factionEntry == null) { continue; } if (factionEntry.m_RepListId < 0) { continue; } int iReputation = 0; if ((factionEntry.m_BaseRepMask1 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue1; } else if ((factionEntry.m_BaseRepMask2 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue2; } else if ((factionEntry.m_BaseRepMask3 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue3; } else if ((factionEntry.m_BaseRepMask4 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue4; } else { continue; } WowReputation wowReputation = new WowReputation() { FactionId = factionEntry.ID, Reputation = iReputation, }; if ((int)wowReputation.CalcRating() <= (int)WowFactionRating.Hostile) { wowReputation.Flag |= (byte)WowFactionFlag.FactionFlagAtWar; } if ((factionEntry.m_Team == 469 && wowPlayerInfo.TeamId == WowTeam.ALLIANCE) || (factionEntry.m_Team == 67 && wowPlayerInfo.TeamId == WowTeam.HORDE)) { wowReputation.Flag |= (byte)WowFactionFlag.FactionFlagVisible; } wowPlayerInfo.ReputationManager.AddReputation(wowReputation.FactionId, wowReputation); } foreach (WowPlayerInfoSkill wowPlayerInfoSkill in wowCharacterCreateInfo.WowPlayerSkills.Skills) { WowSkillTemplate wowSkillTemplate = ProcessServer.WowZoneCluster.World.GlobalSkillTemplates.GetSkillTemplate((long)wowPlayerInfoSkill.Skill) as WowSkillTemplate; if (wowSkillTemplate == null) { continue; } WowSkill wowSkill = new WowSkill() { Serial = wowSkillTemplate.SkillId, SkillTemplate = wowSkillTemplate }; wowPlayerInfo.SkillManager.AddSkill(wowSkill.Serial, wowSkill); } foreach (WowPlayerInfoSpell wowPlayerInfoSpell in wowCharacterCreateInfo.WowPlayerSpells.Spells) { WowSpellTemplate wowSpellTemplate = ProcessServer.WowZoneCluster.World.GlobalSpellTemplates.GetSpellTemplate((long)wowPlayerInfoSpell.Spell) as WowSpellTemplate; if (wowSpellTemplate == null) { continue; } WowSpell wowSpell = new WowSpell() { Serial = wowSpellTemplate.SpellId, SpellTemplate = wowSpellTemplate }; wowPlayerInfo.SpellManager.AddSpell(wowSpell.Serial, wowSpell); } foreach (WowPlayerInfoItem wowPlayerInfoItem in wowCharacterCreateInfo.WowPlayerItems.Items) { WowItemTemplate wowItemTemplate = ProcessServer.WowZoneCluster.World.ItemTemplateManager.GetItemTemplate((long)wowPlayerInfoItem.ItemId) as WowItemTemplate; if (wowItemTemplate == null) { continue; } WowItemContainer equipmentBag = wowPlayerInfo.BagManager.EquipmentBag; if (equipmentBag == null) { break; } WowItem wowItem = equipmentBag.FindSubItemAtSlot(wowItemTemplate.InventoryType) as WowItem; if (wowItem == null) { wowItem = new WowItem() { ItemTemplate = wowItemTemplate }; equipmentBag.AddSubItem(wowItemTemplate.InventoryType, wowItem); } else { WowItemContainer mainBag = wowPlayerInfo.BagManager.MainBag; if (mainBag == null) { break; } wowItem = new WowItem() { ItemTemplate = wowItemTemplate }; mainBag.AddToFreeSlot(wowItem); } } foreach (WowPlayerInfoAction wowPlayerInfoAction in wowCharacterCreateInfo.WowPlayerActions.Actions) { WowActionBar wowActionBar = new WowActionBar() { Serial = wowPlayerInfoAction.Button, Action = wowPlayerInfoAction.Action, Type = wowPlayerInfoAction.Type }; wowPlayerInfo.ActionBarManager.AddActionBar(wowActionBar.Serial, wowActionBar); } if (wowPlayerInfo.SaveNewCreature() == false) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } ProcessServer.WowZoneCluster.World.GlobalPlayerInfo.AddPlayerInfo(wowPlayerInfo.Name, wowPlayerInfo.Serial, wowPlayerInfo); netState.Send(new Word_CharCreateResponse()); }