1
0

Zone ruleset_id support for most rules

This commit is contained in:
Emagi 2024-10-20 09:35:41 -04:00
parent 7c04bc7e91
commit e4fc6aad5a
21 changed files with 196 additions and 185 deletions

View File

@ -536,7 +536,7 @@ void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) {
index = 0; index = 0;
packet->setDataByName("class_tab_title", classes.GetClassNameCase(classes.GetSecondaryBaseClass(client->GetPlayer()->GetAdventureClass())).c_str()); packet->setDataByName("class_tab_title", classes.GetClassNameCase(classes.GetSecondaryBaseClass(client->GetPlayer()->GetAdventureClass())).c_str());
packet->setDataByName("class_tree_node_id", node_id[AA_CLASS]); packet->setDataByName("class_tree_node_id", node_id[AA_CLASS]);
packet->setDataByName("class_max_aa", rule_manager.GetGlobalRule(R_Player, MaxClassAA)->GetInt32()); packet->setDataByName("class_max_aa", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxClassAA)->GetInt32());
int32 class_id = TreeNodeList[node_id[AA_CLASS]]->AAtreeID; int32 class_id = TreeNodeList[node_id[AA_CLASS]]->AAtreeID;
class_id = classid[node_id[AA_CLASS]]; class_id = classid[node_id[AA_CLASS]];
packet->setDataByName("class_id", classid[node_id[AA_CLASS]]); packet->setDataByName("class_id", classid[node_id[AA_CLASS]]);
@ -630,7 +630,7 @@ void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) {
index = 0; index = 0;
packet->setDataByName("subclass_tab_title", classes.GetClassNameCase(client->GetPlayer()->GetAdventureClass()).c_str()); packet->setDataByName("subclass_tab_title", classes.GetClassNameCase(client->GetPlayer()->GetAdventureClass()).c_str());
packet->setDataByName("subclass_tree_node_id", node_id[AA_SUBCLASS]); packet->setDataByName("subclass_tree_node_id", node_id[AA_SUBCLASS]);
packet->setDataByName("subclass_max_aa", rule_manager.GetGlobalRule(R_Player, MaxSubclassAA)->GetInt32()); packet->setDataByName("subclass_max_aa", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxSubclassAA)->GetInt32());
int32 unknown3 = TreeNodeList[node_id[AA_SUBCLASS]]->AAtreeID; int32 unknown3 = TreeNodeList[node_id[AA_SUBCLASS]]->AAtreeID;
packet->setDataByName("subclass_id", classid[node_id[AA_SUBCLASS]]); packet->setDataByName("subclass_id", classid[node_id[AA_SUBCLASS]]);
@ -745,7 +745,7 @@ void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) {
index = 0; index = 0;
packet->setDataByName("shadows_tab_title", "Shadows"); packet->setDataByName("shadows_tab_title", "Shadows");
packet->setDataByName("shadows_tree_node_id", node_id[AA_SHADOW]); packet->setDataByName("shadows_tree_node_id", node_id[AA_SHADOW]);
packet->setDataByName("shadows_max_aa", rule_manager.GetGlobalRule(R_Player, MaxShadowsAA)->GetInt32()); packet->setDataByName("shadows_max_aa", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxShadowsAA)->GetInt32());
packet->setDataByName("shadows_id", classid[node_id[AA_SHADOW]]); packet->setDataByName("shadows_id", classid[node_id[AA_SHADOW]]);
packet->setDataByName("shadows_eof_req", 0); packet->setDataByName("shadows_eof_req", 0);
packet->setArrayLengthByName("shadows_num_items", shadows_num_items, 0); packet->setArrayLengthByName("shadows_num_items", shadows_num_items, 0);
@ -848,7 +848,7 @@ void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) {
index = 0; index = 0;
packet->setDataByName("heroic_tab_title", "Heroic"); packet->setDataByName("heroic_tab_title", "Heroic");
packet->setDataByName("heroic_tree_node_id", node_id[AA_HEROIC]); packet->setDataByName("heroic_tree_node_id", node_id[AA_HEROIC]);
packet->setDataByName("heroic_max_aa", rule_manager.GetGlobalRule(R_Player, MaxHeroicAA)->GetInt32()); packet->setDataByName("heroic_max_aa", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxHeroicAA)->GetInt32());
packet->setDataByName("heroic_id", classid[node_id[AA_HEROIC]]); packet->setDataByName("heroic_id", classid[node_id[AA_HEROIC]]);
packet->setDataByName("heroic_eof_req", 0); packet->setDataByName("heroic_eof_req", 0);
packet->setArrayLengthByName("heroic_num_items", heroic_num_items, 0); packet->setArrayLengthByName("heroic_num_items", heroic_num_items, 0);
@ -956,7 +956,7 @@ void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) {
index = 0; index = 0;
packet->setDataByName("tradeskill_tab_title", "Tradeskill"); packet->setDataByName("tradeskill_tab_title", "Tradeskill");
packet->setDataByName("tradeskill_tree_node_id", node_id[AA_TRADESKILL]); packet->setDataByName("tradeskill_tree_node_id", node_id[AA_TRADESKILL]);
packet->setDataByName("tradeskill_max_aa", rule_manager.GetGlobalRule(R_Player, MaxTradeskillAA)->GetInt32()); packet->setDataByName("tradeskill_max_aa", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxTradeskillAA)->GetInt32());
packet->setDataByName("tradeskill_id", classid[node_id[AA_TRADESKILL]]); packet->setDataByName("tradeskill_id", classid[node_id[AA_TRADESKILL]]);
packet->setDataByName("tradeskill_eof_req", 0); packet->setDataByName("tradeskill_eof_req", 0);
packet->setArrayLengthByName("tradeskill_num_items", tradeskill_num_items, 0); packet->setArrayLengthByName("tradeskill_num_items", tradeskill_num_items, 0);
@ -1048,7 +1048,7 @@ void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) {
index = 0; index = 0;
packet->setDataByName("prestige_tab_title", "Prestige"); packet->setDataByName("prestige_tab_title", "Prestige");
packet->setDataByName("prestige_tree_node_id", node_id[AA_PRESTIGE]); packet->setDataByName("prestige_tree_node_id", node_id[AA_PRESTIGE]);
packet->setDataByName("prestige_max_aa", rule_manager.GetGlobalRule(R_Player, MaxPrestigeAA)->GetInt32()); packet->setDataByName("prestige_max_aa", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxPrestigeAA)->GetInt32());
packet->setDataByName("prestige_id", classid[node_id[AA_PRESTIGE]]); packet->setDataByName("prestige_id", classid[node_id[AA_PRESTIGE]]);
packet->setDataByName("prestige_eof_req", 0); packet->setDataByName("prestige_eof_req", 0);
packet->setArrayLengthByName("prestige_num_items", prestige_num_items, 0); packet->setArrayLengthByName("prestige_num_items", prestige_num_items, 0);
@ -1151,7 +1151,7 @@ void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) {
packet->setDataByName("tradeskillprestige_tab_title", "Tradeskill Prestige"); packet->setDataByName("tradeskillprestige_tab_title", "Tradeskill Prestige");
} }
packet->setDataByName("tradeskillprestige_tree_node_id", node_id[AA_TRADESKILL_PRESTIGE]); packet->setDataByName("tradeskillprestige_tree_node_id", node_id[AA_TRADESKILL_PRESTIGE]);
packet->setDataByName("tradeskillprestige_max_aa", rule_manager.GetGlobalRule(R_Player, MaxPrestigeAA)->GetInt32()); packet->setDataByName("tradeskillprestige_max_aa", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxPrestigeAA)->GetInt32());
packet->setDataByName("tradeskillprestige_id", classid[node_id[AA_TRADESKILL_PRESTIGE]]); packet->setDataByName("tradeskillprestige_id", classid[node_id[AA_TRADESKILL_PRESTIGE]]);
packet->setDataByName("tradeskillprestige_eof_req", 0); packet->setDataByName("tradeskillprestige_eof_req", 0);
packet->setArrayLengthByName("tradeskillprestige_num_items", tradeskillprestige_num_items, 0); packet->setArrayLengthByName("tradeskillprestige_num_items", tradeskillprestige_num_items, 0);
@ -1245,7 +1245,7 @@ void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) {
index = 0; index = 0;
packet->setDataByName("dragon_tab_title", "Dragon"); packet->setDataByName("dragon_tab_title", "Dragon");
packet->setDataByName("dragon_tree_node_id", node_id[AA_DRAGON]); packet->setDataByName("dragon_tree_node_id", node_id[AA_DRAGON]);
packet->setDataByName("dragon_max_aa", rule_manager.GetGlobalRule(R_Player, MaxDragonAA)->GetInt32()); packet->setDataByName("dragon_max_aa", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxDragonAA)->GetInt32());
packet->setDataByName("dragon_id", classid[node_id[AA_DRAGON]]); packet->setDataByName("dragon_id", classid[node_id[AA_DRAGON]]);
packet->setDataByName("dragon_eof_req", 0); packet->setDataByName("dragon_eof_req", 0);
packet->setArrayLengthByName("dragon_num_items", dragon_num_items, 0); packet->setArrayLengthByName("dragon_num_items", dragon_num_items, 0);
@ -1324,7 +1324,7 @@ void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) {
index = 0; index = 0;
packet->setDataByName("dragonclass_tab_title", classes.GetClassNameCase(client->GetPlayer()->GetAdventureClass()).c_str()); packet->setDataByName("dragonclass_tab_title", classes.GetClassNameCase(client->GetPlayer()->GetAdventureClass()).c_str());
packet->setDataByName("dragonclass_tree_node_id", node_id[AA_DRAGONCLASS]); packet->setDataByName("dragonclass_tree_node_id", node_id[AA_DRAGONCLASS]);
packet->setDataByName("dragonclass_max_aa", rule_manager.GetGlobalRule(R_Player, MaxDragonAA)->GetInt32()); packet->setDataByName("dragonclass_max_aa", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxDragonAA)->GetInt32());
packet->setDataByName("dragonclass_id", classid[node_id[AA_DRAGONCLASS]]); packet->setDataByName("dragonclass_id", classid[node_id[AA_DRAGONCLASS]]);
packet->setDataByName("dragonclass_eof_req", 0); packet->setDataByName("dragonclass_eof_req", 0);
packet->setArrayLengthByName("dragonclass_num_items", dragonclass_num_items, 0); packet->setArrayLengthByName("dragonclass_num_items", dragonclass_num_items, 0);
@ -1402,7 +1402,7 @@ void MasterAAList::DisplayAA(Client* client,int8 newtemplate,int8 changemode) {
index = 0; index = 0;
packet->setDataByName("farseas_tab_title", "Farseas"); packet->setDataByName("farseas_tab_title", "Farseas");
packet->setDataByName("farseas_tree_node_id", node_id[AA_FARSEAS]); packet->setDataByName("farseas_tree_node_id", node_id[AA_FARSEAS]);
packet->setDataByName("farseas_max_aa", rule_manager.GetGlobalRule(R_Player, MaxDragonAA)->GetInt32()); packet->setDataByName("farseas_max_aa", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxDragonAA)->GetInt32());
packet->setDataByName("farseas_id", classid[node_id[AA_FARSEAS]]); packet->setDataByName("farseas_id", classid[node_id[AA_FARSEAS]]);
packet->setDataByName("farseas_eof_req", 0); packet->setDataByName("farseas_eof_req", 0);
packet->setArrayLengthByName("farseas_num_items", farseas_num_items, 0); packet->setArrayLengthByName("farseas_num_items", farseas_num_items, 0);

View File

@ -50,7 +50,7 @@ void BotBrain::Think() {
float distance = GetBody()->GetDistance(target); float distance = GetBody()->GetDistance(target);
// If out of melee range then move closer // If out of melee range then move closer
if (distance > rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat()) if (distance > rule_manager.GetZoneRule(GetBody()->GetZoneID(), R_Combat, MaxCombatRange)->GetFloat())
MoveCloser(target); MoveCloser(target);
} }
} }

View File

