diff options
author | Vincent_Michael <Vincent_Michael@gmx.de> | 2014-01-13 20:34:21 +0100 |
---|---|---|
committer | Vincent_Michael <Vincent_Michael@gmx.de> | 2014-01-13 20:34:21 +0100 |
commit | cc85d1b5b75fc522b94783c99e212346429bfe4a (patch) | |
tree | e33b89094e1ca2154381a14ba3b0ad9d61d0a013 /src | |
parent | a73e8511f923812cd0059cbd66848e7e85cd8441 (diff) | |
parent | 88ecc9533a2d132d15f222b7b05eeb0f96930e21 (diff) |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts:
src/server/game/Entities/Player/Player.cpp
src/server/game/Spells/SpellMgr.cpp
src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
src/server/scripts/World/npcs_special.cpp
src/server/worldserver/worldserver.conf.dist
Diffstat (limited to 'src')
25 files changed, 192 insertions, 185 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 2cb24a8946f..99ac2ca6f25 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2550,7 +2550,10 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /* { ObjectListMap::iterator itr = mTargetStorage->find(e.target.stored.id); if (itr != mTargetStorage->end()) - l->assign(itr->second->begin(), itr->second->end()); + { + ObjectList* objectList = itr->second->GetObjectList(); + l->assign(objectList->begin(), objectList->end()); + } return l; } diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index 56b3674bd73..2e1068d1bff 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -99,13 +99,13 @@ class SmartScript if (mTargetStorage->find(id) != mTargetStorage->end()) { // check if already stored - if ((*mTargetStorage)[id] == targets) + if ((*mTargetStorage)[id]->Equals(targets)) return; delete (*mTargetStorage)[id]; } - (*mTargetStorage)[id] = targets; + (*mTargetStorage)[id] = new ObjectGuidList(targets, GetBaseObject()); } bool IsSmart(Creature* c = NULL) @@ -141,7 +141,7 @@ class SmartScript { ObjectListMap::iterator itr = mTargetStorage->find(id); if (itr != mTargetStorage->end()) - return (*itr).second; + return (*itr).second->GetObjectList(); return NULL; } diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 0556d46d11a..bd156381e87 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1322,7 +1322,56 @@ struct SmartScriptHolder typedef UNORDERED_MAP<uint32, WayPoint*> WPPath; typedef std::list<WorldObject*> ObjectList; -typedef UNORDERED_MAP<uint32, ObjectList*> ObjectListMap; +typedef std::list<uint64> GuidList; +class ObjectGuidList +{ + ObjectList* m_objectList; + GuidList* m_guidList; + WorldObject* m_baseObject; + +public: + ObjectGuidList(ObjectList* objectList, WorldObject* baseObject) + { + ASSERT(objectList != NULL); + ASSERT(baseObject != NULL); + m_objectList = objectList; + m_baseObject = baseObject; + m_guidList = new GuidList(); + + for (ObjectList::iterator itr = objectList->begin(); itr != objectList->end(); ++itr) + { + m_guidList->push_back((*itr)->GetGUID()); + } + } + + ObjectList* GetObjectList() + { + //sanitize list using m_guidList + m_objectList->clear(); + + for (GuidList::iterator itr = m_guidList->begin(); itr != m_guidList->end(); ++itr) + { + if (WorldObject* obj = ObjectAccessor::GetWorldObject(*m_baseObject, *itr)) + m_objectList->push_back(obj); + else + TC_LOG_DEBUG("scripts.ai", "SmartScript::mTargetStorage stores a guid to an invalid object: " UI64FMTD, *itr); + } + + return m_objectList; + } + + bool Equals(ObjectList* objectList) + { + return m_objectList == objectList; + } + + ~ObjectGuidList() + { + delete m_objectList; + delete m_guidList; + } +}; +typedef UNORDERED_MAP<uint32, ObjectGuidList*> ObjectListMap; class SmartWaypointMgr { diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 146559c789b..7c81db402ac 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1032,6 +1032,8 @@ void Battleground::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac player->SpawnCorpseBones(); } } + else // try to resurrect the offline player. If he is alive nothing will happen + sObjectAccessor->ConvertCorpseForPlayer(guid); RemovePlayer(player, guid, team); // BG subclass specific code diff --git a/src/server/game/Chat/ChatLink.h b/src/server/game/Chat/ChatLink.h index 7bb8191be9a..e9573a631e4 100644 --- a/src/server/game/Chat/ChatLink.h +++ b/src/server/game/Chat/ChatLink.h @@ -57,7 +57,7 @@ class ItemChatLink : public ChatLink { public: ItemChatLink() : ChatLink(), _item(NULL), _suffix(NULL), _property(NULL) - { + { memset(_data, 0, sizeof(_data)); } virtual bool Initialize(std::istringstream& iss); @@ -102,7 +102,7 @@ class AchievementChatLink : public ChatLink { public: AchievementChatLink() : ChatLink(), _guid(0), _achievement(NULL) - { + { memset(_data, 0, sizeof(_data)); } virtual bool Initialize(std::istringstream& iss); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 67093e4d5ff..0c99fac09be 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -611,7 +611,7 @@ class MapObject protected: MapObject() : _moveState(MAP_OBJECT_CELL_MOVE_NONE) - { + { _newPosition.Relocate(0.0f, 0.0f, 0.0f, 0.0f); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 636ea688e45..67b2b1a1988 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7249,8 +7249,8 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto { // Check if allowed to receive it in current map uint8 MapType = sWorld->getIntConfig(CONFIG_PVP_TOKEN_MAP_TYPE); - if ((MapType == 1 && !InBattleground() && !HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP)) - || (MapType == 2 && !HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP)) + if ((MapType == 1 && !InBattleground() && !IsFFAPvP()) + || (MapType == 2 && !IsFFAPvP()) || (MapType == 3 && !InBattleground())) return true; @@ -15166,11 +15166,11 @@ bool Player::CanRewardQuest(Quest const* quest, uint32 reward, bool msg) if (!CanRewardQuest(quest, msg)) return false; + ItemPosCountVec dest; if (quest->GetRewChoiceItemsCount() > 0) { if (quest->RewardChoiceItemId[reward]) { - ItemPosCountVec dest; InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardChoiceItemId[reward], quest->RewardChoiceItemCount[reward]); if (res != EQUIP_ERR_OK) { @@ -15186,7 +15186,6 @@ bool Player::CanRewardQuest(Quest const* quest, uint32 reward, bool msg) { if (quest->RewardItemId[i]) { - ItemPosCountVec dest; InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardItemId[i], quest->RewardItemIdCount[i]); if (res != EQUIP_ERR_OK) { @@ -17448,49 +17447,56 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) // NOW player must have valid map // load the player's map here if it's not already loaded Map* map = sMapMgr->CreateMap(mapId, this); + AreaTriggerStruct const* areaTrigger = NULL; + bool check = false; if (!map) { - instanceId = 0; - AreaTriggerStruct const* at = sObjectMgr->GetGoBackTrigger(mapId); - if (at) + areaTrigger = sObjectMgr->GetGoBackTrigger(mapId); + check = true; + } + else if (map->IsDungeon()) // if map is dungeon... + { + if (!((InstanceMap*)map)->CanEnter(this)) // ... and can't enter map, then look for entry point. { - TC_LOG_ERROR("entities.player", "Player (guidlow %d) is teleported to gobacktrigger (Map: %u X: %f Y: %f Z: %f O: %f).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); - Relocate(at->target_X, at->target_Y, at->target_Z, GetOrientation()); - mapId = at->target_mapId; + areaTrigger = sObjectMgr->GetGoBackTrigger(mapId); + check = true; } - else + else if (instanceId && !sInstanceSaveMgr->GetInstanceSave(instanceId)) // ... and instance is reseted then look for entrance. { - TC_LOG_ERROR("entities.player", "Player (guidlow %d) is teleported to home (Map: %u X: %f Y: %f Z: %f O: %f).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); - RelocateToHomebind(); + areaTrigger = sObjectMgr->GetMapEntranceTrigger(mapId); + check = true; } + } - map = sMapMgr->CreateMap(mapId, this); - if (!map) + if (check) // in case of special event when creating map... + { + if (areaTrigger) // ... if we have an areatrigger, then relocate to new map/coordinates. { - PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); - mapId = info->mapId; - Relocate(info->positionX, info->positionY, info->positionZ, 0.0f); - TC_LOG_ERROR("entities.player", "Player (guidlow %d) have invalid coordinates (X: %f Y: %f Z: %f O: %f). Teleport to default race/class locations.", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); - map = sMapMgr->CreateMap(mapId, this); - if (!map) + Relocate(areaTrigger->target_X, areaTrigger->target_Y, areaTrigger->target_Z, GetOrientation()); + if (mapId != areaTrigger->target_mapId) { - TC_LOG_ERROR("entities.player", "Player (guidlow %d) has invalid default map coordinates (X: %f Y: %f Z: %f O: %f). or instance couldn't be created", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); - return false; + mapId = areaTrigger->target_mapId; + map = sMapMgr->CreateMap(mapId, this); } } + else + { + TC_LOG_ERROR("entities.player", "Player %s (guid: %d) Map: %u, X: %f, Y: %f, Z: %f, O: %f. Areatrigger not found.", m_name.c_str(), guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); + map = NULL; + } } - // if the player is in an instance and it has been reset in the meantime teleport him to the entrance - if (instanceId && !sInstanceSaveMgr->GetInstanceSave(instanceId) && !map->IsBattlegroundOrArena()) + if (!map) { - AreaTriggerStruct const* at = sObjectMgr->GetMapEntranceTrigger(mapId); - if (at) - Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation); - else + PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); + mapId = info->mapId; + Relocate(info->positionX, info->positionY, info->positionZ, 0.0f); + map = sMapMgr->CreateMap(mapId, this); + if (!map) { - TC_LOG_ERROR("entities.player", "Player %s(GUID: %u) logged in to a reset instance (map: %u) and there is no area-trigger leading to this map. Thus he can't be ported back to the entrance. This _might_ be an exploit attempt.", GetName().c_str(), GetGUIDLow(), mapId); - RelocateToHomebind(); + TC_LOG_ERROR("entities.player", "Player %s (guid: %d) Map: %u, X: %f, Y: %f, Z: %f, O: %f. Invalid default map coordinates or instance couldn't be created.", m_name.c_str(), guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); + return false; } } @@ -17537,6 +17543,12 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) m_atLoginFlags = fields[34].GetUInt16(); + if (HasAtLoginFlag(AT_LOGIN_RENAME)) + { + TC_LOG_ERROR("entities.player", "Player (GUID: %u) tried to login while forced to rename, can't load.'", GetGUIDLow()); + return false; + } + // Honor system // Update Honor kills data m_lastHonorUpdateTime = logoutTime; @@ -22231,14 +22243,14 @@ void Player::UpdatePvPState(bool onlyFFA) if (!pvpInfo.IsInNoPvPArea && !IsGameMaster() && (pvpInfo.IsInFFAPvPArea || sWorld->IsFFAPvPRealm())) { - if (!HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP)) + if (!IsFFAPvP()) { SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP); for (ControlList::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) (*itr)->SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP); } } - else if (HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP)) + else if (IsFFAPvP()) { RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP); for (ControlList::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 0685206dcb8..44c2b4a8da9 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9935,7 +9935,7 @@ bool Unit::IsServiceProvider() const void Unit::SetInCombatWith(Unit* enemy) { Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf(); - if (eOwner->IsPvP()) + if (eOwner->IsPvP() || eOwner->IsFFAPvP()) { SetInCombatState(true, enemy); return; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 2a6ccf4effa..ed26722931f 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1423,6 +1423,7 @@ class Unit : public WorldObject void GetPartyMembers(std::list<Unit*> &units); bool IsContestedGuard() const; bool IsPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP); } + bool IsFFAPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP); } void SetPvP(bool state); uint32 GetCreatureType() const; uint32 GetCreatureTypeMask() const; diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index d946eb81956..8fb3935e74c 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -955,7 +955,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke playerStatus |= MEMBER_STATUS_DEAD; } - if (player->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP)) + if (player->IsFFAPvP()) playerStatus |= MEMBER_STATUS_PVP_FFA; if (player->isAFK()) @@ -1218,7 +1218,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData) playerStatus |= MEMBER_STATUS_DEAD; } - if (player->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP)) + if (player->IsFFAPvP()) playerStatus |= MEMBER_STATUS_PVP_FFA; if (player->isAFK()) diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index c05d7804948..aabb117ef50 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -96,11 +96,11 @@ class MotionMaster //: private std::stack<MovementGenerator *> } void push(_Ty _Val) { ++_top; Impl[_top] = _Val; } - bool needInitTop() const - { + bool needInitTop() const + { if (empty()) return false; - return _needInit[_top]; + return _needInit[_top]; } void InitTop(); public: @@ -120,15 +120,15 @@ class MotionMaster //: private std::stack<MovementGenerator *> bool empty() const { return (_top < 0); } int size() const { return _top + 1; } - _Ty top() const - { + _Ty top() const + { ASSERT(!empty()); - return Impl[_top]; + return Impl[_top]; } - _Ty GetMotionSlot(int slot) const - { + _Ty GetMotionSlot(int slot) const + { ASSERT(slot >= 0); - return Impl[slot]; + return Impl[slot]; } void DirectDelete(_Ty curr); diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp index 5428f49ac13..c351aeecd51 100644 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp @@ -25,6 +25,7 @@ #include "MoveSplineInit.h" #include "MoveSpline.h" #include "Player.h" +#include "VMapFactory.h" #define MIN_QUIET_DISTANCE 28.0f #define MAX_QUIET_DISTANCE 43.0f @@ -43,6 +44,20 @@ void FleeingMovementGenerator<T>::_setTargetLocation(T* owner) float x, y, z; _getPoint(owner, x, y, z); + // Add LOS check for target point + Position mypos; + owner->GetPosition(&mypos); + bool isInLOS = VMAP::VMapFactory::createOrGetVMapManager()->isInLineOfSight(owner->GetMapId(), + mypos.m_positionX, + mypos.m_positionY, + mypos.m_positionZ + 2.0f, + x, y, z + 2.0f); + if (!isInLOS) + { + i_nextCheckTime.Reset(200); + return; + } + PathGenerator path(owner); bool result = path.CalculatePath(x, y, z); if (!result || (path.GetPathType() & PATHFIND_NOPATH)) diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 404726252b8..daa6c1f7c93 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3120,6 +3120,9 @@ void SpellMgr::LoadSpellInfoCorrections() case 42730: // Woe Strike spellInfo->Effects[EFFECT_1].TriggerSpell = 42739; break; + case 42436: // Drink! (Brewfest) + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); + break; case 59735: // Woe Strike spellInfo->Effects[EFFECT_1].TriggerSpell = 59736; break; diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 2462fc203d2..4611a4da884 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -32,7 +32,7 @@ Warden::Warden() : _session(NULL), _inputCrypto(16), _outputCrypto(16), _checkTimer(10000/*10 sec*/), _clientResponseTimer(0), _dataSent(false), _previousTimestamp(0), _module(NULL), _initialized(false) -{ +{ memset(_inputKey, 0, sizeof(_inputKey)); memset(_outputKey, 0, sizeof(_outputKey)); memset(_seed, 0, sizeof(_seed)); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index c626fb857d4..56c62f710cb 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -444,27 +444,27 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_ENABLE_SINFO_LOGIN] = sConfigMgr->GetIntDefault("Server.LoginInfo", 0); ///- Read all rates from the config file - rate_values[RATE_HEALTH] = sConfigMgr->GetFloatDefault("Rate.Health", 1); + rate_values[RATE_HEALTH] = sConfigMgr->GetFloatDefault("Rate.Health", 1.0f); if (rate_values[RATE_HEALTH] < 0) { TC_LOG_ERROR("server.loading", "Rate.Health (%f) must be > 0. Using 1 instead.", rate_values[RATE_HEALTH]); rate_values[RATE_HEALTH] = 1; } - rate_values[RATE_POWER_MANA] = sConfigMgr->GetFloatDefault("Rate.Mana", 1); + rate_values[RATE_POWER_MANA] = sConfigMgr->GetFloatDefault("Rate.Mana", 1.0f); if (rate_values[RATE_POWER_MANA] < 0) { TC_LOG_ERROR("server.loading", "Rate.Mana (%f) must be > 0. Using 1 instead.", rate_values[RATE_POWER_MANA]); rate_values[RATE_POWER_MANA] = 1; } - rate_values[RATE_POWER_RAGE_INCOME] = sConfigMgr->GetFloatDefault("Rate.Rage.Income", 1); - rate_values[RATE_POWER_RAGE_LOSS] = sConfigMgr->GetFloatDefault("Rate.Rage.Loss", 1); + rate_values[RATE_POWER_RAGE_INCOME] = sConfigMgr->GetFloatDefault("Rate.Rage.Income", 1.0f); + rate_values[RATE_POWER_RAGE_LOSS] = sConfigMgr->GetFloatDefault("Rate.Rage.Loss", 1.0f); if (rate_values[RATE_POWER_RAGE_LOSS] < 0) { TC_LOG_ERROR("server.loading", "Rate.Rage.Loss (%f) must be > 0. Using 1 instead.", rate_values[RATE_POWER_RAGE_LOSS]); rate_values[RATE_POWER_RAGE_LOSS] = 1; } - rate_values[RATE_POWER_RUNICPOWER_INCOME] = sConfigMgr->GetFloatDefault("Rate.RunicPower.Income", 1); - rate_values[RATE_POWER_RUNICPOWER_LOSS] = sConfigMgr->GetFloatDefault("Rate.RunicPower.Loss", 1); + rate_values[RATE_POWER_RUNICPOWER_INCOME] = sConfigMgr->GetFloatDefault("Rate.RunicPower.Income", 1.0f); + rate_values[RATE_POWER_RUNICPOWER_LOSS] = sConfigMgr->GetFloatDefault("Rate.RunicPower.Loss", 1.0f); if (rate_values[RATE_POWER_RUNICPOWER_LOSS] < 0) { TC_LOG_ERROR("server.loading", "Rate.RunicPower.Loss (%f) must be > 0. Using 1 instead.", rate_values[RATE_POWER_RUNICPOWER_LOSS]); @@ -658,8 +658,8 @@ void World::LoadConfigSettings(bool reload) m_float_configs[CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE] = sConfigMgr->GetFloatDefault("MaxRecruitAFriendBonusDistance", 100.0f); /// @todo Add MonsterSight and GuarderSight (with meaning) in worldserver.conf or put them as define - m_float_configs[CONFIG_SIGHT_MONSTER] = sConfigMgr->GetFloatDefault("MonsterSight", 50); - m_float_configs[CONFIG_SIGHT_GUARDER] = sConfigMgr->GetFloatDefault("GuarderSight", 50); + m_float_configs[CONFIG_SIGHT_MONSTER] = sConfigMgr->GetFloatDefault("MonsterSight", 50.0f); + m_float_configs[CONFIG_SIGHT_GUARDER] = sConfigMgr->GetFloatDefault("GuarderSight", 50.0f); if (reload) { @@ -3259,6 +3259,10 @@ void World::UpdateCharacterNameData(uint32 guid, std::string const& name, uint8 if (race != RACE_NONE) itr->second.m_race = race; + + WorldPacket data(SMSG_INVALIDATE_PLAYER, 8); + data << MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER); + SendGlobalMessage(&data); } void World::UpdateCharacterNameDataLevel(uint32 guid, uint8 level) diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index 0b50375b809..045564ce570 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -467,7 +467,7 @@ public: CallDragon(DATA_TENEBRON); break; case EVENT_CALL_SHADRON: - CallDragon(DATA_SHADRON); + CallDragon(DATA_SHADRON); break; case EVENT_CALL_VESPERON: CallDragon(DATA_VESPERON); diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp index aa6bb11447b..93e52c4da73 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp @@ -195,8 +195,8 @@ public: struct npc_crystal_spike_triggerAI : public ScriptedAI { - npc_crystal_spike_triggerAI(Creature* creature) : ScriptedAI(creature) - { + npc_crystal_spike_triggerAI(Creature* creature) : ScriptedAI(creature) + { _count = 0; _despawntimer = 0; } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index c46158b0f7a..2a24b1145c0 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -258,7 +258,7 @@ class boss_svala : public CreatureScript case EVENT_INTRO_TRANSFORM_0: { if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) - arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, false); + arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, true); Position pos; pos.Relocate(me); pos.m_positionZ += 8.0f; diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index cbad220aed6..0173454ef28 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -428,8 +428,8 @@ public: struct npc_jennyAI : public ScriptedAI { - npc_jennyAI(Creature* creature) : ScriptedAI(creature) - { + npc_jennyAI(Creature* creature) : ScriptedAI(creature) + { setCrateNumber = false; } diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index 83b4f0440e0..cc58be26664 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -1125,7 +1125,7 @@ public: struct npc_oscillating_frequency_scanner_master_bunnyAI : public ScriptedAI { - npc_oscillating_frequency_scanner_master_bunnyAI(Creature* creature) : ScriptedAI(creature) + npc_oscillating_frequency_scanner_master_bunnyAI(Creature* creature) : ScriptedAI(creature) { playerGuid = 0; } diff --git a/src/server/scripts/Pet/pet_dk.cpp b/src/server/scripts/Pet/pet_dk.cpp index daeb0d71720..61c3de0e6b1 100644 --- a/src/server/scripts/Pet/pet_dk.cpp +++ b/src/server/scripts/Pet/pet_dk.cpp @@ -54,7 +54,7 @@ class npc_pet_dk_ebon_gargoyle : public CreatureScript uint64 ownerGuid = me->GetOwnerGUID(); if (!ownerGuid) return; - + // Find victim of Summon Gargoyle spell std::list<Unit*> targets; Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 30.0f); diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 50017f01dc8..a8f4360483d 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -34,7 +34,6 @@ npc_garments_of_quests 80% NPC's related to all Garments of-quests 5621, 56 npc_injured_patient 100% patients for triage-quests (6622 and 6624) npc_doctor 100% Gustaf Vanhowzen and Gregory Victor, quest 6622 and 6624 (Triage) npc_mount_vendor 100% Regular mount vendors all over the world. Display gossip if player doesn't meet the requirements to buy -npc_rogue_trainer 80% Scripted trainers, so they are able to offer item 17126 for class quest 6681 npc_sayge 100% Darkmoon event fortune teller, buff player based on answers given npc_snake_trap_serpents 80% AI for snakes that summoned by Snake Trap npc_shadowfiend 100% restore 5% of owner's mana when shadowfiend die from damage @@ -1234,87 +1233,6 @@ public: }; /*###### -## npc_rogue_trainer -######*/ - -#define GOSSIP_HELLO_ROGUE1 "I wish to unlearn my talents" -#define GOSSIP_HELLO_ROGUE2 "<Take the letter>" -#define GOSSIP_HELLO_ROGUE3 "Purchase a Dual Talent Specialization." - -class npc_rogue_trainer : public CreatureScript -{ -public: - npc_rogue_trainer() : CreatureScript("npc_rogue_trainer") { } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsTrainer()) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - - if (player->getClass() == CLASS_ROGUE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_HELLO_ROGUE1, GOSSIP_SENDER_MAIN, GOSSIP_OPTION_UNLEARNTALENTS); - - if (player->GetSpecsCount() == 1 && player->getLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL)) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_HELLO_ROGUE3, GOSSIP_SENDER_MAIN, GOSSIP_OPTION_LEARNDUALSPEC); - - if (player->getClass() == CLASS_ROGUE && player->getLevel() >= 24 && !player->HasItemCount(17126) && !player->GetQuestRewardStatus(6681)) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_ROGUE2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(5996, creature->GetGUID()); - } else - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, 21100, false); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - case GOSSIP_OPTION_UNLEARNTALENTS: - player->CLOSE_GOSSIP_MENU(); - player->SendTalentWipeConfirm(creature->GetGUID()); - break; - case GOSSIP_OPTION_LEARNDUALSPEC: - if (player->GetSpecsCount() == 1 && !(player->getLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))) - { - if (!player->HasEnoughMoney(uint64(10000000))) - { - player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); - player->PlayerTalkClass->SendCloseGossip(); - break; - } - else - { - player->ModifyMoney(int64(-10000000)); - - // Cast spells that teach dual spec - // Both are also ImplicitTarget self and must be cast by player - player->CastSpell(player, 63680, true, NULL, NULL, player->GetGUID()); - player->CastSpell(player, 63624, true, NULL, NULL, player->GetGUID()); - - // Should show another Gossip text with "Congratulations..." - player->PlayerTalkClass->SendCloseGossip(); - } - } - break; - } - return true; - } -}; - -/*###### ## npc_sayge ######*/ @@ -2439,7 +2357,6 @@ void AddSC_npcs_special() new npc_garments_of_quests(); new npc_guardian(); new npc_mount_vendor(); - new npc_rogue_trainer(); new npc_sayge(); new npc_steam_tonk(); new npc_tonk_mine(); diff --git a/src/server/shared/Utilities/EventProcessor.h b/src/server/shared/Utilities/EventProcessor.h index fd8b2909165..10ae6aa954c 100644 --- a/src/server/shared/Utilities/EventProcessor.h +++ b/src/server/shared/Utilities/EventProcessor.h @@ -28,9 +28,9 @@ class BasicEvent { public: - BasicEvent() - { - to_Abort = false; + BasicEvent() + { + to_Abort = false; m_addTime = 0; m_execTime = 0; } diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp index 67af12660de..f4b2b542de6 100644 --- a/src/server/worldserver/Master.cpp +++ b/src/server/worldserver/Master.cpp @@ -86,8 +86,8 @@ private: uint32 _lastChange; uint32 _delaytime; public: - FreezeDetectorRunnable() - { + FreezeDetectorRunnable() + { _loops = 0; _lastChange = 0; _delaytime = 0; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 27e570c697f..0bd90e84def 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -139,7 +139,7 @@ WorldServerPort = 8085 # # BindIP -# Description: Bind world server to IP/hostname +# Description: Bind world server to IP/hostname. # Default: "0.0.0.0" - (Bind to all IPs on the system) BindIP = "0.0.0.0" @@ -153,7 +153,7 @@ BindIP = "0.0.0.0" # UseProcessors # Description: Processors mask for Windows and Linux based multi-processor systems. # Example: A computer with 2 CPUs: -# 1 - 1st CPU only, 2 - 2nd CPU only, 3 - 1st and 2nd CPU, because 1 | 2 is 3 +# 1 - 1st CPU only, 2 - 2nd CPU only, 3 - 1st and 2nd CPU, because 1 | 2 is 3 # Default: 0 - (Selected by OS) # 1+ - (Bit mask value of selected processors) @@ -170,7 +170,7 @@ ProcessPriority = 0 # # Compression -# Description: Compression level for client update packages +# Description: Compression level for client update packages. # Range: 1-9 # Default: 1 - (Speed) # 9 - (Best compression) @@ -276,7 +276,7 @@ PlayerSave.Stats.SaveOnlyOnLogout = 1 # # mmap.enablePathFinding -# Description: Enable/Disable pathfinding using mmaps - experimental +# Description: Enable/Disable pathfinding using mmaps - experimental. # Default: 0 - (Disabled) # 1 - (Enabled) @@ -396,7 +396,7 @@ PersistentCharacterCleanFlags = 0 # SERVER LOGGING # # PidFile -# Description: World daemon PID file +# Description: World daemon PID file. # Example: "./world.pid" - (Enabled) # Default: "" - (Disabled) @@ -441,7 +441,6 @@ ChatLogs.SysChan = 0 # Default: 0 - (Disabled) # 1 - (Enabled) - ChatLogs.Party = 0 # @@ -450,7 +449,6 @@ ChatLogs.Party = 0 # Default: 0 - (Disabled) # 1 - (Enabled) - ChatLogs.Raid = 0 # @@ -699,6 +697,7 @@ CharacterCreating.Disabled.ClassMask = 0 # Default: 50 CharactersPerAccount = 50 + # # CharactersPerRealm # Description: Limit number of characters per account on this realm. @@ -718,7 +717,7 @@ HeroicCharactersPerRealm = 1 # # CharacterCreating.MinLevelForHeroicCharacter # Description: Limit creating heroic characters only for account with another -# character of specific level (ignored for GM accounts) +# character of specific level (ignored for GM accounts). # Default: 55 - (Enabled, Requires at least another level 55 character) # 0 - (Disabled) # 1 - (Enabled, Requires at least another level 1 character) @@ -746,7 +745,7 @@ MaxPlayerLevel = 85 # # MinDualSpecLevel -# Description: Level requirement for Dual Talent Specialization +# Description: Level requirement for Dual Talent Specialization. # Default: 30 MinDualSpecLevel = 30 @@ -877,6 +876,7 @@ Instance.UnloadDelay = 1800000 # true - (Enabled, show) InstancesResetAnnounce = false + # # Quests.LowLevelHideDiff # Description: Level difference between player and quest level at which quests are @@ -1099,7 +1099,7 @@ DBC.EnforceItemAttributes = 1 # # AccountInstancesPerHour -# Description: Controls the max amount of different instances player can enter within hour +# Description: Controls the max amount of different instances player can enter within hour. # Default: 5 AccountInstancesPerHour = 5 @@ -1787,7 +1787,7 @@ Rate.Damage.Fall = 1 # Rate.Auction.Deposit # Rate.Auction.Cut # Description: Auction rates (auction time, deposit get at auction start, -# auction cut from price at auction end) +# auction cut from price at auction end). # Default: 1 - (Rate.Auction.Time) # 1 - (Rate.Auction.Deposit) # 1 - (Rate.Auction.Cut) @@ -1986,14 +1986,14 @@ Die.Command.Mode = 1 # STATS LIMITS # # Stats.Limits.Enable -# Description: Enable or disable stats system +# Description: Enable or disable stats system. # Default: 0 - Disabled Stats.Limits.Enable = 0 # # Stats.Limit.[STAT] -# Description: Set percentage limit for dodge, parry, block and crit rating +# Description: Set percentage limit for dodge, parry, block and crit rating. # Default: 95.0 (95%) Stats.Limits.Dodge = 95.0 @@ -2110,7 +2110,7 @@ Battleground.Random.ResetHour = 6 # Battleground.RewardWinnerConquestLast # Battleground.RewardLoserHonorFirst # Battleground.RewardLoserHonorLast -# Description: Random Battlegrounds / call to the arms rewards +# Description: Random Battlegrounds / call to the arms rewards. # Default: 30 - Battleground.RewardWinnerHonorFirst # 25 - Battleground.RewardWinnerArenaFirst # 15 - Battleground.RewardWinnerHonorLast @@ -2206,7 +2206,7 @@ Arena.RatingDiscardTimer = 600000 # # Arena.RatedUpdateTimer -# Description: Time (in milliseconds) between checks for matchups in rated arena +# Description: Time (in milliseconds) between checks for matchups in rated arena. # Default: 5000 - (5 seconds) Arena.RatedUpdateTimer = 5000 @@ -2360,7 +2360,7 @@ Ra.MinLevel = 3 # # SOAP.Enable -# Description: Enable soap service +# Description: Enable soap service. # Default: 0 - (Disabled) # 1 - (Enabled) @@ -2368,7 +2368,7 @@ SOAP.Enabled = 0 # # SOAP.IP -# Description: Bind SOAP service to IP/hostname +# Description: Bind SOAP service to IP/hostname. # Default: "127.0.0.1" - (Bind to localhost) SOAP.IP = "127.0.0.1" @@ -2522,7 +2522,7 @@ Guild.AllowMultipleGuildMaster = 0 # # ShowKickInWorld # Description: Determines whether a message is broadcasted to the entire server when a -# player gets kicked +# player gets kicked. # Default: 0 - (Disabled) # 1 - (Enabled) @@ -2537,6 +2537,7 @@ ShowKickInWorld = 0 # 0 - (Disabled) RecordUpdateTimeDiffInterval = 60000 + # # MinRecordUpdateTimeDiff # Description: Only record update time diff which is greater than this value. @@ -2596,8 +2597,8 @@ PlayerDump.DisallowOverwrite = 1 # # UI.ShowQuestLevelsInDialogs # Description: Show quest levels next to quest titles in UI dialogs -# Example: [13] Westfall Stew -# Default: 0 (do not show) +# Example: [13] Westfall Stew +# Default: 0 - (Do not show) UI.ShowQuestLevelsInDialogs = 0 @@ -2609,7 +2610,7 @@ UI.ShowQuestLevelsInDialogs = 0 # # Appender config values: Given a appender "name" # Appender.name -# Description: Defines 'where to log' +# Description: Defines 'where to log'. # Format: Type,LogLevel,Flags,optional1,optional2,optional3 # # Type @@ -2901,18 +2902,18 @@ Currency.ConquestPointsArenaReward = 180 # # PacketSpoof.Policy # Description: Determines the course of action when packet spoofing is detected. -# Default: 1 - Log + kick -# 0 - Log only ("network") -# 2 - Log + kick + ban +# Default: 1 - (Log + kick) +# 0 - (Log only 'network') +# 2 - (Log + kick + ban) PacketSpoof.Policy = 1 # # PacketSpoof.BanMode # Description: If PacketSpoof.Policy equals 2, this will determine the ban mode. -# Note: Banning by character not supported for logical reasons. -# Default: 0 - Ban Account -# 2 - Ban IP +# Note: Banning by character not supported for logical reasons. +# Default: 0 - Ban Account +# 2 - Ban IP # PacketSpoof.BanMode = 0 |