Browse Source

Additional work for Issue #279, added skills last night now item stats are now added to the skill base

Emagi 1 year ago
parent
commit
6e3d4a2b3b

+ 8 - 1
EQ2/source/WorldServer/Combat.cpp

@@ -721,7 +721,14 @@ int8 Entity::DetermineHit(Spawn* victim, int8 damage_type, float ToHitBonus, boo
 			Skill* master_skill = GetSkillByID(lua_spell->spell->GetSpellData()->mastery_skill, true);
 			if(master_skill && (lua_spell->spell->GetSpellData()->spell_book_type == SPELL_BOOK_TYPE_TRADESKILL || 
 			  ((master_skill->name.data == "Subjugation" || master_skill->name.data == "Disruption" || master_skill->name.data == "Ordination" || master_skill->name.data == "Aggression")))) {
-				bonus += master_skill->current_val / master_skill_reduce;
+				float item_stat_bonus = 0.0f;
+				int32 item_stat = master_item_list.GetItemStatIDByName(::ToLower(master_skill->name.data));
+				if(item_stat != 0xFFFF) {
+					MStats.lock();
+					item_stat_bonus = GetStat(item_stat);
+					MStats.unlock();
+				}
+				bonus += (master_skill->current_val + item_stat_bonus) / master_skill_reduce;
 			}
 		}
 		

+ 9 - 0
EQ2/source/WorldServer/Entity.h

@@ -1808,6 +1808,15 @@ public:
 	sint32 CalculateFormulaByStat(sint32 value, int16 stat);
 	int32 CalculateFormulaByStat(int32 value, int16 stat);
 	int32 CalculateFormulaBonus(int32 value, float percent_bonus);
+	
+	float GetStat(int32 item_stat) {
+		float item_chance_or_skill = 0.0f;
+		MStats.lock();
+		item_chance_or_skill = stats[item_stat];
+		MStats.unlock();
+		return item_chance_or_skill;
+	}
+		
 	// when PacketStruct is fixed for C++17 this should become a shared_mutex and handle read/write lock
 	std::mutex		MEquipment;
 	std::mutex		MStats;

+ 10 - 1
EQ2/source/WorldServer/Spells.cpp

@@ -1263,7 +1263,16 @@ int16 Spell::GetPowerRequired(Spawn* spawn){
 				int32 ministration_skill_reduce = rule_manager.GetGlobalRule(R_Spells, MinistrationPowerReductionSkill)->GetInt32();
 				if(ministration_skill_reduce < 1)
 					ministration_skill_reduce = 25;
-				float reduction = skill->current_val / ministration_skill_reduce;
+				
+				float item_stat_bonus = 0.0f;
+				int32 item_stat = master_item_list.GetItemStatIDByName(::ToLower(skill->name.data));
+				if(item_stat != 0xFFFF) {
+					((Entity*)spawn)->MStats.lock();
+					item_stat_bonus = ((Entity*)spawn)->GetStat(item_stat);
+					((Entity*)spawn)->MStats.unlock();
+				}
+				
+				float reduction = (skill->current_val + item_stat_bonus) / ministration_skill_reduce;
 				
 				if(reduction > ministry_reduction_percent)
 					reduction = ministry_reduction_percent;