Difference between revisions of "Server:Faction"
Line 6: | Line 6: | ||
Faction is ultimately calculated in the '''FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value, bool lua = false);''' function which is defined in [https://github.com/EQMacEmu/Server/blob/main/common/faction.cpp#L55 /common/faction.cpp]. | Faction is ultimately calculated in the '''FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value, bool lua = false);''' function which is defined in [https://github.com/EQMacEmu/Server/blob/main/common/faction.cpp#L55 /common/faction.cpp]. | ||
'''CalculateFaction''' is called from [https://github.com/EQMacEmu/Server/blob/main/zone/client.cpp# | '''CalculateFaction''' is called from the'''FACTION_VALUE Client::GetFactionLevel(uint32 char_id, uint32 p_race, uint32 p_class, uint32 p_deity, int32 pFaction, Mob* tnpc, bool lua)''' function in [https://github.com/EQMacEmu/Server/blob/main/zone/client.cpp#L4350 /zone/client.cpp]. First, the server queries data about the NPC's Primary Faction (stored in an '''int32 pFaction''' variable) from the database and stores the modifiers in a variable called '''fmods''' which is of type [[#Faction Modifiers|FactionMod]]. | ||
Next, the server calculates the player's current faction with the NPC's primary faction by calling '''GetCharacterFactionLevel(pFaction)''' and stores that in a variable called '''tmpFactionValue'''. | Next, the server calculates the player's current faction with the NPC's primary faction by calling '''GetCharacterFactionLevel(pFaction)''' and stores that in a variable called '''tmpFactionValue'''. |
Revision as of 11:33, 21 November 2024
This article will attempt to explain how faction works server-side to assist with understanding the various modifiers applied to characters between the base values and the ones you experience in-game.
In the source code, faction is found in /common/faction.h and /common/faction.cpp.
How Faction Gets Calculated
Faction is ultimately calculated in the FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value, bool lua = false); function which is defined in /common/faction.cpp.
CalculateFaction is called from theFACTION_VALUE Client::GetFactionLevel(uint32 char_id, uint32 p_race, uint32 p_class, uint32 p_deity, int32 pFaction, Mob* tnpc, bool lua) function in /zone/client.cpp. First, the server queries data about the NPC's Primary Faction (stored in an int32 pFaction variable) from the database and stores the modifiers in a variable called fmods which is of type FactionMod.
Next, the server calculates the player's current faction with the NPC's primary faction by calling GetCharacterFactionLevel(pFaction) and stores that in a variable called tmpFactionValue.
It then calculates faction bonuses from Alliance type spells and items and adds those to tmpFactionValue. Finally, CalculateFaction is called and passed the modifiers from the NPC's Primary Faction and the tmpFactionValue.
character_value += base value + class modifier + race modifier + deity modifier
The result of this formula is then returned as a FactionValue.
Faction Properties
The Faction struct defined in /common/faction.h defines the following members:
Property | Data Type | Description |
---|---|---|
id | int32 | database identifier |
mods | std::map<std::string, int16> | |
base | int16 | The base, unmodified value that players start with for this faction before race, class, and deity modifiers are applied |
name | char array 50 | The name of the faction |
see_illusion | bool | Determines whether the faction will see through racial illusion spells |
min_cap | int16 | Minimum value players can reach with this faction |
max_cap | int16 | Maximum value players can reach with this faction |
Faction Modifiers
The FactionMod struct defined in /common/faction.h defines the following members:
- int32 base
- int32 class_mod
- int32 race_mod
- int32 deity_mod
Faction Value Ranges
Min Cap | Max Cap | FACTION_VALUE (Enum) |
---|---|---|
>= 2000 | - | FACTION_MAX_ALLY = 0 |
>= 1100 | - | FACTION_ALLY = 1 |
>= 750 | <= 1099 | FACTION_WARMLY = 2 |
>= 500 | <= 749 | FACTION_KINDLY = 3 |
>= 100 | <= 499 | FACTION_AMIABLY = 4 |
>= 0 | <= 99 | FACTION_INDIFFERENTLY = 5 |
>= -100 | <= -1 | FACTION_APPREHENSIVELY = 6 |
>= -500 | <= -101 | FACTION_DUBIOUSLY = 7 |
>= -750 | <= -501 | FACTION_THREATENINGLY = 8 |
- | <= -751 | FACTION_SCOWLS = 9 |
- | <= -2000 | FACTION_MAX_SCOWLS = 10 |
The range of faction values above which are returned as the enums described in the final column are filtered through the const char *FactionValueToString(FACTION_VALUE faction_value); function to convert them to the corresponding string equivalent before being sent to the client and used for in-game consider or similar messages.
NPC Faction
The NPCFaction struct defined in /common/faction.h defines the following members:
Property | Data Type | Description |
---|---|---|
factionID | uint32 | |
value_mod | int32 | |
npc_value | int8 | |
temp | uint8 |