From 6fc5f8fba23885a423bb7060e5cd566e735a4d8f Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 10 Jan 2016 15:31:04 -0500 Subject: [PATCH 1/3] Fix stacking issues with SE_DamageModifier and SE_MinDamageModifier --- zone/bonuses.cpp | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index f8edee26d..9e2461bd6 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -1555,9 +1555,12 @@ void Mob::CalcSpellBonuses(StatBonuses* newbon) NegateSpellsBonuses(buffs[i].spellid); } } + + // THIS IS WRONG, leaving for now //this prolly suffer from roundoff error slightly... - newbon->AC = newbon->AC * 10 / 34; //ratio determined impirically from client. - if (GetClass() == BARD) newbon->ManaRegen = 0; // Bards do not get mana regen from spells. + newbon->AC = newbon->AC * 10 / 34; //ratio determined impirically from client. + if (GetClass() == BARD) + newbon->ManaRegen = 0; // Bards do not get mana regen from spells. } void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *new_bonus, uint16 casterId, @@ -2209,10 +2212,11 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne // Bad data or unsupported new skill if (base2 > HIGHEST_SKILL) break; - if(base2 == ALL_SKILLS) - new_bonus->DamageModifier[HIGHEST_SKILL+1] += effect_value; - else - new_bonus->DamageModifier[base2] += effect_value; + int skill = base2 == ALL_SKILLS ? HIGHEST_SKILL + 1 : base2; + if (effect_value < 0 && new_bonus->DamageModifier[skill] > effect_value) + new_bonus->DamageModifier[skill] = effect_value; + else if (effect_value > 0 && new_bonus->DamageModifier[skill] < effect_value) + new_bonus->DamageModifier[skill] = effect_value; break; } @@ -2221,10 +2225,11 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne // Bad data or unsupported new skill if (base2 > HIGHEST_SKILL) break; - if(base2 == ALL_SKILLS) - new_bonus->DamageModifier2[HIGHEST_SKILL+1] += effect_value; - else - new_bonus->DamageModifier2[base2] += effect_value; + int skill = base2 == ALL_SKILLS ? HIGHEST_SKILL + 1 : base2; + if (effect_value < 0 && new_bonus->DamageModifier2[skill] > effect_value) + new_bonus->DamageModifier2[skill] = effect_value; + else if (effect_value > 0 && new_bonus->DamageModifier2[skill] < effect_value) + new_bonus->DamageModifier2[skill] = effect_value; break; } @@ -2233,10 +2238,11 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne // Bad data or unsupported new skill if (base2 > HIGHEST_SKILL) break; - if(base2 == ALL_SKILLS) - new_bonus->MinDamageModifier[HIGHEST_SKILL+1] += effect_value; - else - new_bonus->MinDamageModifier[base2] += effect_value; + int skill = base2 == ALL_SKILLS ? HIGHEST_SKILL + 1 : base2; + if (effect_value < 0 && new_bonus->MinDamageModifier[skill] > effect_value) + new_bonus->MinDamageModifier[skill] = effect_value; + else if (effect_value > 0 && new_bonus->MinDamageModifier[skill] < effect_value) + new_bonus->MinDamageModifier[skill] = effect_value; break; } From 1711b06836168fa12d5ef69991e0dd5290e0ffa8 Mon Sep 17 00:00:00 2001 From: Tim DeLong Date: Mon, 11 Jan 2016 09:11:38 -0500 Subject: [PATCH 2/3] * LightProfile_Struct::TypeToLevel. The case statement for lightLevelCandle should be lightTypeCandle as the check is on light types, not light levels. Light levels are used for the return value. --- common/item.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/item.cpp b/common/item.cpp index 8e8ec6f1a..7ce8e730d 100644 --- a/common/item.cpp +++ b/common/item.cpp @@ -2416,7 +2416,7 @@ uint8 LightProfile_Struct::TypeToLevel(uint8 lightType) return lightLevelSmallMagic; // 3 case lightTypeTorch: return lightLevelTorch; // 2 - case lightLevelCandle: + case lightTypeCandle: return lightLevelCandle; // 1 default: return lightLevelUnlit; // 0 From acb1d14fbd0d75ddac3b65797fffff990f75b8ad Mon Sep 17 00:00:00 2001 From: Natedog2012 Date: Mon, 11 Jan 2016 13:30:23 -0800 Subject: [PATCH 3/3] Cap Underfoot material / IDFile in the spawn packet to 99,9999 MAX. Anything higher will crash client --- common/patches/uf.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index 3535503a0..0efa502c0 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -3048,11 +3048,21 @@ namespace UF VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary].Material); + if (emu->equipment[MaterialPrimary].Material > 99999) { + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 63); + } else { + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary].Material); + } + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary].Material); + if (emu->equipment[MaterialSecondary].Material > 99999) { + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 63); + } else { + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary].Material); + } + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); } @@ -3062,7 +3072,11 @@ namespace UF structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer; for (k = 0; k < 9; k++) { - Equipment[k].Material = emu->equipment[k].Material; + if (emu->equipment[k].Material > 99999) { + Equipment[k].Material = 63; + } else { + Equipment[k].Material = emu->equipment[k].Material; + } Equipment[k].Unknown1 = emu->equipment[k].Unknown1; Equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial; }