new spell effects

buff struct/tables - required sql
Removed: death_save_chance and deathsave_aa_chance (no longer used)
Added: dot_rune, caston_x, caston_y, caston_z
minor fixes
This commit is contained in:
KayenEQ
2014-02-20 01:04:34 -05:00
parent 754d70d513
commit 0caa1fd40b
11 changed files with 215 additions and 133 deletions
+23 -3
View File
@@ -3273,8 +3273,28 @@ int32 Mob::AffectMagicalDamage(int32 damage, uint16 spell_id, const bool iBuffTi
}
// If this is a DoT, use DoT Shielding...
if(iBuffTic)
damage -= (damage * itembonuses.DoTShielding / 100);
if(iBuffTic) {
damage -= (damage * itembonuses.DoTShielding / 100);
if (spellbonuses.MitigateDotRune[0]){
slot = spellbonuses.MitigateDotRune[1];
if(slot >= 0)
{
int damage_to_reduce = damage * spellbonuses.MitigateDotRune[0] / 100;
if(damage_to_reduce > buffs[slot].dot_rune)
{
damage -= damage_to_reduce;
if(!TryFadeEffect(slot))
BuffFadeBySlot(slot);
}
else
{
buffs[slot].dot_rune = (buffs[slot].dot_rune - damage_to_reduce);
damage -= damage_to_reduce;
}
}
}
}
// This must be a DD then so lets apply Spell Shielding and runes.
else
@@ -3342,7 +3362,7 @@ int32 Mob::AffectMagicalDamage(int32 damage, uint16 spell_id, const bool iBuffTi
BuffFadeBySlot(slot);
}
else{
buffs[slot].melee_rune = (buffs[slot].magic_rune - damage);
buffs[slot].magic_rune = (buffs[slot].magic_rune - damage);
}
}
}
+29 -1
View File
@@ -2239,6 +2239,15 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne
}
break;
}
case SE_MitigateDotDamage:
{
if (newbon->MitigateDotRune[0] < effect_value){
newbon->MitigateDotRune[0] = effect_value;
newbon->MitigateDotRune[1] = buffslot;
}
break;
}
case SE_ManaAbsorbPercentDamage:
{
@@ -2513,6 +2522,11 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne
}
break;
case SE_DistanceRemoval:
newbon->DistanceRemoval = true;
break;
}
}
}
@@ -3558,6 +3572,11 @@ void Mob::NegateSpellsBonuses(uint16 spell_id)
spellbonuses.MitigateSpellRune[1] = -1;
break;
case SE_MitigateDotDamage:
spellbonuses.MitigateDotRune[0] = effect_value;
spellbonuses.MitigateDotRune[1] = -1;
break;
case SE_ManaAbsorbPercentDamage:
spellbonuses.ManaAbsorbPercentDamage[0] = effect_value;
spellbonuses.ManaAbsorbPercentDamage[1] = -1;
@@ -3841,7 +3860,16 @@ void Mob::NegateSpellsBonuses(uint16 spell_id)
itembonuses.CriticalMend = effect_value;
aabonuses.CriticalMend = effect_value;
break;
case SE_DistanceRemoval:
spellbonuses.DistanceRemoval = effect_value;
break;
case SE_ImprovedTaunt:
spellbonuses.ImprovedTaunt[0] = effect_value;
spellbonuses.ImprovedTaunt[1] = effect_value;
spellbonuses.ImprovedTaunt[2] = -1;
}
}
}
+9 -20
View File
@@ -2476,7 +2476,7 @@ void Bot::SaveBuffs() {
if(!database.RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO botbuffs (BotId, SpellId, CasterLevel, DurationFormula, "
"TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, HitCount, MeleeRune, MagicRune, "
"DeathSaveSuccessChance, CasterAARank, Persistent) VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u);",
"dot_rune, caston_x, Persistent, caston_y, caston_z) VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u);",
GetBotID(), buffs[BuffCount].spellid, buffs[BuffCount].casterlevel, spells[buffs[BuffCount].spellid].buffdurationformula,
buffs[BuffCount].ticsremaining,
CalculatePoisonCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0,
@@ -2484,8 +2484,8 @@ void Bot::SaveBuffs() {
CalculateCurseCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0,
CalculateCorruptionCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0,
buffs[BuffCount].numhits, buffs[BuffCount].melee_rune, buffs[BuffCount].magic_rune,
buffs[BuffCount].deathSaveSuccessChance,
buffs[BuffCount].deathsaveCasterAARank, IsPersistent), TempErrorMessageBuffer)) {
buffs[BuffCount].dot_rune,
buffs[BuffCount].caston_x, IsPersistent, buffs[BuffCount].caston_y,buffs[BuffCount].caston_z), TempErrorMessageBuffer)) {
errorMessage = std::string(TempErrorMessageBuffer);
safe_delete(Query);
Query = 0;
@@ -2515,7 +2515,7 @@ void Bot::LoadBuffs() {
bool BuffsLoaded = false;
if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT SpellId, CasterLevel, DurationFormula, TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, HitCount, MeleeRune, MagicRune, DeathSaveSuccessChance, CasterAARank, Persistent FROM botbuffs WHERE BotId = %u", GetBotID()), TempErrorMessageBuffer, &DatasetResult)) {
if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT SpellId, CasterLevel, DurationFormula, TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, HitCount, MeleeRune, MagicRune, dot_rune, caston_x, Persistent, caston_y, caston_z FROM botbuffs WHERE BotId = %u", GetBotID()), TempErrorMessageBuffer, &DatasetResult)) {
errorMessage = std::string(TempErrorMessageBuffer);
}
else {
@@ -2541,8 +2541,8 @@ void Bot::LoadBuffs() {
buffs[BuffCount].numhits = atoi(DataRow[8]);
buffs[BuffCount].melee_rune = atoi(DataRow[9]);
buffs[BuffCount].magic_rune = atoi(DataRow[10]);
buffs[BuffCount].deathSaveSuccessChance = atoi(DataRow[11]);
buffs[BuffCount].deathsaveCasterAARank = atoi(DataRow[12]);
buffs[BuffCount].dot_rune = atoi(DataRow[11]);
buffs[BuffCount].caston_x = atoi(DataRow[12]);
buffs[BuffCount].casterid = 0;
bool IsPersistent = false;
@@ -2550,6 +2550,9 @@ void Bot::LoadBuffs() {
if(atoi(DataRow[13]))
IsPersistent = true;
buffs[BuffCount].caston_x = atoi(DataRow[14]);
buffs[BuffCount].caston_x = atoi(DataRow[15]);
buffs[BuffCount].persistant_buff = IsPersistent;
BuffCount++;
@@ -6818,13 +6821,6 @@ int16 Bot::CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint16 spell_id)
SpellSkill_Found = true;
break;
case SE_LimitSpellSubclass:{
int16 spell_skill = spell.skill * -1;
if(base1 == spell_skill)
LimitFound = true;
break;
}
case SE_LimitClass:
//Do not use this limit more then once per spell. If multiple class, treat value like items would.
if (!PassLimitClass(base1, GetClass()))
@@ -7423,13 +7419,6 @@ int16 Bot::CalcBotFocusEffect(BotfocusType bottype, uint16 focus_id, uint16 spel
SpellSkill_Found = true;
break;
case SE_LimitSpellSubclass:{
int16 spell_skill = spell.skill * -1;
if(focus_spell.base[i] == spell_skill)
return 0;
break;
}
case SE_LimitClass:
//Do not use this limit more then once per spell. If multiple class, treat value like items would.
if (!PassLimitClass(focus_spell.base[i], GetClass()))
-3
View File
@@ -11047,9 +11047,6 @@ void command_showbonusstats(Client *c, const Seperator *sep)
c->Message(0, " Target Spell Bonuses:");
c->Message(0, " Accuracy: %i%% Divine Save: %i%%",c->GetTarget()->GetSpellBonuses().Accuracy, c->GetTarget()->GetSpellBonuses().DivineSaveChance);
c->Message(0, " Flurry: %i%% HitChance: %i%% ",c->GetTarget()->GetSpellBonuses().FlurryChance, c->GetTarget()->GetSpellBonuses().HitChance / 15);
int deathsaveslot = c->GetTarget()->GetBuffSlotFromType(SE_DeathSave);
int dschance = deathsaveslot >= 0 ? c->GetTarget()->GetBuffs()[deathsaveslot].deathSaveSuccessChance : 0;
c->Message(0, " Death Save: %i%%",dschance);
}
c->Message(0, " Effective Casting Level: %i",c->GetTarget()->GetCasterLevel(0));
}
+6 -2
View File
@@ -155,8 +155,10 @@ struct Buffs_Struct {
uint32 numhits; //the number of physical hits this buff can take before it fades away, lots of druid armor spells take advantage of this mixed with powerful effects
uint32 melee_rune;
uint32 magic_rune;
uint8 deathSaveSuccessChance;
uint8 deathsaveCasterAARank;
uint32 dot_rune;
uint32 caston_x;
uint32 caston_y;
uint32 caston_z;
bool persistant_buff;
bool client; //True if the caster is a client
bool UpdateClient;
@@ -319,6 +321,7 @@ struct StatBonuses {
uint16 MeleeThresholdGuard[3]; // 0 = Mitigation value 1 = Buff Slot 2 = Min damage to trigger.
uint16 SpellThresholdGuard[3]; // 0 = Mitigation value 1 = Buff Slot 2 = Min damage to trigger.
uint16 MitigateSpellRune[2]; // 0 = Mitigation value 1 = Buff Slot
uint16 MitigateDotRune[2]; // 0 = Mitigation value 1 = Buff Slot
uint32 TriggerMeleeThreshold[3]; // 0 = Spell Effect ID 1 = Buff slot 2 = Damage Amount to Trigger
uint32 TriggerSpellThreshold[3]; // 0 = Spell Effect ID 1 = Buff slot 2 = Damage Amount to Trigger
uint16 ManaAbsorbPercentDamage[2]; // 0 = Mitigation value 1 = Buff Slot
@@ -328,6 +331,7 @@ struct StatBonuses {
bool CriticalHealDecay; // increase critical heal chance, decays based on spell level cast
bool CriticalDotDecay; // increase critical dot chance, decays based on spell level cast
bool DivineAura; // invulnerability
bool DistanceRemoval; // Check if Cancle if Moved effect is present
int16 ImprovedTaunt[3]; // 0 = Max Level 1 = Aggro modifier 2 = buffid
//bool AbsorbMagicAtt; // Magic Rune *Need to be implemented for NegateEffect
//bool MeleeRune; // Melee Rune *Need to be implemented for NegateEffect
+54 -34
View File
@@ -1284,6 +1284,12 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
break;
}
case SE_MitigateDotDamage:
{
buffs[buffslot].dot_rune = spells[spell_id].max[i];
break;
}
case SE_TriggerMeleeThreshold:
{
buffs[buffslot].melee_rune = spells[spell_id].base2[i];
@@ -1296,7 +1302,14 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
break;
}
case SE_DistanceRemoval:
{
buffs[buffslot].caston_x = int(GetX());
buffs[buffslot].caston_y = int(GetY());
buffs[buffslot].caston_z = int(GetZ());
break;
}
case SE_Levitate:
{
#ifdef SPELL_EFFECT_SPAM
@@ -2361,30 +2374,6 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
break;
}
case SE_DeathSave: {
#ifdef SPELL_EFFECT_SPAM
snprintf(effect_desc, _EDLEN, "Death Save: %+i", effect_value);
#endif
uint8 BonusChance = 0;
if(caster) {
BonusChance = caster->aabonuses.UnfailingDivinity +
caster->itembonuses.UnfailingDivinity +
caster->spellbonuses.UnfailingDivinity;
}
#ifdef SPELL_EFFECT_SPAM
//snprintf(effect_desc, _EDLEN, "Death Save Chance: %+i", SuccessChance);
#endif
//buffs[buffslot].deathSaveSuccessChance = SuccessChance;
//buffs[buffslot].deathsaveCasterAARank = caster->GetAA(aaUnfailingDivinity);
buffs[buffslot].deathsaveCasterAARank = BonusChance;
//SetDeathSaveChance(true);
break;
}
case SE_SummonAndResAllCorpses:
{
if(IsClient())
@@ -2763,7 +2752,6 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
case SE_MitigateDamageShield:
case SE_FcBaseEffects:
case SE_LimitClass:
case SE_LimitSpellSubclass:
case SE_BlockBehind:
case SE_ShieldBlock:
case SE_PetCriticalHit:
@@ -2816,6 +2804,8 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
case SE_IncreaseChanceMemwipe:
case SE_CriticalMend:
case SE_LimitCastTimeMax:
case SE_DeathSave:
case SE_TriggerOnReqCaster:
{
break;
}
@@ -3378,6 +3368,26 @@ void Mob::DoBuffTic(uint16 spell_id, int slot, uint32 ticsremaining, uint8 caste
}
break;
}
case SE_DistanceRemoval:
{
if (spellbonuses.DistanceRemoval){
int distance = sqrt(
((int(GetX()) - buffs[slot].caston_x) * (int(GetX()) - buffs[slot].caston_x)) +
((int(GetY()) - buffs[slot].caston_y) * (int(GetY()) - buffs[slot].caston_y)) +
((int(GetZ()) - buffs[slot].caston_z) * (int(GetZ()) - buffs[slot].caston_z))
);
if (distance > spells[spell_id].base[i]){
if(!TryFadeEffect(slot))
BuffFadeBySlot(slot , true);
}
break;
}
}
default:
{
// do we need to do anyting here?
@@ -5249,9 +5259,14 @@ bool Mob::TryDeathSave() {
int SuccessChance = 0;
int buffSlot = spellbonuses.DeathSave[1];
uint8 UD_HealMod = buffs[buffSlot].deathsaveCasterAARank; //Contains value of UD heal modifier.
int16 UD_HealMod = 0;
uint32 HealAmt = 300; //Death Pact max Heal
Mob* caster = entity_list.GetMobID(buffs[buffSlot].casterid);
if (caster)
UD_HealMod = caster->spellbonuses.UnfailingDivinity + caster->itembonuses.UnfailingDivinity + caster->aabonuses.UnfailingDivinity;
if(buffSlot >= 0){
SuccessChance = ( (GetCHA() * (RuleI(Spells, DeathSaveCharismaMod))) + 1) / 10; //(CHA Mod Default = 3)
@@ -5580,19 +5595,24 @@ bool Mob::TryDispel(uint8 caster_level, uint8 buff_level, int level_modifier){
bool Mob::ImprovedTaunt(){
if (spellbonuses.ImprovedTaunt[2]){
if (spellbonuses.ImprovedTaunt[0]){
if (GetLevel() > spellbonuses.ImprovedTaunt[0])
return false;
target = entity_list.GetMob(buffs[spellbonuses.ImprovedTaunt[2]].casterid);
if (spellbonuses.ImprovedTaunt[2] >= 0){
if (target){
SetTarget(target);
return true;
target = entity_list.GetMob(buffs[spellbonuses.ImprovedTaunt[2]].casterid);
if (target){
SetTarget(target);
return true;
}
else {
if(!TryFadeEffect(spellbonuses.ImprovedTaunt[2]))
BuffFadeBySlot(spellbonuses.ImprovedTaunt[2], true); //If caster killed removed effect.
}
}
else
BuffFadeBySlot(spellbonuses.ImprovedTaunt[2]); //If caster killed removed effect.
}
return false;
+4 -2
View File
@@ -2953,8 +2953,10 @@ int Mob::AddBuff(Mob *caster, uint16 spell_id, int duration, int32 level_overrid
buffs[emptyslot].numhits = spells[spell_id].numhits;
buffs[emptyslot].client = caster ? caster->IsClient() : 0;
buffs[emptyslot].persistant_buff = 0;
buffs[emptyslot].deathsaveCasterAARank = 0;
buffs[emptyslot].deathSaveSuccessChance = 0;
buffs[emptyslot].caston_x = 0;
buffs[emptyslot].caston_y = 0;
buffs[emptyslot].caston_z = 0;
buffs[emptyslot].dot_rune = 0;
if (level_override > 0) {
buffs[emptyslot].UpdateClient = true;
+21 -14
View File
@@ -1815,7 +1815,7 @@ void ZoneDatabase::SaveMercBuffs(Merc *merc) {
if(!database.RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO merc_buffs (MercId, SpellId, CasterLevel, DurationFormula, "
"TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, HitCount, MeleeRune, MagicRune, "
"DeathSaveSuccessChance, CasterAARank, Persistent) VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u);",
"dot_rune, caston_x, Persistent, caston_y, caston_z) VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u);",
merc->GetMercID(), buffs[BuffCount].spellid, buffs[BuffCount].casterlevel, spells[buffs[BuffCount].spellid].buffdurationformula,
buffs[BuffCount].ticsremaining,
CalculatePoisonCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0,
@@ -1823,8 +1823,8 @@ void ZoneDatabase::SaveMercBuffs(Merc *merc) {
CalculateCurseCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0,
CalculateCorruptionCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0,
buffs[BuffCount].numhits, buffs[BuffCount].melee_rune, buffs[BuffCount].magic_rune,
buffs[BuffCount].deathSaveSuccessChance,
buffs[BuffCount].deathsaveCasterAARank, IsPersistent), TempErrorMessageBuffer)) {
buffs[BuffCount].dot_rune,
buffs[BuffCount].caston_x, IsPersistent, buffs[BuffCount].caston_y, buffs[BuffCount].caston_z), TempErrorMessageBuffer)) {
errorMessage = std::string(TempErrorMessageBuffer);
safe_delete(Query);
Query = 0;
@@ -1856,7 +1856,7 @@ void ZoneDatabase::LoadMercBuffs(Merc *merc) {
bool BuffsLoaded = false;
if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT SpellId, CasterLevel, DurationFormula, TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, HitCount, MeleeRune, MagicRune, DeathSaveSuccessChance, CasterAARank, Persistent FROM merc_buffs WHERE MercId = %u", merc->GetMercID()), TempErrorMessageBuffer, &DatasetResult)) {
if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT SpellId, CasterLevel, DurationFormula, TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, HitCount, MeleeRune, MagicRune, dot_rune, CasterAARank, Persistent FROM merc_buffs WHERE MercId = %u", merc->GetMercID()), TempErrorMessageBuffer, &DatasetResult)) {
errorMessage = std::string(TempErrorMessageBuffer);
}
else {
@@ -1882,8 +1882,8 @@ void ZoneDatabase::LoadMercBuffs(Merc *merc) {
buffs[BuffCount].numhits = atoi(DataRow[8]);
buffs[BuffCount].melee_rune = atoi(DataRow[9]);
buffs[BuffCount].magic_rune = atoi(DataRow[10]);
buffs[BuffCount].deathSaveSuccessChance = atoi(DataRow[11]);
buffs[BuffCount].deathsaveCasterAARank = atoi(DataRow[12]);
buffs[BuffCount].dot_rune = atoi(DataRow[11]);
buffs[BuffCount].caston_x = atoi(DataRow[12]);
buffs[BuffCount].casterid = 0;
bool IsPersistent = false;
@@ -1891,6 +1891,9 @@ void ZoneDatabase::LoadMercBuffs(Merc *merc) {
if(atoi(DataRow[13]))
IsPersistent = true;
buffs[BuffCount].caston_y = atoi(DataRow[13]);
buffs[BuffCount].caston_z = atoi(DataRow[14]);
buffs[BuffCount].persistant_buff = IsPersistent;
BuffCount++;
@@ -2566,11 +2569,11 @@ void ZoneDatabase::SaveBuffs(Client *c) {
for (int i = 0; i < buff_count; i++) {
if(buffs[i].spellid != SPELL_UNKNOWN) {
if(!database.RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `character_buffs` (character_id, slot_id, spell_id, "
"caster_level, caster_name, ticsremaining, counters, numhits, melee_rune, magic_rune, persistent, death_save_chance, "
"death_save_aa_chance) VALUES('%u', '%u', '%u', '%u', '%s', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')",
"caster_level, caster_name, ticsremaining, counters, numhits, melee_rune, magic_rune, persistent, dot_rune, "
"caston_x, caston_y, caston_z) VALUES('%u', '%u', '%u', '%u', '%s', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')",
c->CharacterID(), i, buffs[i].spellid, buffs[i].casterlevel, buffs[i].caster_name, buffs[i].ticsremaining,
buffs[i].counters, buffs[i].numhits, buffs[i].melee_rune, buffs[i].magic_rune, buffs[i].persistant_buff,
buffs[i].deathSaveSuccessChance, buffs[i].deathsaveCasterAARank),
buffs[i].dot_rune, buffs[i].caston_x, buffs[i].caston_y, buffs[i].caston_z),
errbuf)) {
LogFile->write(EQEMuLog::Error, "Error in SaveBuffs query '%s': %s", query, errbuf);
}
@@ -2592,7 +2595,7 @@ void ZoneDatabase::LoadBuffs(Client *c) {
MYSQL_RES *result;
MYSQL_ROW row;
if (RunQuery(query, MakeAnyLenString(&query, "SELECT spell_id, slot_id, caster_level, caster_name, ticsremaining, counters, "
"numhits, melee_rune, magic_rune, persistent, death_save_chance, death_save_aa_chance FROM `character_buffs` WHERE "
"numhits, melee_rune, magic_rune, persistent, dot_rune, caston_x, caston_y, caston_z FROM `character_buffs` WHERE "
"`character_id`='%u'",
c->CharacterID()), errbuf, &result))
{
@@ -2617,8 +2620,10 @@ void ZoneDatabase::LoadBuffs(Client *c) {
uint32 melee_rune = atoul(row[7]);
uint32 magic_rune = atoul(row[8]);
uint8 persistent = atoul(row[9]);
uint32 death_save_chance = atoul(row[10]);
uint32 death_save_aa_chance = atoul(row[11]);
uint32 dot_rune = atoul(row[10]);
uint32 caston_x = atoul(row[11]);
uint32 caston_y = atoul(row[12]);
uint32 caston_z = atoul(row[13]);
buffs[slot_id].spellid = spell_id;
buffs[slot_id].casterlevel = caster_level;
@@ -2638,8 +2643,10 @@ void ZoneDatabase::LoadBuffs(Client *c) {
buffs[slot_id].melee_rune = melee_rune;
buffs[slot_id].magic_rune = magic_rune;
buffs[slot_id].persistant_buff = persistent ? true : false;
buffs[slot_id].deathSaveSuccessChance = death_save_chance;
buffs[slot_id].deathsaveCasterAARank = death_save_aa_chance;
buffs[slot_id].dot_rune = dot_rune;
buffs[slot_id].caston_x = caston_x;
buffs[slot_id].caston_y = caston_y;
buffs[slot_id].caston_z = caston_z;
buffs[slot_id].UpdateClient = false;
if(IsRuneSpell(spell_id)) {
c->SetHasRune(true);