@ -125,7 +125,7 @@ bool Entity::AttackAllowed(Entity* target, float distance, bool range_attack) {
return false; return false;
} }
if(rule_manager.GetGlobalRule(R_Combat, LockedEncounterNoAttack)->GetBool()) { if(rule_manager.GetZoneRule(GetZoneID(), R_Combat, LockedEncounterNoAttack)->GetBool()) {
if(target->IsNPC() && (target->GetLockedNoLoot() == ENCOUNTER_STATE_LOCKED || target->GetLockedNoLoot() == ENCOUNTER_STATE_OVERMATCHED) && if(target->IsNPC() && (target->GetLockedNoLoot() == ENCOUNTER_STATE_LOCKED || target->GetLockedNoLoot() == ENCOUNTER_STATE_OVERMATCHED) &&
!attacker->IsEngagedBySpawnID(target->GetID())) { !attacker->IsEngagedBySpawnID(target->GetID())) {
return false; return false;
@ -138,14 +138,14 @@ bool Entity::AttackAllowed(Entity* target, float distance, bool range_attack) {
if (attacker->IsPlayer() && target->IsPlayer()) if (attacker->IsPlayer() && target->IsPlayer())
{ {
bool pvp_allowed = rule_manager.GetGlobalRule(R_PVP, AllowPVP)->GetBool(); bool pvp_allowed = rule_manager.GetZoneRule(GetZoneID(), R_PVP, AllowPVP)->GetBool();
if (!pvp_allowed) { if (!pvp_allowed) {
LogWrite(COMBAT__DEBUG, 3, "AttackAllowed", "Failed to attack: pvp is not allowed"); LogWrite(COMBAT__DEBUG, 3, "AttackAllowed", "Failed to attack: pvp is not allowed");
return false; return false;
} }
else else
{ {
sint32 pvpLevelRange = rule_manager.GetGlobalRule(R_PVP, LevelRange)->GetSInt32(); sint32 pvpLevelRange = rule_manager.GetZoneRule(GetZoneID(), R_PVP, LevelRange)->GetSInt32();
int32 attackerLevel = attacker->GetLevel(); int32 attackerLevel = attacker->GetLevel();
int32 defenderLevel = target->GetLevel(); int32 defenderLevel = target->GetLevel();
if ((sint32)abs((sint32)attackerLevel - (sint32)defenderLevel) > pvpLevelRange) if ((sint32)abs((sint32)attackerLevel - (sint32)defenderLevel) > pvpLevelRange)
@ -186,7 +186,7 @@ bool Entity::AttackAllowed(Entity* target, float distance, bool range_attack) {
} }
} }
else if (distance != 0) { else if (distance != 0) {
if(distance >= rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat()) { if(distance >= rule_manager.GetZoneRule(GetZoneID(), R_Combat, MaxCombatRange)->GetFloat()) {
LogWrite(COMBAT__DEBUG, 3, "AttackAllowed", "Failed to attack: distance is beyond melee range"); LogWrite(COMBAT__DEBUG, 3, "AttackAllowed", "Failed to attack: distance is beyond melee range");
return false; return false;
} }
@ -808,7 +808,7 @@ int8 Entity::DetermineHit(Spawn* victim, int8 type, int8 damage_type, float ToHi
LogWrite(COMBAT__DEBUG, 9, "Combat", "SpellResist: resistibility %f, bonus %f", lua_spell->spell->GetSpellData()->resistibility, bonus); LogWrite(COMBAT__DEBUG, 9, "Combat", "SpellResist: resistibility %f, bonus %f", lua_spell->spell->GetSpellData()->resistibility, bonus);
// Here we take into account Subjugation, Disruption and Ordination (debuffs) // Here we take into account Subjugation, Disruption and Ordination (debuffs)
if(lua_spell->spell->GetSpellData()->mastery_skill) { if(lua_spell->spell->GetSpellData()->mastery_skill) {
int32 master_skill_reduce = rule_manager.GetGlobalRule(R_Spells, MasterSkillReduceSpellResist)->GetInt32(); int32 master_skill_reduce = rule_manager.GetZoneRule(GetZoneID(), R_Spells, MasterSkillReduceSpellResist)->GetInt32();
if(master_skill_reduce < 1) if(master_skill_reduce < 1)
master_skill_reduce = 25; master_skill_reduce = 25;
if(IsPlayer() && lua_spell->spell->GetSpellData()->spell_book_type == SPELL_BOOK_TYPE_TRADESKILL && if(IsPlayer() && lua_spell->spell->GetSpellData()->spell_book_type == SPELL_BOOK_TYPE_TRADESKILL &&
@ -1230,7 +1230,7 @@ float Entity::CalculateMitigation(int8 type, int8 damage_type, int16 effective_l
else else
effective_level_attacker = 1; effective_level_attacker = 1;
int32 effective_mit_cap = effective_level_victim * rule_manager.GetGlobalRule(R_Combat, EffectiveMitigationCapLevel)->GetInt32(); int32 effective_mit_cap = effective_level_victim * rule_manager.GetZoneRule(GetZoneID(), R_Combat, EffectiveMitigationCapLevel)->GetInt32();
float max_mit = (float)GetInfoStruct()->get_max_mitigation(); float max_mit = (float)GetInfoStruct()->get_max_mitigation();
if(max_mit == 0.0f) if(max_mit == 0.0f)
max_mit = effective_level_victim * 100.0f; max_mit = effective_level_victim * 100.0f;
@ -1268,26 +1268,26 @@ float Entity::CalculateMitigation(int8 type, int8 damage_type, int16 effective_l
} }
if(for_pvp) { if(for_pvp) {
mit_to_use += effective_level_victim * rule_manager.GetGlobalRule(R_Combat, MitigationLevelEffectivenessMax)->GetInt32(); mit_to_use += effective_level_victim * rule_manager.GetZoneRule(GetZoneID(), R_Combat, MitigationLevelEffectivenessMax)->GetInt32();
} }
if(mit_to_use > effective_mit_cap) { if(mit_to_use > effective_mit_cap) {
mit_to_use = effective_mit_cap; mit_to_use = effective_mit_cap;
} }
float level_diff = ((float)effective_level_victim / (float)effective_level_attacker); float level_diff = ((float)effective_level_victim / (float)effective_level_attacker);
if(level_diff > rule_manager.GetGlobalRule(R_Combat, MitigationLevelEffectivenessMax)->GetFloat()) { if(level_diff > rule_manager.GetZoneRule(GetZoneID(), R_Combat, MitigationLevelEffectivenessMax)->GetFloat()) {
level_diff = rule_manager.GetGlobalRule(R_Combat, MitigationLevelEffectivenessMax)->GetFloat(); level_diff = rule_manager.GetZoneRule(GetZoneID(), R_Combat, MitigationLevelEffectivenessMax)->GetFloat();
} }
else if(level_diff < rule_manager.GetGlobalRule(R_Combat, MitigationLevelEffectivenessMax)->GetFloat()) { else if(level_diff < rule_manager.GetZoneRule(GetZoneID(), R_Combat, MitigationLevelEffectivenessMax)->GetFloat()) {
level_diff = rule_manager.GetGlobalRule(R_Combat, MitigationLevelEffectivenessMin)->GetFloat(); level_diff = rule_manager.GetZoneRule(GetZoneID(), R_Combat, MitigationLevelEffectivenessMin)->GetFloat();
} }
float mit_percentage = ((float)mit_to_use / max_mit) * level_diff; float mit_percentage = ((float)mit_to_use / max_mit) * level_diff;
if(!for_pvp && mit_percentage > rule_manager.GetGlobalRule(R_Combat, MaxMitigationAllowed)->GetFloat()) { if(!for_pvp && mit_percentage > rule_manager.GetZoneRule(GetZoneID(), R_Combat, MaxMitigationAllowed)->GetFloat()) {
mit_percentage = rule_manager.GetGlobalRule(R_Combat, MaxMitigationAllowed)->GetFloat(); mit_percentage = rule_manager.GetZoneRule(GetZoneID(), R_Combat, MaxMitigationAllowed)->GetFloat();
} }
else if(for_pvp && mit_percentage > rule_manager.GetGlobalRule(R_Combat, MaxMitigationAllowedPVP)->GetFloat()) { else if(for_pvp && mit_percentage > rule_manager.GetZoneRule(GetZoneID(), R_Combat, MaxMitigationAllowedPVP)->GetFloat()) {
mit_percentage = rule_manager.GetGlobalRule(R_Combat, MaxMitigationAllowedPVP)->GetFloat(); mit_percentage = rule_manager.GetZoneRule(GetZoneID(), R_Combat, MaxMitigationAllowedPVP)->GetFloat();
} }
return mit_percentage; return mit_percentage;
@ -1356,13 +1356,13 @@ void Entity::AddHate(Entity* attacker, sint32 hate) {
} }
bool Entity::CheckFizzleSpell(LuaSpell* spell) { bool Entity::CheckFizzleSpell(LuaSpell* spell) {
if(!spell || !rule_manager.GetGlobalRule(R_Spells, EnableFizzleSpells)->GetInt8() if(!spell || !rule_manager.GetZoneRule(GetZoneID(), R_Spells, EnableFizzleSpells)->GetInt8()
|| spell->spell->GetSpellData()->can_fizzle == false) || spell->spell->GetSpellData()->can_fizzle == false)
return false; return false;
float fizzleMaxSkill = rule_manager.GetGlobalRule(R_Spells, FizzleMaxSkill)->GetFloat(); float fizzleMaxSkill = rule_manager.GetZoneRule(GetZoneID(), R_Spells, FizzleMaxSkill)->GetFloat();
float baseFizzle = rule_manager.GetGlobalRule(R_Spells, DefaultFizzleChance)->GetFloat()/100.0f; // 10% float baseFizzle = rule_manager.GetZoneRule(GetZoneID(), R_Spells, DefaultFizzleChance)->GetFloat()/100.0f; // 10%
float skillObtained = rule_manager.GetGlobalRule(R_Spells, FizzleDefaultSkill)->GetFloat(); // default of .2f so we don't go over the threshold if no skill float skillObtained = rule_manager.GetZoneRule(GetZoneID(), R_Spells, FizzleDefaultSkill)->GetFloat(); // default of .2f so we don't go over the threshold if no skill
Skill* skill = GetSkillByID(spell->spell->GetSpellData()->mastery_skill, false); Skill* skill = GetSkillByID(spell->spell->GetSpellData()->mastery_skill, false);
if(skill && spell->spell->GetSpellData()->min_class_skill_req > 0) if(skill && spell->spell->GetSpellData()->min_class_skill_req > 0)
{ {
@ -1397,7 +1397,7 @@ bool Entity::CheckInterruptSpell(Entity* attacker) {
//originally base of 30 percent chance to continue casting if attacked //originally base of 30 percent chance to continue casting if attacked
//modified to 50% and added global rule, 30% was too small at starting levels //modified to 50% and added global rule, 30% was too small at starting levels
int8 percent = rule_manager.GetGlobalRule(R_Spells, NoInterruptBaseChance)->GetInt32(); int8 percent = rule_manager.GetZoneRule(GetZoneID(), R_Spells, NoInterruptBaseChance)->GetInt32();
float focus_skill_with_bonus = CalculateSkillWithBonus("Focus", ITEM_STAT_FOCUS, true); float focus_skill_with_bonus = CalculateSkillWithBonus("Focus", ITEM_STAT_FOCUS, true);
@ -1464,13 +1464,13 @@ void Entity::HandleDeathExperienceDebt(Spawn* killer)
float ruleDebt = 0.0f; float ruleDebt = 0.0f;
if(killer && killer->IsPlayer()) if(killer && killer->IsPlayer())
ruleDebt = rule_manager.GetGlobalRule(R_Combat, PVPDeathExperienceDebt)->GetFloat()/100.0f; ruleDebt = rule_manager.GetZoneRule(GetZoneID(), R_Combat, PVPDeathExperienceDebt)->GetFloat()/100.0f;
else else
ruleDebt = rule_manager.GetGlobalRule(R_Combat, DeathExperienceDebt)->GetFloat()/100.0f; ruleDebt = rule_manager.GetZoneRule(GetZoneID(), R_Combat, DeathExperienceDebt)->GetFloat()/100.0f;
if(ruleDebt > 0.0f) if(ruleDebt > 0.0f)
{ {
bool groupDebt = rule_manager.GetGlobalRule(R_Combat, GroupExperienceDebt)->GetBool(); bool groupDebt = rule_manager.GetZoneRule(GetZoneID(), R_Combat, GroupExperienceDebt)->GetBool();
if(groupDebt && ((Player*)this)->GetGroupMemberInfo()) if(groupDebt && ((Player*)this)->GetGroupMemberInfo())
{ {
world.GetGroupManager()->GroupLock(__FUNCTION__, __LINE__); world.GetGroupManager()->GroupLock(__FUNCTION__, __LINE__);
@ -1594,7 +1594,7 @@ void Player::ProcessCombat() {
} }
} }
} }
else if(distance <= rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat()) { else if(distance <= rule_manager.GetZoneRule(GetZoneID(), R_Combat, MaxCombatRange)->GetFloat()) {
// We are doing melee auto attacks and are within range // We are doing melee auto attacks and are within range
// Check to see if we can attack the target // Check to see if we can attack the target

View File

@ -24,12 +24,6 @@
#include "NPC_AI.h" #include "NPC_AI.h"
#include "MutexList.h" #include "MutexList.h"
#define COMBAT_NORMAL_FIGHTER 0
#define COMBAT_ADD_FIGHTER 1
#define COMBAT_REMOVE_FIGHTER 2
// replace with rule rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat()
//#define MAX_COMBAT_RANGE 3
class ZoneServer; class ZoneServer;
class SpellProcess; class SpellProcess;
class LuaSpell; class LuaSpell;

View File

@ -2352,7 +2352,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
break; break;
} }
int16 tier_up = player->GetTierUp(spell->GetSpellTier()); int16 tier_up = player->GetTierUp(spell->GetSpellTier());
if (rule_manager.GetGlobalRule(R_Spells, RequirePreviousTierScribe)->GetInt8() && !player->HasSpell(spell->GetSpellID(), tier_up, false, true)) if (rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, RequirePreviousTierScribe)->GetInt8() && !player->HasSpell(spell->GetSpellID(), tier_up, false, true))
client->SimpleMessage(CHANNEL_COLOR_RED, "You have not scribed the required previous version of this ability."); client->SimpleMessage(CHANNEL_COLOR_RED, "You have not scribed the required previous version of this ability.");
else if (!player->HasSpell(spell->GetSpellID(), spell->GetSpellTier(), true)) { else if (!player->HasSpell(spell->GetSpellID(), spell->GetSpellTier(), true)) {
old_slot = player->GetSpellSlot(spell->GetSpellID()); old_slot = player->GetSpellSlot(spell->GetSpellID());
@ -2549,7 +2549,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
if (spawn->IsNPC()) if (spawn->IsNPC())
show_bubble = false; show_bubble = false;
client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_SAY, tmp, HEAR_SPAWN_DISTANCE, 0, show_bubble, client->GetPlayer()->GetCurrentLanguage()); client->GetCurrentZone()->HandleChatMessage(client->GetPlayer(), 0, CHANNEL_SAY, tmp, HEAR_SPAWN_DISTANCE, 0, show_bubble, client->GetPlayer()->GetCurrentLanguage());
if(spawn->IsPlayer() == false && spawn->Alive() && spawn->GetDistance(client->GetPlayer()) < rule_manager.GetGlobalRule(R_Spawn, HailDistance)->GetInt32()){ if(spawn->IsPlayer() == false && spawn->Alive() && spawn->GetDistance(client->GetPlayer()) < rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spawn, HailDistance)->GetInt32()){
if(spawn->IsNPC() && ((NPC*)spawn)->EngagedInCombat()) if(spawn->IsNPC() && ((NPC*)spawn)->EngagedInCombat())
spawn->GetZone()->CallSpawnScript(spawn, SPAWN_SCRIPT_HAILED_BUSY, client->GetPlayer()); spawn->GetZone()->CallSpawnScript(spawn, SPAWN_SCRIPT_HAILED_BUSY, client->GetPlayer());
else else
@ -2563,7 +2563,7 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
} }
if(spawn->GetZone()->CallSpawnScript(spawn, SPAWN_SCRIPT_HAILED, client->GetPlayer()) && pauseRunback) if(spawn->GetZone()->CallSpawnScript(spawn, SPAWN_SCRIPT_HAILED, client->GetPlayer()) && pauseRunback)
spawn->PauseMovement(rule_manager.GetGlobalRule(R_Spawn, HailMovementPause)->GetInt32()); spawn->PauseMovement(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spawn, HailMovementPause)->GetInt32());
else if(spawn->IsNPC() && pauseRunback) else if(spawn->IsNPC() && pauseRunback)
((NPC*)spawn)->ClearRunback(); ((NPC*)spawn)->ClearRunback();
} }
@ -3034,11 +3034,11 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
} }
if(cmdTarget && cmdTarget->IsEntity()){ if(cmdTarget && cmdTarget->IsEntity()){
if (cmdTarget->GetDistance(client->GetPlayer()) <= rule_manager.GetGlobalRule(R_Loot, LootRadius)->GetFloat()){ if (cmdTarget->GetDistance(client->GetPlayer()) <= rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Loot, LootRadius)->GetFloat()){
if (!rule_manager.GetGlobalRule(R_Loot, AutoDisarmChest)->GetBool() && command->handler == COMMAND_DISARM ) if (!rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Loot, AutoDisarmChest)->GetBool() && command->handler == COMMAND_DISARM )
client->OpenChest(cmdTarget, true); client->OpenChest(cmdTarget, true);
else else
client->LootSpawnRequest(cmdTarget, rule_manager.GetGlobalRule(R_Loot, AutoDisarmChest)->GetBool()); client->LootSpawnRequest(cmdTarget, rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Loot, AutoDisarmChest)->GetBool());
if (!(cmdTarget)->HasLoot()){ if (!(cmdTarget)->HasLoot()){
if (((Entity*)cmdTarget)->IsNPC()) if (((Entity*)cmdTarget)->IsNPC())
client->GetCurrentZone()->RemoveDeadSpawn(cmdTarget); client->GetCurrentZone()->RemoveDeadSpawn(cmdTarget);
@ -7012,7 +7012,7 @@ void Commands::Command_Inventory(Client* client, Seperator* sep, EQ2_RemoteComma
} }
else if(sep->arg[2][0] && strncasecmp("swap_equip", sep->arg[0], 10) == 0 && sep->IsNumber(1) && sep->IsNumber(2)) else if(sep->arg[2][0] && strncasecmp("swap_equip", sep->arg[0], 10) == 0 && sep->IsNumber(1) && sep->IsNumber(2))
{ {
if(client->GetPlayer()->EngagedInCombat() && rule_manager.GetGlobalRule(R_Player, AllowPlayerEquipCombat)->GetInt8() == 0) { if(client->GetPlayer()->EngagedInCombat() && rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, AllowPlayerEquipCombat)->GetInt8() == 0) {
client->SimpleMessage(CHANNEL_COLOR_RED, "You may not swap items while in combat."); client->SimpleMessage(CHANNEL_COLOR_RED, "You may not swap items while in combat.");
} }
else { else {
@ -7250,7 +7250,7 @@ void Commands::Command_LastName(Client* client, Seperator* sep)
if (sep && sep->arg[0]) if (sep && sep->arg[0])
{ {
if (!client->GetPlayer()->get_character_flag(CF_ENABLE_CHANGE_LASTNAME)){ if (!client->GetPlayer()->get_character_flag(CF_ENABLE_CHANGE_LASTNAME)){
client->Message(CHANNEL_COLOR_YELLOW, "You must be atleast level %i to change your last name.", rule_manager.GetGlobalRule(R_Player, MinLastNameLevel)->GetInt8()); client->Message(CHANNEL_COLOR_YELLOW, "You must be atleast level %i to change your last name.", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MinLastNameLevel)->GetInt8());
return; return;
} }
client->RemovePendingLastName(); client->RemovePendingLastName();
@ -7265,13 +7265,13 @@ void Commands::Command_LastName(Client* client, Seperator* sep)
} }
if (!valid_name) { if (!valid_name) {
client->Message(CHANNEL_COLOR_YELLOW, "Your last name can only contain letters.", rule_manager.GetGlobalRule(R_Player, MinLastNameLevel)->GetInt8()); client->Message(CHANNEL_COLOR_YELLOW, "Your last name can only contain letters.", rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MinLastNameLevel)->GetInt8());
return; return;
} }
string last_name = (string)sep->arg[0]; string last_name = (string)sep->arg[0];
int8 max_length = rule_manager.GetGlobalRule(R_Player, MaxLastNameLength)->GetInt8(); int8 max_length = rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxLastNameLength)->GetInt8();
int8 min_length = rule_manager.GetGlobalRule(R_Player, MinLastNameLength)->GetInt8(); int8 min_length = rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MinLastNameLength)->GetInt8();
if (last_name.length() <= max_length && last_name.length() >= min_length){ if (last_name.length() <= max_length && last_name.length() >= min_length){
client->SetPendingLastName(last_name); client->SetPendingLastName(last_name);
client->SendLastNameConfirmation(); client->SendLastNameConfirmation();
@ -11272,15 +11272,15 @@ void Commands::Command_Weather(Client* client, Seperator* sep)
} }
else if( strncasecmp(value, "reset", strlen(value)) == 0 ) else if( strncasecmp(value, "reset", strlen(value)) == 0 )
{ {
zsZone->SetWeatherType(rule_manager.GetGlobalRule(R_Zone, WeatherType)->GetInt8()); zsZone->SetWeatherType(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Zone, WeatherType)->GetInt8());
zsZone->SetWeatherFrequency(rule_manager.GetGlobalRule(R_Zone, WeatherChangeFrequency)->GetInt32()); zsZone->SetWeatherFrequency(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Zone, WeatherChangeFrequency)->GetInt32());
zsZone->SetWeatherMinSeverity(rule_manager.GetGlobalRule(R_Zone, MinWeatherSeverity)->GetFloat()); zsZone->SetWeatherMinSeverity(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Zone, MinWeatherSeverity)->GetFloat());
zsZone->SetWeatherMaxSeverity(rule_manager.GetGlobalRule(R_Zone, MaxWeatherSeverity)->GetFloat()); zsZone->SetWeatherMaxSeverity(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Zone, MaxWeatherSeverity)->GetFloat());
zsZone->SetCurrentWeather(zsZone->GetWeatherMinSeverity()); zsZone->SetCurrentWeather(zsZone->GetWeatherMinSeverity());
zsZone->SetWeatherPattern(1); zsZone->SetWeatherPattern(1);
zsZone->SetWeatherChance(rule_manager.GetGlobalRule(R_Zone, WeatherChangeChance)->GetInt8()); zsZone->SetWeatherChance(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Zone, WeatherChangeChance)->GetInt8());
zsZone->SetWeatherChangeAmount(rule_manager.GetGlobalRule(R_Zone, WeatherChangePerInterval)->GetFloat()); zsZone->SetWeatherChangeAmount(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Zone, WeatherChangePerInterval)->GetFloat());
zsZone->SetWeatherDynamicOffset(rule_manager.GetGlobalRule(R_Zone, WeatherDynamicMaxOffset)->GetFloat()); zsZone->SetWeatherDynamicOffset(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Zone, WeatherDynamicMaxOffset)->GetFloat());
zsZone->SetWeatherLastChangedTime(Timer::GetUnixTimeStamp() - zsZone->GetWeatherFrequency()); zsZone->SetWeatherLastChangedTime(Timer::GetUnixTimeStamp() - zsZone->GetWeatherFrequency());
zsZone->ProcessWeather(); zsZone->ProcessWeather();
} }
@ -11627,9 +11627,9 @@ void Commands::Command_AchievementAdd(Client* client, Seperator* sep) {
void Commands::Command_Editor(Client* client, Seperator* sep) { void Commands::Command_Editor(Client* client, Seperator* sep) {
PacketStruct* packet = configReader.getStruct("WS_ChoiceWindow", client->GetVersion()); PacketStruct* packet = configReader.getStruct("WS_ChoiceWindow", client->GetVersion());
if (packet) { if (packet) {
string url = string(rule_manager.GetGlobalRule(R_World, EditorURL)->GetString()); string url = string(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_World, EditorURL)->GetString());
if (rule_manager.GetGlobalRule(R_World, EditorOfficialServer)->GetBool()) { if (rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_World, EditorOfficialServer)->GetBool()) {
char command[255]; char command[255];
url = "browser " + url; url = "browser " + url;
int32 spawn_id = 0; int32 spawn_id = 0;
@ -11661,7 +11661,7 @@ void Commands::Command_Editor(Client* client, Seperator* sep) {
packet->setDataByName("accept_command", command); packet->setDataByName("accept_command", command);
} }
else if (rule_manager.GetGlobalRule(R_World, EditorIncludeID)->GetBool()) { else if (rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_World, EditorIncludeID)->GetBool()) {
char command[255]; char command[255];
url = "browser " + url; url = "browser " + url;
if (client->GetPlayer()->GetTarget()) if (client->GetPlayer()->GetTarget())
@ -12042,40 +12042,40 @@ void Commands::Command_CurePlayer(Client* client, Seperator* sep)
if(str == "arcane") { if(str == "arcane") {
type = EFFECT_CURE_TYPE_ARCANE; type = EFFECT_CURE_TYPE_ARCANE;
// cure arcane spell missing in DB? // cure arcane spell missing in DB?
if(use_spells && rule_manager.GetGlobalRule(R_Spells, CureArcaneSpellID)->GetInt32()) { if(use_spells && rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureArcaneSpellID)->GetInt32()) {
entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetGlobalRule(R_Spells, CureArcaneSpellID)->GetInt32()); // cure noxious entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureArcaneSpellID)->GetInt32()); // cure noxious
} }
} }
else if(str == "trauma") { else if(str == "trauma") {
type = EFFECT_CURE_TYPE_TRAUMA; type = EFFECT_CURE_TYPE_TRAUMA;
// cure trauma spell missing in DB? // cure trauma spell missing in DB?
if(use_spells && rule_manager.GetGlobalRule(R_Spells, CureTraumaSpellID)->GetInt32()) { if(use_spells && rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureTraumaSpellID)->GetInt32()) {
entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetGlobalRule(R_Spells, CureTraumaSpellID)->GetInt32()); // cure noxious entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureTraumaSpellID)->GetInt32()); // cure noxious
} }
} }
else if(str == "noxious") { else if(str == "noxious") {
type = EFFECT_CURE_TYPE_NOXIOUS; type = EFFECT_CURE_TYPE_NOXIOUS;
if(use_spells && rule_manager.GetGlobalRule(R_Spells, CureNoxiousSpellID)->GetInt32()) { if(use_spells && rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureNoxiousSpellID)->GetInt32()) {
entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetGlobalRule(R_Spells, CureNoxiousSpellID)->GetInt32()); // cure noxious entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureNoxiousSpellID)->GetInt32()); // cure noxious
} }
} }
else if(str == "curse") { else if(str == "curse") {
type = EFFECT_CURE_TYPE_CURSE; type = EFFECT_CURE_TYPE_CURSE;
if(use_spells && rule_manager.GetGlobalRule(R_Spells, CureCurseSpellID)->GetInt32()) { if(use_spells && rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureCurseSpellID)->GetInt32()) {
entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetGlobalRule(R_Spells, CureCurseSpellID)->GetInt32()); // cure curse entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureCurseSpellID)->GetInt32()); // cure curse
} }
} }
else if(str == "magic") { else if(str == "magic") {
type = EFFECT_CURE_TYPE_MAGIC; type = EFFECT_CURE_TYPE_MAGIC;
if(use_spells && rule_manager.GetGlobalRule(R_Spells, CureMagicSpellID)->GetInt32()) { if(use_spells && rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureMagicSpellID)->GetInt32()) {
entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetGlobalRule(R_Spells, CureMagicSpellID)->GetInt32()); // cure magic entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureMagicSpellID)->GetInt32()); // cure magic
} }
} }
if(use_spells) { if(use_spells) {
// check if any of the specific cure types are available, if not then check the base cures // check if any of the specific cure types are available, if not then check the base cures
if(!entry && rule_manager.GetGlobalRule(R_Spells, CureSpellID)->GetInt32()) { if(!entry && rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureSpellID)->GetInt32()) {
entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetGlobalRule(R_Spells, CureSpellID)->GetInt32()); // cure entry = client->GetPlayer()->GetSpellBookSpell(rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Spells, CureSpellID)->GetInt32()); // cure
} }
if(entry && entry->spell_id) { if(entry && entry->spell_id) {
@ -12353,7 +12353,7 @@ void Commands::Command_Target(Client* client, Seperator* sep) {
Entity* player = (Entity*)client->GetPlayer(); Entity* player = (Entity*)client->GetPlayer();
Spawn* res = nullptr; Spawn* res = nullptr;
if(sep && sep->arg[0] && player->GetZone()) { if(sep && sep->arg[0] && player->GetZone()) {
float max_distance = rule_manager.GetGlobalRule(R_Player, MaxTargetCommandDistance)->GetFloat(); float max_distance = rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MaxTargetCommandDistance)->GetFloat();
if(max_distance < 1.0f) { if(max_distance < 1.0f) {
max_distance = 10.0f; max_distance = 10.0f;

View File

@ -781,7 +781,7 @@ void Entity::GetWeaponDamage(Item* item, int32* low_damage, int32* high_damage)
int32 selected_high_dmg = item->weapon_info->damage_high3; int32 selected_high_dmg = item->weapon_info->damage_high3;
if(IsPlayer()) { if(IsPlayer()) {
float skillMultiplier = rule_manager.GetGlobalRule(R_Player, LevelMasterySkillMultiplier)->GetFloat(); float skillMultiplier = rule_manager.GetZoneRule(GetZoneID(), R_Player, LevelMasterySkillMultiplier)->GetFloat();
if(skillMultiplier <= 0.0f) { if(skillMultiplier <= 0.0f) {
skillMultiplier = 1.0f; skillMultiplier = 1.0f;
} }
@ -919,12 +919,12 @@ void Entity::UpdateWeapons() {
int32 Entity::GetStrengthDamage() { int32 Entity::GetStrengthDamage() {
int32 str_offset = 1; int32 str_offset = 1;
if(IsNPC()) { if(IsNPC()) {
str_offset = rule_manager.GetGlobalRule(R_Combat, StrengthNPC)->GetInt32(); str_offset = rule_manager.GetZoneRule(GetZoneID(), R_Combat, StrengthNPC)->GetInt32();
if(str_offset < 1) if(str_offset < 1)
str_offset = 1; str_offset = 1;
} }
else { else {
str_offset = rule_manager.GetGlobalRule(R_Combat, StrengthOther)->GetInt32(); str_offset = rule_manager.GetZoneRule(GetZoneID(), R_Combat, StrengthOther)->GetInt32();
if(str_offset < 1) if(str_offset < 1)
str_offset = 1; str_offset = 1;
@ -1343,7 +1343,7 @@ void Entity::SetMaxSpeed(float val){
float Entity::CalculateSkillStatChance(char* skillName, int16 item_stat, float max_cap, float modifier, bool add_to_skill) float Entity::CalculateSkillStatChance(char* skillName, int16 item_stat, float max_cap, float modifier, bool add_to_skill)
{ {
float skillAndItemsChance = 0.0f; float skillAndItemsChance = 0.0f;
float maxBonusCap = (float)GetLevel()*rule_manager.GetGlobalRule(R_Combat, MaxSkillBonusByLevel)->GetFloat(); float maxBonusCap = (float)GetLevel()*rule_manager.GetZoneRule(GetZoneID(), R_Combat, MaxSkillBonusByLevel)->GetFloat();
Skill* skill = GetSkillByName(skillName, false); Skill* skill = GetSkillByName(skillName, false);
if(skill){ if(skill){
MStats.lock(); MStats.lock();
@ -1398,7 +1398,7 @@ float Entity::CalculateSkillWithBonus(char* skillName, int16 item_stat, bool cha
} }
float Entity::GetRuleSkillMaxBonus() { float Entity::GetRuleSkillMaxBonus() {
return (float)GetLevel()*rule_manager.GetGlobalRule(R_Combat, MaxSkillBonusByLevel)->GetFloat(); return (float)GetLevel()*rule_manager.GetZoneRule(GetZoneID(), R_Combat, MaxSkillBonusByLevel)->GetFloat();
} }
void Entity::CalculateBonuses(){ void Entity::CalculateBonuses(){
@ -1468,7 +1468,7 @@ void Entity::CalculateBonuses(){
info->set_cur_mitigation(info->get_mitigation_base()); info->set_cur_mitigation(info->get_mitigation_base());
int32 calc_mit_cap = effective_level * rule_manager.GetGlobalRule(R_Combat, CalculatedMitigationCapLevel)->GetInt32(); int32 calc_mit_cap = effective_level * rule_manager.GetZoneRule(GetZoneID(), R_Combat, CalculatedMitigationCapLevel)->GetInt32();
info->set_max_mitigation(calc_mit_cap); info->set_max_mitigation(calc_mit_cap);
int16 mit_percent = (int16)(CalculateMitigation() * 1000.0f); int16 mit_percent = (int16)(CalculateMitigation() * 1000.0f);
@ -1656,7 +1656,7 @@ void Entity::CalculateApplyWeight() {
int32 coin_gold = GetInfoStruct()->get_coin_gold(); int32 coin_gold = GetInfoStruct()->get_coin_gold();
int32 coin_plat = GetInfoStruct()->get_coin_plat(); int32 coin_plat = GetInfoStruct()->get_coin_plat();
float weight_per_stone = rule_manager.GetGlobalRule(R_Player, CoinWeightPerStone)->GetFloat(); float weight_per_stone = rule_manager.GetZoneRule(GetZoneID(), R_Player, CoinWeightPerStone)->GetFloat();
if(weight_per_stone < 0.0f) { if(weight_per_stone < 0.0f) {
weight_per_stone = 0.0f; weight_per_stone = 0.0f;
} }
@ -1683,8 +1683,8 @@ void Entity::CalculateApplyWeight() {
((Player*)this)->SetCharSheetChanged(true); ((Player*)this)->SetCharSheetChanged(true);
} }
int32 max_weight = 0; int32 max_weight = 0;
float weight_str_multiplier = rule_manager.GetGlobalRule(R_Player, MaxWeightStrengthMultiplier)->GetFloat(); float weight_str_multiplier = rule_manager.GetZoneRule(GetZoneID(), R_Player, MaxWeightStrengthMultiplier)->GetFloat();
int32 base_weight = rule_manager.GetGlobalRule(R_Player, BaseWeight)->GetInt32(); int32 base_weight = rule_manager.GetZoneRule(GetZoneID(), R_Player, BaseWeight)->GetInt32();
if(weight_str_multiplier < 0.0f) { if(weight_str_multiplier < 0.0f) {
weight_str_multiplier = 0.0f; weight_str_multiplier = 0.0f;
} }
@ -1701,7 +1701,7 @@ void Entity::CalculateApplyWeight() {
void Entity::SetRegenValues(int16 effective_level) void Entity::SetRegenValues(int16 effective_level)
{ {
bool classicRegen = rule_manager.GetGlobalRule(R_Spawn, ClassicRegen)->GetBool(); bool classicRegen = rule_manager.GetZoneRule(GetZoneID(), R_Spawn, ClassicRegen)->GetBool();
bool override_ = (IsPlayer() && !GetInfoStruct()->get_engaged_encounter()); bool override_ = (IsPlayer() && !GetInfoStruct()->get_engaged_encounter());
if(!GetInfoStruct()->get_hp_regen_override()) if(!GetInfoStruct()->get_hp_regen_override())
@ -2934,9 +2934,9 @@ float Entity::GetHighestSnare() {
// For simplicity this will return the highest snare value, which is actually the lowest value // For simplicity this will return the highest snare value, which is actually the lowest value
float ret = 1.0f; float ret = 1.0f;
float weight_diff = 0.0f; float weight_diff = 0.0f;
if (IsPlayer() && rule_manager.GetGlobalRule(R_Player, WeightInflictsSpeed)->GetBool()) { if (IsPlayer() && rule_manager.GetZoneRule(GetZoneID(), R_Player, WeightInflictsSpeed)->GetBool()) {
float weight_pct_impact = rule_manager.GetGlobalRule(R_Player, WeightPercentImpact)->GetFloat(); float weight_pct_impact = rule_manager.GetZoneRule(GetZoneID(), R_Player, WeightPercentImpact)->GetFloat();
float weight_pct_cap = rule_manager.GetGlobalRule(R_Player, WeightPercentCap)->GetFloat(); float weight_pct_cap = rule_manager.GetZoneRule(GetZoneID(), R_Player, WeightPercentCap)->GetFloat();
if(weight_pct_impact > 1.0f) { if(weight_pct_impact > 1.0f) {
weight_pct_impact = 1.0f; weight_pct_impact = 1.0f;
} }

View File

@ -138,7 +138,7 @@ void GroundSpawn::ProcessHarvest(Client* client) {
int16 totalSkill = skill->current_val; int16 totalSkill = skill->current_val;
int32 skillID = master_item_list.GetItemStatIDByName(collection_skill); int32 skillID = master_item_list.GetItemStatIDByName(collection_skill);
int16 max_skill_req_groundspawn = rule_manager.GetGlobalRule(R_Player, MinSkillMultiplierValue)->GetInt16(); int16 max_skill_req_groundspawn = rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, MinSkillMultiplierValue)->GetInt16();
if(max_skill_req_groundspawn < 1) // can't be 0 if(max_skill_req_groundspawn < 1) // can't be 0
max_skill_req_groundspawn = 1; max_skill_req_groundspawn = 1;
@ -278,7 +278,7 @@ void GroundSpawn::ProcessHarvest(Client* client) {
else else
LogWrite(GROUNDSPAWN__DEBUG, 3, "GSpawn", "Harvest nothing..."); LogWrite(GROUNDSPAWN__DEBUG, 3, "GSpawn", "Harvest nothing...");
float node_maxskill_multiplier = rule_manager.GetGlobalRule(R_Player, HarvestSkillUpMultiplier)->GetFloat(); float node_maxskill_multiplier = rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, HarvestSkillUpMultiplier)->GetFloat();
if(node_maxskill_multiplier <= 0.0f) { if(node_maxskill_multiplier <= 0.0f) {
node_maxskill_multiplier = 1.0f; node_maxskill_multiplier = 1.0f;
} }

View File

@ -12,7 +12,7 @@ extern RuleManager rule_manager;
void ClientPacketFunctions::SendHousePurchase(Client* client, HouseZone* hz, int32 spawnID) { void ClientPacketFunctions::SendHousePurchase(Client* client, HouseZone* hz, int32 spawnID) {
PacketStruct* packet = configReader.getStruct("WS_PlayerHousePurchase", client->GetVersion()); PacketStruct* packet = configReader.getStruct("WS_PlayerHousePurchase", client->GetVersion());
if (packet) { if (packet) {
int8 disable_alignment_req = rule_manager.GetGlobalRule(R_Player, DisableHouseAlignmentRequirement)->GetInt8(); int8 disable_alignment_req = rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Player, DisableHouseAlignmentRequirement)->GetInt8();
packet->setDataByName("house_name", hz->name.c_str()); packet->setDataByName("house_name", hz->name.c_str());
packet->setDataByName("house_id", hz->id); packet->setDataByName("house_id", hz->id);
packet->setDataByName("spawn_id", spawnID); packet->setDataByName("spawn_id", spawnID);

View File

@ -856,7 +856,8 @@ ItemStatsValues* MasterItemList::CalculateItemBonuses(Item* item, Entity* entity
{ {
int32 diff = item->details.recommended_level - effective_level; int32 diff = item->details.recommended_level - effective_level;
float tmpValue = (float)value; float tmpValue = (float)value;
value = (sint32)(float)(tmpValue / (1.0f + ((float)diff * rule_manager.GetGlobalRule(R_Player, MentorItemDecayRate)->GetFloat()))); int32 zone_id = entity->GetZone() ? entity->GetZone()->GetZoneID() : 0;
value = (sint32)(float)(tmpValue / (1.0f + ((float)diff * rule_manager.GetZoneRule(zone_id, R_Player, MentorItemDecayRate)->GetFloat())));
} }
} }
@ -1850,7 +1851,8 @@ void Item::serialize(PacketStruct* packet, bool show_name, Player* player, int16
packet->setSubstructDataByName("header_info", "unique_id", details.unique_id); packet->setSubstructDataByName("header_info", "unique_id", details.unique_id);
packet->setSubstructDataByName("header_info", "icon", GetIcon(packet->GetVersion())); packet->setSubstructDataByName("header_info", "icon", GetIcon(packet->GetVersion()));
if(rule_manager.GetGlobalRule(R_World, DisplayItemTiers)->GetBool()) { int32 zone_id = player->GetZone() ? player->GetZone()->GetZoneID() : 0;
if(rule_manager.GetZoneRule(zone_id, R_World, DisplayItemTiers)->GetBool()) {
packet->setSubstructDataByName("header_info", "tier", details.tier); packet->setSubstructDataByName("header_info", "tier", details.tier);
} }
packet->setSubstructDataByName("header_info", "flags", generic_info.item_flags); packet->setSubstructDataByName("header_info", "flags", generic_info.item_flags);
@ -1894,7 +1896,8 @@ void Item::serialize(PacketStruct* packet, bool show_name, Player* player, int16
{ {
int32 diff = details.recommended_level - effective_level; int32 diff = details.recommended_level - effective_level;
float tmpValue = (float)statValue; float tmpValue = (float)statValue;
statValue = (sint32)(float)(tmpValue / (1.0f + ((float)diff * rule_manager.GetGlobalRule(R_Player, MentorItemDecayRate)->GetFloat()))); int32 zone_id = player->GetZone() ? player->GetZone()->GetZoneID() : 0;
statValue = (sint32)(float)(tmpValue / (1.0f + ((float)diff * rule_manager.GetZoneRule(zone_id, R_Player, MentorItemDecayRate)->GetFloat())));
} }
} }
@ -2395,7 +2398,8 @@ void Item::serialize(PacketStruct* packet, bool show_name, Player* player, int16
// either don't require previous tier or check that we have the lower tier spells potentially // either don't require previous tier or check that we have the lower tier spells potentially
int32 tier_up = player->GetTierUp(skill_info->spell_tier); int32 tier_up = player->GetTierUp(skill_info->spell_tier);
if (!rule_manager.GetGlobalRule(R_Spells, RequirePreviousTierScribe)->GetInt8() || player->HasSpell(skill_info->spell_id, tier_up, false, true)) int32 zone_id = player->GetZone() ? player->GetZone()->GetZoneID() : 0;
if (!rule_manager.GetZoneRule(zone_id, R_Spells, RequirePreviousTierScribe)->GetInt8() || player->HasSpell(skill_info->spell_id, tier_up, false, true))
packet->setDataByName("require_previous", 1, 0); packet->setDataByName("require_previous", 1, 0);
// membership required // membership required
//packet->setDataByName("unknown_1188_2_MJ", 1, 1); //packet->setDataByName("unknown_1188_2_MJ", 1, 1);
@ -3820,7 +3824,8 @@ void PlayerItemList::AddItemToPacket(PacketStruct* packet, Player* player, Item*
packet->setSubstructArrayDataByName("items", "item_level", item->details.recommended_level , 0, i); packet->setSubstructArrayDataByName("items", "item_level", item->details.recommended_level , 0, i);
if(rule_manager.GetGlobalRule(R_World, DisplayItemTiers)->GetBool()) { int32 zone_id = player->GetZone() ? player->GetZone()->GetZoneID() : 0;
if(rule_manager.GetZoneRule(zone_id, R_World, DisplayItemTiers)->GetBool()) {
packet->setSubstructArrayDataByName("items", "tier", item->details.tier, 0, i); packet->setSubstructArrayDataByName("items", "tier", item->details.tier, 0, i);
} }
@ -4392,7 +4397,8 @@ EQ2Packet* EquipmentItemList::serialize(int16 version, Player* player){
packet->setSubstructArrayDataByName("items", "count", item->details.count, 0, i); packet->setSubstructArrayDataByName("items", "count", item->details.count, 0, i);
// item level needed here // item level needed here
if(rule_manager.GetGlobalRule(R_World, DisplayItemTiers)->GetBool()) { int32 zone_id = player->GetZone() ? player->GetZone()->GetZoneID() : 0;
if(rule_manager.GetZoneRule(zone_id, R_World, DisplayItemTiers)->GetBool()) {
packet->setSubstructArrayDataByName("items", "tier", item->details.tier, 0, i); packet->setSubstructArrayDataByName("items", "tier", item->details.tier, 0, i);
} }
packet->setSubstructArrayDataByName("items", "num_slots", item->details.num_slots, 0, i); packet->setSubstructArrayDataByName("items", "num_slots", item->details.num_slots, 0, i);

View File

@ -40,7 +40,7 @@ extern RuleManager rule_manager;
NPC* Entity::DropChest() { NPC* Entity::DropChest() {
// Check to see if treasure chests are disabled in the rules // Check to see if treasure chests are disabled in the rules
if (rule_manager.GetGlobalRule(R_World, TreasureChestDisabled)->GetBool()) if (rule_manager.GetZoneRule(GetZoneID(), R_World, TreasureChestDisabled)->GetBool())
return 0; return 0;
if(GetChestDropTime()) { if(GetChestDropTime()) {
@ -66,8 +66,8 @@ NPC* Entity::DropChest() {
// heading needs to be GetHeading() - 180 so the chest faces the proper way // heading needs to be GetHeading() - 180 so the chest faces the proper way
chest->SetHeading(GetHeading() - 180); chest->SetHeading(GetHeading() - 180);
// Set the primary command to loot and the secondary to disarm // Set the primary command to loot and the secondary to disarm
chest->AddPrimaryEntityCommand("loot", rule_manager.GetGlobalRule(R_Loot, LootRadius)->GetFloat(), "loot", "", 0, 0); chest->AddPrimaryEntityCommand("loot", rule_manager.GetZoneRule(GetZoneID(), R_Loot, LootRadius)->GetFloat(), "loot", "", 0, 0);
chest->AddSecondaryEntityCommand("Disarm", rule_manager.GetGlobalRule(R_Loot, LootRadius)->GetFloat(), "Disarm", "", 0, 0); chest->AddSecondaryEntityCommand("Disarm", rule_manager.GetZoneRule(GetZoneID(), R_Loot, LootRadius)->GetFloat(), "Disarm", "", 0, 0);
// 32 = loot icon for the mouse // 32 = loot icon for the mouse
chest->SetIcon(32); chest->SetIcon(32);
// 1 = show the right click menu // 1 = show the right click menu

View File

@ -345,7 +345,7 @@ void NPC::InCombat(bool val){
} }
} }
int8 ruleAutoLockEncounter = rule_manager.GetGlobalRule(R_World, AutoLockEncounter)->GetInt8(); int8 ruleAutoLockEncounter = rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_World, AutoLockEncounter)->GetInt8();
in_combat = val; in_combat = val;
if(val){ if(val){
LogWrite(NPC__DEBUG, 3, "NPC", "'%s' engaged in combat with '%s'", this->GetName(), ( GetTarget() ) ? GetTarget()->GetName() : "Unknown" ); LogWrite(NPC__DEBUG, 3, "NPC", "'%s' engaged in combat with '%s'", this->GetName(), ( GetTarget() ) ? GetTarget()->GetName() : "Unknown" );

View File

@ -395,7 +395,7 @@ vector<Entity*>* Brain::GetHateList() {
void Brain::MoveCloser(Spawn* target) { void Brain::MoveCloser(Spawn* target) {
if (target && m_body->GetFollowTarget() != target) if (target && m_body->GetFollowTarget() != target)
m_body->SetFollowTarget(target, rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat()); m_body->SetFollowTarget(target, rule_manager.GetZoneRule(m_body->GetZone() ? m_body->GetZone()->GetZoneID() : 0, R_Combat, MaxCombatRange)->GetFloat());
if (m_body->GetFollowTarget() && !m_body->following) { if (m_body->GetFollowTarget() && !m_body->following) {
m_body->CalculateRunningLocation(true); m_body->CalculateRunningLocation(true);
@ -478,7 +478,7 @@ bool Brain::CheckBuffs() {
} }
void Brain::ProcessMelee(Entity* target, float distance) { void Brain::ProcessMelee(Entity* target, float distance) {
if(distance > rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat()) if(distance > rule_manager.GetZoneRule(m_body->GetZone() ? m_body->GetZone()->GetZoneID() : 0, R_Combat, MaxCombatRange)->GetFloat())
MoveCloser((Spawn*)target); MoveCloser((Spawn*)target);
else { else {
if (target) { if (target) {
@ -581,12 +581,12 @@ bool Brain::CheckLootAllowed(Entity* entity) {
LogWrite(LOOT__INFO, 0, "Loot", "%s: CheckLootAllowed failed, looter spawn id %u does not match received %s(%u)", GetBody()->GetName(), m_body->GetLooterSpawnID(), entity->GetName(), entity->GetID()); LogWrite(LOOT__INFO, 0, "Loot", "%s: CheckLootAllowed failed, looter spawn id %u does not match received %s(%u)", GetBody()->GetName(), m_body->GetLooterSpawnID(), entity->GetName(), entity->GetID());
return false; return false;
} }
if (rule_manager.GetGlobalRule(R_Loot, AllowChestUnlockByDropTime)->GetInt8() if (rule_manager.GetZoneRule(m_body->GetZone() ? m_body->GetZone()->GetZoneID() : 0, R_Loot, AllowChestUnlockByDropTime)->GetInt8()
&& m_body->GetChestDropTime() > 0 && Timer::GetCurrentTime2() >= m_body->GetChestDropTime() + (rule_manager.GetGlobalRule(R_Loot, ChestUnlockedTimeDrop)->GetInt32() * 1000)) { && m_body->GetChestDropTime() > 0 && Timer::GetCurrentTime2() >= m_body->GetChestDropTime() + (rule_manager.GetZoneRule(m_body->GetZone() ? m_body->GetZone()->GetZoneID() : 0, R_Loot, ChestUnlockedTimeDrop)->GetInt32() * 1000)) {
return true; return true;
} }
if (rule_manager.GetGlobalRule(R_Loot, AllowChestUnlockByTrapTime)->GetInt8() if (rule_manager.GetZoneRule(m_body->GetZone() ? m_body->GetZone()->GetZoneID() : 0, R_Loot, AllowChestUnlockByTrapTime)->GetInt8()
&& m_body->GetTrapOpenedTime() > 0 && Timer::GetCurrentTime2() >= m_body->GetChestDropTime() + (rule_manager.GetGlobalRule(R_Loot, ChestUnlockedTimeTrap)->GetInt32() * 1000)) { && m_body->GetTrapOpenedTime() > 0 && Timer::GetCurrentTime2() >= m_body->GetChestDropTime() + (rule_manager.GetZoneRule(m_body->GetZone() ? m_body->GetZone()->GetZoneID() : 0, R_Loot, ChestUnlockedTimeTrap)->GetInt32() * 1000)) {
return true; return true;
} }
if ((m_body->GetLootMethod() == GroupLootMethod::METHOD_LOTTO || m_body->GetLootMethod() == GroupLootMethod::METHOD_NEED_BEFORE_GREED) && m_body->HasSpawnLootWindowCompleted(entity->GetID())) { if ((m_body->GetLootMethod() == GroupLootMethod::METHOD_LOTTO || m_body->GetLootMethod() == GroupLootMethod::METHOD_NEED_BEFORE_GREED) && m_body->HasSpawnLootWindowCompleted(entity->GetID())) {
@ -770,7 +770,7 @@ void CombatPetBrain::Think() {
float distance = GetBody()->GetDistance(target); float distance = GetBody()->GetDistance(target);
// If out of melee range then move closer // If out of melee range then move closer
if (distance > rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat()) if (distance > rule_manager.GetZoneRule(m_body->GetZone() ? m_body->GetZone()->GetZoneID() : 0, R_Combat, MaxCombatRange)->GetFloat())
MoveCloser((Spawn*)target); MoveCloser((Spawn*)target);
} }
@ -802,7 +802,7 @@ void NonCombatPetBrain::Think() {
float distance = GetBody()->GetDistance(target); float distance = GetBody()->GetDistance(target);
// If out of melee range then move closer // If out of melee range then move closer
if (distance > rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat()) if (distance > rule_manager.GetZoneRule(m_body->GetZone() ? m_body->GetZone()->GetZoneID() : 0, R_Combat, MaxCombatRange)->GetFloat())
MoveCloser((Spawn*)target); MoveCloser((Spawn*)target);
} }

View File

@ -826,13 +826,13 @@ EQ2Packet* PlayerInfo::serialize(int16 version, int16 modifyPos, int32 modifyVal
packet->setDataByName("coins_plat", info_struct->get_coin_plat());// dov confirmed packet->setDataByName("coins_plat", info_struct->get_coin_plat());// dov confirmed
Skill* skill = player->GetSkillByName("Swimming", false); Skill* skill = player->GetSkillByName("Swimming", false);
float breath_modifier = rule_manager.GetGlobalRule(R_Player, SwimmingSkillMinBreathLength)->GetFloat(); float breath_modifier = rule_manager.GetZoneRule(player->GetZone() ? player->GetZone()->GetZoneID() : 0, R_Player, SwimmingSkillMinBreathLength)->GetFloat();
if(skill) { if(skill) {
int32 max_val = 450; int32 max_val = 450;
if(skill->max_val > 0) if(skill->max_val > 0)
max_val = skill->max_val; max_val = skill->max_val;
float diff = (float)(skill->current_val + player->GetStat(ITEM_STAT_SWIMMING)) / (float)max_val; float diff = (float)(skill->current_val + player->GetStat(ITEM_STAT_SWIMMING)) / (float)max_val;
float max_breath_mod = rule_manager.GetGlobalRule(R_Player, SwimmingSkillMaxBreathLength)->GetFloat(); float max_breath_mod = rule_manager.GetZoneRule(player->GetZone() ? player->GetZone()->GetZoneID() : 0, R_Player, SwimmingSkillMaxBreathLength)->GetFloat();
float diff_mod = max_breath_mod * diff; float diff_mod = max_breath_mod * diff;
if(diff_mod > max_breath_mod) if(diff_mod > max_breath_mod)
breath_modifier = max_breath_mod; breath_modifier = max_breath_mod;
@ -6835,7 +6835,7 @@ bool Player::CanSeeInvis(Entity* target)
else if (target->IsInvis() && HasSeeInvisSpell()) else if (target->IsInvis() && HasSeeInvisSpell())
return true; return true;
sint32 radius = rule_manager.GetGlobalRule(R_PVP, InvisPlayerDiscoveryRange)->GetSInt32(); sint32 radius = rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_PVP, InvisPlayerDiscoveryRange)->GetSInt32();
if (radius == 0) // radius of 0 is always seen if (radius == 0) // radius of 0 is always seen
return true; return true;
@ -7512,7 +7512,7 @@ void Player::CalculatePlayerHPPower(int16 new_level) {
bool Player::IsAllowedCombatEquip(int8 slot, bool send_message) { bool Player::IsAllowedCombatEquip(int8 slot, bool send_message) {
bool rule_pass = true; bool rule_pass = true;
if(EngagedInCombat() && rule_manager.GetGlobalRule(R_Player, AllowPlayerEquipCombat)->GetInt8() == 0) { if(EngagedInCombat() && rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Player, AllowPlayerEquipCombat)->GetInt8() == 0) {
switch(slot) { switch(slot) {
case EQ2_PRIMARY_SLOT: case EQ2_PRIMARY_SLOT:
case EQ2_SECONDARY_SLOT: case EQ2_SECONDARY_SLOT:

View File

@ -513,17 +513,18 @@ bool RuleManager::SetZoneRuleSet(int32 zone_id, int32 rule_set_id) {
Rule * RuleManager::GetZoneRule(int32 zone_id, int32 category, int32 type) { Rule * RuleManager::GetZoneRule(int32 zone_id, int32 category, int32 type) {
Rule *ret = 0; Rule *ret = 0;
/* we never want to return null so MAKE SURE the rule exists. if this assertion fails then the server admin must fix the problem */
assert(rules.count(category) > 0);
assert(rules[category].count(type) > 0);
/* first try to get the zone rule */ /* first try to get the zone rule */
m_zone_rule_sets.readlock(__FUNCTION__, __LINE__); if(zone_id) {
if (zone_rule_sets.count(zone_id) > 0) m_zone_rule_sets.readlock(__FUNCTION__, __LINE__);
ret = zone_rule_sets[zone_id]->GetRule(category, type); if (zone_rule_sets.count(zone_id) > 0)
m_zone_rule_sets.releasereadlock(__FUNCTION__, __LINE__); ret = zone_rule_sets[zone_id]->GetRule(category, type);
m_zone_rule_sets.releasereadlock(__FUNCTION__, __LINE__);
return ret ? ret : rules[category][type]; }
if(!ret) {
ret = GetGlobalRule(category, type);
}
return ret;
} }
void RuleManager::ClearZoneRuleSets() { void RuleManager::ClearZoneRuleSets() {

View File

@ -1388,6 +1388,10 @@ ZoneServer* Spawn::GetZone(){
return zone; return zone;
} }
int32 Spawn::GetZoneID(){
return zone ? zone->GetZoneID() : 0;
}
void Spawn::SetZone(ZoneServer* in_zone, int32 version){ void Spawn::SetZone(ZoneServer* in_zone, int32 version){
zone = in_zone; zone = in_zone;
@ -2366,7 +2370,7 @@ void Spawn::InitializeInfoPacketData(Player* spawn, PacketStruct* packet) {
int8 classicFlags = 0; int8 classicFlags = 0;
// radius of 0 is always seen, -1 is never seen (unless items/spells override), larger than 0 is a defined radius to restrict visibility // radius of 0 is always seen, -1 is never seen (unless items/spells override), larger than 0 is a defined radius to restrict visibility
sint32 radius = rule_manager.GetGlobalRule(R_PVP, InvisPlayerDiscoveryRange)->GetSInt32(); sint32 radius = rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_PVP, InvisPlayerDiscoveryRange)->GetSInt32();
if (radius != 0 && (Spawn*)spawn != this && this->IsPlayer() && !spawn->CanSeeInvis((Entity*)this)) if (radius != 0 && (Spawn*)spawn != this && this->IsPlayer() && !spawn->CanSeeInvis((Entity*)this))
spawnHiddenFromClient = true; spawnHiddenFromClient = true;
@ -3097,20 +3101,20 @@ void Spawn::ProcessMovement(bool isSpawnListLocked){
float dist = GetDistance(followTarget, true); float dist = GetDistance(followTarget, true);
if ((!EngagedInCombat() && m_followDistance > 0 && dist <= m_followDistance) || if ((!EngagedInCombat() && m_followDistance > 0 && dist <= m_followDistance) ||
(dist <= rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat())) { (dist <= rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Combat, MaxCombatRange)->GetFloat())) {
ClearRunningLocations(); ClearRunningLocations();
CalculateRunningLocation(true); CalculateRunningLocation(true);
} }
else if (loc) { else if (loc) {
float distance = GetDistance(followTarget, loc->x, loc->y, loc->z); float distance = GetDistance(followTarget, loc->x, loc->y, loc->z);
if ( (!EngagedInCombat() && m_followDistance > 0 && distance > m_followDistance) || if ( (!EngagedInCombat() && m_followDistance > 0 && distance > m_followDistance) ||
( EngagedInCombat() && distance > rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat())) { ( EngagedInCombat() && distance > rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Combat, MaxCombatRange)->GetFloat())) {
MoveToLocation(followTarget, rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat(), true, loc->mapped); MoveToLocation(followTarget, rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Combat, MaxCombatRange)->GetFloat(), true, loc->mapped);
CalculateRunningLocation(); CalculateRunningLocation();
} }
} }
else { else {
MoveToLocation(followTarget, rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat(), false); MoveToLocation(followTarget, rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Combat, MaxCombatRange)->GetFloat(), false);
CalculateRunningLocation(); CalculateRunningLocation();
} }
} }
@ -3374,7 +3378,7 @@ void Spawn::RunToLocation(float x, float y, float z, float following_x, float fo
return; return;
} }
if(!IsWidget() && (!EngagedInCombat() || GetDistance(GetTarget()) > rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat())) if(!IsWidget() && (!EngagedInCombat() || GetDistance(GetTarget()) > rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Combat, MaxCombatRange)->GetFloat()))
FaceTarget(x, z); FaceTarget(x, z);
SetPos(&appearance.pos.X2, x, false); SetPos(&appearance.pos.X2, x, false);
SetPos(&appearance.pos.Z2, z, false); SetPos(&appearance.pos.Z2, z, false);
@ -3665,7 +3669,7 @@ void Spawn::CalculateRunningLocation(bool stop){
if (continueElseIf && GetZone() && GetTarget() != NULL && EngagedInCombat()) if (continueElseIf && GetZone() && GetTarget() != NULL && EngagedInCombat())
{ {
if (GetDistance(GetTarget()) > rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat()) if (GetDistance(GetTarget()) > rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Combat, MaxCombatRange)->GetFloat())
{ {
if ((IsFlyingCreature() || IsWaterCreature() || InWater()) && CheckLoS(GetTarget())) if ((IsFlyingCreature() || IsWaterCreature() || InWater()) && CheckLoS(GetTarget()))
AddRunningLocation(GetTarget()->GetX(), GetTarget()->GetY(), GetTarget()->GetZ(), GetSpeed(), 0, false); AddRunningLocation(GetTarget()->GetX(), GetTarget()->GetY(), GetTarget()->GetZ(), GetSpeed(), 0, false);
@ -3953,7 +3957,7 @@ void Spawn::CheckEncounterState(Entity* victim, bool test_auto_lock) {
attacker->GetInfoStruct()->set_engaged_encounter(1); attacker->GetInfoStruct()->set_engaged_encounter(1);
} }
int8 skip_loot_gray_mob_flag = rule_manager.GetGlobalRule(R_Loot, SkipLootGrayMob)->GetInt8(); int8 skip_loot_gray_mob_flag = rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Loot, SkipLootGrayMob)->GetInt8();
int8 difficulty = attacker->GetArrowColor(victim->GetLevel()); int8 difficulty = attacker->GetArrowColor(victim->GetLevel());
@ -4751,7 +4755,7 @@ bool Spawn::IsWaterCreature()
void Spawn::SetFlyingCreature() { void Spawn::SetFlyingCreature() {
if(!IsEntity() || !rule_manager.GetGlobalRule(R_Spawn, UseHardCodeFlyingModelType)->GetInt8()) if(!IsEntity() || !rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Spawn, UseHardCodeFlyingModelType)->GetInt8())
return; return;
if(((Entity*)this)->GetInfoStruct()->get_flying_type() > 0) // DB spawn npc flag already set if(((Entity*)this)->GetInfoStruct()->get_flying_type() > 0) // DB spawn npc flag already set
@ -4771,7 +4775,7 @@ void Spawn::SetFlyingCreature() {
} }
void Spawn::SetWaterCreature() { void Spawn::SetWaterCreature() {
if(!IsEntity() || !rule_manager.GetGlobalRule(R_Spawn, UseHardCodeWaterModelType)->GetInt8()) if(!IsEntity() || !rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Spawn, UseHardCodeWaterModelType)->GetInt8())
return; return;
if(((Entity*)this)->GetInfoStruct()->get_water_type() > 0) // DB spawn npc flag already set if(((Entity*)this)->GetInfoStruct()->get_water_type() > 0) // DB spawn npc flag already set
@ -5049,13 +5053,13 @@ bool Spawn::HasLootWindowCompleted() {
void Spawn::StartLootTimer(Spawn* looter) { void Spawn::StartLootTimer(Spawn* looter) {
if (!IsLootTimerRunning()) { if (!IsLootTimerRunning()) {
int32 loot_timer_time = rule_manager.GetGlobalRule(R_Loot, LootDistributionTime)->GetInt32() * 1000; int32 loot_timer_time = rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Loot, LootDistributionTime)->GetInt32() * 1000;
if(rule_manager.GetGlobalRule(R_Loot, AllowChestUnlockByDropTime)->GetBool() && loot_timer_time > rule_manager.GetGlobalRule(R_Loot, ChestUnlockedTimeDrop)->GetInt32()*1000) { if(rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Loot, AllowChestUnlockByDropTime)->GetBool() && loot_timer_time > rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Loot, ChestUnlockedTimeDrop)->GetInt32()*1000) {
loot_timer_time = (rule_manager.GetGlobalRule(R_Loot, ChestUnlockedTimeDrop)->GetInt32()*1000) / 2; loot_timer_time = (rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Loot, ChestUnlockedTimeDrop)->GetInt32()*1000) / 2;
} }
if(rule_manager.GetGlobalRule(R_Loot, AllowChestUnlockByTrapTime)->GetBool() && loot_timer_time > rule_manager.GetGlobalRule(R_Loot, ChestUnlockedTimeTrap)->GetInt32()*1000) { if(rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Loot, AllowChestUnlockByTrapTime)->GetBool() && loot_timer_time > rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Loot, ChestUnlockedTimeTrap)->GetInt32()*1000) {
loot_timer_time = (rule_manager.GetGlobalRule(R_Loot, ChestUnlockedTimeTrap)->GetInt32()*1000) / 2; loot_timer_time = (rule_manager.GetZoneRule(GetZone() ? GetZone()->GetZoneID() : 0, R_Loot, ChestUnlockedTimeTrap)->GetInt32()*1000) / 2;
} }
if(loot_timer_time < 1000) { if(loot_timer_time < 1000) {

View File

@ -1047,6 +1047,7 @@ public:
void SetLastAttacker(Spawn* spawn); void SetLastAttacker(Spawn* spawn);
bool TakeDamage(int32 damage); bool TakeDamage(int32 damage);
ZoneServer* GetZone(); ZoneServer* GetZone();
int32 GetZoneID();
virtual void SetZone(ZoneServer* in_zone, int32 version=0); virtual void SetZone(ZoneServer* in_zone, int32 version=0);
void SetFactionID(int32 val) { faction_id = val; } void SetFactionID(int32 val) { faction_id = val; }
int32 GetFactionID(){ int32 GetFactionID(){

View File

@ -743,7 +743,7 @@ void SpellProcess::SendFinishedCast(LuaSpell* spell, Client* client){
Spawn* target = client->GetPlayer()->GetZone()->GetSpawnByID(spell->initial_target); Spawn* target = client->GetPlayer()->GetZone()->GetSpawnByID(spell->initial_target);
if(target) { if(target) {
float distance = client->GetPlayer()->GetDistance(target); float distance = client->GetPlayer()->GetDistance(target);
if(distance <= rule_manager.GetGlobalRule(R_Combat, MaxCombatRange)->GetFloat()) { if(distance <= rule_manager.GetZoneRule(client->GetCurrentZoneID(), R_Combat, MaxCombatRange)->GetFloat()) {
client->GetPlayer()->InCombat(true, false); client->GetPlayer()->InCombat(true, false);
client->GetPlayer()->SetRangeAttack(false); client->GetPlayer()->SetRangeAttack(false);
} }

View File

@ -581,7 +581,7 @@ void ZoneList::Remove(ZoneServer* zone) {
MZoneList.releasewritelock(__FUNCTION__, __LINE__); MZoneList.releasewritelock(__FUNCTION__, __LINE__);
ZoneServer* alternativeZone = Get(zoneName, false, false); ZoneServer* alternativeZone = Get(zoneName, false, false);
if(!alternativeZone && !rule_manager.GetGlobalRule(R_World, MemoryCacheZoneMaps)->GetBool()) { if(!alternativeZone && !rule_manager.GetZoneRule(zone->GetZoneID(), R_World, MemoryCacheZoneMaps)->GetBool()) {
world.RemoveMaps(std::string(zoneName)); world.RemoveMaps(std::string(zoneName));
} }
} }

View File

@ -684,7 +684,7 @@ void Client::HandlePlayerRevive(int32 point_id)
safe_delete(packet); safe_delete(packet);
} }
if(rule_manager.GetGlobalRule(R_Combat, EnableSpiritShards)->GetBool()) if(rule_manager.GetZoneRule(GetCurrentZoneID(), R_Combat, EnableSpiritShards)->GetBool())
{ {
NPC* shard = player->InstantiateSpiritShard(origX, origY, origZ, origHeading, origGridID, originalZone); NPC* shard = player->InstantiateSpiritShard(origX, origY, origZ, origHeading, origGridID, originalZone);
@ -841,7 +841,7 @@ void Client::SendCharInfo() {
} }
//Allow this player to change their last name if they meet the level requirement //Allow this player to change their last name if they meet the level requirement
if (!player->get_character_flag(CF_ENABLE_CHANGE_LASTNAME) && player->GetLevel() >= rule_manager.GetGlobalRule(R_Player, MinLastNameLevel)->GetInt8()) if (!player->get_character_flag(CF_ENABLE_CHANGE_LASTNAME) && player->GetLevel() >= rule_manager.GetZoneRule(GetCurrentZoneID(), R_Player, MinLastNameLevel)->GetInt8())
player->set_character_flag(CF_ENABLE_CHANGE_LASTNAME); player->set_character_flag(CF_ENABLE_CHANGE_LASTNAME);
safe_delete(items); safe_delete(items);
@ -1229,9 +1229,9 @@ bool Client::HandlePacket(EQApplicationPacket* app) {
if (!camp_timer) { if (!camp_timer) {
int16 camp_time = 20; // default if rule cannot be found int16 camp_time = 20; // default if rule cannot be found
if (GetAdminStatus() >= 100) if (GetAdminStatus() >= 100)
camp_time = rule_manager.GetGlobalRule(R_World, GMCampTimer)->GetInt16(); camp_time = rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, GMCampTimer)->GetInt16();
else else
camp_time = rule_manager.GetGlobalRule(R_World, PlayerCampTimer)->GetInt16(); camp_time = rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, PlayerCampTimer)->GetInt16();
PacketStruct* response = configReader.getStruct("WS_Camp", GetVersion()); PacketStruct* response = configReader.getStruct("WS_Camp", GetVersion());
if (response) { if (response) {
@ -2337,7 +2337,7 @@ bool Client::HandlePacket(EQApplicationPacket* app) {
HouseZone* hz = world.GetHouseZone(house_id); HouseZone* hz = world.GetHouseZone(house_id);
if (hz) { if (hz) {
bool got_bank_money = BankHasCoin(hz->cost_coin); bool got_bank_money = BankHasCoin(hz->cost_coin);
int8 disable_alignment_req = rule_manager.GetGlobalRule(R_Player, DisableHouseAlignmentRequirement)->GetInt8(); int8 disable_alignment_req = rule_manager.GetZoneRule(GetCurrentZoneID(), R_Player, DisableHouseAlignmentRequirement)->GetInt8();
std::vector<PlayerHouse*> houses = world.GetAllPlayerHouses(GetCharacterID()); std::vector<PlayerHouse*> houses = world.GetAllPlayerHouses(GetCharacterID());
if (houses.size() > 24) if (houses.size() > 24)
{ {
@ -3721,7 +3721,7 @@ bool Client::Process(bool zone_process) {
LogWrite(CCLIENT__DEBUG, 1, "Client", "%s, ProcessQuestUpdates", __FUNCTION__, __LINE__); LogWrite(CCLIENT__DEBUG, 1, "Client", "%s, ProcessQuestUpdates", __FUNCTION__, __LINE__);
ProcessQuestUpdates(); ProcessQuestUpdates();
} }
int32 queue_timer_delay = rule_manager.GetGlobalRule(R_Client, QuestQueueTimer)->GetInt32(); int32 queue_timer_delay = rule_manager.GetZoneRule(GetCurrentZoneID(), R_Client, QuestQueueTimer)->GetInt32();
if(queue_timer_delay < 10) { if(queue_timer_delay < 10) {
queue_timer_delay = 10; queue_timer_delay = 10;
} }
@ -3770,12 +3770,12 @@ bool Client::Process(bool zone_process) {
enabled_player_pos_timer = true; enabled_player_pos_timer = true;
if(!underworld_cooldown_timer.Enabled() || (underworld_cooldown_timer.Enabled() && underworld_cooldown_timer.Check())) { if(!underworld_cooldown_timer.Enabled() || (underworld_cooldown_timer.Enabled() && underworld_cooldown_timer.Check())) {
bool underworld = false; bool underworld = false;
if(rule_manager.GetGlobalRule(R_Zone, UseMapUnderworldCoords)->GetBool()) { if(rule_manager.GetZoneRule(GetCurrentZoneID(), R_Zone, UseMapUnderworldCoords)->GetBool()) {
if(GetCurrentZone()->GetUnderWorld() != -1000000.0f) { if(GetCurrentZone()->GetUnderWorld() != -1000000.0f) {
if(GetPlayer()->GetY() < GetCurrentZone()->GetUnderWorld()) if(GetPlayer()->GetY() < GetCurrentZone()->GetUnderWorld())
underworld = true; underworld = true;
} }
else if(GetPlayer()->GetMap() && GetPlayer()->GetMap()->GetMinY() != 9999999.0f && GetPlayer()->GetY() < (GetPlayer()->GetMap()->GetMinY() + rule_manager.GetGlobalRule(R_Zone, MapUnderworldCoordOffset)->GetFloat())) { else if(GetPlayer()->GetMap() && GetPlayer()->GetMap()->GetMinY() != 9999999.0f && GetPlayer()->GetY() < (GetPlayer()->GetMap()->GetMinY() + rule_manager.GetZoneRule(GetCurrentZoneID(), R_Zone, MapUnderworldCoordOffset)->GetFloat())) {
underworld = true; underworld = true;
} }
} }
@ -4113,6 +4113,10 @@ ZoneServer* Client::GetCurrentZone() {
return current_zone; return current_zone;
} }
int32 Client::GetCurrentZoneID() {
return current_zone ? current_zone->GetZoneID() : 0;
}
int8 Client::GetMessageChannelColor(int8 channel_type) { int8 Client::GetMessageChannelColor(int8 channel_type) {
if (GetVersion() >= 973 && GetVersion() <= 1000) { if (GetVersion() >= 973 && GetVersion() <= 1000) {
if (channel_type == CHANNEL_LOOT) if (channel_type == CHANNEL_LOOT)
@ -4672,7 +4676,7 @@ bool Client::TryZoneInstance(int32 zoneID, bool zone_coords_valid) {
instance_zone = zone_list.GetByLowestPopulation(zoneID); instance_zone = zone_list.GetByLowestPopulation(zoneID);
if (instance_zone) { if (instance_zone) {
// Check the current population against the max population, if greater or equal start a new version // Check the current population against the max population, if greater or equal start a new version
if (instance_zone->GetClientCount() >= rule_manager.GetGlobalRule(R_Zone, MaxPlayers)->GetInt32()) if (instance_zone->GetClientCount() >= rule_manager.GetZoneRule(GetCurrentZoneID(), R_Zone, MaxPlayers)->GetInt32())
instance_zone = zone_list.GetByInstanceID(0, zoneID); instance_zone = zone_list.GetByInstanceID(0, zoneID);
} }
else else
@ -4804,7 +4808,7 @@ bool Client::CheckZoneAccess(const char* zoneName) {
LogWrite(CCLIENT__DEBUG, 0, "Client", "Access Requirements: status %i, level %i - %i, req >= %i version", zoneMinStatus, zoneMinLevel, zoneMaxLevel, zoneMinVersion); LogWrite(CCLIENT__DEBUG, 0, "Client", "Access Requirements: status %i, level %i - %i, req >= %i version", zoneMinStatus, zoneMinLevel, zoneMaxLevel, zoneMinVersion);
// use ZoneLevelOverrideStatus in both min_level and max_level checks // use ZoneLevelOverrideStatus in both min_level and max_level checks
sint16 ZoneLevelOverrideStatus = rule_manager.GetGlobalRule(R_Zone, MinZoneLevelOverrideStatus)->GetSInt16(); sint16 ZoneLevelOverrideStatus = rule_manager.GetZoneRule(GetCurrentZoneID(), R_Zone, MinZoneLevelOverrideStatus)->GetSInt16();
if ((zoneMinVersion > 0) && (GetVersion() < zoneMinVersion)) if ((zoneMinVersion > 0) && (GetVersion() < zoneMinVersion))
{ {
@ -4839,7 +4843,7 @@ bool Client::CheckZoneAccess(const char* zoneName) {
{ {
LogWrite(CCLIENT__DEBUG, 0, "Client", "Zone MinStatus of %i challenge...", zoneMinStatus); LogWrite(CCLIENT__DEBUG, 0, "Client", "Zone MinStatus of %i challenge...", zoneMinStatus);
sint16 ZoneAccessOverrideStatus = rule_manager.GetGlobalRule(R_Zone, MinZoneAccessOverrideStatus)->GetSInt16(); sint16 ZoneAccessOverrideStatus = rule_manager.GetZoneRule(GetCurrentZoneID(), R_Zone, MinZoneAccessOverrideStatus)->GetSInt16();
if (ZoneAccessOverrideStatus && ZoneAccessOverrideStatus > GetAdminStatus()) if (ZoneAccessOverrideStatus && ZoneAccessOverrideStatus > GetAdminStatus())
{ {
LogWrite(CCLIENT__DEBUG, 0, "Client", "Player denied access to zone '%s' (status req: %i)", zoneName, GetAdminStatus()); LogWrite(CCLIENT__DEBUG, 0, "Client", "Player denied access to zone '%s' (status req: %i)", zoneName, GetAdminStatus());
@ -5263,7 +5267,7 @@ void Client::ChangeLevel(int16 old_level, int16 new_level) {
safe_delete(command_packet); safe_delete(command_packet);
} }
if (!player->get_character_flag(CF_ENABLE_CHANGE_LASTNAME) && new_level >= rule_manager.GetGlobalRule(R_Player, MinLastNameLevel)->GetInt8()) if (!player->get_character_flag(CF_ENABLE_CHANGE_LASTNAME) && new_level >= rule_manager.GetZoneRule(GetCurrentZoneID(), R_Player, MinLastNameLevel)->GetInt8())
player->set_character_flag(CF_ENABLE_CHANGE_LASTNAME); player->set_character_flag(CF_ENABLE_CHANGE_LASTNAME);
SendNewAdventureSpells(); SendNewAdventureSpells();
@ -5303,7 +5307,7 @@ void Client::ChangeLevel(int16 old_level, int16 new_level) {
player_skills->SetSkillCapsByType(SKILL_TYPE_ARMOR, new_skill_cap); player_skills->SetSkillCapsByType(SKILL_TYPE_ARMOR, new_skill_cap);
player_skills->SetSkillCapsByType(SKILL_TYPE_SHIELD, new_skill_cap); player_skills->SetSkillCapsByType(SKILL_TYPE_SHIELD, new_skill_cap);
if(rule_manager.GetGlobalRule(R_Player, AutoSkillUpBaseSkills)->GetBool()) { if(rule_manager.GetZoneRule(GetCurrentZoneID(), R_Player, AutoSkillUpBaseSkills)->GetBool()) {
//SKILL_TYPE_ARMOR/SKILL_TYPE_SHIELD always has the same current / max values //SKILL_TYPE_ARMOR/SKILL_TYPE_SHIELD always has the same current / max values
player_skills->SetSkillValuesByType(SKILL_TYPE_ARMOR, new_skill_cap, false); player_skills->SetSkillValuesByType(SKILL_TYPE_ARMOR, new_skill_cap, false);
player_skills->SetSkillValuesByType(SKILL_TYPE_SHIELD, new_skill_cap, false); player_skills->SetSkillValuesByType(SKILL_TYPE_SHIELD, new_skill_cap, false);
@ -5312,7 +5316,7 @@ void Client::ChangeLevel(int16 old_level, int16 new_level) {
player_skills->SetSkillCapsByType(SKILL_TYPE_CLASS, new_skill_cap); player_skills->SetSkillCapsByType(SKILL_TYPE_CLASS, new_skill_cap);
player_skills->SetSkillCapsByType(SKILL_TYPE_WEAPON, new_skill_cap); player_skills->SetSkillCapsByType(SKILL_TYPE_WEAPON, new_skill_cap);
if(rule_manager.GetGlobalRule(R_Player, AutoSkillUpBaseSkills)->GetBool()) { if(rule_manager.GetZoneRule(GetCurrentZoneID(), R_Player, AutoSkillUpBaseSkills)->GetBool()) {
//SKILL_TYPE_CLASS/SKILL_TYPE_WEAPON always has the same current/max values //SKILL_TYPE_CLASS/SKILL_TYPE_WEAPON always has the same current/max values
player_skills->SetSkillValuesByType(SKILL_TYPE_CLASS, new_skill_cap, false); player_skills->SetSkillValuesByType(SKILL_TYPE_CLASS, new_skill_cap, false);
player_skills->SetSkillValuesByType(SKILL_TYPE_WEAPON, new_skill_cap, false); player_skills->SetSkillValuesByType(SKILL_TYPE_WEAPON, new_skill_cap, false);
@ -6045,7 +6049,7 @@ void Client::OpenChest(Spawn* entity, bool attemptDisarm)
if (disarmSkill->CheckDisarmSkill(entity->GetLevel(), chest_difficulty) < 1) if (disarmSkill->CheckDisarmSkill(entity->GetLevel(), chest_difficulty) < 1)
{ {
CastGroupOrSelf(entity && entity->IsEntity() ? (Entity*)entity : 0, nextTrap.spell_id, nextTrap.spell_tier, CastGroupOrSelf(entity && entity->IsEntity() ? (Entity*)entity : 0, nextTrap.spell_id, nextTrap.spell_tier,
rule_manager.GetGlobalRule(R_Loot, ChestTriggerRadiusGroup)->GetFloat()); rule_manager.GetZoneRule(GetCurrentZoneID(), R_Loot, ChestTriggerRadiusGroup)->GetFloat());
Message(CHANNEL_NARRATIVE, "You trigger the trap on %s!", modelName.c_str()); Message(CHANNEL_NARRATIVE, "You trigger the trap on %s!", modelName.c_str());
} }
else else
@ -6059,7 +6063,7 @@ void Client::OpenChest(Spawn* entity, bool attemptDisarm)
else // no disarm skill, always fail else // no disarm skill, always fail
{ {
CastGroupOrSelf(entity && entity->IsEntity() ? (Entity*)entity : 0, nextTrap.spell_id, nextTrap.spell_tier, CastGroupOrSelf(entity && entity->IsEntity() ? (Entity*)entity : 0, nextTrap.spell_id, nextTrap.spell_tier,
rule_manager.GetGlobalRule(R_Loot, ChestTriggerRadiusGroup)->GetFloat()); rule_manager.GetZoneRule(GetCurrentZoneID(), R_Loot, ChestTriggerRadiusGroup)->GetFloat());
Message(CHANNEL_NARRATIVE, "You trigger the trap on %s!", modelName.c_str()); Message(CHANNEL_NARRATIVE, "You trigger the trap on %s!", modelName.c_str());
} }
} }
@ -8491,7 +8495,7 @@ void Client::SendBuyMerchantList(bool sell) {
else else
tmp_level = item->generic_info.tradeskill_default_level; tmp_level = item->generic_info.tradeskill_default_level;
packet->setArrayDataByName("level", tmp_level, i); packet->setArrayDataByName("level", tmp_level, i);
if(rule_manager.GetGlobalRule(R_World, DisplayItemTiers)->GetBool()) { if(rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, DisplayItemTiers)->GetBool()) {
packet->setArrayDataByName("tier", item->details.tier, i); packet->setArrayDataByName("tier", item->details.tier, i);
} }
packet->setArrayDataByName("item_id2", item->details.item_id, i); packet->setArrayDataByName("item_id2", item->details.item_id, i);
@ -8687,7 +8691,7 @@ void Client::SendSellMerchantList(bool sell) {
tmp_level = item->generic_info.tradeskill_default_level; tmp_level = item->generic_info.tradeskill_default_level;
packet->setArrayDataByName("level", item->details.recommended_level, i); packet->setArrayDataByName("level", item->details.recommended_level, i);
if(rule_manager.GetGlobalRule(R_World, DisplayItemTiers)->GetBool()) { if(rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, DisplayItemTiers)->GetBool()) {
packet->setArrayDataByName("tier", item->details.tier, i); packet->setArrayDataByName("tier", item->details.tier, i);
} }
packet->setArrayDataByName("item_id2", item->details.item_id, i); packet->setArrayDataByName("item_id2", item->details.item_id, i);
@ -8769,7 +8773,7 @@ void Client::SendBuyBackList(bool sell) {
else else
tmp_level = master_item->generic_info.tradeskill_default_level; tmp_level = master_item->generic_info.tradeskill_default_level;
packet->setArrayDataByName("level", tmp_level, i); packet->setArrayDataByName("level", tmp_level, i);
if(rule_manager.GetGlobalRule(R_World, DisplayItemTiers)->GetBool()) { if(rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, DisplayItemTiers)->GetBool()) {
packet->setArrayDataByName("tier", master_item->details.tier, i); packet->setArrayDataByName("tier", master_item->details.tier, i);
} }
packet->setArrayDataByName("item_id2", master_item->details.item_id, i); packet->setArrayDataByName("item_id2", master_item->details.item_id, i);
@ -8841,7 +8845,7 @@ void Client::SendRepairList() {
packet->setArrayDataByName("level", tmp_level, i);*/ packet->setArrayDataByName("level", tmp_level, i);*/
packet->setArrayDataByName("level", item->generic_info.adventure_default_level, i); packet->setArrayDataByName("level", item->generic_info.adventure_default_level, i);
if(rule_manager.GetGlobalRule(R_World, DisplayItemTiers)->GetBool()) { if(rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, DisplayItemTiers)->GetBool()) {
packet->setArrayDataByName("tier", item->details.tier, i); packet->setArrayDataByName("tier", item->details.tier, i);
} }
packet->setArrayDataByName("item_id2", item->details.item_id, i); packet->setArrayDataByName("item_id2", item->details.item_id, i);
@ -8892,7 +8896,7 @@ void Client::ShowLottoWindow() {
Spawn* spawn = GetMerchantTransaction(); Spawn* spawn = GetMerchantTransaction();
if (spawn) { if (spawn) {
int32 item_id = rule_manager.GetGlobalRule(R_World, GamblingTokenItemID)->GetInt32(); int32 item_id = rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, GamblingTokenItemID)->GetInt32();
if (!item_id) if (!item_id)
{ {
LogWrite(WORLD__ERROR, 0, "World", "No GamblingTokenItemID rule set!"); LogWrite(WORLD__ERROR, 0, "World", "No GamblingTokenItemID rule set!");
@ -8927,7 +8931,7 @@ void Client::ShowLottoWindow() {
packet->setArrayDataByName("icon", item->GetIcon(GetVersion())); packet->setArrayDataByName("icon", item->GetIcon(GetVersion()));
packet->setArrayDataByName("level", item->generic_info.adventure_default_level); packet->setArrayDataByName("level", item->generic_info.adventure_default_level);
if(rule_manager.GetGlobalRule(R_World, DisplayItemTiers)->GetBool()) { if(rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, DisplayItemTiers)->GetBool()) {
packet->setArrayDataByName("tier", item->details.tier); packet->setArrayDataByName("tier", item->details.tier);
} }
packet->setArrayDataByName("item_id2", item->details.item_id); packet->setArrayDataByName("item_id2", item->details.item_id);
@ -10246,7 +10250,7 @@ void Client::BeginWaypoint(const char* waypoint_name, float x, float y, float z)
void Client::InspectPlayer(Player* player_to_inspect) { void Client::InspectPlayer(Player* player_to_inspect) {
int source_pvp_alignment = GetPlayer()->GetPVPAlignment(); int source_pvp_alignment = GetPlayer()->GetPVPAlignment();
int target_pvp_alignment = player_to_inspect->GetPVPAlignment(); int target_pvp_alignment = player_to_inspect->GetPVPAlignment();
bool pvp_allowed = rule_manager.GetGlobalRule(R_PVP, AllowPVP)->GetBool(); bool pvp_allowed = rule_manager.GetZoneRule(GetCurrentZoneID(), R_PVP, AllowPVP)->GetBool();
if(pvp_allowed == true){ if(pvp_allowed == true){
if(source_pvp_alignment != target_pvp_alignment){ if(source_pvp_alignment != target_pvp_alignment){
@ -11317,16 +11321,16 @@ void Client::SavePlayerImages() {
LogWrite(CCLIENT__DEBUG, 0, "Client", "Saving %s image for player %s (%u)", (incoming_paperdoll.image_type == PAPERDOLL_TYPE_FULL ? "paperdoll" : "headshot"), GetPlayer()->GetName(), GetCharacterID()); LogWrite(CCLIENT__DEBUG, 0, "Client", "Saving %s image for player %s (%u)", (incoming_paperdoll.image_type == PAPERDOLL_TYPE_FULL ? "paperdoll" : "headshot"), GetPlayer()->GetName(), GetCharacterID());
// Save the paperdoll image if the server allows it // Save the paperdoll image if the server allows it
if (incoming_paperdoll.image_type == PAPERDOLL_TYPE_FULL && rule_manager.GetGlobalRule(R_World, SavePaperdollImage)->GetBool()) if (incoming_paperdoll.image_type == PAPERDOLL_TYPE_FULL && rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, SavePaperdollImage)->GetBool())
database.SaveCharacterPicture(GetCharacterID(), incoming_paperdoll.image_type, incoming_paperdoll.image_bytes, incoming_paperdoll.current_size_bytes); database.SaveCharacterPicture(GetCharacterID(), incoming_paperdoll.image_type, incoming_paperdoll.image_bytes, incoming_paperdoll.current_size_bytes);
if (incoming_paperdoll.image_type == PAPERDOLL_TYPE_HEAD) { if (incoming_paperdoll.image_type == PAPERDOLL_TYPE_HEAD) {
// Save the head shot if the server allows it // Save the head shot if the server allows it
if (rule_manager.GetGlobalRule(R_World, SaveHeadshotImage)->GetBool()) if (rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, SaveHeadshotImage)->GetBool())
database.SaveCharacterPicture(GetCharacterID(), incoming_paperdoll.image_type, incoming_paperdoll.image_bytes, incoming_paperdoll.current_size_bytes); database.SaveCharacterPicture(GetCharacterID(), incoming_paperdoll.image_type, incoming_paperdoll.image_bytes, incoming_paperdoll.current_size_bytes);
// Send the head shot to the login server // Send the head shot to the login server
if (rule_manager.GetGlobalRule(R_World, SendPaperdollImagesToLogin)->GetBool()) { if (rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, SendPaperdollImagesToLogin)->GetBool()) {
int32 size = incoming_paperdoll.current_size_bytes + CHARPICSTRUCT_MINSIZE; int32 size = incoming_paperdoll.current_size_bytes + CHARPICSTRUCT_MINSIZE;
ServerPacket* packet = new ServerPacket(ServerOP_CharacterPicture, size); ServerPacket* packet = new ServerPacket(ServerOP_CharacterPicture, size);
memset(packet->pBuffer, 0, size); memset(packet->pBuffer, 0, size);
@ -11450,7 +11454,7 @@ bool Client::HandleNewLogin(int32 account_id, int32 access_code)
GetPlayer()->vis_changed = false; GetPlayer()->vis_changed = false;
GetPlayer()->info_changed = false; GetPlayer()->info_changed = false;
bool pvp_allowed = rule_manager.GetGlobalRule(R_PVP, AllowPVP)->GetBool(); bool pvp_allowed = rule_manager.GetZoneRule(GetCurrentZoneID(), R_PVP, AllowPVP)->GetBool();
if (pvp_allowed) if (pvp_allowed)
this->GetPlayer()->SetAttackable(1); this->GetPlayer()->SetAttackable(1);
MDeletePlayer.writelock(__FUNCTION__, __LINE__); MDeletePlayer.writelock(__FUNCTION__, __LINE__);
@ -12360,7 +12364,7 @@ void Client::AwardCoins(int64 total_coins, std::string reason)
void Client::TriggerSpellSave() void Client::TriggerSpellSave()
{ {
int32 interval = rule_manager.GetGlobalRule(R_Spells, PlayerSpellSaveStateWaitInterval)->GetInt32(); int32 interval = rule_manager.GetZoneRule(GetCurrentZoneID(), R_Spells, PlayerSpellSaveStateWaitInterval)->GetInt32();
// default to not have some bogus value in the rule // default to not have some bogus value in the rule
if(interval < 1) if(interval < 1)
interval = 100; interval = 100;
@ -12376,7 +12380,7 @@ void Client::TriggerSpellSave()
int32 elapsed_time = save_spell_state_timer.GetElapsedTime(); int32 elapsed_time = save_spell_state_timer.GetElapsedTime();
save_spell_state_time_bucket += elapsed_time; save_spell_state_time_bucket += elapsed_time;
int32 save_wait_cap = rule_manager.GetGlobalRule(R_Spells, PlayerSpellSaveStateCap)->GetInt32(); int32 save_wait_cap = rule_manager.GetZoneRule(GetCurrentZoneID(), R_Spells, PlayerSpellSaveStateCap)->GetInt32();
// default to not have some bogus value in the rule // default to not have some bogus value in the rule
if(save_wait_cap < interval) if(save_wait_cap < interval)
@ -12739,7 +12743,7 @@ bool Client::CheckConsumptionAllowed(int16 slot, bool send_message) {
void Client::StartLinkdeadTimer() { void Client::StartLinkdeadTimer() {
if(!linkdead_timer) { if(!linkdead_timer) {
int32 LD_Timer = rule_manager.GetGlobalRule(R_World, LinkDeadTimer)->GetInt32(); int32 LD_Timer = rule_manager.GetZoneRule(GetCurrentZoneID(), R_World, LinkDeadTimer)->GetInt32();
LogWrite(CCLIENT__DEBUG, 0, "Client", "Starting linkdead timer for %s (timer %u seconds)", GetPlayer()->GetName(), (LD_Timer/1000)); LogWrite(CCLIENT__DEBUG, 0, "Client", "Starting linkdead timer for %s (timer %u seconds)", GetPlayer()->GetName(), (LD_Timer/1000));
linkdead_timer = new Timer(LD_Timer); linkdead_timer = new Timer(LD_Timer);
linkdead_timer->Enable(); linkdead_timer->Enable();

View File

@ -222,6 +222,7 @@ public:
bool CheckZoneAccess(const char* zoneName); bool CheckZoneAccess(const char* zoneName);
ZoneServer* GetCurrentZone(); ZoneServer* GetCurrentZone();
int32 GetCurrentZoneID();
void SetCurrentZoneByInstanceID(int32 id, int32 zoneid); void SetCurrentZoneByInstanceID(int32 id, int32 zoneid);
//void SetCurrentZoneByInstanceID(instanceid, zoneid); //void SetCurrentZoneByInstanceID(instanceid, zoneid);
void SetCurrentZone(int32 id); void SetCurrentZone(int32 id);

View File

@ -378,12 +378,12 @@ void ZoneServer::CancelThreads() {
void ZoneServer::InitWeather() void ZoneServer::InitWeather()
{ {
weather_enabled = rule_manager.GetGlobalRule(R_Zone, WeatherEnabled)->GetBool(); weather_enabled = rule_manager.GetZoneRule(GetZoneID(), R_Zone, WeatherEnabled)->GetBool();
if( weather_enabled && isWeatherAllowed()) if( weather_enabled && isWeatherAllowed())
{ {
string tmp; string tmp;
// set up weather system when zone starts up // set up weather system when zone starts up
weather_type = rule_manager.GetGlobalRule(R_Zone, WeatherType)->GetInt8(); weather_type = rule_manager.GetZoneRule(GetZoneID(), R_Zone, WeatherType)->GetInt8();
switch(weather_type) switch(weather_type)
{ {
case 3: tmp = "Chaotic"; break; case 3: tmp = "Chaotic"; break;
@ -393,14 +393,14 @@ void ZoneServer::InitWeather()
} }
LogWrite(ZONE__DEBUG, 0, "Zone", "%s: Setting up '%s' weather", zone_name, tmp.c_str()); LogWrite(ZONE__DEBUG, 0, "Zone", "%s: Setting up '%s' weather", zone_name, tmp.c_str());
weather_frequency = rule_manager.GetGlobalRule(R_Zone, WeatherChangeFrequency)->GetInt32(); weather_frequency = rule_manager.GetZoneRule(GetZoneID(), R_Zone, WeatherChangeFrequency)->GetInt32();
LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Change weather every %u seconds", zone_name, weather_frequency); LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Change weather every %u seconds", zone_name, weather_frequency);
weather_change_chance = rule_manager.GetGlobalRule(R_Zone, WeatherChangeChance)->GetInt8(); weather_change_chance = rule_manager.GetZoneRule(GetZoneID(), R_Zone, WeatherChangeChance)->GetInt8();
LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Chance of weather change: %i%%", zone_name, weather_change_chance); LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Chance of weather change: %i%%", zone_name, weather_change_chance);
weather_min_severity = rule_manager.GetGlobalRule(R_Zone, MinWeatherSeverity)->GetFloat(); weather_min_severity = rule_manager.GetZoneRule(GetZoneID(), R_Zone, MinWeatherSeverity)->GetFloat();
weather_max_severity = rule_manager.GetGlobalRule(R_Zone, MaxWeatherSeverity)->GetFloat(); weather_max_severity = rule_manager.GetZoneRule(GetZoneID(), R_Zone, MaxWeatherSeverity)->GetFloat();
LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Weather Severity min/max is %.2f - %.2f", zone_name, weather_min_severity, weather_max_severity); LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Weather Severity min/max is %.2f - %.2f", zone_name, weather_min_severity, weather_max_severity);
// Allow a random roll to determine if weather should start out severe or calm // Allow a random roll to determine if weather should start out severe or calm
if( MakeRandomInt(1, 100) > 50) if( MakeRandomInt(1, 100) > 50)
@ -415,12 +415,12 @@ void ZoneServer::InitWeather()
} }
LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Weather Severity set to %.2f, pattern: %i", zone_name, weather_current_severity, weather_pattern); LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Weather Severity set to %.2f, pattern: %i", zone_name, weather_current_severity, weather_pattern);
weather_change_amount = rule_manager.GetGlobalRule(R_Zone, WeatherChangePerInterval)->GetFloat(); weather_change_amount = rule_manager.GetZoneRule(GetZoneID(), R_Zone, WeatherChangePerInterval)->GetFloat();
LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Weather change by %.2f each interval", zone_name, weather_change_amount); LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Weather change by %.2f each interval", zone_name, weather_change_amount);
if( weather_type > 0 ) if( weather_type > 0 )
{ {
weather_dynamic_offset = rule_manager.GetGlobalRule(R_Zone, WeatherDynamicMaxOffset)->GetFloat(); weather_dynamic_offset = rule_manager.GetZoneRule(GetZoneID(), R_Zone, WeatherDynamicMaxOffset)->GetFloat();
LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Weather Max Offset changes no more than %.2f each interval", zone_name, weather_dynamic_offset); LogWrite(ZONE__DEBUG, 1, "Zone", "%s: Weather Max Offset changes no more than %.2f each interval", zone_name, weather_dynamic_offset);
} }
else else
@ -428,7 +428,7 @@ void ZoneServer::InitWeather()
SetRain(weather_current_severity); SetRain(weather_current_severity);
weather_last_changed_time = Timer::GetUnixTimeStamp(); weather_last_changed_time = Timer::GetUnixTimeStamp();
weatherTimer.Start(rule_manager.GetGlobalRule(R_Zone, WeatherTimer)->GetInt32()); weatherTimer.Start(rule_manager.GetZoneRule(GetZoneID(), R_Zone, WeatherTimer)->GetInt32());
} }
} }
void ZoneServer::DeleteSpellProcess(){ void ZoneServer::DeleteSpellProcess(){
@ -1072,7 +1072,7 @@ void ZoneServer::AddEnemyList(NPC* npc){
if(faction_id <= 9) if(faction_id <= 9)
return; return;
if(!rule_manager.GetGlobalRule(R_Faction, AllowFactionBasedCombat)->GetBool()) { if(!rule_manager.GetZoneRule(GetZoneID(), R_Faction, AllowFactionBasedCombat)->GetBool()) {
LogWrite(FACTION__WARNING, 0, "Faction", "Faction Combat is DISABLED via R_Faction::AllowFactionBasedCombat rule!"); LogWrite(FACTION__WARNING, 0, "Faction", "Faction Combat is DISABLED via R_Faction::AllowFactionBasedCombat rule!");
return; return;
} }
@ -2705,7 +2705,7 @@ void ZoneServer::AddLoot(NPC* npc, Spawn* killer, GroupLootMethod loot_method, i
if(killer) if(killer)
{ {
npc->SetLootMethod(loot_method, item_rarity, group_id); npc->SetLootMethod(loot_method, item_rarity, group_id);
int8 skip_loot_gray_mob_flag = rule_manager.GetGlobalRule(R_Loot, SkipLootGrayMob)->GetInt8(); int8 skip_loot_gray_mob_flag = rule_manager.GetZoneRule(GetZoneID(), R_Loot, SkipLootGrayMob)->GetInt8();
if(skip_loot_gray_mob_flag) { if(skip_loot_gray_mob_flag) {
Player* player = 0; Player* player = 0;
if(killer->IsPlayer()) if(killer->IsPlayer())
@ -5946,8 +5946,8 @@ EQ2Packet* ZoneServer::GetZoneInfoPacket(Client* client){
safe_delete(slides); safe_delete(slides);
} }
if(rule_manager.GetGlobalRule(R_Zone, UseMapUnderworldCoords)->GetBool() && client->GetPlayer()->GetMap()) { if(rule_manager.GetZoneRule(GetZoneID(), R_Zone, UseMapUnderworldCoords)->GetBool() && client->GetPlayer()->GetMap()) {
packet->setDataByName("underworld", client->GetPlayer()->GetMap()->GetMinY() + rule_manager.GetGlobalRule(R_Zone, MapUnderworldCoordOffset)->GetFloat()); packet->setDataByName("underworld", client->GetPlayer()->GetMap()->GetMinY() + rule_manager.GetZoneRule(GetZoneID(), R_Zone, MapUnderworldCoordOffset)->GetFloat());
} }
else { else {
packet->setDataByName("underworld", underworld); packet->setDataByName("underworld", underworld);
@ -6524,7 +6524,7 @@ void ZoneServer::CheckLocationGrids() {
grid->players.Put(player, true); grid->players.Put(player, true);
bool show_enter_location_popup = true; bool show_enter_location_popup = true;
bool discovery_enabled = rule_manager.GetGlobalRule(R_World, EnablePOIDiscovery)->GetBool(); bool discovery_enabled = rule_manager.GetZoneRule(GetZoneID(), R_World, EnablePOIDiscovery)->GetBool();
if( grid->discovery && discovery_enabled && !player->DiscoveredLocation(grid->id) ) if( grid->discovery && discovery_enabled && !player->DiscoveredLocation(grid->id) )
{ {
@ -7085,7 +7085,7 @@ void ZoneServer::ProcessAggroChecks(Spawn* spawn) {
if (spawn->GetFactionID() < 1 || spawn->EngagedInCombat()) if (spawn->GetFactionID() < 1 || spawn->EngagedInCombat())
return; return;
// If faction based combat is not allowed then no need to run the loops so just return out // If faction based combat is not allowed then no need to run the loops so just return out
if(!rule_manager.GetGlobalRule(R_Faction, AllowFactionBasedCombat)->GetBool()) if(!rule_manager.GetZoneRule(GetZoneID(), R_Faction, AllowFactionBasedCombat)->GetBool())
return; return;
if (spawn && spawn->IsNPC() && spawn->Alive()) if (spawn && spawn->IsNPC() && spawn->Alive())