diff --git a/contrib/vmap_extractor_v2/vmapextract/model.cpp b/contrib/vmap_extractor_v2/vmapextract/model.cpp index 31962a001..1d0c17d52 100644 --- a/contrib/vmap_extractor_v2/vmapextract/model.cpp +++ b/contrib/vmap_extractor_v2/vmapextract/model.cpp @@ -39,10 +39,10 @@ bool Model::open() else { //printf("not included %s\n", filename.c_str()); + f.close(); return false; } return true; - } diff --git a/src/game/CalendarHandler.cpp b/src/game/CalendarHandler.cpp index e548a6696..a2a30b72a 100644 --- a/src/game/CalendarHandler.cpp +++ b/src/game/CalendarHandler.cpp @@ -106,3 +106,13 @@ void WorldSession::HandleCalendarComplain(WorldPacket &recv_data) sLog.outDebug("WORLD: CMSG_CALENDAR_COMPLAIN"); recv_data.hexlike(); } + +void WorldSession::HandleCalendarPendingInvites(WorldPacket &recv_data) +{ + sLog.outDebug("WORLD: CMSG_CALENDAR_PENDING_INVITES"); + recv_data.hexlike(); + + WorldPacket data(SMSG_CALENDAR_PENDING_INVITES, 4); + data << uint32(0); // 0 - no pending invites, 1 - some pending invites + SendPacket(&data); +} diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index 5730ad1d6..c73231635 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -1028,7 +1028,7 @@ bool ChatHandler::HandleModifyASpeedCommand(const char* args) chr->SetSpeed(MOVE_RUN, ASpeed,true); chr->SetSpeed(MOVE_SWIM, ASpeed,true); //chr->SetSpeed(MOVE_TURN, ASpeed,true); - chr->SetSpeed(MOVE_FLY, ASpeed,true); + chr->SetSpeed(MOVE_FLIGHT, ASpeed,true); return true; } @@ -1144,7 +1144,7 @@ bool ChatHandler::HandleModifyBWalkCommand(const char* args) if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, GetName(), BSpeed); - chr->SetSpeed(MOVE_WALKBACK,BSpeed,true); + chr->SetSpeed(MOVE_RUN_BACK,BSpeed,true); return true; } @@ -1176,7 +1176,7 @@ bool ChatHandler::HandleModifyFlyCommand(const char* args) if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_FLY_SPEED_CHANGED, GetName(), FSpeed); - chr->SetSpeed(MOVE_FLY,FSpeed,true); + chr->SetSpeed(MOVE_FLIGHT,FSpeed,true); return true; } diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index 917867993..4dd956a55 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -1493,11 +1493,11 @@ void WorldSession::HandleChooseTitleOpcode( WorldPacket & recv_data ) GetPlayer()->SetUInt32Value(PLAYER_CHOSEN_TITLE, title); } -void WorldSession::HandleAllowMoveAckOpcode( WorldPacket & recv_data ) +void WorldSession::HandleTimeSyncResp( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data, 4+4); - sLog.outDebug("CMSG_ALLOW_MOVE_ACK"); + sLog.outDebug("CMSG_TIME_SYNC_RESP"); uint32 counter, time_; recv_data >> counter >> time_; diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 9ef0b6649..9c5570563 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -171,19 +171,12 @@ void WorldSession::HandleMoveWorldportAckOpcode() void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) { uint32 opcode = recv_data.GetOpcode(); - sLog.outDebug("WORLD: Recvd %s (%u,0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode); + sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode); if(GetPlayer()->GetDontMove()) return; /* extract packet */ - if(opcode == CMSG_MOVE_NOT_ACTIVE_MOVER) - { - CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8); - uint64 old_mover_guid; - recv_data >> old_mover_guid; - } - MovementInfo movementInfo; ReadMovementInfo(recv_data, &movementInfo); /*----------------*/ @@ -218,9 +211,6 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) { if ((*iter)->GetGUID() == movementInfo.t_guid) { - // unmount before boarding - _player->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED); - GetPlayer()->m_transport = (*iter); (*iter)->AddPassenger(GetPlayer()); break; @@ -237,6 +227,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) movementInfo.t_z = 0.0f; movementInfo.t_o = 0.0f; movementInfo.t_time = 0; + movementInfo.t_seat = -1; } // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map). @@ -245,11 +236,11 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) // calculate total z distance of the fall // it is currently only used for the achievement system. It might be used in a more correct falldamage formula later float z_diff = GetPlayer()->m_fallMovementInfo.z - movementInfo.z; - sLog.outDebug("zDiff = %f", z_diff); + sLog.outDebug("zDiff = %f, falltime = %u", z_diff, movementInfo.fallTime); Player *target = GetPlayer(); //Players with Feather Fall or low fall time, or physical immunity (charges used) are ignored - if (movementInfo.fallTime > 1500 && !target->isDead() && !target->isGameMaster() && + if (movementInfo.fallTime > 1300 && !target->isDead() && !target->isGameMaster() && !target->HasAuraType(SPELL_AURA_HOVER) && !target->HasAuraType(SPELL_AURA_FEATHER_FALL) && !target->HasAuraType(SPELL_AURA_FLY) && !target->IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL,true) ) { @@ -257,10 +248,10 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) int32 safe_fall = target->GetTotalAuraModifier(SPELL_AURA_SAFE_FALL); uint32 fall_time = (movementInfo.fallTime > (safe_fall*10)) ? movementInfo.fallTime - (safe_fall*10) : 0; - if(fall_time > 1500) //Prevent damage if fall time < 1500 + if(fall_time > 1300) //Prevent damage if fall time < 1300 { //Fall Damage calculation - float fallperc = float(fall_time)/1500; + float fallperc = float(fall_time)/1300; uint32 damage = (uint32)(((fallperc*fallperc -1) / 9 * target->GetMaxHealth())*sWorld.getRate(RATE_DAMAGE_FALL)); float height = movementInfo.z; @@ -289,24 +280,19 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) } } - if(opcode == CMSG_DISMISS_CONTROLLED_VEHICLE) - { - // using charm guid, because we don't have vehicle guid... - if(Vehicle *vehicle = ObjectAccessor::GetVehicle(_player->GetCharmGUID())) - _player->ExitVehicle(vehicle); - } - if(((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != GetPlayer()->IsInWater()) { // now client not include swimming flag in case jumping under water GetPlayer()->SetInWater( !GetPlayer()->IsInWater() || GetPlayer()->GetBaseMap()->IsUnderWater(movementInfo.x, movementInfo.y, movementInfo.z) ); } + if(opcode != MSG_MOVE_FALL_LAND && !(movementInfo.flags & MOVEMENTFLAG_FALLING)) + _player->m_fallMovementInfo = movementInfo; // save data before any fall /*----------------------*/ /* process position-change */ Unit *mover = _player->m_mover; - recv_data.put(6, getMSTime()); // offset flags(4) + unk(2) + recv_data.put(6, getMSTime()); // fix time, offset flags(4) + unk(2) WorldPacket data(recv_data.GetOpcode(), (mover->GetPackGUID().size()+recv_data.size())); data.append(_player->m_mover->GetPackGUID()); // use mover guid data.append(recv_data.contents(), recv_data.size()); @@ -334,8 +320,8 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) } } - if (GetPlayer()->m_fallMovementInfo.fallTime >= movementInfo.fallTime || GetPlayer()->m_fallMovementInfo.z <=movementInfo.z) - GetPlayer()->m_fallMovementInfo = movementInfo; + //if (GetPlayer()->m_fallMovementInfo.fallTime >= movementInfo.fallTime || GetPlayer()->m_fallMovementInfo.z <=movementInfo.z) + // GetPlayer()->m_fallMovementInfo = movementInfo; if(GetPlayer()->isMovingOrTurning()) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); @@ -361,7 +347,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data) { - sLog.outDebug("WORLD: Recvd %s (%u,0x%X) opcode", LookupOpcodeName(recv_data.GetOpcode()), recv_data.GetOpcode(), recv_data.GetOpcode()); + sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(recv_data.GetOpcode()), recv_data.GetOpcode(), recv_data.GetOpcode()); CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8+4); @@ -378,7 +364,7 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data) // continue parse packet - recv_data >> unk1; // counter + recv_data >> unk1; // counter or moveEvent MovementInfo movementInfo; ReadMovementInfo(recv_data, &movementInfo); @@ -394,19 +380,20 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data) UnitMoveType move_type; UnitMoveType force_move_type; - static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "Walkback", "Swim", "Swimback", "Turn", "Fly", "Flyback", "Pitch" }; + static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack", "PitchRate" }; uint16 opcode = recv_data.GetOpcode(); switch(opcode) { - case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; - case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; - case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_WALKBACK; force_move_type = MOVE_WALKBACK; break; - case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; - case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIMBACK; force_move_type = MOVE_SWIMBACK; break; - case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN; force_move_type = MOVE_TURN; break; - case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLY; force_move_type = MOVE_FLY; break; - case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLYBACK; force_move_type = MOVE_FLYBACK; break; + case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; + case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; + case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; force_move_type = MOVE_RUN_BACK; break; + case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; + case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; force_move_type = MOVE_SWIM_BACK; break; + case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break; + case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break; + case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break; + case CMSG_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; force_move_type = MOVE_PITCH_RATE; break; default: sLog.outError("WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode); return; @@ -451,6 +438,50 @@ void WorldSession::HandleSetActiveMoverOpcode(WorldPacket &recv_data) if(_player->m_mover->GetGUID() != guid) { sLog.outError("HandleSetActiveMoverOpcode: incorrect mover guid: mover is " I64FMT " and should be " I64FMT, _player->m_mover->GetGUID(), guid); + return; + } +} + +void WorldSession::HandleMoveNotActiveMover(WorldPacket &recv_data) +{ + sLog.outDebug("WORLD: Recvd CMSG_MOVE_NOT_ACTIVE_MOVER"); + recv_data.hexlike(); + + CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8); + + uint64 old_mover_guid; + recv_data >> old_mover_guid; + + if(_player->m_mover->GetGUID() == old_mover_guid) + { + sLog.outError("HandleMoveNotActiveMover: incorrect mover guid: mover is " I64FMT " and should be " I64FMT " instead of " I64FMT, _player->m_mover->GetGUID(), _player->GetGUID(), old_mover_guid); + return; + } + + MovementInfo mi; + ReadMovementInfo(recv_data, &mi); + _player->m_movementInfo = mi; +} + +void WorldSession::HandleDismissControlledVehicle(WorldPacket &recv_data) +{ + sLog.outDebug("WORLD: Recvd CMSG_DISMISS_CONTROLLED_VEHICLE"); + recv_data.hexlike(); + + uint64 vehicleGUID = _player->GetCharmGUID(); + + if(!vehicleGUID) // something wrong here... + return; + + MovementInfo mi; + ReadMovementInfo(recv_data, &mi); + _player->m_movementInfo = mi; + + // using charm guid, because we don't have vehicle guid... + if(Vehicle *vehicle = ObjectAccessor::GetVehicle(vehicleGUID)) + { + _player->ExitVehicle(vehicle); + vehicle->Dismiss(); } } diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 8af7dbe5c..1c8ad7bed 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -384,13 +384,13 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2) *data << ((Unit*)this)->GetSpeed( MOVE_WALK ); *data << ((Unit*)this)->GetSpeed( MOVE_RUN ); - *data << ((Unit*)this)->GetSpeed( MOVE_SWIMBACK ); + *data << ((Unit*)this)->GetSpeed( MOVE_SWIM_BACK ); *data << ((Unit*)this)->GetSpeed( MOVE_SWIM ); - *data << ((Unit*)this)->GetSpeed( MOVE_WALKBACK ); - *data << ((Unit*)this)->GetSpeed( MOVE_FLY ); - *data << ((Unit*)this)->GetSpeed( MOVE_FLYBACK ); - *data << ((Unit*)this)->GetSpeed( MOVE_TURN ); - *data << ((Unit*)this)->GetSpeed( MOVE_PITCH ); + *data << ((Unit*)this)->GetSpeed( MOVE_RUN_BACK ); + *data << ((Unit*)this)->GetSpeed( MOVE_FLIGHT ); + *data << ((Unit*)this)->GetSpeed( MOVE_FLIGHT_BACK ); + *data << ((Unit*)this)->GetSpeed( MOVE_TURN_RATE ); + *data << ((Unit*)this)->GetSpeed( MOVE_PITCH_RATE ); // 0x08000000 if(flags2 & MOVEMENTFLAG_SPLINE2) diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp index 91ae5a39c..cde8c4df8 100644 --- a/src/game/Opcodes.cpp +++ b/src/game/Opcodes.cpp @@ -747,7 +747,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x2CE*/ { "CMSG_MOVE_TIME_SKIPPED", STATUS_LOGGEDIN, &WorldSession::HandleMoveTimeSkippedOpcode }, /*0x2CF*/ { "CMSG_MOVE_FEATHER_FALL_ACK", STATUS_LOGGEDIN, &WorldSession::HandleFeatherFallAck }, /*0x2D0*/ { "CMSG_MOVE_WATER_WALK_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveWaterWalkAck }, - /*0x2D1*/ { "CMSG_MOVE_NOT_ACTIVE_MOVER", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes }, + /*0x2D1*/ { "CMSG_MOVE_NOT_ACTIVE_MOVER", STATUS_LOGGEDIN, &WorldSession::HandleMoveNotActiveMover }, /*0x2D2*/ { "SMSG_PLAY_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x2D3*/ { "CMSG_BATTLEFIELD_STATUS", STATUS_LOGGEDIN, &WorldSession::HandleBattlefieldStatusOpcode }, /*0x2D4*/ { "SMSG_BATTLEFIELD_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide }, @@ -939,7 +939,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x38E*/ { "MSG_PARTY_ASSIGNMENT", STATUS_LOGGEDIN, &WorldSession::HandleGroupPromoteOpcode }, /*0x38F*/ { "SMSG_OFFER_PETITION_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x390*/ { "SMSG_TIME_SYNC_REQ", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x391*/ { "CMSG_TIME_SYNC_RESP", STATUS_LOGGEDIN, &WorldSession::HandleAllowMoveAckOpcode }, + /*0x391*/ { "CMSG_TIME_SYNC_RESP", STATUS_LOGGEDIN, &WorldSession::HandleTimeSyncResp }, /*0x392*/ { "CMSG_SEND_LOCAL_EVENT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x393*/ { "CMSG_SEND_GENERAL_TRIGGER", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x394*/ { "CMSG_SEND_COMBAT_TRIGGER", STATUS_NEVER, &WorldSession::Handle_NULL }, @@ -1121,8 +1121,8 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x444*/ { "SMSG_CALENDAR_EVENT_UPDATED_ALERT",STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x445*/ { "SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT",STATUS_NEVER,&WorldSession::Handle_ServerSide }, /*0x446*/ { "CMSG_CALENDAR_COMPLAIN", STATUS_LOGGEDIN, &WorldSession::HandleCalendarComplain }, - /*0x447*/ { "CMSG_CALENDAR_GET_CALENDAR_ON_LOGIN",STATUS_LOGGEDIN,&WorldSession::HandleCalendarGetCalendar }, - /*0x448*/ { "SMSG_CALENDAR_EVENT_RESERVED_3", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x447*/ { "CMSG_CALENDAR_PENDING_INVITES", STATUS_LOGGEDIN, &WorldSession::HandleCalendarPendingInvites }, + /*0x448*/ { "SMSG_CALENDAR_PENDING_INVITES", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x449*/ { "CMSG_SAVE_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x44A*/ { "SMSG_NOTIFY_DANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x44B*/ { "CMSG_PLAY_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL }, @@ -1159,7 +1159,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x46A*/ { "SMSG_CRITERIA_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x46B*/ { "CMSG_QUERY_INSPECT_ACHIEVEMENTS", STATUS_LOGGEDIN, &WorldSession::HandleInspectAchievements }, /*0x46C*/ { "SMSG_RESPOND_INSPECT_ACHIEVEMENTS",STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x46D*/ { "CMSG_DISMISS_CONTROLLED_VEHICLE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes }, + /*0x46D*/ { "CMSG_DISMISS_CONTROLLED_VEHICLE", STATUS_LOGGEDIN, &WorldSession::HandleDismissControlledVehicle }, /*0x46E*/ { "CMSG_COMPLETE_ACHIEVEMENT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x46F*/ { "SMSG_QUESTUPDATE_ADD_PVP_KILL", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x470*/ { "CMSG_SET_CRITERIA_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL }, @@ -1205,11 +1205,11 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x498*/ { "SMSG_SERVER_FIRST_ACHIEVEMENT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x499*/ { "SMSG_PET_LEARNED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x49A*/ { "SMSG_PET_UNLEARNED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x49B*/ { "UMSG_UNKNOWN_1179", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x49B*/ { "CMSG_MOVE_UNKNOWN_1179", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x49C*/ { "CMSG_UNKNOWN_1180", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x49D*/ { "SMSG_UNKNOWN_1181", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x49E*/ { "SMSG_UNKNOWN_1182", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x49F*/ { "SMSG_UNKNOWN_1183", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x49D*/ { "SMSG_SHOW_VEHICLE_UI", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x49E*/ { "SMSG_CRITERIA_REMOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x49F*/ { "SMSG_ACHIEVEMENT_REMOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A0*/ { "UMSG_UNKNOWN_1184", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A1*/ { "UMSG_UNKNOWN_1185", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A2*/ { "UMSG_UNKNOWN_1186", STATUS_NEVER, &WorldSession::Handle_NULL }, diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h index 078ef60d1..83f33d0f2 100644 --- a/src/game/Opcodes.h +++ b/src/game/Opcodes.h @@ -1123,8 +1123,8 @@ enum Opcodes SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x444, SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT = 0x445, CMSG_CALENDAR_COMPLAIN = 0x446, - CMSG_CALENDAR_GET_CALENDAR_ON_LOGIN = 0x447, - SMSG_CALENDAR_EVENT_RESERVED_3 = 0x448, + CMSG_CALENDAR_PENDING_INVITES = 0x447, + SMSG_CALENDAR_PENDING_INVITES = 0x448, CMSG_SAVE_DANCE = 0x449, SMSG_NOTIFY_DANCE = 0x44A, CMSG_PLAY_DANCE = 0x44B, @@ -1207,9 +1207,9 @@ enum Opcodes SMSG_SERVER_FIRST_ACHIEVEMENT = 0x498, SMSG_PET_LEARNED_SPELL = 0x499, // uint16 spellid, Your pet learned spell: %s SMSG_PET_UNLEARNED_SPELL = 0x49A, // uint16 spellid, Your pet unlearned %s - CMSG_UNKNOWN_1179 = 0x49B, // movement opcode + CMSG_MOVE_UNKNOWN_1179 = 0x49B, // movement opcode CMSG_UNKNOWN_1180 = 0x49C, // LUA: HearthAndResurrectFromArea - SMSG_UNKNOWN_1181 = 0x49D, // empty + SMSG_SHOW_VEHICLE_UI = 0x49D, // empty SMSG_CRITERIA_REMOVE = 0x49E, // uint32, broadcasts EVENT_CRITERIA_UPDATE SMSG_ACHIEVEMENT_REMOVE = 0x49F, // uint32, broadcasts EVENT_ACHIEVEMENT_EARNED UMSG_UNKNOWN_1184 = 0x4A0, // not found in client diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 65219c89b..0e26a8414 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -18651,20 +18651,15 @@ void Player::EnterVehicle(Vehicle *vehicle) { vehicle->SetCharmerGUID(GetGUID()); vehicle->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); - //vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5); vehicle->setFaction(getFaction()); - //vehicle->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0); - //vehicle->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, 2147483647); - //vehicle->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0); - //vehicle->SetUInt32Value(UNIT_FIELD_BYTES_1, 0x02000000); SetCharm(vehicle); // charm SetFarSight(vehicle->GetGUID()); // set view SetClientControl(vehicle, 1); // redirect controls to vehicle - WorldPacket data(SMSG_UNKNOWN_1181, 0); // shows vehicle UI? + WorldPacket data(SMSG_SHOW_VEHICLE_UI, 0); // shows vehicle UI? GetSession()->SendPacket(&data); data.Initialize(MSG_MOVE_TELEPORT_ACK, 30); @@ -18677,11 +18672,11 @@ void Player::EnterVehicle(Vehicle *vehicle) data << vehicle->GetPositionY(); // y data << vehicle->GetPositionZ(); // z data << vehicle->GetOrientation(); // o - // transport part + // transport part, TODO: load/calculate seat offsets data << uint64(vehicle->GetGUID()); // transport guid data << float(0); // transport offsetX data << float(0); // transport offsetY - data << float(2); // transport offsetZ + data << float(3); // transport offsetZ data << float(0); // transport orientation data << uint32(getMSTime()); // transport time data << uint8(0); // seat @@ -18689,6 +18684,9 @@ void Player::EnterVehicle(Vehicle *vehicle) data << uint32(0); // fall time GetSession()->SendPacket(&data); + vehicle->SetSpeed(MOVE_RUN, vehicle->GetCreatureInfo()->speed, true); + vehicle->SetSpeed(MOVE_FLIGHT, vehicle->GetCreatureInfo()->speed, true); + data.Initialize(SMSG_PET_SPELLS, 8+4+4+4+4*10+1+1); data << uint64(vehicle->GetGUID()); data << uint32(0x00000000); @@ -18707,10 +18705,8 @@ void Player::ExitVehicle(Vehicle *vehicle) { vehicle->SetCharmerGUID(0); vehicle->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); - //vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5); vehicle->setFaction((GetTeam() == ALLIANCE) ? vehicle->GetCreatureInfo()->faction_A : vehicle->GetCreatureInfo()->faction_H); - //vehicle->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0); SetCharm(NULL); SetFarSight(NULL); diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 64c6afaf0..713e04801 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -3698,7 +3698,7 @@ void Aura::HandleAuraModIncreaseFlightSpeed(bool apply, bool Real) m_target->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID,16314); } - m_target->UpdateSpeed(MOVE_FLY, true); + m_target->UpdateSpeed(MOVE_FLIGHT, true); } void Aura::HandleAuraModIncreaseSwimSpeed(bool /*apply*/, bool Real) @@ -3718,7 +3718,7 @@ void Aura::HandleAuraModDecreaseSpeed(bool /*apply*/, bool Real) m_target->UpdateSpeed(MOVE_RUN, true); m_target->UpdateSpeed(MOVE_SWIM, true); - m_target->UpdateSpeed(MOVE_FLY, true); + m_target->UpdateSpeed(MOVE_FLIGHT, true); } void Aura::HandleAuraModUseNormalSpeed(bool /*apply*/, bool Real) @@ -3729,7 +3729,7 @@ void Aura::HandleAuraModUseNormalSpeed(bool /*apply*/, bool Real) m_target->UpdateSpeed(MOVE_RUN, true); m_target->UpdateSpeed(MOVE_SWIM, true); - m_target->UpdateSpeed(MOVE_FLY, true); + m_target->UpdateSpeed(MOVE_FLIGHT, true); } /*********************************************************/ @@ -6362,6 +6362,6 @@ void Aura::HandleAuraControlVehicle(bool apply, bool Real) if(Pet *pet = m_target->GetPet()) pet->Remove(PET_SAVE_AS_CURRENT); - WorldPacket data(SMSG_UNKNOWN_1181, 0); + WorldPacket data(SMSG_SHOW_VEHICLE_UI, 0); ((Player*)m_target)->GetSession()->SendPacket(&data); } diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index e39a16c4f..5aa29054a 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -892,7 +892,7 @@ void Spell::EffectDummy(uint32 i) if (!m_caster->HasAuraType(SPELL_AURA_MOUNTED)) return; - float flyspeed = m_caster->GetSpeedRate(MOVE_FLY); + float flyspeed = m_caster->GetSpeedRate(MOVE_FLIGHT); float speed = m_caster->GetSpeedRate(MOVE_RUN); m_caster->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 98253c1a9..9c7137a99 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -50,13 +50,13 @@ float baseMoveSpeed[MAX_MOVE_TYPE] = { 2.5f, // MOVE_WALK 7.0f, // MOVE_RUN - 1.25f, // MOVE_WALKBACK + 1.25f, // MOVE_RUN_BACK 4.722222f, // MOVE_SWIM - 4.5f, // MOVE_SWIMBACK - 3.141594f, // MOVE_TURN - 7.0f, // MOVE_FLY - 4.5f, // MOVE_FLYBACK - 3.14f // MOVE_PITCH + 4.5f, // MOVE_SWIM_BACK + 3.141594f, // MOVE_TURN_RATE + 7.0f, // MOVE_FLIGHT + 4.5f, // MOVE_FLIGHT_BACK + 3.14f // MOVE_PITCH_RATE }; // auraTypes contains attacker auras capable of proc'ing cast auras @@ -8857,16 +8857,16 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) } break; } - case MOVE_WALKBACK: + case MOVE_RUN_BACK: return; case MOVE_SWIM: { main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_SWIM_SPEED); break; } - case MOVE_SWIMBACK: + case MOVE_SWIM_BACK: return; - case MOVE_FLY: + case MOVE_FLIGHT: { if (IsMounted()) // Use on mount auras main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED); @@ -8876,7 +8876,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) non_stack_bonus = (100.0 + GetMaxPositiveAuraModifier(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK))/100.0f; break; } - case MOVE_FLYBACK: + case MOVE_FLIGHT_BACK: return; default: sLog.outError("Unit::UpdateSpeed: Unsupported move type (%d)", mtype); @@ -8891,7 +8891,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) { case MOVE_RUN: case MOVE_SWIM: - case MOVE_FLY: + case MOVE_FLIGHT: { // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need // TODO: possible affect only on MOVE_RUN @@ -8943,28 +8943,31 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) switch(mtype) { case MOVE_WALK: - data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8+4+1+4+4+4+4+4+4+4); + data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8+4+2+4+4+4+4+4+4+4); break; case MOVE_RUN: - data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8+4+1+4+4+4+4+4+4+4); + data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8+4+2+4+4+4+4+4+4+4); break; - case MOVE_WALKBACK: - data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4); + case MOVE_RUN_BACK: + data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); break; case MOVE_SWIM: - data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8+4+1+4+4+4+4+4+4+4); + data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8+4+2+4+4+4+4+4+4+4); break; - case MOVE_SWIMBACK: - data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4); + case MOVE_SWIM_BACK: + data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); break; - case MOVE_TURN: - data.Initialize(MSG_MOVE_SET_TURN_RATE, 8+4+1+4+4+4+4+4+4+4); + case MOVE_TURN_RATE: + data.Initialize(MSG_MOVE_SET_TURN_RATE, 8+4+2+4+4+4+4+4+4+4); break; - case MOVE_FLY: - data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8+4+1+4+4+4+4+4+4+4); + case MOVE_FLIGHT: + data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8+4+2+4+4+4+4+4+4+4); break; - case MOVE_FLYBACK: - data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4); + case MOVE_FLIGHT_BACK: + data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); + break; + case MOVE_PITCH_RATE: + data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8+4+2+4+4+4+4+4+4+4); break; default: sLog.outError("Unit::SetSpeed: Unsupported move type (%d), data not sent to client.",mtype); @@ -8972,14 +8975,14 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) } data.append(GetPackGUID()); - data << uint32(0); //movement flags - data << uint16(0); //unk + data << uint32(0); // movement flags + data << uint16(0); // unk flags data << uint32(getMSTime()); data << float(GetPositionX()); data << float(GetPositionY()); data << float(GetPositionZ()); data << float(GetOrientation()); - data << uint32(0); //flag unk + data << uint32(0); // fall time data << float(GetSpeed(mtype)); SendMessageToSet( &data, true ); } @@ -8996,30 +8999,33 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) case MOVE_RUN: data.Initialize(SMSG_FORCE_RUN_SPEED_CHANGE, 17); break; - case MOVE_WALKBACK: + case MOVE_RUN_BACK: data.Initialize(SMSG_FORCE_RUN_BACK_SPEED_CHANGE, 16); break; case MOVE_SWIM: data.Initialize(SMSG_FORCE_SWIM_SPEED_CHANGE, 16); break; - case MOVE_SWIMBACK: + case MOVE_SWIM_BACK: data.Initialize(SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, 16); break; - case MOVE_TURN: + case MOVE_TURN_RATE: data.Initialize(SMSG_FORCE_TURN_RATE_CHANGE, 16); break; - case MOVE_FLY: + case MOVE_FLIGHT: data.Initialize(SMSG_FORCE_FLIGHT_SPEED_CHANGE, 16); break; - case MOVE_FLYBACK: + case MOVE_FLIGHT_BACK: data.Initialize(SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, 16); break; + case MOVE_PITCH_RATE: + data.Initialize(SMSG_FORCE_PITCH_RATE_CHANGE, 16); + break; default: sLog.outError("Unit::SetSpeed: Unsupported move type (%d), data not sent to client.",mtype); return; } data.append(GetPackGUID()); - data << (uint32)0; + data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39 if (mtype == MOVE_RUN) data << uint8(0); // new 2.1.0 data << float(GetSpeed(mtype)); diff --git a/src/game/Unit.h b/src/game/Unit.h index 46cedc379..99bbf62ab 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -376,18 +376,18 @@ enum UnitState enum UnitMoveType { - MOVE_WALK = 0, - MOVE_RUN = 1, - MOVE_WALKBACK = 2, - MOVE_SWIM = 3, - MOVE_SWIMBACK = 4, - MOVE_TURN = 5, - MOVE_FLY = 6, - MOVE_FLYBACK = 7, - MOVE_PITCH = 8 + MOVE_WALK = 0, + MOVE_RUN = 1, + MOVE_RUN_BACK = 2, + MOVE_SWIM = 3, + MOVE_SWIM_BACK = 4, + MOVE_TURN_RATE = 5, + MOVE_FLIGHT = 6, + MOVE_FLIGHT_BACK = 7, + MOVE_PITCH_RATE = 8 }; -#define MAX_MOVE_TYPE 9 +#define MAX_MOVE_TYPE 9 extern float baseMoveSpeed[MAX_MOVE_TYPE]; diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp index 12acd640e..e70d7c75f 100644 --- a/src/game/Vehicle.cpp +++ b/src/game/Vehicle.cpp @@ -94,3 +94,11 @@ bool Vehicle::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, u return true; } + +void Vehicle::Dismiss() +{ + SendObjectDeSpawnAnim(GetGUID()); + CombatStop(); + CleanupsBeforeDelete(); + AddObjectToRemoveList(); +} diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h index 0479d96f8..7fd8b60c4 100644 --- a/src/game/Vehicle.h +++ b/src/game/Vehicle.h @@ -40,6 +40,8 @@ class Vehicle : public Creature uint32 GetVehicleId() { return m_vehicleId; } void SetVehicleId(uint32 vehicleid) { m_vehicleId = vehicleid; } + void Dismiss(); + protected: uint32 m_vehicleId; diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index f2071fcb5..f855f1597 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -334,6 +334,8 @@ class MANGOS_DLL_SPEC WorldSession void HandleMovementOpcodes(WorldPacket& recvPacket); void HandleSetActiveMoverOpcode(WorldPacket &recv_data); + void HandleMoveNotActiveMover(WorldPacket &recv_data); + void HandleDismissControlledVehicle(WorldPacket &recv_data); void HandleMoveTimeSkippedOpcode(WorldPacket &recv_data); void HandleRequestRaidInfoOpcode( WorldPacket & recv_data ); @@ -592,7 +594,7 @@ class MANGOS_DLL_SPEC WorldSession void HandleLfgSetCommentOpcode(WorldPacket& recv_data); void HandleChooseTitleOpcode(WorldPacket& recv_data); void HandleRealmStateRequestOpcode(WorldPacket& recv_data); - void HandleAllowMoveAckOpcode(WorldPacket& recv_data); + void HandleTimeSyncResp(WorldPacket& recv_data); void HandleWhoisOpcode(WorldPacket& recv_data); void HandleResetInstancesOpcode(WorldPacket& recv_data); @@ -654,6 +656,7 @@ class MANGOS_DLL_SPEC WorldSession void HandleCalendarEventStatus(WorldPacket& recv_data); void HandleCalendarEventModeratorStatus(WorldPacket& recv_data); void HandleCalendarComplain(WorldPacket& recv_data); + void HandleCalendarPendingInvites(WorldPacket& recv_data); void HandleSpellClick(WorldPacket& recv_data); void HandleAlterAppearance(WorldPacket& recv_data);