diff options
| -rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 19 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 16 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 29 |
5 files changed, 54 insertions, 14 deletions
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 8b1d91a89f3..9a54ec826c2 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -571,7 +571,7 @@ void WorldSession::HandleResurrectResponse(WorldPackets::Misc::ResurrectResponse if (GetPlayer()->IsAlive()) return; - if (packet.Response == 0) + if (packet.Response != 0) // Accept = 0 Decline = 1 Timeout = 2 { GetPlayer()->ClearResurrectRequestData(); // reject return; diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 01164039420..8560a54067d 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -677,3 +677,22 @@ WorldPacket const* WorldPackets::Spells::SpellChannelUpdate::Write() _worldPacket << int32(TimeRemaining); return &_worldPacket; } + +WorldPacket const* WorldPackets::Spells::ResurrectRequest::Write() +{ + _worldPacket << ResurrectOffererGUID; + _worldPacket << ResurrectOffererVirtualRealmAddress; + + _worldPacket << PetNumber; + _worldPacket << SpellID; + + _worldPacket.WriteBits(Name.length(), 6); + _worldPacket.WriteBit(UseTimer); + _worldPacket.WriteBit(Sickness); + + _worldPacket.FlushBits(); + + _worldPacket.WriteString(Name); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 1f7cdd0b93a..87120cf8d00 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -660,6 +660,22 @@ namespace WorldPackets ObjectGuid CasterGUID; int32 TimeRemaining = 0; }; + + class ResurrectRequest final : public ServerPacket + { + public: + ResurrectRequest() : ServerPacket(SMSG_RESURRECT_REQUEST, 16 + 4 + 4 + 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid ResurrectOffererGUID; + uint32 ResurrectOffererVirtualRealmAddress = 0; + uint32 PetNumber = 0; + int32 SpellID = 0; + bool UseTimer = false; + bool Sickness = false; + std::string Name; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index a9cc63e4eb5..30442711a8a 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1568,7 +1568,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_CAST_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_COMMS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_TOKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESYNC_RUNES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHANGED_INFORM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHOSEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index e32f55bfe35..6f3b1af11e6 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4315,21 +4315,26 @@ void Spell::SendResurrectRequest(Player* target) // get resurrector name for creature resurrections, otherwise packet will be not accepted // for player resurrections the name is looked up by guid std::string const sentName(m_caster->GetTypeId() == TYPEID_PLAYER - ? "" - : m_caster->GetNameForLocaleIdx(target->GetSession()->GetSessionDbLocaleIndex())); + ? "" : m_caster->GetNameForLocaleIdx(target->GetSession()->GetSessionDbLocaleIndex())); + + WorldPackets::Spells::ResurrectRequest resurrectRequest; + resurrectRequest.ResurrectOffererGUID = m_caster->GetGUID(); + resurrectRequest.ResurrectOffererVirtualRealmAddress = GetVirtualRealmAddress(); - WorldPacket data(SMSG_RESURRECT_REQUEST, (8+4+sentName.size()+1+1+1+4)); - data << m_caster->GetGUID(); - data << uint32(sentName.size() + 1); + if (Pet* pet = target->GetPet()) + { + if (CharmInfo* charmInfo = pet->GetCharmInfo()) + resurrectRequest.PetNumber = charmInfo->GetPetNumber(); + } - data << sentName; - data << uint8(0); // null terminator + resurrectRequest.SpellID = m_spellInfo->Id; - data << uint8(m_caster->GetTypeId() == TYPEID_PLAYER ? 0 : 1); // "you'll be afflicted with resurrection sickness" - // override delay sent with SMSG_CORPSE_RECLAIM_DELAY, set instant resurrection for spells with this attribute - // 4.2.2 edit : id of the spell used to resurect. (used client-side for Mass Resurect) - data << uint32(m_spellInfo->Id); - target->GetSession()->SendPacket(&data); + //packet.ReadBit("UseTimer"); /// @todo: 6.x Has to be implemented + resurrectRequest.Sickness = m_caster->GetTypeId() != TYPEID_PLAYER; // "you'll be afflicted with resurrection sickness" + + resurrectRequest.Name = sentName; + + target->GetSession()->SendPacket(resurrectRequest.Write()); } void Spell::TakeCastItem() |
