From 11cc3eac7a9d19778f070c130facd4ee471d8169 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Thu, 30 Dec 2010 19:57:50 +0100 Subject: Core/Vehicles: Implement VEHICLE_SEAT_FLAG_B_CANSWITCH restriction, and do some cleanup. --- src/server/game/DataStores/DBCStructure.h | 1 + src/server/game/Entities/Vehicle/Vehicle.cpp | 11 ----------- src/server/game/Server/Protocol/Handlers/MovementHandler.cpp | 12 ++++++++++++ 3 files changed, 13 insertions(+), 11 deletions(-) (limited to 'src/server') 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/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 8a60d5e7562..b28717250dd 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(); 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)); -- cgit v1.2.3 From 9c7c62cc5e7033ebb9db47b20fc3d1fee83cd342 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Thu, 30 Dec 2010 23:40:20 +0100 Subject: Core/Vehicles: Send transport X,Y,Z offsets as floats instead of uint32, fixes a possible client crash. Thanks to j4r0d --- src/server/game/Entities/Unit/Unit.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/server') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5d653cf6d47..d3ca2ac39d2 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); } -- cgit v1.2.3 From 2cb1987a0a3f9f222e2cf29efb64bc6af74c57a9 Mon Sep 17 00:00:00 2001 From: j4r0d Date: Fri, 31 Dec 2010 00:10:49 +0100 Subject: Core/Spells: Fix Sacred Shield proccing on attacker Signed-off-by: Machiavelli --- src/server/game/Entities/Unit/Unit.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src/server') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d3ca2ac39d2..b6ded83d206 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -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 -- cgit v1.2.3 From 4b0341c167ad80c815c0fbacdbae2148105dc479 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Fri, 31 Dec 2010 01:40:31 +0100 Subject: Core/Vehicles: Add an assert to trace down crash in Vehicle::RelocatePassengers --- src/server/game/Entities/Vehicle/Vehicle.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/server') diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index b28717250dd..6e4d49f65ef 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -432,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; -- cgit v1.2.3 From 73fe85e6fd5a7822991de89ac2a563a317c6c859 Mon Sep 17 00:00:00 2001 From: leak Date: Fri, 31 Dec 2010 04:47:57 +0100 Subject: Core/Handlers: Allow gamemasters to send mails with customer support badge depending on gm mode (.gm off/on) --- src/server/game/Mails/Mail.cpp | 7 +++++++ src/server/game/Mails/Mail.h | 1 + src/server/game/Server/Protocol/Handlers/MailHandler.cpp | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) (limited to 'src/server') 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..fc841f9f3c8 100755 --- a/src/server/game/Server/Protocol/Handlers/MailHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MailHandler.cpp @@ -280,11 +280,13 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data) // If theres is an item, there is a one hour delivery delay if sent to another account's character. uint32 deliver_delay = needItemDelay ? sWorld->getIntConfig(CONFIG_MAIL_DELIVERY_DELAY) : 0; + uint32 stationary = pl->isGameMaster() ? MAIL_STATIONERY_GM : MAIL_STATIONERY_DEFAULT; + // will delete item or place to receiver mail list 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); -- cgit v1.2.3 From d747b8063b9a2231db03192e58c5b45d78ce23e1 Mon Sep 17 00:00:00 2001 From: leak Date: Fri, 31 Dec 2010 04:50:26 +0100 Subject: And remove useless testing code again.. --- src/server/game/Server/Protocol/Handlers/MailHandler.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/server') diff --git a/src/server/game/Server/Protocol/Handlers/MailHandler.cpp b/src/server/game/Server/Protocol/Handlers/MailHandler.cpp index fc841f9f3c8..7d1d1890696 100755 --- a/src/server/game/Server/Protocol/Handlers/MailHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MailHandler.cpp @@ -280,8 +280,6 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data) // If theres is an item, there is a one hour delivery delay if sent to another account's character. uint32 deliver_delay = needItemDelay ? sWorld->getIntConfig(CONFIG_MAIL_DELIVERY_DELAY) : 0; - uint32 stationary = pl->isGameMaster() ? MAIL_STATIONERY_GM : MAIL_STATIONERY_DEFAULT; - // will delete item or place to receiver mail list draft .AddMoney(money) -- cgit v1.2.3 From 3a053c6cd348be5984edcf5c776d5becbca61047 Mon Sep 17 00:00:00 2001 From: John Holiver Date: Fri, 31 Dec 2010 02:23:29 -0200 Subject: Scripts/Trial of the Crusader: 1) Fix Leeching Swarm damage and create spell difficulty links to code. Closes issue #4909 . 2) Fix Valkyr's Touch. Closes issue #4553 . 3) Fix Permafrost aura difficulty check. 4) Reduce Slime Pool damage range. 5) Avoid Shaman Champion Heroism spam using 5 minutes (CD) as timer. 6) Fix many spell target selection to only select players (no more totens or pets). 7) Fix Anub'arak Spike being able to receibe the permafrost aura in order to cast spike fail, hopefully. --- sql/base/world_database.sql | 5 +++++ sql/updates/10910_world_spell_script_names.sql | 6 ++++++ src/server/game/Entities/Unit/Unit.h | 1 + src/server/game/Spells/Auras/SpellAuraEffects.cpp | 23 ++++++++++++++-------- .../TrialOfTheCrusader/boss_anubarak_trial.cpp | 4 ++-- .../TrialOfTheCrusader/boss_faction_champions.cpp | 2 +- .../TrialOfTheCrusader/boss_lord_jaraxxus.cpp | 8 ++++---- .../TrialOfTheCrusader/boss_northrend_beasts.cpp | 2 +- .../TrialOfTheCrusader/boss_twin_valkyr.cpp | 2 +- src/server/scripts/Spells/spell_generic.cpp | 22 ++++++++++----------- 10 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 sql/updates/10910_world_spell_script_names.sql (limited to 'src/server') diff --git a/sql/base/world_database.sql b/sql/base/world_database.sql index d1ec9c60687..dae6a244462 100644 --- a/sql/base/world_database.sql +++ b/sql/base/world_database.sql @@ -26878,6 +26878,11 @@ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES ( 71900, 'spell_blood_queen_bloodbolt'), ( 71901, 'spell_blood_queen_bloodbolt'), ( 71902, 'spell_blood_queen_bloodbolt'), +-- Trial of Crusader +( 66118, 'spell_gen_leeching_swarm'), +( 67630, 'spell_gen_leeching_swarm'), +( 68646, 'spell_gen_leeching_swarm'), +( 68647, 'spell_gen_leeching_swarm'), -- Ulduar ( 62717, 'spell_ignis_slag_pot'), ( 63477, 'spell_ignis_slag_pot'), diff --git a/sql/updates/10910_world_spell_script_names.sql b/sql/updates/10910_world_spell_script_names.sql new file mode 100644 index 00000000000..46e1ff570e0 --- /dev/null +++ b/sql/updates/10910_world_spell_script_names.sql @@ -0,0 +1,6 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN ( 66118, 67630, 68646, 68647 ); +INSERT INTO `spell_script_names` VALUES +(66118, 'spell_gen_leeching_swarm'), +(67630, 'spell_gen_leeching_swarm'), +(68646, 'spell_gen_leeching_swarm'), +(68647, 'spell_gen_leeching_swarm'); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 3c9de3197ce..0fb06acc4fa 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/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() -- cgit v1.2.3 From dcb0902e61fda227a0e4c27ca535ca106e3e2353 Mon Sep 17 00:00:00 2001 From: silinoron Date: Thu, 30 Dec 2010 21:15:11 -0800 Subject: Core/Player: Add a helper function in Player to get the number of grantable levels. For future use. Thanks Phazerz for helping me confirm this is the right value. --- src/server/game/Entities/Player/Player.h | 1 + 1 file changed, 1 insertion(+) (limited to 'src/server') 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 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; } -- cgit v1.2.3 From 82b79080c0477d99ff03179e4d052c0009591409 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 31 Dec 2010 11:21:37 +0100 Subject: Core/Quests: Fixed repeatable quests not being available when belonging to an exclusive group (usually dailies) --- src/server/game/Entities/Player/Player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server') 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); -- cgit v1.2.3