mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-21 21:17:25 +00:00
Merge branch 'main' into MSVCCompilerFlags
This commit is contained in:
commit
7812f27330
@ -74,6 +74,7 @@ if(UNIX)
|
|||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -fPIC")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -fPIC")
|
||||||
elseif(MSVC)
|
elseif(MSVC)
|
||||||
# Skip warning for invalid conversion from size_t to uint32_t for all targets below for now
|
# Skip warning for invalid conversion from size_t to uint32_t for all targets below for now
|
||||||
|
# Also disable non-portable MSVC volatile behavior
|
||||||
add_compile_options("/wd4267" "/utf-8" "/volatile:iso")
|
add_compile_options("/wd4267" "/utf-8" "/volatile:iso")
|
||||||
elseif(WIN32)
|
elseif(WIN32)
|
||||||
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
|
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
|
||||||
@ -104,7 +105,7 @@ make_directory(${CMAKE_BINARY_DIR}/resServer)
|
|||||||
make_directory(${CMAKE_BINARY_DIR}/logs)
|
make_directory(${CMAKE_BINARY_DIR}/logs)
|
||||||
|
|
||||||
# Copy resource files on first build
|
# Copy resource files on first build
|
||||||
set(RESOURCE_FILES "sharedconfig.ini" "authconfig.ini" "chatconfig.ini" "worldconfig.ini" "masterconfig.ini" "blacklist.dcf")
|
set(RESOURCE_FILES "sharedconfig.ini" "authconfig.ini" "chatconfig.ini" "worldconfig.ini" "masterconfig.ini" "blocklist.dcf")
|
||||||
message(STATUS "Checking resource file integrity")
|
message(STATUS "Checking resource file integrity")
|
||||||
|
|
||||||
include(Utils)
|
include(Utils)
|
||||||
|
@ -27,8 +27,8 @@ dChatFilter::dChatFilter(const std::string& filepath, bool dontGenerateDCF) {
|
|||||||
ExportWordlistToDCF(filepath + ".dcf", true);
|
ExportWordlistToDCF(filepath + ".dcf", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BinaryIO::DoesFileExist("blacklist.dcf")) {
|
if (BinaryIO::DoesFileExist("blocklist.dcf")) {
|
||||||
ReadWordlistDCF("blacklist.dcf", false);
|
ReadWordlistDCF("blocklist.dcf", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Read player names that are ok as well:
|
//Read player names that are ok as well:
|
||||||
@ -44,20 +44,20 @@ dChatFilter::~dChatFilter() {
|
|||||||
m_DeniedWords.clear();
|
m_DeniedWords.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void dChatFilter::ReadWordlistPlaintext(const std::string& filepath, bool whiteList) {
|
void dChatFilter::ReadWordlistPlaintext(const std::string& filepath, bool allowList) {
|
||||||
std::ifstream file(filepath);
|
std::ifstream file(filepath);
|
||||||
if (file) {
|
if (file) {
|
||||||
std::string line;
|
std::string line;
|
||||||
while (std::getline(file, line)) {
|
while (std::getline(file, line)) {
|
||||||
line.erase(std::remove(line.begin(), line.end(), '\r'), line.end());
|
line.erase(std::remove(line.begin(), line.end(), '\r'), line.end());
|
||||||
std::transform(line.begin(), line.end(), line.begin(), ::tolower); //Transform to lowercase
|
std::transform(line.begin(), line.end(), line.begin(), ::tolower); //Transform to lowercase
|
||||||
if (whiteList) m_ApprovedWords.push_back(CalculateHash(line));
|
if (allowList) m_ApprovedWords.push_back(CalculateHash(line));
|
||||||
else m_DeniedWords.push_back(CalculateHash(line));
|
else m_DeniedWords.push_back(CalculateHash(line));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dChatFilter::ReadWordlistDCF(const std::string& filepath, bool whiteList) {
|
bool dChatFilter::ReadWordlistDCF(const std::string& filepath, bool allowList) {
|
||||||
std::ifstream file(filepath, std::ios::binary);
|
std::ifstream file(filepath, std::ios::binary);
|
||||||
if (file) {
|
if (file) {
|
||||||
fileHeader hdr;
|
fileHeader hdr;
|
||||||
@ -70,13 +70,13 @@ bool dChatFilter::ReadWordlistDCF(const std::string& filepath, bool whiteList) {
|
|||||||
if (hdr.formatVersion == formatVersion) {
|
if (hdr.formatVersion == formatVersion) {
|
||||||
size_t wordsToRead = 0;
|
size_t wordsToRead = 0;
|
||||||
BinaryIO::BinaryRead(file, wordsToRead);
|
BinaryIO::BinaryRead(file, wordsToRead);
|
||||||
if (whiteList) m_ApprovedWords.reserve(wordsToRead);
|
if (allowList) m_ApprovedWords.reserve(wordsToRead);
|
||||||
else m_DeniedWords.reserve(wordsToRead);
|
else m_DeniedWords.reserve(wordsToRead);
|
||||||
|
|
||||||
size_t word = 0;
|
size_t word = 0;
|
||||||
for (size_t i = 0; i < wordsToRead; ++i) {
|
for (size_t i = 0; i < wordsToRead; ++i) {
|
||||||
BinaryIO::BinaryRead(file, word);
|
BinaryIO::BinaryRead(file, word);
|
||||||
if (whiteList) m_ApprovedWords.push_back(word);
|
if (allowList) m_ApprovedWords.push_back(word);
|
||||||
else m_DeniedWords.push_back(word);
|
else m_DeniedWords.push_back(word);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,14 +90,14 @@ bool dChatFilter::ReadWordlistDCF(const std::string& filepath, bool whiteList) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dChatFilter::ExportWordlistToDCF(const std::string& filepath, bool whiteList) {
|
void dChatFilter::ExportWordlistToDCF(const std::string& filepath, bool allowList) {
|
||||||
std::ofstream file(filepath, std::ios::binary | std::ios_base::out);
|
std::ofstream file(filepath, std::ios::binary | std::ios_base::out);
|
||||||
if (file) {
|
if (file) {
|
||||||
BinaryIO::BinaryWrite(file, uint32_t(dChatFilterDCF::header));
|
BinaryIO::BinaryWrite(file, uint32_t(dChatFilterDCF::header));
|
||||||
BinaryIO::BinaryWrite(file, uint32_t(dChatFilterDCF::formatVersion));
|
BinaryIO::BinaryWrite(file, uint32_t(dChatFilterDCF::formatVersion));
|
||||||
BinaryIO::BinaryWrite(file, size_t(whiteList ? m_ApprovedWords.size() : m_DeniedWords.size()));
|
BinaryIO::BinaryWrite(file, size_t(allowList ? m_ApprovedWords.size() : m_DeniedWords.size()));
|
||||||
|
|
||||||
for (size_t word : whiteList ? m_ApprovedWords : m_DeniedWords) {
|
for (size_t word : allowList ? m_ApprovedWords : m_DeniedWords) {
|
||||||
BinaryIO::BinaryWrite(file, word);
|
BinaryIO::BinaryWrite(file, word);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,10 +105,10 @@ void dChatFilter::ExportWordlistToDCF(const std::string& filepath, bool whiteLis
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::pair<uint8_t, uint8_t>> dChatFilter::IsSentenceOkay(const std::string& message, eGameMasterLevel gmLevel, bool whiteList) {
|
std::vector<std::pair<uint8_t, uint8_t>> dChatFilter::IsSentenceOkay(const std::string& message, eGameMasterLevel gmLevel, bool allowList) {
|
||||||
if (gmLevel > eGameMasterLevel::FORUM_MODERATOR) return { }; //If anything but a forum mod, return true.
|
if (gmLevel > eGameMasterLevel::FORUM_MODERATOR) return { }; //If anything but a forum mod, return true.
|
||||||
if (message.empty()) return { };
|
if (message.empty()) return { };
|
||||||
if (!whiteList && m_DeniedWords.empty()) return { { 0, message.length() } };
|
if (!allowList && m_DeniedWords.empty()) return { { 0, message.length() } };
|
||||||
|
|
||||||
std::stringstream sMessage(message);
|
std::stringstream sMessage(message);
|
||||||
std::string segment;
|
std::string segment;
|
||||||
@ -126,16 +126,16 @@ std::vector<std::pair<uint8_t, uint8_t>> dChatFilter::IsSentenceOkay(const std::
|
|||||||
|
|
||||||
size_t hash = CalculateHash(segment);
|
size_t hash = CalculateHash(segment);
|
||||||
|
|
||||||
if (std::find(m_UserUnapprovedWordCache.begin(), m_UserUnapprovedWordCache.end(), hash) != m_UserUnapprovedWordCache.end() && whiteList) {
|
if (std::find(m_UserUnapprovedWordCache.begin(), m_UserUnapprovedWordCache.end(), hash) != m_UserUnapprovedWordCache.end() && allowList) {
|
||||||
listOfBadSegments.emplace_back(position, originalSegment.length());
|
listOfBadSegments.emplace_back(position, originalSegment.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (std::find(m_ApprovedWords.begin(), m_ApprovedWords.end(), hash) == m_ApprovedWords.end() && whiteList) {
|
if (std::find(m_ApprovedWords.begin(), m_ApprovedWords.end(), hash) == m_ApprovedWords.end() && allowList) {
|
||||||
m_UserUnapprovedWordCache.push_back(hash);
|
m_UserUnapprovedWordCache.push_back(hash);
|
||||||
listOfBadSegments.emplace_back(position, originalSegment.length());
|
listOfBadSegments.emplace_back(position, originalSegment.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (std::find(m_DeniedWords.begin(), m_DeniedWords.end(), hash) != m_DeniedWords.end() && !whiteList) {
|
if (std::find(m_DeniedWords.begin(), m_DeniedWords.end(), hash) != m_DeniedWords.end() && !allowList) {
|
||||||
m_UserUnapprovedWordCache.push_back(hash);
|
m_UserUnapprovedWordCache.push_back(hash);
|
||||||
listOfBadSegments.emplace_back(position, originalSegment.length());
|
listOfBadSegments.emplace_back(position, originalSegment.length());
|
||||||
}
|
}
|
||||||
|
@ -21,10 +21,10 @@ public:
|
|||||||
dChatFilter(const std::string& filepath, bool dontGenerateDCF);
|
dChatFilter(const std::string& filepath, bool dontGenerateDCF);
|
||||||
~dChatFilter();
|
~dChatFilter();
|
||||||
|
|
||||||
void ReadWordlistPlaintext(const std::string& filepath, bool whiteList);
|
void ReadWordlistPlaintext(const std::string& filepath, bool allowList);
|
||||||
bool ReadWordlistDCF(const std::string& filepath, bool whiteList);
|
bool ReadWordlistDCF(const std::string& filepath, bool allowList);
|
||||||
void ExportWordlistToDCF(const std::string& filepath, bool whiteList);
|
void ExportWordlistToDCF(const std::string& filepath, bool allowList);
|
||||||
std::vector<std::pair<uint8_t, uint8_t>> IsSentenceOkay(const std::string& message, eGameMasterLevel gmLevel, bool whiteList = true);
|
std::vector<std::pair<uint8_t, uint8_t>> IsSentenceOkay(const std::string& message, eGameMasterLevel gmLevel, bool allowList = true);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_DontGenerateDCF;
|
bool m_DontGenerateDCF;
|
||||||
|
@ -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:
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include "eObjectBits.h"
|
#include "eObjectBits.h"
|
||||||
#include "eConnectionType.h"
|
#include "eConnectionType.h"
|
||||||
#include "eChatMessageType.h"
|
#include "eChatMessageType.h"
|
||||||
#include "eChatInternalMessageType.h"
|
|
||||||
#include "eClientMessageType.h"
|
#include "eClientMessageType.h"
|
||||||
#include "eGameMessageType.h"
|
#include "eGameMessageType.h"
|
||||||
#include "StringifiedEnum.h"
|
#include "StringifiedEnum.h"
|
||||||
@ -60,7 +59,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:
|
||||||
@ -454,7 +453,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 +695,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 +710,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 +737,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 +762,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 +779,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 +808,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 +834,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 +868,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 +905,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 +919,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 +942,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:
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
#include "PlayerContainer.h"
|
#include "PlayerContainer.h"
|
||||||
#include "ChatPacketHandler.h"
|
#include "ChatPacketHandler.h"
|
||||||
#include "eChatMessageType.h"
|
#include "eChatMessageType.h"
|
||||||
#include "eChatInternalMessageType.h"
|
|
||||||
#include "eWorldMessageType.h"
|
#include "eWorldMessageType.h"
|
||||||
#include "ChatIgnoreList.h"
|
#include "ChatIgnoreList.h"
|
||||||
#include "StringifiedEnum.h"
|
#include "StringifiedEnum.h"
|
||||||
@ -182,47 +181,29 @@ int main(int argc, char** argv) {
|
|||||||
void HandlePacket(Packet* packet) {
|
void HandlePacket(Packet* packet) {
|
||||||
if (packet->data[0] == ID_DISCONNECTION_NOTIFICATION || packet->data[0] == ID_CONNECTION_LOST) {
|
if (packet->data[0] == ID_DISCONNECTION_NOTIFICATION || packet->data[0] == ID_CONNECTION_LOST) {
|
||||||
LOG("A server has disconnected, erasing their connected players from the list.");
|
LOG("A server has disconnected, erasing their connected players from the list.");
|
||||||
}
|
} else if (packet->data[0] == ID_NEW_INCOMING_CONNECTION) {
|
||||||
|
|
||||||
if (packet->data[0] == ID_NEW_INCOMING_CONNECTION) {
|
|
||||||
LOG("A server is connecting, awaiting user list.");
|
LOG("A server is connecting, awaiting user list.");
|
||||||
}
|
} else if (packet->length < 4 || packet->data[0] != ID_USER_PACKET_ENUM) return; // Nothing left to process or not the right packet type
|
||||||
|
|
||||||
if (packet->length < 4) return; // Nothing left to process. Need 4 bytes to continue.
|
CINSTREAM;
|
||||||
|
inStream.SetReadOffset(BYTES_TO_BITS(1));
|
||||||
|
|
||||||
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT_INTERNAL) {
|
eConnectionType connection;
|
||||||
switch (static_cast<eChatInternalMessageType>(packet->data[3])) {
|
eChatMessageType chatMessageID;
|
||||||
case eChatInternalMessageType::PLAYER_ADDED_NOTIFICATION:
|
|
||||||
Game::playerContainer.InsertPlayer(packet);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION:
|
inStream.Read(connection);
|
||||||
Game::playerContainer.RemovePlayer(packet);
|
if (connection != eConnectionType::CHAT) return;
|
||||||
break;
|
inStream.Read(chatMessageID);
|
||||||
|
|
||||||
case eChatInternalMessageType::MUTE_UPDATE:
|
switch (chatMessageID) {
|
||||||
|
case eChatMessageType::GM_MUTE:
|
||||||
Game::playerContainer.MuteUpdate(packet);
|
Game::playerContainer.MuteUpdate(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case eChatInternalMessageType::CREATE_TEAM:
|
case eChatMessageType::CREATE_TEAM:
|
||||||
Game::playerContainer.CreateTeamServer(packet);
|
Game::playerContainer.CreateTeamServer(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case eChatInternalMessageType::ANNOUNCEMENT: {
|
|
||||||
//we just forward this packet to every connected server
|
|
||||||
CINSTREAM;
|
|
||||||
Game::server->Send(inStream, packet->systemAddress, true); //send to everyone except origin
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
LOG("Unknown CHAT_INTERNAL id: %i", int(packet->data[3]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT) {
|
|
||||||
eChatMessageType chat_message_type = static_cast<eChatMessageType>(packet->data[3]);
|
|
||||||
switch (chat_message_type) {
|
|
||||||
case eChatMessageType::GET_FRIENDS_LIST:
|
case eChatMessageType::GET_FRIENDS_LIST:
|
||||||
ChatPacketHandler::HandleFriendlistRequest(packet);
|
ChatPacketHandler::HandleFriendlistRequest(packet);
|
||||||
break;
|
break;
|
||||||
@ -296,6 +277,19 @@ void HandlePacket(Packet* packet) {
|
|||||||
ChatPacketHandler::HandleGMLevelUpdate(packet);
|
ChatPacketHandler::HandleGMLevelUpdate(packet);
|
||||||
break;
|
break;
|
||||||
case eChatMessageType::LOGIN_SESSION_NOTIFY:
|
case eChatMessageType::LOGIN_SESSION_NOTIFY:
|
||||||
|
Game::playerContainer.InsertPlayer(packet);
|
||||||
|
break;
|
||||||
|
case eChatMessageType::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 eChatMessageType::UNEXPECTED_DISCONNECT:
|
||||||
|
Game::playerContainer.RemovePlayer(packet);
|
||||||
|
break;
|
||||||
|
case eChatMessageType::WHO:
|
||||||
|
case eChatMessageType::SHOW_ALL:
|
||||||
case eChatMessageType::USER_CHANNEL_CHAT_MESSAGE:
|
case eChatMessageType::USER_CHANNEL_CHAT_MESSAGE:
|
||||||
case eChatMessageType::WORLD_DISCONNECT_REQUEST:
|
case eChatMessageType::WORLD_DISCONNECT_REQUEST:
|
||||||
case eChatMessageType::WORLD_PROXIMITY_RESPONSE:
|
case eChatMessageType::WORLD_PROXIMITY_RESPONSE:
|
||||||
@ -308,7 +302,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:
|
||||||
@ -323,7 +316,6 @@ void HandlePacket(Packet* packet) {
|
|||||||
case eChatMessageType::CSR_REQUEST:
|
case eChatMessageType::CSR_REQUEST:
|
||||||
case eChatMessageType::CSR_REPLY:
|
case eChatMessageType::CSR_REPLY:
|
||||||
case eChatMessageType::GM_KICK:
|
case eChatMessageType::GM_KICK:
|
||||||
case eChatMessageType::GM_ANNOUNCE:
|
|
||||||
case eChatMessageType::WORLD_ROUTE_PACKET:
|
case eChatMessageType::WORLD_ROUTE_PACKET:
|
||||||
case eChatMessageType::GET_ZONE_POPULATIONS:
|
case eChatMessageType::GET_ZONE_POPULATIONS:
|
||||||
case eChatMessageType::REQUEST_MINIMUM_CHAT_MODE:
|
case eChatMessageType::REQUEST_MINIMUM_CHAT_MODE:
|
||||||
@ -332,33 +324,18 @@ 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:
|
||||||
case eChatMessageType::UNEXPECTED_DISCONNECT:
|
|
||||||
case eChatMessageType::PLAYER_READY:
|
case eChatMessageType::PLAYER_READY:
|
||||||
case eChatMessageType::GET_DONATION_TOTAL:
|
case eChatMessageType::GET_DONATION_TOTAL:
|
||||||
case eChatMessageType::UPDATE_DONATION:
|
case eChatMessageType::UPDATE_DONATION:
|
||||||
case eChatMessageType::PRG_CSR_COMMAND:
|
case eChatMessageType::PRG_CSR_COMMAND:
|
||||||
case eChatMessageType::HEARTBEAT_REQUEST_FROM_WORLD:
|
case eChatMessageType::HEARTBEAT_REQUEST_FROM_WORLD:
|
||||||
case eChatMessageType::UPDATE_FREE_TRIAL_STATUS:
|
case eChatMessageType::UPDATE_FREE_TRIAL_STATUS:
|
||||||
LOG("Unhandled CHAT Message id: %s (%i)", StringifiedEnum::ToString(chat_message_type).data(), chat_message_type);
|
LOG("Unhandled CHAT Message id: %s (%i)", StringifiedEnum::ToString(chatMessageID).data(), chatMessageID);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG("Unknown CHAT Message id: %i", chat_message_type);
|
LOG("Unknown CHAT Message id: %i", chatMessageID);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::WORLD) {
|
|
||||||
switch (static_cast<eWorldMessageType>(packet->data[3])) {
|
|
||||||
case eWorldMessageType::ROUTE_PACKET: {
|
|
||||||
LOG("Routing packet from world");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
LOG("Unknown World id: %i", int(packet->data[3]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,9 +9,9 @@
|
|||||||
#include "BitStreamUtils.h"
|
#include "BitStreamUtils.h"
|
||||||
#include "Database.h"
|
#include "Database.h"
|
||||||
#include "eConnectionType.h"
|
#include "eConnectionType.h"
|
||||||
#include "eChatInternalMessageType.h"
|
|
||||||
#include "ChatPackets.h"
|
#include "ChatPackets.h"
|
||||||
#include "dConfig.h"
|
#include "dConfig.h"
|
||||||
|
#include "eChatMessageType.h"
|
||||||
|
|
||||||
void PlayerContainer::Initialize() {
|
void PlayerContainer::Initialize() {
|
||||||
m_MaxNumberOfBestFriends =
|
m_MaxNumberOfBestFriends =
|
||||||
@ -145,7 +145,7 @@ void PlayerContainer::CreateTeamServer(Packet* packet) {
|
|||||||
|
|
||||||
void PlayerContainer::BroadcastMuteUpdate(LWOOBJID player, time_t time) {
|
void PlayerContainer::BroadcastMuteUpdate(LWOOBJID player, time_t time) {
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::MUTE_UPDATE);
|
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::GM_MUTE);
|
||||||
|
|
||||||
bitStream.Write(player);
|
bitStream.Write(player);
|
||||||
bitStream.Write(time);
|
bitStream.Write(time);
|
||||||
@ -352,7 +352,7 @@ void PlayerContainer::TeamStatusUpdate(TeamData* team) {
|
|||||||
|
|
||||||
void PlayerContainer::UpdateTeamsOnWorld(TeamData* team, bool deleteTeam) {
|
void PlayerContainer::UpdateTeamsOnWorld(TeamData* team, bool deleteTeam) {
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::TEAM_UPDATE);
|
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::TEAM_GET_STATUS);
|
||||||
|
|
||||||
bitStream.Write(team->teamID);
|
bitStream.Write(team->teamID);
|
||||||
bitStream.Write(deleteTeam);
|
bitStream.Write(deleteTeam);
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
#ifndef __ECHATINTERNALMESSAGETYPE__H__
|
|
||||||
#define __ECHATINTERNALMESSAGETYPE__H__
|
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
|
|
||||||
enum eChatInternalMessageType : uint32_t {
|
|
||||||
PLAYER_ADDED_NOTIFICATION = 0,
|
|
||||||
PLAYER_REMOVED_NOTIFICATION,
|
|
||||||
ADD_FRIEND,
|
|
||||||
ADD_BEST_FRIEND,
|
|
||||||
ADD_TO_TEAM,
|
|
||||||
ADD_BLOCK,
|
|
||||||
REMOVE_FRIEND,
|
|
||||||
REMOVE_BLOCK,
|
|
||||||
REMOVE_FROM_TEAM,
|
|
||||||
DELETE_TEAM,
|
|
||||||
REPORT,
|
|
||||||
PRIVATE_CHAT,
|
|
||||||
PRIVATE_CHAT_RESPONSE,
|
|
||||||
ANNOUNCEMENT,
|
|
||||||
MAIL_COUNT_UPDATE,
|
|
||||||
MAIL_SEND_NOTIFY,
|
|
||||||
REQUEST_USER_LIST,
|
|
||||||
FRIEND_LIST,
|
|
||||||
ROUTE_TO_PLAYER,
|
|
||||||
TEAM_UPDATE,
|
|
||||||
MUTE_UPDATE,
|
|
||||||
CREATE_TEAM,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //!__ECHATINTERNALMESSAGETYPE__H__
|
|
@ -72,7 +72,9 @@ enum class eChatMessageType :uint32_t {
|
|||||||
UPDATE_DONATION,
|
UPDATE_DONATION,
|
||||||
PRG_CSR_COMMAND,
|
PRG_CSR_COMMAND,
|
||||||
HEARTBEAT_REQUEST_FROM_WORLD,
|
HEARTBEAT_REQUEST_FROM_WORLD,
|
||||||
UPDATE_FREE_TRIAL_STATUS
|
UPDATE_FREE_TRIAL_STATUS,
|
||||||
|
// CUSTOM DLU MESSAGE ID FOR INTERNAL USE
|
||||||
|
CREATE_TEAM,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //!__ECHATMESSAGETYPE__H__
|
#endif //!__ECHATMESSAGETYPE__H__
|
||||||
|
@ -5,8 +5,7 @@ enum class eConnectionType : uint16_t {
|
|||||||
SERVER = 0,
|
SERVER = 0,
|
||||||
AUTH,
|
AUTH,
|
||||||
CHAT,
|
CHAT,
|
||||||
CHAT_INTERNAL,
|
WORLD = 4,
|
||||||
WORLD,
|
|
||||||
CLIENT,
|
CLIENT,
|
||||||
MASTER
|
MASTER
|
||||||
};
|
};
|
||||||
|
@ -29,8 +29,8 @@ enum class eWorldMessageType : uint32_t {
|
|||||||
ROUTE_PACKET, // Social?
|
ROUTE_PACKET, // Social?
|
||||||
POSITION_UPDATE,
|
POSITION_UPDATE,
|
||||||
MAIL,
|
MAIL,
|
||||||
WORD_CHECK, // Whitelist word check
|
WORD_CHECK, // AllowList word check
|
||||||
STRING_CHECK, // Whitelist string check
|
STRING_CHECK, // AllowList string check
|
||||||
GET_PLAYERS_IN_ZONE,
|
GET_PLAYERS_IN_ZONE,
|
||||||
REQUEST_UGC_MANIFEST_INFO,
|
REQUEST_UGC_MANIFEST_INFO,
|
||||||
BLUEPRINT_GET_ALL_DATA_REQUEST,
|
BLUEPRINT_GET_ALL_DATA_REQUEST,
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include "eCharacterCreationResponse.h"
|
#include "eCharacterCreationResponse.h"
|
||||||
#include "eRenameResponse.h"
|
#include "eRenameResponse.h"
|
||||||
#include "eConnectionType.h"
|
#include "eConnectionType.h"
|
||||||
#include "eChatInternalMessageType.h"
|
#include "eChatMessageType.h"
|
||||||
#include "BitStreamUtils.h"
|
#include "BitStreamUtils.h"
|
||||||
#include "CheatDetection.h"
|
#include "CheatDetection.h"
|
||||||
|
|
||||||
@ -83,7 +83,7 @@ void UserManager::Initialize() {
|
|||||||
auto chatListStream = Game::assetManager->GetFile("chatplus_en_us.txt");
|
auto chatListStream = Game::assetManager->GetFile("chatplus_en_us.txt");
|
||||||
if (!chatListStream) {
|
if (!chatListStream) {
|
||||||
LOG("Failed to load %s", (Game::assetManager->GetResPath() / "chatplus_en_us.txt").string().c_str());
|
LOG("Failed to load %s", (Game::assetManager->GetResPath() / "chatplus_en_us.txt").string().c_str());
|
||||||
throw std::runtime_error("Aborting initialization due to missing chat whitelist file.");
|
throw std::runtime_error("Aborting initialization due to missing chat allowlist file.");
|
||||||
}
|
}
|
||||||
|
|
||||||
while (std::getline(chatListStream, line, '\n')) {
|
while (std::getline(chatListStream, line, '\n')) {
|
||||||
@ -422,7 +422,7 @@ void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
Database::Get()->DeleteCharacter(charID);
|
Database::Get()->DeleteCharacter(charID);
|
||||||
|
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION);
|
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::UNEXPECTED_DISCONNECT);
|
||||||
bitStream.Write(objectID);
|
bitStream.Write(objectID);
|
||||||
Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
|
Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include "eMissionTaskType.h"
|
#include "eMissionTaskType.h"
|
||||||
#include "eMatchUpdate.h"
|
#include "eMatchUpdate.h"
|
||||||
#include "eConnectionType.h"
|
#include "eConnectionType.h"
|
||||||
#include "eChatInternalMessageType.h"
|
#include "eChatMessageType.h"
|
||||||
|
|
||||||
#include "CDCurrencyTableTable.h"
|
#include "CDCurrencyTableTable.h"
|
||||||
#include "CDActivityRewardsTable.h"
|
#include "CDActivityRewardsTable.h"
|
||||||
@ -501,7 +501,7 @@ void ActivityInstance::StartZone() {
|
|||||||
// only make a team if we have more than one participant
|
// only make a team if we have more than one participant
|
||||||
if (participants.size() > 1) {
|
if (participants.size() > 1) {
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::CREATE_TEAM);
|
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::CREATE_TEAM);
|
||||||
|
|
||||||
bitStream.Write(leader->GetObjectID());
|
bitStream.Write(leader->GetObjectID());
|
||||||
bitStream.Write(m_Participants.size());
|
bitStream.Write(m_Participants.size());
|
||||||
|
@ -150,13 +150,13 @@ void BaseCombatAIComponent::Update(const float deltaTime) {
|
|||||||
m_dpEntityEnemy->SetPosition(m_Parent->GetPosition());
|
m_dpEntityEnemy->SetPosition(m_Parent->GetPosition());
|
||||||
|
|
||||||
//Process enter events
|
//Process enter events
|
||||||
for (auto en : m_dpEntity->GetNewObjects()) {
|
for (const auto id : m_dpEntity->GetNewObjects()) {
|
||||||
m_Parent->OnCollisionPhantom(en->GetObjectID());
|
m_Parent->OnCollisionPhantom(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Process exit events
|
//Process exit events
|
||||||
for (auto en : m_dpEntity->GetRemovedObjects()) {
|
for (const auto id : m_dpEntity->GetRemovedObjects()) {
|
||||||
m_Parent->OnCollisionLeavePhantom(en->GetObjectID());
|
m_Parent->OnCollisionLeavePhantom(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we should stop the tether effect
|
// Check if we should stop the tether effect
|
||||||
|
@ -187,7 +187,7 @@ PhantomPhysicsComponent::PhantomPhysicsComponent(Entity* parent) : PhysicsCompon
|
|||||||
//add fallback cube:
|
//add fallback cube:
|
||||||
m_dpEntity = new dpEntity(m_Parent->GetObjectID(), 2.0f, 2.0f, 2.0f);
|
m_dpEntity = new dpEntity(m_Parent->GetObjectID(), 2.0f, 2.0f, 2.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_dpEntity->SetScale(m_Scale);
|
m_dpEntity->SetScale(m_Scale);
|
||||||
m_dpEntity->SetRotation(m_Rotation);
|
m_dpEntity->SetRotation(m_Rotation);
|
||||||
m_dpEntity->SetPosition(m_Position);
|
m_dpEntity->SetPosition(m_Position);
|
||||||
@ -323,14 +323,13 @@ void PhantomPhysicsComponent::Update(float deltaTime) {
|
|||||||
if (!m_dpEntity) return;
|
if (!m_dpEntity) return;
|
||||||
|
|
||||||
//Process enter events
|
//Process enter events
|
||||||
for (auto en : m_dpEntity->GetNewObjects()) {
|
for (const auto id : m_dpEntity->GetNewObjects()) {
|
||||||
if (!en) continue;
|
ApplyCollisionEffect(id, m_EffectType, m_DirectionalMultiplier);
|
||||||
ApplyCollisionEffect(en->GetObjectID(), m_EffectType, m_DirectionalMultiplier);
|
m_Parent->OnCollisionPhantom(id);
|
||||||
m_Parent->OnCollisionPhantom(en->GetObjectID());
|
|
||||||
|
|
||||||
//If we are a respawn volume, inform the client:
|
//If we are a respawn volume, inform the client:
|
||||||
if (m_IsRespawnVolume) {
|
if (m_IsRespawnVolume) {
|
||||||
auto entity = Game::entityManager->GetEntity(en->GetObjectID());
|
auto* const entity = Game::entityManager->GetEntity(id);
|
||||||
|
|
||||||
if (entity) {
|
if (entity) {
|
||||||
GameMessages::SendPlayerReachedRespawnCheckpoint(entity, m_RespawnPos, m_RespawnRot);
|
GameMessages::SendPlayerReachedRespawnCheckpoint(entity, m_RespawnPos, m_RespawnRot);
|
||||||
@ -341,10 +340,9 @@ void PhantomPhysicsComponent::Update(float deltaTime) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Process exit events
|
//Process exit events
|
||||||
for (auto en : m_dpEntity->GetRemovedObjects()) {
|
for (const auto id : m_dpEntity->GetRemovedObjects()) {
|
||||||
if (!en) continue;
|
ApplyCollisionEffect(id, m_EffectType, 1.0f);
|
||||||
ApplyCollisionEffect(en->GetObjectID(), m_EffectType, 1.0f);
|
m_Parent->OnCollisionLeavePhantom(id);
|
||||||
m_Parent->OnCollisionLeavePhantom(en->GetObjectID());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,16 +352,11 @@ void PropertyManagementComponent::UpdateModelPosition(const LWOOBJID id, const N
|
|||||||
|
|
||||||
auto* spawner = Game::zoneManager->GetSpawner(spawnerId);
|
auto* spawner = Game::zoneManager->GetSpawner(spawnerId);
|
||||||
|
|
||||||
auto ldfModelBehavior = new LDFData<LWOOBJID>(u"modelBehaviors", 0);
|
info.nodes[0]->config.push_back(new LDFData<LWOOBJID>(u"modelBehaviors", 0));
|
||||||
auto userModelID = new LDFData<LWOOBJID>(u"userModelID", info.spawnerID);
|
info.nodes[0]->config.push_back(new LDFData<LWOOBJID>(u"userModelID", info.spawnerID));
|
||||||
auto modelType = new LDFData<int>(u"modelType", 2);
|
info.nodes[0]->config.push_back(new LDFData<int>(u"modelType", 2));
|
||||||
auto propertyObjectID = new LDFData<bool>(u"propertyObjectID", true);
|
info.nodes[0]->config.push_back(new LDFData<bool>(u"propertyObjectID", true));
|
||||||
auto componentWhitelist = new LDFData<int>(u"componentWhitelist", 1);
|
info.nodes[0]->config.push_back(new LDFData<int>(u"componentWhitelist", 1));
|
||||||
info.nodes[0]->config.push_back(componentWhitelist);
|
|
||||||
info.nodes[0]->config.push_back(ldfModelBehavior);
|
|
||||||
info.nodes[0]->config.push_back(modelType);
|
|
||||||
info.nodes[0]->config.push_back(propertyObjectID);
|
|
||||||
info.nodes[0]->config.push_back(userModelID);
|
|
||||||
|
|
||||||
auto* model = spawner->Spawn();
|
auto* model = spawner->Spawn();
|
||||||
|
|
||||||
@ -585,29 +580,17 @@ void PropertyManagementComponent::Load() {
|
|||||||
GeneralUtils::SetBit(blueprintID, eObjectBits::CHARACTER);
|
GeneralUtils::SetBit(blueprintID, eObjectBits::CHARACTER);
|
||||||
GeneralUtils::SetBit(blueprintID, eObjectBits::PERSISTENT);
|
GeneralUtils::SetBit(blueprintID, eObjectBits::PERSISTENT);
|
||||||
|
|
||||||
LDFBaseData* ldfBlueprintID = new LDFData<LWOOBJID>(u"blueprintid", blueprintID);
|
settings.push_back(new LDFData<LWOOBJID>(u"blueprintid", blueprintID));
|
||||||
LDFBaseData* componentWhitelist = new LDFData<int>(u"componentWhitelist", 1);
|
settings.push_back(new LDFData<int>(u"componentWhitelist", 1));
|
||||||
LDFBaseData* modelType = new LDFData<int>(u"modelType", 2);
|
settings.push_back(new LDFData<int>(u"modelType", 2));
|
||||||
LDFBaseData* propertyObjectID = new LDFData<bool>(u"propertyObjectID", true);
|
settings.push_back(new LDFData<bool>(u"propertyObjectID", true));
|
||||||
LDFBaseData* userModelID = new LDFData<LWOOBJID>(u"userModelID", databaseModel.id);
|
settings.push_back(new LDFData<LWOOBJID>(u"userModelID", databaseModel.id));
|
||||||
|
|
||||||
settings.push_back(ldfBlueprintID);
|
|
||||||
settings.push_back(componentWhitelist);
|
|
||||||
settings.push_back(modelType);
|
|
||||||
settings.push_back(propertyObjectID);
|
|
||||||
settings.push_back(userModelID);
|
|
||||||
} else {
|
} else {
|
||||||
auto modelType = new LDFData<int>(u"modelType", 2);
|
settings.push_back(new LDFData<int>(u"modelType", 2));
|
||||||
auto userModelID = new LDFData<LWOOBJID>(u"userModelID", databaseModel.id);
|
settings.push_back(new LDFData<LWOOBJID>(u"userModelID", databaseModel.id));
|
||||||
auto ldfModelBehavior = new LDFData<LWOOBJID>(u"modelBehaviors", 0);
|
settings.push_back(new LDFData<LWOOBJID>(u"modelBehaviors", 0));
|
||||||
auto propertyObjectID = new LDFData<bool>(u"propertyObjectID", true);
|
settings.push_back(new LDFData<bool>(u"propertyObjectID", true));
|
||||||
auto componentWhitelist = new LDFData<int>(u"componentWhitelist", 1);
|
settings.push_back(new LDFData<int>(u"componentWhitelist", 1));
|
||||||
|
|
||||||
settings.push_back(componentWhitelist);
|
|
||||||
settings.push_back(ldfModelBehavior);
|
|
||||||
settings.push_back(modelType);
|
|
||||||
settings.push_back(propertyObjectID);
|
|
||||||
settings.push_back(userModelID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
node->config = settings;
|
node->config = settings;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include "EntityManager.h"
|
#include "EntityManager.h"
|
||||||
#include "SimplePhysicsComponent.h"
|
#include "SimplePhysicsComponent.h"
|
||||||
|
|
||||||
const std::map<LWOOBJID, dpEntity*> ProximityMonitorComponent::m_EmptyObjectMap = {};
|
const std::unordered_set<LWOOBJID> ProximityMonitorComponent::m_EmptyObjectSet = {};
|
||||||
|
|
||||||
ProximityMonitorComponent::ProximityMonitorComponent(Entity* parent, int radiusSmall, int radiusLarge) : Component(parent) {
|
ProximityMonitorComponent::ProximityMonitorComponent(Entity* parent, int radiusSmall, int radiusLarge) : Component(parent) {
|
||||||
if (radiusSmall != -1 && radiusLarge != -1) {
|
if (radiusSmall != -1 && radiusLarge != -1) {
|
||||||
@ -38,26 +38,26 @@ void ProximityMonitorComponent::SetProximityRadius(dpEntity* entity, const std::
|
|||||||
m_ProximitiesData.insert(std::make_pair(name, entity));
|
m_ProximitiesData.insert(std::make_pair(name, entity));
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<LWOOBJID, dpEntity*>& ProximityMonitorComponent::GetProximityObjects(const std::string& name) {
|
const std::unordered_set<LWOOBJID>& ProximityMonitorComponent::GetProximityObjects(const std::string& name) {
|
||||||
const auto& iter = m_ProximitiesData.find(name);
|
const auto iter = m_ProximitiesData.find(name);
|
||||||
|
|
||||||
if (iter == m_ProximitiesData.end()) {
|
if (iter == m_ProximitiesData.cend()) {
|
||||||
return m_EmptyObjectMap;
|
return m_EmptyObjectSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
return iter->second->GetCurrentlyCollidingObjects();
|
return iter->second->GetCurrentlyCollidingObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ProximityMonitorComponent::IsInProximity(const std::string& name, LWOOBJID objectID) {
|
bool ProximityMonitorComponent::IsInProximity(const std::string& name, LWOOBJID objectID) {
|
||||||
const auto& iter = m_ProximitiesData.find(name);
|
const auto iter = m_ProximitiesData.find(name);
|
||||||
|
|
||||||
if (iter == m_ProximitiesData.end()) {
|
if (iter == m_ProximitiesData.cend()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& collitions = iter->second->GetCurrentlyCollidingObjects();
|
const auto& collisions = iter->second->GetCurrentlyCollidingObjects();
|
||||||
|
|
||||||
return collitions.find(objectID) != collitions.end();
|
return collisions.contains(objectID);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProximityMonitorComponent::Update(float deltaTime) {
|
void ProximityMonitorComponent::Update(float deltaTime) {
|
||||||
@ -66,13 +66,13 @@ void ProximityMonitorComponent::Update(float deltaTime) {
|
|||||||
|
|
||||||
prox.second->SetPosition(m_Parent->GetPosition());
|
prox.second->SetPosition(m_Parent->GetPosition());
|
||||||
//Process enter events
|
//Process enter events
|
||||||
for (auto* en : prox.second->GetNewObjects()) {
|
for (const auto id : prox.second->GetNewObjects()) {
|
||||||
m_Parent->OnCollisionProximity(en->GetObjectID(), prox.first, "ENTER");
|
m_Parent->OnCollisionProximity(id, prox.first, "ENTER");
|
||||||
}
|
}
|
||||||
|
|
||||||
//Process exit events
|
//Process exit events
|
||||||
for (auto* en : prox.second->GetRemovedObjects()) {
|
for (const auto id : prox.second->GetRemovedObjects()) {
|
||||||
m_Parent->OnCollisionProximity(en->GetObjectID(), prox.first, "LEAVE");
|
m_Parent->OnCollisionProximity(id, prox.first, "LEAVE");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
#ifndef PROXIMITYMONITORCOMPONENT_H
|
#ifndef PROXIMITYMONITORCOMPONENT_H
|
||||||
#define PROXIMITYMONITORCOMPONENT_H
|
#define PROXIMITYMONITORCOMPONENT_H
|
||||||
|
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
#include "BitStream.h"
|
#include "BitStream.h"
|
||||||
#include "Entity.h"
|
#include "Entity.h"
|
||||||
#include "dpWorld.h"
|
#include "dpWorld.h"
|
||||||
@ -42,9 +44,9 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Returns the last of entities that are used to check proximity, given a name
|
* Returns the last of entities that are used to check proximity, given a name
|
||||||
* @param name the proximity name to retrieve physics objects for
|
* @param name the proximity name to retrieve physics objects for
|
||||||
* @return a map of physics entities for this name, indexed by object ID
|
* @return a set of physics entity object IDs for this name
|
||||||
*/
|
*/
|
||||||
const std::map<LWOOBJID, dpEntity*>& GetProximityObjects(const std::string& name);
|
const std::unordered_set<LWOOBJID>& GetProximityObjects(const std::string& name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the passed object is in proximity of the named proximity sensor
|
* Checks if the passed object is in proximity of the named proximity sensor
|
||||||
@ -70,7 +72,7 @@ private:
|
|||||||
/**
|
/**
|
||||||
* Default value for the proximity data
|
* Default value for the proximity data
|
||||||
*/
|
*/
|
||||||
static const std::map<LWOOBJID, dpEntity*> m_EmptyObjectMap;
|
static const std::unordered_set<LWOOBJID> m_EmptyObjectSet;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PROXIMITYMONITORCOMPONENT_H
|
#endif // PROXIMITYMONITORCOMPONENT_H
|
||||||
|
@ -2663,17 +2663,11 @@ void GameMessages::HandleBBBSaveRequest(RakNet::BitStream& inStream, Entity* ent
|
|||||||
info.spawnerID = entity->GetObjectID();
|
info.spawnerID = entity->GetObjectID();
|
||||||
info.spawnerNodeID = 0;
|
info.spawnerNodeID = 0;
|
||||||
|
|
||||||
LDFBaseData* ldfBlueprintID = new LDFData<LWOOBJID>(u"blueprintid", blueprintID);
|
info.settings.push_back(new LDFData<LWOOBJID>(u"blueprintid", blueprintID));
|
||||||
LDFBaseData* componentWhitelist = new LDFData<int>(u"componentWhitelist", 1);
|
info.settings.push_back(new LDFData<int>(u"componentWhitelist", 1));
|
||||||
LDFBaseData* modelType = new LDFData<int>(u"modelType", 2);
|
info.settings.push_back(new LDFData<int>(u"modelType", 2));
|
||||||
LDFBaseData* propertyObjectID = new LDFData<bool>(u"propertyObjectID", true);
|
info.settings.push_back(new LDFData<bool>(u"propertyObjectID", true));
|
||||||
LDFBaseData* userModelID = new LDFData<LWOOBJID>(u"userModelID", newIDL);
|
info.settings.push_back(new LDFData<LWOOBJID>(u"userModelID", newIDL));
|
||||||
|
|
||||||
info.settings.push_back(ldfBlueprintID);
|
|
||||||
info.settings.push_back(componentWhitelist);
|
|
||||||
info.settings.push_back(modelType);
|
|
||||||
info.settings.push_back(propertyObjectID);
|
|
||||||
info.settings.push_back(userModelID);
|
|
||||||
|
|
||||||
Entity* newEntity = Game::entityManager->CreateEntity(info, nullptr);
|
Entity* newEntity = Game::entityManager->CreateEntity(info, nullptr);
|
||||||
if (newEntity) {
|
if (newEntity) {
|
||||||
|
@ -79,7 +79,7 @@
|
|||||||
#include "RenderComponent.h"
|
#include "RenderComponent.h"
|
||||||
#include "eControlScheme.h"
|
#include "eControlScheme.h"
|
||||||
#include "eConnectionType.h"
|
#include "eConnectionType.h"
|
||||||
#include "eChatInternalMessageType.h"
|
#include "eChatMessageType.h"
|
||||||
#include "eMasterMessageType.h"
|
#include "eMasterMessageType.h"
|
||||||
#include "PlayerManager.h"
|
#include "PlayerManager.h"
|
||||||
|
|
||||||
@ -1063,7 +1063,7 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
|
|||||||
|
|
||||||
//Notify chat about it
|
//Notify chat about it
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::MUTE_UPDATE);
|
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::GM_MUTE);
|
||||||
|
|
||||||
bitStream.Write(characterId);
|
bitStream.Write(characterId);
|
||||||
bitStream.Write(expire);
|
bitStream.Write(expire);
|
||||||
@ -2078,7 +2078,7 @@ void SlashCommandHandler::SendAnnouncement(const std::string& title, const std::
|
|||||||
|
|
||||||
//Notify chat about it
|
//Notify chat about it
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ANNOUNCEMENT);
|
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::GM_ANNOUNCE);
|
||||||
|
|
||||||
bitStream.Write<uint32_t>(title.size());
|
bitStream.Write<uint32_t>(title.size());
|
||||||
for (auto character : title) {
|
for (auto character : title) {
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
#include "dpShapeBox.h"
|
#include "dpShapeBox.h"
|
||||||
#include "dpGrid.h"
|
#include "dpGrid.h"
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
dpEntity::dpEntity(const LWOOBJID& objectID, dpShapeType shapeType, bool isStatic) {
|
dpEntity::dpEntity(const LWOOBJID& objectID, dpShapeType shapeType, bool isStatic) {
|
||||||
m_ObjectID = objectID;
|
m_ObjectID = objectID;
|
||||||
m_IsStatic = isStatic;
|
m_IsStatic = isStatic;
|
||||||
@ -76,16 +74,17 @@ void dpEntity::CheckCollision(dpEntity* other) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wasFound = m_CurrentlyCollidingObjects.contains(other->GetObjectID());
|
const auto objId = other->GetObjectID();
|
||||||
|
const auto objItr = m_CurrentlyCollidingObjects.find(objId);
|
||||||
bool isColliding = m_CollisionShape->IsColliding(other->GetShape());
|
const bool wasFound = objItr != m_CurrentlyCollidingObjects.cend();
|
||||||
|
const bool isColliding = m_CollisionShape->IsColliding(other->GetShape());
|
||||||
|
|
||||||
if (isColliding && !wasFound) {
|
if (isColliding && !wasFound) {
|
||||||
m_CurrentlyCollidingObjects.emplace(other->GetObjectID(), other);
|
m_CurrentlyCollidingObjects.emplace(objId);
|
||||||
m_NewObjects.push_back(other);
|
m_NewObjects.push_back(objId);
|
||||||
} else if (!isColliding && wasFound) {
|
} else if (!isColliding && wasFound) {
|
||||||
m_CurrentlyCollidingObjects.erase(other->GetObjectID());
|
m_CurrentlyCollidingObjects.erase(objItr);
|
||||||
m_RemovedObjects.push_back(other);
|
m_RemovedObjects.push_back(objId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,8 @@
|
|||||||
#include "NiPoint3.h"
|
#include "NiPoint3.h"
|
||||||
#include "NiQuaternion.h"
|
#include "NiQuaternion.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <unordered_set>
|
||||||
|
#include <span>
|
||||||
|
|
||||||
#include "dCommonVars.h"
|
#include "dCommonVars.h"
|
||||||
#include "dpCommon.h"
|
#include "dpCommon.h"
|
||||||
@ -49,9 +50,9 @@ public:
|
|||||||
bool GetSleeping() const { return m_Sleeping; }
|
bool GetSleeping() const { return m_Sleeping; }
|
||||||
void SetSleeping(bool value) { m_Sleeping = value; }
|
void SetSleeping(bool value) { m_Sleeping = value; }
|
||||||
|
|
||||||
const std::vector<dpEntity*>& GetNewObjects() const { return m_NewObjects; }
|
std::span<const LWOOBJID> GetNewObjects() const { return m_NewObjects; }
|
||||||
const std::vector<dpEntity*>& GetRemovedObjects() const { return m_RemovedObjects; }
|
std::span<const LWOOBJID> GetRemovedObjects() const { return m_RemovedObjects; }
|
||||||
const std::map<LWOOBJID, dpEntity*>& GetCurrentlyCollidingObjects() const { return m_CurrentlyCollidingObjects; }
|
const std::unordered_set<LWOOBJID>& GetCurrentlyCollidingObjects() const { return m_CurrentlyCollidingObjects; }
|
||||||
|
|
||||||
void PreUpdate() { m_NewObjects.clear(); m_RemovedObjects.clear(); }
|
void PreUpdate() { m_NewObjects.clear(); m_RemovedObjects.clear(); }
|
||||||
|
|
||||||
@ -80,7 +81,7 @@ private:
|
|||||||
|
|
||||||
bool m_IsGargantuan = false;
|
bool m_IsGargantuan = false;
|
||||||
|
|
||||||
std::vector<dpEntity*> m_NewObjects;
|
std::vector<LWOOBJID> m_NewObjects;
|
||||||
std::vector<dpEntity*> m_RemovedObjects;
|
std::vector<LWOOBJID> m_RemovedObjects;
|
||||||
std::map<LWOOBJID, dpEntity*> m_CurrentlyCollidingObjects;
|
std::unordered_set<LWOOBJID> m_CurrentlyCollidingObjects;
|
||||||
};
|
};
|
||||||
|
@ -21,7 +21,7 @@ void WanderingVendor::OnProximityUpdate(Entity* self, Entity* entering, std::str
|
|||||||
|
|
||||||
const auto proxObjs = proximityMonitorComponent->GetProximityObjects("playermonitor");
|
const auto proxObjs = proximityMonitorComponent->GetProximityObjects("playermonitor");
|
||||||
bool foundPlayer = false;
|
bool foundPlayer = false;
|
||||||
for (const auto id : proxObjs | std::views::keys) {
|
for (const auto id : proxObjs) {
|
||||||
auto* entity = Game::entityManager->GetEntity(id);
|
auto* entity = Game::entityManager->GetEntity(id);
|
||||||
if (entity && entity->IsPlayer()) {
|
if (entity && entity->IsPlayer()) {
|
||||||
foundPlayer = true;
|
foundPlayer = true;
|
||||||
|
@ -23,13 +23,13 @@ void AgBusDoor::OnProximityUpdate(Entity* self, Entity* entering, std::string na
|
|||||||
m_Counter = 0;
|
m_Counter = 0;
|
||||||
m_OuterCounter = 0;
|
m_OuterCounter = 0;
|
||||||
|
|
||||||
for (const auto& pair : proximityMonitorComponent->GetProximityObjects("busDoor")) {
|
for (const auto id : proximityMonitorComponent->GetProximityObjects("busDoor")) {
|
||||||
auto* entity = Game::entityManager->GetEntity(pair.first);
|
const auto* const entity = Game::entityManager->GetEntity(id);
|
||||||
if (entity != nullptr && entity->IsPlayer()) m_Counter++;
|
if (entity != nullptr && entity->IsPlayer()) m_Counter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& pair : proximityMonitorComponent->GetProximityObjects("busDoorOuter")) {
|
for (const auto id : proximityMonitorComponent->GetProximityObjects("busDoorOuter")) {
|
||||||
auto* entity = Game::entityManager->GetEntity(pair.first);
|
const auto* const entity = Game::entityManager->GetEntity(id);
|
||||||
if (entity != nullptr && entity->IsPlayer()) m_OuterCounter++;
|
if (entity != nullptr && entity->IsPlayer()) m_OuterCounter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@
|
|||||||
#include "eObjectBits.h"
|
#include "eObjectBits.h"
|
||||||
#include "eConnectionType.h"
|
#include "eConnectionType.h"
|
||||||
#include "eServerMessageType.h"
|
#include "eServerMessageType.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"
|
||||||
@ -541,118 +541,116 @@ 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) {
|
||||||
switch (static_cast<eChatInternalMessageType>(packet->data[3])) {
|
switch (static_cast<eChatMessageType>(packet->data[3])) {
|
||||||
case eChatInternalMessageType::ROUTE_TO_PLAYER: {
|
case eChatMessageType::WORLD_ROUTE_PACKET: {
|
||||||
CINSTREAM_SKIP_HEADER;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID;
|
LWOOBJID playerID;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
|
|
||||||
auto player = Game::entityManager->GetEntity(playerID);
|
auto player = Game::entityManager->GetEntity(playerID);
|
||||||
if (!player) return;
|
if (!player) return;
|
||||||
|
|
||||||
auto sysAddr = player->GetSystemAddress();
|
auto sysAddr = player->GetSystemAddress();
|
||||||
|
|
||||||
//Write our stream outwards:
|
//Write our stream outwards:
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
for (BitSize_t i = 0; i < inStream.GetNumberOfBytesUsed(); i++) {
|
for (BitSize_t i = 0; i < inStream.GetNumberOfBytesUsed(); i++) {
|
||||||
bitStream.Write(packet->data[i + 16]); //16 bytes == header + playerID to skip
|
bitStream.Write(packet->data[i + 16]); //16 bytes == header + playerID to skip
|
||||||
|
}
|
||||||
|
|
||||||
|
SEND_PACKET; //send routed packet to player
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
SEND_PACKET; //send routed packet to player
|
case eChatMessageType::GM_ANNOUNCE: {
|
||||||
|
CINSTREAM_SKIP_HEADER;
|
||||||
|
|
||||||
break;
|
std::string title;
|
||||||
}
|
std::string msg;
|
||||||
|
|
||||||
case eChatInternalMessageType::ANNOUNCEMENT: {
|
uint32_t len;
|
||||||
CINSTREAM_SKIP_HEADER;
|
inStream.Read<uint32_t>(len);
|
||||||
|
for (uint32_t i = 0; len > i; i++) {
|
||||||
|
char character;
|
||||||
|
inStream.Read<char>(character);
|
||||||
|
title += character;
|
||||||
|
}
|
||||||
|
|
||||||
std::string title;
|
len = 0;
|
||||||
std::string msg;
|
inStream.Read<uint32_t>(len);
|
||||||
|
for (uint32_t i = 0; len > i; i++) {
|
||||||
|
char character;
|
||||||
|
inStream.Read<char>(character);
|
||||||
|
msg += character;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t len;
|
//Send to our clients:
|
||||||
inStream.Read<uint32_t>(len);
|
AMFArrayValue args;
|
||||||
for (uint32_t i = 0; len > i; i++) {
|
|
||||||
char character;
|
|
||||||
inStream.Read<char>(character);
|
|
||||||
title += character;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = 0;
|
args.Insert("title", title);
|
||||||
inStream.Read<uint32_t>(len);
|
args.Insert("message", msg);
|
||||||
for (uint32_t i = 0; len > i; i++) {
|
|
||||||
char character;
|
|
||||||
inStream.Read<char>(character);
|
|
||||||
msg += character;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Send to our clients:
|
GameMessages::SendUIMessageServerToAllClients("ToggleAnnounce", args);
|
||||||
AMFArrayValue args;
|
|
||||||
|
|
||||||
args.Insert("title", title);
|
|
||||||
args.Insert("message", msg);
|
|
||||||
|
|
||||||
GameMessages::SendUIMessageServerToAllClients("ToggleAnnounce", args);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case eChatInternalMessageType::MUTE_UPDATE: {
|
|
||||||
CINSTREAM_SKIP_HEADER;
|
|
||||||
LWOOBJID playerId;
|
|
||||||
time_t expire = 0;
|
|
||||||
inStream.Read(playerId);
|
|
||||||
inStream.Read(expire);
|
|
||||||
|
|
||||||
auto* entity = Game::entityManager->GetEntity(playerId);
|
|
||||||
auto* character = entity != nullptr ? entity->GetCharacter() : nullptr;
|
|
||||||
auto* user = character != nullptr ? character->GetParentUser() : nullptr;
|
|
||||||
if (user) {
|
|
||||||
user->SetMuteExpire(expire);
|
|
||||||
|
|
||||||
entity->GetCharacter()->SendMuteNotice();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case eChatInternalMessageType::TEAM_UPDATE: {
|
|
||||||
CINSTREAM_SKIP_HEADER;
|
|
||||||
|
|
||||||
LWOOBJID teamID = 0;
|
|
||||||
char lootOption = 0;
|
|
||||||
char memberCount = 0;
|
|
||||||
std::vector<LWOOBJID> members;
|
|
||||||
|
|
||||||
inStream.Read(teamID);
|
|
||||||
bool deleteTeam = inStream.ReadBit();
|
|
||||||
|
|
||||||
if (deleteTeam) {
|
|
||||||
TeamManager::Instance()->DeleteTeam(teamID);
|
|
||||||
|
|
||||||
LOG("Deleting team (%llu)", teamID);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
inStream.Read(lootOption);
|
case eChatMessageType::GM_MUTE: {
|
||||||
inStream.Read(memberCount);
|
CINSTREAM_SKIP_HEADER;
|
||||||
LOG("Updating team (%llu), (%i), (%i)", teamID, lootOption, memberCount);
|
LWOOBJID playerId;
|
||||||
for (char i = 0; i < memberCount; i++) {
|
time_t expire = 0;
|
||||||
LWOOBJID member = LWOOBJID_EMPTY;
|
inStream.Read(playerId);
|
||||||
inStream.Read(member);
|
inStream.Read(expire);
|
||||||
members.push_back(member);
|
|
||||||
|
|
||||||
LOG("Updating team member (%llu)", member);
|
auto* entity = Game::entityManager->GetEntity(playerId);
|
||||||
|
auto* character = entity != nullptr ? entity->GetCharacter() : nullptr;
|
||||||
|
auto* user = character != nullptr ? character->GetParentUser() : nullptr;
|
||||||
|
if (user) {
|
||||||
|
user->SetMuteExpire(expire);
|
||||||
|
|
||||||
|
entity->GetCharacter()->SendMuteNotice();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
TeamManager::Instance()->UpdateTeam(teamID, lootOption, members);
|
case eChatMessageType::TEAM_GET_STATUS: {
|
||||||
|
CINSTREAM_SKIP_HEADER;
|
||||||
|
|
||||||
break;
|
LWOOBJID teamID = 0;
|
||||||
}
|
char lootOption = 0;
|
||||||
|
char memberCount = 0;
|
||||||
|
std::vector<LWOOBJID> members;
|
||||||
|
|
||||||
default:
|
inStream.Read(teamID);
|
||||||
LOG("Received an unknown chat internal: %i", int(packet->data[3]));
|
bool deleteTeam = inStream.ReadBit();
|
||||||
|
|
||||||
|
if (deleteTeam) {
|
||||||
|
TeamManager::Instance()->DeleteTeam(teamID);
|
||||||
|
|
||||||
|
LOG("Deleting team (%llu)", teamID);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
inStream.Read(lootOption);
|
||||||
|
inStream.Read(memberCount);
|
||||||
|
LOG("Updating team (%llu), (%i), (%i)", teamID, lootOption, memberCount);
|
||||||
|
for (char i = 0; i < memberCount; i++) {
|
||||||
|
LWOOBJID member = LWOOBJID_EMPTY;
|
||||||
|
inStream.Read(member);
|
||||||
|
members.push_back(member);
|
||||||
|
|
||||||
|
LOG("Updating team member (%llu)", member);
|
||||||
|
}
|
||||||
|
|
||||||
|
TeamManager::Instance()->UpdateTeam(teamID, lootOption, members);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
LOG("Received an unknown chat: %i", int(packet->data[3]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -817,7 +815,7 @@ void HandlePacket(Packet* packet) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION);
|
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::UNEXPECTED_DISCONNECT);
|
||||||
bitStream.Write(user->GetLoggedInChar());
|
bitStream.Write(user->GetLoggedInChar());
|
||||||
Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
|
Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
|
||||||
}
|
}
|
||||||
@ -986,7 +984,7 @@ void HandlePacket(Packet* packet) {
|
|||||||
// This means we swapped characters and we need to remove the previous player from the container.
|
// This means we swapped characters and we need to remove the previous player from the container.
|
||||||
if (static_cast<uint32_t>(lastCharacter) != playerID) {
|
if (static_cast<uint32_t>(lastCharacter) != playerID) {
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION);
|
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::UNEXPECTED_DISCONNECT);
|
||||||
bitStream.Write(lastCharacter);
|
bitStream.Write(lastCharacter);
|
||||||
Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
|
Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
|
||||||
}
|
}
|
||||||
@ -1132,7 +1130,7 @@ void HandlePacket(Packet* packet) {
|
|||||||
const auto& playerName = character->GetName();
|
const auto& playerName = character->GetName();
|
||||||
|
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::PLAYER_ADDED_NOTIFICATION);
|
BitStreamUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::LOGIN_SESSION_NOTIFY);
|
||||||
bitStream.Write(player->GetObjectID());
|
bitStream.Write(player->GetObjectID());
|
||||||
bitStream.Write<uint32_t>(playerName.size());
|
bitStream.Write<uint32_t>(playerName.size());
|
||||||
for (size_t i = 0; i < playerName.size(); i++) {
|
for (size_t i = 0; i < playerName.size(); i++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user