diff options
Diffstat (limited to 'src')
25 files changed, 594 insertions, 587 deletions
diff --git a/src/server/game/AI/CoreAI/CombatAI.cpp b/src/server/game/AI/CoreAI/CombatAI.cpp index 12f3f76c069..b90ee7fe7d8 100755 --- a/src/server/game/AI/CoreAI/CombatAI.cpp +++ b/src/server/game/AI/CoreAI/CombatAI.cpp @@ -311,8 +311,8 @@ void VehicleAI::CheckConditions(const uint32 diff) { if (!conditions.empty()) { - for (SeatMap::iterator itr = m_vehicle->m_Seats.begin(); itr != m_vehicle->m_Seats.end(); ++itr) - if (Unit* passenger = ObjectAccessor::GetUnit(*m_vehicle->GetBase(), itr->second.passenger)) + for (SeatMap::iterator itr = m_vehicle->Seats.begin(); itr != m_vehicle->Seats.end(); ++itr) + if (Unit* passenger = ObjectAccessor::GetUnit(*m_vehicle->GetBase(), itr->second.Passenger)) { if (Player* plr = passenger->ToPlayer()) { diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index e139c96a108..bcca2dcd6e4 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -142,9 +142,8 @@ lootForPickPocketed(false), lootForBody(false), m_groupLootTimer(0), lootingGrou m_PlayerDamageReq(0), m_lootMoney(0), m_lootRecipient(0), m_lootRecipientGroup(0), m_corpseRemoveTime(0), m_respawnTime(0), m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_reactState(REACT_AGGRESSIVE), m_defaultMovementType(IDLE_MOTION_TYPE), m_DBTableGuid(0), m_equipmentId(0), m_AlreadyCallAssistance(false), -m_AlreadySearchedAssistance(false), m_regenHealth(true), m_AI_locked(false), m_isDeadByDefault(false), -m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_creatureInfo(NULL), m_creatureData(NULL), -m_formation(NULL) +m_AlreadySearchedAssistance(false), m_regenHealth(true), m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), +m_creatureInfo(NULL), m_creatureData(NULL), m_formation(NULL) { m_regenTimer = CREATURE_REGEN_INTERVAL; m_valuesCount = UNIT_END; @@ -229,7 +228,7 @@ void Creature::SearchFormation() void Creature::RemoveCorpse(bool setSpawnTime) { - if ((getDeathState() != CORPSE && !m_isDeadByDefault) || (getDeathState() != ALIVE && m_isDeadByDefault)) + if (getDeathState() != CORPSE) return; m_corpseRemoveTime = time(NULL); @@ -471,9 +470,6 @@ void Creature::Update(uint32 diff) } case CORPSE: { - if (m_isDeadByDefault) - break; - if (m_groupLootTimer && lootingGroupLowGUID) { // for delayed spells @@ -504,15 +500,6 @@ void Creature::Update(uint32 diff) } case ALIVE: { - if (m_isDeadByDefault) - { - if (m_corpseRemoveTime <= time(NULL)) - { - RemoveCorpse(false); - sLog->outStaticDebug("Removing alive corpse... %u ", GetUInt32Value(OBJECT_FIELD_ENTRY)); - } - } - Unit::Update(diff); // creature can be dead after Unit::Update call @@ -1082,7 +1069,6 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) data.currentwaypoint = 0; data.curhealth = GetHealth(); data.curmana = GetPower(POWER_MANA); - data.is_dead = m_isDeadByDefault; // prevent add data integrity problems data.movementType = !m_respawnradius && GetDefaultMovementType() == RANDOM_MOTION_TYPE ? IDLE_MOTION_TYPE : GetDefaultMovementType(); @@ -1114,7 +1100,6 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) << (uint32) (0) << ", " //currentwaypoint << GetHealth() << ", " //curhealth << GetPower(POWER_MANA) << ", " //curmana - << (m_isDeadByDefault ? 1 : 0) << ", " //is_dead << GetDefaultMovementType() << ", " //default movement generator type << npcflag << ", " << unit_flags << ", " @@ -1292,8 +1277,7 @@ bool Creature::LoadFromDB(uint32 guid, Map *map) m_respawnradius = data->spawndist; m_respawnDelay = data->spawntimesecs; - m_isDeadByDefault = data->is_dead; - m_deathState = m_isDeadByDefault ? DEAD : ALIVE; + m_deathState = ALIVE; m_respawnTime = sObjectMgr->GetCreatureRespawnTime(m_DBTableGuid, GetInstanceId()); if (m_respawnTime) // respawn on Update @@ -1404,7 +1388,7 @@ bool Creature::isVisibleForInState(WorldObject const* seer) const if (!Unit::isVisibleForInState(seer)) return false; - if (isAlive() || (m_isDeadByDefault && m_deathState == CORPSE) || m_corpseRemoveTime > time(NULL)) + if (isAlive() || m_corpseRemoveTime > time(NULL)) return true; return false; @@ -1495,7 +1479,9 @@ float Creature::GetAttackDistance(Unit const* pl) const void Creature::setDeathState(DeathState s) { - if ((s == JUST_DIED && !m_isDeadByDefault)||(s == JUST_ALIVED && m_isDeadByDefault)) + Unit::setDeathState(s); + + if (s == JUST_DIED) { m_corpseRemoveTime = time(NULL) + m_corpseDelay; m_respawnTime = time(NULL) + m_respawnDelay + m_corpseDelay; @@ -1503,11 +1489,7 @@ void Creature::setDeathState(DeathState s) // always save boss respawn time at death to prevent crash cheating if (sWorld->getBoolConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY) || isWorldBoss()) SaveRespawnTime(); - } - Unit::setDeathState(s); - if (s == JUST_DIED) - { SetUInt64Value(UNIT_FIELD_TARGET, 0); // remove target selection in any cases (can be set at aura remove in Unit::setDeathState) SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); @@ -1608,15 +1590,7 @@ void Creature::Respawn(bool force) CreatureTemplate const *cinfo = GetCreatureInfo(); SelectLevel(cinfo); - if (m_isDeadByDefault) - { - setDeathState(JUST_DIED); - i_motionMaster.Clear(); - ClearUnitState(uint32(UNIT_STAT_ALL_STATE)); - LoadCreaturesAddon(true); - } - else - setDeathState(JUST_ALIVED); + setDeathState(JUST_ALIVED); uint32 displayID = GetNativeDisplayId(); CreatureModelInfo const *minfo = sObjectMgr->GetCreatureModelRandomGender(&displayID); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 45429a9206e..a50c499e9e8 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -254,7 +254,6 @@ struct CreatureData uint32 currentwaypoint; uint32 curhealth; uint32 curmana; - bool is_dead; uint8 movementType; uint8 spawnMask; uint32 npcflag; @@ -603,7 +602,6 @@ class Creature : public Unit, public GridObject<Creature> void SetCurrentCell(Cell const& cell) { m_currentCell = cell; } void RemoveCorpse(bool setSpawnTime = true); - bool isDeadByDefault() const { return m_isDeadByDefault; }; void ForcedDespawn(uint32 timeMSToDespawn = 0); void DespawnOrUnsummon(uint32 msTimeToDespawn = 0); @@ -656,7 +654,6 @@ class Creature : public Unit, public GridObject<Creature> void SetFormation(CreatureGroup *formation) {m_formation = formation;} Unit *SelectVictim(); - void SetDeadByDefault (bool death_state) {m_isDeadByDefault = death_state;} void SetDisableReputationGain(bool disable) { DisableReputationGain = disable; } bool IsReputationGainDisabled() { return DisableReputationGain; } @@ -713,7 +710,6 @@ class Creature : public Unit, public GridObject<Creature> bool m_AlreadySearchedAssistance; bool m_regenHealth; bool m_AI_locked; - bool m_isDeadByDefault; SpellSchoolMask m_meleeDamageSchoolMask; uint32 m_originalEntry; diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 61b910fe9d1..85fa2c3e362 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -179,7 +179,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(name_id); if (!goinfo) { - sLog->outErrorDb("Gameobject (GUID: %u Entry: %u) not created: it have not exist entry in `gameobject_template`. Map: %u (X: %f Y: %f Z: %f) ang: %f rotation0: %f rotation1: %f rotation2: %f rotation3: %f", guidlow, name_id, map->GetId(), x, y, z, ang, rotation0, rotation1, rotation2, rotation3); + sLog->outErrorDb("Gameobject (GUID: %u Entry: %u) not created: non-existing entry in `gameobject_template`. Map: %u (X: %f Y: %f Z: %f)", guidlow, name_id, map->GetId(), x, y, z); return false; } @@ -189,7 +189,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa if (goinfo->type >= MAX_GAMEOBJECT_TYPE) { - sLog->outErrorDb("Gameobject (GUID: %u Entry: %u) not created: it have not exist GO type '%u' in `gameobject_template`. It's will crash client if created.", guidlow, name_id, goinfo->type); + sLog->outErrorDb("Gameobject (GUID: %u Entry: %u) not created: non-existing GO type '%u' in `gameobject_template`. It will crash client if created.", guidlow, name_id, goinfo->type); return false; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1c3bc04b46c..e45d75199b2 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3480,7 +3480,7 @@ bool Player::AddTalent(uint32 spell_id, uint8 spec, bool learning) return false; } -bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependent, bool disabled) +bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependent, bool disabled, bool loading /*=false*/) { SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id); if (!spellInfo) @@ -3720,7 +3720,7 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen // cast talents with SPELL_EFFECT_LEARN_SPELL (other dependent spells will learned later as not auto-learned) // note: all spells with SPELL_EFFECT_LEARN_SPELL isn't passive - if (talentCost > 0 && IsSpellHaveEffect(spellInfo, SPELL_EFFECT_LEARN_SPELL)) + if (!loading && talentCost > 0 && IsSpellHaveEffect(spellInfo, SPELL_EFFECT_LEARN_SPELL)) { // ignore stance requirement for talent learn spell (stance set for spell only for client spell description show) CastSpell(this, spell_id, true); @@ -4405,7 +4405,7 @@ bool Player::resetTalents(bool no_cost) if (const SpellEntry *_spellEntry = sSpellStore.LookupEntry(talentInfo->RankID[rank])) for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) // search through the SpellEntry for valid trigger spells if (_spellEntry->EffectTriggerSpell[i] > 0 && _spellEntry->Effect[i] == SPELL_EFFECT_LEARN_SPELL) - removeSpell(_spellEntry->EffectTriggerSpell[i]); // and remove any spells that the talent teaches + removeSpell(_spellEntry->EffectTriggerSpell[i], true); // and remove any spells that the talent teaches // if this talent rank can be found in the PlayerTalentMap, mark the talent as removed so it gets deleted PlayerTalentMap::iterator plrTalent = m_talents[m_activeSpec]->find(talentInfo->RankID[rank]); if (plrTalent != m_talents[m_activeSpec]->end()) @@ -17739,7 +17739,7 @@ void Player::_LoadSpells(PreparedQueryResult result) if (result) { do - addSpell((*result)[0].GetUInt32(), (*result)[1].GetBool(), false, false, (*result)[2].GetBool()); + addSpell((*result)[0].GetUInt32(), (*result)[1].GetBool(), false, false, (*result)[2].GetBool(), true); while (result->NextRow()); } } @@ -24289,7 +24289,7 @@ void Player::ActivateSpec(uint8 spec) if (const SpellEntry *_spellEntry = sSpellStore.LookupEntry(talentInfo->RankID[rank])) for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) // search through the SpellEntry for valid trigger spells if (_spellEntry->EffectTriggerSpell[i] > 0 && _spellEntry->Effect[i] == SPELL_EFFECT_LEARN_SPELL) - removeSpell(_spellEntry->EffectTriggerSpell[i]); // and remove any spells that the talent teaches + removeSpell(_spellEntry->EffectTriggerSpell[i], true); // and remove any spells that the talent teaches // if this talent rank can be found in the PlayerTalentMap, mark the talent as removed so it gets deleted //PlayerTalentMap::iterator plrTalent = m_talents[m_activeSpec]->find(talentInfo->RankID[rank]); //if (plrTalent != m_talents[m_activeSpec]->end()) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 725c3fbbc37..e84f4ea306b 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1598,7 +1598,7 @@ class Player : public Unit, public GridObject<Player> void SendProficiency(ItemClass itemClass, uint32 itemSubclassMask); void SendInitialSpells(); - bool addSpell(uint32 spell_id, bool active, bool learning, bool dependent, bool disabled); + bool addSpell(uint32 spell_id, bool active, bool learning, bool dependent, bool disabled, bool loading = false); void learnSpell(uint32 spell_id, bool dependent); void removeSpell(uint32 spell_id, bool disabled = false, bool learn_low_rank = true); void resetSpells(bool myClassOnly = false); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b358cd782e3..030dfeb92e7 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -15630,7 +15630,12 @@ void Unit::SetStunned(bool apply) SetUInt64Value(UNIT_FIELD_TARGET, 0); SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); -// AddUnitMovementFlag(MOVEMENTFLAG_ROOT); + // MOVEMENTFLAG_ROOT cannot be used in conjunction with + // MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_BACKWARD, MOVEMENTFLAG_STRAFE_LEFT, MOVEMENTFLAG_STRAFE RIGHT (tested 3.3.5a) + // this will freeze clients. That's why we remove any current movement flags before + // setting MOVEMENTFLAG_ROOT + RemoveUnitMovementFlag(MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT); + AddUnitMovementFlag(MOVEMENTFLAG_ROOT); // Creature specific if (GetTypeId() != TYPEID_PLAYER) @@ -15662,7 +15667,7 @@ void Unit::SetStunned(bool apply) data << uint32(0); SendMessageToSet(&data, true); -// RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); + RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); } } } @@ -15674,7 +15679,12 @@ void Unit::SetRooted(bool apply) if (m_rootTimes > 0) // blizzard internal check? m_rootTimes++; -// AddUnitMovementFlag(MOVEMENTFLAG_ROOT); + // MOVEMENTFLAG_ROOT cannot be used in conjunction with + // MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_BACKWARD, MOVEMENTFLAG_STRAFE_LEFT, MOVEMENTFLAG_STRAFE RIGHT (tested 3.3.5a) + // this will freeze clients. That's why we remove any current movement flags before + // setting MOVEMENTFLAG_ROOT + RemoveUnitMovementFlag(MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT); + AddUnitMovementFlag(MOVEMENTFLAG_ROOT); if (GetTypeId() == TYPEID_PLAYER) { @@ -15709,7 +15719,7 @@ void Unit::SetRooted(bool apply) SendMessageToSet(&data, true); } -// RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); + RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); } } } @@ -16804,7 +16814,7 @@ bool Unit::CheckPlayerCondition(Player* pPlayer) bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) { bool success = false; - uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->m_creatureEntry : GetEntry(); + uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry(); SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry); for (SpellClickInfoMap::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr) { @@ -17284,8 +17294,8 @@ void Unit::OutDebugInfo() const if (IsVehicle()) { sLog->outStringInLine("Passenger List: "); - for (SeatMap::iterator itr = GetVehicleKit()->m_Seats.begin(); itr != GetVehicleKit()->m_Seats.end(); ++itr) - if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.passenger)) + for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr) + if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger)) sLog->outStringInLine(UI64FMTD", ", passenger->GetGUID()); sLog->outString(); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index ff35e6062cc..e04e65bbff8 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -643,7 +643,7 @@ enum MovementFlags MOVEMENTFLAG_WALKING = 0x00000100, // Walking MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures MOVEMENTFLAG_LEVITATING = 0x00000400, - MOVEMENTFLAG_ROOT = 0x00000800, + MOVEMENTFLAG_ROOT = 0x00000800, // Must not be set along with MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT -> client freeze MOVEMENTFLAG_JUMPING = 0x00001000, MOVEMENTFLAG_FALLING = 0x00002000, // damage dealt on that type of falling MOVEMENTFLAG_PENDING_STOP = 0x00004000, diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index a1a4035ca4d..ce193f798f0 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -27,16 +27,16 @@ #include "CreatureAI.h" #include "ZoneScript.h" -Vehicle::Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry) : me(unit), m_vehicleInfo(vehInfo), m_usableSeatNum(0), m_bonusHP(0), m_creatureEntry(creatureEntry) +Vehicle::Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry) : _me(unit), _vehicleInfo(vehInfo), _usableSeatNum(0), _creatureEntry(creatureEntry) { for (uint32 i = 0; i < MAX_VEHICLE_SEATS; ++i) { - if (uint32 seatId = m_vehicleInfo->m_seatID[i]) + if (uint32 seatId = _vehicleInfo->m_seatID[i]) if (VehicleSeatEntry const* veSeat = sVehicleSeatStore.LookupEntry(seatId)) { - m_Seats.insert(std::make_pair(i, VehicleSeat(veSeat))); + Seats.insert(std::make_pair(i, VehicleSeat(veSeat))); if (veSeat->CanEnterOrExit()) - ++m_usableSeatNum; + ++_usableSeatNum; } } @@ -45,27 +45,27 @@ Vehicle::Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry) Vehicle::~Vehicle() { - for (SeatMap::const_iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr) - ASSERT(!itr->second.passenger); + for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr) + ASSERT(!itr->second.Passenger); } void Vehicle::Install() { - if (Creature* creature = me->ToCreature()) + if (Creature* creature = _me->ToCreature()) { - switch (m_vehicleInfo->m_powerType) + switch (_vehicleInfo->m_powerType) { case POWER_STEAM: case POWER_HEAT: case POWER_BLOOD: case POWER_OOZE: case POWER_WRATH: - me->setPowerType(POWER_ENERGY); - me->SetMaxPower(POWER_ENERGY, 100); + _me->setPowerType(POWER_ENERGY); + _me->SetMaxPower(POWER_ENERGY, 100); break; case POWER_PYRITE: - me->setPowerType(POWER_ENERGY); - me->SetMaxPower(POWER_ENERGY, 50); + _me->setPowerType(POWER_ENERGY); + _me->SetMaxPower(POWER_ENERGY, 50); break; default: for (uint32 i = 0; i < MAX_SPELL_VEHICLE; ++i) @@ -79,8 +79,8 @@ void Vehicle::Install() if (spellInfo->powerType == POWER_ENERGY) { - me->setPowerType(POWER_ENERGY); - me->SetMaxPower(POWER_ENERGY, 100); + _me->setPowerType(POWER_ENERGY); + _me->SetMaxPower(POWER_ENERGY, 100); break; } } @@ -108,7 +108,7 @@ void Vehicle::InstallAllAccessories(bool evading) void Vehicle::Uninstall() { - sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Uninstall Entry: %u, GuidLow: %u", m_creatureEntry, me->GetGUIDLow()); + sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Uninstall Entry: %u, GuidLow: %u", _creatureEntry, _me->GetGUIDLow()); RemoveAllPassengers(); if (GetBase()->GetTypeId() == TYPEID_UNIT) @@ -117,18 +117,18 @@ void Vehicle::Uninstall() void Vehicle::Reset(bool evading /*= false*/) { - sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Reset Entry: %u, GuidLow: %u", m_creatureEntry, me->GetGUIDLow()); - if (me->GetTypeId() == TYPEID_PLAYER) + sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Reset Entry: %u, GuidLow: %u", _creatureEntry, _me->GetGUIDLow()); + if (_me->GetTypeId() == TYPEID_PLAYER) { - if (m_usableSeatNum) - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); + if (_usableSeatNum) + _me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); } else { ApplyAllImmunities(); InstallAllAccessories(evading); - if (m_usableSeatNum) - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + if (_usableSeatNum) + _me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); } if (GetBase()->GetTypeId() == TYPEID_UNIT) @@ -140,48 +140,47 @@ void Vehicle::ApplyAllImmunities() // This couldn't be done in DB, because Vehicle's immunities are overriden by Player's ones // Vehicles should be immune on Knockback, Deathgrip ... - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_GRIP, true); + _me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); + _me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true); + _me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_GRIP, true); // ... Fear, Snare, Root, Stun ... - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, true); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STUN, true); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CONFUSE, true); + _me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true); + _me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true); + _me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, true); + _me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STUN, true); + _me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CONFUSE, true); // Mechanical units & vehicles ( which are not Bosses, they have own immunities in DB ) should be also immune on healing ( exceptions in switch below ) - if (me->ToCreature() && me->ToCreature()->GetCreatureInfo()->type == CREATURE_TYPE_MECHANICAL && !me->ToCreature()->isWorldBoss()) + if (_me->ToCreature() && _me->ToCreature()->GetCreatureInfo()->type == CREATURE_TYPE_MECHANICAL && !_me->ToCreature()->isWorldBoss()) { // Heal & dispel ... - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_HEAL, true); + _me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL, true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_HEAL, true); // ... Shield & Immunity grant spells ... - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_SCHOOL_IMMUNITY, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_UNATTACKABLE, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_SCHOOL_ABSORB, true); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SHIELD, true); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_IMMUNE_SHIELD , true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_SCHOOL_IMMUNITY, true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_UNATTACKABLE, true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_SCHOOL_ABSORB, true); + _me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SHIELD, true); + _me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_IMMUNE_SHIELD , true); // ... Resistance, Split damage, Speed Increase, ... - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_DAMAGE_SHIELD, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_SPLIT_DAMAGE_PCT, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_RESISTANCE, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, true); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_INCREASE_SPEED, true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_DAMAGE_SHIELD, true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_SPLIT_DAMAGE_PCT, true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_RESISTANCE, true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, true); } // Different immunities for vehicles goes below switch (GetVehicleInfo()->m_ID) { case 160: - me->SetControlled(true, UNIT_STAT_ROOT); - me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DECREASE_SPEED, true); + _me->SetControlled(true, UNIT_STAT_ROOT); + _me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DECREASE_SPEED, true); break; default: break; @@ -190,12 +189,12 @@ void Vehicle::ApplyAllImmunities() void Vehicle::RemoveAllPassengers() { - sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::RemoveAllPassengers. Entry: %u, GuidLow: %u", m_creatureEntry, me->GetGUIDLow()); + sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::RemoveAllPassengers. Entry: %u, GuidLow: %u", _creatureEntry, _me->GetGUIDLow()); // Passengers always cast an aura with SPELL_AURA_CONTROL_VEHICLE on the vehicle // We just remove the aura and the unapply handler will make the target leave the vehicle. // We don't need to iterate over m_Seats - me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE); + _me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE); // Following the above logic, this assertion should NEVER fail. // Even in 'hacky' cases, there should at least be VEHICLE_SPELL_RIDE_HARDCODED on us. @@ -206,39 +205,39 @@ void Vehicle::RemoveAllPassengers() bool Vehicle::HasEmptySeat(int8 seatId) const { - SeatMap::const_iterator seat = m_Seats.find(seatId); - if (seat == m_Seats.end()) + SeatMap::const_iterator seat = Seats.find(seatId); + if (seat == Seats.end()) return false; - return !seat->second.passenger; + return !seat->second.Passenger; } Unit* Vehicle::GetPassenger(int8 seatId) const { - SeatMap::const_iterator seat = m_Seats.find(seatId); - if (seat == m_Seats.end()) + SeatMap::const_iterator seat = Seats.find(seatId); + if (seat == Seats.end()) return NULL; - return ObjectAccessor::GetUnit(*GetBase(), seat->second.passenger); + return ObjectAccessor::GetUnit(*GetBase(), seat->second.Passenger); } int8 Vehicle::GetNextEmptySeat(int8 seatId, bool next) const { - SeatMap::const_iterator seat = m_Seats.find(seatId); - if (seat == m_Seats.end()) + SeatMap::const_iterator seat = Seats.find(seatId); + if (seat == Seats.end()) return -1; - while (seat->second.passenger || (!seat->second.seatInfo->CanEnterOrExit() && !seat->second.seatInfo->IsUsableByOverride())) + while (seat->second.Passenger || (!seat->second.SeatInfo->CanEnterOrExit() && !seat->second.SeatInfo->IsUsableByOverride())) { if (next) { ++seat; - if (seat == m_Seats.end()) - seat = m_Seats.begin(); + if (seat == Seats.end()) + seat = Seats.begin(); } else { - if (seat == m_Seats.begin()) - seat = m_Seats.end(); + if (seat == Seats.begin()) + seat = Seats.end(); --seat; } @@ -258,9 +257,9 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ if (passenger->GetEntry() == entry) { ASSERT(passenger->GetTypeId() == TYPEID_UNIT); - if (me->GetTypeId() == TYPEID_UNIT) + if (_me->GetTypeId() == TYPEID_UNIT) { - if (me->ToCreature()->IsInEvadeMode() && passenger->ToCreature()->IsAIEnabled) + if (_me->ToCreature()->IsInEvadeMode() && passenger->ToCreature()->IsAIEnabled) passenger->ToCreature()->AI()->EnterEvadeMode(); return; } @@ -269,12 +268,12 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ passenger->ExitVehicle(); // this should not happen } - if (TempSummon* accessory = me->SummonCreature(entry, *me, TempSummonType(type), summonTime)) + if (TempSummon* accessory = _me->SummonCreature(entry, *_me, TempSummonType(type), summonTime)) { if (minion) accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY); - if (!me->HandleSpellClick(accessory, seatId)) + if (!_me->HandleSpellClick(accessory, seatId)) { accessory->UnSummon(); return; @@ -304,51 +303,51 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) SeatMap::iterator seat; if (seatId < 0) // no specific seat requirement { - for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) - if (!seat->second.passenger && (seat->second.seatInfo->CanEnterOrExit() || seat->second.seatInfo->IsUsableByOverride())) + for (seat = Seats.begin(); seat != Seats.end(); ++seat) + if (!seat->second.Passenger && (seat->second.SeatInfo->CanEnterOrExit() || seat->second.SeatInfo->IsUsableByOverride())) break; - if (seat == m_Seats.end()) // no available seat + if (seat == Seats.end()) // no available seat return false; } else { - seat = m_Seats.find(seatId); - if (seat == m_Seats.end()) + seat = Seats.find(seatId); + if (seat == Seats.end()) return false; - if (seat->second.passenger) + if (seat->second.Passenger) { - if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), seat->second.passenger)) + if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), seat->second.Passenger)) passenger->ExitVehicle(); else - seat->second.passenger = 0; + seat->second.Passenger = 0; } - ASSERT(!seat->second.passenger); + ASSERT(!seat->second.Passenger); } - sLog->outDebug(LOG_FILTER_VEHICLES, "Unit %s enter vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), me->GetEntry(), m_vehicleInfo->m_ID, me->GetGUIDLow(), (int32)seat->first); + sLog->outDebug(LOG_FILTER_VEHICLES, "Unit %s enter vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), _me->GetEntry(), _vehicleInfo->m_ID, _me->GetGUIDLow(), (int32)seat->first); - seat->second.passenger = unit->GetGUID(); - if (seat->second.seatInfo->CanEnterOrExit()) + seat->second.Passenger = unit->GetGUID(); + if (seat->second.SeatInfo->CanEnterOrExit()) { - ASSERT(m_usableSeatNum); - --m_usableSeatNum; - if (!m_usableSeatNum) + ASSERT(_usableSeatNum); + --_usableSeatNum; + if (!_usableSeatNum) { - if (me->GetTypeId() == TYPEID_PLAYER) - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); + if (_me->GetTypeId() == TYPEID_PLAYER) + _me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); else - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + _me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); } } - if (seat->second.seatInfo->m_flags && !(seat->second.seatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK11)) + if (seat->second.SeatInfo->m_flags && !(seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK11)) unit->AddUnitState(UNIT_STAT_ONVEHICLE); unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); - VehicleSeatEntry const* veSeat = seat->second.seatInfo; + VehicleSeatEntry const* veSeat = seat->second.SeatInfo; unit->m_movementInfo.t_pos.m_positionX = veSeat->m_attachmentOffsetX; unit->m_movementInfo.t_pos.m_positionY = veSeat->m_attachmentOffsetY; unit->m_movementInfo.t_pos.m_positionZ = veSeat->m_attachmentOffsetZ; @@ -356,43 +355,28 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) unit->m_movementInfo.t_time = 0; // 1 for player unit->m_movementInfo.t_seat = seat->first; - if (me->GetTypeId() == TYPEID_UNIT + if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER - && seat->first == 0 && seat->second.seatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + && seat->first == 0 && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) { - if (!me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE)) + if (!_me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE)) ASSERT(false); - - // hack: should be done by aura system - if (VehicleScalingInfo const* scalingInfo = sObjectMgr->GetVehicleScalingInfo(m_vehicleInfo->m_ID)) - { - Player* player = unit->ToPlayer(); - float averageItemLevel = player->GetAverageItemLevel(); - if (averageItemLevel < scalingInfo->baseItemLevel) - averageItemLevel = scalingInfo->baseItemLevel; - averageItemLevel -= scalingInfo->baseItemLevel; - - float currentHealthPct = float(me->GetHealth() / me->GetMaxHealth()); - m_bonusHP = uint32(me->GetMaxHealth() * (averageItemLevel * scalingInfo->scalingFactor)); - me->SetMaxHealth(me->GetMaxHealth() + m_bonusHP); - me->SetHealth(uint32((me->GetHealth() + m_bonusHP) * currentHealthPct)); - } } - if (me->IsInWorld()) + if (_me->IsInWorld()) { unit->SendClearTarget(); // SMSG_BREAK_TARGET unit->SetControlled(true, UNIT_STAT_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_SPLINE_MOVE_ROOT here (for creatures) // also adds MOVEMENTFLAG_ROOT - unit->SendMonsterMoveTransport(me); // SMSG_MONSTER_MOVE_TRANSPORT + unit->SendMonsterMoveTransport(_me); // SMSG_MONSTER_MOVE_TRANSPORT - if (me->GetTypeId() == TYPEID_UNIT) + if (_me->GetTypeId() == TYPEID_UNIT) { - if (me->ToCreature()->IsAIEnabled) - me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, true); + if (_me->ToCreature()->IsAIEnabled) + _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, true); // update all passenger's positions - RelocatePassengers(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + RelocatePassengers(_me->GetPositionX(), _me->GetPositionY(), _me->GetPositionZ(), _me->GetOrientation()); } } @@ -408,38 +392,29 @@ void Vehicle::RemovePassenger(Unit* unit) return; SeatMap::iterator seat = GetSeatIteratorForPassenger(unit); - ASSERT(seat != m_Seats.end()); + ASSERT(seat != Seats.end()); - sLog->outDebug(LOG_FILTER_VEHICLES, "Unit %s exit vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), me->GetEntry(), m_vehicleInfo->m_ID, me->GetGUIDLow(), (int32)seat->first); + sLog->outDebug(LOG_FILTER_VEHICLES, "Unit %s exit vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), _me->GetEntry(), _vehicleInfo->m_ID, _me->GetGUIDLow(), (int32)seat->first); - seat->second.passenger = 0; - if (seat->second.seatInfo->CanEnterOrExit()) + seat->second.Passenger = 0; + if (seat->second.SeatInfo->CanEnterOrExit()) { - if (!m_usableSeatNum) + if (!_usableSeatNum) { - if (me->GetTypeId() == TYPEID_PLAYER) - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); + if (_me->GetTypeId() == TYPEID_PLAYER) + _me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); else - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + _me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); } - ++m_usableSeatNum; + ++_usableSeatNum; } unit->ClearUnitState(UNIT_STAT_ONVEHICLE); - if (me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.seatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) - { - me->RemoveCharmedBy(unit); - - if (m_bonusHP) - { - me->SetHealth(me->GetHealth() - m_bonusHP); - me->SetMaxHealth(me->GetMaxHealth() - m_bonusHP); - m_bonusHP = 0; - } - } + if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + _me->RemoveCharmedBy(unit); - if (me->IsInWorld()) + if (_me->IsInWorld()) { unit->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); unit->m_movementInfo.t_pos.Relocate(0, 0, 0, 0); @@ -447,12 +422,12 @@ void Vehicle::RemovePassenger(Unit* unit) unit->m_movementInfo.t_seat = 0; } - if (me->GetTypeId() == TYPEID_UNIT && me->ToCreature()->IsAIEnabled) - me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, false); + if (_me->GetTypeId() == TYPEID_UNIT && _me->ToCreature()->IsAIEnabled) + _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, false); // only for flyable vehicles if (unit->HasUnitMovementFlag(MOVEMENTFLAG_FLYING)) - me->CastSpell(unit, VEHICLE_SPELL_PARACHUTE, true); + _me->CastSpell(unit, VEHICLE_SPELL_PARACHUTE, true); if (GetBase()->GetTypeId() == TYPEID_UNIT) sScriptMgr->OnRemovePassenger(this, unit); @@ -460,12 +435,12 @@ void Vehicle::RemovePassenger(Unit* unit) void Vehicle::RelocatePassengers(float x, float y, float z, float ang) { - Map* map = me->GetMap(); + Map* map = _me->GetMap(); ASSERT(map != NULL); // not sure that absolute position calculation is correct, it must depend on vehicle orientation and pitch angle - for (SeatMap::const_iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr) - if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.passenger)) + for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr) + if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.Passenger)) { ASSERT(passenger->IsInWorld()); ASSERT(passenger->IsOnVehicle(GetBase())); @@ -482,11 +457,11 @@ void Vehicle::RelocatePassengers(float x, float y, float z, float ang) void Vehicle::Dismiss() { - sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Dismiss Entry: %u, GuidLow %u", m_creatureEntry, me->GetGUIDLow()); + sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Dismiss Entry: %u, GuidLow %u", _creatureEntry, _me->GetGUIDLow()); Uninstall(); - me->DestroyForNearbyPlayers(); - me->CombatStop(); - me->AddObjectToRemoveList(); + _me->DestroyForNearbyPlayers(); + _me->CombatStop(); + _me->AddObjectToRemoveList(); } void Vehicle::InitMovementInfoForBase() @@ -494,23 +469,23 @@ void Vehicle::InitMovementInfoForBase() uint32 vehicleFlags = GetVehicleInfo()->m_flags; if (vehicleFlags & VEHICLE_FLAG_NO_STRAFE) - me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_NO_STRAFE); + _me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_NO_STRAFE); if (vehicleFlags & VEHICLE_FLAG_NO_JUMPING) - me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_NO_JUMPING); + _me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_NO_JUMPING); if (vehicleFlags & VEHICLE_FLAG_FULLSPEEDTURNING) - me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_FULL_SPEED_TURNING); + _me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_FULL_SPEED_TURNING); if (vehicleFlags & VEHICLE_FLAG_ALLOW_PITCHING) - me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING); + _me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING); if (vehicleFlags & VEHICLE_FLAG_FULLSPEEDPITCHING) - me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_FULL_SPEED_PITCHING); + _me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_FULL_SPEED_PITCHING); } VehicleSeatEntry const* Vehicle::GetSeatForPassenger(Unit* passenger) { SeatMap::iterator itr; - for (itr = m_Seats.begin(); itr != m_Seats.end(); ++itr) - if (itr->second.passenger == passenger->GetGUID()) - return itr->second.seatInfo; + for (itr = Seats.begin(); itr != Seats.end(); ++itr) + if (itr->second.Passenger == passenger->GetGUID()) + return itr->second.SeatInfo; return NULL; } @@ -518,19 +493,19 @@ VehicleSeatEntry const* Vehicle::GetSeatForPassenger(Unit* passenger) SeatMap::iterator Vehicle::GetSeatIteratorForPassenger(Unit* passenger) { SeatMap::iterator itr; - for (itr = m_Seats.begin(); itr != m_Seats.end(); ++itr) - if (itr->second.passenger == passenger->GetGUID()) + for (itr = Seats.begin(); itr != Seats.end(); ++itr) + if (itr->second.Passenger == passenger->GetGUID()) return itr; - return m_Seats.end(); + return Seats.end(); } uint8 Vehicle::GetAvailableSeatCount() const { uint8 ret = 0; SeatMap::const_iterator itr; - for (itr = m_Seats.begin(); itr != m_Seats.end(); ++itr) - if (!itr->second.passenger && (itr->second.seatInfo->CanEnterOrExit() || itr->second.seatInfo->IsUsableByOverride())) + for (itr = Seats.begin(); itr != Seats.end(); ++itr) + if (!itr->second.Passenger && (itr->second.SeatInfo->CanEnterOrExit() || itr->second.SeatInfo->IsUsableByOverride())) ++ret; return ret; diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 06b009ddc4d..79d5bbb0801 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -79,9 +79,9 @@ enum VehicleSpells struct VehicleSeat { - explicit VehicleSeat(VehicleSeatEntry const *_seatInfo) : seatInfo(_seatInfo), passenger(0) {} - VehicleSeatEntry const *seatInfo; - uint64 passenger; + explicit VehicleSeat(VehicleSeatEntry const *seatInfo) : SeatInfo(seatInfo), Passenger(0) {} + VehicleSeatEntry const *SeatInfo; + uint64 Passenger; }; struct VehicleAccessory @@ -95,16 +95,8 @@ struct VehicleAccessory uint32 SummonTime; }; -struct VehicleScalingInfo -{ - uint32 ID; - float baseItemLevel; - float scalingFactor; -}; - typedef std::vector<VehicleAccessory> VehicleAccessoryList; typedef std::map<uint32, VehicleAccessoryList> VehicleAccessoryMap; -typedef std::map<uint32, VehicleScalingInfo> VehicleScalingMap; typedef std::map<int8, VehicleSeat> SeatMap; class Vehicle @@ -122,9 +114,9 @@ class Vehicle void InstallAllAccessories(bool evading); void ApplyAllImmunities(); - Unit* GetBase() const { return me; } - VehicleEntry const* GetVehicleInfo() const { return m_vehicleInfo; } - uint32 const& GetCreatureEntry() const { return m_creatureEntry; } + Unit* GetBase() const { return _me; } + VehicleEntry const* GetVehicleInfo() const { return _vehicleInfo; } + uint32 const& GetCreatureEntry() const { return _creatureEntry; } bool HasEmptySeat(int8 seatId) const; Unit* GetPassenger(int8 seatId) const; @@ -137,9 +129,9 @@ class Vehicle void RelocatePassengers(float x, float y, float z, float ang); void RemoveAllPassengers(); void Dismiss(); - bool IsVehicleInUse() { return m_Seats.begin() != m_Seats.end(); } + bool IsVehicleInUse() { return Seats.begin() != Seats.end(); } - SeatMap m_Seats; + SeatMap Seats; protected: uint16 GetExtraMovementFlagsForBase() const; @@ -148,14 +140,11 @@ class Vehicle private: SeatMap::iterator GetSeatIteratorForPassenger(Unit* passenger); void InitMovementInfoForBase(); - - protected: - Unit* me; - VehicleEntry const* m_vehicleInfo; - uint32 m_usableSeatNum; // Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags - uint32 m_bonusHP; - uint32 m_creatureEntry; // Can be different than me->GetBase()->GetEntry() in case of players - void InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 type, uint32 summonTime); + + Unit* _me; + VehicleEntry const* _vehicleInfo; + uint32 _usableSeatNum; // Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags + uint32 _creatureEntry; // Can be different than me->GetBase()->GetEntry() in case of players }; #endif diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 2640af253d4..2c69d83f311 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1434,8 +1434,8 @@ void ObjectMgr::LoadCreatures() // 0 1 2 3 4 5 6 7 8 9 10 QueryResult result = WorldDatabase.Query("SELECT creature.guid, id, map, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, " - // 11 12 13 14 15 16 17 18 19 20 21 22 - "currentwaypoint, curhealth, curmana, DeathState, MovementType, spawnMask, phaseMask, eventEntry, pool_entry, creature.npcflag, creature.unit_flags, creature.dynamicflags " + // 11 12 13 14 15 16 17 18 19 20 21 + "currentwaypoint, curhealth, curmana, MovementType, spawnMask, phaseMask, eventEntry, pool_entry, creature.npcflag, creature.unit_flags, creature.dynamicflags " "FROM creature " "LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid " "LEFT OUTER JOIN pool_creature ON creature.guid = pool_creature.guid"); @@ -1494,15 +1494,14 @@ void ObjectMgr::LoadCreatures() data.currentwaypoint= fields[11].GetUInt32(); data.curhealth = fields[12].GetUInt32(); data.curmana = fields[13].GetUInt32(); - data.is_dead = fields[14].GetBool(); - data.movementType = fields[15].GetUInt8(); - data.spawnMask = fields[16].GetUInt8(); - data.phaseMask = fields[17].GetUInt16(); - int16 gameEvent = fields[18].GetInt16(); - uint32 PoolId = fields[19].GetUInt32(); - data.npcflag = fields[20].GetUInt32(); - data.unit_flags = fields[21].GetUInt32(); - data.dynamicflags = fields[22].GetUInt32(); + data.movementType = fields[14].GetUInt8(); + data.spawnMask = fields[15].GetUInt8(); + data.phaseMask = fields[16].GetUInt16(); + int16 gameEvent = fields[17].GetInt16(); + uint32 PoolId = fields[18].GetUInt32(); + data.npcflag = fields[19].GetUInt32(); + data.unit_flags = fields[20].GetUInt32(); + data.dynamicflags = fields[21].GetUInt32(); MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapid); if (!mapEntry) @@ -1724,7 +1723,6 @@ uint32 ObjectMgr::AddCreData(uint32 entry, uint32 /*team*/, uint32 mapId, float data.currentwaypoint = 0; data.curhealth = stats->GenerateHealth(cInfo); data.curmana = stats->GenerateMana(cInfo); - data.is_dead = false; data.movementType = cInfo->MovementType; data.spawnMask = 1; data.phaseMask = PHASEMASK_NORMAL; @@ -2935,48 +2933,6 @@ void ObjectMgr::LoadVehicleAccessories() sLog->outString(); } -void ObjectMgr::LoadVehicleScaling() -{ - uint32 oldMSTime = getMSTime(); - - m_VehicleScalingMap.clear(); // needed for reload case - - uint32 count = 0; - - QueryResult result = WorldDatabase.Query("SELECT `entry`, `baseItemLevel`, `scalingFactor` FROM `vehicle_scaling_info`"); - - if (!result) - { - sLog->outString(">> Loaded 0 vehicle scaling entries. DB table `vehicle_scaling_info` is empty."); - sLog->outString(); - return; - } - - do - { - Field *fields = result->Fetch(); - - uint32 vehicleEntry = fields[0].GetUInt32(); - float baseItemLevel = fields[1].GetFloat(); - float scalingFactor = fields[2].GetFloat(); - - if (!sVehicleStore.LookupEntry(vehicleEntry)) - { - sLog->outErrorDb("Table `vehicle_scaling_info`: vehicle entry %u does not exist.", vehicleEntry); - continue; - } - - m_VehicleScalingMap[vehicleEntry].ID = vehicleEntry; - m_VehicleScalingMap[vehicleEntry].baseItemLevel = baseItemLevel; - m_VehicleScalingMap[vehicleEntry].scalingFactor = scalingFactor; - - ++count; - } while (result->NextRow()); - - sLog->outString(">> Loaded %u vehicle scaling entries in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - sLog->outString(); -} - void ObjectMgr::LoadPetLevelInfo() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index f7468f19755..e309809ef22 100755 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -791,14 +791,6 @@ class ObjectMgr return NULL; } - VehicleScalingInfo const* GetVehicleScalingInfo(uint32 vehicleEntry) const - { - VehicleScalingMap::const_iterator itr = m_VehicleScalingMap.find(vehicleEntry); - if (itr != m_VehicleScalingMap.end()) - return &itr->second; - return NULL; - } - DungeonEncounterList const* GetDungeonEncounterList(uint32 mapId, Difficulty difficulty) { UNORDERED_MAP<uint32, DungeonEncounterList>::const_iterator itr = mDungeonEncounters.find(MAKE_PAIR32(mapId, difficulty)); @@ -896,7 +888,6 @@ class ObjectMgr void LoadMailLevelRewards(); void LoadVehicleTemplateAccessories(); void LoadVehicleAccessories(); - void LoadVehicleScaling(); void LoadGossipText(); @@ -1280,7 +1271,6 @@ class ObjectMgr VehicleAccessoryMap m_VehicleTemplateAccessoryMap; VehicleAccessoryMap m_VehicleAccessoryMap; - VehicleScalingMap m_VehicleScalingMap; typedef std::vector<LocaleConstant> LocalForIndex; LocalForIndex m_LocalForIndex; diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 042950a6ddd..426ce41077d 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -498,7 +498,7 @@ namespace Trinity bool operator()(Creature* u) { if (i_funit->GetTypeId() != TYPEID_PLAYER || !((Player*)i_funit)->isHonorOrXPTarget(u) || - u->getDeathState() != CORPSE || u->isDeadByDefault() || u->isInFlight() || + u->getDeathState() != CORPSE || u->isInFlight() || (u->GetCreatureTypeMask() & (1 << (CREATURE_TYPE_HUMANOID-1))) == 0 || (u->GetDisplayId() != u->GetNativeDisplayId())) return false; @@ -525,7 +525,7 @@ namespace Trinity } bool operator()(Creature* u) { - if (u->getDeathState() != CORPSE || u->isInFlight() || u->isDeadByDefault() || + if (u->getDeathState() != CORPSE || u->isInFlight() || (u->GetDisplayId() != u->GetNativeDisplayId()) || (u->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL) != 0) return false; diff --git a/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp b/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp index 3f6b74326e3..59c4911ae3a 100755 --- a/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/BattleGroundHandler.cpp @@ -316,10 +316,14 @@ void WorldSession::HandlePVPLogDataOpcode(WorldPacket & /*recv_data*/) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd MSG_PVP_LOG_DATA Message"); - Battleground *bg = _player->GetBattleground(); + Battleground* bg = _player->GetBattleground(); if (!bg) return; + // Prevent players from sending BuildPvpLogDataPacket in an arena except for when sent in BattleGround::EndBattleGround. + if (bg->isArena()) + return; + WorldPacket data; sBattlegroundMgr->BuildPvpLogDataPacket(&data, bg); SendPacket(&data); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index d3c23c6e5c3..8fd4430a72c 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -754,6 +754,36 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi) if (mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION)) data >> mi->splineElevation; + + // This must be a packet spoofing attempt. MOVEMENTFLAG_ROOT sent from the client is not valid, + // and when used in conjunction with any of the moving movement flags such as MOVEMENTFLAG_FORWARD + // it will freeze clients that receive this player's movement info. + if (mi->HasMovementFlag(MOVEMENTFLAG_ROOT)) + mi->flags &= ~MOVEMENTFLAG_ROOT; + + // Cannot hover and jump at the same time + if (mi->HasMovementFlag(MOVEMENTFLAG_HOVER) && mi->HasMovementFlag(MOVEMENTFLAG_JUMPING)) + mi->flags &= ~MOVEMENTFLAG_JUMPING; + + // Cannot ascend and descend at the same time + if (mi->HasMovementFlag(MOVEMENTFLAG_ASCENDING) && mi->HasMovementFlag(MOVEMENTFLAG_DESCENDING)) + mi->flags &= ~(MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING); + + // Cannot move left and right at the same time + if (mi->HasMovementFlag(MOVEMENTFLAG_LEFT) && mi->HasMovementFlag(MOVEMENTFLAG_RIGHT)) + mi->flags &= ~(MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT); + + // Cannot strafe left and right at the same time + if (mi->HasMovementFlag(MOVEMENTFLAG_STRAFE_LEFT) && mi->HasMovementFlag(MOVEMENTFLAG_STRAFE_RIGHT)) + mi->flags &= ~(MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT); + + // Cannot pitch up and down at the same time + if (mi->HasMovementFlag(MOVEMENTFLAG_PITCH_UP) && mi->HasMovementFlag(MOVEMENTFLAG_PITCH_DOWN)) + mi->flags &= ~(MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN); + + // Cannot move forwards and backwards at the same time + if (mi->HasMovementFlag(MOVEMENTFLAG_FORWARD) && mi->HasMovementFlag(MOVEMENTFLAG_BACKWARD)) + mi->flags &= ~(MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD); } void WorldSession::WriteMovementInfo(WorldPacket *data, MovementInfo *mi) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 17f8b246c83..797a8ecfcbe 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2516,7 +2516,6 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) || (m_targets.GetUnitTarget()->getDeathState() == CORPSE && m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId() && m_targets.GetUnitTarget()->GetTypeId() == TYPEID_UNIT - && !m_targets.GetUnitTarget()->ToCreature()->isDeadByDefault() && !(m_targets.GetUnitTarget()->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL) && m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId())))) { diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index f1879099a0a..db66e46eab1 100755 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -35,9 +35,9 @@ SpellSelectTargetTypes SpellTargetType[TOTAL_SPELL_TARGETS]; SpellMgr::SpellMgr() { - for (int i = 0; i < TOTAL_SPELL_EFFECTS; ++i) + for (uint8 i = 0; i < TOTAL_SPELL_EFFECTS; ++i) { - switch(i) + switch (i) { case SPELL_EFFECT_PERSISTENT_AREA_AURA: //27 case SPELL_EFFECT_SUMMON: //28 @@ -99,9 +99,9 @@ SpellMgr::SpellMgr() } } - for (int i = 0; i < TOTAL_SPELL_TARGETS; ++i) + for (uint8 i = 0; i < TOTAL_SPELL_TARGETS; ++i) { - switch(i) + switch (i) { case TARGET_UNIT_CASTER: case TARGET_UNIT_CASTER_FISHING: @@ -226,7 +226,7 @@ SpellMgr::SpellMgr() for (int32 i = 0; i < TOTAL_SPELL_TARGETS; ++i) { - switch(i) + switch (i) { case TARGET_UNIT_AREA_ENEMY_DST: case TARGET_UNIT_AREA_ENEMY_SRC: @@ -322,8 +322,8 @@ uint32 GetSpellCastTime(SpellEntry const* spellInfo, Spell* spell) int32 castTime = spellCastTimeEntry->CastTime; - if (spell && spell->GetCaster()) - spell->GetCaster()->ModSpellCastTime(spellInfo, castTime, spell); + if (Unit *caster = (spell ? spell->GetCaster() : NULL)) + caster->ModSpellCastTime(spellInfo, castTime, spell); if (spellInfo->Attributes & SPELL_ATTR0_REQ_AMMO && (!spell || !(spell->IsAutoRepeat()))) castTime += 500; @@ -492,7 +492,7 @@ AuraState GetSpellAuraState(SpellEntry const* spellInfo) return AURA_STATE_BLEEDING; if (GetSpellSchoolMask(spellInfo) & SPELL_SCHOOL_MASK_FROST) - for (uint8 i = 0; i<MAX_SPELL_EFFECTS; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) if (spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_STUN || spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_ROOT) return AURA_STATE_FROZEN; @@ -1187,7 +1187,7 @@ void SpellMgr::LoadSpellTargetPositions() } bool found = false; - for (int i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (spellInfo->EffectImplicitTargetA[i] == TARGET_DST_DB || spellInfo->EffectImplicitTargetB[i] == TARGET_DST_DB) { @@ -1227,7 +1227,7 @@ void SpellMgr::LoadSpellTargetPositions() bool found = false; for (int j = 0; j < MAX_SPELL_EFFECTS; ++j) { - switch(spellInfo->EffectImplicitTargetA[j]) + switch (spellInfo->EffectImplicitTargetA[j]) { case TARGET_DST_DB: found = true; @@ -1235,7 +1235,7 @@ void SpellMgr::LoadSpellTargetPositions() } if (found) break; - switch(spellInfo->EffectImplicitTargetB[j]) + switch (spellInfo->EffectImplicitTargetB[j]) { case TARGET_DST_DB: found = true; @@ -1420,7 +1420,7 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const* spellPr // spellFamilyName is Ok need check for spellFamilyMask if present if (spellProcEvent->spellFamilyMask) { - if ((spellProcEvent->spellFamilyMask & procSpell->SpellFamilyFlags) == 0) + if (!(spellProcEvent->spellFamilyMask & procSpell->SpellFamilyFlags)) return false; hasFamilyMask = true; // Some spells are not considered as active even with have spellfamilyflags @@ -1661,8 +1661,6 @@ void SpellMgr::LoadSpellGroups() QueryResult result = WorldDatabase.Query("SELECT id, spell_id FROM spell_group"); if (!result) { - - sLog->outString(); sLog->outString(">> Loaded %u spell group definitions", count); return; @@ -1746,7 +1744,6 @@ void SpellMgr::LoadSpellGroupStackRules() QueryResult result = WorldDatabase.Query("SELECT group_id, stack_rule FROM spell_group_stack_rules"); if (!result) { - sLog->outString(">> Loaded 0 spell group stack rules"); sLog->outString(); return; @@ -1793,8 +1790,6 @@ void SpellMgr::LoadSpellThreats() QueryResult result = WorldDatabase.Query("SELECT entry, Threat FROM spell_threat"); if (!result) { - - sLog->outString(">> Loaded %u aggro generating spells", count); sLog->outString(); return; @@ -1844,9 +1839,9 @@ bool SpellMgr::canStackSpellRanks(SpellEntry const *spellInfo) return false; // All stance spells. if any better way, change it. - for (int i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { - switch(spellInfo->SpellFamilyName) + switch (spellInfo->SpellFamilyName) { case SPELLFAMILY_PALADIN: // Paladin aura Spell @@ -1982,7 +1977,7 @@ int32 SpellMgr::CalculateSpellEffectAmount(SpellEntry const* spellEntry, uint8 e } // roll in a range <1;EffectDieSides> as of patch 3.3.3 - switch(randomPoints) + switch (randomPoints) { case 0: break; case 1: basePoints += 1; break; // range 1..1 @@ -2036,20 +2031,16 @@ int32 SpellMgr::CalculateSpellEffectBaseAmount(int32 value, SpellEntry const* sp float SpellMgr::CalculateSpellEffectValueMultiplier(SpellEntry const* spellEntry, uint8 effIndex, Unit* caster, Spell* spell) { float multiplier = spellEntry->EffectValueMultiplier[effIndex]; - - if (caster) - if (Player* modOwner = caster->GetSpellModOwner()) - modOwner->ApplySpellMod(spellEntry->Id, SPELLMOD_VALUE_MULTIPLIER, multiplier, spell); + if (Player* modOwner = (caster ? caster->GetSpellModOwner() : NULL)) + modOwner->ApplySpellMod(spellEntry->Id, SPELLMOD_VALUE_MULTIPLIER, multiplier, spell); return multiplier; } float SpellMgr::CalculateSpellEffectDamageMultiplier(SpellEntry const* spellEntry, uint8 effIndex, Unit* caster, Spell* spell) { float multiplier = spellEntry->EffectDamageMultiplier[effIndex]; - - if (caster) - if (Player* modOwner = caster->GetSpellModOwner()) - modOwner->ApplySpellMod(spellEntry->Id, SPELLMOD_DAMAGE_MULTIPLIER, multiplier, spell); + if (Player* modOwner = (caster ? caster->GetSpellModOwner() : NULL)) + modOwner->ApplySpellMod(spellEntry->Id, SPELLMOD_DAMAGE_MULTIPLIER, multiplier, spell); return multiplier; } @@ -2060,7 +2051,7 @@ SpellEntry const* SpellMgr::SelectAuraRankForPlayerLevel(SpellEntry const* spell return spellInfo; bool needRankSelection = false; - for (int i = 0; i < MAX_SPELL_EFFECTS; ++i) + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (IsPositiveEffect(spellInfo->Id, i) && ( spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA || @@ -2142,7 +2133,6 @@ void SpellMgr::LoadSpellLearnSpells() QueryResult result = WorldDatabase.Query("SELECT entry, SpellID, Active FROM spell_learn_spell"); if (!result) { - sLog->outString(">> Loaded 0 spell learn spells"); sLog->outString(); sLog->outErrorDb("`spell_learn_spell` table is empty!"); @@ -2207,7 +2197,7 @@ void SpellMgr::LoadSpellLearnSpells() continue; // talent or passive spells or skill-step spells auto-casted and not need dependent learning, - // pet teaching spells don't must be dependent learning (casted) + // pet teaching spells must not be dependent learning (casted) // other required explicit dependent learning dbc_node.autoLearned = entry->EffectImplicitTargetA[i] == TARGET_UNIT_PET || GetTalentSpellCost(spell) > 0 || IsPassiveSpell(spell) || IsSpellHaveEffect(entry, SPELL_EFFECT_SKILL_STEP); @@ -2312,7 +2302,6 @@ void SpellMgr::LoadPetLevelupSpellMap() for (uint32 i = 0; i < sCreatureFamilyStore.GetNumRows(); ++i) { - CreatureFamilyEntry const *creatureFamily = sCreatureFamilyStore.LookupEntry(i); if (!creatureFamily) // not exist continue; @@ -2835,7 +2824,7 @@ SpellCastResult SpellMgr::GetSpellAllowedInLocationError(SpellEntry const *spell } // bg spell checks - switch(spellInfo->Id) + switch (spellInfo->Id) { case 23333: // Warsong Flag case 23335: // Silverwing Flag @@ -3275,35 +3264,35 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 return false; // Extra conditions -- leaving the possibility add extra conditions... - switch(spellId) + switch (spellId) { case 58600: // No fly Zone - Dalaran - { - if (!player) - return false; + { + if (!player) + return false; - AreaTableEntry const* pArea = GetAreaEntryByAreaID(player->GetAreaId()); - if (!(pArea && pArea->flags & AREA_FLAG_NO_FLY_ZONE)) - return false; - if (!player->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !player->HasAuraType(SPELL_AURA_FLY)) - return false; - break; - } - case SPELL_OIL_REFINERY: // Oil Refinery - Isle of Conquest. - case SPELL_QUARRY: // Quarry - Isle of Conquest. - { - if (player->GetBattlegroundTypeId() != BATTLEGROUND_IC || !player->GetBattleground()) - return false; + AreaTableEntry const* pArea = GetAreaEntryByAreaID(player->GetAreaId()); + if (!(pArea && pArea->flags & AREA_FLAG_NO_FLY_ZONE)) + return false; + if (!player->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !player->HasAuraType(SPELL_AURA_FLY)) + return false; + break; + } + case 68719: // Oil Refinery - Isle of Conquest. + case 68720: // Quarry - Isle of Conquest. + { + if (player->GetBattlegroundTypeId() != BATTLEGROUND_IC || !player->GetBattleground()) + return false; - uint8 nodeType = spellId == SPELL_OIL_REFINERY ? NODE_TYPE_REFINERY : NODE_TYPE_QUARRY; - uint8 nodeState = player->GetTeamId() == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H; + uint8 nodeType = spellId == 68719 ? NODE_TYPE_REFINERY : NODE_TYPE_QUARRY; + uint8 nodeState = player->GetTeamId() == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H; - BattlegroundIC* pIC = static_cast<BattlegroundIC*>(player->GetBattleground()); - if (pIC->GetNodeState(nodeType) == nodeState) - return true; + BattlegroundIC* pIC = static_cast<BattlegroundIC*>(player->GetBattleground()); + if (pIC->GetNodeState(nodeType) == nodeState) + return true; - return false; - } + return false; + } } return true; @@ -3341,7 +3330,7 @@ bool SpellMgr::CanAurasStack(Aura const *aura1, Aura const *aura2, bool sameCast // check same periodic auras for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { - switch(spellInfo_1->EffectApplyAuraName[i]) + switch (spellInfo_1->EffectApplyAuraName[i]) { // DOT or HOT from different casters will stack case SPELL_AURA_PERIODIC_DAMAGE: @@ -3460,7 +3449,6 @@ void SpellMgr::LoadSpellEnchantProcData() QueryResult result = WorldDatabase.Query("SELECT entry, customChance, PPMChance, procEx FROM spell_enchant_proc_data"); if (!result) { - sLog->outString(">> Loaded %u spell enchant proc event conditions", count); sLog->outString(); return; @@ -3505,7 +3493,6 @@ void SpellMgr::LoadSpellRequired() if (!result) { - sLog->outString(">> Loaded 0 spell required records"); sLog->outString(); sLog->outErrorDb("`spell_required` table is empty!"); @@ -3562,7 +3549,6 @@ void SpellMgr::LoadSpellRanks() if (!result) { - sLog->outString(">> Loaded 0 spell rank records"); sLog->outString(); sLog->outErrorDb("`spell_ranks` table is empty!"); @@ -4414,7 +4400,6 @@ void SpellMgr::LoadEnchantCustomAttr() for (uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i) { - SpellEntry * spellInfo = (SpellEntry*)GetSpellStore()->LookupEntry(i); if (!spellInfo) continue; @@ -4482,7 +4467,7 @@ void SpellMgr::LoadSpellLinked() if (trigger > 0) { - switch(type) + switch (type) { case 0: mSpellCustomAttr[trigger] |= SPELL_ATTR0_CU_LINK_CAST; break; case 1: mSpellCustomAttr[trigger] |= SPELL_ATTR0_CU_LINK_HIT; break; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 976e8ba660e..15cc7c9abaf 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1349,9 +1349,6 @@ void World::SetInitialWorldSettings() sLog->outString("Loading Creature template addons..."); sObjectMgr->LoadCreatureTemplateAddons(); - sLog->outString("Loading Vehicle scaling information..."); - sObjectMgr->LoadVehicleScaling(); - sLog->outString("Loading Reputation Reward Rates..."); sObjectMgr->LoadReputationRewardRate(); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 7686ff66ae8..dd526162e66 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -63,7 +63,6 @@ public: static ChatCommand npcSetCommandTable[] = { { "allowmove", SEC_ADMINISTRATOR, false, &HandleNpcSetAllowMovementCommand, "", NULL }, - { "deathstate", SEC_GAMEMASTER, false, &HandleNpcSetDeathStateCommand, "", NULL }, { "entry", SEC_ADMINISTRATOR, false, &HandleNpcSetEntryCommand, "", NULL }, { "factionid", SEC_GAMEMASTER, false, &HandleNpcSetFactionIdCommand, "", NULL }, { "flag", SEC_GAMEMASTER, false, &HandleNpcSetFlagCommand, "", NULL }, @@ -1157,37 +1156,6 @@ public: return true; } - //npc deathstate handling - static bool HandleNpcSetDeathStateCommand(ChatHandler* handler, const char* args) - { - if (!*args) - return false; - - Creature* pCreature = handler->getSelectedCreature(); - if (!pCreature || pCreature->isPet()) - { - handler->SendSysMessage(LANG_SELECT_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } - - if (strncmp(args, "on", 3) == 0) - pCreature->SetDeadByDefault(true); - else if (strncmp(args, "off", 4) == 0) - pCreature->SetDeadByDefault(false); - else - { - handler->SendSysMessage(LANG_USE_BOL); - handler->SetSentErrorMessage(true); - return false; - } - - pCreature->SaveToDB(); - pCreature->Respawn(); - - return true; - } - static bool HandleNpcAddFormationCommand(ChatHandler* handler, const char* args) { if (!*args) diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp index 44f024b3096..788e6eb846d 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp @@ -221,6 +221,7 @@ enum FreyaEvents #define WAVE_TIME 60000 // Normal wave is one minute #define TIME_DIFFERENCE 10000 // If difference between waveTime and WAVE_TIME is bigger then TIME_DIFFERENCE, schedule EVENT_WAVE in 10 seconds #define DATA_GETTING_BACK_TO_NATURE 1 +#define DATA_KNOCK_ON_WOOD 2 class npc_iron_roots : public CreatureScript { @@ -341,9 +342,8 @@ class boss_freya : public CreatureScript me->setFaction(35); me->DeleteThreatList(); me->CombatStop(true); - me->ForcedDespawn(7500); - if (elderCount) - me->CastSpell(me, SPELL_KNOCK_ON_WOOD_CREDIT, true); + me->DespawnOrUnsummon(7500); + me->CastSpell(me, SPELL_KNOCK_ON_WOOD_CREDIT, true); Creature* Elder[3]; for (uint8 n = 0; n < 3; ++n) @@ -381,8 +381,6 @@ class boss_freya : public CreatureScript } } - instance->SetData(DATA_KNOCK_ON_WOOD_ACHIEVEMENTS, elderCount); - if (Elder[0]->isAlive()) { Elder[0]->CastSpell(me, SPELL_BRIGHTLEAF_ESSENCE, true); @@ -418,6 +416,8 @@ class boss_freya : public CreatureScript { case DATA_GETTING_BACK_TO_NATURE: return attunedToNature; + case DATA_KNOCK_ON_WOOD: + return elderCount; } return 0; @@ -1630,6 +1630,66 @@ class achievement_getting_back_to_nature : public AchievementCriteriaScript } }; +class achievement_knock_on_wood : public AchievementCriteriaScript +{ + public: + achievement_knock_on_wood() : AchievementCriteriaScript("achievement_knock_on_wood") + { + } + + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; + + if (Creature* Freya = target->ToCreature()) + if (Freya->AI()->GetData(DATA_KNOCK_ON_WOOD) >= 1) + return true; + + return false; + } +}; + +class achievement_knock_knock_on_wood : public AchievementCriteriaScript +{ + public: + achievement_knock_knock_on_wood() : AchievementCriteriaScript("achievement_knock_knock_on_wood") + { + } + + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; + + if (Creature* Freya = target->ToCreature()) + if (Freya->AI()->GetData(DATA_KNOCK_ON_WOOD) >= 2) + return true; + + return false; + } +}; + +class achievement_knock_knock_knock_on_wood : public AchievementCriteriaScript +{ + public: + achievement_knock_knock_knock_on_wood() : AchievementCriteriaScript("achievement_knock_knock_knock_on_wood") + { + } + + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; + + if (Creature* Freya = target->ToCreature()) + if (Freya->AI()->GetData(DATA_KNOCK_ON_WOOD) == 3) + return true; + + return false; + } +}; + void AddSC_boss_freya() { new boss_freya(); @@ -1650,4 +1710,7 @@ void AddSC_boss_freya() new spell_freya_attuned_to_nature_dose_reduction(); new spell_freya_iron_roots(); new achievement_getting_back_to_nature(); + new achievement_knock_on_wood(); + new achievement_knock_knock_on_wood(); + new achievement_knock_knock_knock_on_wood(); } diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp index 7edec45ca5e..51fb290502d 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp @@ -85,7 +85,7 @@ enum Yells SAY_BERSERK = -1603238, }; -enum +enum Achievemments { ACHIEV_DISARMED_START_EVENT = 21687, }; @@ -95,14 +95,9 @@ class boss_kologarn : public CreatureScript public: boss_kologarn() : CreatureScript("boss_kologarn") { } - CreatureAI* GetAI(Creature* pCreature) const - { - return GetUlduarAI<boss_kologarnAI>(pCreature); - } - struct boss_kologarnAI : public BossAI { - boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, BOSS_KOLOGARN), vehicle(pCreature->GetVehicleKit()), + boss_kologarnAI(Creature* creature) : BossAI(creature, BOSS_KOLOGARN), vehicle(creature->GetVehicleKit()), left(false), right(false) { ASSERT(vehicle); @@ -115,7 +110,7 @@ class boss_kologarn : public CreatureScript Reset(); } - Vehicle *vehicle; + Vehicle* vehicle; bool left, right; uint64 eyebeamTarget; @@ -140,7 +135,7 @@ class boss_kologarn : public CreatureScript void Reset() { _Reset(); - + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); eyebeamTarget = 0; } @@ -149,7 +144,8 @@ class boss_kologarn : public CreatureScript DoScriptText(SAY_DEATH, me); DoCast(SPELL_KOLOGARN_PACIFY); me->GetMotionMaster()->MoveTargetedHome(); - + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetCorpseDelay(604800); // Prevent corpse from despawning. _JustDied(); } @@ -204,8 +200,7 @@ class boss_kologarn : public CreatureScript if (!right && !left) events.ScheduleEvent(EVENT_STONE_SHOUT, 5000); - if (instance) - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_DISARMED_START_EVENT); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_DISARMED_START_EVENT); } else { @@ -234,7 +229,6 @@ class boss_kologarn : public CreatureScript summon->CastSpell(summon, SPELL_FOCUSED_EYEBEAM_PERIODIC, true); summon->CastSpell(summon, SPELL_FOCUSED_EYEBEAM_VISUAL, true); summon->SetReactState(REACT_PASSIVE); - summon->SetFlag(UNIT_FIELD_ATTACK_POWER, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED); // One of the above spells is a channeled spell, we need to clear this unit state for MoveChase to work summon->ClearUnitState(UNIT_STAT_CASTING); @@ -249,7 +243,7 @@ class boss_kologarn : public CreatureScript } } - void UpdateAI(const uint32 diff) + void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; @@ -289,14 +283,14 @@ class boss_kologarn : public CreatureScript break; case EVENT_RESPAWN_LEFT_ARM: { - if (Creature* arm = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_LEFT_ARM) : 0)) + if (Creature* arm = Unit::GetCreature(*me, instance->GetData64(DATA_LEFT_ARM))) RespawnArm(arm->ToCreature()); events.CancelEvent(EVENT_RESPAWN_LEFT_ARM); break; } case EVENT_RESPAWN_RIGHT_ARM: { - if (Creature* arm = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_RIGHT_ARM) : 0)) + if (Creature* arm = Unit::GetCreature(*me, instance->GetData64(DATA_RIGHT_ARM))) RespawnArm(arm->ToCreature()); events.CancelEvent(EVENT_RESPAWN_RIGHT_ARM); break; @@ -312,8 +306,7 @@ class boss_kologarn : public CreatureScript } break; case EVENT_FOCUSED_EYEBEAM: - Unit* eyebeamTargetUnit = SelectTarget(SELECT_TARGET_FARTHEST, 0, 0, true); - if (eyebeamTargetUnit) + if (Unit* eyebeamTargetUnit = SelectTarget(SELECT_TARGET_FARTHEST, 0, 0, true)) { eyebeamTarget = eyebeamTargetUnit->GetGUID(); DoCast(SPELL_SUMMON_FOCUSED_EYEBEAM); @@ -335,6 +328,11 @@ class boss_kologarn : public CreatureScript arm->CastSpell(arm, SPELL_ARM_ENTER_VISUAL, true); } }; + + CreatureAI* GetAI(Creature* creature) const + { + return GetUlduarAI<boss_kologarnAI>(creature); + } }; class spell_ulduar_rubble_summon : public SpellScriptLoader @@ -374,14 +372,14 @@ class spell_ulduar_rubble_summon : public SpellScriptLoader class StoneGripTargetSelector : public std::unary_function<Unit *, bool> { public: - StoneGripTargetSelector(Creature* me, const Unit* victim) : _me(me), _victim(victim) {} + StoneGripTargetSelector(Creature* me, Unit const* victim) : _me(me), _victim(victim) {} - bool operator() (Unit* pTarget) + bool operator() (Unit* target) { - if (pTarget == _victim && _me->getThreatManager().getThreatList().size() > 1) + if (target == _victim && _me->getThreatManager().getThreatList().size() > 1) return true; - if (pTarget->GetTypeId() != TYPEID_PLAYER) + if (target->GetTypeId() != TYPEID_PLAYER) return true; return false; @@ -472,11 +470,8 @@ class spell_ulduar_cancel_stone_grip : public SpellScriptLoader void HandleScript(SpellEffIndex /*effIndex*/) { - Unit* target = this->GetHitPlayer(); - if (!target) - return; - - if (!target->GetVehicle()) + Unit* target = GetHitUnit(); + if (!target || !target->GetVehicle()) return; switch (target->GetMap()->GetDifficulty()) @@ -506,38 +501,38 @@ class spell_ulduar_cancel_stone_grip : public SpellScriptLoader class spell_ulduar_squeezed_lifeless : public SpellScriptLoader { -public: - spell_ulduar_squeezed_lifeless() : SpellScriptLoader("spell_ulduar_squeezed_lifeless") { } - - class spell_ulduar_squeezed_lifeless_SpellScript : public SpellScript - { - PrepareSpellScript(spell_ulduar_squeezed_lifeless_SpellScript); + public: + spell_ulduar_squeezed_lifeless() : SpellScriptLoader("spell_ulduar_squeezed_lifeless") { } - void HandleInstaKill(SpellEffIndex /*effIndex*/) + class spell_ulduar_squeezed_lifeless_SpellScript : public SpellScript { - if (!GetHitPlayer()->GetVehicle()) - return; - - Position pos; - pos.m_positionX = 1756.25f + irand(-3, 3); - pos.m_positionY = -8.3f + irand(-3, 3); - pos.m_positionZ = 448.8f; - pos.m_orientation = M_PI; - GetHitPlayer()->DestroyForNearbyPlayers(); - GetHitPlayer()->ExitVehicle(&pos); - GetHitPlayer()->UpdateObjectVisibility(false); - } + PrepareSpellScript(spell_ulduar_squeezed_lifeless_SpellScript); - void Register() + void HandleInstaKill(SpellEffIndex /*effIndex*/) + { + if (!GetHitPlayer() || !GetHitPlayer()->GetVehicle()) + return; + + Position pos; + pos.m_positionX = 1756.25f + irand(-3, 3); + pos.m_positionY = -8.3f + irand(-3, 3); + pos.m_positionZ = 448.8f; + pos.m_orientation = M_PI; + GetHitPlayer()->DestroyForNearbyPlayers(); + GetHitPlayer()->ExitVehicle(&pos); + GetHitPlayer()->UpdateObjectVisibility(false); + } + + void Register() + { + OnEffect += SpellEffectFn(spell_ulduar_squeezed_lifeless_SpellScript::HandleInstaKill, EFFECT_1, SPELL_EFFECT_INSTAKILL); + } + }; + + SpellScript* GetSpellScript() const { - OnEffect += SpellEffectFn(spell_ulduar_squeezed_lifeless_SpellScript::HandleInstaKill, EFFECT_1, SPELL_EFFECT_INSTAKILL); + return new spell_ulduar_squeezed_lifeless_SpellScript(); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ulduar_squeezed_lifeless_SpellScript(); - } }; class spell_ulduar_stone_grip_absorb : public SpellScriptLoader @@ -588,8 +583,8 @@ class spell_ulduar_stone_grip : public SpellScriptLoader void OnRemoveStun(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - if (Player* pOwner = GetOwner()->ToPlayer()) - pOwner->RemoveAurasDueToSpell(aurEff->GetAmount()); + if (Player* owner = GetOwner()->ToPlayer()) + owner->RemoveAurasDueToSpell(aurEff->GetAmount()); } void OnRemoveVehicle(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode) @@ -600,13 +595,13 @@ class spell_ulduar_stone_grip : public SpellScriptLoader if (GetOwner()->GetTypeId() != TYPEID_UNIT) return; - Player* pCaster = GetCaster() ? GetCaster()->ToPlayer() : NULL; - if (!pCaster || !pCaster->IsOnVehicle(GetOwner()->ToUnit())) + Player* caster = GetCaster() ? GetCaster()->ToPlayer() : NULL; + if (!caster || !caster->IsOnVehicle(GetOwner()->ToUnit())) return; - pCaster->RemoveAurasDueToSpell(GetId()); - pCaster->ExitVehicle(); - pCaster->GetMotionMaster()->MoveJump(1756.25f + irand(-3, 3), -8.3f + irand(-3, 3), 448.8f, 5.0f, 5.0f); + caster->RemoveAurasDueToSpell(GetId()); + caster->ExitVehicle(); + caster->GetMotionMaster()->MoveJump(1756.25f + irand(-3, 3), -8.3f + irand(-3, 3), 448.8f, 5.0f, 5.0f); PreventDefaultAction(); } @@ -652,7 +647,6 @@ class spell_kologarn_stone_shout : public SpellScriptLoader void AddSC_boss_kologarn() { new boss_kologarn(); - new spell_ulduar_rubble_summon(); new spell_ulduar_squeezed_lifeless(); new spell_ulduar_cancel_stone_grip(); diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp index b91b0f350a3..8c2d2d815f6 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp @@ -79,6 +79,7 @@ class instance_ulduar : public InstanceMapScript uint32 TeamInInstance; uint32 HodirRareCacheData; uint8 elderCount; + bool conSpeedAtory; std::set<uint64> mRubbleSpawns; @@ -86,37 +87,38 @@ class instance_ulduar : public InstanceMapScript { SetBossNumber(MAX_ENCOUNTER); LoadDoorData(doorData); - IgnisGUID = 0; - RazorscaleGUID = 0; - RazorscaleController = 0; - ExpeditionCommanderGUID = 0; - XT002GUID = 0; - KologarnGUID = 0; - LeftArmGUID = 0; - RightArmGUID = 0; - AuriayaGUID = 0; - MimironGUID = 0; - HodirGUID = 0; - ThorimGUID = 0; - FreyaGUID = 0; - VezaxGUID = 0; - YoggSaronGUID = 0; - AlgalonGUID = 0; - KologarnChestGUID = 0; - KologarnBridgeGUID = 0; - KologarnChestGUID = 0; - ThorimChestGUID = 0; - HodirRareCacheGUID = 0; - HodirChestGUID = 0; - FreyaChestGUID = 0; - LeviathanGateGUID = 0; - VezaxDoorGUID = 0; - HodirDoorGUID = 0; - HodirIceDoorGUID = 0; - ArchivumDoorGUID = 0; - TeamInInstance = 0; - HodirRareCacheData = 0; - elderCount = 0; + IgnisGUID = 0; + RazorscaleGUID = 0; + RazorscaleController = 0; + ExpeditionCommanderGUID = 0; + XT002GUID = 0; + KologarnGUID = 0; + LeftArmGUID = 0; + RightArmGUID = 0; + AuriayaGUID = 0; + MimironGUID = 0; + HodirGUID = 0; + ThorimGUID = 0; + FreyaGUID = 0; + VezaxGUID = 0; + YoggSaronGUID = 0; + AlgalonGUID = 0; + KologarnChestGUID = 0; + KologarnBridgeGUID = 0; + KologarnChestGUID = 0; + ThorimChestGUID = 0; + HodirRareCacheGUID = 0; + HodirChestGUID = 0; + FreyaChestGUID = 0; + LeviathanGateGUID = 0; + VezaxDoorGUID = 0; + HodirDoorGUID = 0; + HodirIceDoorGUID = 0; + ArchivumDoorGUID = 0; + TeamInInstance = 0; + HodirRareCacheData = 0; + elderCount = 0; + conSpeedAtory = false; memset(Encounter, 0, sizeof(Encounter)); memset(XTToyPileGUIDs, 0, sizeof(XTToyPileGUIDs)); @@ -210,23 +212,6 @@ class instance_ulduar : public InstanceMapScript case NPC_KOLOGARN: KologarnGUID = creature->GetGUID(); break; - case NPC_KOLOGARN_BRIDGE: - // The below hacks are courtesy of the grid/visibilitysystem - if (GetBossState(BOSS_KOLOGARN) == DONE) - { - creature->SetDeadByDefault(true); - creature->setDeathState(CORPSE); - creature->DestroyForNearbyPlayers(); - creature->UpdateObjectVisibility(true); - } - else - { - creature->SetDeadByDefault(false); - creature->setDeathState(CORPSE); - creature->RemoveCorpse(true); - } - break; - case NPC_AURIAYA: AuriayaGUID = creature->GetGUID(); break; @@ -374,6 +359,29 @@ class instance_ulduar : public InstanceMapScript } } + void OnCreatureDeath(Creature* creature) + { + switch (creature->GetEntry()) + { + case NPC_CORRUPTED_SERVITOR: + case NPC_MISGUIDED_NYMPH: + case NPC_GUARDIAN_LASHER: + case NPC_FOREST_SWARMER: + case NPC_MANGROVE_ENT: + case NPC_IRONROOT_LASHER: + case NPC_NATURES_BLADE: + case NPC_GUARDIAN_OF_LIFE: + if (!conSpeedAtory) + { + DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_CON_SPEED_ATORY); + conSpeedAtory = true; + } + break; + default: + break; + } + } + void ProcessEvent(GameObject* /*gameObject*/, uint32 eventId) { // Flame Leviathan's Tower Event triggers @@ -440,7 +448,7 @@ class instance_ulduar : public InstanceMapScript if (state == DONE) { if (GameObject* HodirRareCache = instance->GetGameObject(HodirRareCacheGUID)) - if (GetData(DATA_HODIR_RARE_CACHE) == 1) + if (GetData(DATA_HODIR_RARE_CACHE)) HodirRareCache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); if (GameObject* HodirChest = instance->GetGameObject(HodirChestGUID)) HodirChest->SetRespawnTime(HodirChest->GetRespawnDelay()); @@ -480,9 +488,12 @@ class instance_ulduar : public InstanceMapScript break; case DATA_HODIR_RARE_CACHE: HodirRareCacheData = data; - break; - case DATA_KNOCK_ON_WOOD_ACHIEVEMENTS: - elderCount = data; + if (!HodirRareCacheData) + { + if (Creature* Hodir = instance->GetCreature(HodirGUID)) + if (GameObject* gameObject = instance->GetGameObject(HodirRareCacheGUID)) + Hodir->RemoveGameObject(gameObject, false); + } break; default: break; @@ -582,33 +593,13 @@ class instance_ulduar : public InstanceMapScript { case TYPE_COLOSSUS: return Encounter[type]; - break; case DATA_HODIR_RARE_CACHE: return HodirRareCacheData; - break; - } - - return 0; - } - - bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* /*player*/, Unit const* /*target*/, uint32 /*miscvalue1*/) - { - switch (criteriaId) - { - case CRITERIA_KNOCK_ON_WOOD_10: - case CRITERIA_KNOCK_ON_WOOD_25: - return elderCount >= 1; - case CRITERIA_KNOCK_KNOCK_ON_WOOD_10: - case CRITERIA_KNOCK_KNOCK_ON_WOOD_25: - return elderCount >= 2; - case CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_10: - case CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_25: - return elderCount == 3; default: break; } - return false; + return 0; } std::string GetSaveData() diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h index f902c33f938..3ddb2eaf036 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h @@ -67,6 +67,7 @@ enum UlduarBosses enum UlduarNPCs { + // General NPC_LEVIATHAN = 33113, NPC_IGNIS = 33118, NPC_RAZORSCALE = 33186, @@ -79,7 +80,6 @@ enum UlduarNPCs NPC_MOLGEIM = 32927, NPC_BRUNDIR = 32857, NPC_KOLOGARN = 32930, - NPC_KOLOGARN_BRIDGE = 34297, NPC_FOCUSED_EYEBEAM = 33632, NPC_FOCUSED_EYEBEAM_RIGHT = 33802, NPC_LEFT_ARM = 32933, @@ -93,6 +93,8 @@ enum UlduarNPCs NPC_VEZAX = 33271, NPC_YOGGSARON = 33288, NPC_ALGALON = 32871, + + // Mimiron NPC_LEVIATHAN_MKII = 33432, NPC_VX_001 = 33651, NPC_AERIAL_COMMAND_UNIT = 33670, @@ -119,6 +121,16 @@ enum UlduarNPCs NPC_BATTLE_PRIEST_GINA = 33330, NPC_FIELD_MEDIC_PENNY = 32897, NPC_FIELD_MEDIC_JESSI = 33326, + + // Freya's trash NPCs + NPC_CORRUPTED_SERVITOR = 33354, + NPC_MISGUIDED_NYMPH = 33355, + NPC_GUARDIAN_LASHER = 33430, + NPC_FOREST_SWARMER = 33431, + NPC_MANGROVE_ENT = 33525, + NPC_IRONROOT_LASHER = 33526, + NPC_NATURES_BLADE = 33527, + NPC_GUARDIAN_OF_LIFE = 33528, }; enum UlduarGameObjects @@ -157,41 +169,7 @@ enum UlduarTowerEvents EVENT_TOWER_OF_LIFE_DESTROYED = 21030, }; -enum UlduarAchievementCriteriaIds -{ - // Flame Leviathan - CRITERIA_UNBROKEN_10 = 10044, - CRITERIA_UNBROKEN_25 = 10045, - CRITERIA_SHUTOUT_10 = 10054, - CRITERIA_SHUTOUT_25 = 10055, - CRITERIA_3_CAR_GARAGE_CHOPPER_10 = 10046, - CRITERIA_3_CAR_GARAGE_SIEGE_10 = 10047, - CRITERIA_3_CAR_GARAGE_DEMOLISHER_10 = 10048, - CRITERIA_3_CAR_GARAGE_CHOPPER_25 = 10049, - CRITERIA_3_CAR_GARAGE_SIEGE_25 = 10050, - CRITERIA_3_CAR_GARAGE_DEMOLISHER_25 = 10051, - - // Ignis - CRITERIA_HOT_POCKET_10 = 10430, - CRITERIA_HOT_POCKET_25 = 10431, - - // Razorscale - CRITERIA_QUICK_SHAVE_10 = 10062, - CRITERIA_QUICK_SHAVE_25 = 10063, - - // Freya - CRITERIA_KNOCK_ON_WOOD_10 = 10447, - CRITERIA_KNOCK_ON_WOOD_25 = 10459, - CRITERIA_KNOCK_KNOCK_ON_WOOD_10 = 10448, - CRITERIA_KNOCK_KNOCK_ON_WOOD_25 = 10460, - CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_10 = 10449, - CRITERIA_KNOCK_KNOCK_KNOCK_ON_WOOD_25 = 10461, -}; - -enum UlduarAchievementData -{ - DATA_KNOCK_ON_WOOD_ACHIEVEMENTS = 1, -}; +#define CRITERIA_CON_SPEED_ATORY 21597 template<class AI> CreatureAI* GetUlduarAI(Creature* creature) diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp index bff1e8e011d..eb9f2b1928a 100755 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp @@ -63,19 +63,14 @@ uint32 OPvPCapturePointNA::GetAliveGuardsCount() case NA_NPC_GUARD_13: case NA_NPC_GUARD_14: case NA_NPC_GUARD_15: + { + if (Creature* cr = HashMapHolder<Creature>::Find(itr->second)) { - if (Creature* cr = HashMapHolder<Creature>::Find(itr->second)) - { - if (cr->isAlive()) - ++cnt; - } - else if (CreatureData const* cd = sObjectMgr->GetCreatureData(GUID_LOPART(itr->second))) - { - if (!cd->is_dead) - ++cnt; - } + if (cr->isAlive()) + ++cnt; } - break; + } + break; default: break; } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 67939a61f23..fe0ecf26c96 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1154,6 +1154,117 @@ public: } }; +enum Launch +{ + SPELL_LAUNCH_NO_FALLING_DAMAGE = 66251 +}; + +class spell_gen_launch : public SpellScriptLoader +{ + public: + spell_gen_launch() : SpellScriptLoader("spell_gen_launch") {} + + class spell_gen_launch_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_launch_SpellScript); + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + SpellEntry const* const spell = GetSpellInfo(); + + if (Player* player = GetHitPlayer()) + { + player->CastSpell(player,spell->EffectTriggerSpell[1],true); // changes the player's seat + player->AddAura(SPELL_LAUNCH_NO_FALLING_DAMAGE,player); // prevents falling damage + } + } + + void Launch() + { + WorldLocation const* const position = GetTargetDest(); + + if (Player* player = GetHitPlayer()) + { + player->ExitVehicle(); + + // A better research is needed + // There is no spell for this, the following calculation was based on void Spell::CalculateJumpSpeeds + + float speedZ = 10.0f; + float dist = position->GetExactDist2d(player->GetPositionX(),player->GetPositionY()); + float speedXY = dist; + + player->GetMotionMaster()->MoveJump(position->GetPositionX(),position->GetPositionY(),position->GetPositionZ(),speedXY,speedZ); + } + } + + void Register() + { + OnEffect += SpellEffectFn(spell_gen_launch_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_FORCE_CAST); + AfterHit += SpellHitFn(spell_gen_launch_SpellScript::Launch); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_launch_SpellScript(); + } +}; + +class spell_gen_vehicle_scaling : public SpellScriptLoader +{ + public: + spell_gen_vehicle_scaling() : SpellScriptLoader("spell_gen_vehicle_scaling") { } + + class spell_gen_vehicle_scaling_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_vehicle_scaling_AuraScript); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + Unit* caster = GetCaster(); + if (!caster || !caster->ToPlayer()) + return; + + float factor; + uint16 baseItemLevel; + + // TODO: Reserach coeffs for different vehicles + switch (GetId()) + { + case 66668: + factor = 1.0f; + baseItemLevel = 205; + break; + default: + factor = 1.0f; + baseItemLevel = 170; + break; + } + + float avgILvl = caster->ToPlayer()->GetAverageItemLevel(); + if (avgILvl < baseItemLevel) + return; // TODO: Research possibility of scaling down + + amount = uint16((avgILvl - baseItemLevel) * factor); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_vehicle_scaling_AuraScript(); + } +}; + void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); @@ -1181,4 +1292,6 @@ void AddSC_generic_spell_scripts() new spell_gen_lifeblood(); new spell_gen_magic_rooster(); new spell_gen_allow_cast_from_item_only(); + new spell_gen_launch(); + new spell_gen_vehicle_scaling(); } |