Difference between revisions of "Server:Faction"

From The Al`Kabor Project Wiki
Jump to navigation Jump to search
Line 27: Line 27:
The result of this formula is then returned as a [[#Faction Value Ranges |FactionValue]].
The result of this formula is then returned as a [[#Faction Value Ranges |FactionValue]].


=== Special Exceptions: Indifferent Faction ===
=== Special Exceptions ===
 
==== Indifferent Use Cases ====
''Note: Faction with an NPC will be '''Indifferent''' if any of the following are true:''
''Note: Faction with an NPC will be '''Indifferent''' if any of the following are true:''


Line 35: Line 37:
#if the player is invis and the target NPC cannot see invis
#if the player is invis and the target NPC cannot see invis


=== Special Exceptions: Pets ===
==== Pets ====
Pets will be Amiable to their owner and Indifferent to everyone else.
Pets will be Amiable to their owner and Indifferent to everyone else.


=== Special Exceptions: Merchants ===
==== Merchants ====
If a merchant would otherwise con Threateningly or Scowls to the player based on final faction value, they will instead be set to Dubious.
If a merchant would otherwise con Threateningly or Scowls to the player based on final faction value, they will instead be set to Dubious.


=== Special Exceptions: Combat ===
==== Combat ====
If an NPC would normally have Dubious or higher faction with the player, and that player is on their hate list (i.e. from combat), they will instead con Threateningly.
If an NPC would normally have Dubious or higher faction with the player, and that player is on their hate list (i.e. from combat), they will instead con Threateningly.



Revision as of 12:02, 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 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 /zone/client.cpp.

Pulling Faction from the Database

First, the server queries data about the NPC's Primary Faction (stored in an int32 pFaction variable) from the database (via bool GetFactionData(FactionMods* fd, uint32 class_mod, uint32 race_mod, uint32 deity_mod, int32 faction_id, uint8 texture_mod, uint8 gender_mod, uint32 base_race, bool skip_illusions = false); in /zone/zonedb.cpp) and stores the modifiers in a variable called fmods which is of type FactionMod.

This function is where all the "special sauce" is found regarding how to interpret the faction data as it appears in the database.

Calculate Raw Character Faction Level

Next, the server queries the player's current faction value with the NPC's primary faction by calling GetCharacterFactionLevel(pFaction) and stores that in a variable called tmpFactionValue.

Apply Faction Bonuses from Spells and Items

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 = tmpFactionValue + base + class_mod + race_mod + deity_mod

The result of this formula is then returned as a FactionValue.

Special Exceptions

Indifferent Use Cases

Note: Faction with an NPC will be Indifferent if any of the following are true:

  1. the player is currently feign death and the target NPC is not immune to it,
  2. the zone is marked as no combat,
  3. if the player is invis to undead and the target npc is undead,
  4. if the player is invis and the target NPC cannot see invis

Pets

Pets will be Amiable to their owner and Indifferent to everyone else.

Merchants

If a merchant would otherwise con Threateningly or Scowls to the player based on final faction value, they will instead be set to Dubious.

Combat

If an NPC would normally have Dubious or higher faction with the player, and that player is on their hate list (i.e. from combat), they will instead con Threateningly.

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