|
|
|
|
@@ -122,8 +122,6 @@ int main(int argc, char** argv) {
|
|
|
|
|
uint32_t framesSinceMasterDisconnect = 0;
|
|
|
|
|
uint32_t framesSinceLastSQLPing = 0;
|
|
|
|
|
|
|
|
|
|
auto lastTime = std::chrono::high_resolution_clock::now();
|
|
|
|
|
|
|
|
|
|
Game::logger->Flush(); // once immediately before main loop
|
|
|
|
|
while (!Game::ShouldShutdown()) {
|
|
|
|
|
//Check if we're still connected to master:
|
|
|
|
|
@@ -134,11 +132,7 @@ int main(int argc, char** argv) {
|
|
|
|
|
break; //Exit our loop, shut down.
|
|
|
|
|
} else framesSinceMasterDisconnect = 0;
|
|
|
|
|
|
|
|
|
|
const auto currentTime = std::chrono::high_resolution_clock::now();
|
|
|
|
|
const float deltaTime = std::chrono::duration<float>(currentTime - lastTime).count();
|
|
|
|
|
lastTime = currentTime;
|
|
|
|
|
|
|
|
|
|
Game::playerContainer.Update(deltaTime);
|
|
|
|
|
//In world we'd update our other systems here.
|
|
|
|
|
|
|
|
|
|
//Check for packets here:
|
|
|
|
|
Game::server->ReceiveFromMaster(); //ReceiveFromMaster also handles the master packets if needed.
|
|
|
|
|
@@ -174,7 +168,7 @@ int main(int argc, char** argv) {
|
|
|
|
|
t += std::chrono::milliseconds(chatFrameDelta); //Chat can run at a lower "fps"
|
|
|
|
|
std::this_thread::sleep_until(t);
|
|
|
|
|
}
|
|
|
|
|
Game::playerContainer.Shutdown();
|
|
|
|
|
|
|
|
|
|
//Delete our objects here:
|
|
|
|
|
Database::Destroy("ChatServer");
|
|
|
|
|
delete Game::server;
|
|
|
|
|
@@ -203,150 +197,150 @@ void HandlePacket(Packet* packet) {
|
|
|
|
|
inStream.Read(chatMessageID);
|
|
|
|
|
|
|
|
|
|
switch (chatMessageID) {
|
|
|
|
|
case MessageType::Chat::GM_MUTE:
|
|
|
|
|
Game::playerContainer.MuteUpdate(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::GM_MUTE:
|
|
|
|
|
Game::playerContainer.MuteUpdate(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::CREATE_TEAM:
|
|
|
|
|
Game::playerContainer.CreateTeamServer(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::CREATE_TEAM:
|
|
|
|
|
Game::playerContainer.CreateTeamServer(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::GET_FRIENDS_LIST:
|
|
|
|
|
ChatPacketHandler::HandleFriendlistRequest(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::GET_FRIENDS_LIST:
|
|
|
|
|
ChatPacketHandler::HandleFriendlistRequest(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::GET_IGNORE_LIST:
|
|
|
|
|
ChatIgnoreList::GetIgnoreList(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::GET_IGNORE_LIST:
|
|
|
|
|
ChatIgnoreList::GetIgnoreList(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::ADD_IGNORE:
|
|
|
|
|
ChatIgnoreList::AddIgnore(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::ADD_IGNORE:
|
|
|
|
|
ChatIgnoreList::AddIgnore(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::REMOVE_IGNORE:
|
|
|
|
|
ChatIgnoreList::RemoveIgnore(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::REMOVE_IGNORE:
|
|
|
|
|
ChatIgnoreList::RemoveIgnore(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::TEAM_GET_STATUS:
|
|
|
|
|
ChatPacketHandler::HandleTeamStatusRequest(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::TEAM_GET_STATUS:
|
|
|
|
|
ChatPacketHandler::HandleTeamStatusRequest(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::ADD_FRIEND_REQUEST:
|
|
|
|
|
//this involves someone sending the initial request, the response is below, response as in from the other player.
|
|
|
|
|
//We basically just check to see if this player is online or not and route the packet.
|
|
|
|
|
ChatPacketHandler::HandleFriendRequest(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::ADD_FRIEND_REQUEST:
|
|
|
|
|
//this involves someone sending the initial request, the response is below, response as in from the other player.
|
|
|
|
|
//We basically just check to see if this player is online or not and route the packet.
|
|
|
|
|
ChatPacketHandler::HandleFriendRequest(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::ADD_FRIEND_RESPONSE:
|
|
|
|
|
//This isn't the response a server sent, rather it is a player's response to a received request.
|
|
|
|
|
//Here, we'll actually have to add them to eachother's friend lists depending on the response code.
|
|
|
|
|
ChatPacketHandler::HandleFriendResponse(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::ADD_FRIEND_RESPONSE:
|
|
|
|
|
//This isn't the response a server sent, rather it is a player's response to a received request.
|
|
|
|
|
//Here, we'll actually have to add them to eachother's friend lists depending on the response code.
|
|
|
|
|
ChatPacketHandler::HandleFriendResponse(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::REMOVE_FRIEND:
|
|
|
|
|
ChatPacketHandler::HandleRemoveFriend(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::REMOVE_FRIEND:
|
|
|
|
|
ChatPacketHandler::HandleRemoveFriend(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::GENERAL_CHAT_MESSAGE:
|
|
|
|
|
ChatPacketHandler::HandleChatMessage(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::GENERAL_CHAT_MESSAGE:
|
|
|
|
|
ChatPacketHandler::HandleChatMessage(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::PRIVATE_CHAT_MESSAGE:
|
|
|
|
|
//This message is supposed to be echo'd to both the sender and the receiver
|
|
|
|
|
//BUT: they have to have different responseCodes, so we'll do some of the ol hacky wacky to fix that right up.
|
|
|
|
|
ChatPacketHandler::HandlePrivateChatMessage(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::PRIVATE_CHAT_MESSAGE:
|
|
|
|
|
//This message is supposed to be echo'd to both the sender and the receiver
|
|
|
|
|
//BUT: they have to have different responseCodes, so we'll do some of the ol hacky wacky to fix that right up.
|
|
|
|
|
ChatPacketHandler::HandlePrivateChatMessage(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::TEAM_INVITE:
|
|
|
|
|
ChatPacketHandler::HandleTeamInvite(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::TEAM_INVITE:
|
|
|
|
|
ChatPacketHandler::HandleTeamInvite(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::TEAM_INVITE_RESPONSE:
|
|
|
|
|
ChatPacketHandler::HandleTeamInviteResponse(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::TEAM_INVITE_RESPONSE:
|
|
|
|
|
ChatPacketHandler::HandleTeamInviteResponse(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::TEAM_LEAVE:
|
|
|
|
|
ChatPacketHandler::HandleTeamLeave(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::TEAM_LEAVE:
|
|
|
|
|
ChatPacketHandler::HandleTeamLeave(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::TEAM_SET_LEADER:
|
|
|
|
|
ChatPacketHandler::HandleTeamPromote(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::TEAM_SET_LEADER:
|
|
|
|
|
ChatPacketHandler::HandleTeamPromote(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::TEAM_KICK:
|
|
|
|
|
ChatPacketHandler::HandleTeamKick(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::TEAM_KICK:
|
|
|
|
|
ChatPacketHandler::HandleTeamKick(packet);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MessageType::Chat::TEAM_SET_LOOT:
|
|
|
|
|
ChatPacketHandler::HandleTeamLootOption(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::GMLEVEL_UPDATE:
|
|
|
|
|
ChatPacketHandler::HandleGMLevelUpdate(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::LOGIN_SESSION_NOTIFY:
|
|
|
|
|
Game::playerContainer.InsertPlayer(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::GM_ANNOUNCE: {
|
|
|
|
|
// we just forward this packet to every connected server
|
|
|
|
|
inStream.ResetReadPointer();
|
|
|
|
|
Game::server->Send(inStream, packet->systemAddress, true); // send to everyone except origin
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::UNEXPECTED_DISCONNECT:
|
|
|
|
|
Game::playerContainer.ScheduleRemovePlayer(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::WHO:
|
|
|
|
|
ChatPacketHandler::HandleWho(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::SHOW_ALL:
|
|
|
|
|
ChatPacketHandler::HandleShowAll(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::USER_CHANNEL_CHAT_MESSAGE:
|
|
|
|
|
case MessageType::Chat::WORLD_DISCONNECT_REQUEST:
|
|
|
|
|
case MessageType::Chat::WORLD_PROXIMITY_RESPONSE:
|
|
|
|
|
case MessageType::Chat::WORLD_PARCEL_RESPONSE:
|
|
|
|
|
case MessageType::Chat::TEAM_MISSED_INVITE_CHECK:
|
|
|
|
|
case MessageType::Chat::GUILD_CREATE:
|
|
|
|
|
case MessageType::Chat::GUILD_INVITE:
|
|
|
|
|
case MessageType::Chat::GUILD_INVITE_RESPONSE:
|
|
|
|
|
case MessageType::Chat::GUILD_LEAVE:
|
|
|
|
|
case MessageType::Chat::GUILD_KICK:
|
|
|
|
|
case MessageType::Chat::GUILD_GET_STATUS:
|
|
|
|
|
case MessageType::Chat::GUILD_GET_ALL:
|
|
|
|
|
case MessageType::Chat::BLUEPRINT_MODERATED:
|
|
|
|
|
case MessageType::Chat::BLUEPRINT_MODEL_READY:
|
|
|
|
|
case MessageType::Chat::PROPERTY_READY_FOR_APPROVAL:
|
|
|
|
|
case MessageType::Chat::PROPERTY_MODERATION_CHANGED:
|
|
|
|
|
case MessageType::Chat::PROPERTY_BUILDMODE_CHANGED:
|
|
|
|
|
case MessageType::Chat::PROPERTY_BUILDMODE_CHANGED_REPORT:
|
|
|
|
|
case MessageType::Chat::MAIL:
|
|
|
|
|
case MessageType::Chat::WORLD_INSTANCE_LOCATION_REQUEST:
|
|
|
|
|
case MessageType::Chat::REPUTATION_UPDATE:
|
|
|
|
|
case MessageType::Chat::SEND_CANNED_TEXT:
|
|
|
|
|
case MessageType::Chat::CHARACTER_NAME_CHANGE_REQUEST:
|
|
|
|
|
case MessageType::Chat::CSR_REQUEST:
|
|
|
|
|
case MessageType::Chat::CSR_REPLY:
|
|
|
|
|
case MessageType::Chat::GM_KICK:
|
|
|
|
|
case MessageType::Chat::WORLD_ROUTE_PACKET:
|
|
|
|
|
case MessageType::Chat::GET_ZONE_POPULATIONS:
|
|
|
|
|
case MessageType::Chat::REQUEST_MINIMUM_CHAT_MODE:
|
|
|
|
|
case MessageType::Chat::MATCH_REQUEST:
|
|
|
|
|
case MessageType::Chat::UGCMANIFEST_REPORT_MISSING_FILE:
|
|
|
|
|
case MessageType::Chat::UGCMANIFEST_REPORT_DONE_FILE:
|
|
|
|
|
case MessageType::Chat::UGCMANIFEST_REPORT_DONE_BLUEPRINT:
|
|
|
|
|
case MessageType::Chat::UGCC_REQUEST:
|
|
|
|
|
case MessageType::Chat::WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE:
|
|
|
|
|
case MessageType::Chat::ACHIEVEMENT_NOTIFY:
|
|
|
|
|
case MessageType::Chat::GM_CLOSE_PRIVATE_CHAT_WINDOW:
|
|
|
|
|
case MessageType::Chat::PLAYER_READY:
|
|
|
|
|
case MessageType::Chat::GET_DONATION_TOTAL:
|
|
|
|
|
case MessageType::Chat::UPDATE_DONATION:
|
|
|
|
|
case MessageType::Chat::PRG_CSR_COMMAND:
|
|
|
|
|
case MessageType::Chat::HEARTBEAT_REQUEST_FROM_WORLD:
|
|
|
|
|
case MessageType::Chat::UPDATE_FREE_TRIAL_STATUS:
|
|
|
|
|
LOG("Unhandled CHAT Message id: %s (%i)", StringifiedEnum::ToString(chatMessageID).data(), chatMessageID);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
LOG("Unknown CHAT Message id: %i", chatMessageID);
|
|
|
|
|
case MessageType::Chat::TEAM_SET_LOOT:
|
|
|
|
|
ChatPacketHandler::HandleTeamLootOption(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::GMLEVEL_UPDATE:
|
|
|
|
|
ChatPacketHandler::HandleGMLevelUpdate(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::LOGIN_SESSION_NOTIFY:
|
|
|
|
|
Game::playerContainer.InsertPlayer(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::GM_ANNOUNCE:{
|
|
|
|
|
// we just forward this packet to every connected server
|
|
|
|
|
inStream.ResetReadPointer();
|
|
|
|
|
Game::server->Send(inStream, packet->systemAddress, true); // send to everyone except origin
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::UNEXPECTED_DISCONNECT:
|
|
|
|
|
Game::playerContainer.RemovePlayer(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::WHO:
|
|
|
|
|
ChatPacketHandler::HandleWho(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::SHOW_ALL:
|
|
|
|
|
ChatPacketHandler::HandleShowAll(packet);
|
|
|
|
|
break;
|
|
|
|
|
case MessageType::Chat::USER_CHANNEL_CHAT_MESSAGE:
|
|
|
|
|
case MessageType::Chat::WORLD_DISCONNECT_REQUEST:
|
|
|
|
|
case MessageType::Chat::WORLD_PROXIMITY_RESPONSE:
|
|
|
|
|
case MessageType::Chat::WORLD_PARCEL_RESPONSE:
|
|
|
|
|
case MessageType::Chat::TEAM_MISSED_INVITE_CHECK:
|
|
|
|
|
case MessageType::Chat::GUILD_CREATE:
|
|
|
|
|
case MessageType::Chat::GUILD_INVITE:
|
|
|
|
|
case MessageType::Chat::GUILD_INVITE_RESPONSE:
|
|
|
|
|
case MessageType::Chat::GUILD_LEAVE:
|
|
|
|
|
case MessageType::Chat::GUILD_KICK:
|
|
|
|
|
case MessageType::Chat::GUILD_GET_STATUS:
|
|
|
|
|
case MessageType::Chat::GUILD_GET_ALL:
|
|
|
|
|
case MessageType::Chat::BLUEPRINT_MODERATED:
|
|
|
|
|
case MessageType::Chat::BLUEPRINT_MODEL_READY:
|
|
|
|
|
case MessageType::Chat::PROPERTY_READY_FOR_APPROVAL:
|
|
|
|
|
case MessageType::Chat::PROPERTY_MODERATION_CHANGED:
|
|
|
|
|
case MessageType::Chat::PROPERTY_BUILDMODE_CHANGED:
|
|
|
|
|
case MessageType::Chat::PROPERTY_BUILDMODE_CHANGED_REPORT:
|
|
|
|
|
case MessageType::Chat::MAIL:
|
|
|
|
|
case MessageType::Chat::WORLD_INSTANCE_LOCATION_REQUEST:
|
|
|
|
|
case MessageType::Chat::REPUTATION_UPDATE:
|
|
|
|
|
case MessageType::Chat::SEND_CANNED_TEXT:
|
|
|
|
|
case MessageType::Chat::CHARACTER_NAME_CHANGE_REQUEST:
|
|
|
|
|
case MessageType::Chat::CSR_REQUEST:
|
|
|
|
|
case MessageType::Chat::CSR_REPLY:
|
|
|
|
|
case MessageType::Chat::GM_KICK:
|
|
|
|
|
case MessageType::Chat::WORLD_ROUTE_PACKET:
|
|
|
|
|
case MessageType::Chat::GET_ZONE_POPULATIONS:
|
|
|
|
|
case MessageType::Chat::REQUEST_MINIMUM_CHAT_MODE:
|
|
|
|
|
case MessageType::Chat::MATCH_REQUEST:
|
|
|
|
|
case MessageType::Chat::UGCMANIFEST_REPORT_MISSING_FILE:
|
|
|
|
|
case MessageType::Chat::UGCMANIFEST_REPORT_DONE_FILE:
|
|
|
|
|
case MessageType::Chat::UGCMANIFEST_REPORT_DONE_BLUEPRINT:
|
|
|
|
|
case MessageType::Chat::UGCC_REQUEST:
|
|
|
|
|
case MessageType::Chat::WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE:
|
|
|
|
|
case MessageType::Chat::ACHIEVEMENT_NOTIFY:
|
|
|
|
|
case MessageType::Chat::GM_CLOSE_PRIVATE_CHAT_WINDOW:
|
|
|
|
|
case MessageType::Chat::PLAYER_READY:
|
|
|
|
|
case MessageType::Chat::GET_DONATION_TOTAL:
|
|
|
|
|
case MessageType::Chat::UPDATE_DONATION:
|
|
|
|
|
case MessageType::Chat::PRG_CSR_COMMAND:
|
|
|
|
|
case MessageType::Chat::HEARTBEAT_REQUEST_FROM_WORLD:
|
|
|
|
|
case MessageType::Chat::UPDATE_FREE_TRIAL_STATUS:
|
|
|
|
|
LOG("Unhandled CHAT Message id: %s (%i)", StringifiedEnum::ToString(chatMessageID).data(), chatMessageID);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
LOG("Unknown CHAT Message id: %i", chatMessageID);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|