diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h index f05eb8521..27646fda2 100644 --- a/src/game/DBCStructure.h +++ b/src/game/DBCStructure.h @@ -1099,8 +1099,8 @@ struct MapEntry // Helpers uint32 Expansion() const { return addon; } - bool IsDungeon() const { return map_type == MAP_INSTANCE || map_type == MAP_RAID; } + bool IsNonRaidDungeon() const { return map_type == MAP_INSTANCE; } bool Instanceable() const { return map_type == MAP_INSTANCE || map_type == MAP_RAID || map_type == MAP_BATTLEGROUND || map_type == MAP_ARENA; } bool IsRaid() const { return map_type == MAP_RAID; } bool IsBattleGround() const { return map_type == MAP_BATTLEGROUND; } diff --git a/src/game/GMTicketHandler.cpp b/src/game/GMTicketHandler.cpp index 71a782817..8a36ff9dd 100644 --- a/src/game/GMTicketHandler.cpp +++ b/src/game/GMTicketHandler.cpp @@ -34,10 +34,10 @@ void WorldSession::SendGMTicketGetTicket(uint32 status, char const* text) { data << text; // ticket text data << uint8(0x7); // ticket category - data << float(0); // time from ticket creation? - data << float(0); // const - data << float(0); // const - data << uint8(0); // const + data << float(0); // tickets in queue? + data << float(0); // if > "tickets in queue" then "We are currently experiencing a high volume of petitions." + data << float(0); // 0 - "Your ticket will be serviced soon", 1 - "Wait time currently unavailable" + data << uint8(0); // if == 2 and next field == 1 then "Your ticket has been escalated" data << uint8(0); // const } SendPacket( &data ); @@ -104,7 +104,7 @@ void WorldSession::HandleGMTicketCreateOpcode( WorldPacket & recv_data ) if(ticketmgr.GetGMTicket(GetPlayer()->GetGUIDLow())) { WorldPacket data( SMSG_GMTICKET_CREATE, 4 ); - data << uint32(1); + data << uint32(1); // 1 - You already have GM ticket SendPacket( &data ); return; } @@ -117,7 +117,7 @@ void WorldSession::HandleGMTicketCreateOpcode( WorldPacket & recv_data ) SendPacket( &data ); data.Initialize( SMSG_GMTICKET_CREATE, 4 ); - data << uint32(2); + data << uint32(2); // 2 - nothing appears (3-error creating, 5-error updating) SendPacket( &data ); DEBUG_LOG("update the ticket"); @@ -141,7 +141,7 @@ void WorldSession::HandleGMTicketSystemStatusOpcode( WorldPacket & /*recv_data*/ void WorldSession::HandleGMSurveySubmit( WorldPacket & recv_data) { // GM survey is shown after SMSG_GM_TICKET_STATUS_UPDATE with status = 3 - CHECK_PACKET_SIZE(recv_data,4+4); + CHECK_PACKET_SIZE(recv_data, 4+4); uint32 x; recv_data >> x; // answer range? (6 = 0-5?) sLog.outDebug("SURVEY: X = %u", x); diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 3882fdcfc..ed03747a8 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -2499,7 +2499,7 @@ void InstanceMap::UnloadAll(bool pForce) void InstanceMap::SendResetWarnings(uint32 timeLeft) const { for(MapRefManager::const_iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr) - itr->getSource()->SendInstanceResetWarning(GetId(), timeLeft); + itr->getSource()->SendInstanceResetWarning(GetId(), itr->getSource()->GetDifficulty(), timeLeft); } void InstanceMap::SetResetSchedule(bool on) diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index a49f939d6..35fb62b5f 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -48,7 +48,7 @@ void WorldSession::HandleMoveWorldportAckOpcode() WorldLocation &loc = GetPlayer()->GetTeleportDest(); // possible errors in the coordinate validity check - if(!MapManager::IsValidMapCoord(loc.mapid,loc.x,loc.y,loc.z,loc.o)) + if(!MapManager::IsValidMapCoord(loc.mapid, loc.x, loc.y, loc.z, loc.o)) { LogoutPlayer(false); return; @@ -72,20 +72,17 @@ void WorldSession::HandleMoveWorldportAckOpcode() // to let GetInstance() determine the proper InstanceId based on the player's binds GetPlayer()->SetInstanceId(0); - // check this before Map::Add(player), because that will create the instance save! - bool reset_notify = (GetPlayer()->GetBoundInstance(GetPlayer()->GetMapId(), GetPlayer()->GetDifficulty()) == NULL); - GetPlayer()->SendInitialPacketsBeforeAddToMap(); // the CanEnter checks are done in TeleporTo but conditions may change // while the player is in transit, for example the map may get full if(!GetPlayer()->GetMap()->Add(GetPlayer())) { - sLog.outDebug("WORLD: teleport of player %s (%d) to location %d,%f,%f,%f,%f failed", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow(), loc.mapid, loc.x, loc.y, loc.z, loc.o); + sLog.outDebug("WORLD: teleport of player %s (%d) to location %d, %f, %f, %f, %f failed", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow(), loc.mapid, loc.x, loc.y, loc.z, loc.o); // teleport the player home if(!GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation())) { // the player must always be able to teleport home - sLog.outError("WORLD: failed to teleport player %s (%d) to homebind location %d,%f,%f,%f,%f!", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow(), GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation()); + sLog.outError("WORLD: failed to teleport player %s (%d) to homebind location %d, %f, %f, %f, %f!", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow(), GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation()); assert(false); } return; @@ -95,10 +92,11 @@ void WorldSession::HandleMoveWorldportAckOpcode() // only add to bg group and object, if the player was invited (else he entered through command) if(_player->InBattleGround()) { - // cleanup seting if outdated + // cleanup setting if outdated if(!mEntry->IsBattleGroundOrArena()) { - _player->SetBattleGroundId(0, BATTLEGROUND_TYPE_NONE); // We're not in BG. + // We're not in BG + _player->SetBattleGroundId(0, BATTLEGROUND_TYPE_NONE); // reset destination bg team _player->SetBGTeam(0); } @@ -113,7 +111,7 @@ void WorldSession::HandleMoveWorldportAckOpcode() GetPlayer()->SendInitialPacketsAfterAddToMap(); // flight fast teleport case - if(GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType()==FLIGHT_MOTION_TYPE) + if(GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE) { if(!_player->InBattleGround()) { @@ -140,13 +138,10 @@ void WorldSession::HandleMoveWorldportAckOpcode() } } - if(mEntry->IsRaid() && mInstance) + if((mEntry->IsRaid() || (mEntry->IsNonRaidDungeon() && mEntry->SupportsHeroicMode() && GetPlayer()->IsHeroic())) && mInstance) { - if(reset_notify) - { - uint32 timeleft = sInstanceSaveManager.GetResetTimeFor(GetPlayer()->GetMapId()) - time(NULL); - GetPlayer()->SendInstanceResetWarning(GetPlayer()->GetMapId(), timeleft); // greeting at the entrance of the resort raid instance - } + uint32 timeleft = sInstanceSaveManager.GetResetTimeFor(GetPlayer()->GetMapId()) - time(NULL); + GetPlayer()->SendInstanceResetWarning(GetPlayer()->GetMapId(), GetPlayer()->GetDifficulty(), timeleft); } // mount allow check @@ -163,7 +158,7 @@ void WorldSession::HandleMoveWorldportAckOpcode() void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) { - CHECK_PACKET_SIZE(recv_data,8+4); + CHECK_PACKET_SIZE(recv_data, 8+4); sLog.outDebug("MSG_MOVE_TELEPORT_ACK"); uint64 guid; @@ -171,11 +166,11 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) recv_data >> guid; recv_data >> flags >> time; - DEBUG_LOG("Guid " UI64FMTD,guid); - DEBUG_LOG("Flags %u, time %u",flags, time/IN_MILISECONDS); + DEBUG_LOG("Guid " UI64FMTD, guid); + DEBUG_LOG("Flags %u, time %u", flags, time/IN_MILISECONDS); Unit *mover = _player->m_mover; - Player *plMover = mover->GetTypeId()==TYPEID_PLAYER ? (Player*)mover : NULL; + Player *plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL; if(!plMover || !plMover->IsBeingTeleportedNear()) return; @@ -192,8 +187,8 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data) plMover->SetPosition(dest.x, dest.y, dest.z, dest.o, true); uint32 newzone, newarea; - plMover->GetZoneAndAreaId(newzone,newarea); - plMover->UpdateZone(newzone,newarea); + plMover->GetZoneAndAreaId(newzone, newarea); + plMover->UpdateZone(newzone, newarea); // new zone if(old_zone != newzone) @@ -242,8 +237,8 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) if( movementInfo.t_x > 50 || movementInfo.t_y > 50 || movementInfo.t_z > 50 ) return; - if( !MaNGOS::IsValidMapCoord(movementInfo.x+movementInfo.t_x, movementInfo.y+movementInfo.t_y, - movementInfo.z+movementInfo.t_z, movementInfo.o+movementInfo.t_o) ) + if( !MaNGOS::IsValidMapCoord(movementInfo.x+movementInfo.t_x, movementInfo.y + movementInfo.t_y, + movementInfo.z + movementInfo.t_z, movementInfo.o + movementInfo.t_o) ) return; // if we boarded a transport, add us to it @@ -296,7 +291,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) { plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); plMover->m_movementInfo = movementInfo; - plMover->UpdateFallInformationIfNeed(movementInfo,recv_data.GetOpcode()); + plMover->UpdateFallInformationIfNeed(movementInfo, recv_data.GetOpcode()); if(plMover->isMovingOrTurning()) plMover->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); @@ -532,7 +527,7 @@ void WorldSession::HandleMoveWaterWalkAck(WorldPacket& /*recv_data*/) void WorldSession::HandleSummonResponseOpcode(WorldPacket& recv_data) { - CHECK_PACKET_SIZE(recv_data,8+1); + CHECK_PACKET_SIZE(recv_data, 8+1); if(!_player->isAlive() || _player->isInCombat() ) return; diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h index 879a14719..bc6c8ea59 100644 --- a/src/game/Opcodes.h +++ b/src/game/Opcodes.h @@ -361,7 +361,7 @@ enum Opcodes SMSG_ATTACKSTOP = 0x144, SMSG_ATTACKSWING_NOTINRANGE = 0x145, SMSG_ATTACKSWING_BADFACING = 0x146, - SMSG_ATTACKSWING_NOTSTANDING = 0x147, + SMSG_INSTANCE_LOCK_QUERY = 0x147, SMSG_ATTACKSWING_DEADTARGET = 0x148, SMSG_ATTACKSWING_CANT_ATTACK = 0x149, SMSG_ATTACKERSTATEUPDATE = 0x14A, diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 56740a4e7..0eb84c272 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -15212,6 +15212,8 @@ void Player::SendRaidInfo() size_t p_counter = data.wpos(); data << uint32(counter); // placeholder + time_t now = time(NULL); + for(int i = 0; i < TOTAL_DIFFICULTIES; ++i) { for (BoundInstancesMap::const_iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) @@ -15219,10 +15221,11 @@ void Player::SendRaidInfo() if(itr->second.perm) { InstanceSave *save = itr->second.save; - data << uint32(save->GetMapId()); - data << uint32(save->GetResetTime() - time(NULL)); - data << uint32(save->GetInstanceId()); - data << uint32(save->GetDifficulty()); + data << uint32(save->GetMapId()); // map id + data << uint32(save->GetDifficulty()); // difficulty + data << uint64(save->GetInstanceId()); // instance id + data << uint32(save->GetResetTime() - now); // reset time + data << uint32(0); // is extended ++counter; } } @@ -16002,12 +16005,6 @@ void Player::Customize(uint64 guid, uint8 gender, uint8 skin, uint8 face, uint8 SaveValuesArrayInDB(tokens, guid); } -void Player::SendAttackSwingNotStanding() -{ - WorldPacket data(SMSG_ATTACKSWING_NOTSTANDING, 0); - GetSession()->SendPacket( &data ); -} - void Player::SendAttackSwingDeadTarget() { WorldPacket data(SMSG_ATTACKSWING_DEADTARGET, 0); @@ -18066,7 +18063,7 @@ void Player::SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg) GetSession()->SendPacket(&data); } -void Player::SendInstanceResetWarning(uint32 mapid, uint32 time) +void Player::SendInstanceResetWarning( uint32 mapid, uint32 difficulty, uint32 time ) { // type of warning, based on the time remaining until reset uint32 type; @@ -18078,15 +18075,16 @@ void Player::SendInstanceResetWarning(uint32 mapid, uint32 time) type = RAID_INSTANCE_WARNING_MIN; else type = RAID_INSTANCE_WARNING_MIN_SOON; + WorldPacket data(SMSG_RAID_INSTANCE_MESSAGE, 4+4+4+4); data << uint32(type); data << uint32(mapid); - data << uint32(0); // may be difficulty + data << uint32(difficulty); // difficulty data << uint32(time); if(type == RAID_INSTANCE_WELCOME) { - data << uint8(0); - data << uint8(0); + data << uint8(0); // is your (1) + data << uint8(0); // is extended (1), ignored if prev field is 0 } GetSession()->SendPacket(&data); } diff --git a/src/game/Player.h b/src/game/Player.h index ac0853d8d..ef178158f 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -913,7 +913,7 @@ class MANGOS_DLL_SPEC Player : public Unit void SendInitialPacketsBeforeAddToMap(); void SendInitialPacketsAfterAddToMap(); void SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg = 0); - void SendInstanceResetWarning(uint32 mapid, uint32 time); + void SendInstanceResetWarning(uint32 mapid, uint32 difficulty, uint32 time); Creature* GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask); bool CanInteractWithNPCs(bool alive = true) const; @@ -1538,6 +1538,7 @@ class MANGOS_DLL_SPEC Player : public Unit void SetDifficulty(uint32 dungeon_difficulty) { m_dungeonDifficulty = dungeon_difficulty; } uint8 GetDifficulty() { return m_dungeonDifficulty; } + bool IsHeroic() { return m_dungeonDifficulty == DIFFICULTY_HEROIC; } bool UpdateSkill(uint32 skill_id, uint32 step); bool UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step); @@ -1615,11 +1616,10 @@ class MANGOS_DLL_SPEC Player : public Unit void SendDelayResponse(const uint32); void SendLogXPGain(uint32 GivenXP,Unit* victim,uint32 RestXP); - //notifiers + // notifiers void SendAttackSwingCantAttack(); void SendAttackSwingCancelAttack(); void SendAttackSwingDeadTarget(); - void SendAttackSwingNotStanding(); void SendAttackSwingNotInRange(); void SendAttackSwingBadFacingAttack(); void SendAutoRepeatCancel(); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index ceb57a8e2..fe2722d78 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8012" + #define REVISION_NR "8013" #endif // __REVISION_NR_H__