diff options
Diffstat (limited to 'src')
17 files changed, 71 insertions, 51 deletions
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 40d68a3ea3f..7f00ec85f48 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1848,6 +1848,7 @@ struct VehicleSeatEntry // 46-57 added in 3.1, floats mostly bool CanEnterOrExit() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT; } + bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_B_CANSWITCH; } bool IsUsableByAura() const { return m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3); } bool IsEjectable() const { return m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE; } }; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index de2f5d16a3f..9a102de874f 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15017,8 +15017,8 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) return false; } - // alternative quest already started or completed - if (m_QuestStatus.find(exclude_Id) != m_QuestStatus.end() || m_RewardedQuests.find(exclude_Id) != m_RewardedQuests.end()) + // alternative quest already started or completed - but don't check rewarded states if both are repeatable + if (m_QuestStatus.find(exclude_Id) != m_QuestStatus.end() || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && m_RewardedQuests.find(exclude_Id) != m_RewardedQuests.end())) { if (msg) SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index d1f217d7a3e..7d9838001e4 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1936,6 +1936,7 @@ class Player : public Unit, public GridObject<Player> bool isHonorOrXPTarget(Unit* pVictim); bool GetsRecruitAFriendBonus(bool forXP); + uint8 GetGrantableLevels() { return GetByteValue(PLAYER_FIELD_BYTES, 1); } ReputationMgr& GetReputationMgr() { return m_reputationMgr; } ReputationMgr const& GetReputationMgr() const { return m_reputationMgr; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1459ff2b8c3..b1c96166c1c 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -418,11 +418,11 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 M void Unit::SendMonsterMoveTransport(Unit *vehicleOwner) { // TODO: Turn into BuildMonsterMoveTransport packet and allow certain variables (for npc movement aboard vehicles) - WorldPacket data(SMSG_MONSTER_MOVE_TRANSPORT, GetPackGUID().size()+vehicleOwner->GetPackGUID().size()); + WorldPacket data(SMSG_MONSTER_MOVE_TRANSPORT, GetPackGUID().size()+vehicleOwner->GetPackGUID().size() + 47); data.append(GetPackGUID()); data.append(vehicleOwner->GetPackGUID()); data << int8(GetTransSeat()); - data << uint8(0); // unk boolean + data << uint8(0); // unk boolean data << GetPositionX() - vehicleOwner->GetPositionX(); data << GetPositionY() - vehicleOwner->GetPositionY(); data << GetPositionZ() - vehicleOwner->GetPositionZ(); @@ -431,10 +431,10 @@ void Unit::SendMonsterMoveTransport(Unit *vehicleOwner) data << GetTransOffsetO(); // facing angle? data << uint32(SPLINEFLAG_TRANSPORT); data << uint32(0); // move time - data << uint32(1); - data << uint32(GetTransOffsetX()); - data << uint32(GetTransOffsetY()); - data << uint32(GetTransOffsetZ()); + data << uint32(1); // amount of waypoints + data << GetTransOffsetX(); + data << GetTransOffsetY(); + data << GetTransOffsetZ(); SendMessageToSet(&data, true); } @@ -6493,10 +6493,9 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger return false; } else if (damage > 0) - { triggered_spell_id = 58597; - target = this; - } + + target = this; break; } // Righteous Vengeance diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f3f9dc70882..d9c9acdfa5f 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1255,6 +1255,7 @@ class Unit : public WorldObject inline bool HealthAbovePct(int32 pct) const { return GetHealth() * (uint64)100 > GetMaxHealth() * (uint64)pct; } inline float GetHealthPct() const { return GetMaxHealth() ? 100.f * GetHealth() / GetMaxHealth() : 0.0f; } inline uint32 CountPctFromMaxHealth(int32 pct) const { return CalculatePctN(GetMaxHealth(), pct); } + inline uint32 CountPctFromCurHealth(int32 pct) const { return CalculatePctN(GetHealth(), pct); } void SetHealth(uint32 val); void SetMaxHealth(uint32 val); diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 8a60d5e7562..6e4d49f65ef 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -423,17 +423,6 @@ void Vehicle::RemovePassenger(Unit *unit) sScriptMgr->OnRemovePassenger(this, unit); } -void Vehicle::EjectPassenger(Unit* passenger, Unit* controller) -{ - SeatMap::const_iterator m_SeatsItr; - for (m_SeatsItr = m_Seats.begin(); m_SeatsItr != m_Seats.end(); ++m_SeatsItr) - if (m_SeatsItr->second.passenger == passenger) - if (m_SeatsItr->second.seatInfo->IsEjectable()) - return passenger->ExitVehicle(); - else - sLog->outError("Player %u attempted to eject unit GUID "UI64FMTD" from non-ejectable seat.", controller->GetGUIDLow(), passenger->GetGUID()); -} - void Vehicle::RelocatePassengers(float x, float y, float z, float ang) { Map *map = me->GetMap(); @@ -443,6 +432,8 @@ void Vehicle::RelocatePassengers(float x, float y, float z, float ang) for (SeatMap::const_iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr) if (Unit *passenger = itr->second.passenger) { + ASSERT(passenger->IsInWorld()); + float px = x + passenger->m_movementInfo.t_pos.m_positionX; float py = y + passenger->m_movementInfo.t_pos.m_positionY; float pz = z + passenger->m_movementInfo.t_pos.m_positionZ; diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp index 287767723bd..ef36fe430c5 100755 --- a/src/server/game/Mails/Mail.cpp +++ b/src/server/game/Mails/Mail.cpp @@ -60,6 +60,13 @@ MailSender::MailSender(AuctionEntry* sender) { } +MailSender::MailSender(Player* sender) +{ + m_messageType = MAIL_NORMAL; + m_stationery = sender->isGameMaster() ? MAIL_STATIONERY_GM : MAIL_STATIONERY_DEFAULT; + m_senderId = sender->GetGUIDLow(); +} + MailReceiver::MailReceiver(Player* receiver) : m_receiver(receiver), m_receiver_lowguid(receiver->GetGUIDLow()) { diff --git a/src/server/game/Mails/Mail.h b/src/server/game/Mails/Mail.h index 4308d53676d..c729566b398 100755 --- a/src/server/game/Mails/Mail.h +++ b/src/server/game/Mails/Mail.h @@ -95,6 +95,7 @@ class MailSender } MailSender(Object* sender, MailStationery stationery = MAIL_STATIONERY_DEFAULT); MailSender(AuctionEntry* sender); + MailSender(Player* sender); public: // Accessors MailMessageType GetMailMessageType() const { return m_messageType; } uint32 GetSenderId() const { return m_senderId; } diff --git a/src/server/game/Server/Protocol/Handlers/MailHandler.cpp b/src/server/game/Server/Protocol/Handlers/MailHandler.cpp index 986de94dd98..7d1d1890696 100755 --- a/src/server/game/Server/Protocol/Handlers/MailHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MailHandler.cpp @@ -284,7 +284,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data) draft .AddMoney(money) .AddCOD(COD) - .SendMailTo(trans, MailReceiver(receive, GUID_LOPART(rc)), pl, body.empty() ? MAIL_CHECK_MASK_COPIED : MAIL_CHECK_MASK_HAS_BODY, deliver_delay); + .SendMailTo(trans, MailReceiver(receive, GUID_LOPART(rc)), MailSender(pl), body.empty() ? MAIL_CHECK_MASK_COPIED : MAIL_CHECK_MASK_HAS_BODY, deliver_delay); pl->SaveInventoryAndGoldToDB(trans); CharacterDatabase.CommitTransaction(trans); diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp index 0cd943ef9e7..675286e538f 100755 --- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp @@ -548,6 +548,14 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data) if (!vehicle_base) return; + VehicleSeatEntry const* seat = GetPlayer()->GetVehicle()->GetSeatForPassenger(GetPlayer()); + if (!seat->CanSwitchFromSeat()) + { + sLog->outError("HandleChangeSeatsOnControlledVehicle, Opcode: %u, Player %u tried to switch seats but current seatflags %u don't permit that.", + recv_data.GetOpcode(), GetPlayer()->GetGUIDLow(), seat->m_flags); + return; + } + switch (recv_data.GetOpcode()) { case CMSG_REQUEST_VEHICLE_PREV_SEAT: @@ -635,6 +643,8 @@ void WorldSession::HandleEjectPassenger(WorldPacket &data) VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(plr); if (seat->IsEjectable()) plr->ExitVehicle(); + else + sLog->outError("Player %u attempted to eject player %u from non-ejectable seat.", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid)); } else sLog->outError("Player %u tried to eject player %u from vehicle, but the latter was not found in world!", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid)); @@ -650,6 +660,8 @@ void WorldSession::HandleEjectPassenger(WorldPacket &data) unit->ExitVehicle(); unit->ToCreature()->ForcedDespawn(1000); } + else + sLog->outError("Player %u attempted to eject creature GUID "UI64FMTD" from non-ejectable seat.", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid)); } else sLog->outError("Player %u tried to eject creature guid %u from vehicle, but the latter was not found in world!", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid)); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 3afd452044b..275a7d38ab8 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2362,16 +2362,23 @@ void AuraEffect::TriggerSpell(Unit * target, Unit * caster) const case 65920: case 65922: case 65923: - if (caster->HasAura(66193)) { - if (Unit *permafrostCaster = caster->GetAura(66193)->GetCaster()) + Unit *permafrostCaster = NULL; + if (caster->HasAura(66193)) permafrostCaster = caster->GetAura(66193)->GetCaster(); + if (caster->HasAura(67855)) permafrostCaster = caster->GetAura(67855)->GetCaster(); + if (caster->HasAura(67856)) permafrostCaster = caster->GetAura(67856)->GetCaster(); + if (caster->HasAura(67857)) permafrostCaster = caster->GetAura(67857)->GetCaster(); + + if (permafrostCaster) + { if (Creature *permafrostCasterAsCreature = permafrostCaster->ToCreature()) permafrostCasterAsCreature->ForcedDespawn(3000); - - caster->CastSpell(caster, 66181, false); - caster->RemoveAllAuras(); - if (Creature *casterAsCreature = caster->ToCreature()) - casterAsCreature->DisappearAndDie(); + + caster->CastSpell(caster, 66181, false); + caster->RemoveAllAuras(); + if (Creature *casterAsCreature = caster->ToCreature()) + casterAsCreature->DisappearAndDie(); + } } break; // Mana Tide @@ -2387,7 +2394,7 @@ void AuraEffect::TriggerSpell(Unit * target, Unit * caster) const case 54362: // Slime Pool (Dreadscale & Acidmaw) case 66882: - target->CastCustomSpell(triggerSpellId, SPELLVALUE_RADIUS_MOD, (int32)((((float)m_tickNumber / 60) * 0.9f + 0.1f) * 10000), NULL, true, NULL, this); + target->CastCustomSpell(triggerSpellId, SPELLVALUE_RADIUS_MOD, (int32)((((float)m_tickNumber / 60) * 0.9f + 0.1f) * 10000 * 2 / 3), NULL, true, NULL, this); return; // Beacon of Light case 53563: diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index ce60df4fdc0..c84f0ae1021 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -222,7 +222,7 @@ public: void JustSummoned(Creature* pSummoned) { - Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM); + Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true); switch (pSummoned->GetEntry()) { case NPC_BURROW: @@ -658,7 +658,7 @@ public: void Reset() { // For an unknown reason this npc isn't recognize the Aura of Permafrost with this flags =/ - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE); m_uiTargetGUID = 0; } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 5b73b399106..6fbd4493661 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -601,7 +601,7 @@ public: else if (!me->HasAura(AURA_SATED)) DoCastAOE(SPELL_BLOODLUST); - m_uiHeroismOrBloodlustTimer = urand(30*IN_MILLISECONDS, 60*IN_MILLISECONDS); + m_uiHeroismOrBloodlustTimer = 300*IN_MILLISECONDS; } else m_uiHeroismOrBloodlustTimer -= uiDiff; if (m_uiHexTimer <= uiDiff) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index 4dd334ed32a..1fcca917b7d 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -209,7 +209,7 @@ public: if (m_uiIncinerateFleshTimer <= uiDiff) { - if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1)) + if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true)) { DoScriptText(EMOTE_INCINERATE, me, pTarget); DoScriptText(SAY_INCINERATE, me); @@ -226,7 +226,7 @@ public: if (m_uiLegionFlameTimer <= uiDiff) { - if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1)) + if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true)) { DoScriptText(EMOTE_LEGION_FLAME, me, pTarget); DoCast(pTarget, SPELL_LEGION_FLAME); @@ -534,14 +534,14 @@ public: if (m_uiSpinningStrikeTimer <= uiDiff) { - if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) DoCast(pTarget, SPELL_SPINNING_STRIKE); m_uiSpinningStrikeTimer = 30*IN_MILLISECONDS; } else m_uiSpinningStrikeTimer -= uiDiff; if (IsHeroic() && m_uiMistressKissTimer <= uiDiff) { - if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) DoCast(pTarget, SPELL_MISTRESS_KISS); m_uiMistressKissTimer = 30*IN_MILLISECONDS; } else m_uiMistressKissTimer -= uiDiff; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index b2c08301332..e5a6705b0e4 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -843,7 +843,7 @@ public: m_uiStage = 2; break; case 2: - if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) { m_uiTrampleTargetGUID = pTarget->GetGUID(); me->SetUInt64Value(UNIT_FIELD_TARGET, m_uiTrampleTargetGUID); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 4e14a2208fa..80e168b3de9 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -389,7 +389,7 @@ struct boss_twin_baseAI : public ScriptedAI if (IsHeroic() && m_uiTouchTimer <= uiDiff) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true, m_uiOtherEssenceSpellId)) - DoCast(pTarget, m_uiTouchSpellId); + me->CastCustomSpell(m_uiTouchSpellId, SPELLVALUE_MAX_TARGETS, 1, pTarget, false); m_uiTouchTimer = urand(10, 15)*IN_MILLISECONDS; } m_uiTouchTimer -= uiDiff; diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 0f664c3d829..1d35ebf59d4 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -281,17 +281,17 @@ public: void HandleEffectPeriodic(AuraEffect const * aurEff) { - Unit* pTarget = GetTarget(); - if (Unit* pCaster = GetCaster()) - { - int32 lifeLeeched = pTarget->CountPctFromMaxHealth(aurEff->GetAmount()); - if (lifeLeeched < 250) - lifeLeeched = 250; - // Damage - pCaster->CastCustomSpell(pTarget, SPELL_LEECHING_SWARM_DMG, &lifeLeeched, 0, 0, false); - // Heal - pCaster->CastCustomSpell(pCaster, SPELL_LEECHING_SWARM_HEAL, &lifeLeeched, 0, 0, false); - } + if (Unit* pTarget = GetTarget()) + if (Unit* pCaster = GetCaster()) + { + int32 lifeLeeched = pTarget->CountPctFromCurHealth(aurEff->GetAmount()); + if (lifeLeeched < 250) + lifeLeeched = 250; + // Damage + pCaster->CastCustomSpell(pTarget, SPELL_LEECHING_SWARM_DMG, &lifeLeeched, 0, 0, false); + // Heal + pCaster->CastCustomSpell(pCaster, SPELL_LEECHING_SWARM_HEAL, &lifeLeeched, 0, 0, false); + } } void Register() |