diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Achievements/AchievementMgr.cpp | 6 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCStores.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCStores.h | 1 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCStructure.h | 7 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCfmt.h | 1 | ||||
-rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 18 | ||||
-rwxr-xr-x | src/server/game/Entities/Player/Player.h | 2 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 69 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Handlers/PetHandler.cpp | 8 | ||||
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellMgr.cpp | 5 | ||||
-rwxr-xr-x | src/server/game/World/World.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/World/World.h | 2 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp | 9 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 12 |
15 files changed, 95 insertions, 51 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 83f28b7cbaa..b2d7cb79319 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -428,7 +428,7 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin { sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::ResetAchievementCriteria(%u, %u, %u)", type, miscvalue1, miscvalue2); - if (!sWorld->getBoolConfig(CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS) && m_player->GetSession()->GetSecurity() > SEC_PLAYER) + if (m_player->GetSession()->GetSecurity() > AccountTypes(sWorld->getIntConfig(CONFIG_GM_LEVEL_ALLOW_ACHIEVEMENTS))) return; AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type); @@ -728,7 +728,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui { sLog->outDebug(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::UpdateAchievementCriteria(%u, %u, %u)", type, miscValue1, miscValue2); - if (!sWorld->getBoolConfig(CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS) && m_player->GetSession()->GetSecurity() > SEC_PLAYER) + if (m_player->GetSession()->GetSecurity() > AccountTypes(sWorld->getIntConfig(CONFIG_GM_LEVEL_ALLOW_ACHIEVEMENTS))) return; AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type); @@ -1972,7 +1972,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement, b { sLog->outDetail("AchievementMgr::CompletedAchievement(%u)", achievement->ID); - if (!sWorld->getBoolConfig(CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS) && m_player->GetSession()->GetSecurity() > SEC_PLAYER && !ignoreGMAllowAchievementConfig) + if (m_player->GetSession()->GetSecurity() > AccountTypes(sWorld->getIntConfig(CONFIG_GM_LEVEL_ALLOW_ACHIEVEMENTS)) && !ignoreGMAllowAchievementConfig) return; if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement)) diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index f4056dd0a37..3fd61553811 100755 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -99,6 +99,7 @@ DBCStorage <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore(GtChance DBCStorage <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt); DBCStorage <GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt); DBCStorage <GtChanceToSpellCritEntry> sGtChanceToSpellCritStore(GtChanceToSpellCritfmt); +DBCStorage <GtOCTClassCombatRatingScalarEntry> sGtOCTClassCombatRatingScalarStore(GtOCTClassCombatRatingScalarfmt); DBCStorage <GtOCTRegenHPEntry> sGtOCTRegenHPStore(GtOCTRegenHPfmt); //DBCStorage <GtOCTRegenMPEntry> sGtOCTRegenMPStore(GtOCTRegenMPfmt); -- not used currently DBCStorage <GtRegenHPPerSptEntry> sGtRegenHPPerSptStore(GtRegenHPPerSptfmt); @@ -331,6 +332,7 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales, bad_dbc_files, sGtChanceToMeleeCritStore, dbcPath, "gtChanceToMeleeCrit.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sGtChanceToSpellCritBaseStore, dbcPath, "gtChanceToSpellCritBase.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sGtChanceToSpellCritStore, dbcPath, "gtChanceToSpellCrit.dbc"); + LoadDBC(availableDbcLocales, bad_dbc_files, sGtOCTClassCombatRatingScalarStore, dbcPath, "gtOCTClassCombatRatingScalar.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sGtOCTRegenHPStore, dbcPath, "gtOCTRegenHP.dbc"); //LoadDBC(dbcCount, availableDbcLocales, bad_dbc_files, sGtOCTRegenMPStore, dbcPath, "gtOCTRegenMP.dbc"); -- not used currently LoadDBC(availableDbcLocales, bad_dbc_files, sGtRegenHPPerSptStore, dbcPath, "gtRegenHPPerSpt.dbc"); diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 97598e87f8e..396bd8ca98c 100755 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -103,6 +103,7 @@ extern DBCStorage <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore; extern DBCStorage <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore; extern DBCStorage <GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore; extern DBCStorage <GtChanceToSpellCritEntry> sGtChanceToSpellCritStore; +extern DBCStorage <GtOCTClassCombatRatingScalarEntry> sGtOCTClassCombatRatingScalarStore; extern DBCStorage <GtOCTRegenHPEntry> sGtOCTRegenHPStore; //extern DBCStorage <GtOCTRegenMPEntry> sGtOCTRegenMPStore; -- not used currently extern DBCStorage <GtRegenHPPerSptEntry> sGtRegenHPPerSptStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 114e14ab6c0..b5c22a11b24 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -961,6 +961,8 @@ struct GlyphSlotEntry // All Gt* DBC store data for 100 levels, some by 100 per class/race #define GT_MAX_LEVEL 100 +// gtOCTClassCombatRatingScalar.dbc stores data for 32 ratings, look at MAX_COMBAT_RATING for real used amount +#define GT_MAX_RATING 32 struct GtBarberShopCostBaseEntry { @@ -992,6 +994,11 @@ struct GtChanceToSpellCritEntry float ratio; }; +struct GtOCTClassCombatRatingScalarEntry +{ + float ratio; +}; + struct GtOCTRegenHPEntry { float ratio; diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index caceb389d6c..8f7ce9d8df3 100755 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -61,6 +61,7 @@ const char GtChanceToMeleeCritBasefmt[]="f"; const char GtChanceToMeleeCritfmt[]="f"; const char GtChanceToSpellCritBasefmt[]="f"; const char GtChanceToSpellCritfmt[]="f"; +const char GtOCTClassCombatRatingScalarfmt[]="df"; const char GtOCTRegenHPfmt[]="f"; //const char GtOCTRegenMPfmt[]="f"; const char GtRegenHPPerSptfmt[]="f"; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4fc87b99761..e6d38dee3ec 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2002,7 +2002,7 @@ bool Player::ToggleAFK() bool state = HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_AFK); // afk player not allowed in battleground - if (state && InBattleground()) + if (state && InBattleground() && !InArena()) LeaveBattleground(); return state; @@ -5783,7 +5783,7 @@ float Player::GetSpellCritFromIntellect() return crit*100.0f; } -float Player::GetRatingCoefficient(CombatRating cr) const +float Player::GetRatingMultiplier(CombatRating cr) const { uint8 level = getLevel(); @@ -5791,15 +5791,17 @@ float Player::GetRatingCoefficient(CombatRating cr) const level = GT_MAX_LEVEL; GtCombatRatingsEntry const *Rating = sGtCombatRatingsStore.LookupEntry(cr*GT_MAX_LEVEL+level-1); - if (Rating == NULL) + // gtOCTClassCombatRatingScalarStore.dbc starts with 1, CombatRating with zero, so cr+1 + GtOCTClassCombatRatingScalarEntry const *classRating = sGtOCTClassCombatRatingScalarStore.LookupEntry((getClass()-1)*GT_MAX_RATING+cr+1); + if (!Rating || !classRating) return 1.0f; // By default use minimum coefficient (not must be called) - return Rating->ratio; + return classRating->ratio / Rating->ratio; } float Player::GetRatingBonusValue(CombatRating cr) const { - return float(GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + cr)) / GetRatingCoefficient(cr); + return float(GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + cr)) * GetRatingMultiplier(cr); } float Player::GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const @@ -5867,20 +5869,20 @@ void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply) { case CR_HASTE_MELEE: { - float RatingChange = value / GetRatingCoefficient(cr); + float RatingChange = value * GetRatingMultiplier(cr); ApplyAttackTimePercentMod(BASE_ATTACK, RatingChange, apply); ApplyAttackTimePercentMod(OFF_ATTACK, RatingChange, apply); break; } case CR_HASTE_RANGED: { - float RatingChange = value / GetRatingCoefficient(cr); + float RatingChange = value * GetRatingMultiplier(cr); ApplyAttackTimePercentMod(RANGED_ATTACK, RatingChange, apply); break; } case CR_HASTE_SPELL: { - float RatingChange = value / GetRatingCoefficient(cr); + float RatingChange = value * GetRatingMultiplier(cr); ApplyCastTimePercentMod(RatingChange, apply); break; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 13e6b195142..4c0c6401049 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1844,7 +1844,7 @@ class Player : public Unit, public GridObject<Player> float GetSpellCritFromIntellect(); float OCTRegenHPPerSpirit(); float OCTRegenMPPerSpirit(); - float GetRatingCoefficient(CombatRating cr) const; + float GetRatingMultiplier(CombatRating cr) const; float GetRatingBonusValue(CombatRating cr) const; uint32 GetBaseSpellPowerBonus() { return m_baseSpellPower; } int32 GetSpellPenetrationItemMod() const { return m_spellPenetrationItemMod; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1e296b5cce8..c2415dd4ad7 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2250,17 +2250,21 @@ void Unit::SendMeleeAttackStop(Unit* victim) sLog->outDetail("%s %u stopped attacking %s %u", (GetTypeId() == TYPEID_PLAYER ? "player" : "creature"), GetGUIDLow(), (victim->GetTypeId() == TYPEID_PLAYER ? "player" : "creature"), victim->GetGUIDLow()); } -bool Unit::isSpellBlocked(Unit *pVictim, SpellEntry const * /*spellProto*/, WeaponAttackType attackType) +bool Unit::isSpellBlocked(Unit* victim, SpellEntry const * spellProto, WeaponAttackType attackType) { - if (pVictim->HasInArc(M_PI, this) || pVictim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION)) + // These spells can't be blocked + if (spellProto && spellProto->Attributes & SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK) + return false; + + if (victim->HasInArc(M_PI, this) || victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION)) { // Check creatures flags_extra for disable block - if (pVictim->GetTypeId() == TYPEID_UNIT && - pVictim->ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK) + if (victim->GetTypeId() == TYPEID_UNIT && + victim->ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK) return false; - float blockChance = pVictim->GetUnitBlockChance(); - blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(pVictim->GetMaxSkillValueForLevel()))*0.04f; + float blockChance = victim->GetUnitBlockChance(); + blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f; if (roll_chance_f(blockChance)) return true; } @@ -6815,26 +6819,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger break; } - // Glyph of Divinity - case 54939: - { - // Lookup base amount mana restore - for (uint8 i=0; i<MAX_SPELL_EFFECTS; i++) - if (procSpell->Effect[i] == SPELL_EFFECT_ENERGIZE) - { - int32 mana = SpellMgr::CalculateSpellEffectAmount(procSpell, i); - CastCustomSpell(this, 54986, 0, &mana, 0, true, castItem, triggeredByAura); - break; - } - return true; - } - // Glyph of Flash of Light - case 54936: - { - triggered_spell_id = 54957; - basepoints0 = CalculatePctN(int32(damage), triggerAmount); - break; - } // Glyph of Holy Light case 54937: { @@ -7844,7 +7828,7 @@ bool Unit::HandleModDamagePctTakenAuraProc(Unit *pVictim, uint32 /*damage*/, Aur // Used in case when access to whole aura is needed // All procs should be handled like this... -bool Unit::HandleAuraProc(Unit * pVictim, uint32 damage, Aura * triggeredByAura, SpellEntry const * procSpell, uint32 /*procFlag*/, uint32 procEx, uint32 /*cooldown*/, bool * handled) +bool Unit::HandleAuraProc(Unit * pVictim, uint32 damage, Aura * triggeredByAura, SpellEntry const * procSpell, uint32 /*procFlag*/, uint32 procEx, uint32 cooldown, bool * handled) { SpellEntry const *dummySpell = triggeredByAura->GetSpellProto(); @@ -7913,6 +7897,25 @@ bool Unit::HandleAuraProc(Unit * pVictim, uint32 damage, Aura * triggeredByAura, return true; } } + // Glyph of Divinity + else if (dummySpell->Id == 54939) + { + *handled = true; + // Check if we are the target and prevent mana gain + if (triggeredByAura->GetCasterGUID() == pVictim->GetGUID()) + return false; + // Lookup base amount mana restore + for (uint8 i=0; i<MAX_SPELL_EFFECTS; i++) + { + if (procSpell->Effect[i] == SPELL_EFFECT_ENERGIZE) + { + // value multiplied by 2 because you should get twice amount + int32 mana = SpellMgr::CalculateSpellEffectAmount(procSpell, i) * 2; + CastCustomSpell(this, 54986, 0, &mana, NULL, true); + } + } + return true; + } break; } case SPELLFAMILY_MAGE: @@ -8010,6 +8013,18 @@ bool Unit::HandleAuraProc(Unit * pVictim, uint32 damage, Aura * triggeredByAura, switch(dummySpell->Id) { + // Bone Shield cooldown + case 49222: + { + *handled = true; + if (cooldown && GetTypeId() == TYPEID_PLAYER) + { + if (ToPlayer()->HasSpellCooldown(100000)) + return false; + ToPlayer()->AddSpellCooldown(100000, 0, time(NULL) + cooldown); + } + return true; + } // Hungering Cold aura drop case 51209: *handled = true; diff --git a/src/server/game/Server/Protocol/Handlers/PetHandler.cpp b/src/server/game/Server/Protocol/Handlers/PetHandler.cpp index 9dfac0e1b7c..0c8201aa1e2 100755 --- a/src/server/game/Server/Protocol/Handlers/PetHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/PetHandler.cpp @@ -560,7 +560,9 @@ void WorldSession::HandlePetSetAction(WorldPacket & recv_data) if (pet->GetTypeId() == TYPEID_UNIT && pet->ToCreature()->isPet()) ((Pet*)pet)->ToggleAutocast(spell_id, true); else - charmInfo->ToggleCreatureAutocast(spell_id, true); + for (Unit::ControlList::iterator itr = GetPlayer()->m_Controlled.begin(); itr != GetPlayer()->m_Controlled.end(); ++itr) + if ((*itr)->GetEntry() == pet->GetEntry()) + (*itr)->GetCharmInfo()->ToggleCreatureAutocast(spell_id, true); } //sign for no/turn off autocast else if (act_state == ACT_DISABLED && spell_id) @@ -568,7 +570,9 @@ void WorldSession::HandlePetSetAction(WorldPacket & recv_data) if (pet->GetTypeId() == TYPEID_UNIT && pet->ToCreature()->isPet()) ((Pet*)pet)->ToggleAutocast(spell_id, false); else - charmInfo->ToggleCreatureAutocast(spell_id, false); + for (Unit::ControlList::iterator itr = GetPlayer()->m_Controlled.begin(); itr != GetPlayer()->m_Controlled.end(); ++itr) + if ((*itr)->GetEntry() == pet->GetEntry()) + (*itr)->GetCharmInfo()->ToggleCreatureAutocast(spell_id, false); } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index fc2a6920c8e..fcfef1f9cfa 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5989,7 +5989,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const * aurApp, uint8 mode, boo { if (AuraEffect const * aurEff = GetBase()->GetEffect(1)) { - int32 damage = aurEff->GetAmount()*4; + int32 damage = aurEff->GetAmount() * 8; // backfire damage target->CastCustomSpell(target, 64085, &damage, NULL, NULL, true, NULL, NULL, GetCasterGUID()); } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index d5e736c7900..ad2bd3aa0c0 100755 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3944,6 +3944,11 @@ void SpellMgr::LoadSpellCustomAttr() spellInfo->AttributesEx5 &= ~SPELL_ATTR5_USABLE_WHILE_STUNNED; ++count; break; + case 8145: // Tremor Totem (instant pulse) + case 6474: // Earthbind Totem (instant pulse) + spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY; + ++count; + break; case 53241: // Marked for Death (Rank 1) case 53243: // Marked for Death (Rank 2) case 53244: // Marked for Death (Rank 3) diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index b79f6721bd7..a17e0b0dad3 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -854,6 +854,7 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_GM_LEVEL_IN_GM_LIST] = sConfig->GetIntDefault("GM.InGMList.Level", SEC_ADMINISTRATOR); m_int_configs[CONFIG_GM_LEVEL_IN_WHO_LIST] = sConfig->GetIntDefault("GM.InWhoList.Level", SEC_ADMINISTRATOR); + m_int_configs[CONFIG_GM_LEVEL_ALLOW_ACHIEVEMENTS] = sConfig->GetIntDefault("GM.AllowAchievementGain.Level", SEC_ADMINISTRATOR); m_bool_configs[CONFIG_GM_LOG_TRADE] = sConfig->GetBoolDefault("GM.LogTrade", false); m_int_configs[CONFIG_START_GM_LEVEL] = sConfig->GetIntDefault("GM.StartLevel", 1); if (m_int_configs[CONFIG_START_GM_LEVEL] < m_int_configs[CONFIG_START_PLAYER_LEVEL]) @@ -870,7 +871,6 @@ void World::LoadConfigSettings(bool reload) m_bool_configs[CONFIG_ALLOW_GM_GROUP] = sConfig->GetBoolDefault("GM.AllowInvite", false); m_bool_configs[CONFIG_ALLOW_GM_FRIEND] = sConfig->GetBoolDefault("GM.AllowFriend", false); m_bool_configs[CONFIG_GM_LOWER_SECURITY] = sConfig->GetBoolDefault("GM.LowerSecurity", false); - m_bool_configs[CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS] = sConfig->GetBoolDefault("GM.AllowAchievementGain", true); m_float_configs[CONFIG_CHANCE_OF_GM_SURVEY] = sConfig->GetFloatDefault("GM.TicketSystem.ChanceOfGMSurvey", 50.0f); m_int_configs[CONFIG_GROUP_VISIBILITY] = sConfig->GetIntDefault("Visibility.GroupMode", 1); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 868881b9510..a585be5ad84 100755 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -108,7 +108,6 @@ enum WorldBoolConfigs CONFIG_ALLOW_GM_GROUP, CONFIG_ALLOW_GM_FRIEND, CONFIG_GM_LOWER_SECURITY, - CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS, CONFIG_SKILL_PROSPECTING, CONFIG_SKILL_MILLING, CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY, @@ -227,6 +226,7 @@ enum WorldIntConfigs CONFIG_GM_WHISPERING_TO, CONFIG_GM_LEVEL_IN_GM_LIST, CONFIG_GM_LEVEL_IN_WHO_LIST, + CONFIG_GM_LEVEL_ALLOW_ACHIEVEMENTS, CONFIG_START_GM_LEVEL, CONFIG_GROUP_VISIBILITY, CONFIG_MAIL_DELIVERY_DELAY, diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index bedca0188bb..6a72b9c87bd 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -316,13 +316,18 @@ class boss_blood_queen_lana_thel : public CreatureScript DoCast(me, SPELL_BERSERK); break; case EVENT_VAMPIRIC_BITE: - if (Player* target = SelectRandomTarget(false)) + { + std::list<Player*> targets; + SelectRandomTarget(false, &targets); + if (!targets.empty()) { + Unit* target = targets.front(); DoCast(target, SPELL_VAMPIRIC_BITE); Talk(SAY_VAMPIRIC_BITE); _vampires.insert(target->GetGUID()); } break; + } case EVENT_BLOOD_MIRROR: { // victim can be NULL when this is processed in the same update tick as EVENT_AIR_PHASE @@ -453,7 +458,7 @@ class boss_blood_queen_lana_thel : public CreatureScript } std::list<Player*>::iterator itr = tempTargets.begin(); - std::advance(itr, urand(0, tempTargets.size()-1)); + std::advance(itr, urand(0, tempTargets.size() - 1)); return *itr; } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 3109c922914..db6e9dc74c9 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1894,12 +1894,14 @@ GM.AllowFriend = 0 GM.LowerSecurity = 0 # -# GM.AllowAchievementGain -# Description: Allow GM characters to obtain achievements. -# Default: 1 - (Enabled) -# 0 - (Disabled) +# GM.AllowAchievementGain.Level +# Description: Max GM level that can obtain achievements. +# Default: 3 - (Anyone) +# 0 - (Only players) +# 1 - (Only moderators) +# 2 - (Only gamemasters) -GM.AllowAchievementGain = 1 +GM.AllowAchievementGain.Level = 3 # # GM.TicketSystem.ChanceOfGMSurvey |