mirror of
				https://github.com/DarkflameUniverse/DarkflameServer.git
				synced 2025-11-03 22:21:59 +00:00 
			
		
		
		
	chore: start deprecating chat_internal
Add support for who and Show_all packets Add DebugOuput and HttpMonInfo packets
This commit is contained in:
		@@ -1,6 +1,6 @@
 | 
				
			|||||||
#include "ChatIgnoreList.h"
 | 
					#include "ChatIgnoreList.h"
 | 
				
			||||||
#include "PlayerContainer.h"
 | 
					#include "PlayerContainer.h"
 | 
				
			||||||
#include "eChatInternalMessageType.h"
 | 
					#include "eChatMessageType.h"
 | 
				
			||||||
#include "BitStreamUtils.h"
 | 
					#include "BitStreamUtils.h"
 | 
				
			||||||
#include "Game.h"
 | 
					#include "Game.h"
 | 
				
			||||||
#include "Logger.h"
 | 
					#include "Logger.h"
 | 
				
			||||||
@@ -13,7 +13,7 @@
 | 
				
			|||||||
// The only thing not auto-handled is instance activities force joining the team on the server.
 | 
					// The only thing not auto-handled is instance activities force joining the team on the server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WriteOutgoingReplyHeader(RakNet::BitStream& bitStream, const LWOOBJID& receivingPlayer, const ChatIgnoreList::Response type) {
 | 
					void WriteOutgoingReplyHeader(RakNet::BitStream& bitStream, const LWOOBJID& receivingPlayer, const ChatIgnoreList::Response type) {
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receivingPlayer);
 | 
						bitStream.Write(receivingPlayer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,7 +60,7 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	//Now, we need to send the friendlist to the server they came from:
 | 
						//Now, we need to send the friendlist to the server they came from:
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(playerID);
 | 
						bitStream.Write(playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
@@ -355,6 +355,75 @@ void ChatPacketHandler::HandleGMLevelUpdate(Packet* packet) {
 | 
				
			|||||||
	inStream.Read(player.gmLevel);
 | 
						inStream.Read(player.gmLevel);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ChatPacketHandler::HandleWho(Packet* packet) {
 | 
				
			||||||
 | 
						CINSTREAM_SKIP_HEADER;
 | 
				
			||||||
 | 
						LWOOBJID playerID;
 | 
				
			||||||
 | 
						inStream.Read(playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const auto& sender = Game::playerContainer.GetPlayerData(playerID);
 | 
				
			||||||
 | 
						if (!sender) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						LUWString playerName;
 | 
				
			||||||
 | 
						inStream.Read(playerName);
 | 
				
			||||||
 | 
						const auto& player = Game::playerContainer.GetPlayerData(playerName.GetAsString());
 | 
				
			||||||
 | 
						bool online = true;
 | 
				
			||||||
 | 
						if (!player) online = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CBITSTREAM;
 | 
				
			||||||
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
 | 
						bitStream.Write(playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::WHO_RESPONSE);
 | 
				
			||||||
 | 
						bitStream.Write<uint8_t>(online);
 | 
				
			||||||
 | 
						bitStream.Write(player.zoneID.GetMapID());
 | 
				
			||||||
 | 
						bitStream.Write(player.zoneID.GetInstanceID());
 | 
				
			||||||
 | 
						bitStream.Write(player.zoneID.GetCloneID());
 | 
				
			||||||
 | 
						bitStream.Write(playerName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SystemAddress sysAddr = sender.sysAddr;
 | 
				
			||||||
 | 
						SEND_PACKET;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ChatPacketHandler::HandleShowAll(Packet* packet) {
 | 
				
			||||||
 | 
						CINSTREAM_SKIP_HEADER;
 | 
				
			||||||
 | 
						LWOOBJID playerID;
 | 
				
			||||||
 | 
						inStream.Read(playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const auto& sender = Game::playerContainer.GetPlayerData(playerID);
 | 
				
			||||||
 | 
						if (!sender) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						LUString displayZoneData(1);
 | 
				
			||||||
 | 
						inStream.Read(displayZoneData);
 | 
				
			||||||
 | 
						LUString displayIndividualPlayers(1);
 | 
				
			||||||
 | 
						inStream.Read(displayIndividualPlayers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CBITSTREAM;
 | 
				
			||||||
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
 | 
						bitStream.Write(playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::SHOW_ALL_RESPONSE);
 | 
				
			||||||
 | 
						bitStream.Write<uint8_t>(displayZoneData.string != "1" && displayIndividualPlayers.string != "1");
 | 
				
			||||||
 | 
						bitStream.Write(Game::playerContainer.GetPlayerCount());
 | 
				
			||||||
 | 
						bitStream.Write(Game::playerContainer.GetSimCount());
 | 
				
			||||||
 | 
						bitStream.Write<uint8_t>(displayIndividualPlayers.string == "1");
 | 
				
			||||||
 | 
						bitStream.Write<uint8_t>(displayZoneData.string == "1");
 | 
				
			||||||
 | 
						if (displayZoneData.string == "1" || displayIndividualPlayers.string == "1"){
 | 
				
			||||||
 | 
							for (auto& [playerID, playerData ]: Game::playerContainer.GetAllPlayers()){
 | 
				
			||||||
 | 
								if (!playerData) continue;
 | 
				
			||||||
 | 
								bitStream.Write<uint8_t>(0); // padding
 | 
				
			||||||
 | 
								if (displayIndividualPlayers.string == "1") bitStream.Write(LUWString(playerData.playerName));
 | 
				
			||||||
 | 
								if (displayZoneData.string == "1") {
 | 
				
			||||||
 | 
									bitStream.Write(playerData.zoneID.GetMapID());
 | 
				
			||||||
 | 
									bitStream.Write(playerData.zoneID.GetInstanceID());
 | 
				
			||||||
 | 
									bitStream.Write(playerData.zoneID.GetCloneID());
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						SystemAddress sysAddr = sender.sysAddr;
 | 
				
			||||||
 | 
						SEND_PACKET;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// the structure the client uses to send this packet is shared in many chat messages 
 | 
					// the structure the client uses to send this packet is shared in many chat messages 
 | 
				
			||||||
// that are sent to the server. Because of this, there are large gaps of unused data in chat messages
 | 
					// that are sent to the server. Because of this, there are large gaps of unused data in chat messages
 | 
				
			||||||
void ChatPacketHandler::HandleChatMessage(Packet* packet) {
 | 
					void ChatPacketHandler::HandleChatMessage(Packet* packet) {
 | 
				
			||||||
@@ -454,7 +523,7 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void ChatPacketHandler::SendPrivateChatMessage(const PlayerData& sender, const PlayerData& receiver, const PlayerData& routeTo, const LUWString& message, const eChatChannel channel, const eChatMessageResponseCode responseCode) {
 | 
					void ChatPacketHandler::SendPrivateChatMessage(const PlayerData& sender, const PlayerData& receiver, const PlayerData& routeTo, const LUWString& message, const eChatChannel channel, const eChatMessageResponseCode responseCode) {
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(routeTo.playerID);
 | 
						bitStream.Write(routeTo.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE);
 | 
				
			||||||
@@ -696,7 +765,7 @@ void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void ChatPacketHandler::SendTeamInvite(const PlayerData& receiver, const PlayerData& sender) {
 | 
					void ChatPacketHandler::SendTeamInvite(const PlayerData& receiver, const PlayerData& sender) {
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receiver.playerID);
 | 
						bitStream.Write(receiver.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
@@ -711,7 +780,7 @@ void ChatPacketHandler::SendTeamInvite(const PlayerData& receiver, const PlayerD
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void ChatPacketHandler::SendTeamInviteConfirm(const PlayerData& receiver, bool bLeaderIsFreeTrial, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, uint8_t ucResponseCode, std::u16string wsLeaderName) {
 | 
					void ChatPacketHandler::SendTeamInviteConfirm(const PlayerData& receiver, bool bLeaderIsFreeTrial, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, uint8_t ucResponseCode, std::u16string wsLeaderName) {
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receiver.playerID);
 | 
						bitStream.Write(receiver.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
@@ -738,7 +807,7 @@ void ChatPacketHandler::SendTeamInviteConfirm(const PlayerData& receiver, bool b
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void ChatPacketHandler::SendTeamStatus(const PlayerData& receiver, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, std::u16string wsLeaderName) {
 | 
					void ChatPacketHandler::SendTeamStatus(const PlayerData& receiver, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, std::u16string wsLeaderName) {
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receiver.playerID);
 | 
						bitStream.Write(receiver.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
@@ -763,7 +832,7 @@ void ChatPacketHandler::SendTeamStatus(const PlayerData& receiver, LWOOBJID i64L
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void ChatPacketHandler::SendTeamSetLeader(const PlayerData& receiver, LWOOBJID i64PlayerID) {
 | 
					void ChatPacketHandler::SendTeamSetLeader(const PlayerData& receiver, LWOOBJID i64PlayerID) {
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receiver.playerID);
 | 
						bitStream.Write(receiver.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
@@ -780,7 +849,7 @@ void ChatPacketHandler::SendTeamSetLeader(const PlayerData& receiver, LWOOBJID i
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void ChatPacketHandler::SendTeamAddPlayer(const PlayerData& receiver, bool bIsFreeTrial, bool bLocal, bool bNoLootOnDeath, LWOOBJID i64PlayerID, std::u16string wsPlayerName, LWOZONEID zoneID) {
 | 
					void ChatPacketHandler::SendTeamAddPlayer(const PlayerData& receiver, bool bIsFreeTrial, bool bLocal, bool bNoLootOnDeath, LWOOBJID i64PlayerID, std::u16string wsPlayerName, LWOZONEID zoneID) {
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receiver.playerID);
 | 
						bitStream.Write(receiver.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
@@ -809,7 +878,7 @@ void ChatPacketHandler::SendTeamAddPlayer(const PlayerData& receiver, bool bIsFr
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void ChatPacketHandler::SendTeamRemovePlayer(const PlayerData& receiver, bool bDisband, bool bIsKicked, bool bIsLeaving, bool bLocal, LWOOBJID i64LeaderID, LWOOBJID i64PlayerID, std::u16string wsPlayerName) {
 | 
					void ChatPacketHandler::SendTeamRemovePlayer(const PlayerData& receiver, bool bDisband, bool bIsKicked, bool bIsLeaving, bool bLocal, LWOOBJID i64LeaderID, LWOOBJID i64PlayerID, std::u16string wsPlayerName) {
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receiver.playerID);
 | 
						bitStream.Write(receiver.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
@@ -835,7 +904,7 @@ void ChatPacketHandler::SendTeamRemovePlayer(const PlayerData& receiver, bool bD
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void ChatPacketHandler::SendTeamSetOffWorldFlag(const PlayerData& receiver, LWOOBJID i64PlayerID, LWOZONEID zoneID) {
 | 
					void ChatPacketHandler::SendTeamSetOffWorldFlag(const PlayerData& receiver, LWOOBJID i64PlayerID, LWOZONEID zoneID) {
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receiver.playerID);
 | 
						bitStream.Write(receiver.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
@@ -869,7 +938,7 @@ void ChatPacketHandler::SendFriendUpdate(const PlayerData& friendData, const Pla
 | 
				
			|||||||
		[bool] - is FTP*/
 | 
							[bool] - is FTP*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(friendData.playerID);
 | 
						bitStream.Write(friendData.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
@@ -906,7 +975,7 @@ void ChatPacketHandler::SendFriendRequest(const PlayerData& receiver, const Play
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receiver.playerID);
 | 
						bitStream.Write(receiver.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
@@ -920,7 +989,7 @@ void ChatPacketHandler::SendFriendRequest(const PlayerData& receiver, const Play
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void ChatPacketHandler::SendFriendResponse(const PlayerData& receiver, const PlayerData& sender, eAddFriendResponseType responseCode, uint8_t isBestFriendsAlready, uint8_t isBestFriendRequest) {
 | 
					void ChatPacketHandler::SendFriendResponse(const PlayerData& receiver, const PlayerData& sender, eAddFriendResponseType responseCode, uint8_t isBestFriendsAlready, uint8_t isBestFriendRequest) {
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receiver.playerID);
 | 
						bitStream.Write(receiver.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Portion that will get routed:
 | 
						// Portion that will get routed:
 | 
				
			||||||
@@ -943,7 +1012,7 @@ void ChatPacketHandler::SendFriendResponse(const PlayerData& receiver, const Pla
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void ChatPacketHandler::SendRemoveFriend(const PlayerData& receiver, std::string& personToRemove, bool isSuccessful) {
 | 
					void ChatPacketHandler::SendRemoveFriend(const PlayerData& receiver, std::string& personToRemove, bool isSuccessful) {
 | 
				
			||||||
	CBITSTREAM;
 | 
						CBITSTREAM;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT,  eChatMessageType::WORLD_ROUTE_PACKET);
 | 
				
			||||||
	bitStream.Write(receiver.playerID);
 | 
						bitStream.Write(receiver.playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//portion that will get routed:
 | 
						//portion that will get routed:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,8 @@ namespace ChatPacketHandler {
 | 
				
			|||||||
	void HandleFriendResponse(Packet* packet);
 | 
						void HandleFriendResponse(Packet* packet);
 | 
				
			||||||
	void HandleRemoveFriend(Packet* packet);
 | 
						void HandleRemoveFriend(Packet* packet);
 | 
				
			||||||
	void HandleGMLevelUpdate(Packet* packet);
 | 
						void HandleGMLevelUpdate(Packet* packet);
 | 
				
			||||||
 | 
						void HandleWho(Packet* packet);
 | 
				
			||||||
 | 
						void HandleShowAll(Packet* packet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void HandleChatMessage(Packet* packet);
 | 
						void HandleChatMessage(Packet* packet);
 | 
				
			||||||
	void HandlePrivateChatMessage(Packet* packet);
 | 
						void HandlePrivateChatMessage(Packet* packet);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -298,6 +298,12 @@ void HandlePacket(Packet* packet) {
 | 
				
			|||||||
		case eChatMessageType::GMLEVEL_UPDATE:
 | 
							case eChatMessageType::GMLEVEL_UPDATE:
 | 
				
			||||||
			ChatPacketHandler::HandleGMLevelUpdate(packet);
 | 
								ChatPacketHandler::HandleGMLevelUpdate(packet);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case eChatMessageType::WHO:
 | 
				
			||||||
 | 
								ChatPacketHandler::HandleWho(packet);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case eChatMessageType::SHOW_ALL:
 | 
				
			||||||
 | 
								ChatPacketHandler::HandleShowAll(packet);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case eChatMessageType::LOGIN_SESSION_NOTIFY:
 | 
							case eChatMessageType::LOGIN_SESSION_NOTIFY:
 | 
				
			||||||
		case eChatMessageType::USER_CHANNEL_CHAT_MESSAGE:
 | 
							case eChatMessageType::USER_CHANNEL_CHAT_MESSAGE:
 | 
				
			||||||
		case eChatMessageType::WORLD_DISCONNECT_REQUEST:
 | 
							case eChatMessageType::WORLD_DISCONNECT_REQUEST:
 | 
				
			||||||
@@ -311,7 +317,6 @@ void HandlePacket(Packet* packet) {
 | 
				
			|||||||
		case eChatMessageType::GUILD_KICK:
 | 
							case eChatMessageType::GUILD_KICK:
 | 
				
			||||||
		case eChatMessageType::GUILD_GET_STATUS:
 | 
							case eChatMessageType::GUILD_GET_STATUS:
 | 
				
			||||||
		case eChatMessageType::GUILD_GET_ALL:
 | 
							case eChatMessageType::GUILD_GET_ALL:
 | 
				
			||||||
		case eChatMessageType::SHOW_ALL:
 | 
					 | 
				
			||||||
		case eChatMessageType::BLUEPRINT_MODERATED:
 | 
							case eChatMessageType::BLUEPRINT_MODERATED:
 | 
				
			||||||
		case eChatMessageType::BLUEPRINT_MODEL_READY:
 | 
							case eChatMessageType::BLUEPRINT_MODEL_READY:
 | 
				
			||||||
		case eChatMessageType::PROPERTY_READY_FOR_APPROVAL:
 | 
							case eChatMessageType::PROPERTY_READY_FOR_APPROVAL:
 | 
				
			||||||
@@ -335,7 +340,6 @@ void HandlePacket(Packet* packet) {
 | 
				
			|||||||
		case eChatMessageType::UGCMANIFEST_REPORT_DONE_FILE:
 | 
							case eChatMessageType::UGCMANIFEST_REPORT_DONE_FILE:
 | 
				
			||||||
		case eChatMessageType::UGCMANIFEST_REPORT_DONE_BLUEPRINT:
 | 
							case eChatMessageType::UGCMANIFEST_REPORT_DONE_BLUEPRINT:
 | 
				
			||||||
		case eChatMessageType::UGCC_REQUEST:
 | 
							case eChatMessageType::UGCC_REQUEST:
 | 
				
			||||||
		case eChatMessageType::WHO:
 | 
					 | 
				
			||||||
		case eChatMessageType::WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE:
 | 
							case eChatMessageType::WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE:
 | 
				
			||||||
		case eChatMessageType::ACHIEVEMENT_NOTIFY:
 | 
							case eChatMessageType::ACHIEVEMENT_NOTIFY:
 | 
				
			||||||
		case eChatMessageType::GM_CLOSE_PRIVATE_CHAT_WINDOW:
 | 
							case eChatMessageType::GM_CLOSE_PRIVATE_CHAT_WINDOW:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,6 +56,7 @@ void PlayerContainer::InsertPlayer(Packet* packet) {
 | 
				
			|||||||
	data.sysAddr = packet->systemAddress;
 | 
						data.sysAddr = packet->systemAddress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	m_Names[data.playerID] = GeneralUtils::UTF8ToUTF16(data.playerName);
 | 
						m_Names[data.playerID] = GeneralUtils::UTF8ToUTF16(data.playerName);
 | 
				
			||||||
 | 
						m_PlayerCount++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	LOG("Added user: %s (%llu), zone: %i", data.playerName.c_str(), data.playerID, data.zoneID.GetMapID());
 | 
						LOG("Added user: %s (%llu), zone: %i", data.playerName.c_str(), data.playerID, data.zoneID.GetMapID());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -94,6 +95,7 @@ void PlayerContainer::RemovePlayer(Packet* packet) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						m_PlayerCount--;
 | 
				
			||||||
	LOG("Removed user: %llu", playerID);
 | 
						LOG("Removed user: %llu", playerID);
 | 
				
			||||||
	m_Players.erase(playerID);
 | 
						m_Players.erase(playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,6 +74,9 @@ public:
 | 
				
			|||||||
	const PlayerData& GetPlayerData(const std::string& playerName);
 | 
						const PlayerData& GetPlayerData(const std::string& playerName);
 | 
				
			||||||
	PlayerData& GetPlayerDataMutable(const LWOOBJID& playerID);
 | 
						PlayerData& GetPlayerDataMutable(const LWOOBJID& playerID);
 | 
				
			||||||
	PlayerData& GetPlayerDataMutable(const std::string& playerName);
 | 
						PlayerData& GetPlayerDataMutable(const std::string& playerName);
 | 
				
			||||||
 | 
						uint32_t GetPlayerCount() { return m_PlayerCount; };
 | 
				
			||||||
 | 
						uint32_t GetSimCount() { return m_SimCount; };
 | 
				
			||||||
 | 
						std::map<LWOOBJID, PlayerData> GetAllPlayers() { return m_Players; };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TeamData* CreateLocalTeam(std::vector<LWOOBJID> members);
 | 
						TeamData* CreateLocalTeam(std::vector<LWOOBJID> members);
 | 
				
			||||||
	TeamData* CreateTeam(LWOOBJID leader, bool local = false);
 | 
						TeamData* CreateTeam(LWOOBJID leader, bool local = false);
 | 
				
			||||||
@@ -96,5 +99,7 @@ private:
 | 
				
			|||||||
	std::unordered_map<LWOOBJID, std::u16string> m_Names;
 | 
						std::unordered_map<LWOOBJID, std::u16string> m_Names;
 | 
				
			||||||
	uint32_t m_MaxNumberOfBestFriends = 5;
 | 
						uint32_t m_MaxNumberOfBestFriends = 5;
 | 
				
			||||||
	uint32_t m_MaxNumberOfFriends = 50;
 | 
						uint32_t m_MaxNumberOfFriends = 50;
 | 
				
			||||||
 | 
						uint32_t m_PlayerCount = 0;
 | 
				
			||||||
 | 
						uint32_t m_SimCount = 0;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,6 +81,7 @@
 | 
				
			|||||||
#include "eControlScheme.h"
 | 
					#include "eControlScheme.h"
 | 
				
			||||||
#include "eConnectionType.h"
 | 
					#include "eConnectionType.h"
 | 
				
			||||||
#include "eChatInternalMessageType.h"
 | 
					#include "eChatInternalMessageType.h"
 | 
				
			||||||
 | 
					#include "eChatMessageType.h"
 | 
				
			||||||
#include "eMasterMessageType.h"
 | 
					#include "eMasterMessageType.h"
 | 
				
			||||||
#include "PlayerManager.h"
 | 
					#include "PlayerManager.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -376,6 +377,24 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		if (entity->GetGMLevel() == eGameMasterLevel::CIVILIAN) return;
 | 
							if (entity->GetGMLevel() == eGameMasterLevel::CIVILIAN) return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if (chatCommand == "whowhere" && args.size() > 0 && entity->GetGMLevel() >= eGameMasterLevel::JUNIOR_MODERATOR) {
 | 
				
			||||||
 | 
							if (args.at(0) == "all"){	
 | 
				
			||||||
 | 
								CBITSTREAM;
 | 
				
			||||||
 | 
								BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::SHOW_ALL);
 | 
				
			||||||
 | 
								bitStream.Write(entity->GetObjectID());
 | 
				
			||||||
 | 
								if (args.size() > 1) bitStream.Write(LUString(args.at(1), 1));
 | 
				
			||||||
 | 
								else bitStream.Write(LUString("1", 1));
 | 
				
			||||||
 | 
								if (args.size() > 2) bitStream.Write(LUString(args.at(2), 1));
 | 
				
			||||||
 | 
								else bitStream.Write(LUString("1", 1));
 | 
				
			||||||
 | 
								Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								CBITSTREAM;
 | 
				
			||||||
 | 
								BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::WHO);
 | 
				
			||||||
 | 
								bitStream.Write(entity->GetObjectID());
 | 
				
			||||||
 | 
								bitStream.Write(LUWString(args.at(0)));
 | 
				
			||||||
 | 
								Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (chatCommand == "resetmission" && args.size() >= 1 && entity->GetGMLevel() >= eGameMasterLevel::DEVELOPER) {
 | 
						if (chatCommand == "resetmission" && args.size() >= 1 && entity->GetGMLevel() >= eGameMasterLevel::DEVELOPER) {
 | 
				
			||||||
		uint32_t missionId;
 | 
							uint32_t missionId;
 | 
				
			||||||
@@ -1901,6 +1920,21 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
 | 
				
			|||||||
		if (id != -1) Database::Get()->InsertRewardCode(user->GetAccountID(), id);
 | 
							if (id != -1) Database::Get()->InsertRewardCode(user->GetAccountID(), id);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (chatCommand == "gethttpmoninfo" && entity->GetGMLevel() >= eGameMasterLevel::DEVELOPER) {
 | 
				
			||||||
 | 
							WorldPackets::SendDebugOuput(sysAddr, "HTTP Monitor is not implemented.");
 | 
				
			||||||
 | 
							HTTPMonitorInfo info;
 | 
				
			||||||
 | 
							info.port = Game::server->GetPort();
 | 
				
			||||||
 | 
							WorldPackets::SendHTTPMonitorInfo(sysAddr, info);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (chatCommand == "openhttpmoninfo" && entity->GetGMLevel() >= eGameMasterLevel::DEVELOPER) {
 | 
				
			||||||
 | 
							WorldPackets::SendDebugOuput(sysAddr, "HTTP Monitor is not implemented.");
 | 
				
			||||||
 | 
							HTTPMonitorInfo info;
 | 
				
			||||||
 | 
							info.port = Game::server->GetPort();
 | 
				
			||||||
 | 
							info.openWeb = true;
 | 
				
			||||||
 | 
							WorldPackets::SendHTTPMonitorInfo(sysAddr, info);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (chatCommand == "inspect" && entity->GetGMLevel() >= eGameMasterLevel::DEVELOPER && args.size() >= 1) {
 | 
						if (chatCommand == "inspect" && entity->GetGMLevel() >= eGameMasterLevel::DEVELOPER && args.size() >= 1) {
 | 
				
			||||||
		Entity* closest = nullptr;
 | 
							Entity* closest = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,15 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void HTTPMonitorInfo::Serialize(RakNet::BitStream &bitStream) const {
 | 
				
			||||||
 | 
						bitStream.Write(port);
 | 
				
			||||||
 | 
						bitStream.Write<uint8_t>(openWeb);
 | 
				
			||||||
 | 
						bitStream.Write<uint8_t>(supportsSum);
 | 
				
			||||||
 | 
						bitStream.Write<uint8_t>(supportsDetail);
 | 
				
			||||||
 | 
						bitStream.Write<uint8_t>(supportsWho);
 | 
				
			||||||
 | 
						bitStream.Write<uint8_t>(supportsObjects);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WorldPackets::SendLoadStaticZone(const SystemAddress& sysAddr, float x, float y, float z, uint32_t checksum, LWOZONEID zone) {
 | 
					void WorldPackets::SendLoadStaticZone(const SystemAddress& sysAddr, float x, float y, float z, uint32_t checksum, LWOZONEID zone) {
 | 
				
			||||||
	RakNet::BitStream bitStream;
 | 
						RakNet::BitStream bitStream;
 | 
				
			||||||
	BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::LOAD_STATIC_ZONE);
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::LOAD_STATIC_ZONE);
 | 
				
			||||||
@@ -160,3 +169,18 @@ void WorldPackets::SendGMLevelChange(const SystemAddress& sysAddr, bool success,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	SEND_PACKET;
 | 
						SEND_PACKET;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void WorldPackets::SendDebugOuput(const SystemAddress& sysAddr, const std::string data){
 | 
				
			||||||
 | 
						CBITSTREAM;
 | 
				
			||||||
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::DEBUG_OUTPUT);
 | 
				
			||||||
 | 
						bitStream.Write<uint32_t>(data.size());
 | 
				
			||||||
 | 
						bitStream.Write(data);
 | 
				
			||||||
 | 
						SEND_PACKET;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void WorldPackets::SendHTTPMonitorInfo(const SystemAddress& sysAddr, const HTTPMonitorInfo info) {
 | 
				
			||||||
 | 
						CBITSTREAM;
 | 
				
			||||||
 | 
						BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::HTTP_MONITOR_INFO_RESPONSE);
 | 
				
			||||||
 | 
						info.Serialize(bitStream);
 | 
				
			||||||
 | 
						SEND_PACKET;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,22 @@ enum class eGameMasterLevel : uint8_t;
 | 
				
			|||||||
enum class eCharacterCreationResponse : uint8_t;
 | 
					enum class eCharacterCreationResponse : uint8_t;
 | 
				
			||||||
enum class eRenameResponse : uint8_t;
 | 
					enum class eRenameResponse : uint8_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace RakNet {
 | 
				
			||||||
 | 
						class BitStream;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma pack(push, 1)
 | 
				
			||||||
 | 
					struct HTTPMonitorInfo {
 | 
				
			||||||
 | 
						uint16_t port = 80;
 | 
				
			||||||
 | 
						bool openWeb = false;
 | 
				
			||||||
 | 
						bool supportsSum = false;
 | 
				
			||||||
 | 
						bool supportsDetail = false;
 | 
				
			||||||
 | 
						bool supportsWho = false;
 | 
				
			||||||
 | 
						bool supportsObjects = false;
 | 
				
			||||||
 | 
						void Serialize(RakNet::BitStream &bitstream) const;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#pragma pack(pop)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace WorldPackets {
 | 
					namespace WorldPackets {
 | 
				
			||||||
	void SendLoadStaticZone(const SystemAddress& sysAddr, float x, float y, float z, uint32_t checksum, LWOZONEID zone);
 | 
						void SendLoadStaticZone(const SystemAddress& sysAddr, float x, float y, float z, uint32_t checksum, LWOZONEID zone);
 | 
				
			||||||
	void SendCharacterCreationResponse(const SystemAddress& sysAddr, eCharacterCreationResponse response);
 | 
						void SendCharacterCreationResponse(const SystemAddress& sysAddr, eCharacterCreationResponse response);
 | 
				
			||||||
@@ -21,6 +37,8 @@ namespace WorldPackets {
 | 
				
			|||||||
	void SendCreateCharacter(const SystemAddress& sysAddr, int64_t reputation, LWOOBJID player, const std::string& xmlData, const std::u16string& username, eGameMasterLevel gm);
 | 
						void SendCreateCharacter(const SystemAddress& sysAddr, int64_t reputation, LWOOBJID player, const std::string& xmlData, const std::u16string& username, eGameMasterLevel gm);
 | 
				
			||||||
	void SendChatModerationResponse(const SystemAddress& sysAddr, bool requestAccepted, uint32_t requestID, const std::string& receiver, std::vector<std::pair<uint8_t, uint8_t>> unacceptedItems);
 | 
						void SendChatModerationResponse(const SystemAddress& sysAddr, bool requestAccepted, uint32_t requestID, const std::string& receiver, std::vector<std::pair<uint8_t, uint8_t>> unacceptedItems);
 | 
				
			||||||
	void SendGMLevelChange(const SystemAddress& sysAddr, bool success, eGameMasterLevel highestLevel, eGameMasterLevel prevLevel, eGameMasterLevel newLevel);
 | 
						void SendGMLevelChange(const SystemAddress& sysAddr, bool success, eGameMasterLevel highestLevel, eGameMasterLevel prevLevel, eGameMasterLevel newLevel);
 | 
				
			||||||
 | 
						void SendDebugOuput(const SystemAddress& sysAddr, const std::string data);
 | 
				
			||||||
 | 
						void SendHTTPMonitorInfo(const SystemAddress& sysAddr, const HTTPMonitorInfo info);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // WORLDPACKETS_H
 | 
					#endif // WORLDPACKETS_H
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,6 +68,7 @@
 | 
				
			|||||||
#include "eConnectionType.h"
 | 
					#include "eConnectionType.h"
 | 
				
			||||||
#include "eServerMessageType.h"
 | 
					#include "eServerMessageType.h"
 | 
				
			||||||
#include "eChatInternalMessageType.h"
 | 
					#include "eChatInternalMessageType.h"
 | 
				
			||||||
 | 
					#include "eChatMessageType.h"
 | 
				
			||||||
#include "eWorldMessageType.h"
 | 
					#include "eWorldMessageType.h"
 | 
				
			||||||
#include "eMasterMessageType.h"
 | 
					#include "eMasterMessageType.h"
 | 
				
			||||||
#include "eGameMessageType.h"
 | 
					#include "eGameMessageType.h"
 | 
				
			||||||
@@ -545,27 +546,6 @@ void HandlePacketChat(Packet* packet) {
 | 
				
			|||||||
	if (packet->data[0] == ID_USER_PACKET_ENUM) {
 | 
						if (packet->data[0] == ID_USER_PACKET_ENUM) {
 | 
				
			||||||
		if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT_INTERNAL) {
 | 
							if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT_INTERNAL) {
 | 
				
			||||||
			switch (static_cast<eChatInternalMessageType>(packet->data[3])) {
 | 
								switch (static_cast<eChatInternalMessageType>(packet->data[3])) {
 | 
				
			||||||
			case eChatInternalMessageType::ROUTE_TO_PLAYER: {
 | 
					 | 
				
			||||||
				CINSTREAM_SKIP_HEADER;
 | 
					 | 
				
			||||||
				LWOOBJID playerID;
 | 
					 | 
				
			||||||
				inStream.Read(playerID);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				auto player = Game::entityManager->GetEntity(playerID);
 | 
					 | 
				
			||||||
				if (!player) return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				auto sysAddr = player->GetSystemAddress();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				//Write our stream outwards:
 | 
					 | 
				
			||||||
				CBITSTREAM;
 | 
					 | 
				
			||||||
				for (BitSize_t i = 0; i < inStream.GetNumberOfBytesUsed(); i++) {
 | 
					 | 
				
			||||||
					bitStream.Write(packet->data[i + 16]); //16 bytes == header + playerID to skip
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				SEND_PACKET; //send routed packet to player
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			case eChatInternalMessageType::ANNOUNCEMENT: {
 | 
								case eChatInternalMessageType::ANNOUNCEMENT: {
 | 
				
			||||||
				CINSTREAM_SKIP_HEADER;
 | 
									CINSTREAM_SKIP_HEADER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -655,6 +635,30 @@ void HandlePacketChat(Packet* packet) {
 | 
				
			|||||||
			default:
 | 
								default:
 | 
				
			||||||
				LOG("Received an unknown chat internal: %i", int(packet->data[3]));
 | 
									LOG("Received an unknown chat internal: %i", int(packet->data[3]));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							} else if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT) {
 | 
				
			||||||
 | 
								switch (static_cast<eChatMessageType>(packet->data[3])) {
 | 
				
			||||||
 | 
									case eChatMessageType::WORLD_ROUTE_PACKET: {
 | 
				
			||||||
 | 
										CINSTREAM_SKIP_HEADER;
 | 
				
			||||||
 | 
										LWOOBJID playerID;
 | 
				
			||||||
 | 
										inStream.Read(playerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										auto player = Game::entityManager->GetEntity(playerID);
 | 
				
			||||||
 | 
										if (!player) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										auto sysAddr = player->GetSystemAddress();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										//Write our stream outwards:
 | 
				
			||||||
 | 
										CBITSTREAM;
 | 
				
			||||||
 | 
										for (BitSize_t i = 0; i < inStream.GetNumberOfBytesUsed(); i++) {
 | 
				
			||||||
 | 
											bitStream.Write(packet->data[i + 16]); //16 bytes == header + playerID to skip
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										SEND_PACKET; //send routed packet to player
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									default:
 | 
				
			||||||
 | 
										LOG("Received an unknown chat message type: %i", int(packet->data[3]));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,7 @@
 | 
				
			|||||||
|gminvis|`/gminvis`|Toggles invisibility for the character, though it's currently a bit buggy. Requires nonzero GM Level for the character, but the account must have a GM level of 8.|8|
 | 
					|gminvis|`/gminvis`|Toggles invisibility for the character, though it's currently a bit buggy. Requires nonzero GM Level for the character, but the account must have a GM level of 8.|8|
 | 
				
			||||||
|setname|`/setname <name>`|Sets a temporary name for your player. The name resets when you log out.|8|
 | 
					|setname|`/setname <name>`|Sets a temporary name for your player. The name resets when you log out.|8|
 | 
				
			||||||
|title|`/title <title>`|Temporarily appends your player's name with " - <title>". This resets when you log out.|8|
 | 
					|title|`/title <title>`|Temporarily appends your player's name with " - <title>". This resets when you log out.|8|
 | 
				
			||||||
 | 
					|whowhere|`/whowhere <playerName> (ShowZoneData) (ListIndividualPlayers)`| Find the world server a player is conneceted to if they are online. If specifying `all` for the playername, it will display all players connected to the servers. ShowZoneData and ListIndividual players defualt to "1". Set ShowZoneData to "0" to just get a list of player. Set ListIndividualPlayers to "0" to just get summary of zone populations. Set both to zero to just get the total connected players. |2|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Server Operation Commands
 | 
					## Server Operation Commands
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user