diff --git a/utils/sql/git/required/2014_02_20_buff_update.txt b/utils/sql/git/required/2014_02_20_buff_update.txt index e691a0a67..a53930481 100644 --- a/utils/sql/git/required/2014_02_20_buff_update.txt +++ b/utils/sql/git/required/2014_02_20_buff_update.txt @@ -13,4 +13,8 @@ ALTER TABLE `botbuffs` ADD `caston_y` INT(10) NOT NULL DEFAULT '0'; ALTER TABLE `character_buffs` ADD `caston_z` INT(10) NOT NULL DEFAULT '0'; ALTER TABLE `merc_buffs` ADD `caston_z` INT(10) NOT NULL DEFAULT '0'; -ALTER TABLE `botbuffs` ADD `caston_z` INT(10) NOT NULL DEFAULT '0'; \ No newline at end of file +ALTER TABLE `botbuffs` ADD `caston_z` INT(10) NOT NULL DEFAULT '0'; + +ALTER TABLE `character_buffs` ADD `ExtraDIChance` INT(10) NOT NULL DEFAULT '0'; +ALTER TABLE `merc_buffs` ADD `ExtraDIChance` INT(10) NOT NULL DEFAULT '0'; +ALTER TABLE `botbuffs` ADD `ExtraDIChance` INT(10) NOT NULL DEFAULT '0'; \ No newline at end of file diff --git a/zone/bot.cpp b/zone/bot.cpp index 9054df6a5..a7ff02f1b 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -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, " - "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);", + "dot_rune, caston_x, Persistent, caston_y, caston_z, ExtraDIChance) VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %i, %u, %i, %i, %i);", GetBotID(), buffs[BuffCount].spellid, buffs[BuffCount].casterlevel, spells[buffs[BuffCount].spellid].buffdurationformula, buffs[BuffCount].ticsremaining, CalculatePoisonCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, @@ -2485,7 +2485,11 @@ void Bot::SaveBuffs() { CalculateCorruptionCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, buffs[BuffCount].numhits, buffs[BuffCount].melee_rune, buffs[BuffCount].magic_rune, buffs[BuffCount].dot_rune, - buffs[BuffCount].caston_x, IsPersistent, buffs[BuffCount].caston_y,buffs[BuffCount].caston_z), TempErrorMessageBuffer)) { + buffs[BuffCount].caston_x, + IsPersistent, + buffs[BuffCount].caston_y, + buffs[BuffCount].caston_z, + buffs[BuffCount].ExtraDIChance), TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); safe_delete(Query); Query = 0; @@ -2515,7 +2519,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, dot_rune, caston_x, Persistent, caston_y, caston_z 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, ExtraDIChance FROM botbuffs WHERE BotId = %u", GetBotID()), TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -2550,8 +2554,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].caston_y = atoi(DataRow[14]); + buffs[BuffCount].caston_z = atoi(DataRow[15]); + buffs[BuffCount].ExtraDIChance = atoi(DataRow[16]); buffs[BuffCount].persistant_buff = IsPersistent; diff --git a/zone/common.h b/zone/common.h index 97b94887a..ec364931b 100644 --- a/zone/common.h +++ b/zone/common.h @@ -156,9 +156,10 @@ struct Buffs_Struct { uint32 melee_rune; uint32 magic_rune; uint32 dot_rune; - uint32 caston_x; - uint32 caston_y; - uint32 caston_z; + int32 caston_x; + int32 caston_y; + int32 caston_z; + int32 ExtraDIChance; bool persistant_buff; bool client; //True if the caster is a client bool UpdateClient; diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index f307e08e2..99c45ea0f 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -1321,6 +1321,20 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial) break; } + case SE_DeathSave: { + + int16 mod = 0; + + if(caster) { + mod = caster->aabonuses.UnfailingDivinity + + caster->itembonuses.UnfailingDivinity + + caster->spellbonuses.UnfailingDivinity; + } + + buffs[buffslot].ExtraDIChance = mod; + break; + } + case SE_Illusion: { #ifdef SPELL_EFFECT_SPAM @@ -1432,10 +1446,17 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial) snprintf(effect_desc, _EDLEN, "Memory Blur: %d", effect_value); #endif int wipechance = spells[spell_id].base[i]; - int bonus = spellbonuses.IncreaseChanceMemwipe + itembonuses.IncreaseChanceMemwipe + aabonuses.IncreaseChanceMemwipe; + int bonus = 0; + + if (caster){ + bonus = caster->spellbonuses.IncreaseChanceMemwipe + + caster->itembonuses.IncreaseChanceMemwipe + + caster->aabonuses.IncreaseChanceMemwipe; + } + wipechance += wipechance*bonus/100; - if(MakeRandomInt(0, 100) < wipechance) + if(MakeRandomInt(0, 99) < wipechance) { if(IsAIControlled()) { @@ -2804,7 +2825,6 @@ 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; @@ -3267,6 +3287,31 @@ void Mob::DoBuffTic(uint16 spell_id, int slot, uint32 ticsremaining, uint8 caste break; } + case SE_WipeHateList: + { + + int wipechance = spells[spell_id].base[i]; + int bonus = 0; + + if (caster){ + bonus = caster->spellbonuses.IncreaseChanceMemwipe + + caster->itembonuses.IncreaseChanceMemwipe + + caster->aabonuses.IncreaseChanceMemwipe; + } + + wipechance += wipechance*bonus/100; + + if(MakeRandomInt(0, 99) < wipechance) + { + if(IsAIControlled()) + { + WipeHateList(); + } + Message(13, "Your mind fogs. Who are my friends? Who are my enemies?... it was all so clear a moment ago..."); + } + break; + } + case SE_Charm: { if (!caster || !PassCharismaCheck(caster, this, spell_id)) { BuffFadeByEffect(SE_Charm); @@ -5262,13 +5307,10 @@ bool Mob::TryDeathSave() { 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){ + UD_HealMod = buffs[buffSlot].ExtraDIChance; + SuccessChance = ( (GetCHA() * (RuleI(Spells, DeathSaveCharismaMod))) + 1) / 10; //(CHA Mod Default = 3) if (SuccessChance > 95) @@ -5333,6 +5375,8 @@ bool Mob::TryDeathSave() { } } } + + BuffFadeBySlot(buffSlot); } return false; } diff --git a/zone/spells.cpp b/zone/spells.cpp index de16af190..eceade9b1 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -2957,6 +2957,7 @@ int Mob::AddBuff(Mob *caster, uint16 spell_id, int duration, int32 level_overrid buffs[emptyslot].caston_y = 0; buffs[emptyslot].caston_z = 0; buffs[emptyslot].dot_rune = 0; + buffs[emptyslot].ExtraDIChance = 0; if (level_override > 0) { buffs[emptyslot].UpdateClient = true; diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index aa68888fd..278f87eaf 100644 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -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, " - "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);", + "dot_rune, caston_x, Persistent, caston_y, caston_z, ExtraDIChance) VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %i, %u, %i, %i, %i);", 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, @@ -1824,7 +1824,11 @@ void ZoneDatabase::SaveMercBuffs(Merc *merc) { CalculateCorruptionCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, buffs[BuffCount].numhits, buffs[BuffCount].melee_rune, buffs[BuffCount].magic_rune, buffs[BuffCount].dot_rune, - buffs[BuffCount].caston_x, IsPersistent, buffs[BuffCount].caston_y, buffs[BuffCount].caston_z), TempErrorMessageBuffer)) { + buffs[BuffCount].caston_x, + IsPersistent, + buffs[BuffCount].caston_y, + buffs[BuffCount].caston_z, + buffs[BuffCount].ExtraDIChance), TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); safe_delete(Query); Query = 0; @@ -1856,7 +1860,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, dot_rune, 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, caston_x, Persistent, caston_y, caston_z, ExtraDIChance FROM merc_buffs WHERE MercId = %u", merc->GetMercID()), TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -1893,6 +1897,7 @@ void ZoneDatabase::LoadMercBuffs(Merc *merc) { buffs[BuffCount].caston_y = atoi(DataRow[13]); buffs[BuffCount].caston_z = atoi(DataRow[14]); + buffs[BuffCount].ExtraDIChance = atoi(DataRow[15]); buffs[BuffCount].persistant_buff = IsPersistent; @@ -2570,10 +2575,10 @@ void ZoneDatabase::SaveBuffs(Client *c) { 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, dot_rune, " - "caston_x, caston_y, caston_z) VALUES('%u', '%u', '%u', '%u', '%s', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", + "caston_x, caston_y, caston_z, ExtraDIChance) VALUES('%u', '%u', '%u', '%u', '%s', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%i', '%i', '%i', '%i')", 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].dot_rune, buffs[i].caston_x, buffs[i].caston_y, buffs[i].caston_z), + buffs[i].dot_rune, buffs[i].caston_x, buffs[i].caston_y, buffs[i].caston_z, buffs[i].ExtraDIChance), errbuf)) { LogFile->write(EQEMuLog::Error, "Error in SaveBuffs query '%s': %s", query, errbuf); } @@ -2595,7 +2600,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, dot_rune, caston_x, caston_y, caston_z FROM `character_buffs` WHERE " + "numhits, melee_rune, magic_rune, persistent, dot_rune, caston_x, caston_y, caston_z, ExtraDIChance FROM `character_buffs` WHERE " "`character_id`='%u'", c->CharacterID()), errbuf, &result)) { @@ -2621,9 +2626,10 @@ void ZoneDatabase::LoadBuffs(Client *c) { uint32 magic_rune = atoul(row[8]); uint8 persistent = atoul(row[9]); uint32 dot_rune = atoul(row[10]); - uint32 caston_x = atoul(row[11]); - uint32 caston_y = atoul(row[12]); - uint32 caston_z = atoul(row[13]); + int32 caston_x = atoul(row[11]); + int32 caston_y = atoul(row[12]); + int32 caston_z = atoul(row[13]); + int32 ExtraDIChance = atoul(row[14]); buffs[slot_id].spellid = spell_id; buffs[slot_id].casterlevel = caster_level; @@ -2647,6 +2653,7 @@ void ZoneDatabase::LoadBuffs(Client *c) { buffs[slot_id].caston_x = caston_x; buffs[slot_id].caston_y = caston_y; buffs[slot_id].caston_z = caston_z; + buffs[slot_id].ExtraDIChance = ExtraDIChance; buffs[slot_id].UpdateClient = false; if(IsRuneSpell(spell_id)) { c->SetHasRune(true); @@ -2655,11 +2662,6 @@ void ZoneDatabase::LoadBuffs(Client *c) { c->SetHasSpellRune(true); } - /* - if(IsDeathSaveSpell(spell_id)) { - c->SetDeathSaveChance(true); - } - */ } mysql_free_result(result); }