format codebase

This commit is contained in:
aronwk-aaron
2022-07-28 08:39:57 -05:00
parent 4f7aa11067
commit 19e77a38d8
881 changed files with 34700 additions and 38689 deletions

View File

@ -53,15 +53,15 @@ int main(int argc, char** argv) {
std::string mysql_username = config.GetValue("mysql_username"); std::string mysql_username = config.GetValue("mysql_username");
std::string mysql_password = config.GetValue("mysql_password"); std::string mysql_password = config.GetValue("mysql_password");
try { try {
Database::Connect(mysql_host, mysql_database, mysql_username, mysql_password); Database::Connect(mysql_host, mysql_database, mysql_username, mysql_password);
} catch (sql::SQLException& ex) { } catch (sql::SQLException& ex) {
Game::logger->Log("AuthServer", "Got an error while connecting to the database: %s", ex.what()); Game::logger->Log("AuthServer", "Got an error while connecting to the database: %s", ex.what());
Database::Destroy("AuthServer"); Database::Destroy("AuthServer");
delete Game::server; delete Game::server;
delete Game::logger; delete Game::logger;
return 0; return 0;
} }
//Find out the master's IP: //Find out the master's IP:
std::string masterIP; std::string masterIP;
@ -98,8 +98,7 @@ int main(int argc, char** argv) {
if (framesSinceMasterDisconnect >= 30) if (framesSinceMasterDisconnect >= 30)
break; //Exit our loop, shut down. break; //Exit our loop, shut down.
} } else framesSinceMasterDisconnect = 0;
else framesSinceMasterDisconnect = 0;
//In world we'd update our other systems here. //In world we'd update our other systems here.
@ -134,8 +133,7 @@ int main(int argc, char** argv) {
delete stmt; delete stmt;
framesSinceLastSQLPing = 0; framesSinceLastSQLPing = 0;
} } else framesSinceLastSQLPing++;
else framesSinceLastSQLPing++;
//Sleep our thread since auth can afford to. //Sleep our thread since auth can afford to.
t += std::chrono::milliseconds(mediumFramerate); //Auth can run at a lower "fps" t += std::chrono::milliseconds(mediumFramerate); //Auth can run at a lower "fps"
@ -151,7 +149,7 @@ int main(int argc, char** argv) {
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
dLogger * SetupLogger() { dLogger* SetupLogger() {
std::string logPath = "./logs/AuthServer_" + std::to_string(time(nullptr)) + ".log"; std::string logPath = "./logs/AuthServer_" + std::to_string(time(nullptr)) + ".log";
bool logToConsole = false; bool logToConsole = false;
bool logDebugStatements = false; bool logDebugStatements = false;

View File

@ -21,8 +21,7 @@ dChatFilter::dChatFilter(const std::string& filepath, bool dontGenerateDCF) {
if (!BinaryIO::DoesFileExist(filepath + ".dcf") || m_DontGenerateDCF) { if (!BinaryIO::DoesFileExist(filepath + ".dcf") || m_DontGenerateDCF) {
ReadWordlistPlaintext(filepath + ".txt", true); ReadWordlistPlaintext(filepath + ".txt", true);
if (!m_DontGenerateDCF) ExportWordlistToDCF(filepath + ".dcf", true); if (!m_DontGenerateDCF) ExportWordlistToDCF(filepath + ".dcf", true);
} } else if (!ReadWordlistDCF(filepath + ".dcf", true)) {
else if (!ReadWordlistDCF(filepath + ".dcf", true)) {
ReadWordlistPlaintext(filepath + ".txt", true); ReadWordlistPlaintext(filepath + ".txt", true);
ExportWordlistToDCF(filepath + ".dcf", true); ExportWordlistToDCF(filepath + ".dcf", true);
} }
@ -85,8 +84,7 @@ bool dChatFilter::ReadWordlistDCF(const std::string& filepath, bool whiteList) {
} }
return true; return true;
} } else {
else {
file.close(); file.close();
return false; return false;
} }
@ -139,7 +137,7 @@ std::vector<std::pair<uint8_t, uint8_t>> dChatFilter::IsSentenceOkay(const std::
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() && !whiteList) {
m_UserUnapprovedWordCache.push_back(hash); m_UserUnapprovedWordCache.push_back(hash);
listOfBadSegments.emplace_back(position, originalSegment.length()); listOfBadSegments.emplace_back(position, originalSegment.length());

View File

@ -29,8 +29,8 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
std::unique_ptr<sql::PreparedStatement> stmt(Database::CreatePreppedStmt( std::unique_ptr<sql::PreparedStatement> stmt(Database::CreatePreppedStmt(
"SELECT fr.requested_player, best_friend, ci.name FROM " "SELECT fr.requested_player, best_friend, ci.name FROM "
"(SELECT CASE " "(SELECT CASE "
"WHEN player_id = ? THEN friend_id " "WHEN player_id = ? THEN friend_id "
"WHEN friend_id = ? THEN player_id " "WHEN friend_id = ? THEN player_id "
"END AS requested_player, best_friend FROM friends) AS fr " "END AS requested_player, best_friend FROM friends) AS fr "
"JOIN charinfo AS ci ON ci.id = fr.requested_player " "JOIN charinfo AS ci ON ci.id = fr.requested_player "
"WHERE fr.requested_player IS NOT NULL;")); "WHERE fr.requested_player IS NOT NULL;"));
@ -48,7 +48,7 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
GeneralUtils::SetBit(fd.friendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_CHARACTER)); GeneralUtils::SetBit(fd.friendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_CHARACTER));
fd.isBestFriend = res->getInt(2) == 3; //0 = friends, 1 = left_requested, 2 = right_requested, 3 = both_accepted - are now bffs fd.isBestFriend = res->getInt(2) == 3; //0 = friends, 1 = left_requested, 2 = right_requested, 3 = both_accepted - are now bffs
if (fd.isBestFriend) player->countOfBestFriends+=1; if (fd.isBestFriend) player->countOfBestFriends += 1;
fd.friendName = res->getString(3); fd.friendName = res->getString(3);
//Now check if they're online: //Now check if they're online:
@ -60,8 +60,7 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
//Since this friend is online, we need to update them on the fact that we've just logged in: //Since this friend is online, we need to update them on the fact that we've just logged in:
SendFriendUpdate(fr, player, 1, fd.isBestFriend); SendFriendUpdate(fr, player, 1, fd.isBestFriend);
} } else {
else {
fd.isOnline = false; fd.isOnline = false;
fd.zoneID = LWOZONEID(); fd.zoneID = LWOZONEID();
} }
@ -209,8 +208,8 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
updateQuery->executeUpdate(); updateQuery->executeUpdate();
// Sent the best friend update here if the value is 3 // Sent the best friend update here if the value is 3
if (bestFriendStatus == 3U) { if (bestFriendStatus == 3U) {
requestee->countOfBestFriends+=1; requestee->countOfBestFriends += 1;
requestor->countOfBestFriends+=1; requestor->countOfBestFriends += 1;
if (requestee->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestee.get(), requestor, AddFriendResponseType::ACCEPTED, false, true); if (requestee->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestee.get(), requestor, AddFriendResponseType::ACCEPTED, false, true);
if (requestor->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestor, requestee.get(), AddFriendResponseType::ACCEPTED, false, true); if (requestor->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestor, requestee.get(), AddFriendResponseType::ACCEPTED, false, true);
for (auto& friendData : requestor->friends) { for (auto& friendData : requestor->friends) {
@ -255,18 +254,18 @@ void ChatPacketHandler::HandleFriendResponse(Packet* packet) {
uint8_t isAlreadyBestFriends = 0U; uint8_t isAlreadyBestFriends = 0U;
// We need to convert this response code to one we can actually send back to the client. // We need to convert this response code to one we can actually send back to the client.
switch (clientResponseCode) { switch (clientResponseCode) {
case AddFriendResponseCode::ACCEPTED: case AddFriendResponseCode::ACCEPTED:
serverResponseCode = AddFriendResponseType::ACCEPTED; serverResponseCode = AddFriendResponseType::ACCEPTED;
break; break;
case AddFriendResponseCode::BUSY: case AddFriendResponseCode::BUSY:
serverResponseCode = AddFriendResponseType::BUSY; serverResponseCode = AddFriendResponseType::BUSY;
break; break;
case AddFriendResponseCode::CANCELLED: case AddFriendResponseCode::CANCELLED:
serverResponseCode = AddFriendResponseType::CANCELLED; serverResponseCode = AddFriendResponseType::CANCELLED;
break; break;
case AddFriendResponseCode::REJECTED: case AddFriendResponseCode::REJECTED:
serverResponseCode = AddFriendResponseType::DECLINED; serverResponseCode = AddFriendResponseType::DECLINED;
break; break;
} }
// Now that we have handled the base cases, we need to check the other cases. // Now that we have handled the base cases, we need to check the other cases.
@ -371,8 +370,7 @@ void ChatPacketHandler::HandleRemoveFriend(Packet* packet) {
SendRemoveFriend(goonB, goonAName, true); SendRemoveFriend(goonB, goonAName, true);
} }
void ChatPacketHandler::HandleChatMessage(Packet* packet) void ChatPacketHandler::HandleChatMessage(Packet* packet) {
{
CINSTREAM; CINSTREAM;
LWOOBJID playerID = LWOOBJID_EMPTY; LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID); inStream.Read(playerID);
@ -401,8 +399,7 @@ void ChatPacketHandler::HandleChatMessage(Packet* packet)
if (team == nullptr) return; if (team == nullptr) return;
for (const auto memberId : team->memberIDs) for (const auto memberId : team->memberIDs) {
{
auto* otherMember = playerContainer.GetPlayerData(memberId); auto* otherMember = playerContainer.GetPlayerData(memberId);
if (otherMember == nullptr) return; if (otherMember == nullptr) return;
@ -493,8 +490,7 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) {
} }
} }
void ChatPacketHandler::HandleTeamInvite(Packet* packet) void ChatPacketHandler::HandleTeamInvite(Packet* packet) {
{
CINSTREAM; CINSTREAM;
LWOOBJID playerID; LWOOBJID playerID;
inStream.Read(playerID); inStream.Read(playerID);
@ -503,27 +499,23 @@ void ChatPacketHandler::HandleTeamInvite(Packet* packet)
auto* player = playerContainer.GetPlayerData(playerID); auto* player = playerContainer.GetPlayerData(playerID);
if (player == nullptr) if (player == nullptr) {
{
return; return;
} }
auto* team = playerContainer.GetTeam(playerID); auto* team = playerContainer.GetTeam(playerID);
if (team == nullptr) if (team == nullptr) {
{
team = playerContainer.CreateTeam(playerID); team = playerContainer.CreateTeam(playerID);
} }
auto* other = playerContainer.GetPlayerData(invitedPlayer); auto* other = playerContainer.GetPlayerData(invitedPlayer);
if (other == nullptr) if (other == nullptr) {
{
return; return;
} }
if (playerContainer.GetTeam(other->playerID) != nullptr) if (playerContainer.GetTeam(other->playerID) != nullptr) {
{
return; return;
} }
@ -539,8 +531,7 @@ void ChatPacketHandler::HandleTeamInvite(Packet* packet)
Game::logger->Log("ChatPacketHandler", "Got team invite: %llu -> %s", playerID, invitedPlayer.c_str()); Game::logger->Log("ChatPacketHandler", "Got team invite: %llu -> %s", playerID, invitedPlayer.c_str());
} }
void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) {
{
CINSTREAM; CINSTREAM;
LWOOBJID playerID = LWOOBJID_EMPTY; LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID); inStream.Read(playerID);
@ -554,22 +545,19 @@ void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet)
Game::logger->Log("ChatPacketHandler", "Accepted invite: %llu -> %llu (%d)", playerID, leaderID, declined); Game::logger->Log("ChatPacketHandler", "Accepted invite: %llu -> %llu (%d)", playerID, leaderID, declined);
if (declined) if (declined) {
{
return; return;
} }
auto* team = playerContainer.GetTeam(leaderID); auto* team = playerContainer.GetTeam(leaderID);
if (team == nullptr) if (team == nullptr) {
{
Game::logger->Log("ChatPacketHandler", "Failed to find team for leader (%llu)", leaderID); Game::logger->Log("ChatPacketHandler", "Failed to find team for leader (%llu)", leaderID);
team = playerContainer.GetTeam(playerID); team = playerContainer.GetTeam(playerID);
} }
if (team == nullptr) if (team == nullptr) {
{
Game::logger->Log("ChatPacketHandler", "Failed to find team for player (%llu)", playerID); Game::logger->Log("ChatPacketHandler", "Failed to find team for player (%llu)", playerID);
return; return;
} }
@ -577,8 +565,7 @@ void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet)
playerContainer.AddMember(team, playerID); playerContainer.AddMember(team, playerID);
} }
void ChatPacketHandler::HandleTeamLeave(Packet* packet) void ChatPacketHandler::HandleTeamLeave(Packet* packet) {
{
CINSTREAM; CINSTREAM;
LWOOBJID playerID = LWOOBJID_EMPTY; LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID); inStream.Read(playerID);
@ -590,14 +577,12 @@ void ChatPacketHandler::HandleTeamLeave(Packet* packet)
Game::logger->Log("ChatPacketHandler", "(%llu) leaving team", playerID); Game::logger->Log("ChatPacketHandler", "(%llu) leaving team", playerID);
if (team != nullptr) if (team != nullptr) {
{
playerContainer.RemoveMember(team, playerID, false, false, true); playerContainer.RemoveMember(team, playerID, false, false, true);
} }
} }
void ChatPacketHandler::HandleTeamKick(Packet* packet) void ChatPacketHandler::HandleTeamKick(Packet* packet) {
{
CINSTREAM; CINSTREAM;
LWOOBJID playerID = LWOOBJID_EMPTY; LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID); inStream.Read(playerID);
@ -611,12 +596,9 @@ void ChatPacketHandler::HandleTeamKick(Packet* packet)
LWOOBJID kickedId = LWOOBJID_EMPTY; LWOOBJID kickedId = LWOOBJID_EMPTY;
if (kicked != nullptr) if (kicked != nullptr) {
{
kickedId = kicked->playerID; kickedId = kicked->playerID;
} } else {
else
{
kickedId = playerContainer.GetId(GeneralUtils::ASCIIToUTF16(kickedPlayer)); kickedId = playerContainer.GetId(GeneralUtils::ASCIIToUTF16(kickedPlayer));
} }
@ -624,16 +606,14 @@ void ChatPacketHandler::HandleTeamKick(Packet* packet)
auto* team = playerContainer.GetTeam(playerID); auto* team = playerContainer.GetTeam(playerID);
if (team != nullptr) if (team != nullptr) {
{
if (team->leaderID != playerID || team->leaderID == kickedId) return; if (team->leaderID != playerID || team->leaderID == kickedId) return;
playerContainer.RemoveMember(team, kickedId, false, true, false); playerContainer.RemoveMember(team, kickedId, false, true, false);
} }
} }
void ChatPacketHandler::HandleTeamPromote(Packet* packet) void ChatPacketHandler::HandleTeamPromote(Packet* packet) {
{
CINSTREAM; CINSTREAM;
LWOOBJID playerID = LWOOBJID_EMPTY; LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID); inStream.Read(playerID);
@ -649,16 +629,14 @@ void ChatPacketHandler::HandleTeamPromote(Packet* packet)
auto* team = playerContainer.GetTeam(playerID); auto* team = playerContainer.GetTeam(playerID);
if (team != nullptr) if (team != nullptr) {
{
if (team->leaderID != playerID) return; if (team->leaderID != playerID) return;
playerContainer.PromoteMember(team, promoted->playerID); playerContainer.PromoteMember(team, promoted->playerID);
} }
} }
void ChatPacketHandler::HandleTeamLootOption(Packet* packet) void ChatPacketHandler::HandleTeamLootOption(Packet* packet) {
{
CINSTREAM; CINSTREAM;
LWOOBJID playerID = LWOOBJID_EMPTY; LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID); inStream.Read(playerID);
@ -671,8 +649,7 @@ void ChatPacketHandler::HandleTeamLootOption(Packet* packet)
auto* team = playerContainer.GetTeam(playerID); auto* team = playerContainer.GetTeam(playerID);
if (team != nullptr) if (team != nullptr) {
{
if (team->leaderID != playerID) return; if (team->leaderID != playerID) return;
team->lootFlag = option; team->lootFlag = option;
@ -683,8 +660,7 @@ void ChatPacketHandler::HandleTeamLootOption(Packet* packet)
} }
} }
void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) {
{
CINSTREAM; CINSTREAM;
LWOOBJID playerID = LWOOBJID_EMPTY; LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID); inStream.Read(playerID);
@ -693,28 +669,22 @@ void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet)
auto* team = playerContainer.GetTeam(playerID); auto* team = playerContainer.GetTeam(playerID);
auto* data = playerContainer.GetPlayerData(playerID); auto* data = playerContainer.GetPlayerData(playerID);
if (team != nullptr && data != nullptr) if (team != nullptr && data != nullptr) {
{ if (team->local && data->zoneID.GetMapID() != team->zoneId.GetMapID() && data->zoneID.GetCloneID() != team->zoneId.GetCloneID()) {
if (team->local && data->zoneID.GetMapID() != team->zoneId.GetMapID() && data->zoneID.GetCloneID() != team->zoneId.GetCloneID())
{
playerContainer.RemoveMember(team, playerID, false, false, true, true); playerContainer.RemoveMember(team, playerID, false, false, true, true);
return; return;
} }
if (team->memberIDs.size() <= 1 && !team->local) if (team->memberIDs.size() <= 1 && !team->local) {
{
playerContainer.DisbandTeam(team); playerContainer.DisbandTeam(team);
return; return;
} }
if (!team->local) if (!team->local) {
{
ChatPacketHandler::SendTeamSetLeader(data, team->leaderID); ChatPacketHandler::SendTeamSetLeader(data, team->leaderID);
} } else {
else
{
ChatPacketHandler::SendTeamSetLeader(data, LWOOBJID_EMPTY); ChatPacketHandler::SendTeamSetLeader(data, LWOOBJID_EMPTY);
} }
@ -722,16 +692,14 @@ void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet)
const auto leaderName = GeneralUtils::ASCIIToUTF16(std::string(data->playerName.c_str())); const auto leaderName = GeneralUtils::ASCIIToUTF16(std::string(data->playerName.c_str()));
for (const auto memberId : team->memberIDs) for (const auto memberId : team->memberIDs) {
{
auto* otherMember = playerContainer.GetPlayerData(memberId); auto* otherMember = playerContainer.GetPlayerData(memberId);
if (memberId == playerID) continue; if (memberId == playerID) continue;
const auto memberName = playerContainer.GetName(memberId); const auto memberName = playerContainer.GetName(memberId);
if (otherMember != nullptr) if (otherMember != nullptr) {
{
ChatPacketHandler::SendTeamSetOffWorldFlag(otherMember, data->playerID, data->zoneID); ChatPacketHandler::SendTeamSetOffWorldFlag(otherMember, data->playerID, data->zoneID);
} }
ChatPacketHandler::SendTeamAddPlayer(data, false, team->local, false, memberId, memberName, otherMember != nullptr ? otherMember->zoneID : LWOZONEID(0, 0, 0)); ChatPacketHandler::SendTeamAddPlayer(data, false, team->local, false, memberId, memberName, otherMember != nullptr ? otherMember->zoneID : LWOZONEID(0, 0, 0));
@ -741,8 +709,7 @@ void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet)
} }
} }
void ChatPacketHandler::SendTeamInvite(PlayerData* receiver, PlayerData* sender) void ChatPacketHandler::SendTeamInvite(PlayerData* receiver, PlayerData* sender) {
{
CBITSTREAM; CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
@ -757,8 +724,7 @@ void ChatPacketHandler::SendTeamInvite(PlayerData* receiver, PlayerData* sender)
SEND_PACKET; SEND_PACKET;
} }
void ChatPacketHandler::SendTeamInviteConfirm(PlayerData* receiver, bool bLeaderIsFreeTrial, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, uint8_t ucResponseCode, std::u16string wsLeaderName) void ChatPacketHandler::SendTeamInviteConfirm(PlayerData* receiver, bool bLeaderIsFreeTrial, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, uint8_t ucResponseCode, std::u16string wsLeaderName) {
{
CBITSTREAM; CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
@ -766,7 +732,7 @@ void ChatPacketHandler::SendTeamInviteConfirm(PlayerData* receiver, bool bLeader
//portion that will get routed: //portion that will get routed:
CMSGHEADER CMSGHEADER
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_INVITE_CONFIRM); bitStream.Write(GAME_MSG::GAME_MSG_TEAM_INVITE_CONFIRM);
bitStream.Write(bLeaderIsFreeTrial); bitStream.Write(bLeaderIsFreeTrial);
@ -777,8 +743,7 @@ void ChatPacketHandler::SendTeamInviteConfirm(PlayerData* receiver, bool bLeader
bitStream.Write(ucNumOfOtherPlayers); bitStream.Write(ucNumOfOtherPlayers);
bitStream.Write(ucResponseCode); bitStream.Write(ucResponseCode);
bitStream.Write(static_cast<uint32_t>(wsLeaderName.size())); bitStream.Write(static_cast<uint32_t>(wsLeaderName.size()));
for (const auto character : wsLeaderName) for (const auto character : wsLeaderName) {
{
bitStream.Write(character); bitStream.Write(character);
} }
@ -786,8 +751,7 @@ void ChatPacketHandler::SendTeamInviteConfirm(PlayerData* receiver, bool bLeader
SEND_PACKET; SEND_PACKET;
} }
void ChatPacketHandler::SendTeamStatus(PlayerData* receiver, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, std::u16string wsLeaderName) void ChatPacketHandler::SendTeamStatus(PlayerData* receiver, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, std::u16string wsLeaderName) {
{
CBITSTREAM; CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
@ -795,7 +759,7 @@ void ChatPacketHandler::SendTeamStatus(PlayerData* receiver, LWOOBJID i64LeaderI
//portion that will get routed: //portion that will get routed:
CMSGHEADER CMSGHEADER
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_GET_STATUS_RESPONSE); bitStream.Write(GAME_MSG::GAME_MSG_TEAM_GET_STATUS_RESPONSE);
bitStream.Write(i64LeaderID); bitStream.Write(i64LeaderID);
@ -804,8 +768,7 @@ void ChatPacketHandler::SendTeamStatus(PlayerData* receiver, LWOOBJID i64LeaderI
bitStream.Write(ucLootFlag); bitStream.Write(ucLootFlag);
bitStream.Write(ucNumOfOtherPlayers); bitStream.Write(ucNumOfOtherPlayers);
bitStream.Write(static_cast<uint32_t>(wsLeaderName.size())); bitStream.Write(static_cast<uint32_t>(wsLeaderName.size()));
for (const auto character : wsLeaderName) for (const auto character : wsLeaderName) {
{
bitStream.Write(character); bitStream.Write(character);
} }
@ -813,8 +776,7 @@ void ChatPacketHandler::SendTeamStatus(PlayerData* receiver, LWOOBJID i64LeaderI
SEND_PACKET; SEND_PACKET;
} }
void ChatPacketHandler::SendTeamSetLeader(PlayerData* receiver, LWOOBJID i64PlayerID) void ChatPacketHandler::SendTeamSetLeader(PlayerData* receiver, LWOOBJID i64PlayerID) {
{
CBITSTREAM; CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
@ -822,7 +784,7 @@ void ChatPacketHandler::SendTeamSetLeader(PlayerData* receiver, LWOOBJID i64Play
//portion that will get routed: //portion that will get routed:
CMSGHEADER CMSGHEADER
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_SET_LEADER); bitStream.Write(GAME_MSG::GAME_MSG_TEAM_SET_LEADER);
bitStream.Write(i64PlayerID); bitStream.Write(i64PlayerID);
@ -831,8 +793,7 @@ void ChatPacketHandler::SendTeamSetLeader(PlayerData* receiver, LWOOBJID i64Play
SEND_PACKET; SEND_PACKET;
} }
void ChatPacketHandler::SendTeamAddPlayer(PlayerData* receiver, bool bIsFreeTrial, bool bLocal, bool bNoLootOnDeath, LWOOBJID i64PlayerID, std::u16string wsPlayerName, LWOZONEID zoneID) void ChatPacketHandler::SendTeamAddPlayer(PlayerData* receiver, bool bIsFreeTrial, bool bLocal, bool bNoLootOnDeath, LWOOBJID i64PlayerID, std::u16string wsPlayerName, LWOZONEID zoneID) {
{
CBITSTREAM; CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
@ -840,7 +801,7 @@ void ChatPacketHandler::SendTeamAddPlayer(PlayerData* receiver, bool bIsFreeTria
//portion that will get routed: //portion that will get routed:
CMSGHEADER CMSGHEADER
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_ADD_PLAYER); bitStream.Write(GAME_MSG::GAME_MSG_TEAM_ADD_PLAYER);
bitStream.Write(bIsFreeTrial); bitStream.Write(bIsFreeTrial);
@ -848,13 +809,11 @@ void ChatPacketHandler::SendTeamAddPlayer(PlayerData* receiver, bool bIsFreeTria
bitStream.Write(bNoLootOnDeath); bitStream.Write(bNoLootOnDeath);
bitStream.Write(i64PlayerID); bitStream.Write(i64PlayerID);
bitStream.Write(static_cast<uint32_t>(wsPlayerName.size())); bitStream.Write(static_cast<uint32_t>(wsPlayerName.size()));
for (const auto character : wsPlayerName) for (const auto character : wsPlayerName) {
{
bitStream.Write(character); bitStream.Write(character);
} }
bitStream.Write1(); bitStream.Write1();
if (receiver->zoneID.GetCloneID() == zoneID.GetCloneID()) if (receiver->zoneID.GetCloneID() == zoneID.GetCloneID()) {
{
zoneID = LWOZONEID(zoneID.GetMapID(), zoneID.GetInstanceID(), 0); zoneID = LWOZONEID(zoneID.GetMapID(), zoneID.GetInstanceID(), 0);
} }
bitStream.Write(zoneID); bitStream.Write(zoneID);
@ -863,8 +822,7 @@ void ChatPacketHandler::SendTeamAddPlayer(PlayerData* receiver, bool bIsFreeTria
SEND_PACKET; SEND_PACKET;
} }
void ChatPacketHandler::SendTeamRemovePlayer(PlayerData* receiver, bool bDisband, bool bIsKicked, bool bIsLeaving, bool bLocal, LWOOBJID i64LeaderID, LWOOBJID i64PlayerID, std::u16string wsPlayerName) void ChatPacketHandler::SendTeamRemovePlayer(PlayerData* receiver, bool bDisband, bool bIsKicked, bool bIsLeaving, bool bLocal, LWOOBJID i64LeaderID, LWOOBJID i64PlayerID, std::u16string wsPlayerName) {
{
CBITSTREAM; CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
@ -872,7 +830,7 @@ void ChatPacketHandler::SendTeamRemovePlayer(PlayerData* receiver, bool bDisband
//portion that will get routed: //portion that will get routed:
CMSGHEADER CMSGHEADER
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_REMOVE_PLAYER); bitStream.Write(GAME_MSG::GAME_MSG_TEAM_REMOVE_PLAYER);
bitStream.Write(bDisband); bitStream.Write(bDisband);
@ -882,8 +840,7 @@ void ChatPacketHandler::SendTeamRemovePlayer(PlayerData* receiver, bool bDisband
bitStream.Write(i64LeaderID); bitStream.Write(i64LeaderID);
bitStream.Write(i64PlayerID); bitStream.Write(i64PlayerID);
bitStream.Write(static_cast<uint32_t>(wsPlayerName.size())); bitStream.Write(static_cast<uint32_t>(wsPlayerName.size()));
for (const auto character : wsPlayerName) for (const auto character : wsPlayerName) {
{
bitStream.Write(character); bitStream.Write(character);
} }
@ -891,8 +848,7 @@ void ChatPacketHandler::SendTeamRemovePlayer(PlayerData* receiver, bool bDisband
SEND_PACKET; SEND_PACKET;
} }
void ChatPacketHandler::SendTeamSetOffWorldFlag(PlayerData* receiver, LWOOBJID i64PlayerID, LWOZONEID zoneID) void ChatPacketHandler::SendTeamSetOffWorldFlag(PlayerData* receiver, LWOOBJID i64PlayerID, LWOZONEID zoneID) {
{
CBITSTREAM; CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER); PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
@ -900,12 +856,11 @@ void ChatPacketHandler::SendTeamSetOffWorldFlag(PlayerData* receiver, LWOOBJID i
//portion that will get routed: //portion that will get routed:
CMSGHEADER CMSGHEADER
bitStream.Write(receiver->playerID); bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_SET_OFF_WORLD_FLAG); bitStream.Write(GAME_MSG::GAME_MSG_TEAM_SET_OFF_WORLD_FLAG);
bitStream.Write(i64PlayerID); bitStream.Write(i64PlayerID);
if (receiver->zoneID.GetCloneID() == zoneID.GetCloneID()) if (receiver->zoneID.GetCloneID() == zoneID.GetCloneID()) {
{
zoneID = LWOZONEID(zoneID.GetMapID(), zoneID.GetInstanceID(), 0); zoneID = LWOZONEID(zoneID.GetMapID(), zoneID.GetInstanceID(), 0);
} }
bitStream.Write(zoneID); bitStream.Write(zoneID);
@ -943,12 +898,9 @@ void ChatPacketHandler::SendFriendUpdate(PlayerData* friendData, PlayerData* pla
bitStream.Write(playerData->zoneID.GetMapID()); bitStream.Write(playerData->zoneID.GetMapID());
bitStream.Write(playerData->zoneID.GetInstanceID()); bitStream.Write(playerData->zoneID.GetInstanceID());
if (playerData->zoneID.GetCloneID() == friendData->zoneID.GetCloneID()) if (playerData->zoneID.GetCloneID() == friendData->zoneID.GetCloneID()) {
{
bitStream.Write(0); bitStream.Write(0);
} } else {
else
{
bitStream.Write(playerData->zoneID.GetCloneID()); bitStream.Write(playerData->zoneID.GetCloneID());
} }
@ -998,7 +950,7 @@ void ChatPacketHandler::SendFriendResponse(PlayerData* receiver, PlayerData* sen
// Then write the player name // Then write the player name
PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream); PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream);
// Then if this is an acceptance code, write the following extra info. // Then if this is an acceptance code, write the following extra info.
if (responseCode == AddFriendResponseType::ACCEPTED) { if (responseCode == AddFriendResponseType::ACCEPTED) {
bitStream.Write(sender->playerID); bitStream.Write(sender->playerID);
bitStream.Write(sender->zoneID); bitStream.Write(sender->zoneID);
bitStream.Write(isBestFriendRequest); //isBFF bitStream.Write(isBestFriendRequest); //isBFF

View File

@ -58,8 +58,7 @@ int main(int argc, char** argv) {
try { try {
Database::Connect(mysql_host, mysql_database, mysql_username, mysql_password); Database::Connect(mysql_host, mysql_database, mysql_username, mysql_password);
} } catch (sql::SQLException& ex) {
catch (sql::SQLException& ex) {
Game::logger->Log("ChatServer", "Got an error while connecting to the database: %s", ex.what()); Game::logger->Log("ChatServer", "Got an error while connecting to the database: %s", ex.what());
Database::Destroy("ChatServer"); Database::Destroy("ChatServer");
delete Game::server; delete Game::server;
@ -104,8 +103,7 @@ int main(int argc, char** argv) {
if (framesSinceMasterDisconnect >= 30) if (framesSinceMasterDisconnect >= 30)
break; //Exit our loop, shut down. break; //Exit our loop, shut down.
} } else framesSinceMasterDisconnect = 0;
else framesSinceMasterDisconnect = 0;
//In world we'd update our other systems here. //In world we'd update our other systems here.
@ -122,8 +120,7 @@ int main(int argc, char** argv) {
if (framesSinceLastFlush >= 900) { if (framesSinceLastFlush >= 900) {
Game::logger->Flush(); Game::logger->Flush();
framesSinceLastFlush = 0; framesSinceLastFlush = 0;
} } else framesSinceLastFlush++;
else framesSinceLastFlush++;
//Every 10 min we ping our sql server to keep it alive hopefully: //Every 10 min we ping our sql server to keep it alive hopefully:
if (framesSinceLastSQLPing >= 40000) { if (framesSinceLastSQLPing >= 40000) {
@ -141,8 +138,7 @@ int main(int argc, char** argv) {
delete stmt; delete stmt;
framesSinceLastSQLPing = 0; framesSinceLastSQLPing = 0;
} } else framesSinceLastSQLPing++;
else framesSinceLastSQLPing++;
//Sleep our thread since auth can afford to. //Sleep our thread since auth can afford to.
t += std::chrono::milliseconds(mediumFramerate); //Chat can run at a lower "fps" t += std::chrono::milliseconds(mediumFramerate); //Chat can run at a lower "fps"
@ -158,7 +154,7 @@ int main(int argc, char** argv) {
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
dLogger * SetupLogger() { dLogger* SetupLogger() {
std::string logPath = "./logs/ChatServer_" + std::to_string(time(nullptr)) + ".log"; std::string logPath = "./logs/ChatServer_" + std::to_string(time(nullptr)) + ".log";
bool logToConsole = false; bool logToConsole = false;
bool logDebugStatements = false; bool logDebugStatements = false;

View File

@ -70,17 +70,15 @@ void PlayerContainer::RemovePlayer(Packet* packet) {
auto* team = GetTeam(playerID); auto* team = GetTeam(playerID);
if (team != nullptr) if (team != nullptr) {
{
const auto memberName = GeneralUtils::ASCIIToUTF16(std::string(player->playerName.c_str())); const auto memberName = GeneralUtils::ASCIIToUTF16(std::string(player->playerName.c_str()));
for (const auto memberId : team->memberIDs) for (const auto memberId : team->memberIDs) {
{
auto* otherMember = GetPlayerData(memberId); auto* otherMember = GetPlayerData(memberId);
if (otherMember == nullptr) continue; if (otherMember == nullptr) continue;
ChatPacketHandler::SendTeamSetOffWorldFlag(otherMember, playerID, {0, 0, 0}); ChatPacketHandler::SendTeamSetOffWorldFlag(otherMember, playerID, { 0, 0, 0 });
} }
} }
@ -97,8 +95,7 @@ void PlayerContainer::RemovePlayer(Packet* packet) {
insertLog->executeUpdate(); insertLog->executeUpdate();
} }
void PlayerContainer::MuteUpdate(Packet* packet) void PlayerContainer::MuteUpdate(Packet* packet) {
{
CINSTREAM; CINSTREAM;
LWOOBJID playerID; LWOOBJID playerID;
inStream.Read(playerID); //skip header inStream.Read(playerID); //skip header
@ -108,8 +105,7 @@ void PlayerContainer::MuteUpdate(Packet* packet)
auto* player = this->GetPlayerData(playerID); auto* player = this->GetPlayerData(playerID);
if (player == nullptr) if (player == nullptr) {
{
Game::logger->Log("PlayerContainer", "Failed to find user: %llu", playerID); Game::logger->Log("PlayerContainer", "Failed to find user: %llu", playerID);
return; return;
@ -120,8 +116,7 @@ void PlayerContainer::MuteUpdate(Packet* packet)
BroadcastMuteUpdate(playerID, expire); BroadcastMuteUpdate(playerID, expire);
} }
void PlayerContainer::CreateTeamServer(Packet* packet) void PlayerContainer::CreateTeamServer(Packet* packet) {
{
CINSTREAM; CINSTREAM;
LWOOBJID playerID; LWOOBJID playerID;
inStream.Read(playerID); //skip header inStream.Read(playerID); //skip header
@ -133,8 +128,7 @@ void PlayerContainer::CreateTeamServer(Packet* packet)
members.reserve(membersSize); members.reserve(membersSize);
for (size_t i = 0; i < membersSize; i++) for (size_t i = 0; i < membersSize; i++) {
{
LWOOBJID member; LWOOBJID member;
inStream.Read(member); inStream.Read(member);
members.push_back(member); members.push_back(member);
@ -146,16 +140,14 @@ void PlayerContainer::CreateTeamServer(Packet* packet)
auto* team = CreateLocalTeam(members); auto* team = CreateLocalTeam(members);
if (team != nullptr) if (team != nullptr) {
{
team->zoneId = zoneId; team->zoneId = zoneId;
} }
UpdateTeamsOnWorld(team, false); UpdateTeamsOnWorld(team, false);
} }
void PlayerContainer::BroadcastMuteUpdate(LWOOBJID player, time_t time) void PlayerContainer::BroadcastMuteUpdate(LWOOBJID player, time_t time) {
{
CBITSTREAM; CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_MUTE_UPDATE); PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_MUTE_UPDATE);
@ -165,30 +157,23 @@ void PlayerContainer::BroadcastMuteUpdate(LWOOBJID player, time_t time)
Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true); Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
} }
TeamData* PlayerContainer::CreateLocalTeam(std::vector<LWOOBJID> members) TeamData* PlayerContainer::CreateLocalTeam(std::vector<LWOOBJID> members) {
{ if (members.empty()) {
if (members.empty())
{
return nullptr; return nullptr;
} }
TeamData* newTeam = nullptr; TeamData* newTeam = nullptr;
for (const auto member : members) for (const auto member : members) {
{
auto* team = GetTeam(member); auto* team = GetTeam(member);
if (team != nullptr) if (team != nullptr) {
{
RemoveMember(team, member, false, false, true); RemoveMember(team, member, false, false, true);
} }
if (newTeam == nullptr) if (newTeam == nullptr) {
{
newTeam = CreateTeam(member, true); newTeam = CreateTeam(member, true);
} } else {
else
{
AddMember(newTeam, member); AddMember(newTeam, member);
} }
} }
@ -200,8 +185,7 @@ TeamData* PlayerContainer::CreateLocalTeam(std::vector<LWOOBJID> members)
return newTeam; return newTeam;
} }
TeamData* PlayerContainer::CreateTeam(LWOOBJID leader, bool local) TeamData* PlayerContainer::CreateTeam(LWOOBJID leader, bool local) {
{
auto* team = new TeamData(); auto* team = new TeamData();
team->teamID = ++mTeamIDCounter; team->teamID = ++mTeamIDCounter;
@ -215,10 +199,8 @@ TeamData* PlayerContainer::CreateTeam(LWOOBJID leader, bool local)
return team; return team;
} }
TeamData* PlayerContainer::GetTeam(LWOOBJID playerID) TeamData* PlayerContainer::GetTeam(LWOOBJID playerID) {
{ for (auto* team : mTeams) {
for (auto* team : mTeams)
{
if (std::find(team->memberIDs.begin(), team->memberIDs.end(), playerID) == team->memberIDs.end()) continue; if (std::find(team->memberIDs.begin(), team->memberIDs.end(), playerID) == team->memberIDs.end()) continue;
return team; return team;
@ -227,8 +209,7 @@ TeamData* PlayerContainer::GetTeam(LWOOBJID playerID)
return nullptr; return nullptr;
} }
void PlayerContainer::AddMember(TeamData* team, LWOOBJID playerID) void PlayerContainer::AddMember(TeamData* team, LWOOBJID playerID) {
{
const auto index = std::find(team->memberIDs.begin(), team->memberIDs.end(), playerID); const auto index = std::find(team->memberIDs.begin(), team->memberIDs.end(), playerID);
if (index != team->memberIDs.end()) return; if (index != team->memberIDs.end()) return;
@ -245,19 +226,15 @@ void PlayerContainer::AddMember(TeamData* team, LWOOBJID playerID)
ChatPacketHandler::SendTeamInviteConfirm(member, false, leader->playerID, leader->zoneID, team->lootFlag, 0, 0, leaderName); ChatPacketHandler::SendTeamInviteConfirm(member, false, leader->playerID, leader->zoneID, team->lootFlag, 0, 0, leaderName);
if (!team->local) if (!team->local) {
{
ChatPacketHandler::SendTeamSetLeader(member, leader->playerID); ChatPacketHandler::SendTeamSetLeader(member, leader->playerID);
} } else {
else
{
ChatPacketHandler::SendTeamSetLeader(member, LWOOBJID_EMPTY); ChatPacketHandler::SendTeamSetLeader(member, LWOOBJID_EMPTY);
} }
UpdateTeamsOnWorld(team, false); UpdateTeamsOnWorld(team, false);
for (const auto memberId : team->memberIDs) for (const auto memberId : team->memberIDs) {
{
auto* otherMember = GetPlayerData(memberId); auto* otherMember = GetPlayerData(memberId);
if (otherMember == member) continue; if (otherMember == member) continue;
@ -266,32 +243,27 @@ void PlayerContainer::AddMember(TeamData* team, LWOOBJID playerID)
ChatPacketHandler::SendTeamAddPlayer(member, false, team->local, false, memberId, otherMemberName, otherMember != nullptr ? otherMember->zoneID : LWOZONEID(0, 0, 0)); ChatPacketHandler::SendTeamAddPlayer(member, false, team->local, false, memberId, otherMemberName, otherMember != nullptr ? otherMember->zoneID : LWOZONEID(0, 0, 0));
if (otherMember != nullptr) if (otherMember != nullptr) {
{
ChatPacketHandler::SendTeamAddPlayer(otherMember, false, team->local, false, member->playerID, memberName, member->zoneID); ChatPacketHandler::SendTeamAddPlayer(otherMember, false, team->local, false, member->playerID, memberName, member->zoneID);
} }
} }
} }
void PlayerContainer::RemoveMember(TeamData* team, LWOOBJID playerID, bool disband, bool kicked, bool leaving, bool silent) void PlayerContainer::RemoveMember(TeamData* team, LWOOBJID playerID, bool disband, bool kicked, bool leaving, bool silent) {
{
const auto index = std::find(team->memberIDs.begin(), team->memberIDs.end(), playerID); const auto index = std::find(team->memberIDs.begin(), team->memberIDs.end(), playerID);
if (index == team->memberIDs.end()) return; if (index == team->memberIDs.end()) return;
auto* member = GetPlayerData(playerID); auto* member = GetPlayerData(playerID);
if (member != nullptr && !silent) if (member != nullptr && !silent) {
{
ChatPacketHandler::SendTeamSetLeader(member, LWOOBJID_EMPTY); ChatPacketHandler::SendTeamSetLeader(member, LWOOBJID_EMPTY);
} }
const auto memberName = GetName(playerID); const auto memberName = GetName(playerID);
for (const auto memberId : team->memberIDs) for (const auto memberId : team->memberIDs) {
{ if (silent && memberId == playerID) {
if (silent && memberId == playerID)
{
continue; continue;
} }
@ -306,25 +278,19 @@ void PlayerContainer::RemoveMember(TeamData* team, LWOOBJID playerID, bool disba
UpdateTeamsOnWorld(team, false); UpdateTeamsOnWorld(team, false);
if (team->memberIDs.size() <= 1) if (team->memberIDs.size() <= 1) {
{
DisbandTeam(team); DisbandTeam(team);
} } else {
else if (playerID == team->leaderID) {
{
if (playerID == team->leaderID)
{
PromoteMember(team, team->memberIDs[0]); PromoteMember(team, team->memberIDs[0]);
} }
} }
} }
void PlayerContainer::PromoteMember(TeamData* team, LWOOBJID newLeader) void PlayerContainer::PromoteMember(TeamData* team, LWOOBJID newLeader) {
{
team->leaderID = newLeader; team->leaderID = newLeader;
for (const auto memberId : team->memberIDs) for (const auto memberId : team->memberIDs) {
{
auto* otherMember = GetPlayerData(memberId); auto* otherMember = GetPlayerData(memberId);
if (otherMember == nullptr) continue; if (otherMember == nullptr) continue;
@ -333,14 +299,12 @@ void PlayerContainer::PromoteMember(TeamData* team, LWOOBJID newLeader)
} }
} }
void PlayerContainer::DisbandTeam(TeamData* team) void PlayerContainer::DisbandTeam(TeamData* team) {
{
const auto index = std::find(mTeams.begin(), mTeams.end(), team); const auto index = std::find(mTeams.begin(), mTeams.end(), team);
if (index == mTeams.end()) return; if (index == mTeams.end()) return;
for (const auto memberId : team->memberIDs) for (const auto memberId : team->memberIDs) {
{
auto* otherMember = GetPlayerData(memberId); auto* otherMember = GetPlayerData(memberId);
if (otherMember == nullptr) continue; if (otherMember == nullptr) continue;
@ -358,8 +322,7 @@ void PlayerContainer::DisbandTeam(TeamData* team)
delete team; delete team;
} }
void PlayerContainer::TeamStatusUpdate(TeamData* team) void PlayerContainer::TeamStatusUpdate(TeamData* team) {
{
const auto index = std::find(mTeams.begin(), mTeams.end(), team); const auto index = std::find(mTeams.begin(), mTeams.end(), team);
if (index == mTeams.end()) return; if (index == mTeams.end()) return;
@ -370,14 +333,12 @@ void PlayerContainer::TeamStatusUpdate(TeamData* team)
const auto leaderName = GeneralUtils::ASCIIToUTF16(std::string(leader->playerName.c_str())); const auto leaderName = GeneralUtils::ASCIIToUTF16(std::string(leader->playerName.c_str()));
for (const auto memberId : team->memberIDs) for (const auto memberId : team->memberIDs) {
{
auto* otherMember = GetPlayerData(memberId); auto* otherMember = GetPlayerData(memberId);
if (otherMember == nullptr) continue; if (otherMember == nullptr) continue;
if (!team->local) if (!team->local) {
{
ChatPacketHandler::SendTeamStatus(otherMember, team->leaderID, leader->zoneID, team->lootFlag, 0, leaderName); ChatPacketHandler::SendTeamStatus(otherMember, team->leaderID, leader->zoneID, team->lootFlag, 0, leaderName);
} }
} }
@ -385,20 +346,17 @@ void PlayerContainer::TeamStatusUpdate(TeamData* team)
UpdateTeamsOnWorld(team, false); UpdateTeamsOnWorld(team, false);
} }
void PlayerContainer::UpdateTeamsOnWorld(TeamData* team, bool deleteTeam) void PlayerContainer::UpdateTeamsOnWorld(TeamData* team, bool deleteTeam) {
{
CBITSTREAM; CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_TEAM_UPDATE); PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_TEAM_UPDATE);
bitStream.Write(team->teamID); bitStream.Write(team->teamID);
bitStream.Write(deleteTeam); bitStream.Write(deleteTeam);
if (!deleteTeam) if (!deleteTeam) {
{
bitStream.Write(team->lootFlag); bitStream.Write(team->lootFlag);
bitStream.Write(static_cast<char>(team->memberIDs.size())); bitStream.Write(static_cast<char>(team->memberIDs.size()));
for (const auto memberID : team->memberIDs) for (const auto memberID : team->memberIDs) {
{
bitStream.Write(memberID); bitStream.Write(memberID);
} }
} }
@ -406,8 +364,7 @@ void PlayerContainer::UpdateTeamsOnWorld(TeamData* team, bool deleteTeam)
Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true); Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
} }
std::u16string PlayerContainer::GetName(LWOOBJID playerID) std::u16string PlayerContainer::GetName(LWOOBJID playerID) {
{
const auto& pair = mNames.find(playerID); const auto& pair = mNames.find(playerID);
if (pair == mNames.end()) return u""; if (pair == mNames.end()) return u"";
@ -415,12 +372,9 @@ std::u16string PlayerContainer::GetName(LWOOBJID playerID)
return pair->second; return pair->second;
} }
LWOOBJID PlayerContainer::GetId(const std::u16string& playerName) LWOOBJID PlayerContainer::GetId(const std::u16string& playerName) {
{ for (const auto& pair : mNames) {
for (const auto& pair : mNames) if (pair.second == playerName) {
{
if (pair.second == playerName)
{
return pair.first; return pair.first;
} }
} }
@ -428,7 +382,6 @@ LWOOBJID PlayerContainer::GetId(const std::u16string& playerName)
return LWOOBJID_EMPTY; return LWOOBJID_EMPTY;
} }
bool PlayerContainer::GetIsMuted(PlayerData* data) bool PlayerContainer::GetIsMuted(PlayerData* data) {
{
return data->muteExpire == 1 || data->muteExpire > time(NULL); return data->muteExpire == 1 || data->muteExpire > time(NULL);
} }

View File

@ -20,7 +20,7 @@ struct PlayerData {
struct TeamData { struct TeamData {
LWOOBJID teamID = LWOOBJID_EMPTY; // Internal use LWOOBJID teamID = LWOOBJID_EMPTY; // Internal use
LWOOBJID leaderID = LWOOBJID_EMPTY; LWOOBJID leaderID = LWOOBJID_EMPTY;
std::vector<LWOOBJID> memberIDs {}; std::vector<LWOOBJID> memberIDs{};
uint8_t lootFlag = 0; uint8_t lootFlag = 0;
bool local = false; bool local = false;
LWOZONEID zoneId = {}; LWOZONEID zoneId = {};

View File

@ -15,64 +15,64 @@ AMFValue* AMFDeserialize::Read(RakNet::BitStream* inStream) {
inStream->Read(marker); inStream->Read(marker);
// Based on the typing, create the value associated with that and return the base value class // Based on the typing, create the value associated with that and return the base value class
switch (marker) { switch (marker) {
case AMFValueType::AMFUndefined: { case AMFValueType::AMFUndefined: {
returnValue = new AMFUndefinedValue(); returnValue = new AMFUndefinedValue();
break; break;
} }
case AMFValueType::AMFNull: { case AMFValueType::AMFNull: {
returnValue = new AMFNullValue(); returnValue = new AMFNullValue();
break; break;
} }
case AMFValueType::AMFFalse: { case AMFValueType::AMFFalse: {
returnValue = new AMFFalseValue(); returnValue = new AMFFalseValue();
break; break;
} }
case AMFValueType::AMFTrue: { case AMFValueType::AMFTrue: {
returnValue = new AMFTrueValue(); returnValue = new AMFTrueValue();
break; break;
} }
case AMFValueType::AMFInteger: { case AMFValueType::AMFInteger: {
returnValue = ReadAmfInteger(inStream); returnValue = ReadAmfInteger(inStream);
break; break;
} }
case AMFValueType::AMFDouble: { case AMFValueType::AMFDouble: {
returnValue = ReadAmfDouble(inStream); returnValue = ReadAmfDouble(inStream);
break; break;
} }
case AMFValueType::AMFString: { case AMFValueType::AMFString: {
returnValue = ReadAmfString(inStream); returnValue = ReadAmfString(inStream);
break; break;
} }
case AMFValueType::AMFArray: { case AMFValueType::AMFArray: {
returnValue = ReadAmfArray(inStream); returnValue = ReadAmfArray(inStream);
break; break;
} }
// TODO We do not need these values, but if someone wants to implement them // TODO We do not need these values, but if someone wants to implement them
// then please do so and add the corresponding unit tests. // then please do so and add the corresponding unit tests.
case AMFValueType::AMFXMLDoc: case AMFValueType::AMFXMLDoc:
case AMFValueType::AMFDate: case AMFValueType::AMFDate:
case AMFValueType::AMFObject: case AMFValueType::AMFObject:
case AMFValueType::AMFXML: case AMFValueType::AMFXML:
case AMFValueType::AMFByteArray: case AMFValueType::AMFByteArray:
case AMFValueType::AMFVectorInt: case AMFValueType::AMFVectorInt:
case AMFValueType::AMFVectorUInt: case AMFValueType::AMFVectorUInt:
case AMFValueType::AMFVectorDouble: case AMFValueType::AMFVectorDouble:
case AMFValueType::AMFVectorObject: case AMFValueType::AMFVectorObject:
case AMFValueType::AMFDictionary: { case AMFValueType::AMFDictionary: {
throw static_cast<AMFValueType>(marker); throw static_cast<AMFValueType>(marker);
break; break;
} }
default: default:
throw static_cast<AMFValueType>(marker); throw static_cast<AMFValueType>(marker);
break; break;
} }
return returnValue; return returnValue;
} }
@ -128,10 +128,10 @@ AMFValue* AMFDeserialize::ReadAmfDouble(RakNet::BitStream* inStream) {
AMFValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream* inStream) { AMFValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream* inStream) {
auto arrayValue = new AMFArrayValue(); auto arrayValue = new AMFArrayValue();
// Read size of dense array // Read size of dense array
auto sizeOfDenseArray = (ReadU29(inStream) >> 1); auto sizeOfDenseArray = (ReadU29(inStream) >> 1);
// Then read Key'd portion // Then read Key'd portion
while (true) { while (true) {
auto key = ReadString(inStream); auto key = ReadString(inStream);
// No more values when we encounter an empty string // No more values when we encounter an empty string
@ -139,7 +139,7 @@ AMFValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream* inStream) {
arrayValue->InsertValue(key, Read(inStream)); arrayValue->InsertValue(key, Read(inStream));
} }
// Finally read dense portion // Finally read dense portion
for (uint32_t i = 0; i < sizeOfDenseArray; i++) { for (uint32_t i = 0; i < sizeOfDenseArray; i++) {
arrayValue->PushBackValue(Read(inStream)); arrayValue->PushBackValue(Read(inStream));
} }

View File

@ -7,65 +7,65 @@
class AMFValue; class AMFValue;
class AMFDeserialize { class AMFDeserialize {
public: public:
/** /**
* Read an AMF3 value from a bitstream. * Read an AMF3 value from a bitstream.
* *
* @param inStream inStream to read value from. * @param inStream inStream to read value from.
* @return Returns an AMFValue with all the information from the bitStream in it. * @return Returns an AMFValue with all the information from the bitStream in it.
*/ */
AMFValue* Read(RakNet::BitStream* inStream); AMFValue* Read(RakNet::BitStream* inStream);
private: private:
/** /**
* @brief Private method to read a U29 integer from a bitstream * @brief Private method to read a U29 integer from a bitstream
* *
* @param inStream bitstream to read data from * @param inStream bitstream to read data from
* @return The number as an unsigned 29 bit integer * @return The number as an unsigned 29 bit integer
*/ */
uint32_t ReadU29(RakNet::BitStream* inStream); uint32_t ReadU29(RakNet::BitStream* inStream);
/** /**
* @brief Reads a string from a bitstream * @brief Reads a string from a bitstream
* *
* @param inStream bitStream to read data from * @param inStream bitStream to read data from
* @return The read string * @return The read string
*/ */
std::string ReadString(RakNet::BitStream* inStream); std::string ReadString(RakNet::BitStream* inStream);
/**
* @brief Read an AMFDouble value from a bitStream
*
* @param inStream bitStream to read data from
* @return Double value represented as an AMFValue
*/
AMFValue* ReadAmfDouble(RakNet::BitStream* inStream);
/** /**
* @brief Read an AMFArray from a bitStream * @brief Read an AMFDouble value from a bitStream
* *
* @param inStream bitStream to read data from * @param inStream bitStream to read data from
* @return Array value represented as an AMFValue * @return Double value represented as an AMFValue
*/ */
AMFValue* ReadAmfArray(RakNet::BitStream* inStream); AMFValue* ReadAmfDouble(RakNet::BitStream* inStream);
/** /**
* @brief Read an AMFString from a bitStream * @brief Read an AMFArray from a bitStream
* *
* @param inStream bitStream to read data from * @param inStream bitStream to read data from
* @return String value represented as an AMFValue * @return Array value represented as an AMFValue
*/ */
AMFValue* ReadAmfString(RakNet::BitStream* inStream); AMFValue* ReadAmfArray(RakNet::BitStream* inStream);
/** /**
* @brief Read an AMFInteger from a bitStream * @brief Read an AMFString from a bitStream
* *
* @param inStream bitStream to read data from * @param inStream bitStream to read data from
* @return Integer value represented as an AMFValue * @return String value represented as an AMFValue
*/ */
AMFValue* ReadAmfInteger(RakNet::BitStream* inStream); AMFValue* ReadAmfString(RakNet::BitStream* inStream);
/** /**
* List of strings read so far saved to be read by reference. * @brief Read an AMFInteger from a bitStream
*/ *
std::vector<std::string> accessedElements; * @param inStream bitStream to read data from
* @return Integer value represented as an AMFValue
*/
AMFValue* ReadAmfInteger(RakNet::BitStream* inStream);
/**
* List of strings read so far saved to be read by reference.
*/
std::vector<std::string> accessedElements;
}; };

View File

@ -2,170 +2,170 @@
// AMFInteger // AMFInteger
void AMFIntegerValue::SetIntegerValue(uint32_t value) { void AMFIntegerValue::SetIntegerValue(uint32_t value) {
this->value = value; this->value = value;
} }
uint32_t AMFIntegerValue::GetIntegerValue() { uint32_t AMFIntegerValue::GetIntegerValue() {
return this->value; return this->value;
} }
// AMFDouble // AMFDouble
void AMFDoubleValue::SetDoubleValue(double value) { void AMFDoubleValue::SetDoubleValue(double value) {
this->value = value; this->value = value;
} }
double AMFDoubleValue::GetDoubleValue() { double AMFDoubleValue::GetDoubleValue() {
return this->value; return this->value;
} }
// AMFString // AMFString
void AMFStringValue::SetStringValue(const std::string& value) { void AMFStringValue::SetStringValue(const std::string& value) {
this->value = value; this->value = value;
} }
std::string AMFStringValue::GetStringValue() { std::string AMFStringValue::GetStringValue() {
return this->value; return this->value;
} }
// AMFXMLDoc // AMFXMLDoc
void AMFXMLDocValue::SetXMLDocValue(const std::string& value) { void AMFXMLDocValue::SetXMLDocValue(const std::string& value) {
this->xmlData = value; this->xmlData = value;
} }
std::string AMFXMLDocValue::GetXMLDocValue() { std::string AMFXMLDocValue::GetXMLDocValue() {
return this->xmlData; return this->xmlData;
} }
// AMFDate // AMFDate
void AMFDateValue::SetDateValue(uint64_t value) { void AMFDateValue::SetDateValue(uint64_t value) {
this->millisecondTimestamp = value; this->millisecondTimestamp = value;
} }
uint64_t AMFDateValue::GetDateValue() { uint64_t AMFDateValue::GetDateValue() {
return this->millisecondTimestamp; return this->millisecondTimestamp;
} }
// AMFArray Insert Value // AMFArray Insert Value
void AMFArrayValue::InsertValue(const std::string& key, AMFValue* value) { void AMFArrayValue::InsertValue(const std::string& key, AMFValue* value) {
this->associative.insert(std::make_pair(key, value)); this->associative.insert(std::make_pair(key, value));
} }
// AMFArray Remove Value // AMFArray Remove Value
void AMFArrayValue::RemoveValue(const std::string& key) { void AMFArrayValue::RemoveValue(const std::string& key) {
_AMFArrayMap_::iterator it = this->associative.find(key); _AMFArrayMap_::iterator it = this->associative.find(key);
if (it != this->associative.end()) { if (it != this->associative.end()) {
this->associative.erase(it); this->associative.erase(it);
} }
} }
// AMFArray Find Value // AMFArray Find Value
AMFValue* AMFArrayValue::FindValue(const std::string& key) { AMFValue* AMFArrayValue::FindValue(const std::string& key) {
_AMFArrayMap_::iterator it = this->associative.find(key); _AMFArrayMap_::iterator it = this->associative.find(key);
if (it != this->associative.end()) { if (it != this->associative.end()) {
return it->second; return it->second;
} }
return nullptr; return nullptr;
} }
// AMFArray Get Associative Iterator Begin // AMFArray Get Associative Iterator Begin
_AMFArrayMap_::iterator AMFArrayValue::GetAssociativeIteratorValueBegin() { _AMFArrayMap_::iterator AMFArrayValue::GetAssociativeIteratorValueBegin() {
return this->associative.begin(); return this->associative.begin();
} }
// AMFArray Get Associative Iterator End // AMFArray Get Associative Iterator End
_AMFArrayMap_::iterator AMFArrayValue::GetAssociativeIteratorValueEnd() { _AMFArrayMap_::iterator AMFArrayValue::GetAssociativeIteratorValueEnd() {
return this->associative.end(); return this->associative.end();
} }
// AMFArray Push Back Value // AMFArray Push Back Value
void AMFArrayValue::PushBackValue(AMFValue* value) { void AMFArrayValue::PushBackValue(AMFValue* value) {
this->dense.push_back(value); this->dense.push_back(value);
} }
// AMFArray Pop Back Value // AMFArray Pop Back Value
void AMFArrayValue::PopBackValue() { void AMFArrayValue::PopBackValue() {
this->dense.pop_back(); this->dense.pop_back();
} }
// AMFArray Get Dense List Size // AMFArray Get Dense List Size
uint32_t AMFArrayValue::GetDenseValueSize() { uint32_t AMFArrayValue::GetDenseValueSize() {
return (uint32_t)this->dense.size(); return (uint32_t)this->dense.size();
} }
// AMFArray Get value at index in Dense List // AMFArray Get value at index in Dense List
AMFValue* AMFArrayValue::GetValueAt(uint32_t index) { AMFValue* AMFArrayValue::GetValueAt(uint32_t index) {
return this->dense.at(index); return this->dense.at(index);
} }
// AMFArray Get Dense Iterator Begin // AMFArray Get Dense Iterator Begin
_AMFArrayList_::iterator AMFArrayValue::GetDenseIteratorBegin() { _AMFArrayList_::iterator AMFArrayValue::GetDenseIteratorBegin() {
return this->dense.begin(); return this->dense.begin();
} }
// AMFArray Get Dense Iterator End // AMFArray Get Dense Iterator End
_AMFArrayList_::iterator AMFArrayValue::GetDenseIteratorEnd() { _AMFArrayList_::iterator AMFArrayValue::GetDenseIteratorEnd() {
return this->dense.end(); return this->dense.end();
} }
AMFArrayValue::~AMFArrayValue() { AMFArrayValue::~AMFArrayValue() {
for (auto valueToDelete : GetDenseArray()) { for (auto valueToDelete : GetDenseArray()) {
if (valueToDelete) delete valueToDelete; if (valueToDelete) delete valueToDelete;
} }
for (auto valueToDelete : GetAssociativeMap()) { for (auto valueToDelete : GetAssociativeMap()) {
if (valueToDelete.second) delete valueToDelete.second; if (valueToDelete.second) delete valueToDelete.second;
} }
} }
// AMFObject Constructor // AMFObject Constructor
AMFObjectValue::AMFObjectValue(std::vector<std::pair<std::string, AMFValueType>> traits) { AMFObjectValue::AMFObjectValue(std::vector<std::pair<std::string, AMFValueType>> traits) {
this->traits.reserve(traits.size()); this->traits.reserve(traits.size());
std::vector<std::pair<std::string, AMFValueType>>::iterator it = traits.begin(); std::vector<std::pair<std::string, AMFValueType>>::iterator it = traits.begin();
while (it != traits.end()) { while (it != traits.end()) {
this->traits.insert(std::make_pair(it->first, std::make_pair(it->second, new AMFNullValue()))); this->traits.insert(std::make_pair(it->first, std::make_pair(it->second, new AMFNullValue())));
it++; it++;
} }
} }
// AMFObject Set Value // AMFObject Set Value
void AMFObjectValue::SetTraitValue(const std::string& trait, AMFValue* value) { void AMFObjectValue::SetTraitValue(const std::string& trait, AMFValue* value) {
if (value) { if (value) {
_AMFObjectTraits_::iterator it = this->traits.find(trait); _AMFObjectTraits_::iterator it = this->traits.find(trait);
if (it != this->traits.end()) { if (it != this->traits.end()) {
if (it->second.first == value->GetValueType()) { if (it->second.first == value->GetValueType()) {
it->second.second = value; it->second.second = value;
} }
} }
} }
} }
// AMFObject Get Value // AMFObject Get Value
AMFValue* AMFObjectValue::GetTraitValue(const std::string& trait) { AMFValue* AMFObjectValue::GetTraitValue(const std::string& trait) {
_AMFObjectTraits_::iterator it = this->traits.find(trait); _AMFObjectTraits_::iterator it = this->traits.find(trait);
if (it != this->traits.end()) { if (it != this->traits.end()) {
return it->second.second; return it->second.second;
} }
return nullptr; return nullptr;
} }
// AMFObject Get Trait Iterator Begin // AMFObject Get Trait Iterator Begin
_AMFObjectTraits_::iterator AMFObjectValue::GetTraitsIteratorBegin() { _AMFObjectTraits_::iterator AMFObjectValue::GetTraitsIteratorBegin() {
return this->traits.begin(); return this->traits.begin();
} }
// AMFObject Get Trait Iterator End // AMFObject Get Trait Iterator End
_AMFObjectTraits_::iterator AMFObjectValue::GetTraitsIteratorEnd() { _AMFObjectTraits_::iterator AMFObjectValue::GetTraitsIteratorEnd() {
return this->traits.end(); return this->traits.end();
} }
// AMFObject Get Trait Size // AMFObject Get Trait Size
uint32_t AMFObjectValue::GetTraitArrayCount() { uint32_t AMFObjectValue::GetTraitArrayCount() {
return (uint32_t)this->traits.size(); return (uint32_t)this->traits.size();
} }
AMFObjectValue::~AMFObjectValue() { AMFObjectValue::~AMFObjectValue() {
for (auto valueToDelete = GetTraitsIteratorBegin(); valueToDelete != GetTraitsIteratorEnd(); valueToDelete++) { for (auto valueToDelete = GetTraitsIteratorBegin(); valueToDelete != GetTraitsIteratorEnd(); valueToDelete++) {
if (valueToDelete->second.second) delete valueToDelete->second.second; if (valueToDelete->second.second) delete valueToDelete->second.second;
} }
} }

View File

@ -23,43 +23,43 @@ class AMFValue; // Forward declaration
//! An enum for each AMF value type //! An enum for each AMF value type
enum AMFValueType : unsigned char { enum AMFValueType : unsigned char {
AMFUndefined = 0x00, //!< An undefined AMF Value AMFUndefined = 0x00, //!< An undefined AMF Value
AMFNull = 0x01, //!< A null AMF value AMFNull = 0x01, //!< A null AMF value
AMFFalse = 0x02, //!< A false AMF value AMFFalse = 0x02, //!< A false AMF value
AMFTrue = 0x03, //!< A true AMF value AMFTrue = 0x03, //!< A true AMF value
AMFInteger = 0x04, //!< An integer AMF value AMFInteger = 0x04, //!< An integer AMF value
AMFDouble = 0x05, //!< A double AMF value AMFDouble = 0x05, //!< A double AMF value
AMFString = 0x06, //!< A string AMF value AMFString = 0x06, //!< A string AMF value
AMFXMLDoc = 0x07, //!< An XML Doc AMF value AMFXMLDoc = 0x07, //!< An XML Doc AMF value
AMFDate = 0x08, //!< A date AMF value AMFDate = 0x08, //!< A date AMF value
AMFArray = 0x09, //!< An array AMF value AMFArray = 0x09, //!< An array AMF value
AMFObject = 0x0A, //!< An object AMF value AMFObject = 0x0A, //!< An object AMF value
AMFXML = 0x0B, //!< An XML AMF value AMFXML = 0x0B, //!< An XML AMF value
AMFByteArray = 0x0C, //!< A byte array AMF value AMFByteArray = 0x0C, //!< A byte array AMF value
AMFVectorInt = 0x0D, //!< An integer vector AMF value AMFVectorInt = 0x0D, //!< An integer vector AMF value
AMFVectorUInt = 0x0E, //!< An unsigned integer AMF value AMFVectorUInt = 0x0E, //!< An unsigned integer AMF value
AMFVectorDouble = 0x0F, //!< A double vector AMF value AMFVectorDouble = 0x0F, //!< A double vector AMF value
AMFVectorObject = 0x10, //!< An object vector AMF value AMFVectorObject = 0x10, //!< An object vector AMF value
AMFDictionary = 0x11 //!< A dictionary AMF value AMFDictionary = 0x11 //!< A dictionary AMF value
}; };
//! An enum for the object value types //! An enum for the object value types
enum AMFObjectValueType : unsigned char { enum AMFObjectValueType : unsigned char {
AMFObjectAnonymous = 0x01, AMFObjectAnonymous = 0x01,
AMFObjectTyped = 0x02, AMFObjectTyped = 0x02,
AMFObjectDynamic = 0x03, AMFObjectDynamic = 0x03,
AMFObjectExternalizable = 0x04 AMFObjectExternalizable = 0x04
}; };
//! The base AMF value class //! The base AMF value class
class AMFValue { class AMFValue {
public: public:
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
virtual AMFValueType GetValueType() = 0; virtual AMFValueType GetValueType() = 0;
virtual ~AMFValue() {}; virtual ~AMFValue() {};
}; };
//! A typedef for a pointer to an AMF value //! A typedef for a pointer to an AMF value
@ -71,314 +71,314 @@ typedef AMFValue* NDGFxValue;
//! The undefined value AMF type //! The undefined value AMF type
class AMFUndefinedValue : public AMFValue { class AMFUndefinedValue : public AMFValue {
private: private:
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFUndefined; } AMFValueType GetValueType() { return AMFUndefined; }
}; };
//! The null value AMF type //! The null value AMF type
class AMFNullValue : public AMFValue { class AMFNullValue : public AMFValue {
private: private:
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFNull; } AMFValueType GetValueType() { return AMFNull; }
}; };
//! The false value AMF type //! The false value AMF type
class AMFFalseValue : public AMFValue { class AMFFalseValue : public AMFValue {
private: private:
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFFalse; } AMFValueType GetValueType() { return AMFFalse; }
}; };
//! The true value AMF type //! The true value AMF type
class AMFTrueValue : public AMFValue { class AMFTrueValue : public AMFValue {
private: private:
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFTrue; } AMFValueType GetValueType() { return AMFTrue; }
}; };
//! The integer value AMF type //! The integer value AMF type
class AMFIntegerValue : public AMFValue { class AMFIntegerValue : public AMFValue {
private: private:
uint32_t value; //!< The value of the AMF type uint32_t value; //!< The value of the AMF type
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFInteger; } AMFValueType GetValueType() { return AMFInteger; }
public: public:
//! Sets the integer value //! Sets the integer value
/*! /*!
\param value The value to set \param value The value to set
*/ */
void SetIntegerValue(uint32_t value); void SetIntegerValue(uint32_t value);
//! Gets the integer value //! Gets the integer value
/*! /*!
\return The integer value \return The integer value
*/ */
uint32_t GetIntegerValue(); uint32_t GetIntegerValue();
}; };
//! The double value AMF type //! The double value AMF type
class AMFDoubleValue : public AMFValue { class AMFDoubleValue : public AMFValue {
private: private:
double value; //!< The value of the AMF type double value; //!< The value of the AMF type
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFDouble; } AMFValueType GetValueType() { return AMFDouble; }
public: public:
//! Sets the double value //! Sets the double value
/*! /*!
\param value The value to set to \param value The value to set to
*/ */
void SetDoubleValue(double value); void SetDoubleValue(double value);
//! Gets the double value //! Gets the double value
/*! /*!
\return The double value \return The double value
*/ */
double GetDoubleValue(); double GetDoubleValue();
}; };
//! The string value AMF type //! The string value AMF type
class AMFStringValue : public AMFValue { class AMFStringValue : public AMFValue {
private: private:
std::string value; //!< The value of the AMF type std::string value; //!< The value of the AMF type
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFString; } AMFValueType GetValueType() { return AMFString; }
public: public:
//! Sets the string value //! Sets the string value
/*! /*!
\param value The string value to set to \param value The string value to set to
*/ */
void SetStringValue(const std::string& value); void SetStringValue(const std::string& value);
//! Gets the string value //! Gets the string value
/*! /*!
\return The string value \return The string value
*/ */
std::string GetStringValue(); std::string GetStringValue();
}; };
//! The XML doc value AMF type //! The XML doc value AMF type
class AMFXMLDocValue : public AMFValue { class AMFXMLDocValue : public AMFValue {
private: private:
std::string xmlData; //!< The value of the AMF type std::string xmlData; //!< The value of the AMF type
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFXMLDoc; } AMFValueType GetValueType() { return AMFXMLDoc; }
public: public:
//! Sets the XML Doc value //! Sets the XML Doc value
/*! /*!
\param value The value to set to \param value The value to set to
*/ */
void SetXMLDocValue(const std::string& value); void SetXMLDocValue(const std::string& value);
//! Gets the XML Doc value //! Gets the XML Doc value
/*! /*!
\return The XML Doc value \return The XML Doc value
*/ */
std::string GetXMLDocValue(); std::string GetXMLDocValue();
}; };
//! The date value AMF type //! The date value AMF type
class AMFDateValue : public AMFValue { class AMFDateValue : public AMFValue {
private: private:
uint64_t millisecondTimestamp; //!< The time in milliseconds since the ephoch uint64_t millisecondTimestamp; //!< The time in milliseconds since the ephoch
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFDate; } AMFValueType GetValueType() { return AMFDate; }
public: public:
//! Sets the date time //! Sets the date time
/*! /*!
\param value The value to set to \param value The value to set to
*/ */
void SetDateValue(uint64_t value); void SetDateValue(uint64_t value);
//! Gets the date value //! Gets the date value
/*! /*!
\return The date value in milliseconds since the epoch \return The date value in milliseconds since the epoch
*/ */
uint64_t GetDateValue(); uint64_t GetDateValue();
}; };
//! The array value AMF type //! The array value AMF type
// This object will manage it's own memory map and list. Do not delete its values. // This object will manage it's own memory map and list. Do not delete its values.
class AMFArrayValue : public AMFValue { class AMFArrayValue : public AMFValue {
private: private:
_AMFArrayMap_ associative; //!< The array map (associative part) _AMFArrayMap_ associative; //!< The array map (associative part)
_AMFArrayList_ dense; //!< The array list (dense part) _AMFArrayList_ dense; //!< The array list (dense part)
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFArray; } AMFValueType GetValueType() { return AMFArray; }
public: public:
~AMFArrayValue() override; ~AMFArrayValue() override;
//! Inserts an item into the array map for a specific key //! Inserts an item into the array map for a specific key
/*! /*!
\param key The key to set \param key The key to set
\param value The value to add \param value The value to add
*/ */
void InsertValue(const std::string& key, AMFValue* value); void InsertValue(const std::string& key, AMFValue* value);
//! Removes an item for a specific key
/*!
\param key The key to remove
*/
void RemoveValue(const std::string& key);
//! Finds an AMF value
/*!
\return The AMF value if found, nullptr otherwise
*/
AMFValue* FindValue(const std::string& key);
//! Returns where the associative iterator begins
/*!
\return Where the array map iterator begins
*/
_AMFArrayMap_::iterator GetAssociativeIteratorValueBegin();
//! Returns where the associative iterator ends
/*!
\return Where the array map iterator ends
*/
_AMFArrayMap_::iterator GetAssociativeIteratorValueEnd();
//! Pushes back a value into the array list
/*!
\param value The value to push back
*/
void PushBackValue(AMFValue* value);
//! Pops back the last value in the array list
void PopBackValue();
//! Gets the count of the dense list
/*!
\return The dense list size
*/
uint32_t GetDenseValueSize();
//! Gets a specific value from the list for the specified index
/*!
\param index The index to get
*/
AMFValue* GetValueAt(uint32_t index);
//! Returns where the dense iterator begins
/*!
\return Where the iterator begins
*/
_AMFArrayList_::iterator GetDenseIteratorBegin();
//! Returns where the dense iterator ends
/*!
\return Where the iterator ends
*/
_AMFArrayList_::iterator GetDenseIteratorEnd();
//! Returns the associative map //! Removes an item for a specific key
/*! /*!
\return The associative map \param key The key to remove
*/ */
_AMFArrayMap_ GetAssociativeMap() { return this->associative; }; void RemoveValue(const std::string& key);
//! Returns the dense array //! Finds an AMF value
/*! /*!
\return The dense array \return The AMF value if found, nullptr otherwise
*/ */
_AMFArrayList_ GetDenseArray() { return this->dense; }; AMFValue* FindValue(const std::string& key);
//! Returns where the associative iterator begins
/*!
\return Where the array map iterator begins
*/
_AMFArrayMap_::iterator GetAssociativeIteratorValueBegin();
//! Returns where the associative iterator ends
/*!
\return Where the array map iterator ends
*/
_AMFArrayMap_::iterator GetAssociativeIteratorValueEnd();
//! Pushes back a value into the array list
/*!
\param value The value to push back
*/
void PushBackValue(AMFValue* value);
//! Pops back the last value in the array list
void PopBackValue();
//! Gets the count of the dense list
/*!
\return The dense list size
*/
uint32_t GetDenseValueSize();
//! Gets a specific value from the list for the specified index
/*!
\param index The index to get
*/
AMFValue* GetValueAt(uint32_t index);
//! Returns where the dense iterator begins
/*!
\return Where the iterator begins
*/
_AMFArrayList_::iterator GetDenseIteratorBegin();
//! Returns where the dense iterator ends
/*!
\return Where the iterator ends
*/
_AMFArrayList_::iterator GetDenseIteratorEnd();
//! Returns the associative map
/*!
\return The associative map
*/
_AMFArrayMap_ GetAssociativeMap() { return this->associative; };
//! Returns the dense array
/*!
\return The dense array
*/
_AMFArrayList_ GetDenseArray() { return this->dense; };
}; };
//! The anonymous object value AMF type //! The anonymous object value AMF type
class AMFObjectValue : public AMFValue { class AMFObjectValue : public AMFValue {
private: private:
_AMFObjectTraits_ traits; //!< The object traits _AMFObjectTraits_ traits; //!< The object traits
//! Returns the AMF value type //! Returns the AMF value type
/*! /*!
\return The AMF value type \return The AMF value type
*/ */
AMFValueType GetValueType() { return AMFObject; } AMFValueType GetValueType() { return AMFObject; }
~AMFObjectValue() override; ~AMFObjectValue() override;
public: public:
//! Constructor //! Constructor
/*! /*!
\param traits The traits to set \param traits The traits to set
*/ */
AMFObjectValue(std::vector<std::pair<std::string, AMFValueType>> traits); AMFObjectValue(std::vector<std::pair<std::string, AMFValueType>> traits);
//! Gets the object value type //! Gets the object value type
/*! /*!
\return The object value type \return The object value type
*/ */
virtual AMFObjectValueType GetObjectValueType() { return AMFObjectAnonymous; } virtual AMFObjectValueType GetObjectValueType() { return AMFObjectAnonymous; }
//! Sets the value of a trait //! Sets the value of a trait
/*! /*!
\param trait The trait to set the value for \param trait The trait to set the value for
\param value The AMF value to set \param value The AMF value to set
*/ */
void SetTraitValue(const std::string& trait, AMFValue* value); void SetTraitValue(const std::string& trait, AMFValue* value);
//! Gets a trait value //! Gets a trait value
/*! /*!
\param trait The trait to get the value for \param trait The trait to get the value for
\return The trait value \return The trait value
*/ */
AMFValue* GetTraitValue(const std::string& trait); AMFValue* GetTraitValue(const std::string& trait);
//! Gets the beginning of the object traits iterator //! Gets the beginning of the object traits iterator
/*! /*!
\return The AMF trait array iterator begin \return The AMF trait array iterator begin
*/ */
_AMFObjectTraits_::iterator GetTraitsIteratorBegin(); _AMFObjectTraits_::iterator GetTraitsIteratorBegin();
//! Gets the end of the object traits iterator //! Gets the end of the object traits iterator
/*! /*!
\return The AMF trait array iterator begin \return The AMF trait array iterator begin
*/ */
_AMFObjectTraits_::iterator GetTraitsIteratorEnd(); _AMFObjectTraits_::iterator GetTraitsIteratorEnd();
//! Gets the amount of traits //! Gets the amount of traits
/*! /*!
\return The amount of traits \return The amount of traits
*/ */
uint32_t GetTraitArrayCount(); uint32_t GetTraitArrayCount();
}; };

View File

@ -5,73 +5,73 @@ template<>
void RakNet::BitStream::Write<AMFValue*>(AMFValue* value) { void RakNet::BitStream::Write<AMFValue*>(AMFValue* value) {
if (value != nullptr) { if (value != nullptr) {
AMFValueType type = value->GetValueType(); AMFValueType type = value->GetValueType();
switch (type) { switch (type) {
case AMFUndefined: { case AMFUndefined: {
AMFUndefinedValue* v = (AMFUndefinedValue*)value; AMFUndefinedValue* v = (AMFUndefinedValue*)value;
this->Write(*v); this->Write(*v);
break; break;
} }
case AMFNull: {
AMFNullValue* v = (AMFNullValue*)value;
this->Write(*v);
break;
}
case AMFFalse: {
AMFFalseValue* v = (AMFFalseValue*)value;
this->Write(*v);
break;
}
case AMFTrue: {
AMFTrueValue* v = (AMFTrueValue*)value;
this->Write(*v);
break;
}
case AMFInteger: {
AMFIntegerValue* v = (AMFIntegerValue*)value;
this->Write(*v);
break;
}
case AMFDouble: { case AMFNull: {
AMFDoubleValue* v = (AMFDoubleValue*)value; AMFNullValue* v = (AMFNullValue*)value;
this->Write(*v); this->Write(*v);
break; break;
} }
case AMFString: { case AMFFalse: {
AMFStringValue* v = (AMFStringValue*)value; AMFFalseValue* v = (AMFFalseValue*)value;
this->Write(*v); this->Write(*v);
break; break;
} }
case AMFXMLDoc: { case AMFTrue: {
AMFXMLDocValue* v = (AMFXMLDocValue*)value; AMFTrueValue* v = (AMFTrueValue*)value;
this->Write(*v); this->Write(*v);
break; break;
} }
case AMFDate: { case AMFInteger: {
AMFDateValue* v = (AMFDateValue*)value; AMFIntegerValue* v = (AMFIntegerValue*)value;
this->Write(*v); this->Write(*v);
break; break;
} }
case AMFArray: { case AMFDouble: {
this->Write((AMFArrayValue*)value); AMFDoubleValue* v = (AMFDoubleValue*)value;
break; this->Write(*v);
} break;
}
case AMFString: {
AMFStringValue* v = (AMFStringValue*)value;
this->Write(*v);
break;
}
case AMFXMLDoc: {
AMFXMLDocValue* v = (AMFXMLDocValue*)value;
this->Write(*v);
break;
}
case AMFDate: {
AMFDateValue* v = (AMFDateValue*)value;
this->Write(*v);
break;
}
case AMFArray: {
this->Write((AMFArrayValue*)value);
break;
}
} }
} }
} }
/** /**
* A private function to write an value to a RakNet::BitStream * A private function to write an value to a RakNet::BitStream
* RakNet writes in the correct byte order - do not reverse this. * RakNet writes in the correct byte order - do not reverse this.
*/ */
void WriteUInt29(RakNet::BitStream* bs, uint32_t v) { void WriteUInt29(RakNet::BitStream* bs, uint32_t v) {
unsigned char b4 = (unsigned char)v; unsigned char b4 = (unsigned char)v;
@ -87,70 +87,70 @@ void WriteUInt29(RakNet::BitStream* bs, uint32_t v) {
b2 = ((unsigned char)(v)) | 0x80; b2 = ((unsigned char)(v)) | 0x80;
bs->Write(b2); bs->Write(b2);
} }
bs->Write(b3); bs->Write(b3);
} }
} else { } else {
unsigned char b1; unsigned char b1;
unsigned char b2; unsigned char b2;
unsigned char b3; unsigned char b3;
v = v >> 8; v = v >> 8;
b3 = ((unsigned char)(v)) | 0x80; b3 = ((unsigned char)(v)) | 0x80;
v = v >> 7; v = v >> 7;
b2 = ((unsigned char)(v)) | 0x80; b2 = ((unsigned char)(v)) | 0x80;
v = v >> 7; v = v >> 7;
b1 = ((unsigned char)(v)) | 0x80; b1 = ((unsigned char)(v)) | 0x80;
bs->Write(b1); bs->Write(b1);
bs->Write(b2); bs->Write(b2);
bs->Write(b3); bs->Write(b3);
} }
bs->Write(b4); bs->Write(b4);
} }
/** /**
* Writes a flag number to a RakNet::BitStream * Writes a flag number to a RakNet::BitStream
* RakNet writes in the correct byte order - do not reverse this. * RakNet writes in the correct byte order - do not reverse this.
*/ */
void WriteFlagNumber(RakNet::BitStream* bs, uint32_t v) { void WriteFlagNumber(RakNet::BitStream* bs, uint32_t v) {
v = (v << 1) | 0x01; v = (v << 1) | 0x01;
WriteUInt29(bs, v); WriteUInt29(bs, v);
} }
/** /**
* Writes an AMFString to a RakNet::BitStream * Writes an AMFString to a RakNet::BitStream
* *
* RakNet writes in the correct byte order - do not reverse this. * RakNet writes in the correct byte order - do not reverse this.
*/ */
void WriteAMFString(RakNet::BitStream* bs, const std::string& str) { void WriteAMFString(RakNet::BitStream* bs, const std::string& str) {
WriteFlagNumber(bs, (uint32_t)str.size()); WriteFlagNumber(bs, (uint32_t)str.size());
bs->Write(str.c_str(), (uint32_t)str.size()); bs->Write(str.c_str(), (uint32_t)str.size());
} }
/** /**
* Writes an U16 to a bitstream * Writes an U16 to a bitstream
* *
* RakNet writes in the correct byte order - do not reverse this. * RakNet writes in the correct byte order - do not reverse this.
*/ */
void WriteAMFU16(RakNet::BitStream* bs, uint16_t value) { void WriteAMFU16(RakNet::BitStream* bs, uint16_t value) {
bs->Write(value); bs->Write(value);
} }
/** /**
* Writes an U32 to a bitstream * Writes an U32 to a bitstream
* *
* RakNet writes in the correct byte order - do not reverse this. * RakNet writes in the correct byte order - do not reverse this.
*/ */
void WriteAMFU32(RakNet::BitStream* bs, uint32_t value) { void WriteAMFU32(RakNet::BitStream* bs, uint32_t value) {
bs->Write(value); bs->Write(value);
} }
/** /**
* Writes an U64 to a bitstream * Writes an U64 to a bitstream
* *
* RakNet writes in the correct byte order - do not reverse this. * RakNet writes in the correct byte order - do not reverse this.
*/ */
void WriteAMFU64(RakNet::BitStream* bs, uint64_t value) { void WriteAMFU64(RakNet::BitStream* bs, uint64_t value) {
bs->Write(value); bs->Write(value);
@ -193,7 +193,7 @@ template<>
void RakNet::BitStream::Write<AMFDoubleValue>(AMFDoubleValue value) { void RakNet::BitStream::Write<AMFDoubleValue>(AMFDoubleValue value) {
this->Write(AMFDouble); this->Write(AMFDouble);
double d = value.GetDoubleValue(); double d = value.GetDoubleValue();
WriteAMFU64(this, *((unsigned long long*)&d)); WriteAMFU64(this, *((unsigned long long*) & d));
} }
// Writes an AMFStringValue to BitStream // Writes an AMFStringValue to BitStream
@ -226,22 +226,22 @@ void RakNet::BitStream::Write<AMFArrayValue*>(AMFArrayValue* value) {
this->Write(AMFArray); this->Write(AMFArray);
uint32_t denseSize = value->GetDenseValueSize(); uint32_t denseSize = value->GetDenseValueSize();
WriteFlagNumber(this, denseSize); WriteFlagNumber(this, denseSize);
_AMFArrayMap_::iterator it = value->GetAssociativeIteratorValueBegin(); _AMFArrayMap_::iterator it = value->GetAssociativeIteratorValueBegin();
_AMFArrayMap_::iterator end = value->GetAssociativeIteratorValueEnd(); _AMFArrayMap_::iterator end = value->GetAssociativeIteratorValueEnd();
while (it != end) { while (it != end) {
WriteAMFString(this, it->first); WriteAMFString(this, it->first);
this->Write(it->second); this->Write(it->second);
it++; it++;
} }
this->Write(AMFNull); this->Write(AMFNull);
if (denseSize > 0) { if (denseSize > 0) {
_AMFArrayList_::iterator it2 = value->GetDenseIteratorBegin(); _AMFArrayList_::iterator it2 = value->GetDenseIteratorBegin();
_AMFArrayList_::iterator end2 = value->GetDenseIteratorEnd(); _AMFArrayList_::iterator end2 = value->GetDenseIteratorEnd();
while (it2 != end2) { while (it2 != end2) {
this->Write(*it2); this->Write(*it2);
it2++; it2++;

View File

@ -11,7 +11,7 @@
\brief A class that implements native writing of AMF values to RakNet::BitStream \brief A class that implements native writing of AMF values to RakNet::BitStream
*/ */
// We are using the RakNet namespace // We are using the RakNet namespace
namespace RakNet { namespace RakNet {
//! Writes an AMFValue pointer to a RakNet::BitStream //! Writes an AMFValue pointer to a RakNet::BitStream
/*! /*!
@ -19,70 +19,70 @@ namespace RakNet {
*/ */
template <> template <>
void RakNet::BitStream::Write<AMFValue*>(AMFValue* value); void RakNet::BitStream::Write<AMFValue*>(AMFValue* value);
//! Writes an AMFUndefinedValue to a RakNet::BitStream //! Writes an AMFUndefinedValue to a RakNet::BitStream
/*! /*!
\param value The value to write \param value The value to write
*/ */
template <> template <>
void RakNet::BitStream::Write<AMFUndefinedValue>(AMFUndefinedValue value); void RakNet::BitStream::Write<AMFUndefinedValue>(AMFUndefinedValue value);
//! Writes an AMFNullValue to a RakNet::BitStream //! Writes an AMFNullValue to a RakNet::BitStream
/*! /*!
\param value The value to write \param value The value to write
*/ */
template <> template <>
void RakNet::BitStream::Write<AMFNullValue>(AMFNullValue value); void RakNet::BitStream::Write<AMFNullValue>(AMFNullValue value);
//! Writes an AMFFalseValue to a RakNet::BitStream //! Writes an AMFFalseValue to a RakNet::BitStream
/*! /*!
\param value The value to write \param value The value to write
*/ */
template <> template <>
void RakNet::BitStream::Write<AMFFalseValue>(AMFFalseValue value); void RakNet::BitStream::Write<AMFFalseValue>(AMFFalseValue value);
//! Writes an AMFTrueValue to a RakNet::BitStream //! Writes an AMFTrueValue to a RakNet::BitStream
/*! /*!
\param value The value to write \param value The value to write
*/ */
template <> template <>
void RakNet::BitStream::Write<AMFTrueValue>(AMFTrueValue value); void RakNet::BitStream::Write<AMFTrueValue>(AMFTrueValue value);
//! Writes an AMFIntegerValue to a RakNet::BitStream //! Writes an AMFIntegerValue to a RakNet::BitStream
/*! /*!
\param value The value to write \param value The value to write
*/ */
template <> template <>
void RakNet::BitStream::Write<AMFIntegerValue>(AMFIntegerValue value); void RakNet::BitStream::Write<AMFIntegerValue>(AMFIntegerValue value);
//! Writes an AMFDoubleValue to a RakNet::BitStream //! Writes an AMFDoubleValue to a RakNet::BitStream
/*! /*!
\param value The value to write \param value The value to write
*/ */
template <> template <>
void RakNet::BitStream::Write<AMFDoubleValue>(AMFDoubleValue value); void RakNet::BitStream::Write<AMFDoubleValue>(AMFDoubleValue value);
//! Writes an AMFStringValue to a RakNet::BitStream //! Writes an AMFStringValue to a RakNet::BitStream
/*! /*!
\param value The value to write \param value The value to write
*/ */
template <> template <>
void RakNet::BitStream::Write<AMFStringValue>(AMFStringValue value); void RakNet::BitStream::Write<AMFStringValue>(AMFStringValue value);
//! Writes an AMFXMLDocValue to a RakNet::BitStream //! Writes an AMFXMLDocValue to a RakNet::BitStream
/*! /*!
\param value The value to write \param value The value to write
*/ */
template <> template <>
void RakNet::BitStream::Write<AMFXMLDocValue>(AMFXMLDocValue value); void RakNet::BitStream::Write<AMFXMLDocValue>(AMFXMLDocValue value);
//! Writes an AMFDateValue to a RakNet::BitStream //! Writes an AMFDateValue to a RakNet::BitStream
/*! /*!
\param value The value to write \param value The value to write
*/ */
template <> template <>
void RakNet::BitStream::Write<AMFDateValue>(AMFDateValue value); void RakNet::BitStream::Write<AMFDateValue>(AMFDateValue value);
//! Writes an AMFArrayValue to a RakNet::BitStream //! Writes an AMFArrayValue to a RakNet::BitStream
/*! /*!
\param value The value to write \param value The value to write

View File

@ -10,7 +10,7 @@ void BinaryIO::WriteString(const std::string& stringToWrite, std::ofstream& outs
} }
//For reading null-terminated strings //For reading null-terminated strings
std::string BinaryIO::ReadString(std::ifstream & instream) { std::string BinaryIO::ReadString(std::ifstream& instream) {
std::string toReturn; std::string toReturn;
char buffer; char buffer;
@ -37,7 +37,7 @@ std::string BinaryIO::ReadString(std::ifstream& instream, size_t size) {
return toReturn; return toReturn;
} }
std::string BinaryIO::ReadWString(std::ifstream & instream) { std::string BinaryIO::ReadWString(std::ifstream& instream) {
size_t size; size_t size;
BinaryRead(instream, size); BinaryRead(instream, size);
//toReturn.resize(size); //toReturn.resize(size);

View File

@ -9,15 +9,15 @@ namespace BinaryIO {
} }
template<typename T> template<typename T>
std::istream & BinaryRead(std::istream& stream, T& value) { std::istream& BinaryRead(std::istream& stream, T& value) {
if (!stream.good()) if (!stream.good())
printf("bla"); printf("bla");
return stream.read(reinterpret_cast<char*>(&value), sizeof(T)); return stream.read(reinterpret_cast<char*>(&value), sizeof(T));
} }
void WriteString(const std::string& stringToWrite, std::ofstream& outstream); void WriteString(const std::string& stringToWrite, std::ofstream& outstream);
std::string ReadString(std::ifstream & instream); std::string ReadString(std::ifstream& instream);
std::string ReadString(std::ifstream& instream, size_t size); std::string ReadString(std::ifstream& instream, size_t size);
std::string ReadWString(std::ifstream& instream); std::string ReadWString(std::ifstream& instream);

View File

@ -10,51 +10,51 @@
#include "dLogger.h" #include "dLogger.h"
void make_minidump(EXCEPTION_POINTERS* e) { void make_minidump(EXCEPTION_POINTERS* e) {
auto hDbgHelp = LoadLibraryA("dbghelp"); auto hDbgHelp = LoadLibraryA("dbghelp");
if (hDbgHelp == nullptr) if (hDbgHelp == nullptr)
return; return;
auto pMiniDumpWriteDump = (decltype(&MiniDumpWriteDump))GetProcAddress(hDbgHelp, "MiniDumpWriteDump"); auto pMiniDumpWriteDump = (decltype(&MiniDumpWriteDump))GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
if (pMiniDumpWriteDump == nullptr) if (pMiniDumpWriteDump == nullptr)
return; return;
char name[MAX_PATH]; char name[MAX_PATH];
{ {
auto nameEnd = name + GetModuleFileNameA(GetModuleHandleA(0), name, MAX_PATH); auto nameEnd = name + GetModuleFileNameA(GetModuleHandleA(0), name, MAX_PATH);
SYSTEMTIME t; SYSTEMTIME t;
GetSystemTime(&t); GetSystemTime(&t);
wsprintfA(nameEnd - strlen(".exe"), wsprintfA(nameEnd - strlen(".exe"),
"_%4d%02d%02d_%02d%02d%02d.dmp", "_%4d%02d%02d_%02d%02d%02d.dmp",
t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond); t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond);
} }
auto hFile = CreateFileA(name, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); auto hFile = CreateFileA(name, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE) if (hFile == INVALID_HANDLE_VALUE)
return; return;
MINIDUMP_EXCEPTION_INFORMATION exceptionInfo; MINIDUMP_EXCEPTION_INFORMATION exceptionInfo;
exceptionInfo.ThreadId = GetCurrentThreadId(); exceptionInfo.ThreadId = GetCurrentThreadId();
exceptionInfo.ExceptionPointers = e; exceptionInfo.ExceptionPointers = e;
exceptionInfo.ClientPointers = FALSE; exceptionInfo.ClientPointers = FALSE;
auto dumped = pMiniDumpWriteDump( auto dumped = pMiniDumpWriteDump(
GetCurrentProcess(), GetCurrentProcess(),
GetCurrentProcessId(), GetCurrentProcessId(),
hFile, hFile,
MINIDUMP_TYPE(MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory), MINIDUMP_TYPE(MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory),
e ? &exceptionInfo : nullptr, e ? &exceptionInfo : nullptr,
nullptr, nullptr,
nullptr); nullptr);
CloseHandle(hFile); CloseHandle(hFile);
return; return;
} }
LONG CALLBACK unhandled_handler(EXCEPTION_POINTERS* e) { LONG CALLBACK unhandled_handler(EXCEPTION_POINTERS* e) {
make_minidump(e); make_minidump(e);
if (Game::logger) if (Game::logger)
Game::logger->Flush(); // Flush our log if we have one, before exiting. Game::logger->Flush(); // Flush our log if we have one, before exiting.
return EXCEPTION_CONTINUE_SEARCH; return EXCEPTION_CONTINUE_SEARCH;
} }
#endif #endif
@ -75,146 +75,146 @@ LONG CALLBACK unhandled_handler(EXCEPTION_POINTERS* e) {
#include <backtrace-supported.h> #include <backtrace-supported.h>
struct bt_ctx { struct bt_ctx {
struct backtrace_state* state; struct backtrace_state* state;
int error; int error;
}; };
static inline void Bt(struct backtrace_state* state) { static inline void Bt(struct backtrace_state* state) {
std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log"; std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log";
FILE* file = fopen(fileName.c_str(), "w+"); FILE* file = fopen(fileName.c_str(), "w+");
if (file != nullptr) { if (file != nullptr) {
backtrace_print(state, 2, file); backtrace_print(state, 2, file);
fclose(file); fclose(file);
} }
backtrace_print(state, 2, stdout); backtrace_print(state, 2, stdout);
} }
static void ErrorCallback(void* data, const char* msg, int errnum) { static void ErrorCallback(void* data, const char* msg, int errnum) {
auto* ctx = (struct bt_ctx*)data; auto* ctx = (struct bt_ctx*)data;
fprintf(stderr, "ERROR: %s (%d)", msg, errnum); fprintf(stderr, "ERROR: %s (%d)", msg, errnum);
ctx->error = 1; ctx->error = 1;
std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log"; std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log";
FILE* file = fopen(fileName.c_str(), "w+"); FILE* file = fopen(fileName.c_str(), "w+");
if (file != nullptr) { if (file != nullptr) {
fprintf(file, "ERROR: %s (%d)", msg, errnum); fprintf(file, "ERROR: %s (%d)", msg, errnum);
fclose(file); fclose(file);
} }
} }
#endif #endif
#include "Type.h" #include "Type.h"
void GenerateDump() { void GenerateDump() {
std::string cmd = "sudo gcore " + std::to_string(getpid()); std::string cmd = "sudo gcore " + std::to_string(getpid());
system(cmd.c_str()); system(cmd.c_str());
} }
void CatchUnhandled(int sig) { void CatchUnhandled(int sig) {
#ifndef __include_backtrace__ #ifndef __include_backtrace__
if (Diagnostics::GetProduceMemoryDump()) { if (Diagnostics::GetProduceMemoryDump()) {
GenerateDump(); GenerateDump();
} }
void* array[10]; void* array[10];
size_t size; size_t size;
// get void*'s for all entries on the stack // get void*'s for all entries on the stack
size = backtrace(array, 10); size = backtrace(array, 10);
printf("Fatal error %i\nStacktrace:\n", sig); printf("Fatal error %i\nStacktrace:\n", sig);
#if defined(__GNUG__) and defined(__dynamic) #if defined(__GNUG__) and defined(__dynamic)
// Loop through the returned addresses, and get the symbols to be demangled // Loop through the returned addresses, and get the symbols to be demangled
char** strings = backtrace_symbols(array, size); char** strings = backtrace_symbols(array, size);
// Print the stack trace // Print the stack trace
for (size_t i = 0; i < size; i++) { for (size_t i = 0; i < size; i++) {
// Take a string like './WorldServer(_ZN19SlashCommandHandler17HandleChatCommandERKSbIDsSt11char_traitsIDsESaIDsEEP6EntityRK13SystemAddress+0x6187) [0x55869c44ecf7]' and extract the function name // Take a string like './WorldServer(_ZN19SlashCommandHandler17HandleChatCommandERKSbIDsSt11char_traitsIDsESaIDsEEP6EntityRK13SystemAddress+0x6187) [0x55869c44ecf7]' and extract the function name
std::string functionName = strings[i]; std::string functionName = strings[i];
std::string::size_type start = functionName.find('('); std::string::size_type start = functionName.find('(');
std::string::size_type end = functionName.find('+'); std::string::size_type end = functionName.find('+');
if (start != std::string::npos && end != std::string::npos) { if (start != std::string::npos && end != std::string::npos) {
std::string demangled = functionName.substr(start + 1, end - start - 1); std::string demangled = functionName.substr(start + 1, end - start - 1);
demangled = demangle(functionName.c_str()); demangled = demangle(functionName.c_str());
if (demangled.empty()) { if (demangled.empty()) {
printf("[%02d] %s\n", i, demangled.c_str()); printf("[%02d] %s\n", i, demangled.c_str());
} else { } else {
printf("[%02d] %s\n", i, functionName.c_str()); printf("[%02d] %s\n", i, functionName.c_str());
} }
} else { } else {
printf("[%02d] %s\n", i, functionName.c_str()); printf("[%02d] %s\n", i, functionName.c_str());
} }
} }
#else #else
backtrace_symbols_fd(array, size, STDOUT_FILENO); backtrace_symbols_fd(array, size, STDOUT_FILENO);
#endif #endif
std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log"; std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log";
FILE* file = fopen(fileName.c_str(), "w+"); FILE* file = fopen(fileName.c_str(), "w+");
if (file != NULL) { if (file != NULL) {
// print out all the frames to stderr // print out all the frames to stderr
fprintf(file, "Error: signal %d:\n", sig); fprintf(file, "Error: signal %d:\n", sig);
backtrace_symbols_fd(array, size, fileno(file)); backtrace_symbols_fd(array, size, fileno(file));
fclose(file); fclose(file);
} }
#else #else
struct backtrace_state* state = backtrace_create_state( struct backtrace_state* state = backtrace_create_state(
Diagnostics::GetProcessFileName().c_str(), Diagnostics::GetProcessFileName().c_str(),
BACKTRACE_SUPPORTS_THREADS, BACKTRACE_SUPPORTS_THREADS,
ErrorCallback, ErrorCallback,
nullptr); nullptr);
struct bt_ctx ctx = {state, 0}; struct bt_ctx ctx = { state, 0 };
Bt(state); Bt(state);
#endif #endif
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
void CritErrHdlr(int sig_num, siginfo_t* info, void* ucontext) { void CritErrHdlr(int sig_num, siginfo_t* info, void* ucontext) {
CatchUnhandled(sig_num); CatchUnhandled(sig_num);
} }
void OnTerminate() { void OnTerminate() {
CatchUnhandled(-1); CatchUnhandled(-1);
} }
void MakeBacktrace() { void MakeBacktrace() {
struct sigaction sigact; struct sigaction sigact;
sigact.sa_sigaction = CritErrHdlr; sigact.sa_sigaction = CritErrHdlr;
sigact.sa_flags = SA_RESTART | SA_SIGINFO; sigact.sa_flags = SA_RESTART | SA_SIGINFO;
if (sigaction(SIGSEGV, &sigact, (struct sigaction*)nullptr) != 0 || if (sigaction(SIGSEGV, &sigact, (struct sigaction*)nullptr) != 0 ||
sigaction(SIGFPE, &sigact, (struct sigaction*)nullptr) != 0 || sigaction(SIGFPE, &sigact, (struct sigaction*)nullptr) != 0 ||
sigaction(SIGABRT, &sigact, (struct sigaction*)nullptr) != 0 || sigaction(SIGABRT, &sigact, (struct sigaction*)nullptr) != 0 ||
sigaction(SIGILL, &sigact, (struct sigaction*)nullptr) != 0) { sigaction(SIGILL, &sigact, (struct sigaction*)nullptr) != 0) {
fprintf(stderr, "error setting signal handler for %d (%s)\n", fprintf(stderr, "error setting signal handler for %d (%s)\n",
SIGSEGV, SIGSEGV,
strsignal(SIGSEGV)); strsignal(SIGSEGV));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
std::set_terminate(OnTerminate); std::set_terminate(OnTerminate);
} }
#endif #endif
void Diagnostics::Initialize() { void Diagnostics::Initialize() {
#ifdef _WIN32 #ifdef _WIN32
SetUnhandledExceptionFilter(unhandled_handler); SetUnhandledExceptionFilter(unhandled_handler);
#elif defined(__linux__) //&& !defined(__clang__) #elif defined(__linux__) //&& !defined(__clang__)
MakeBacktrace(); MakeBacktrace();
#else #else
fprintf(stderr, "Diagnostics not supported on this platform.\n"); fprintf(stderr, "Diagnostics not supported on this platform.\n");
#endif #endif
} }
@ -224,33 +224,33 @@ std::string Diagnostics::m_OutDirectory{};
bool Diagnostics::m_ProduceMemoryDump{}; bool Diagnostics::m_ProduceMemoryDump{};
void Diagnostics::SetProcessName(const std::string& name) { void Diagnostics::SetProcessName(const std::string& name) {
m_ProcessName = name; m_ProcessName = name;
} }
void Diagnostics::SetProcessFileName(const std::string& name) { void Diagnostics::SetProcessFileName(const std::string& name) {
m_ProcessFileName = name; m_ProcessFileName = name;
} }
void Diagnostics::SetOutDirectory(const std::string& path) { void Diagnostics::SetOutDirectory(const std::string& path) {
m_OutDirectory = path; m_OutDirectory = path;
} }
void Diagnostics::SetProduceMemoryDump(bool value) { void Diagnostics::SetProduceMemoryDump(bool value) {
m_ProduceMemoryDump = value; m_ProduceMemoryDump = value;
} }
const std::string& Diagnostics::GetProcessName() { const std::string& Diagnostics::GetProcessName() {
return m_ProcessName; return m_ProcessName;
} }
const std::string& Diagnostics::GetProcessFileName() { const std::string& Diagnostics::GetProcessFileName() {
return m_ProcessFileName; return m_ProcessFileName;
} }
const std::string& Diagnostics::GetOutDirectory() { const std::string& Diagnostics::GetOutDirectory() {
return m_OutDirectory; return m_OutDirectory;
} }
bool Diagnostics::GetProduceMemoryDump() { bool Diagnostics::GetProduceMemoryDump() {
return m_ProduceMemoryDump; return m_ProduceMemoryDump;
} }

View File

@ -5,27 +5,27 @@
class Diagnostics class Diagnostics
{ {
public: public:
static void Initialize(); static void Initialize();
static void SetProcessName(const std::string& name); static void SetProcessName(const std::string& name);
static void SetProcessFileName(const std::string& name); static void SetProcessFileName(const std::string& name);
static void SetOutDirectory(const std::string& path); static void SetOutDirectory(const std::string& path);
static void SetProduceMemoryDump(bool value); static void SetProduceMemoryDump(bool value);
static const std::string& GetProcessName(); static const std::string& GetProcessName();
static const std::string& GetProcessFileName(); static const std::string& GetProcessFileName();
static const std::string& GetOutDirectory(); static const std::string& GetOutDirectory();
static bool GetProduceMemoryDump(); static bool GetProduceMemoryDump();
private: private:
static std::string m_ProcessName; static std::string m_ProcessName;
static std::string m_ProcessFileName; static std::string m_ProcessFileName;
static std::string m_OutDirectory; static std::string m_OutDirectory;
static bool m_ProduceMemoryDump; static bool m_ProduceMemoryDump;
}; };

View File

@ -23,4 +23,4 @@ namespace Game {
extern std::mt19937 randomEngine; extern std::mt19937 randomEngine;
extern RakPeerInterface* chatServer; extern RakPeerInterface* chatServer;
extern SystemAddress chatSysAddr; extern SystemAddress chatSysAddr;
} }

View File

@ -7,272 +7,265 @@
template <typename T> template <typename T>
inline size_t MinSize(size_t size, const std::basic_string_view<T>& string) { inline size_t MinSize(size_t size, const std::basic_string_view<T>& string) {
if (size == size_t(-1) || size > string.size()) { if (size == size_t(-1) || size > string.size()) {
return string.size(); return string.size();
} else { } else {
return size; return size;
} }
} }
inline bool IsLeadSurrogate(char16_t c) { inline bool IsLeadSurrogate(char16_t c) {
return (0xD800 <= c) && (c <= 0xDBFF); return (0xD800 <= c) && (c <= 0xDBFF);
} }
inline bool IsTrailSurrogate(char16_t c) { inline bool IsTrailSurrogate(char16_t c) {
return (0xDC00 <= c) && (c <= 0xDFFF); return (0xDC00 <= c) && (c <= 0xDFFF);
} }
inline void PushUTF8CodePoint(std::string& ret, char32_t cp) { inline void PushUTF8CodePoint(std::string& ret, char32_t cp) {
if (cp <= 0x007F) { if (cp <= 0x007F) {
ret.push_back(static_cast<uint8_t>(cp)); ret.push_back(static_cast<uint8_t>(cp));
} else if (cp <= 0x07FF) { } else if (cp <= 0x07FF) {
ret.push_back(0xC0 | (cp >> 6)); ret.push_back(0xC0 | (cp >> 6));
ret.push_back(0x80 | (cp & 0x3F)); ret.push_back(0x80 | (cp & 0x3F));
} else if (cp <= 0xFFFF) { } else if (cp <= 0xFFFF) {
ret.push_back(0xE0 | (cp >> 12)); ret.push_back(0xE0 | (cp >> 12));
ret.push_back(0x80 | ((cp >> 6) & 0x3F)); ret.push_back(0x80 | ((cp >> 6) & 0x3F));
ret.push_back(0x80 | (cp & 0x3F)); ret.push_back(0x80 | (cp & 0x3F));
} else if (cp <= 0x10FFFF) { } else if (cp <= 0x10FFFF) {
ret.push_back(0xF0 | (cp >> 18)); ret.push_back(0xF0 | (cp >> 18));
ret.push_back(0x80 | ((cp >> 12) & 0x3F)); ret.push_back(0x80 | ((cp >> 12) & 0x3F));
ret.push_back(0x80 | ((cp >> 6) & 0x3F)); ret.push_back(0x80 | ((cp >> 6) & 0x3F));
ret.push_back(0x80 | (cp & 0x3F)); ret.push_back(0x80 | (cp & 0x3F));
} else { } else {
assert(false); assert(false);
} }
} }
constexpr const char16_t REPLACEMENT_CHARACTER = 0xFFFD; constexpr const char16_t REPLACEMENT_CHARACTER = 0xFFFD;
bool _IsSuffixChar(uint8_t c) { bool _IsSuffixChar(uint8_t c) {
return (c & 0xC0) == 0x80; return (c & 0xC0) == 0x80;
} }
bool GeneralUtils::_NextUTF8Char(std::string_view& slice, uint32_t& out) { bool GeneralUtils::_NextUTF8Char(std::string_view& slice, uint32_t& out) {
size_t rem = slice.length(); size_t rem = slice.length();
const uint8_t* bytes = (const uint8_t*) &slice.front(); const uint8_t* bytes = (const uint8_t*)&slice.front();
if (rem > 0) { if (rem > 0) {
uint8_t first = bytes[0]; uint8_t first = bytes[0];
if (first < 0x80) { // 1 byte character if (first < 0x80) { // 1 byte character
out = static_cast<uint32_t>(first & 0x7F); out = static_cast<uint32_t>(first & 0x7F);
slice.remove_prefix(1); slice.remove_prefix(1);
return true; return true;
} else if (first < 0xC0) { } else if (first < 0xC0) {
// middle byte, not valid at start, fall through // middle byte, not valid at start, fall through
} else if (first < 0xE0) { // two byte character } else if (first < 0xE0) { // two byte character
if (rem > 1) { if (rem > 1) {
uint8_t second = bytes[1]; uint8_t second = bytes[1];
if (_IsSuffixChar(second)) { if (_IsSuffixChar(second)) {
out = (static_cast<uint32_t>(first & 0x1F) << 6) out = (static_cast<uint32_t>(first & 0x1F) << 6)
+ static_cast<uint32_t>(second & 0x3F); + static_cast<uint32_t>(second & 0x3F);
slice.remove_prefix(2); slice.remove_prefix(2);
return true; return true;
} }
} }
} else if (first < 0xF0) { // three byte character } else if (first < 0xF0) { // three byte character
if (rem > 2) { if (rem > 2) {
uint8_t second = bytes[1]; uint8_t second = bytes[1];
uint8_t third = bytes[2]; uint8_t third = bytes[2];
if (_IsSuffixChar(second) && _IsSuffixChar(third)) { if (_IsSuffixChar(second) && _IsSuffixChar(third)) {
out = (static_cast<uint32_t>(first & 0x0F) << 12) out = (static_cast<uint32_t>(first & 0x0F) << 12)
+ (static_cast<uint32_t>(second & 0x3F) << 6) + (static_cast<uint32_t>(second & 0x3F) << 6)
+ static_cast<uint32_t>(third & 0x3F); + static_cast<uint32_t>(third & 0x3F);
slice.remove_prefix(3); slice.remove_prefix(3);
return true; return true;
} }
} }
} else if (first < 0xF8) { // four byte character } else if (first < 0xF8) { // four byte character
if (rem > 3) { if (rem > 3) {
uint8_t second = bytes[1]; uint8_t second = bytes[1];
uint8_t third = bytes[2]; uint8_t third = bytes[2];
uint8_t fourth = bytes[3]; uint8_t fourth = bytes[3];
if (_IsSuffixChar(second) && _IsSuffixChar(third) && _IsSuffixChar(fourth)) { if (_IsSuffixChar(second) && _IsSuffixChar(third) && _IsSuffixChar(fourth)) {
out = (static_cast<uint32_t>(first & 0x07) << 18) out = (static_cast<uint32_t>(first & 0x07) << 18)
+ (static_cast<uint32_t>(second & 0x3F) << 12) + (static_cast<uint32_t>(second & 0x3F) << 12)
+ (static_cast<uint32_t>(third & 0x3F) << 6) + (static_cast<uint32_t>(third & 0x3F) << 6)
+ static_cast<uint32_t>(fourth & 0x3F); + static_cast<uint32_t>(fourth & 0x3F);
slice.remove_prefix(4); slice.remove_prefix(4);
return true; return true;
} }
} }
} }
out = static_cast<uint32_t>(REPLACEMENT_CHARACTER); out = static_cast<uint32_t>(REPLACEMENT_CHARACTER);
slice.remove_prefix(1); slice.remove_prefix(1);
return true; return true;
} }
return false; return false;
} }
/// See <https://www.ietf.org/rfc/rfc2781.html#section-2.1> /// See <https://www.ietf.org/rfc/rfc2781.html#section-2.1>
bool PushUTF16CodePoint(std::u16string& output, uint32_t U, size_t size) { bool PushUTF16CodePoint(std::u16string& output, uint32_t U, size_t size) {
if (output.length() >= size) return false; if (output.length() >= size) return false;
if (U < 0x10000) { if (U < 0x10000) {
// If U < 0x10000, encode U as a 16-bit unsigned integer and terminate. // If U < 0x10000, encode U as a 16-bit unsigned integer and terminate.
output.push_back(static_cast<uint16_t>(U)); output.push_back(static_cast<uint16_t>(U));
return true; return true;
} else if (U > 0x10FFFF) { } else if (U > 0x10FFFF) {
output.push_back(REPLACEMENT_CHARACTER); output.push_back(REPLACEMENT_CHARACTER);
return true; return true;
} else if (output.length() + 1 < size) { } else if (output.length() + 1 < size) {
// Let U' = U - 0x10000. Because U is less than or equal to 0x10FFFF, // Let U' = U - 0x10000. Because U is less than or equal to 0x10FFFF,
// U' must be less than or equal to 0xFFFFF. That is, U' can be // U' must be less than or equal to 0xFFFFF. That is, U' can be
// represented in 20 bits. // represented in 20 bits.
uint32_t Ut = U - 0x10000; uint32_t Ut = U - 0x10000;
// Initialize two 16-bit unsigned integers, W1 and W2, to 0xD800 and // Initialize two 16-bit unsigned integers, W1 and W2, to 0xD800 and
// 0xDC00, respectively. These integers each have 10 bits free to // 0xDC00, respectively. These integers each have 10 bits free to
// encode the character value, for a total of 20 bits. // encode the character value, for a total of 20 bits.
uint16_t W1 = 0xD800; uint16_t W1 = 0xD800;
uint16_t W2 = 0xDC00; uint16_t W2 = 0xDC00;
// Assign the 10 high-order bits of the 20-bit U' to the 10 low-order // Assign the 10 high-order bits of the 20-bit U' to the 10 low-order
// bits of W1 and the 10 low-order bits of U' to the 10 low-order // bits of W1 and the 10 low-order bits of U' to the 10 low-order
// bits of W2. // bits of W2.
W1 += static_cast<uint16_t>((Ut & 0x3FC00) >> 10); W1 += static_cast<uint16_t>((Ut & 0x3FC00) >> 10);
W2 += static_cast<uint16_t>((Ut & 0x3FF) >> 0); W2 += static_cast<uint16_t>((Ut & 0x3FF) >> 0);
// Terminate. // Terminate.
output.push_back(W1); // high surrogate output.push_back(W1); // high surrogate
output.push_back(W2); // low surrogate output.push_back(W2); // low surrogate
return true; return true;
} else return false; } else return false;
} }
std::u16string GeneralUtils::UTF8ToUTF16(const std::string_view& string, size_t size) { std::u16string GeneralUtils::UTF8ToUTF16(const std::string_view& string, size_t size) {
size_t newSize = MinSize(size, string); size_t newSize = MinSize(size, string);
std::u16string output; std::u16string output;
output.reserve(newSize); output.reserve(newSize);
std::string_view iterator = string; std::string_view iterator = string;
uint32_t c; uint32_t c;
while (_NextUTF8Char(iterator, c) && PushUTF16CodePoint(output, c, size)) {} while (_NextUTF8Char(iterator, c) && PushUTF16CodePoint(output, c, size)) {}
return output; return output;
} }
//! Converts an std::string (ASCII) to UCS-2 / UTF-16 //! Converts an std::string (ASCII) to UCS-2 / UTF-16
std::u16string GeneralUtils::ASCIIToUTF16(const std::string_view& string, size_t size) { std::u16string GeneralUtils::ASCIIToUTF16(const std::string_view& string, size_t size) {
size_t newSize = MinSize(size, string); size_t newSize = MinSize(size, string);
std::u16string ret; std::u16string ret;
ret.reserve(newSize); ret.reserve(newSize);
for (size_t i = 0; i < newSize; i++) { for (size_t i = 0; i < newSize; i++) {
char c = string[i]; char c = string[i];
// Note: both 7-bit ascii characters and REPLACEMENT_CHARACTER fit in one char16_t // Note: both 7-bit ascii characters and REPLACEMENT_CHARACTER fit in one char16_t
ret.push_back((c > 0 && c <= 127) ? static_cast<char16_t>(c) : REPLACEMENT_CHARACTER); ret.push_back((c > 0 && c <= 127) ? static_cast<char16_t>(c) : REPLACEMENT_CHARACTER);
} }
return ret; return ret;
} }
//! Converts a (potentially-ill-formed) UTF-16 string to UTF-8 //! Converts a (potentially-ill-formed) UTF-16 string to UTF-8
//! See: <http://simonsapin.github.io/wtf-8/#decoding-ill-formed-utf-16> //! See: <http://simonsapin.github.io/wtf-8/#decoding-ill-formed-utf-16>
std::string GeneralUtils::UTF16ToWTF8(const std::u16string_view& string, size_t size) { std::string GeneralUtils::UTF16ToWTF8(const std::u16string_view& string, size_t size) {
size_t newSize = MinSize(size, string); size_t newSize = MinSize(size, string);
std::string ret; std::string ret;
ret.reserve(newSize); ret.reserve(newSize);
for (size_t i = 0; i < newSize; i++) { for (size_t i = 0; i < newSize; i++) {
char16_t u = string[i]; char16_t u = string[i];
if (IsLeadSurrogate(u) && (i + 1) < newSize) { if (IsLeadSurrogate(u) && (i + 1) < newSize) {
char16_t next = string[i + 1]; char16_t next = string[i + 1];
if (IsTrailSurrogate(next)) { if (IsTrailSurrogate(next)) {
i += 1; i += 1;
char32_t cp = 0x10000 char32_t cp = 0x10000
+ ((static_cast<char32_t>(u) - 0xD800) << 10) + ((static_cast<char32_t>(u) - 0xD800) << 10)
+ (static_cast<char32_t>(next) - 0xDC00); + (static_cast<char32_t>(next) - 0xDC00);
PushUTF8CodePoint(ret, cp); PushUTF8CodePoint(ret, cp);
} else { } else {
PushUTF8CodePoint(ret, u); PushUTF8CodePoint(ret, u);
} }
} else { } else {
PushUTF8CodePoint(ret, u); PushUTF8CodePoint(ret, u);
} }
} }
return ret; return ret;
} }
bool GeneralUtils::CaseInsensitiveStringCompare(const std::string& a, const std::string& b) { bool GeneralUtils::CaseInsensitiveStringCompare(const std::string& a, const std::string& b) {
return std::equal(a.begin(), a.end (), b.begin(), b.end(),[](char a, char b) { return tolower(a) == tolower(b); }); return std::equal(a.begin(), a.end(), b.begin(), b.end(), [](char a, char b) { return tolower(a) == tolower(b); });
} }
// MARK: Bits // MARK: Bits
//! Sets a specific bit in a signed 64-bit integer //! Sets a specific bit in a signed 64-bit integer
int64_t GeneralUtils::SetBit(int64_t value, uint32_t index) { int64_t GeneralUtils::SetBit(int64_t value, uint32_t index) {
return value |= 1ULL << index; return value |= 1ULL << index;
} }
//! Clears a specific bit in a signed 64-bit integer //! Clears a specific bit in a signed 64-bit integer
int64_t GeneralUtils::ClearBit(int64_t value, uint32_t index) { int64_t GeneralUtils::ClearBit(int64_t value, uint32_t index) {
return value &= ~(1ULL << index); return value &= ~(1ULL << index);
} }
//! Checks a specific bit in a signed 64-bit integer //! Checks a specific bit in a signed 64-bit integer
bool GeneralUtils::CheckBit(int64_t value, uint32_t index) { bool GeneralUtils::CheckBit(int64_t value, uint32_t index) {
return value & (1ULL << index); return value & (1ULL << index);
} }
bool GeneralUtils::ReplaceInString(std::string& str, const std::string& from, const std::string& to) { bool GeneralUtils::ReplaceInString(std::string& str, const std::string& from, const std::string& to) {
size_t start_pos = str.find(from); size_t start_pos = str.find(from);
if(start_pos == std::string::npos) if (start_pos == std::string::npos)
return false; return false;
str.replace(start_pos, from.length(), to); str.replace(start_pos, from.length(), to);
return true; return true;
} }
std::vector<std::wstring> GeneralUtils::SplitString(std::wstring& str, wchar_t delimiter) std::vector<std::wstring> GeneralUtils::SplitString(std::wstring& str, wchar_t delimiter) {
{ std::vector<std::wstring> vector = std::vector<std::wstring>();
std::vector<std::wstring> vector = std::vector<std::wstring>(); std::wstring current;
std::wstring current;
for (const auto& c : str) { for (const auto& c : str) {
if (c == delimiter) { if (c == delimiter) {
vector.push_back(current); vector.push_back(current);
current = L""; current = L"";
} else { } else {
current += c; current += c;
} }
} }
vector.push_back(current); vector.push_back(current);
return vector; return vector;
} }
std::vector<std::u16string> GeneralUtils::SplitString(std::u16string& str, char16_t delimiter) std::vector<std::u16string> GeneralUtils::SplitString(std::u16string& str, char16_t delimiter) {
{ std::vector<std::u16string> vector = std::vector<std::u16string>();
std::vector<std::u16string> vector = std::vector<std::u16string>(); std::u16string current;
std::u16string current;
for (const auto& c : str) { for (const auto& c : str) {
if (c == delimiter) { if (c == delimiter) {
vector.push_back(current); vector.push_back(current);
current = u""; current = u"";
} else { } else {
current += c; current += c;
} }
} }
vector.push_back(current); vector.push_back(current);
return vector; return vector;
} }
std::vector<std::string> GeneralUtils::SplitString(const std::string& str, char delimiter) std::vector<std::string> GeneralUtils::SplitString(const std::string& str, char delimiter) {
{
std::vector<std::string> vector = std::vector<std::string>(); std::vector<std::string> vector = std::vector<std::string>();
std::string current = ""; std::string current = "";
for (size_t i = 0; i < str.length(); i++) for (size_t i = 0; i < str.length(); i++) {
{
char c = str[i]; char c = str[i];
if (c == delimiter) if (c == delimiter) {
{
vector.push_back(current); vector.push_back(current);
current = ""; current = "";
} } else {
else
{
current += c; current += c;
} }
} }
@ -282,39 +275,38 @@ std::vector<std::string> GeneralUtils::SplitString(const std::string& str, char
return vector; return vector;
} }
std::u16string GeneralUtils::ReadWString(RakNet::BitStream *inStream) { std::u16string GeneralUtils::ReadWString(RakNet::BitStream* inStream) {
uint32_t length; uint32_t length;
inStream->Read<uint32_t>(length); inStream->Read<uint32_t>(length);
std::u16string string; std::u16string string;
for (auto i = 0; i < length; i++) { for (auto i = 0; i < length; i++) {
uint16_t c; uint16_t c;
inStream->Read(c); inStream->Read(c);
string.push_back(c); string.push_back(c);
} }
return string; return string;
} }
#ifdef _WIN32 #ifdef _WIN32
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <Windows.h> #include <Windows.h>
std::vector<std::string> GeneralUtils::GetFileNamesFromFolder(const std::string& folder) std::vector<std::string> GeneralUtils::GetFileNamesFromFolder(const std::string& folder) {
{ std::vector<std::string> names;
std::vector<std::string> names; std::string search_path = folder + "/*.*";
std::string search_path = folder + "/*.*"; WIN32_FIND_DATA fd;
WIN32_FIND_DATA fd; HANDLE hFind = ::FindFirstFile(search_path.c_str(), &fd);
HANDLE hFind = ::FindFirstFile(search_path.c_str(), &fd); if (hFind != INVALID_HANDLE_VALUE) {
if (hFind != INVALID_HANDLE_VALUE) { do {
do { if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { names.push_back(fd.cFileName);
names.push_back(fd.cFileName); }
} } while (::FindNextFile(hFind, &fd));
} while (::FindNextFile(hFind, &fd)); ::FindClose(hFind);
::FindClose(hFind); }
} return names;
return names;
} }
#else #else
#include <stdio.h> #include <stdio.h>
@ -325,23 +317,23 @@ std::vector<std::string> GeneralUtils::GetFileNamesFromFolder(const std::string&
#include <cstring> #include <cstring>
std::vector<std::string> GeneralUtils::GetFileNamesFromFolder(const std::string& folder) { std::vector<std::string> GeneralUtils::GetFileNamesFromFolder(const std::string& folder) {
std::vector<std::string> names; std::vector<std::string> names;
struct dirent* entry; struct dirent* entry;
DIR* dir = opendir(folder.c_str()); DIR* dir = opendir(folder.c_str());
if (dir == NULL) { if (dir == NULL) {
return names; return names;
} }
while ((entry = readdir(dir)) != NULL) { while ((entry = readdir(dir)) != NULL) {
std::string value(entry->d_name, strlen(entry->d_name)); std::string value(entry->d_name, strlen(entry->d_name));
if (value == "." || value == "..") { if (value == "." || value == "..") {
continue; continue;
} }
names.push_back(value); names.push_back(value);
} }
closedir(dir); closedir(dir);
return names; return names;
} }
#endif #endif

View File

@ -18,120 +18,119 @@
\brief A namespace containing general utility functions \brief A namespace containing general utility functions
*/ */
//! The general utils namespace //! The general utils namespace
namespace GeneralUtils { namespace GeneralUtils {
//! Converts a plain ASCII string to a UTF-16 string //! Converts a plain ASCII string to a UTF-16 string
/*! /*!
\param string The string to convert \param string The string to convert
\param size A size to trim the string to. Default is -1 (No trimming) \param size A size to trim the string to. Default is -1 (No trimming)
\return An UTF-16 representation of the string \return An UTF-16 representation of the string
*/ */
std::u16string ASCIIToUTF16(const std::string_view& string, size_t size = -1); std::u16string ASCIIToUTF16(const std::string_view& string, size_t size = -1);
//! Converts a UTF-8 String to a UTF-16 string //! Converts a UTF-8 String to a UTF-16 string
/*! /*!
\param string The string to convert \param string The string to convert
\param size A size to trim the string to. Default is -1 (No trimming) \param size A size to trim the string to. Default is -1 (No trimming)
\return An UTF-16 representation of the string \return An UTF-16 representation of the string
*/ */
std::u16string UTF8ToUTF16(const std::string_view& string, size_t size = -1); std::u16string UTF8ToUTF16(const std::string_view& string, size_t size = -1);
//! Internal, do not use //! Internal, do not use
bool _NextUTF8Char(std::string_view& slice, uint32_t& out); bool _NextUTF8Char(std::string_view& slice, uint32_t& out);
//! Converts a UTF-16 string to a UTF-8 string //! Converts a UTF-16 string to a UTF-8 string
/*! /*!
\param string The string to convert \param string The string to convert
\param size A size to trim the string to. Default is -1 (No trimming) \param size A size to trim the string to. Default is -1 (No trimming)
\return An UTF-8 representation of the string \return An UTF-8 representation of the string
*/ */
std::string UTF16ToWTF8(const std::u16string_view& string, size_t size = -1); std::string UTF16ToWTF8(const std::u16string_view& string, size_t size = -1);
/** /**
* Compares two basic strings but does so ignoring case sensitivity * Compares two basic strings but does so ignoring case sensitivity
* \param a the first string to compare against the second string * \param a the first string to compare against the second string
* \param b the second string to compare against the first string * \param b the second string to compare against the first string
* @return if the two strings are equal * @return if the two strings are equal
*/ */
bool CaseInsensitiveStringCompare(const std::string& a, const std::string& b); bool CaseInsensitiveStringCompare(const std::string& a, const std::string& b);
// MARK: Bits // MARK: Bits
// MARK: Bits // MARK: Bits
//! Sets a bit on a numerical value //! Sets a bit on a numerical value
template <typename T> template <typename T>
void SetBit(T& value, size_t index) { void SetBit(T& value, size_t index) {
static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type"); static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
if (index > (sizeof(T) * 8) - 1) {
return;
}
value |= static_cast<T>(1) << index;
}
//! Clears a bit on a numerical value
template <typename T>
void ClearBit(T& value, size_t index) {
static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
if (index > (sizeof(T) * 8 - 1)) {
return;
}
value &= ~(static_cast<T>(1) << index);
}
//! Sets a specific bit in a signed 64-bit integer
/*!
\param value The value to set the bit for
\param index The index of the bit
*/
int64_t SetBit(int64_t value, uint32_t index);
//! Clears a specific bit in a signed 64-bit integer
/*!
\param value The value to clear the bit from
\param index The index of the bit
*/
int64_t ClearBit(int64_t value, uint32_t index);
//! Checks a specific bit in a signed 64-bit integer
/*!
\parma value The value to check the bit in
\param index The index of the bit
\return Whether or not the bit is set
*/
bool CheckBit(int64_t value, uint32_t index);
// MARK: Random Number Generation if (index > (sizeof(T) * 8) - 1) {
return;
}
//! Generates a random number value |= static_cast<T>(1) << index;
/*! }
\param min The minimum the generate from
\param max The maximum to generate to
*/
template <typename T>
inline T GenerateRandomNumber(std::size_t min, std::size_t max) {
// Make sure it is a numeric type
static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
if constexpr (std::is_integral_v<T>) { // constexpr only necessary on first statement //! Clears a bit on a numerical value
std::uniform_int_distribution<T> distribution(min, max); template <typename T>
return distribution(Game::randomEngine); void ClearBit(T& value, size_t index) {
} static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
else if (std::is_floating_point_v<T>) {
std::uniform_real_distribution<T> distribution(min, max); if (index > (sizeof(T) * 8 - 1)) {
return distribution(Game::randomEngine); return;
} }
value &= ~(static_cast<T>(1) << index);
}
//! Sets a specific bit in a signed 64-bit integer
/*!
\param value The value to set the bit for
\param index The index of the bit
*/
int64_t SetBit(int64_t value, uint32_t index);
//! Clears a specific bit in a signed 64-bit integer
/*!
\param value The value to clear the bit from
\param index The index of the bit
*/
int64_t ClearBit(int64_t value, uint32_t index);
//! Checks a specific bit in a signed 64-bit integer
/*!
\parma value The value to check the bit in
\param index The index of the bit
\return Whether or not the bit is set
*/
bool CheckBit(int64_t value, uint32_t index);
// MARK: Random Number Generation
//! Generates a random number
/*!
\param min The minimum the generate from
\param max The maximum to generate to
*/
template <typename T>
inline T GenerateRandomNumber(std::size_t min, std::size_t max) {
// Make sure it is a numeric type
static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
if constexpr (std::is_integral_v<T>) { // constexpr only necessary on first statement
std::uniform_int_distribution<T> distribution(min, max);
return distribution(Game::randomEngine);
} else if (std::is_floating_point_v<T>) {
std::uniform_real_distribution<T> distribution(min, max);
return distribution(Game::randomEngine);
}
return T();
}
return T();
}
bool ReplaceInString(std::string& str, const std::string& from, const std::string& to); bool ReplaceInString(std::string& str, const std::string& from, const std::string& to);
std::u16string ReadWString(RakNet::BitStream *inStream); std::u16string ReadWString(RakNet::BitStream* inStream);
std::vector<std::wstring> SplitString(std::wstring& str, wchar_t delimiter); std::vector<std::wstring> SplitString(std::wstring& str, wchar_t delimiter);
@ -139,85 +138,71 @@ namespace GeneralUtils {
std::vector<std::string> SplitString(const std::string& str, char delimiter); std::vector<std::string> SplitString(const std::string& str, char delimiter);
std::vector<std::string> GetFileNamesFromFolder(const std::string& folder); std::vector<std::string> GetFileNamesFromFolder(const std::string& folder);
template <typename T> template <typename T>
T Parse(const char* value); T Parse(const char* value);
template <> template <>
inline int32_t Parse(const char* value) inline int32_t Parse(const char* value) {
{ return std::stoi(value);
return std::stoi(value);
} }
template <> template <>
inline int64_t Parse(const char* value) inline int64_t Parse(const char* value) {
{ return std::stoll(value);
return std::stoll(value); }
}
template <> template <>
inline float Parse(const char* value) inline float Parse(const char* value) {
{ return std::stof(value);
return std::stof(value); }
}
template <> template <>
inline double Parse(const char* value) inline double Parse(const char* value) {
{ return std::stod(value);
return std::stod(value); }
}
template <>
inline uint32_t Parse(const char* value)
{
return std::stoul(value);
}
template <> template <>
inline uint64_t Parse(const char* value) inline uint32_t Parse(const char* value) {
{ return std::stoul(value);
return std::stoull(value); }
}
template <typename T>
bool TryParse(const char* value, T& dst)
{
try
{
dst = Parse<T>(value);
return true; template <>
} inline uint64_t Parse(const char* value) {
catch (...) return std::stoull(value);
{ }
return false;
}
}
template <typename T> template <typename T>
T Parse(const std::string& value) bool TryParse(const char* value, T& dst) {
{ try {
return Parse<T>(value.c_str()); dst = Parse<T>(value);
}
template <typename T> return true;
bool TryParse(const std::string& value, T& dst) } catch (...) {
{ return false;
return TryParse<T>(value.c_str(), dst); }
} }
template<typename T> template <typename T>
std::u16string to_u16string(T value) T Parse(const std::string& value) {
{ return Parse<T>(value.c_str());
return GeneralUtils::ASCIIToUTF16(std::to_string(value)); }
}
// From boost::hash_combine template <typename T>
template <class T> bool TryParse(const std::string& value, T& dst) {
void hash_combine(std::size_t& s, const T& v) return TryParse<T>(value.c_str(), dst);
{ }
std::hash<T> h;
s ^= h(v) + 0x9e3779b9 + (s << 6) + (s >> 2); template<typename T>
} std::u16string to_u16string(T value) {
return GeneralUtils::ASCIIToUTF16(std::to_string(value));
}
// From boost::hash_combine
template <class T>
void hash_combine(std::size_t& s, const T& v) {
std::hash<T> h;
s ^= h(v) + 0x9e3779b9 + (s << 6) + (s >> 2);
}
} }

View File

@ -8,25 +8,25 @@
#include <vector> #include <vector>
//! Returns a pointer to a LDFData value based on string format //! Returns a pointer to a LDFData value based on string format
LDFBaseData * LDFBaseData::DataFromString(const std::string& format) { LDFBaseData* LDFBaseData::DataFromString(const std::string& format) {
// First, check the format // First, check the format
std::istringstream ssFormat(format); std::istringstream ssFormat(format);
std::string token; std::string token;
std::vector<std::string> keyValueArray; std::vector<std::string> keyValueArray;
while (std::getline(ssFormat, token, '=')) { while (std::getline(ssFormat, token, '=')) {
keyValueArray.push_back(token); keyValueArray.push_back(token);
} }
if (keyValueArray.size() == 2) { if (keyValueArray.size() == 2) {
std::u16string key = GeneralUtils::ASCIIToUTF16(keyValueArray[0]); std::u16string key = GeneralUtils::ASCIIToUTF16(keyValueArray[0]);
std::vector<std::string> dataArray; std::vector<std::string> dataArray;
std::istringstream ssData(keyValueArray[1]); std::istringstream ssData(keyValueArray[1]);
while (std::getline(ssData, token, ':')) { while (std::getline(ssData, token, ':')) {
dataArray.push_back(token); dataArray.push_back(token);
} }
if (dataArray.size() > 2) { // hacky fix for strings with colons in them if (dataArray.size() > 2) { // hacky fix for strings with colons in them
std::vector<std::string> newDataArray; std::vector<std::string> newDataArray;
@ -39,96 +39,86 @@ LDFBaseData * LDFBaseData::DataFromString(const std::string& format) {
newDataArray.push_back(value); newDataArray.push_back(value);
dataArray = newDataArray; dataArray = newDataArray;
} }
if ((dataArray[0] == "0" || dataArray[0] == "13") && dataArray.size() == 1) { if ((dataArray[0] == "0" || dataArray[0] == "13") && dataArray.size() == 1) {
dataArray.push_back(""); dataArray.push_back("");
} }
if (dataArray.size() == 2) { if (dataArray.size() == 2) {
eLDFType type = static_cast<eLDFType>(stoi(dataArray[0])); eLDFType type = static_cast<eLDFType>(stoi(dataArray[0]));
switch (type) { switch (type) {
case LDF_TYPE_UTF_16: { case LDF_TYPE_UTF_16: {
std::u16string data = GeneralUtils::ASCIIToUTF16(dataArray[1]); std::u16string data = GeneralUtils::ASCIIToUTF16(dataArray[1]);
return new LDFData<std::u16string>(key, data); return new LDFData<std::u16string>(key, data);
} }
case LDF_TYPE_S32: { case LDF_TYPE_S32: {
int32_t data = static_cast<int32_t>(stoull(dataArray[1])); int32_t data = static_cast<int32_t>(stoull(dataArray[1]));
return new LDFData<int32_t>(key, data); return new LDFData<int32_t>(key, data);
} }
case LDF_TYPE_FLOAT: { case LDF_TYPE_FLOAT: {
float data = static_cast<float>(stof(dataArray[1])); float data = static_cast<float>(stof(dataArray[1]));
return new LDFData<float>(key, data); return new LDFData<float>(key, data);
} }
case LDF_TYPE_DOUBLE: { case LDF_TYPE_DOUBLE: {
double data = static_cast<float>(stod(dataArray[1])); double data = static_cast<float>(stod(dataArray[1]));
return new LDFData<double>(key, data); return new LDFData<double>(key, data);
} }
case LDF_TYPE_U32: case LDF_TYPE_U32:
{ {
uint32_t data; uint32_t data;
if (dataArray[1] == "true") if (dataArray[1] == "true") {
{ data = 1;
data = 1; } else if (dataArray[1] == "false") {
} data = 0;
else if (dataArray[1] == "false") } else {
{ data = static_cast<uint32_t>(stoul(dataArray[1]));
data = 0; }
}
else return new LDFData<uint32_t>(key, data);
{ }
data = static_cast<uint32_t>(stoul(dataArray[1]));
} case LDF_TYPE_BOOLEAN: {
bool data;
return new LDFData<uint32_t>(key, data);
} if (dataArray[1] == "true") {
data = true;
case LDF_TYPE_BOOLEAN: { } else if (dataArray[1] == "false") {
bool data; data = false;
} else {
if (dataArray[1] == "true") data = static_cast<bool>(stoi(dataArray[1]));
{ }
data = true;
} return new LDFData<bool>(key, data);
else if (dataArray[1] == "false") }
{
data = false; case LDF_TYPE_U64: {
} uint64_t data = static_cast<uint64_t>(stoull(dataArray[1]));
else return new LDFData<uint64_t>(key, data);
{ }
data = static_cast<bool>(stoi(dataArray[1]));
} case LDF_TYPE_OBJID: {
LWOOBJID data = static_cast<LWOOBJID>(stoll(dataArray[1]));
return new LDFData<bool>(key, data); return new LDFData<LWOOBJID>(key, data);
} }
case LDF_TYPE_U64: { case LDF_TYPE_UTF_8: {
uint64_t data = static_cast<uint64_t>(stoull(dataArray[1])); std::string data = dataArray[1];
return new LDFData<uint64_t>(key, data); return new LDFData<std::string>(key, data);
} }
case LDF_TYPE_OBJID: { case LDF_TYPE_UNKNOWN: {
LWOOBJID data = static_cast<LWOOBJID>(stoll(dataArray[1])); return nullptr;
return new LDFData<LWOOBJID>(key, data); }
} }
}
case LDF_TYPE_UTF_8: { }
std::string data = dataArray[1];
return new LDFData<std::string>(key, data); return nullptr;
}
case LDF_TYPE_UNKNOWN: {
return nullptr;
}
}
}
}
return nullptr;
} }

View File

@ -17,64 +17,64 @@
\brief A collection of LDF format classes \brief A collection of LDF format classes
*/ */
//! An enum for LDF Data Types //! An enum for LDF Data Types
enum eLDFType { enum eLDFType {
LDF_TYPE_UNKNOWN = -1, //!< Unknown data type LDF_TYPE_UNKNOWN = -1, //!< Unknown data type
LDF_TYPE_UTF_16 = 0, //!< UTF-16 wstring data type LDF_TYPE_UTF_16 = 0, //!< UTF-16 wstring data type
LDF_TYPE_S32 = 1, //!< Signed 32-bit data type LDF_TYPE_S32 = 1, //!< Signed 32-bit data type
LDF_TYPE_FLOAT = 3, //!< Float data type LDF_TYPE_FLOAT = 3, //!< Float data type
LDF_TYPE_DOUBLE = 4, //!< Double data type LDF_TYPE_DOUBLE = 4, //!< Double data type
LDF_TYPE_U32 = 5, //!< Unsigned 32-bit data type LDF_TYPE_U32 = 5, //!< Unsigned 32-bit data type
LDF_TYPE_BOOLEAN = 7, //!< Boolean data type LDF_TYPE_BOOLEAN = 7, //!< Boolean data type
LDF_TYPE_U64 = 8, //!< Unsigned 64-bit data type (originally signed, templates won't work with both S64 & OBJID LDF_TYPE_U64 = 8, //!< Unsigned 64-bit data type (originally signed, templates won't work with both S64 & OBJID
LDF_TYPE_OBJID = 9, //!< Signed 64-bit data type (reserved for object IDs) LDF_TYPE_OBJID = 9, //!< Signed 64-bit data type (reserved for object IDs)
LDF_TYPE_UTF_8 = 13, //!< UTF-8 string data type LDF_TYPE_UTF_8 = 13, //!< UTF-8 string data type
}; };
//! A base class for the LDF data //! A base class for the LDF data
class LDFBaseData { class LDFBaseData {
public: public:
//! Destructor
virtual ~LDFBaseData(void) { }
//! Writes the data to a packet
/*!
\param packet The packet
*/
virtual void WriteToPacket(RakNet::BitStream * packet) = 0;
//! Gets the key
/*!
\return The key
*/
virtual const std::u16string& GetKey(void) = 0;
//! Gets the value type
/*!
\return The value type
*/
virtual eLDFType GetValueType(void) = 0;
//! Gets a string from the key/value pair
/*!
\param includeKey Whether or not to include the key in the data
\param includeTypeId Whether or not to include the type id in the data
\return The string representation of the data
*/
virtual std::string GetString(bool includeKey = true, bool includeTypeId = true) = 0;
virtual std::string GetValueAsString() = 0;
virtual LDFBaseData * Copy() = 0; //! Destructor
virtual ~LDFBaseData(void) {}
// MARK: Functions
//! Writes the data to a packet
//! Returns a pointer to a LDFData value based on string format /*!
/*! \param packet The packet
\param format The format */
*/ virtual void WriteToPacket(RakNet::BitStream* packet) = 0;
static LDFBaseData * DataFromString(const std::string& format);
//! Gets the key
/*!
\return The key
*/
virtual const std::u16string& GetKey(void) = 0;
//! Gets the value type
/*!
\return The value type
*/
virtual eLDFType GetValueType(void) = 0;
//! Gets a string from the key/value pair
/*!
\param includeKey Whether or not to include the key in the data
\param includeTypeId Whether or not to include the type id in the data
\return The string representation of the data
*/
virtual std::string GetString(bool includeKey = true, bool includeTypeId = true) = 0;
virtual std::string GetValueAsString() = 0;
virtual LDFBaseData* Copy() = 0;
// MARK: Functions
//! Returns a pointer to a LDFData value based on string format
/*!
\param format The format
*/
static LDFBaseData* DataFromString(const std::string& format);
}; };
@ -82,115 +82,115 @@ public:
template<typename T> template<typename T>
class LDFData : public LDFBaseData { class LDFData : public LDFBaseData {
private: private:
std::u16string key; std::u16string key;
T value; T value;
//! Writes the key to the packet //! Writes the key to the packet
void WriteKey(RakNet::BitStream * packet) { void WriteKey(RakNet::BitStream* packet) {
packet->Write(static_cast<uint8_t>(this->key.length() * sizeof(uint16_t))); packet->Write(static_cast<uint8_t>(this->key.length() * sizeof(uint16_t)));
for (uint32_t i = 0; i < this->key.length(); ++i) { for (uint32_t i = 0; i < this->key.length(); ++i) {
packet->Write(static_cast<uint16_t>(this->key[i])); packet->Write(static_cast<uint16_t>(this->key[i]));
} }
} }
//! Writes the value to the packet //! Writes the value to the packet
void WriteValue(RakNet::BitStream * packet) { void WriteValue(RakNet::BitStream* packet) {
packet->Write(static_cast<uint8_t>(this->GetValueType())); packet->Write(static_cast<uint8_t>(this->GetValueType()));
packet->Write(this->value); packet->Write(this->value);
} }
public: public:
//! Initializer
LDFData(const std::u16string& key, const T& value) {
this->key = key;
this->value = value;
}
//! Destructor
~LDFData(void) override { }
//! Gets the value
/*!
\return The value
*/
const T& GetValue(void) { return this->value; }
//! Sets the value
/*!
\param value The value to set to
*/
void SetValue(T value) { this->value = value; };
//! Gets the value string //! Initializer
/*! LDFData(const std::u16string& key, const T& value) {
\return The value string this->key = key;
*/ this->value = value;
std::string GetValueString(void) { return ""; } }
//! Writes the data to a packet
/*!
\param packet The packet
*/
void WriteToPacket(RakNet::BitStream * packet) override {
this->WriteKey(packet);
this->WriteValue(packet);
}
//! Gets the key
/*!
\return The key
*/
const std::u16string& GetKey(void) override { return this->key; }
//! Gets the LDF Type
/*!
\return The LDF value type
*/
eLDFType GetValueType(void) override { return LDF_TYPE_UNKNOWN; }
//! Gets the string data
/*!
\param includeKey Whether or not to include the key in the data
\param includeTypeId Whether or not to include the type id in the data
\return The string representation of the data
*/
std::string GetString(const bool includeKey = true, const bool includeTypeId = true) override {
if (GetValueType() == -1) {
return GeneralUtils::UTF16ToWTF8(this->key) + "=-1:<server variable>";
}
std::stringstream stream; //! Destructor
~LDFData(void) override {}
if (includeKey) { //! Gets the value
const std::string& sKey = GeneralUtils::UTF16ToWTF8(this->key, this->key.size()); /*!
\return The value
stream << sKey << "="; */
} const T& GetValue(void) { return this->value; }
if (includeTypeId) { //! Sets the value
const std::string& sType = std::to_string(this->GetValueType()); /*!
\param value The value to set to
*/
void SetValue(T value) { this->value = value; };
//! Gets the value string
stream << sType << ":"; /*!
} \return The value string
*/
std::string GetValueString(void) { return ""; }
const std::string& sData = this->GetValueString(); //! Writes the data to a packet
/*!
stream << sData; \param packet The packet
*/
void WriteToPacket(RakNet::BitStream* packet) override {
this->WriteKey(packet);
this->WriteValue(packet);
}
return stream.str(); //! Gets the key
} /*!
\return The key
std::string GetValueAsString() override { */
return this->GetValueString(); const std::u16string& GetKey(void) override { return this->key; }
}
//! Gets the LDF Type
LDFBaseData * Copy() override { /*!
return new LDFData<T>(key, value); \return The LDF value type
} */
eLDFType GetValueType(void) override { return LDF_TYPE_UNKNOWN; }
inline static T Default = {};
//! Gets the string data
/*!
\param includeKey Whether or not to include the key in the data
\param includeTypeId Whether or not to include the type id in the data
\return The string representation of the data
*/
std::string GetString(const bool includeKey = true, const bool includeTypeId = true) override {
if (GetValueType() == -1) {
return GeneralUtils::UTF16ToWTF8(this->key) + "=-1:<server variable>";
}
std::stringstream stream;
if (includeKey) {
const std::string& sKey = GeneralUtils::UTF16ToWTF8(this->key, this->key.size());
stream << sKey << "=";
}
if (includeTypeId) {
const std::string& sType = std::to_string(this->GetValueType());
stream << sType << ":";
}
const std::string& sData = this->GetValueString();
stream << sData;
return stream.str();
}
std::string GetValueAsString() override {
return this->GetValueString();
}
LDFBaseData* Copy() override {
return new LDFData<T>(key, value);
}
inline static T Default = {};
}; };
// LDF Types // LDF Types
@ -206,38 +206,38 @@ template<> inline eLDFType LDFData<std::string>::GetValueType(void) { return LDF
// The specialized version for std::u16string (UTF-16) // The specialized version for std::u16string (UTF-16)
template<> template<>
inline void LDFData<std::u16string>::WriteValue(RakNet::BitStream * packet) { inline void LDFData<std::u16string>::WriteValue(RakNet::BitStream* packet) {
packet->Write(static_cast<uint8_t>(this->GetValueType())); packet->Write(static_cast<uint8_t>(this->GetValueType()));
packet->Write(static_cast<uint32_t>(this->value.length())); packet->Write(static_cast<uint32_t>(this->value.length()));
for (uint32_t i = 0; i < this->value.length(); ++i) { for (uint32_t i = 0; i < this->value.length(); ++i) {
packet->Write(static_cast<uint16_t>(this->value[i])); packet->Write(static_cast<uint16_t>(this->value[i]));
} }
} }
// The specialized version for bool // The specialized version for bool
template<> template<>
inline void LDFData<bool>::WriteValue(RakNet::BitStream * packet) { inline void LDFData<bool>::WriteValue(RakNet::BitStream* packet) {
packet->Write(static_cast<uint8_t>(this->GetValueType())); packet->Write(static_cast<uint8_t>(this->GetValueType()));
packet->Write(static_cast<uint8_t>(this->value)); packet->Write(static_cast<uint8_t>(this->value));
} }
// The specialized version for std::string (UTF-8) // The specialized version for std::string (UTF-8)
template<> template<>
inline void LDFData<std::string>::WriteValue(RakNet::BitStream * packet) { inline void LDFData<std::string>::WriteValue(RakNet::BitStream* packet) {
packet->Write(static_cast<uint8_t>(this->GetValueType())); packet->Write(static_cast<uint8_t>(this->GetValueType()));
packet->Write(static_cast<uint32_t>(this->value.length())); packet->Write(static_cast<uint32_t>(this->value.length()));
for (uint32_t i = 0; i < this->value.length(); ++i) { for (uint32_t i = 0; i < this->value.length(); ++i) {
packet->Write(static_cast<uint8_t>(this->value[i])); packet->Write(static_cast<uint8_t>(this->value[i]));
} }
} }
// MARK: String Data // MARK: String Data
template<> inline std::string LDFData<std::u16string>::GetValueString(void) { template<> inline std::string LDFData<std::u16string>::GetValueString(void) {
//std::string toReturn(this->value.begin(), this->value.end()); //std::string toReturn(this->value.begin(), this->value.end());
//return toReturn; //return toReturn;
return GeneralUtils::UTF16ToWTF8(this->value, this->value.size()); return GeneralUtils::UTF16ToWTF8(this->value, this->value.size());
} }

View File

@ -1,36 +1,36 @@
/* MD5 /* MD5
converted to C++ class by Frank Thilo (thilo@unix-ag.org) converted to C++ class by Frank Thilo (thilo@unix-ag.org)
for bzflag (http://www.bzflag.org) for bzflag (http://www.bzflag.org)
based on: based on:
md5.h and md5.c md5.h and md5.c
reference implemantion of RFC 1321 reference implemantion of RFC 1321
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved. rights reserved.
License to copy and use this software is granted provided that it License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software Algorithm" in all material mentioning or referencing this software
or this function. or this function.
License is also granted to make and use derivative works provided License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work. mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is" software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind. without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this These notices must be retained in any copies of any part of this
documentation and/or software. documentation and/or software.
*/ */
/* interface header */ /* interface header */
#include "MD5.h" #include "MD5.h"
/* system implementation headers */ /* system implementation headers */
@ -59,304 +59,290 @@
// F, G, H and I are basic MD5 functions. // F, G, H and I are basic MD5 functions.
inline MD5::uint4 MD5::F(uint4 x, uint4 y, uint4 z) { inline MD5::uint4 MD5::F(uint4 x, uint4 y, uint4 z) {
return x&y | ~x&z; return x & y | ~x & z;
} }
inline MD5::uint4 MD5::G(uint4 x, uint4 y, uint4 z) { inline MD5::uint4 MD5::G(uint4 x, uint4 y, uint4 z) {
return x&z | y&~z; return x & z | y & ~z;
} }
inline MD5::uint4 MD5::H(uint4 x, uint4 y, uint4 z) { inline MD5::uint4 MD5::H(uint4 x, uint4 y, uint4 z) {
return x^y^z; return x ^ y ^ z;
} }
inline MD5::uint4 MD5::I(uint4 x, uint4 y, uint4 z) { inline MD5::uint4 MD5::I(uint4 x, uint4 y, uint4 z) {
return y ^ (x | ~z); return y ^ (x | ~z);
} }
// rotate_left rotates x left n bits. // rotate_left rotates x left n bits.
inline MD5::uint4 MD5::rotate_left(uint4 x, int n) { inline MD5::uint4 MD5::rotate_left(uint4 x, int n) {
return (x << n) | (x >> (32 - n)); return (x << n) | (x >> (32 - n));
} }
// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. // FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
// Rotation is separate from addition to prevent recomputation. // Rotation is separate from addition to prevent recomputation.
inline void MD5::FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { inline void MD5::FF(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
a = rotate_left(a + F(b, c, d) + x + ac, s) + b; a = rotate_left(a + F(b, c, d) + x + ac, s) + b;
} }
inline void MD5::GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { inline void MD5::GG(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
a = rotate_left(a + G(b, c, d) + x + ac, s) + b; a = rotate_left(a + G(b, c, d) + x + ac, s) + b;
} }
inline void MD5::HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { inline void MD5::HH(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
a = rotate_left(a + H(b, c, d) + x + ac, s) + b; a = rotate_left(a + H(b, c, d) + x + ac, s) + b;
} }
inline void MD5::II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { inline void MD5::II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
a = rotate_left(a + I(b, c, d) + x + ac, s) + b; a = rotate_left(a + I(b, c, d) + x + ac, s) + b;
} }
////////////////////////////////////////////// //////////////////////////////////////////////
// default ctor, just initailize // default ctor, just initailize
MD5::MD5() MD5::MD5() {
{ init();
init();
} }
////////////////////////////////////////////// //////////////////////////////////////////////
// nifty shortcut ctor, compute MD5 for string and finalize it right away // nifty shortcut ctor, compute MD5 for string and finalize it right away
MD5::MD5(const std::string &text) MD5::MD5(const std::string& text) {
{ init();
init(); update(text.c_str(), text.length());
update(text.c_str(), text.length()); finalize();
finalize();
} }
////////////////////////////// //////////////////////////////
void MD5::init() void MD5::init() {
{ finalized = false;
finalized = false;
count[0] = 0;
count[0] = 0; count[1] = 0;
count[1] = 0;
// load magic initialization constants.
// load magic initialization constants. state[0] = 0x67452301;
state[0] = 0x67452301; state[1] = 0xefcdab89;
state[1] = 0xefcdab89; state[2] = 0x98badcfe;
state[2] = 0x98badcfe; state[3] = 0x10325476;
state[3] = 0x10325476;
} }
////////////////////////////// //////////////////////////////
// decodes input (unsigned char) into output (uint4). Assumes len is a multiple of 4. // decodes input (unsigned char) into output (uint4). Assumes len is a multiple of 4.
void MD5::decode(uint4 output[], const uint1 input[], size_type len) void MD5::decode(uint4 output[], const uint1 input[], size_type len) {
{ for (unsigned int i = 0, j = 0; j < len; i++, j += 4)
for (unsigned int i = 0, j = 0; j < len; i++, j += 4) output[i] = ((uint4)input[j]) | (((uint4)input[j + 1]) << 8) |
output[i] = ((uint4)input[j]) | (((uint4)input[j + 1]) << 8) | (((uint4)input[j + 2]) << 16) | (((uint4)input[j + 3]) << 24);
(((uint4)input[j + 2]) << 16) | (((uint4)input[j + 3]) << 24);
} }
////////////////////////////// //////////////////////////////
// encodes input (uint4) into output (unsigned char). Assumes len is // encodes input (uint4) into output (unsigned char). Assumes len is
// a multiple of 4. // a multiple of 4.
void MD5::encode(uint1 output[], const uint4 input[], size_type len) void MD5::encode(uint1 output[], const uint4 input[], size_type len) {
{ for (size_type i = 0, j = 0; j < len; i++, j += 4) {
for (size_type i = 0, j = 0; j < len; i++, j += 4) { output[j] = input[i] & 0xff;
output[j] = input[i] & 0xff; output[j + 1] = (input[i] >> 8) & 0xff;
output[j + 1] = (input[i] >> 8) & 0xff; output[j + 2] = (input[i] >> 16) & 0xff;
output[j + 2] = (input[i] >> 16) & 0xff; output[j + 3] = (input[i] >> 24) & 0xff;
output[j + 3] = (input[i] >> 24) & 0xff; }
}
} }
////////////////////////////// //////////////////////////////
// apply MD5 algo on a block // apply MD5 algo on a block
void MD5::transform(const uint1 block[blocksize]) void MD5::transform(const uint1 block[blocksize]) {
{ uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; decode(x, block, blocksize);
decode(x, block, blocksize);
/* Round 1 */
/* Round 1 */ FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */ FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */ FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */ FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */ FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */ FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */ FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */ FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */ FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */ FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */ FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
/* Round 2 */
/* Round 2 */ GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */ GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */ GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */ GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */ GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */ GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */ GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */ GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */ GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */ GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */ GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
/* Round 3 */
/* Round 3 */ HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */ HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */ HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */ HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */ HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */ HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */ HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */ HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */ HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */ HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
/* Round 4 */
/* Round 4 */ II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */ II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */ II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */ II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */ II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */ II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */ II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */ II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */ II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */ II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
state[0] += a;
state[0] += a; state[1] += b;
state[1] += b; state[2] += c;
state[2] += c; state[3] += d;
state[3] += d;
// Zeroize sensitive information.
// Zeroize sensitive information. memset(x, 0, sizeof x);
memset(x, 0, sizeof x);
} }
////////////////////////////// //////////////////////////////
// MD5 block update operation. Continues an MD5 message-digest // MD5 block update operation. Continues an MD5 message-digest
// operation, processing another message block // operation, processing another message block
void MD5::update(const unsigned char input[], size_type length) void MD5::update(const unsigned char input[], size_type length) {
{ // compute number of bytes mod 64
// compute number of bytes mod 64 size_type index = count[0] / 8 % blocksize;
size_type index = count[0] / 8 % blocksize;
// Update number of bits
// Update number of bits if ((count[0] += (length << 3)) < (length << 3))
if ((count[0] += (length << 3)) < (length << 3)) count[1]++;
count[1]++; count[1] += (length >> 29);
count[1] += (length >> 29);
// number of bytes we need to fill in buffer
// number of bytes we need to fill in buffer size_type firstpart = 64 - index;
size_type firstpart = 64 - index;
size_type i;
size_type i;
// transform as many times as possible.
// transform as many times as possible. if (length >= firstpart) {
if (length >= firstpart) // fill buffer first, transform
{ memcpy(&buffer[index], input, firstpart);
// fill buffer first, transform transform(buffer);
memcpy(&buffer[index], input, firstpart);
transform(buffer); // transform chunks of blocksize (64 bytes)
for (i = firstpart; i + blocksize <= length; i += blocksize)
// transform chunks of blocksize (64 bytes) transform(&input[i]);
for (i = firstpart; i + blocksize <= length; i += blocksize)
transform(&input[i]); index = 0;
} else
index = 0; i = 0;
}
else // buffer remaining input
i = 0; memcpy(&buffer[index], &input[i], length - i);
// buffer remaining input
memcpy(&buffer[index], &input[i], length - i);
} }
////////////////////////////// //////////////////////////////
// for convenience provide a verson with signed char // for convenience provide a verson with signed char
void MD5::update(const char input[], size_type length) void MD5::update(const char input[], size_type length) {
{ update((const unsigned char*)input, length);
update((const unsigned char*)input, length);
} }
////////////////////////////// //////////////////////////////
// MD5 finalization. Ends an MD5 message-digest operation, writing the // MD5 finalization. Ends an MD5 message-digest operation, writing the
// the message digest and zeroizing the context. // the message digest and zeroizing the context.
MD5& MD5::finalize() MD5& MD5::finalize() {
{ static unsigned char padding[64] = {
static unsigned char padding[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
};
if (!finalized) {
if (!finalized) { // Save number of bits
// Save number of bits unsigned char bits[8];
unsigned char bits[8]; encode(bits, count, 8);
encode(bits, count, 8);
// pad out to 56 mod 64.
// pad out to 56 mod 64. size_type index = count[0] / 8 % 64;
size_type index = count[0] / 8 % 64; size_type padLen = (index < 56) ? (56 - index) : (120 - index);
size_type padLen = (index < 56) ? (56 - index) : (120 - index); update(padding, padLen);
update(padding, padLen);
// Append length (before padding)
// Append length (before padding) update(bits, 8);
update(bits, 8);
// Store state in digest
// Store state in digest encode(digest, state, 16);
encode(digest, state, 16);
// Zeroize sensitive information.
// Zeroize sensitive information. memset(buffer, 0, sizeof buffer);
memset(buffer, 0, sizeof buffer); memset(count, 0, sizeof count);
memset(count, 0, sizeof count);
finalized = true;
finalized = true; }
}
return *this;
return *this;
} }
////////////////////////////// //////////////////////////////
// return hex representation of digest as string // return hex representation of digest as string
std::string MD5::hexdigest() const std::string MD5::hexdigest() const {
{ if (!finalized)
if (!finalized) return "";
return "";
char buf[33];
char buf[33]; for (int i = 0; i < 16; i++)
for (int i = 0; i<16; i++) sprintf(buf + i * 2, "%02x", digest[i]);
sprintf(buf + i * 2, "%02x", digest[i]); buf[32] = 0;
buf[32] = 0;
return std::string(buf);
return std::string(buf);
} }
////////////////////////////// //////////////////////////////
std::ostream& operator<<(std::ostream& out, MD5 md5) std::ostream& operator<<(std::ostream& out, MD5 md5) {
{ return out << md5.hexdigest();
return out << md5.hexdigest();
} }
////////////////////////////// //////////////////////////////
std::string md5(const std::string str) std::string md5(const std::string str) {
{ MD5 md5 = MD5(str);
MD5 md5 = MD5(str);
return md5.hexdigest();
return md5.hexdigest();
} }

View File

@ -1,33 +1,33 @@
/* MD5 /* MD5
converted to C++ class by Frank Thilo (thilo@unix-ag.org) converted to C++ class by Frank Thilo (thilo@unix-ag.org)
for bzflag (http://www.bzflag.org) for bzflag (http://www.bzflag.org)
based on: based on:
md5.h and md5.c md5.h and md5.c
reference implementation of RFC 1321 reference implementation of RFC 1321
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved. rights reserved.
License to copy and use this software is granted provided that it License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software Algorithm" in all material mentioning or referencing this software
or this function. or this function.
License is also granted to make and use derivative works provided License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work. mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is" software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind. without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this These notices must be retained in any copies of any part of this
documentation and/or software. documentation and/or software.
*/ */
#ifndef BZF_MD5_H #ifndef BZF_MD5_H
@ -37,55 +37,55 @@
#include <iostream> #include <iostream>
// a small class for calculating MD5 hashes of strings or byte arrays // a small class for calculating MD5 hashes of strings or byte arrays
// it is not meant to be fast or secure // it is not meant to be fast or secure
// //
// usage: 1) feed it blocks of uchars with update() // usage: 1) feed it blocks of uchars with update()
// 2) finalize() // 2) finalize()
// 3) get hexdigest() string // 3) get hexdigest() string
// or // or
// MD5(std::string).hexdigest() // MD5(std::string).hexdigest()
// //
// assumes that char is 8 bit and int is 32 bit // assumes that char is 8 bit and int is 32 bit
class MD5 class MD5
{ {
public: public:
typedef unsigned int size_type; // must be 32bit typedef unsigned int size_type; // must be 32bit
MD5(); MD5();
MD5(const std::string& text); MD5(const std::string& text);
void update(const unsigned char *buf, size_type length); void update(const unsigned char* buf, size_type length);
void update(const char *buf, size_type length); void update(const char* buf, size_type length);
MD5& finalize(); MD5& finalize();
std::string hexdigest() const; std::string hexdigest() const;
friend std::ostream& operator<<(std::ostream&, MD5 md5); friend std::ostream& operator<<(std::ostream&, MD5 md5);
private: private:
void init(); void init();
typedef unsigned char uint1; // 8bit typedef unsigned char uint1; // 8bit
typedef unsigned int uint4; // 32bit typedef unsigned int uint4; // 32bit
enum { blocksize = 64 }; // VC6 won't eat a const static int here enum { blocksize = 64 }; // VC6 won't eat a const static int here
void transform(const uint1 block[blocksize]); void transform(const uint1 block[blocksize]);
static void decode(uint4 output[], const uint1 input[], size_type len); static void decode(uint4 output[], const uint1 input[], size_type len);
static void encode(uint1 output[], const uint4 input[], size_type len); static void encode(uint1 output[], const uint4 input[], size_type len);
bool finalized; bool finalized;
uint1 buffer[blocksize]; // bytes that didn't fit in last 64 byte chunk uint1 buffer[blocksize]; // bytes that didn't fit in last 64 byte chunk
uint4 count[2]; // 64bit counter for number of bits (lo, hi) uint4 count[2]; // 64bit counter for number of bits (lo, hi)
uint4 state[4]; // digest so far uint4 state[4]; // digest so far
uint1 digest[16]; // the result uint1 digest[16]; // the result
// low level logic operations // low level logic operations
static inline uint4 F(uint4 x, uint4 y, uint4 z); static inline uint4 F(uint4 x, uint4 y, uint4 z);
static inline uint4 G(uint4 x, uint4 y, uint4 z); static inline uint4 G(uint4 x, uint4 y, uint4 z);
static inline uint4 H(uint4 x, uint4 y, uint4 z); static inline uint4 H(uint4 x, uint4 y, uint4 z);
static inline uint4 I(uint4 x, uint4 y, uint4 z); static inline uint4 I(uint4 x, uint4 y, uint4 z);
static inline uint4 rotate_left(uint4 x, int n); static inline uint4 rotate_left(uint4 x, int n);
static inline void FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); static inline void FF(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac);
static inline void GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); static inline void GG(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac);
static inline void HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); static inline void HH(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac);
static inline void II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); static inline void II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac);
}; };
std::string md5(const std::string str); std::string md5(const std::string str);

View File

@ -4,174 +4,150 @@
std::unordered_map<MetricVariable, Metric*> Metrics::m_Metrics = {}; std::unordered_map<MetricVariable, Metric*> Metrics::m_Metrics = {};
std::vector<MetricVariable> Metrics::m_Variables = { std::vector<MetricVariable> Metrics::m_Variables = {
MetricVariable::GameLoop, MetricVariable::GameLoop,
MetricVariable::PacketHandling, MetricVariable::PacketHandling,
MetricVariable::UpdateEntities, MetricVariable::UpdateEntities,
MetricVariable::UpdateSpawners, MetricVariable::UpdateSpawners,
MetricVariable::Physics, MetricVariable::Physics,
MetricVariable::UpdateReplica, MetricVariable::UpdateReplica,
MetricVariable::Ghosting, MetricVariable::Ghosting,
MetricVariable::CPUTime, MetricVariable::CPUTime,
MetricVariable::Sleep, MetricVariable::Sleep,
MetricVariable::Frame, MetricVariable::Frame,
}; };
void Metrics::AddMeasurement(MetricVariable variable, int64_t value) void Metrics::AddMeasurement(MetricVariable variable, int64_t value) {
{ const auto& iter = m_Metrics.find(variable);
const auto& iter = m_Metrics.find(variable);
Metric* metric; Metric* metric;
if (iter == m_Metrics.end()) if (iter == m_Metrics.end()) {
{ metric = new Metric();
metric = new Metric();
m_Metrics[variable] = metric; m_Metrics[variable] = metric;
} } else {
else metric = iter->second;
{ }
metric = iter->second;
}
AddMeasurement(metric, value); AddMeasurement(metric, value);
} }
void Metrics::AddMeasurement(Metric* metric, int64_t value) void Metrics::AddMeasurement(Metric* metric, int64_t value) {
{ const auto index = metric->measurementIndex;
const auto index = metric->measurementIndex;
metric->measurements[index] = value; metric->measurements[index] = value;
if (metric->max == -1 || value > metric->max) if (metric->max == -1 || value > metric->max) {
{ metric->max = value;
metric->max = value; } else if (metric->min == -1 || metric->min > value) {
} metric->min = value;
else if (metric->min == -1 || metric->min > value) }
{
metric->min = value;
}
if (metric->measurementSize < MAX_MEASURMENT_POINTS) if (metric->measurementSize < MAX_MEASURMENT_POINTS) {
{ metric->measurementSize++;
metric->measurementSize++; }
}
metric->measurementIndex = (index + 1) % MAX_MEASURMENT_POINTS; metric->measurementIndex = (index + 1) % MAX_MEASURMENT_POINTS;
} }
const Metric* Metrics::GetMetric(MetricVariable variable) const Metric* Metrics::GetMetric(MetricVariable variable) {
{ const auto& iter = m_Metrics.find(variable);
const auto& iter = m_Metrics.find(variable);
if (iter == m_Metrics.end()) if (iter == m_Metrics.end()) {
{ return nullptr;
return nullptr; }
}
Metric* metric = iter->second; Metric* metric = iter->second;
int64_t average = 0; int64_t average = 0;
for (size_t i = 0; i < metric->measurementSize; i++) for (size_t i = 0; i < metric->measurementSize; i++) {
{ average += metric->measurements[i];
average += metric->measurements[i]; }
}
average /= metric->measurementSize; average /= metric->measurementSize;
metric->average = average; metric->average = average;
return metric; return metric;
} }
void Metrics::StartMeasurement(MetricVariable variable) void Metrics::StartMeasurement(MetricVariable variable) {
{ const auto& iter = m_Metrics.find(variable);
const auto& iter = m_Metrics.find(variable);
Metric* metric; Metric* metric;
if (iter == m_Metrics.end()) if (iter == m_Metrics.end()) {
{ metric = new Metric();
metric = new Metric();
m_Metrics[variable] = metric; m_Metrics[variable] = metric;
} } else {
else metric = iter->second;
{ }
metric = iter->second;
}
metric->activeMeasurement = std::chrono::high_resolution_clock::now(); metric->activeMeasurement = std::chrono::high_resolution_clock::now();
} }
void Metrics::EndMeasurement(MetricVariable variable) void Metrics::EndMeasurement(MetricVariable variable) {
{ const auto end = std::chrono::high_resolution_clock::now();
const auto end = std::chrono::high_resolution_clock::now();
const auto& iter = m_Metrics.find(variable); const auto& iter = m_Metrics.find(variable);
if (iter == m_Metrics.end()) if (iter == m_Metrics.end()) {
{ return;
return; }
}
Metric* metric = iter->second; Metric* metric = iter->second;
const auto elapsed = end - metric->activeMeasurement; const auto elapsed = end - metric->activeMeasurement;
const auto nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed).count(); const auto nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed).count();
AddMeasurement(metric, nanoseconds); AddMeasurement(metric, nanoseconds);
} }
float Metrics::ToMiliseconds(int64_t nanoseconds) float Metrics::ToMiliseconds(int64_t nanoseconds) {
{ return (float)nanoseconds / 1e6;
return (float) nanoseconds / 1e6;
} }
std::string Metrics::MetricVariableToString(MetricVariable variable) std::string Metrics::MetricVariableToString(MetricVariable variable) {
{ switch (variable) {
switch (variable) case MetricVariable::GameLoop:
{ return "GameLoop";
case MetricVariable::GameLoop: case MetricVariable::PacketHandling:
return "GameLoop"; return "PacketHandling";
case MetricVariable::PacketHandling: case MetricVariable::UpdateEntities:
return "PacketHandling"; return "UpdateEntities";
case MetricVariable::UpdateEntities: case MetricVariable::UpdateSpawners:
return "UpdateEntities"; return "UpdateSpawners";
case MetricVariable::UpdateSpawners: case MetricVariable::Physics:
return "UpdateSpawners"; return "Physics";
case MetricVariable::Physics: case MetricVariable::UpdateReplica:
return "Physics"; return "UpdateReplica";
case MetricVariable::UpdateReplica: case MetricVariable::Sleep:
return "UpdateReplica"; return "Sleep";
case MetricVariable::Sleep: case MetricVariable::CPUTime:
return "Sleep"; return "CPUTime";
case MetricVariable::CPUTime: case MetricVariable::Frame:
return "CPUTime"; return "Frame";
case MetricVariable::Frame: case MetricVariable::Ghosting:
return "Frame"; return "Ghosting";
case MetricVariable::Ghosting:
return "Ghosting"; default:
return "Invalid";
default: }
return "Invalid";
}
} }
const std::vector<MetricVariable>& Metrics::GetAllMetrics() const std::vector<MetricVariable>& Metrics::GetAllMetrics() {
{ return m_Variables;
return m_Variables;
} }
void Metrics::Clear() void Metrics::Clear() {
{ for (const auto& pair : m_Metrics) {
for (const auto& pair : m_Metrics) delete pair.second;
{ }
delete pair.second;
} m_Metrics.clear();
m_Metrics.clear();
} }
/* RSS Memory utilities /* RSS Memory utilities
@ -207,46 +183,44 @@ void Metrics::Clear()
#error "Cannot define getPeakRSS( ) or getCurrentRSS( ) for an unknown OS." #error "Cannot define getPeakRSS( ) or getCurrentRSS( ) for an unknown OS."
#endif #endif
/** /**
* Returns the peak (maximum so far) resident set size (physical * Returns the peak (maximum so far) resident set size (physical
* memory use) measured in bytes, or zero if the value cannot be * memory use) measured in bytes, or zero if the value cannot be
* determined on this OS. * determined on this OS.
*/ */
size_t Metrics::GetPeakRSS() size_t Metrics::GetPeakRSS() {
{
#if defined(_WIN32) #if defined(_WIN32)
/* Windows -------------------------------------------------- */ /* Windows -------------------------------------------------- */
PROCESS_MEMORY_COUNTERS info; PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) ); GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
return (size_t)info.PeakWorkingSetSize; return (size_t)info.PeakWorkingSetSize;
#elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__))) #elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__)))
/* AIX and Solaris ------------------------------------------ */ /* AIX and Solaris ------------------------------------------ */
struct psinfo psinfo; struct psinfo psinfo;
int fd = -1; int fd = -1;
if ( (fd = open( "/proc/self/psinfo", O_RDONLY )) == -1 ) if ((fd = open("/proc/self/psinfo", O_RDONLY)) == -1)
return (size_t)0L; /* Can't open? */ return (size_t)0L; /* Can't open? */
if ( read( fd, &psinfo, sizeof(psinfo) ) != sizeof(psinfo) ) if (read(fd, &psinfo, sizeof(psinfo)) != sizeof(psinfo)) {
{ close(fd);
close( fd ); return (size_t)0L; /* Can't read? */
return (size_t)0L; /* Can't read? */ }
} close(fd);
close( fd ); return (size_t)(psinfo.pr_rssize * 1024L);
return (size_t)(psinfo.pr_rssize * 1024L);
#elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__)) #elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
/* BSD, Linux, and OSX -------------------------------------- */ /* BSD, Linux, and OSX -------------------------------------- */
struct rusage rusage; struct rusage rusage;
getrusage( RUSAGE_SELF, &rusage ); getrusage(RUSAGE_SELF, &rusage);
#if defined(__APPLE__) && defined(__MACH__) #if defined(__APPLE__) && defined(__MACH__)
return (size_t)rusage.ru_maxrss; return (size_t)rusage.ru_maxrss;
#else #else
return (size_t)(rusage.ru_maxrss * 1024L); return (size_t)(rusage.ru_maxrss * 1024L);
#endif #endif
#else #else
/* Unknown OS ----------------------------------------------- */ /* Unknown OS ----------------------------------------------- */
return (size_t)0L; /* Unsupported. */ return (size_t)0L; /* Unsupported. */
#endif #endif
} }
@ -255,49 +229,46 @@ size_t Metrics::GetPeakRSS()
* Returns the current resident set size (physical memory use) measured * Returns the current resident set size (physical memory use) measured
* in bytes, or zero if the value cannot be determined on this OS. * in bytes, or zero if the value cannot be determined on this OS.
*/ */
size_t Metrics::GetCurrentRSS() size_t Metrics::GetCurrentRSS() {
{
#if defined(_WIN32) #if defined(_WIN32)
/* Windows -------------------------------------------------- */ /* Windows -------------------------------------------------- */
PROCESS_MEMORY_COUNTERS info; PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) ); GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
return (size_t)info.WorkingSetSize; return (size_t)info.WorkingSetSize;
#elif defined(__APPLE__) && defined(__MACH__) #elif defined(__APPLE__) && defined(__MACH__)
/* OSX ------------------------------------------------------ */ /* OSX ------------------------------------------------------ */
struct mach_task_basic_info info; struct mach_task_basic_info info;
mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT; mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT;
if ( task_info( mach_task_self( ), MACH_TASK_BASIC_INFO, if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO,
(task_info_t)&info, &infoCount ) != KERN_SUCCESS ) (task_info_t)&info, &infoCount) != KERN_SUCCESS)
return (size_t)0L; /* Can't access? */ return (size_t)0L; /* Can't access? */
return (size_t)info.resident_size; return (size_t)info.resident_size;
#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__) #elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
/* Linux ---------------------------------------------------- */ /* Linux ---------------------------------------------------- */
long rss = 0L; long rss = 0L;
FILE* fp = NULL; FILE* fp = NULL;
if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL ) if ((fp = fopen("/proc/self/statm", "r")) == NULL)
return (size_t)0L; /* Can't open? */ return (size_t)0L; /* Can't open? */
if ( fscanf( fp, "%*s%ld", &rss ) != 1 ) if (fscanf(fp, "%*s%ld", &rss) != 1) {
{ fclose(fp);
fclose( fp ); return (size_t)0L; /* Can't read? */
return (size_t)0L; /* Can't read? */ }
} fclose(fp);
fclose( fp ); return (size_t)rss * (size_t)sysconf(_SC_PAGESIZE);
return (size_t)rss * (size_t)sysconf( _SC_PAGESIZE);
#else #else
/* AIX, BSD, Solaris, and Unknown OS ------------------------ */ /* AIX, BSD, Solaris, and Unknown OS ------------------------ */
return (size_t)0L; /* Unsupported. */ return (size_t)0L; /* Unsupported. */
#endif #endif
} }
size_t Metrics::GetProcessID() size_t Metrics::GetProcessID() {
{
#if defined(_WIN32) #if defined(_WIN32)
return GetCurrentProcessId(); return GetCurrentProcessId();
#else #else
return getpid(); return getpid();
#endif #endif
} }

View File

@ -10,52 +10,52 @@
enum class MetricVariable : int32_t enum class MetricVariable : int32_t
{ {
GameLoop, GameLoop,
PacketHandling, PacketHandling,
UpdateEntities, UpdateEntities,
UpdateSpawners, UpdateSpawners,
Physics, Physics,
UpdateReplica, UpdateReplica,
Ghosting, Ghosting,
CPUTime, CPUTime,
Sleep, Sleep,
Frame, Frame,
}; };
struct Metric struct Metric
{ {
int64_t measurements[MAX_MEASURMENT_POINTS] = {}; int64_t measurements[MAX_MEASURMENT_POINTS] = {};
size_t measurementIndex = 0; size_t measurementIndex = 0;
size_t measurementSize = 0; size_t measurementSize = 0;
int64_t max = -1; int64_t max = -1;
int64_t min = -1; int64_t min = -1;
int64_t average = 0; int64_t average = 0;
std::chrono::time_point<std::chrono::high_resolution_clock> activeMeasurement; std::chrono::time_point<std::chrono::high_resolution_clock> activeMeasurement;
}; };
class Metrics class Metrics
{ {
public: public:
~Metrics(); ~Metrics();
static void AddMeasurement(MetricVariable variable, int64_t value); static void AddMeasurement(MetricVariable variable, int64_t value);
static void AddMeasurement(Metric* metric, int64_t value); static void AddMeasurement(Metric* metric, int64_t value);
static const Metric* GetMetric(MetricVariable variable); static const Metric* GetMetric(MetricVariable variable);
static void StartMeasurement(MetricVariable variable); static void StartMeasurement(MetricVariable variable);
static void EndMeasurement(MetricVariable variable); static void EndMeasurement(MetricVariable variable);
static float ToMiliseconds(int64_t nanoseconds); static float ToMiliseconds(int64_t nanoseconds);
static std::string MetricVariableToString(MetricVariable variable); static std::string MetricVariableToString(MetricVariable variable);
static const std::vector<MetricVariable>& GetAllMetrics(); static const std::vector<MetricVariable>& GetAllMetrics();
static size_t GetPeakRSS(); static size_t GetPeakRSS();
static size_t GetCurrentRSS(); static size_t GetCurrentRSS();
static size_t GetProcessID(); static size_t GetProcessID();
static void Clear(); static void Clear();
private: private:
Metrics(); Metrics();
static std::unordered_map<MetricVariable, Metric*> m_Metrics; static std::unordered_map<MetricVariable, Metric*> m_Metrics;
static std::vector<MetricVariable> m_Variables; static std::vector<MetricVariable> m_Variables;
}; };

View File

@ -13,23 +13,23 @@ const NiPoint3 NiPoint3::UNIT_ALL(1.0f, 1.0f, 1.0f);
//! Initializer //! Initializer
NiPoint3::NiPoint3(void) { NiPoint3::NiPoint3(void) {
this->x = 0; this->x = 0;
this->y = 0; this->y = 0;
this->z = 0; this->z = 0;
} }
//! Initializer //! Initializer
NiPoint3::NiPoint3(float x, float y, float z) { NiPoint3::NiPoint3(float x, float y, float z) {
this->x = x; this->x = x;
this->y = y; this->y = y;
this->z = z; this->z = z;
} }
//! Copy Constructor //! Copy Constructor
NiPoint3::NiPoint3(const NiPoint3& point) { NiPoint3::NiPoint3(const NiPoint3& point) {
this->x = point.x; this->x = point.x;
this->y = point.y; this->y = point.y;
this->z = point.z; this->z = point.z;
} }
//! Destructor //! Destructor
@ -39,63 +39,63 @@ NiPoint3::~NiPoint3(void) {}
//! Gets the X coordinate //! Gets the X coordinate
float NiPoint3::GetX(void) const { float NiPoint3::GetX(void) const {
return this->x; return this->x;
} }
//! Sets the X coordinate //! Sets the X coordinate
void NiPoint3::SetX(float x) { void NiPoint3::SetX(float x) {
this->x = x; this->x = x;
} }
//! Gets the Y coordinate //! Gets the Y coordinate
float NiPoint3::GetY(void) const { float NiPoint3::GetY(void) const {
return this->y; return this->y;
} }
//! Sets the Y coordinate //! Sets the Y coordinate
void NiPoint3::SetY(float y) { void NiPoint3::SetY(float y) {
this->y = y; this->y = y;
} }
//! Gets the Z coordinate //! Gets the Z coordinate
float NiPoint3::GetZ(void) const { float NiPoint3::GetZ(void) const {
return this->z; return this->z;
} }
//! Sets the Z coordinate //! Sets the Z coordinate
void NiPoint3::SetZ(float z) { void NiPoint3::SetZ(float z) {
this->z = z; this->z = z;
} }
// MARK: Functions // MARK: Functions
//! Gets the length of the vector //! Gets the length of the vector
float NiPoint3::Length(void) const { float NiPoint3::Length(void) const {
return sqrt(x*x + y*y + z*z); return sqrt(x * x + y * y + z * z);
} }
//! Gets the squared length of a vector //! Gets the squared length of a vector
float NiPoint3::SquaredLength(void) const { float NiPoint3::SquaredLength(void) const {
return (x*x + y*y + z*z); return (x * x + y * y + z * z);
} }
//! Returns the dot product of the vector dotted with another vector //! Returns the dot product of the vector dotted with another vector
float NiPoint3::DotProduct(const Vector3& vec) const { float NiPoint3::DotProduct(const Vector3& vec) const {
return ((this->x * vec.x) + (this->y * vec.y) + (this->z * vec.z)); return ((this->x * vec.x) + (this->y * vec.y) + (this->z * vec.z));
} }
//! Returns the cross product of the vector crossed with another vector //! Returns the cross product of the vector crossed with another vector
Vector3 NiPoint3::CrossProduct(const Vector3& vec) const { Vector3 NiPoint3::CrossProduct(const Vector3& vec) const {
return Vector3(((this->y * vec.z) - (this->z * vec.y)), return Vector3(((this->y * vec.z) - (this->z * vec.y)),
((this->z * vec.x) - (this->x * vec.z)), ((this->z * vec.x) - (this->x * vec.z)),
((this->x * vec.y) - (this->y * vec.x))); ((this->x * vec.y) - (this->y * vec.x)));
} }
//! Unitize the vector //! Unitize the vector
NiPoint3 NiPoint3::Unitize(void) const { NiPoint3 NiPoint3::Unitize(void) const {
float length = this->Length(); float length = this->Length();
return length != 0 ? *this / length : NiPoint3::ZERO; return length != 0 ? *this / length : NiPoint3::ZERO;
} }
@ -103,57 +103,57 @@ NiPoint3 NiPoint3::Unitize(void) const {
//! Operator to check for equality //! Operator to check for equality
bool NiPoint3::operator==(const NiPoint3& point) const { bool NiPoint3::operator==(const NiPoint3& point) const {
return point.x == this->x && point.y == this->y && point.z == this->z; return point.x == this->x && point.y == this->y && point.z == this->z;
} }
//! Operator to check for inequality //! Operator to check for inequality
bool NiPoint3::operator!=(const NiPoint3& point) const { bool NiPoint3::operator!=(const NiPoint3& point) const {
return !(*this == point); return !(*this == point);
} }
//! Operator for subscripting //! Operator for subscripting
float& NiPoint3::operator[](int i) { float& NiPoint3::operator[](int i) {
float * base = &x; float* base = &x;
return (float&)base[i]; return (float&)base[i];
} }
//! Operator for subscripting //! Operator for subscripting
const float& NiPoint3::operator[](int i) const { const float& NiPoint3::operator[](int i) const {
const float * base = &x; const float* base = &x;
return (float&)base[i]; return (float&)base[i];
} }
//! Operator for addition of vectors //! Operator for addition of vectors
NiPoint3 NiPoint3::operator+(const NiPoint3& point) const { NiPoint3 NiPoint3::operator+(const NiPoint3& point) const {
return NiPoint3(this->x + point.x, this->y + point.y, this->z + point.z); return NiPoint3(this->x + point.x, this->y + point.y, this->z + point.z);
} }
//! Operator for subtraction of vectors //! Operator for subtraction of vectors
NiPoint3 NiPoint3::operator-(const NiPoint3& point) const { NiPoint3 NiPoint3::operator-(const NiPoint3& point) const {
return NiPoint3(this->x - point.x, this->y - point.y, this->z - point.z); return NiPoint3(this->x - point.x, this->y - point.y, this->z - point.z);
} }
//! Operator for addition of a scalar on all vector components //! Operator for addition of a scalar on all vector components
NiPoint3 NiPoint3::operator+(float fScalar) const { NiPoint3 NiPoint3::operator+(float fScalar) const {
return NiPoint3(this->x + fScalar, this->y + fScalar, this->z + fScalar); return NiPoint3(this->x + fScalar, this->y + fScalar, this->z + fScalar);
} }
//! Operator for subtraction of a scalar on all vector components //! Operator for subtraction of a scalar on all vector components
NiPoint3 NiPoint3::operator-(float fScalar) const { NiPoint3 NiPoint3::operator-(float fScalar) const {
return NiPoint3(this->x - fScalar, this->y - fScalar, this->z - fScalar); return NiPoint3(this->x - fScalar, this->y - fScalar, this->z - fScalar);
} }
//! Operator for scalar multiplication of a vector //! Operator for scalar multiplication of a vector
NiPoint3 NiPoint3::operator*(float fScalar) const { NiPoint3 NiPoint3::operator*(float fScalar) const {
return NiPoint3(this->x * fScalar, this->y * fScalar, this->z * fScalar); return NiPoint3(this->x * fScalar, this->y * fScalar, this->z * fScalar);
} }
//! Operator for scalar division of a vector //! Operator for scalar division of a vector
NiPoint3 NiPoint3::operator/(float fScalar) const { NiPoint3 NiPoint3::operator/(float fScalar) const {
float retX = this->x != 0 ? this->x / fScalar : 0; float retX = this->x != 0 ? this->x / fScalar : 0;
float retY = this->y != 0 ? this->y / fScalar : 0; float retY = this->y != 0 ? this->y / fScalar : 0;
float retZ = this->z != 0 ? this->z / fScalar : 0; float retZ = this->z != 0 ? this->z / fScalar : 0;
return NiPoint3(retX, retY, retZ); return NiPoint3(retX, retY, retZ);
} }
@ -161,96 +161,91 @@ NiPoint3 NiPoint3::operator/(float fScalar) const {
//! Checks to see if the point (or vector) is with an Axis-Aligned Bounding Box //! Checks to see if the point (or vector) is with an Axis-Aligned Bounding Box
bool NiPoint3::IsWithinAxisAlignedBox(const NiPoint3& minPoint, const NiPoint3& maxPoint) { bool NiPoint3::IsWithinAxisAlignedBox(const NiPoint3& minPoint, const NiPoint3& maxPoint) {
if (this->x < minPoint.x) return false; if (this->x < minPoint.x) return false;
if (this->x > maxPoint.x) return false; if (this->x > maxPoint.x) return false;
if (this->y < minPoint.y) return false; if (this->y < minPoint.y) return false;
if (this->y > maxPoint.y) return false; if (this->y > maxPoint.y) return false;
return (this->z < maxPoint.z && this->z > minPoint.z); return (this->z < maxPoint.z&& this->z > minPoint.z);
} }
//! Checks to see if the point (or vector) is within a sphere //! Checks to see if the point (or vector) is within a sphere
bool NiPoint3::IsWithinSpehere(const NiPoint3& sphereCenter, float radius) { bool NiPoint3::IsWithinSpehere(const NiPoint3& sphereCenter, float radius) {
Vector3 diffVec = Vector3(x - sphereCenter.GetX(), y - sphereCenter.GetY(), z - sphereCenter.GetZ()); Vector3 diffVec = Vector3(x - sphereCenter.GetX(), y - sphereCenter.GetY(), z - sphereCenter.GetZ());
return (diffVec.SquaredLength() <= (radius * radius)); return (diffVec.SquaredLength() <= (radius * radius));
} }
NiPoint3 NiPoint3::ClosestPointOnLine(const NiPoint3& a, const NiPoint3& b, const NiPoint3& p) NiPoint3 NiPoint3::ClosestPointOnLine(const NiPoint3& a, const NiPoint3& b, const NiPoint3& p) {
{ if (a == b) return a;
if (a == b) return a;
const auto pa = p - a; const auto pa = p - a;
const auto ab = b - a; const auto ab = b - a;
const auto t = pa.DotProduct(ab) / ab.SquaredLength(); const auto t = pa.DotProduct(ab) / ab.SquaredLength();
if (t <= 0.0f) return a; if (t <= 0.0f) return a;
if (t >= 1.0f) return b; if (t >= 1.0f) return b;
return a + ab * t; return a + ab * t;
} }
float NiPoint3::Angle(const NiPoint3& a, const NiPoint3& b) float NiPoint3::Angle(const NiPoint3& a, const NiPoint3& b) {
{ const auto dot = a.DotProduct(b);
const auto dot = a.DotProduct(b); const auto lenA = a.SquaredLength();
const auto lenA = a.SquaredLength(); const auto lenB = a.SquaredLength();
const auto lenB = a.SquaredLength(); return acos(dot / sqrt(lenA * lenB));
return acos(dot / sqrt(lenA * lenB));
} }
float NiPoint3::Distance(const NiPoint3& a, const NiPoint3& b) float NiPoint3::Distance(const NiPoint3& a, const NiPoint3& b) {
{ const auto dx = a.x - b.x;
const auto dx = a.x - b.x; const auto dy = a.y - b.y;
const auto dy = a.y - b.y; const auto dz = a.z - b.z;
const auto dz = a.z - b.z;
return std::sqrt(dx * dx + dy * dy + dz * dz); return std::sqrt(dx * dx + dy * dy + dz * dz);
} }
float NiPoint3::DistanceSquared(const NiPoint3& a, const NiPoint3& b) float NiPoint3::DistanceSquared(const NiPoint3& a, const NiPoint3& b) {
{ const auto dx = a.x - b.x;
const auto dx = a.x - b.x; const auto dy = a.y - b.y;
const auto dy = a.y - b.y; const auto dz = a.z - b.z;
const auto dz = a.z - b.z;
return dx * dx + dy * dy + dz * dz; return dx * dx + dy * dy + dz * dz;
} }
NiPoint3 NiPoint3::MoveTowards(const NiPoint3& current, const NiPoint3& target, float maxDistanceDelta) NiPoint3 NiPoint3::MoveTowards(const NiPoint3& current, const NiPoint3& target, float maxDistanceDelta) {
{ float dx = target.x - current.x;
float dx = target.x - current.x; float dy = target.y - current.y;
float dy = target.y - current.y; float dz = target.z - current.z;
float dz = target.z - current.z; float lengthSquared = (float)((double)dx * (double)dx + (double)dy * (double)dy + (double)dz * (double)dz);
float lengthSquared = (float) ((double) dx * (double) dx + (double) dy * (double) dy + (double) dz * (double) dz); if ((double)lengthSquared == 0.0 || (double)maxDistanceDelta >= 0.0 && (double)lengthSquared <= (double)maxDistanceDelta * (double)maxDistanceDelta)
if ((double) lengthSquared == 0.0 || (double) maxDistanceDelta >= 0.0 && (double) lengthSquared <= (double) maxDistanceDelta * (double) maxDistanceDelta) return target;
return target; float length = (float)std::sqrt((double)lengthSquared);
float length = (float) std::sqrt((double) lengthSquared); return NiPoint3(current.x + dx / length * maxDistanceDelta, current.y + dy / length * maxDistanceDelta, current.z + dz / length * maxDistanceDelta);
return NiPoint3(current.x + dx / length * maxDistanceDelta, current.y + dy / length * maxDistanceDelta, current.z + dz / length * maxDistanceDelta);
} }
//This code is yoinked from the MS XNA code, so it should be right, even if it's horrible. //This code is yoinked from the MS XNA code, so it should be right, even if it's horrible.
NiPoint3 NiPoint3::RotateByQuaternion(const NiQuaternion& rotation) { NiPoint3 NiPoint3::RotateByQuaternion(const NiQuaternion& rotation) {
Vector3 vector; Vector3 vector;
float num12 = rotation.x + rotation.x; float num12 = rotation.x + rotation.x;
float num2 = rotation.y + rotation.y; float num2 = rotation.y + rotation.y;
float num = rotation.z + rotation.z; float num = rotation.z + rotation.z;
float num11 = rotation.w * num12; float num11 = rotation.w * num12;
float num10 = rotation.w * num2; float num10 = rotation.w * num2;
float num9 = rotation.w * num; float num9 = rotation.w * num;
float num8 = rotation.x * num12; float num8 = rotation.x * num12;
float num7 = rotation.x * num2; float num7 = rotation.x * num2;
float num6 = rotation.x * num; float num6 = rotation.x * num;
float num5 = rotation.y * num2; float num5 = rotation.y * num2;
float num4 = rotation.y * num; float num4 = rotation.y * num;
float num3 = rotation.z * num; float num3 = rotation.z * num;
NiPoint3 value = *this; NiPoint3 value = *this;
float num15 = ((value.x * ((1.0f - num5) - num3)) + (value.y * (num7 - num9))) + (value.z * (num6 + num10)); float num15 = ((value.x * ((1.0f - num5) - num3)) + (value.y * (num7 - num9))) + (value.z * (num6 + num10));
float num14 = ((value.x * (num7 + num9)) + (value.y * ((1.0f - num8) - num3))) + (value.z * (num4 - num11)); float num14 = ((value.x * (num7 + num9)) + (value.y * ((1.0f - num8) - num3))) + (value.z * (num4 - num11));
float num13 = ((value.x * (num6 - num10)) + (value.y * (num4 + num11))) + (value.z * ((1.0f - num8) - num5)); float num13 = ((value.x * (num6 - num10)) + (value.y * (num4 + num11))) + (value.z * ((1.0f - num8) - num5));
vector.x = num15; vector.x = num15;
vector.y = num14; vector.y = num14;
vector.z = num13; vector.z = num13;
return vector; return vector;
} }

View File

@ -12,177 +12,177 @@ typedef NiPoint3 Vector3; //!< The Vector3 class is technically the NiPoin
//! A custom class the defines a point in space //! A custom class the defines a point in space
class NiPoint3 { class NiPoint3 {
public: public:
float x; //!< The x position float x; //!< The x position
float y; //!< The y position float y; //!< The y position
float z; //!< The z position float z; //!< The z position
//! Initializer //! Initializer
NiPoint3(void); NiPoint3(void);
//! Initializer //! Initializer
/*! /*!
\param x The x coordinate \param x The x coordinate
\param y The y coordinate \param y The y coordinate
\param z The z coordinate \param z The z coordinate
*/ */
NiPoint3(float x, float y, float z); NiPoint3(float x, float y, float z);
//! Copy Constructor //! Copy Constructor
/*! /*!
\param point The point to copy \param point The point to copy
*/ */
NiPoint3(const NiPoint3& point); NiPoint3(const NiPoint3& point);
//! Destructor //! Destructor
~NiPoint3(void); ~NiPoint3(void);
// MARK: Constants // MARK: Constants
static const NiPoint3 ZERO; //!< Point(0, 0, 0) static const NiPoint3 ZERO; //!< Point(0, 0, 0)
static const NiPoint3 UNIT_X; //!< Point(1, 0, 0) static const NiPoint3 UNIT_X; //!< Point(1, 0, 0)
static const NiPoint3 UNIT_Y; //!< Point(0, 1, 0) static const NiPoint3 UNIT_Y; //!< Point(0, 1, 0)
static const NiPoint3 UNIT_Z; //!< Point(0, 0, 1) static const NiPoint3 UNIT_Z; //!< Point(0, 0, 1)
static const NiPoint3 UNIT_ALL; //!< Point(1, 1, 1) static const NiPoint3 UNIT_ALL; //!< Point(1, 1, 1)
// MARK: Getters / Setters // MARK: Getters / Setters
//! Gets the X coordinate //! Gets the X coordinate
/*! /*!
\return The x coordinate \return The x coordinate
*/ */
float GetX(void) const; float GetX(void) const;
//! Sets the X coordinate //! Sets the X coordinate
/*! /*!
\param x The x coordinate \param x The x coordinate
*/ */
void SetX(float x); void SetX(float x);
//! Gets the Y coordinate //! Gets the Y coordinate
/*! /*!
\return The y coordinate \return The y coordinate
*/ */
float GetY(void) const; float GetY(void) const;
//! Sets the Y coordinate //! Sets the Y coordinate
/*! /*!
\param y The y coordinate \param y The y coordinate
*/ */
void SetY(float y); void SetY(float y);
//! Gets the Z coordinate //! Gets the Z coordinate
/*! /*!
\return The z coordinate \return The z coordinate
*/ */
float GetZ(void) const; float GetZ(void) const;
//! Sets the Z coordinate //! Sets the Z coordinate
/*! /*!
\param z The z coordinate \param z The z coordinate
*/ */
void SetZ(float z); void SetZ(float z);
// MARK: Member Functions // MARK: Member Functions
//! Gets the length of the vector //! Gets the length of the vector
/*! /*!
\return The scalar length of the vector \return The scalar length of the vector
*/ */
float Length(void) const; float Length(void) const;
//! Gets the squared length of a vector //! Gets the squared length of a vector
/*! /*!
\return The squared length of a vector \return The squared length of a vector
*/ */
float SquaredLength(void) const; float SquaredLength(void) const;
//! Returns the dot product of the vector dotted with another vector //! Returns the dot product of the vector dotted with another vector
/*! /*!
\param vec The second vector \param vec The second vector
\return The dot product of the two vectors \return The dot product of the two vectors
*/ */
float DotProduct(const Vector3& vec) const; float DotProduct(const Vector3& vec) const;
//! Returns the cross product of the vector crossed with another vector //! Returns the cross product of the vector crossed with another vector
/*! /*!
\param vec The second vector \param vec The second vector
\return The cross product of the two vectors \return The cross product of the two vectors
*/ */
Vector3 CrossProduct(const Vector3& vec) const; Vector3 CrossProduct(const Vector3& vec) const;
//! Unitize the vector //! Unitize the vector
/*! /*!
\returns The current vector \returns The current vector
*/ */
NiPoint3 Unitize(void) const; NiPoint3 Unitize(void) const;
// MARK: Operators // MARK: Operators
//! Operator to check for equality //! Operator to check for equality
bool operator==(const NiPoint3& point) const; bool operator==(const NiPoint3& point) const;
//! Operator to check for inequality //! Operator to check for inequality
bool operator!=(const NiPoint3& point) const; bool operator!=(const NiPoint3& point) const;
//! Operator for subscripting //! Operator for subscripting
float& operator[](int i); float& operator[](int i);
//! Operator for subscripting //! Operator for subscripting
const float& operator[](int i) const; const float& operator[](int i) const;
//! Operator for addition of vectors //! Operator for addition of vectors
NiPoint3 operator+(const NiPoint3& point) const; NiPoint3 operator+(const NiPoint3& point) const;
//! Operator for subtraction of vectors //! Operator for subtraction of vectors
NiPoint3 operator-(const NiPoint3& point) const; NiPoint3 operator-(const NiPoint3& point) const;
//! Operator for addition of a scalar on all vector components //! Operator for addition of a scalar on all vector components
NiPoint3 operator+(float fScalar) const; NiPoint3 operator+(float fScalar) const;
//! Operator for subtraction of a scalar on all vector components //! Operator for subtraction of a scalar on all vector components
NiPoint3 operator-(float fScalar) const; NiPoint3 operator-(float fScalar) const;
//! Operator for scalar multiplication of a vector //! Operator for scalar multiplication of a vector
NiPoint3 operator*(float fScalar) const; NiPoint3 operator*(float fScalar) const;
//! Operator for scalar division of a vector //! Operator for scalar division of a vector
NiPoint3 operator/(float fScalar) const; NiPoint3 operator/(float fScalar) const;
// MARK: Helper Functions // MARK: Helper Functions
//! Checks to see if the point (or vector) is with an Axis-Aligned Bounding Box //! Checks to see if the point (or vector) is with an Axis-Aligned Bounding Box
/*! /*!
\param minPoint The minimum point of the bounding box \param minPoint The minimum point of the bounding box
\param maxPoint The maximum point of the bounding box \param maxPoint The maximum point of the bounding box
\return Whether or not this point lies within the box \return Whether or not this point lies within the box
*/ */
bool IsWithinAxisAlignedBox(const NiPoint3& minPoint, const NiPoint3& maxPoint); bool IsWithinAxisAlignedBox(const NiPoint3& minPoint, const NiPoint3& maxPoint);
//! Checks to see if the point (or vector) is within a sphere //! Checks to see if the point (or vector) is within a sphere
/*! /*!
\param sphereCenter The sphere center \param sphereCenter The sphere center
\param radius The radius \param radius The radius
*/ */
bool IsWithinSpehere(const NiPoint3& sphereCenter, float radius); bool IsWithinSpehere(const NiPoint3& sphereCenter, float radius);
/*! /*!
\param a Start of line \param a Start of line
\param b End of line \param b End of line
\param p Refrence point \param p Refrence point
\return The point of line AB which is closest to P \return The point of line AB which is closest to P
*/ */
static NiPoint3 ClosestPointOnLine(const NiPoint3& a, const NiPoint3& b, const NiPoint3& p); static NiPoint3 ClosestPointOnLine(const NiPoint3& a, const NiPoint3& b, const NiPoint3& p);
static float Angle(const NiPoint3& a, const NiPoint3& b); static float Angle(const NiPoint3& a, const NiPoint3& b);
static float Distance(const NiPoint3& a, const NiPoint3& b); static float Distance(const NiPoint3& a, const NiPoint3& b);
static float DistanceSquared(const NiPoint3& a, const NiPoint3& b);
static NiPoint3 MoveTowards(const NiPoint3& current, const NiPoint3& target, float maxDistanceDelta); static float DistanceSquared(const NiPoint3& a, const NiPoint3& b);
NiPoint3 RotateByQuaternion(const NiQuaternion& rotation); static NiPoint3 MoveTowards(const NiPoint3& current, const NiPoint3& target, float maxDistanceDelta);
NiPoint3 RotateByQuaternion(const NiQuaternion& rotation);
}; };

View File

@ -8,18 +8,18 @@ const NiQuaternion NiQuaternion::IDENTITY(1, 0, 0, 0);
//! The initializer //! The initializer
NiQuaternion::NiQuaternion(void) { NiQuaternion::NiQuaternion(void) {
this->w = 1; this->w = 1;
this->x = 0; this->x = 0;
this->y = 0; this->y = 0;
this->z = 0; this->z = 0;
} }
//! The initializer //! The initializer
NiQuaternion::NiQuaternion(float w, float x, float y, float z) { NiQuaternion::NiQuaternion(float w, float x, float y, float z) {
this->w = w; this->w = w;
this->x = x; this->x = x;
this->y = y; this->y = y;
this->z = z; this->z = z;
} }
//! Destructor //! Destructor
@ -30,42 +30,42 @@ NiQuaternion::~NiQuaternion(void) {}
//! Gets the W coordinate //! Gets the W coordinate
float NiQuaternion::GetW(void) const { float NiQuaternion::GetW(void) const {
return this->w; return this->w;
} }
//! Sets the W coordinate //! Sets the W coordinate
void NiQuaternion::SetW(float w) { void NiQuaternion::SetW(float w) {
this->w = w; this->w = w;
} }
//! Gets the X coordinate //! Gets the X coordinate
float NiQuaternion::GetX(void) const { float NiQuaternion::GetX(void) const {
return this->x; return this->x;
} }
//! Sets the X coordinate //! Sets the X coordinate
void NiQuaternion::SetX(float x) { void NiQuaternion::SetX(float x) {
this->x = x; this->x = x;
} }
//! Gets the Y coordinate //! Gets the Y coordinate
float NiQuaternion::GetY(void) const { float NiQuaternion::GetY(void) const {
return this->y; return this->y;
} }
//! Sets the Y coordinate //! Sets the Y coordinate
void NiQuaternion::SetY(float y) { void NiQuaternion::SetY(float y) {
this->y = y; this->y = y;
} }
//! Gets the Z coordinate //! Gets the Z coordinate
float NiQuaternion::GetZ(void) const { float NiQuaternion::GetZ(void) const {
return this->z; return this->z;
} }
//! Sets the Z coordinate //! Sets the Z coordinate
void NiQuaternion::SetZ(float z) { void NiQuaternion::SetZ(float z) {
this->z = z; this->z = z;
} }
@ -73,55 +73,54 @@ void NiQuaternion::SetZ(float z) {
//! Returns the forward vector from the quaternion //! Returns the forward vector from the quaternion
Vector3 NiQuaternion::GetForwardVector(void) const { Vector3 NiQuaternion::GetForwardVector(void) const {
return Vector3(2 * (x * z + w * y), 2 * (y * z - w * x), 1 - 2 * (x * x + y * y)); return Vector3(2 * (x * z + w * y), 2 * (y * z - w * x), 1 - 2 * (x * x + y * y));
} }
//! Returns the up vector from the quaternion //! Returns the up vector from the quaternion
Vector3 NiQuaternion::GetUpVector(void) const { Vector3 NiQuaternion::GetUpVector(void) const {
return Vector3(2 * (x * y - w * z), 1 - 2 * (x * x + z * z), 2 * (y * z + w * x)); return Vector3(2 * (x * y - w * z), 1 - 2 * (x * x + z * z), 2 * (y * z + w * x));
} }
//! Returns the right vector from the quaternion //! Returns the right vector from the quaternion
Vector3 NiQuaternion::GetRightVector(void) const { Vector3 NiQuaternion::GetRightVector(void) const {
return Vector3(1 - 2 * (y * y + z * z), 2 * (x * y + w * z), 2 * (x * z - w * y)); return Vector3(1 - 2 * (y * y + z * z), 2 * (x * y + w * z), 2 * (x * z - w * y));
} }
Vector3 NiQuaternion::GetEulerAngles() const { Vector3 NiQuaternion::GetEulerAngles() const {
Vector3 angles; Vector3 angles;
// roll (x-axis rotation) // roll (x-axis rotation)
const float sinr_cosp = 2 * (w * x + y * z); const float sinr_cosp = 2 * (w * x + y * z);
const float cosr_cosp = 1 - 2 * (x * x + y * y); const float cosr_cosp = 1 - 2 * (x * x + y * y);
angles.x = std::atan2(sinr_cosp, cosr_cosp); angles.x = std::atan2(sinr_cosp, cosr_cosp);
// pitch (y-axis rotation) // pitch (y-axis rotation)
const float sinp = 2 * (w * y - z * x); const float sinp = 2 * (w * y - z * x);
if (std::abs(sinp) >= 1) {
angles.y = std::copysign(3.14 / 2, sinp); // use 90 degrees if out of range
}
else {
angles.y = std::asin(sinp);
}
// yaw (z-axis rotation) if (std::abs(sinp) >= 1) {
const float siny_cosp = 2 * (w * z + x * y); angles.y = std::copysign(3.14 / 2, sinp); // use 90 degrees if out of range
const float cosy_cosp = 1 - 2 * (y * y + z * z); } else {
angles.z = std::atan2(siny_cosp, cosy_cosp); angles.y = std::asin(sinp);
}
return angles; // yaw (z-axis rotation)
const float siny_cosp = 2 * (w * z + x * y);
const float cosy_cosp = 1 - 2 * (y * y + z * z);
angles.z = std::atan2(siny_cosp, cosy_cosp);
return angles;
} }
// MARK: Operators // MARK: Operators
//! Operator to check for equality //! Operator to check for equality
bool NiQuaternion::operator==(const NiQuaternion& rot) const { bool NiQuaternion::operator==(const NiQuaternion& rot) const {
return rot.x == this->x && rot.y == this->y && rot.z == this->z && rot.w == this->w; return rot.x == this->x && rot.y == this->y && rot.z == this->z && rot.w == this->w;
} }
//! Operator to check for inequality //! Operator to check for inequality
bool NiQuaternion::operator!=(const NiQuaternion& rot) const { bool NiQuaternion::operator!=(const NiQuaternion& rot) const {
return !(*this == rot); return !(*this == rot);
} }
@ -135,65 +134,63 @@ NiQuaternion NiQuaternion::LookAt(const NiPoint3& sourcePoint, const NiPoint3& d
source.y = 0.0f; source.y = 0.0f;
dest.y = 0.0f; dest.y = 0.0f;
NiPoint3 forwardVector = NiPoint3(dest - source).Unitize(); NiPoint3 forwardVector = NiPoint3(dest - source).Unitize();
NiPoint3 posZ = NiPoint3::UNIT_Z; NiPoint3 posZ = NiPoint3::UNIT_Z;
NiPoint3 vecA = posZ.CrossProduct(forwardVector).Unitize(); NiPoint3 vecA = posZ.CrossProduct(forwardVector).Unitize();
float dot = posZ.DotProduct(forwardVector); float dot = posZ.DotProduct(forwardVector);
float rotAngle = static_cast<float>(acos(dot)); float rotAngle = static_cast<float>(acos(dot));
NiPoint3 vecB = vecA.CrossProduct(posZ); NiPoint3 vecB = vecA.CrossProduct(posZ);
if (vecB.DotProduct(forwardVector) < 0) rotAngle = -rotAngle; if (vecB.DotProduct(forwardVector) < 0) rotAngle = -rotAngle;
return NiQuaternion::CreateFromAxisAngle(vecA, rotAngle); return NiQuaternion::CreateFromAxisAngle(vecA, rotAngle);
} }
NiQuaternion NiQuaternion::LookAtUnlocked(const NiPoint3& sourcePoint, const NiPoint3& destPoint) NiQuaternion NiQuaternion::LookAtUnlocked(const NiPoint3& sourcePoint, const NiPoint3& destPoint) {
{ NiPoint3 forwardVector = NiPoint3(destPoint - sourcePoint).Unitize();
NiPoint3 forwardVector = NiPoint3(destPoint - sourcePoint).Unitize();
NiPoint3 posZ = NiPoint3::UNIT_Z;
NiPoint3 posZ = NiPoint3::UNIT_Z; NiPoint3 vecA = posZ.CrossProduct(forwardVector).Unitize();
NiPoint3 vecA = posZ.CrossProduct(forwardVector).Unitize();
float dot = posZ.DotProduct(forwardVector);
float dot = posZ.DotProduct(forwardVector); float rotAngle = static_cast<float>(acos(dot));
float rotAngle = static_cast<float>(acos(dot));
NiPoint3 vecB = vecA.CrossProduct(posZ);
NiPoint3 vecB = vecA.CrossProduct(posZ);
if (vecB.DotProduct(forwardVector) < 0) rotAngle = -rotAngle;
if (vecB.DotProduct(forwardVector) < 0) rotAngle = -rotAngle; return NiQuaternion::CreateFromAxisAngle(vecA, rotAngle);
return NiQuaternion::CreateFromAxisAngle(vecA, rotAngle);
} }
//! Creates a Quaternion from a specific axis and angle relative to that axis //! Creates a Quaternion from a specific axis and angle relative to that axis
NiQuaternion NiQuaternion::CreateFromAxisAngle(const Vector3& axis, float angle) { NiQuaternion NiQuaternion::CreateFromAxisAngle(const Vector3& axis, float angle) {
float halfAngle = angle * 0.5f; float halfAngle = angle * 0.5f;
float s = static_cast<float>(sin(halfAngle)); float s = static_cast<float>(sin(halfAngle));
NiQuaternion q; NiQuaternion q;
q.x = axis.GetX() * s; q.x = axis.GetX() * s;
q.y = axis.GetY() * s; q.y = axis.GetY() * s;
q.z = axis.GetZ() * s; q.z = axis.GetZ() * s;
q.w = static_cast<float>(cos(halfAngle)); q.w = static_cast<float>(cos(halfAngle));
return q; return q;
} }
NiQuaternion NiQuaternion::FromEulerAngles(const NiPoint3& eulerAngles) NiQuaternion NiQuaternion::FromEulerAngles(const NiPoint3& eulerAngles) {
{ // Abbreviations for the various angular functions
// Abbreviations for the various angular functions float cy = cos(eulerAngles.z * 0.5);
float cy = cos(eulerAngles.z * 0.5); float sy = sin(eulerAngles.z * 0.5);
float sy = sin(eulerAngles.z * 0.5); float cp = cos(eulerAngles.y * 0.5);
float cp = cos(eulerAngles.y * 0.5); float sp = sin(eulerAngles.y * 0.5);
float sp = sin(eulerAngles.y * 0.5); float cr = cos(eulerAngles.x * 0.5);
float cr = cos(eulerAngles.x * 0.5); float sr = sin(eulerAngles.x * 0.5);
float sr = sin(eulerAngles.x * 0.5);
NiQuaternion q; NiQuaternion q;
q.w = cr * cp * cy + sr * sp * sy; q.w = cr * cp * cy + sr * sp * sy;
q.x = sr * cp * cy - cr * sp * sy; q.x = sr * cp * cy - cr * sp * sy;
q.y = cr * sp * cy + sr * cp * sy; q.y = cr * sp * cy + sr * cp * sy;
q.z = cr * cp * sy - sr * sp * cy; q.z = cr * cp * sy - sr * sp * cy;
return q; return q;
} }

View File

@ -14,138 +14,138 @@ typedef NiQuaternion Quaternion; //!< A typedef for a shorthand version o
//! A class that defines a rotation in space //! A class that defines a rotation in space
class NiQuaternion { class NiQuaternion {
public: public:
float w; //!< The w coordinate float w; //!< The w coordinate
float x; //!< The x coordinate float x; //!< The x coordinate
float y; //!< The y coordinate float y; //!< The y coordinate
float z; //!< The z coordinate float z; //!< The z coordinate
//! The initializer
NiQuaternion(void);
//! The initializer
/*!
\param w The w coordinate
\param x The x coordinate
\param y The y coordinate
\param z The z coordinate
*/
NiQuaternion(float w, float x, float y, float z);
//! Destructor
~NiQuaternion(void);
// MARK: Constants
static const NiQuaternion IDENTITY; //!< Quaternion(1, 0, 0, 0)
// MARK: Setters / Getters
//! Gets the W coordinate
/*!
\return The w coordinate
*/
float GetW(void) const;
//! Sets the W coordinate
/*!
\param w The w coordinate
*/
void SetW(float w);
//! Gets the X coordinate
/*!
\return The x coordinate
*/
float GetX(void) const;
//! Sets the X coordinate
/*!
\param x The x coordinate
*/
void SetX(float x);
//! Gets the Y coordinate
/*!
\return The y coordinate
*/
float GetY(void) const;
//! Sets the Y coordinate
/*!
\param y The y coordinate
*/
void SetY(float y);
//! Gets the Z coordinate
/*!
\return The z coordinate
*/
float GetZ(void) const;
//! Sets the Z coordinate
/*!
\param z The z coordinate
*/
void SetZ(float z);
// MARK: Member Functions
//! Returns the forward vector from the quaternion
/*!
\return The forward vector of the quaternion
*/
Vector3 GetForwardVector(void) const;
//! Returns the up vector from the quaternion
/*!
\return The up vector fo the quaternion
*/
Vector3 GetUpVector(void) const;
//! Returns the right vector from the quaternion
/*!
\return The right vector of the quaternion
*/
Vector3 GetRightVector(void) const;
Vector3 GetEulerAngles() const;
// MARK: Operators
//! Operator to check for equality
bool operator==(const NiQuaternion& rot) const;
//! Operator to check for inequality
bool operator!=(const NiQuaternion& rot) const;
// MARK: Helper Functions
//! Look from a specific point in space to another point in space (Y-locked)
/*!
\param sourcePoint The source location
\param destPoint The destination location
\return The Quaternion with the rotation towards the destination
*/
static NiQuaternion LookAt(const NiPoint3& sourcePoint, const NiPoint3& destPoint);
//! Look from a specific point in space to another point in space
/*!
\param sourcePoint The source location
\param destPoint The destination location
\return The Quaternion with the rotation towards the destination
*/
static NiQuaternion LookAtUnlocked(const NiPoint3& sourcePoint, const NiPoint3& destPoint);
//! Creates a Quaternion from a specific axis and angle relative to that axis
/*!
\param axis The axis that is used
\param angle The angle relative to this axis
\return A quaternion created from the axis and angle
*/
static NiQuaternion CreateFromAxisAngle(const Vector3& axis, float angle);
static NiQuaternion FromEulerAngles(const NiPoint3& eulerAngles); //! The initializer
NiQuaternion(void);
//! The initializer
/*!
\param w The w coordinate
\param x The x coordinate
\param y The y coordinate
\param z The z coordinate
*/
NiQuaternion(float w, float x, float y, float z);
//! Destructor
~NiQuaternion(void);
// MARK: Constants
static const NiQuaternion IDENTITY; //!< Quaternion(1, 0, 0, 0)
// MARK: Setters / Getters
//! Gets the W coordinate
/*!
\return The w coordinate
*/
float GetW(void) const;
//! Sets the W coordinate
/*!
\param w The w coordinate
*/
void SetW(float w);
//! Gets the X coordinate
/*!
\return The x coordinate
*/
float GetX(void) const;
//! Sets the X coordinate
/*!
\param x The x coordinate
*/
void SetX(float x);
//! Gets the Y coordinate
/*!
\return The y coordinate
*/
float GetY(void) const;
//! Sets the Y coordinate
/*!
\param y The y coordinate
*/
void SetY(float y);
//! Gets the Z coordinate
/*!
\return The z coordinate
*/
float GetZ(void) const;
//! Sets the Z coordinate
/*!
\param z The z coordinate
*/
void SetZ(float z);
// MARK: Member Functions
//! Returns the forward vector from the quaternion
/*!
\return The forward vector of the quaternion
*/
Vector3 GetForwardVector(void) const;
//! Returns the up vector from the quaternion
/*!
\return The up vector fo the quaternion
*/
Vector3 GetUpVector(void) const;
//! Returns the right vector from the quaternion
/*!
\return The right vector of the quaternion
*/
Vector3 GetRightVector(void) const;
Vector3 GetEulerAngles() const;
// MARK: Operators
//! Operator to check for equality
bool operator==(const NiQuaternion& rot) const;
//! Operator to check for inequality
bool operator!=(const NiQuaternion& rot) const;
// MARK: Helper Functions
//! Look from a specific point in space to another point in space (Y-locked)
/*!
\param sourcePoint The source location
\param destPoint The destination location
\return The Quaternion with the rotation towards the destination
*/
static NiQuaternion LookAt(const NiPoint3& sourcePoint, const NiPoint3& destPoint);
//! Look from a specific point in space to another point in space
/*!
\param sourcePoint The source location
\param destPoint The destination location
\return The Quaternion with the rotation towards the destination
*/
static NiQuaternion LookAtUnlocked(const NiPoint3& sourcePoint, const NiPoint3& destPoint);
//! Creates a Quaternion from a specific axis and angle relative to that axis
/*!
\param axis The axis that is used
\param angle The angle relative to this axis
\return A quaternion created from the axis and angle
*/
static NiQuaternion CreateFromAxisAngle(const Vector3& axis, float angle);
static NiQuaternion FromEulerAngles(const NiPoint3& eulerAngles);
}; };

View File

@ -7,36 +7,36 @@
*/ */
enum class PermissionMap : uint64_t enum class PermissionMap : uint64_t
{ {
/** /**
* Reserved for future use, bit 0-3. * Reserved for future use, bit 0-3.
*/ */
/** /**
* The character has restricted trade acccess, bit 4. * The character has restricted trade acccess, bit 4.
*/ */
RestrictedTradeAccess = 0x1 << 4, RestrictedTradeAccess = 0x1 << 4,
/** /**
* The character has restricted mail access, bit 5. * The character has restricted mail access, bit 5.
*/ */
RestrictedMailAccess = 0x1 << 5, RestrictedMailAccess = 0x1 << 5,
/** /**
* The character has restricted chat access, bit 6. * The character has restricted chat access, bit 6.
*/ */
RestrictedChatAccess = 0x1 << 6, RestrictedChatAccess = 0x1 << 6,
// //
// Combined permissions // Combined permissions
// //
/** /**
* The character is marked as 'old', restricted from trade and mail. * The character is marked as 'old', restricted from trade and mail.
*/ */
Old = RestrictedTradeAccess | RestrictedMailAccess, Old = RestrictedTradeAccess | RestrictedMailAccess,
/** /**
* The character is soft banned, restricted from trade, mail, and chat. * The character is soft banned, restricted from trade, mail, and chat.
*/ */
SoftBanned = RestrictedTradeAccess | RestrictedMailAccess | RestrictedChatAccess, SoftBanned = RestrictedTradeAccess | RestrictedMailAccess | RestrictedChatAccess,
}; };

View File

@ -5,153 +5,148 @@
const unsigned long long SHA512::sha512_k[80] = //ULL = uint64 const unsigned long long SHA512::sha512_k[80] = //ULL = uint64
{ 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, { 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
0x113f9804bef90daeULL, 0x1b710b35131c471bULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL }; 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL };
void SHA512::transform(const unsigned char *message, unsigned int block_nb) void SHA512::transform(const unsigned char* message, unsigned int block_nb) {
{ uint64 w[80];
uint64 w[80]; uint64 wv[8];
uint64 wv[8]; uint64 t1, t2;
uint64 t1, t2; const unsigned char* sub_block;
const unsigned char *sub_block; int i, j;
int i, j; for (i = 0; i < (int)block_nb; i++) {
for (i = 0; i < (int)block_nb; i++) { sub_block = message + (i << 7);
sub_block = message + (i << 7); for (j = 0; j < 16; j++) {
for (j = 0; j < 16; j++) { SHA2_PACK64(&sub_block[j << 3], &w[j]);
SHA2_PACK64(&sub_block[j << 3], &w[j]); }
} for (j = 16; j < 80; j++) {
for (j = 16; j < 80; j++) { w[j] = SHA512_F4(w[j - 2]) + w[j - 7] + SHA512_F3(w[j - 15]) + w[j - 16];
w[j] = SHA512_F4(w[j - 2]) + w[j - 7] + SHA512_F3(w[j - 15]) + w[j - 16]; }
} for (j = 0; j < 8; j++) {
for (j = 0; j < 8; j++) { wv[j] = m_h[j];
wv[j] = m_h[j]; }
} for (j = 0; j < 80; j++) {
for (j = 0; j < 80; j++) { t1 = wv[7] + SHA512_F2(wv[4]) + SHA2_CH(wv[4], wv[5], wv[6])
t1 = wv[7] + SHA512_F2(wv[4]) + SHA2_CH(wv[4], wv[5], wv[6]) + sha512_k[j] + w[j];
+ sha512_k[j] + w[j]; t2 = SHA512_F1(wv[0]) + SHA2_MAJ(wv[0], wv[1], wv[2]);
t2 = SHA512_F1(wv[0]) + SHA2_MAJ(wv[0], wv[1], wv[2]); wv[7] = wv[6];
wv[7] = wv[6]; wv[6] = wv[5];
wv[6] = wv[5]; wv[5] = wv[4];
wv[5] = wv[4]; wv[4] = wv[3] + t1;
wv[4] = wv[3] + t1; wv[3] = wv[2];
wv[3] = wv[2]; wv[2] = wv[1];
wv[2] = wv[1]; wv[1] = wv[0];
wv[1] = wv[0]; wv[0] = t1 + t2;
wv[0] = t1 + t2; }
} for (j = 0; j < 8; j++) {
for (j = 0; j < 8; j++) { m_h[j] += wv[j];
m_h[j] += wv[j]; }
}
}
}
} }
void SHA512::init() void SHA512::init() {
{ m_h[0] = 0x6a09e667f3bcc908ULL;
m_h[0] = 0x6a09e667f3bcc908ULL; m_h[1] = 0xbb67ae8584caa73bULL;
m_h[1] = 0xbb67ae8584caa73bULL; m_h[2] = 0x3c6ef372fe94f82bULL;
m_h[2] = 0x3c6ef372fe94f82bULL; m_h[3] = 0xa54ff53a5f1d36f1ULL;
m_h[3] = 0xa54ff53a5f1d36f1ULL; m_h[4] = 0x510e527fade682d1ULL;
m_h[4] = 0x510e527fade682d1ULL; m_h[5] = 0x9b05688c2b3e6c1fULL;
m_h[5] = 0x9b05688c2b3e6c1fULL; m_h[6] = 0x1f83d9abfb41bd6bULL;
m_h[6] = 0x1f83d9abfb41bd6bULL; m_h[7] = 0x5be0cd19137e2179ULL;
m_h[7] = 0x5be0cd19137e2179ULL; m_len = 0;
m_len = 0; m_tot_len = 0;
m_tot_len = 0;
} }
void SHA512::update(const unsigned char *message, unsigned int len) void SHA512::update(const unsigned char* message, unsigned int len) {
{ unsigned int block_nb;
unsigned int block_nb; unsigned int new_len, rem_len, tmp_len;
unsigned int new_len, rem_len, tmp_len; const unsigned char* shifted_message;
const unsigned char *shifted_message; tmp_len = SHA384_512_BLOCK_SIZE - m_len;
tmp_len = SHA384_512_BLOCK_SIZE - m_len; rem_len = len < tmp_len ? len : tmp_len;
rem_len = len < tmp_len ? len : tmp_len; memcpy(&m_block[m_len], message, rem_len);
memcpy(&m_block[m_len], message, rem_len); if (m_len + len < SHA384_512_BLOCK_SIZE) {
if (m_len + len < SHA384_512_BLOCK_SIZE) { m_len += len;
m_len += len; return;
return; }
} new_len = len - rem_len;
new_len = len - rem_len; block_nb = new_len / SHA384_512_BLOCK_SIZE;
block_nb = new_len / SHA384_512_BLOCK_SIZE; shifted_message = message + rem_len;
shifted_message = message + rem_len; transform(m_block, 1);
transform(m_block, 1); transform(shifted_message, block_nb);
transform(shifted_message, block_nb); rem_len = new_len % SHA384_512_BLOCK_SIZE;
rem_len = new_len % SHA384_512_BLOCK_SIZE; memcpy(m_block, &shifted_message[block_nb << 7], rem_len);
memcpy(m_block, &shifted_message[block_nb << 7], rem_len); m_len = rem_len;
m_len = rem_len; m_tot_len += (block_nb + 1) << 7;
m_tot_len += (block_nb + 1) << 7;
} }
void SHA512::final(unsigned char *digest) void SHA512::final(unsigned char* digest) {
{ unsigned int block_nb;
unsigned int block_nb; unsigned int pm_len;
unsigned int pm_len; unsigned int len_b;
unsigned int len_b; int i;
int i; block_nb = 1 + ((SHA384_512_BLOCK_SIZE - 17)
block_nb = 1 + ((SHA384_512_BLOCK_SIZE - 17) < (m_len % SHA384_512_BLOCK_SIZE));
< (m_len % SHA384_512_BLOCK_SIZE)); len_b = (m_tot_len + m_len) << 3;
len_b = (m_tot_len + m_len) << 3; pm_len = block_nb << 7;
pm_len = block_nb << 7; memset(m_block + m_len, 0, pm_len - m_len);
memset(m_block + m_len, 0, pm_len - m_len); m_block[m_len] = 0x80;
m_block[m_len] = 0x80; SHA2_UNPACK32(len_b, m_block + pm_len - 4);
SHA2_UNPACK32(len_b, m_block + pm_len - 4); transform(m_block, block_nb);
transform(m_block, block_nb); for (i = 0; i < 8; i++) {
for (i = 0; i < 8; i++) { SHA2_UNPACK64(m_h[i], &digest[i << 3]);
SHA2_UNPACK64(m_h[i], &digest[i << 3]); }
}
} }
std::string sha512(std::string input) std::string sha512(std::string input) {
{ unsigned char digest[SHA512::DIGEST_SIZE];
unsigned char digest[SHA512::DIGEST_SIZE]; memset(digest, 0, SHA512::DIGEST_SIZE);
memset(digest, 0, SHA512::DIGEST_SIZE); class SHA512 ctx;
class SHA512 ctx; ctx.init();
ctx.init(); ctx.update((unsigned char*)input.c_str(), input.length());
ctx.update((unsigned char*)input.c_str(), input.length()); ctx.final(digest);
ctx.final(digest);
char buf[2 * SHA512::DIGEST_SIZE + 1]; char buf[2 * SHA512::DIGEST_SIZE + 1];
buf[2 * SHA512::DIGEST_SIZE] = 0; buf[2 * SHA512::DIGEST_SIZE] = 0;
for (int i = 0; i < SHA512::DIGEST_SIZE; i++) for (int i = 0; i < SHA512::DIGEST_SIZE; i++)
sprintf(buf + i * 2, "%02x", digest[i]); sprintf(buf + i * 2, "%02x", digest[i]);
return std::string(buf); return std::string(buf);
} }

View File

@ -5,25 +5,25 @@
class SHA512 { class SHA512 {
protected: protected:
typedef unsigned char uint8; typedef unsigned char uint8;
typedef unsigned int uint32; typedef unsigned int uint32;
typedef unsigned long long uint64; typedef unsigned long long uint64;
const static uint64 sha512_k[]; const static uint64 sha512_k[];
static const unsigned int SHA384_512_BLOCK_SIZE = (1024 / 8); static const unsigned int SHA384_512_BLOCK_SIZE = (1024 / 8);
public: public:
void init(); void init();
void update(const unsigned char *message, unsigned int len); void update(const unsigned char* message, unsigned int len);
void final(unsigned char *digest); void final(unsigned char* digest);
static const unsigned int DIGEST_SIZE = (512 / 8); static const unsigned int DIGEST_SIZE = (512 / 8);
protected: protected:
void transform(const unsigned char *message, unsigned int block_nb); void transform(const unsigned char* message, unsigned int block_nb);
unsigned int m_tot_len; unsigned int m_tot_len;
unsigned int m_len; unsigned int m_len;
unsigned char m_block[2 * SHA384_512_BLOCK_SIZE]; unsigned char m_block[2 * SHA384_512_BLOCK_SIZE];
uint64 m_h[8]; uint64 m_h[8];
}; };
std::string sha512(std::string input); std::string sha512(std::string input);

View File

@ -6,22 +6,22 @@
std::string demangle(const char* name) { std::string demangle(const char* name) {
int status = -4; // some arbitrary value to eliminate the compiler warning int status = -4; // some arbitrary value to eliminate the compiler warning
// enable c++11 by passing the flag -std=c++11 to g++ // enable c++11 by passing the flag -std=c++11 to g++
std::unique_ptr<char, void(*)(void*)> res { std::unique_ptr<char, void(*)(void*)> res{
abi::__cxa_demangle(name, NULL, NULL, &status), abi::__cxa_demangle(name, NULL, NULL, &status),
std::free std::free
}; };
return (status==0) ? res.get() : name ; return (status == 0) ? res.get() : name;
} }
#else #else
// does nothing if not g++ // does nothing if not g++
std::string demangle(const char* name) { std::string demangle(const char* name) {
return name; return name;
} }
#endif #endif

View File

@ -8,5 +8,5 @@ std::string demangle(const char* name);
template <class T> template <class T>
std::string type(const T& t) { std::string type(const T& t) {
return demangle(typeid(t).name()); return demangle(typeid(t).name());
} }

View File

@ -1,77 +1,73 @@
#include "ZCompression.h" #include "ZCompression.h"
#ifndef _WIN32 #ifndef _WIN32
#include <zlib.h> #include <zlib.h>
namespace ZCompression namespace ZCompression {
{ int32_t GetMaxCompressedLength(int32_t nLenSrc) {
int32_t GetMaxCompressedLength(int32_t nLenSrc) int32_t n16kBlocks = (nLenSrc + 16383) / 16384; // round up any fraction of a block
{ return (nLenSrc + 6 + (n16kBlocks * 5));
int32_t n16kBlocks = (nLenSrc + 16383) / 16384; // round up any fraction of a block }
return (nLenSrc + 6 + (n16kBlocks * 5));
}
int32_t Compress(const uint8_t* abSrc, int32_t nLenSrc, uint8_t* abDst, int32_t nLenDst) int32_t Compress(const uint8_t* abSrc, int32_t nLenSrc, uint8_t* abDst, int32_t nLenDst) {
{ z_stream zInfo = { 0 };
z_stream zInfo = { 0 }; zInfo.total_in = zInfo.avail_in = nLenSrc;
zInfo.total_in = zInfo.avail_in = nLenSrc; zInfo.total_out = zInfo.avail_out = nLenDst;
zInfo.total_out = zInfo.avail_out = nLenDst; zInfo.next_in = const_cast<Bytef*>(abSrc);
zInfo.next_in = const_cast<Bytef*>(abSrc); zInfo.next_out = abDst;
zInfo.next_out = abDst;
int nErr, nRet = -1; int nErr, nRet = -1;
nErr = deflateInit(&zInfo, Z_DEFAULT_COMPRESSION); // zlib function nErr = deflateInit(&zInfo, Z_DEFAULT_COMPRESSION); // zlib function
if (nErr == Z_OK) { if (nErr == Z_OK) {
nErr = deflate(&zInfo, Z_FINISH); // zlib function nErr = deflate(&zInfo, Z_FINISH); // zlib function
if (nErr == Z_STREAM_END) { if (nErr == Z_STREAM_END) {
nRet = zInfo.total_out; nRet = zInfo.total_out;
} }
} }
deflateEnd(&zInfo); // zlib function deflateEnd(&zInfo); // zlib function
return(nRet); return(nRet);
} }
int32_t Decompress(const uint8_t* abSrc, int32_t nLenSrc, uint8_t* abDst, int32_t nLenDst, int32_t& nErr) int32_t Decompress(const uint8_t* abSrc, int32_t nLenSrc, uint8_t* abDst, int32_t nLenDst, int32_t& nErr) {
{ // Get the size of the decompressed data
// Get the size of the decompressed data z_stream zInfo = { 0 };
z_stream zInfo = { 0 }; zInfo.total_in = zInfo.avail_in = nLenSrc;
zInfo.total_in = zInfo.avail_in = nLenSrc; zInfo.total_out = zInfo.avail_out = nLenDst;
zInfo.total_out = zInfo.avail_out = nLenDst; zInfo.next_in = const_cast<Bytef*>(abSrc);
zInfo.next_in = const_cast<Bytef*>(abSrc); zInfo.next_out = abDst;
zInfo.next_out = abDst;
int nRet = -1; int nRet = -1;
nErr = inflateInit(&zInfo); // zlib function nErr = inflateInit(&zInfo); // zlib function
if (nErr == Z_OK) { if (nErr == Z_OK) {
nErr = inflate(&zInfo, Z_FINISH); // zlib function nErr = inflate(&zInfo, Z_FINISH); // zlib function
if (nErr == Z_STREAM_END) { if (nErr == Z_STREAM_END) {
nRet = zInfo.total_out; nRet = zInfo.total_out;
} }
} }
inflateEnd(&zInfo); // zlib function inflateEnd(&zInfo); // zlib function
return(nRet); return(nRet);
/*
z_stream zInfo = { 0 };
zInfo.total_in = zInfo.avail_in = nLenSrc;
zInfo.total_out = zInfo.avail_out = nLenDst;
zInfo.next_in = const_cast<Bytef*>(abSrc);
zInfo.next_out = const_cast<Bytef*>(abDst);
int nRet = -1; /*
nErr = inflateInit(&zInfo); // zlib function z_stream zInfo = { 0 };
if (nErr == Z_OK) { zInfo.total_in = zInfo.avail_in = nLenSrc;
nErr = inflate(&zInfo, Z_FINISH); // zlib function zInfo.total_out = zInfo.avail_out = nLenDst;
if (nErr == Z_STREAM_END) { zInfo.next_in = const_cast<Bytef*>(abSrc);
nRet = zInfo.total_out; zInfo.next_out = const_cast<Bytef*>(abDst);
}
} int nRet = -1;
inflateEnd(&zInfo); // zlib function nErr = inflateInit(&zInfo); // zlib function
return(nRet); // -1 or len of output if (nErr == Z_OK) {
*/ nErr = inflate(&zInfo, Z_FINISH); // zlib function
} if (nErr == Z_STREAM_END) {
nRet = zInfo.total_out;
}
}
inflateEnd(&zInfo); // zlib function
return(nRet); // -1 or len of output
*/
}
} }
#endif #endif

View File

@ -6,8 +6,7 @@
#ifndef DARKFLAME_PLATFORM_WIN32 #ifndef DARKFLAME_PLATFORM_WIN32
namespace ZCompression namespace ZCompression {
{
int32_t GetMaxCompressedLength(int32_t nLenSrc); int32_t GetMaxCompressedLength(int32_t nLenSrc);
int32_t Compress(const uint8_t* abSrc, int32_t nLenSrc, uint8_t* abDst, int32_t nLenDst); int32_t Compress(const uint8_t* abSrc, int32_t nLenSrc, uint8_t* abDst, int32_t nLenDst);

View File

@ -103,61 +103,61 @@ private:
const LWOSCENEID LWOSCENEID_INVALID = -1; const LWOSCENEID LWOSCENEID_INVALID = -1;
struct LWONameValue { struct LWONameValue {
uint32_t length = 0; //!< The length of the name uint32_t length = 0; //!< The length of the name
std::u16string name; //!< The name std::u16string name; //!< The name
LWONameValue(void) {} LWONameValue(void) {}
LWONameValue(const std::u16string& name) { LWONameValue(const std::u16string& name) {
this->name = name; this->name = name;
this->length = static_cast<uint32_t>(name.length()); this->length = static_cast<uint32_t>(name.length());
} }
~LWONameValue(void) {} ~LWONameValue(void) {}
}; };
struct FriendData { struct FriendData {
public: public:
bool isOnline = false; bool isOnline = false;
bool isBestFriend = false; bool isBestFriend = false;
bool isFTP = false; bool isFTP = false;
LWOZONEID zoneID; LWOZONEID zoneID;
LWOOBJID friendID; LWOOBJID friendID;
std::string friendName; std::string friendName;
void Serialize(RakNet::BitStream& bitStream) { void Serialize(RakNet::BitStream& bitStream) {
bitStream.Write<uint8_t>(isOnline); bitStream.Write<uint8_t>(isOnline);
bitStream.Write<uint8_t>(isBestFriend); bitStream.Write<uint8_t>(isBestFriend);
bitStream.Write<uint8_t>(isFTP); bitStream.Write<uint8_t>(isFTP);
bitStream.Write<uint32_t>(0); //??? bitStream.Write<uint32_t>(0); //???
bitStream.Write<uint8_t>(0); //??? bitStream.Write<uint8_t>(0); //???
bitStream.Write(zoneID.GetMapID()); bitStream.Write(zoneID.GetMapID());
bitStream.Write(zoneID.GetInstanceID()); bitStream.Write(zoneID.GetInstanceID());
bitStream.Write(zoneID.GetCloneID()); bitStream.Write(zoneID.GetCloneID());
bitStream.Write(friendID); bitStream.Write(friendID);
uint32_t maxSize = 33;
uint32_t size = static_cast<uint32_t>(friendName.length());
uint32_t remSize = static_cast<uint32_t>(maxSize - size);
if (size > maxSize) size = maxSize; uint32_t maxSize = 33;
uint32_t size = static_cast<uint32_t>(friendName.length());
uint32_t remSize = static_cast<uint32_t>(maxSize - size);
for (uint32_t i = 0; i < size; ++i) { if (size > maxSize) size = maxSize;
bitStream.Write(static_cast<uint16_t>(friendName[i]));
}
for (uint32_t j = 0; j < remSize; ++j) { for (uint32_t i = 0; i < size; ++i) {
bitStream.Write(static_cast<uint16_t>(0)); bitStream.Write(static_cast<uint16_t>(friendName[i]));
} }
bitStream.Write<uint32_t>(0); //??? for (uint32_t j = 0; j < remSize; ++j) {
bitStream.Write<uint16_t>(0); //??? bitStream.Write(static_cast<uint16_t>(0));
} }
bitStream.Write<uint32_t>(0); //???
bitStream.Write<uint16_t>(0); //???
}
}; };
struct Brick { struct Brick {
uint32_t designerID; uint32_t designerID;
uint32_t materialID; uint32_t materialID;
}; };
//This union is used by the behavior system //This union is used by the behavior system
@ -169,26 +169,26 @@ union suchar {
//=========== DLU ENUMS ============ //=========== DLU ENUMS ============
enum eGameMasterLevel : int32_t { enum eGameMasterLevel : int32_t {
GAME_MASTER_LEVEL_CIVILIAN = 0, // Normal player. GAME_MASTER_LEVEL_CIVILIAN = 0, // Normal player.
GAME_MASTER_LEVEL_FORUM_MODERATOR = 1, // No permissions on live servers. GAME_MASTER_LEVEL_FORUM_MODERATOR = 1, // No permissions on live servers.
GAME_MASTER_LEVEL_JUNIOR_MODERATOR = 2, // Can kick/mute and pull chat logs. GAME_MASTER_LEVEL_JUNIOR_MODERATOR = 2, // Can kick/mute and pull chat logs.
GAME_MASTER_LEVEL_MODERATOR = 3, // Can return lost items. GAME_MASTER_LEVEL_MODERATOR = 3, // Can return lost items.
GAME_MASTER_LEVEL_SENIOR_MODERATOR = 4, // Can ban. GAME_MASTER_LEVEL_SENIOR_MODERATOR = 4, // Can ban.
GAME_MASTER_LEVEL_LEAD_MODERATOR = 5, // Can approve properties. GAME_MASTER_LEVEL_LEAD_MODERATOR = 5, // Can approve properties.
GAME_MASTER_LEVEL_JUNIOR_DEVELOPER = 6, // Junior developer & future content team. Civilan on live. GAME_MASTER_LEVEL_JUNIOR_DEVELOPER = 6, // Junior developer & future content team. Civilan on live.
GAME_MASTER_LEVEL_INACTIVE_DEVELOPER = 7, // Inactive developer, limited permissions. GAME_MASTER_LEVEL_INACTIVE_DEVELOPER = 7, // Inactive developer, limited permissions.
GAME_MASTER_LEVEL_DEVELOPER = 8, // Active developer, full permissions on live. GAME_MASTER_LEVEL_DEVELOPER = 8, // Active developer, full permissions on live.
GAME_MASTER_LEVEL_OPERATOR = 9 // Can shutdown server for restarts & updates. GAME_MASTER_LEVEL_OPERATOR = 9 // Can shutdown server for restarts & updates.
}; };
//=========== LU ENUMS ============ //=========== LU ENUMS ============
//! An enum for object ID bits //! An enum for object ID bits
enum eObjectBits : int32_t { enum eObjectBits : int32_t {
OBJECT_BIT_PERSISTENT = 32, //!< The 32 bit index OBJECT_BIT_PERSISTENT = 32, //!< The 32 bit index
OBJECT_BIT_CLIENT = 46, //!< The 46 bit index OBJECT_BIT_CLIENT = 46, //!< The 46 bit index
OBJECT_BIT_SPAWNED = 58, //!< The 58 bit index OBJECT_BIT_SPAWNED = 58, //!< The 58 bit index
OBJECT_BIT_CHARACTER = 60 //!< The 60 bit index OBJECT_BIT_CHARACTER = 60 //!< The 60 bit index
}; };
//! An enum for MatchUpdate types //! An enum for MatchUpdate types
@ -208,18 +208,18 @@ enum eCyclingMode : uint32_t {
}; };
enum eCinematicEvent : uint32_t { enum eCinematicEvent : uint32_t {
STARTED, STARTED,
WAYPOINT, WAYPOINT,
ENDED, ENDED,
}; };
//! An enum for character creation responses //! An enum for character creation responses
enum eCreationResponse : uint8_t { enum eCreationResponse : uint8_t {
CREATION_RESPONSE_SUCCESS = 0, //!< The creation was successful CREATION_RESPONSE_SUCCESS = 0, //!< The creation was successful
CREATION_RESPONSE_OBJECT_ID_UNAVAILABLE, //!< The Object ID can't be used CREATION_RESPONSE_OBJECT_ID_UNAVAILABLE, //!< The Object ID can't be used
CREATION_RESPONSE_NAME_NOT_ALLOWED, //!< The name is not allowed CREATION_RESPONSE_NAME_NOT_ALLOWED, //!< The name is not allowed
CREATION_RESPONSE_PREDEFINED_NAME_IN_USE, //!< The predefined name is already in use CREATION_RESPONSE_PREDEFINED_NAME_IN_USE, //!< The predefined name is already in use
CREATION_RESPONSE_CUSTOM_NAME_IN_USE //!< The custom name is already in use CREATION_RESPONSE_CUSTOM_NAME_IN_USE //!< The custom name is already in use
}; };
//! An enum for login responses //! An enum for login responses
@ -234,21 +234,21 @@ enum eLoginResponse : uint8_t {
//! An enum for character rename responses //! An enum for character rename responses
enum eRenameResponse : uint8_t { enum eRenameResponse : uint8_t {
RENAME_RESPONSE_SUCCESS = 0, //!< The renaming was successful RENAME_RESPONSE_SUCCESS = 0, //!< The renaming was successful
RENAME_RESPONSE_UNKNOWN_ERROR, //!< There was an unknown error RENAME_RESPONSE_UNKNOWN_ERROR, //!< There was an unknown error
RENAME_RESPONSE_NAME_UNAVAILABLE, //!< The name is unavailable RENAME_RESPONSE_NAME_UNAVAILABLE, //!< The name is unavailable
RENAME_RESPONSE_NAME_IN_USE //!< The name is already in use RENAME_RESPONSE_NAME_IN_USE //!< The name is already in use
}; };
//! A replica packet type //! A replica packet type
enum eReplicaPacketType { enum eReplicaPacketType {
PACKET_TYPE_CONSTRUCTION, //!< A construction packet PACKET_TYPE_CONSTRUCTION, //!< A construction packet
PACKET_TYPE_SERIALIZATION, //!< A serialization packet PACKET_TYPE_SERIALIZATION, //!< A serialization packet
PACKET_TYPE_DESTRUCTION //!< A destruction packet PACKET_TYPE_DESTRUCTION //!< A destruction packet
}; };
enum ServerDisconnectIdentifiers { enum ServerDisconnectIdentifiers {
SERVER_DISCON_UNKNOWN_SERVER_ERROR = 0, //!< Unknown server error SERVER_DISCON_UNKNOWN_SERVER_ERROR = 0, //!< Unknown server error
SERVER_DISCON_DUPLICATE_LOGIN = 4, //!< Used when another user with the same username is logged in (duplicate login) SERVER_DISCON_DUPLICATE_LOGIN = 4, //!< Used when another user with the same username is logged in (duplicate login)
SERVER_DISCON_SERVER_SHUTDOWN = 5, //!< Used when the server is shutdown SERVER_DISCON_SERVER_SHUTDOWN = 5, //!< Used when the server is shutdown
SERVER_DISCON_SERVER_MAP_LOAD_FAILURE = 6, //!< Used when the server cannot load a map SERVER_DISCON_SERVER_MAP_LOAD_FAILURE = 6, //!< Used when the server cannot load a map
@ -263,80 +263,80 @@ enum ServerDisconnectIdentifiers {
//! The Behavior Types for use with the AI system //! The Behavior Types for use with the AI system
enum eCombatBehaviorTypes : uint32_t { enum eCombatBehaviorTypes : uint32_t {
PASSIVE = 0, //!< The object is passive PASSIVE = 0, //!< The object is passive
AGGRESSIVE = 1, //!< The object is aggressive AGGRESSIVE = 1, //!< The object is aggressive
PASSIVE_TURRET = 2, //!< The object is a passive turret PASSIVE_TURRET = 2, //!< The object is a passive turret
AGGRESSIVE_TURRET = 3 //!< The object is an aggressive turret AGGRESSIVE_TURRET = 3 //!< The object is an aggressive turret
}; };
//! The Combat Role Type for use with the AI system //! The Combat Role Type for use with the AI system
enum eCombatRoleType : uint32_t { enum eCombatRoleType : uint32_t {
MELEE = 0, //!< Used for melee attacks MELEE = 0, //!< Used for melee attacks
RANGED = 1, //!< Used for range attacks RANGED = 1, //!< Used for range attacks
SUPPORT = 2 //!< Used for support SUPPORT = 2 //!< Used for support
}; };
//! The kill types for the Die packet //! The kill types for the Die packet
enum eKillType : uint32_t { enum eKillType : uint32_t {
VIOLENT, VIOLENT,
SILENT SILENT
}; };
//! The various world states used throughout the server //! The various world states used throughout the server
enum eObjectWorldState { enum eObjectWorldState {
WORLDSTATE_INWORLD, //!< Probably used when the object is in the world WORLDSTATE_INWORLD, //!< Probably used when the object is in the world
WORLDSTATE_ATTACHED, //!< Probably used when the object is attached to another object WORLDSTATE_ATTACHED, //!< Probably used when the object is attached to another object
WORLDSTATE_INVENTORY //!< Probably used when the object is in an inventory WORLDSTATE_INVENTORY //!< Probably used when the object is in an inventory
}; };
//! The trigger stats (???) //! The trigger stats (???)
enum eTriggerStat { enum eTriggerStat {
INVALID_STAT, //!< ??? INVALID_STAT, //!< ???
HEALTH, //!< Probably used for health HEALTH, //!< Probably used for health
ARMOR, //!< Probably used for armor ARMOR, //!< Probably used for armor
IMAGINATION //!< Probably used for imagination IMAGINATION //!< Probably used for imagination
}; };
//! The trigger operations (???) //! The trigger operations (???)
enum eTriggerOperator { enum eTriggerOperator {
INVALID_OPER, //!< ??? INVALID_OPER, //!< ???
EQUAL, //!< ??? EQUAL, //!< ???
NOT_EQUAL, //!< ??? NOT_EQUAL, //!< ???
GREATER, //!< ??? GREATER, //!< ???
GREATER_EQUAL, //!< ??? GREATER_EQUAL, //!< ???
LESS, //!< ??? LESS, //!< ???
LESS_EQUAL //!< ??? LESS_EQUAL //!< ???
}; };
//! The various build types //! The various build types
enum eBuildType { enum eBuildType {
BUILD_NOWHERE, //!< Used if something can't be built anywhere BUILD_NOWHERE, //!< Used if something can't be built anywhere
BUILD_IN_WORLD, //!< Used if something can be built in the world BUILD_IN_WORLD, //!< Used if something can be built in the world
BUILD_ON_PROPERTY //!< Used if something can be build on a property BUILD_ON_PROPERTY //!< Used if something can be build on a property
}; };
//! Quickbuild fail reasons //! Quickbuild fail reasons
enum eFailReason : uint32_t { enum eFailReason : uint32_t {
REASON_NOT_GIVEN, REASON_NOT_GIVEN,
REASON_OUT_OF_IMAGINATION, REASON_OUT_OF_IMAGINATION,
REASON_CANCELED_EARLY, REASON_CANCELED_EARLY,
REASON_BUILD_ENDED REASON_BUILD_ENDED
}; };
//! Terminate interaction type //! Terminate interaction type
enum eTerminateType : uint32_t { enum eTerminateType : uint32_t {
RANGE, RANGE,
USER, USER,
FROM_INTERACTION FROM_INTERACTION
}; };
//! The combat state //! The combat state
enum eCombatState { enum eCombatState {
IDLE, //!< The AI is in an idle state IDLE, //!< The AI is in an idle state
AGGRO, //!< The AI is in an aggressive state AGGRO, //!< The AI is in an aggressive state
TETHER, //!< The AI is being redrawn back to tether point TETHER, //!< The AI is being redrawn back to tether point
SPAWN, //!< The AI is spawning SPAWN, //!< The AI is spawning
DEAD //!< The AI is dead DEAD //!< The AI is dead
}; };
enum eControlSceme { enum eControlSceme {
@ -348,7 +348,7 @@ enum eControlSceme {
SCHEME_DRIVING, SCHEME_DRIVING,
SCHEME_TAMING, SCHEME_TAMING,
SCHEME_MODULAR_BUILD, SCHEME_MODULAR_BUILD,
SCHEME_WEAR_A_ROBOT //== freecam? SCHEME_WEAR_A_ROBOT //== freecam?
}; };
enum eStunState { enum eStunState {
@ -357,86 +357,86 @@ enum eStunState {
}; };
enum eNotifyType { enum eNotifyType {
NOTIFY_TYPE_SUCCESS, NOTIFY_TYPE_SUCCESS,
NOTIFY_TYPE_QUIT, NOTIFY_TYPE_QUIT,
NOTIFY_TYPE_FAILED, NOTIFY_TYPE_FAILED,
NOTIFY_TYPE_BEGIN, NOTIFY_TYPE_BEGIN,
NOTIFY_TYPE_READY, NOTIFY_TYPE_READY,
NOTIFY_TYPE_NAMINGPET NOTIFY_TYPE_NAMINGPET
}; };
enum eReplicaComponentType : int32_t { enum eReplicaComponentType : int32_t {
COMPONENT_TYPE_CONTROLLABLE_PHYSICS = 1, //!< The ControllablePhysics Component COMPONENT_TYPE_CONTROLLABLE_PHYSICS = 1, //!< The ControllablePhysics Component
COMPONENT_TYPE_RENDER = 2, //!< The Render Component COMPONENT_TYPE_RENDER = 2, //!< The Render Component
COMPONENT_TYPE_SIMPLE_PHYSICS = 3, //!< The SimplePhysics Component COMPONENT_TYPE_SIMPLE_PHYSICS = 3, //!< The SimplePhysics Component
COMPONENT_TYPE_CHARACTER = 4, //!< The Character Component COMPONENT_TYPE_CHARACTER = 4, //!< The Character Component
COMPONENT_TYPE_SCRIPT = 5, //!< The Script Component COMPONENT_TYPE_SCRIPT = 5, //!< The Script Component
COMPONENT_TYPE_BOUNCER = 6, //!< The Bouncer Component COMPONENT_TYPE_BOUNCER = 6, //!< The Bouncer Component
COMPONENT_TYPE_BUFF = 7, //!< The Buff Component COMPONENT_TYPE_BUFF = 7, //!< The Buff Component
COMPONENT_TYPE_SKILL = 9, //!< The Skill Component COMPONENT_TYPE_SKILL = 9, //!< The Skill Component
COMPONENT_TYPE_ITEM = 11, //!< The Item Component COMPONENT_TYPE_ITEM = 11, //!< The Item Component
COMPONENT_TYPE_VENDOR = 16, //!< The Vendor Component COMPONENT_TYPE_VENDOR = 16, //!< The Vendor Component
COMPONENT_TYPE_INVENTORY = 17, //!< The Inventory Component COMPONENT_TYPE_INVENTORY = 17, //!< The Inventory Component
COMPONENT_TYPE_SHOOTING_GALLERY = 19, //!< The Shooting Gallery Component COMPONENT_TYPE_SHOOTING_GALLERY = 19, //!< The Shooting Gallery Component
COMPONENT_TYPE_RIGID_BODY_PHANTOM_PHYSICS = 20, //!< The RigidBodyPhantomPhysics Component COMPONENT_TYPE_RIGID_BODY_PHANTOM_PHYSICS = 20, //!< The RigidBodyPhantomPhysics Component
COMPONENT_TYPE_COLLECTIBLE = 23, //!< The Collectible Component COMPONENT_TYPE_COLLECTIBLE = 23, //!< The Collectible Component
COMPONENT_TYPE_MOVING_PLATFORM = 25, //!< The MovingPlatform Component COMPONENT_TYPE_MOVING_PLATFORM = 25, //!< The MovingPlatform Component
COMPONENT_TYPE_PET = 26, //!< The Pet Component COMPONENT_TYPE_PET = 26, //!< The Pet Component
COMPONENT_TYPE_VEHICLE_PHYSICS = 30, //!< The VehiclePhysics Component COMPONENT_TYPE_VEHICLE_PHYSICS = 30, //!< The VehiclePhysics Component
COMPONENT_TYPE_MOVEMENT_AI = 31, //!< The MovementAI Component COMPONENT_TYPE_MOVEMENT_AI = 31, //!< The MovementAI Component
COMPONENT_TYPE_PROPERTY = 36, //!< The Property Component COMPONENT_TYPE_PROPERTY = 36, //!< The Property Component
COMPONENT_TYPE_SCRIPTED_ACTIVITY = 39, //!< The ScriptedActivity Component COMPONENT_TYPE_SCRIPTED_ACTIVITY = 39, //!< The ScriptedActivity Component
COMPONENT_TYPE_PHANTOM_PHYSICS = 40, //!< The PhantomPhysics Component COMPONENT_TYPE_PHANTOM_PHYSICS = 40, //!< The PhantomPhysics Component
COMPONENT_TYPE_MODEL = 42, //!< The Model Component COMPONENT_TYPE_MODEL = 42, //!< The Model Component
COMPONENT_TYPE_PROPERTY_ENTRANCE = 43, //!< The PhantomPhysics Component COMPONENT_TYPE_PROPERTY_ENTRANCE = 43, //!< The PhantomPhysics Component
COMPONENT_TYPE_PROPERTY_MANAGEMENT = 45, //!< The PropertyManagement Component COMPONENT_TYPE_PROPERTY_MANAGEMENT = 45, //!< The PropertyManagement Component
COMPONENT_TYPE_REBUILD = 48, //!< The Rebuild Component COMPONENT_TYPE_REBUILD = 48, //!< The Rebuild Component
COMPONENT_TYPE_SWITCH = 49, //!< The Switch Component COMPONENT_TYPE_SWITCH = 49, //!< The Switch Component
COMPONENT_TYPE_ZONE_CONTROL = 50, //!< The ZoneControl Component COMPONENT_TYPE_ZONE_CONTROL = 50, //!< The ZoneControl Component
COMPONENT_TYPE_PACKAGE = 53, //!< The Package Component COMPONENT_TYPE_PACKAGE = 53, //!< The Package Component
COMPONENT_TYPE_PLAYER_FLAG = 58, //!< The PlayerFlag Component COMPONENT_TYPE_PLAYER_FLAG = 58, //!< The PlayerFlag Component
COMPONENT_TYPE_BASE_COMBAT_AI = 60, //!< The BaseCombatAI Component COMPONENT_TYPE_BASE_COMBAT_AI = 60, //!< The BaseCombatAI Component
COMPONENT_TYPE_MODULE_ASSEMBLY = 61, //!< The ModuleAssembly Component COMPONENT_TYPE_MODULE_ASSEMBLY = 61, //!< The ModuleAssembly Component
COMPONENT_TYPE_PROPERTY_VENDOR = 65, //!< The PropertyVendor Component COMPONENT_TYPE_PROPERTY_VENDOR = 65, //!< The PropertyVendor Component
COMPONENT_TYPE_ROCKET_LAUNCH = 67, //!< The RocketLaunch Component COMPONENT_TYPE_ROCKET_LAUNCH = 67, //!< The RocketLaunch Component
COMPONENT_TYPE_RACING_CONTROL = 71, //!< The RacingControl Component COMPONENT_TYPE_RACING_CONTROL = 71, //!< The RacingControl Component
COMPONENT_TYPE_MISSION_OFFER = 73, //!< The MissionOffer Component COMPONENT_TYPE_MISSION_OFFER = 73, //!< The MissionOffer Component
COMPONENT_TYPE_EXHIBIT = 75, //!< The Exhibit Component COMPONENT_TYPE_EXHIBIT = 75, //!< The Exhibit Component
COMPONENT_TYPE_RACING_STATS = 74, //!< The Racing Stats Component COMPONENT_TYPE_RACING_STATS = 74, //!< The Racing Stats Component
COMPONENT_TYPE_SOUND_TRIGGER = 77, //!< The Sound Trigger Component COMPONENT_TYPE_SOUND_TRIGGER = 77, //!< The Sound Trigger Component
COMPONENT_TYPE_PROXIMITY_MONITOR = 78, //!< The Proximity Monitor Component COMPONENT_TYPE_PROXIMITY_MONITOR = 78, //!< The Proximity Monitor Component
COMPONENT_TYPE_MISSION = 84, //!< The Mission Component COMPONENT_TYPE_MISSION = 84, //!< The Mission Component
COMPONENT_TYPE_ROCKET_LAUNCH_LUP = 97, //!< The LUP Launchpad Componen COMPONENT_TYPE_ROCKET_LAUNCH_LUP = 97, //!< The LUP Launchpad Componen
COMPONENT_TYPE_RAIL_ACTIVATOR = 104, //!< The Rail Activator Component COMPONENT_TYPE_RAIL_ACTIVATOR = 104, //!< The Rail Activator Component
COMPONENT_TYPE_PLAYER_FORCED_MOVEMENT = 106, //!< The Player Forced Movement Component COMPONENT_TYPE_PLAYER_FORCED_MOVEMENT = 106, //!< The Player Forced Movement Component
COMPONENT_TYPE_POSSESSABLE = 108, //!< The Possessable Component COMPONENT_TYPE_POSSESSABLE = 108, //!< The Possessable Component
COMPONENT_TYPE_LEVEL_PROGRESSION = 109, //!< The Level Progression Component COMPONENT_TYPE_LEVEL_PROGRESSION = 109, //!< The Level Progression Component
COMPONENT_TYPE_POSSESSOR = 110, //!< The Possessor Component COMPONENT_TYPE_POSSESSOR = 110, //!< The Possessor Component
COMPONENT_TYPE_BUILD_BORDER = 114, //!< The Build Border Component COMPONENT_TYPE_BUILD_BORDER = 114, //!< The Build Border Component
COMPONENT_TYPE_DESTROYABLE = 1000, //!< The Destroyable Component COMPONENT_TYPE_DESTROYABLE = 1000, //!< The Destroyable Component
}; };
enum class UseItemResponse : uint32_t { enum class UseItemResponse : uint32_t {
NoImaginationForPet = 1, NoImaginationForPet = 1,
FailedPrecondition, FailedPrecondition,
MountsNotAllowed MountsNotAllowed
}; };
/** /**
* Represents the different types of inventories an entity may have * Represents the different types of inventories an entity may have
*/ */
enum eInventoryType : uint32_t { enum eInventoryType : uint32_t {
ITEMS = 0, ITEMS = 0,
VAULT_ITEMS, VAULT_ITEMS,
BRICKS, BRICKS,
TEMP_ITEMS = 4, TEMP_ITEMS = 4,
MODELS, MODELS,
TEMP_MODELS, TEMP_MODELS,
BEHAVIORS, BEHAVIORS,
PROPERTY_DEEDS, PROPERTY_DEEDS,
VENDOR_BUYBACK = 11, VENDOR_BUYBACK = 11,
HIDDEN = 12, //Used for missional items HIDDEN = 12, //Used for missional items
VAULT_MODELS = 14, VAULT_MODELS = 14,
ITEM_SETS, //internal ITEM_SETS, //internal
INVALID // made up, for internal use!!! INVALID // made up, for internal use!!!
}; };
@ -450,7 +450,7 @@ enum eRebuildState : uint32_t {
}; };
/** /**
* The loot source's type. * The loot source's type.
*/ */
enum eLootSourceType : int32_t { enum eLootSourceType : int32_t {
LOOT_SOURCE_NONE = 0, LOOT_SOURCE_NONE = 0,
@ -542,7 +542,7 @@ enum ePlayerFlags {
TOOLTIP_TALK_TO_SKYLAND_TO_GET_HAT = 52, TOOLTIP_TALK_TO_SKYLAND_TO_GET_HAT = 52,
MODULAR_BUILD_PLAYER_PLACES_FIRST_MODEL_IN_SCRATCH = 53, MODULAR_BUILD_PLAYER_PLACES_FIRST_MODEL_IN_SCRATCH = 53,
MODULAR_BUILD_FIRST_ARROW_DISPLAY_FOR_MODULE = 54, MODULAR_BUILD_FIRST_ARROW_DISPLAY_FOR_MODULE = 54,
AG_BEACON_QB,_SO_THE_PLAYER_CAN_ALWAYS_BUILD_THEM = 55, AG_BEACON_QB_SO_THE_PLAYER_CAN_ALWAYS_BUILD_THEM = 55,
GF_PET_DIG_FLAG_1 = 56, GF_PET_DIG_FLAG_1 = 56,
GF_PET_DIG_FLAG_2 = 57, GF_PET_DIG_FLAG_2 = 57,
GF_PET_DIG_FLAG_3 = 58, GF_PET_DIG_FLAG_3 = 58,
@ -554,7 +554,7 @@ enum ePlayerFlags {
ENTER_BBB_FROM_PROPERTY_EDIT_CONFIRMATION_DIALOG = 64, ENTER_BBB_FROM_PROPERTY_EDIT_CONFIRMATION_DIALOG = 64,
AG_FIRST_COMBAT_COMPLETE = 65, AG_FIRST_COMBAT_COMPLETE = 65,
AG_COMPLETE_BOB_MISSION = 66, AG_COMPLETE_BOB_MISSION = 66,
NJ_GARMADON_CINEMATIC_SEEN = 125, NJ_GARMADON_CINEMATIC_SEEN = 125,
ELEPHANT_PET_3050 = 801, ELEPHANT_PET_3050 = 801,
CAT_PET_3054 = 802, CAT_PET_3054 = 802,
TRICERATOPS_PET_3195 = 803, TRICERATOPS_PET_3195 = 803,
@ -631,19 +631,19 @@ enum ePlayerFlags {
NT_FACTION_SPY_DUKE = 1974, NT_FACTION_SPY_DUKE = 1974,
NT_FACTION_SPY_OVERBUILD = 1976, NT_FACTION_SPY_OVERBUILD = 1976,
NT_FACTION_SPY_HAEL = 1977, NT_FACTION_SPY_HAEL = 1977,
NJ_EARTH_SPINJITZU = 2030, NJ_EARTH_SPINJITZU = 2030,
NJ_LIGHTNING_SPINJITZU = 2031, NJ_LIGHTNING_SPINJITZU = 2031,
NJ_ICE_SPINJITZU = 2032, NJ_ICE_SPINJITZU = 2032,
NJ_FIRE_SPINJITZU = 2033, NJ_FIRE_SPINJITZU = 2033,
NJ_WU_SHOW_DAILY_CHEST = 2099 NJ_WU_SHOW_DAILY_CHEST = 2099
}; };
//======== FUNC =========== //======== FUNC ===========
template<typename T> template<typename T>
inline T const& clamp(const T& val, const T& low, const T& high) { inline T const& clamp(const T& val, const T& low, const T& high) {
if (val < low) return low; if (val < low) return low;
else if (val > high) return high; else if (val > high) return high;
return val; return val;
} }

View File

@ -12,7 +12,7 @@ dConfig::dConfig(const std::string& filepath) {
if (line[0] != '#') ProcessLine(line); if (line[0] != '#') ProcessLine(line);
} }
} }
} }
dConfig::~dConfig(void) { dConfig::~dConfig(void) {
} }
@ -31,15 +31,15 @@ void dConfig::ProcessLine(const std::string& line) {
std::vector<std::string> seglist; std::vector<std::string> seglist;
while (std::getline(ss, segment, '=')) { while (std::getline(ss, segment, '=')) {
seglist.push_back(segment); seglist.push_back(segment);
} }
if (seglist.size() != 2) return; if (seglist.size() != 2) return;
//Make sure that on Linux, we remove special characters: //Make sure that on Linux, we remove special characters:
if (!seglist[1].empty() && seglist[1][seglist[1].size() - 1] == '\r') if (!seglist[1].empty() && seglist[1][seglist[1].size() - 1] == '\r')
seglist[1].erase(seglist[1].size() - 1); seglist[1].erase(seglist[1].size() - 1);
m_Keys.push_back(seglist[0]); m_Keys.push_back(seglist[0]);
m_Values.push_back(seglist[1]); m_Values.push_back(seglist[1]);
} }

View File

@ -17,4 +17,4 @@ private:
std::vector<std::string> m_Keys; std::vector<std::string> m_Keys;
std::vector<std::string> m_Values; std::vector<std::string> m_Values;
std::string m_EmptyString; std::string m_EmptyString;
}; };

View File

@ -10,7 +10,7 @@ dLogger::dLogger(const std::string& outpath, bool logToConsole, bool logDebugSta
if (!mFile) { printf("Couldn't open %s for writing!\n", outpath.c_str()); } if (!mFile) { printf("Couldn't open %s for writing!\n", outpath.c_str()); }
#else #else
fp = fopen(outpath.c_str(), "wt"); fp = fopen(outpath.c_str(), "wt");
if (fp == NULL) { printf("Couldn't open %s for writing!\n", outpath.c_str()); } if (fp == NULL) { printf("Couldn't open %s for writing!\n", outpath.c_str()); }
#endif #endif
} }
@ -46,42 +46,42 @@ void dLogger::vLog(const char* format, va_list args) {
mFile << "[" << timeStr << "] " << message; mFile << "[" << timeStr << "] " << message;
#else #else
time_t t = time(NULL); time_t t = time(NULL);
struct tm * time = localtime(&t); struct tm* time = localtime(&t);
char timeStr[70]; char timeStr[70];
strftime(timeStr, sizeof(timeStr), "%d-%m-%y %H:%M:%S", time); strftime(timeStr, sizeof(timeStr), "%d-%m-%y %H:%M:%S", time);
char message[2048]; char message[2048];
vsprintf(message, format, args); vsprintf(message, format, args);
if (m_logToConsole) { if (m_logToConsole) {
fputs("[", stdout); fputs("[", stdout);
fputs(timeStr, stdout); fputs(timeStr, stdout);
fputs("] ", stdout); fputs("] ", stdout);
fputs(message, stdout); fputs(message, stdout);
} }
if (fp != nullptr) { if (fp != nullptr) {
fputs("[", fp); fputs("[", fp);
fputs(timeStr, fp); fputs(timeStr, fp);
fputs("] ", fp); fputs("] ", fp);
fputs(message, fp); fputs(message, fp);
} else { } else {
printf("Logger not initialized!\n"); printf("Logger not initialized!\n");
} }
#endif #endif
} }
void dLogger::LogBasic(const char * format, ...) { void dLogger::LogBasic(const char* format, ...) {
va_list args; va_list args;
va_start(args, format); va_start(args, format);
vLog(format, args); vLog(format, args);
va_end(args); va_end(args);
} }
void dLogger::LogBasic(const std::string & message) { void dLogger::LogBasic(const std::string& message) {
LogBasic(message.c_str()); LogBasic(message.c_str());
} }
void dLogger::Log(const char * className, const char * format, ...) { void dLogger::Log(const char* className, const char* format, ...) {
va_list args; va_list args;
std::string log = "[" + std::string(className) + "] " + std::string(format) + "\n"; std::string log = "[" + std::string(className) + "] " + std::string(format) + "\n";
va_start(args, format); va_start(args, format);
@ -89,11 +89,11 @@ void dLogger::Log(const char * className, const char * format, ...) {
va_end(args); va_end(args);
} }
void dLogger::Log(const std::string & className, const std::string & message) { void dLogger::Log(const std::string& className, const std::string& message) {
Log(className.c_str(), message.c_str()); Log(className.c_str(), message.c_str());
} }
void dLogger::LogDebug(const char * className, const char * format, ...) { void dLogger::LogDebug(const char* className, const char* format, ...) {
if (!m_logDebugStatements) return; if (!m_logDebugStatements) return;
va_list args; va_list args;
std::string log = "[" + std::string(className) + "] " + std::string(format); std::string log = "[" + std::string(className) + "] " + std::string(format);
@ -102,7 +102,7 @@ void dLogger::LogDebug(const char * className, const char * format, ...) {
va_end(args); va_end(args);
} }
void dLogger::LogDebug(const std::string & className, const std::string & message) { void dLogger::LogDebug(const std::string& className, const std::string& message) {
LogDebug(className.c_str(), message.c_str()); LogDebug(className.c_str(), message.c_str());
} }

View File

@ -31,8 +31,8 @@ private:
std::string m_outpath; std::string m_outpath;
std::ofstream mFile; std::ofstream mFile;
#ifndef _WIN32 #ifndef _WIN32
//Glorious linux can run with SPEED: //Glorious linux can run with SPEED:
FILE* fp = nullptr; FILE* fp = nullptr;
#endif #endif
}; };

View File

@ -1,29 +1,29 @@
#pragma once #pragma once
#if defined(_WIN32) #if defined(_WIN32)
#define DARKFLAME_PLATFORM_WIN32 #define DARKFLAME_PLATFORM_WIN32
#elif defined(__APPLE__) && defined(__MACH__) #elif defined(__APPLE__) && defined(__MACH__)
#include <TargetConditionals.h> #include <TargetConditionals.h>
#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
#define DARKFLAME_PLATFORM_IOS #define DARKFLAME_PLATFORM_IOS
#elif TARGET_OS_MAC #elif TARGET_OS_MAC
#define DARKFLAME_PLATFORM_MACOS #define DARKFLAME_PLATFORM_MACOS
#else
#error unknown Apple operating system
#endif
#elif defined(__unix__)
#define DARKFLAME_PLATFORM_UNIX
#if defined(__ANDROID__)
#define DARKFLAME_PLATFORM_ANDROID
#elif defined(__linux__)
#define DARKFLAME_PLATFORM_LINUX
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
#define DARKFLAME_PLATFORM_FREEBSD
#elif defined(__CYGWIN__)
#define DARKFLAME_PLATFORM_CYGWIN
#else
#error unknown unix operating system
#endif
#else #else
#error unknown operating system #error unknown Apple operating system
#endif #endif
#elif defined(__unix__)
#define DARKFLAME_PLATFORM_UNIX
#if defined(__ANDROID__)
#define DARKFLAME_PLATFORM_ANDROID
#elif defined(__linux__)
#define DARKFLAME_PLATFORM_LINUX
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
#define DARKFLAME_PLATFORM_FREEBSD
#elif defined(__CYGWIN__)
#define DARKFLAME_PLATFORM_CYGWIN
#else
#error unknown unix operating system
#endif
#else
#error unknown operating system
#endif

View File

@ -41,4 +41,4 @@ enum class eAnimationFlags : uint32_t {
IDLE_MISC12 IDLE_MISC12
}; };
#endif //!__EANINMATIONFLAGS__H__ #endif //!__EANINMATIONFLAGS__H__

View File

@ -33,4 +33,4 @@ enum class eItemType : int32_t {
ITEM_TYPE_MOUNT = 24 //!< A Mount ITEM_TYPE_MOUNT = 24 //!< A Mount
}; };
#endif //!__EITEMTYPE__H__ #endif //!__EITEMTYPE__H__

View File

@ -2,19 +2,19 @@
#include "CDComponentsRegistryTable.h" #include "CDComponentsRegistryTable.h"
// Static Variables // Static Variables
static CppSQLite3DB * conn = new CppSQLite3DB(); static CppSQLite3DB* conn = new CppSQLite3DB();
//! Opens a connection with the CDClient //! Opens a connection with the CDClient
void CDClientDatabase::Connect(const std::string& filename) { void CDClientDatabase::Connect(const std::string& filename) {
conn->open(filename.c_str()); conn->open(filename.c_str());
} }
//! Queries the CDClient //! Queries the CDClient
CppSQLite3Query CDClientDatabase::ExecuteQuery(const std::string& query) { CppSQLite3Query CDClientDatabase::ExecuteQuery(const std::string& query) {
return conn->execQuery(query.c_str()); return conn->execQuery(query.c_str());
} }
//! Makes prepared statements //! Makes prepared statements
CppSQLite3Statement CDClientDatabase::CreatePreppedStmt(const std::string& query) { CppSQLite3Statement CDClientDatabase::CreatePreppedStmt(const std::string& query) {
return conn->compileStatement(query.c_str()); return conn->compileStatement(query.c_str());
} }

View File

@ -13,10 +13,10 @@
#include <sstream> #include <sstream>
#include <iostream> #include <iostream>
// Enable this to cache all entries in each table for fast access, comes with more memory cost // Enable this to cache all entries in each table for fast access, comes with more memory cost
//#define CDCLIENT_CACHE_ALL //#define CDCLIENT_CACHE_ALL
// Enable this to skip some unused columns in some tables // Enable this to skip some unused columns in some tables
#define UNUSED(v) #define UNUSED(v)
/*! /*!
@ -24,26 +24,26 @@
\brief An interface between the CDClient.sqlite file and the server \brief An interface between the CDClient.sqlite file and the server
*/ */
//! The CDClient Database namespace //! The CDClient Database namespace
namespace CDClientDatabase { namespace CDClientDatabase {
//! Opens a connection with the CDClient //! Opens a connection with the CDClient
/*! /*!
\param filename The filename \param filename The filename
*/ */
void Connect(const std::string& filename); void Connect(const std::string& filename);
//! Queries the CDClient //! Queries the CDClient
/*! /*!
\param query The query \param query The query
\return The results of the query \return The results of the query
*/ */
CppSQLite3Query ExecuteQuery(const std::string& query); CppSQLite3Query ExecuteQuery(const std::string& query);
//! Queries the CDClient and parses arguments //! Queries the CDClient and parses arguments
/*! /*!
\param query The query with formatted arguments \param query The query with formatted arguments
\return prepared SQLite Statement \return prepared SQLite Statement
*/ */
CppSQLite3Statement CreatePreppedStmt(const std::string& query); CppSQLite3Statement CreatePreppedStmt(const std::string& query);
}; };

View File

@ -1,7 +1,7 @@
#include "CDClientManager.h" #include "CDClientManager.h"
// Static Variables // Static Variables
CDClientManager * CDClientManager::m_Address = nullptr; CDClientManager* CDClientManager::m_Address = nullptr;
//! Initializes the manager //! Initializes the manager
void CDClientManager::Initialize(void) { void CDClientManager::Initialize(void) {

View File

@ -52,45 +52,45 @@
\brief A manager for the CDClient tables \brief A manager for the CDClient tables
*/ */
//! Manages all data from the CDClient //! Manages all data from the CDClient
class CDClientManager { class CDClientManager {
private: private:
static CDClientManager * m_Address; //!< The singleton address static CDClientManager* m_Address; //!< The singleton address
std::unordered_map<std::string, CDTable*> tables; //!< The tables std::unordered_map<std::string, CDTable*> tables; //!< The tables
public: public:
//! The singleton method //! The singleton method
static CDClientManager * Instance() { static CDClientManager* Instance() {
if (m_Address == 0) { if (m_Address == 0) {
m_Address = new CDClientManager; m_Address = new CDClientManager;
} }
return m_Address; return m_Address;
} }
//! Initializes the manager //! Initializes the manager
void Initialize(void); void Initialize(void);
//! Fetches a CDClient table //! Fetches a CDClient table
/*! /*!
This function uses typename T which must be a subclass of CDTable. This function uses typename T which must be a subclass of CDTable.
It returns the class that conforms to the class name It returns the class that conforms to the class name
\param tableName The table name \param tableName The table name
\return The class or nullptr \return The class or nullptr
*/ */
template<typename T> template<typename T>
T * GetTable(const std::string& tableName) { T* GetTable(const std::string& tableName) {
static_assert(std::is_base_of<CDTable, T>::value, "T should inherit from CDTable!"); static_assert(std::is_base_of<CDTable, T>::value, "T should inherit from CDTable!");
for (auto itr = this->tables.begin(); itr != this->tables.end(); ++itr) { for (auto itr = this->tables.begin(); itr != this->tables.end(); ++itr) {
if (itr->first == tableName) { if (itr->first == tableName) {
return dynamic_cast<T*>(itr->second); return dynamic_cast<T*>(itr->second);
} }
} }
return nullptr; return nullptr;
} }
}; };

View File

@ -6,8 +6,8 @@ using namespace std;
#pragma warning (disable:4251) //Disables SQL warnings #pragma warning (disable:4251) //Disables SQL warnings
sql::Driver * Database::driver; sql::Driver* Database::driver;
sql::Connection * Database::con; sql::Connection* Database::con;
sql::Properties Database::props; sql::Properties Database::props;
std::string Database::database; std::string Database::database;
@ -66,8 +66,7 @@ sql::PreparedStatement* Database::CreatePreppedStmt(const std::string& query) {
Game::logger->Log("Database", "Trying to reconnect to MySQL"); Game::logger->Log("Database", "Trying to reconnect to MySQL");
} }
if (!con->isValid() || con->isClosed()) if (!con->isValid() || con->isClosed()) {
{
delete con; delete con;
con = nullptr; con = nullptr;
@ -83,4 +82,4 @@ sql::PreparedStatement* Database::CreatePreppedStmt(const std::string& query) {
void Database::Commit() { void Database::Commit() {
Database::con->commit(); Database::con->commit();
} }

View File

@ -11,8 +11,8 @@ public:
class Database { class Database {
private: private:
static sql::Driver *driver; static sql::Driver* driver;
static sql::Connection *con; static sql::Connection* con;
static sql::Properties props; static sql::Properties props;
static std::string database; static std::string database;
public: public:

View File

@ -9,70 +9,69 @@
void MigrationRunner::RunMigrations() { void MigrationRunner::RunMigrations() {
auto stmt = Database::CreatePreppedStmt("CREATE TABLE IF NOT EXISTS migration_history (name TEXT NOT NULL, date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP());"); auto stmt = Database::CreatePreppedStmt("CREATE TABLE IF NOT EXISTS migration_history (name TEXT NOT NULL, date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP());");
stmt->executeQuery(); stmt->executeQuery();
delete stmt; delete stmt;
sql::SQLString finalSQL = ""; sql::SQLString finalSQL = "";
Migration checkMigration{}; Migration checkMigration{};
for (const auto& entry : GeneralUtils::GetFileNamesFromFolder("./migrations/")) { for (const auto& entry : GeneralUtils::GetFileNamesFromFolder("./migrations/")) {
auto migration = LoadMigration(entry); auto migration = LoadMigration(entry);
if (migration.data.empty()) { if (migration.data.empty()) {
continue; continue;
} }
checkMigration = migration; checkMigration = migration;
stmt = Database::CreatePreppedStmt("SELECT name FROM migration_history WHERE name = ?;"); stmt = Database::CreatePreppedStmt("SELECT name FROM migration_history WHERE name = ?;");
stmt->setString(1, migration.name); stmt->setString(1, migration.name);
auto res = stmt->executeQuery(); auto res = stmt->executeQuery();
bool doExit = res->next(); bool doExit = res->next();
delete res; delete res;
delete stmt; delete stmt;
if (doExit) continue; if (doExit) continue;
Game::logger->Log("MigrationRunner", "Running migration: %s", migration.name.c_str()); Game::logger->Log("MigrationRunner", "Running migration: %s", migration.name.c_str());
finalSQL.append(migration.data); finalSQL.append(migration.data);
finalSQL.append('\n'); finalSQL.append('\n');
stmt = Database::CreatePreppedStmt("INSERT INTO migration_history (name) VALUES (?);"); stmt = Database::CreatePreppedStmt("INSERT INTO migration_history (name) VALUES (?);");
stmt->setString(1, entry); stmt->setString(1, entry);
stmt->execute(); stmt->execute();
delete stmt; delete stmt;
} }
if (!finalSQL.empty()) { if (!finalSQL.empty()) {
try { try {
auto simpleStatement = Database::CreateStmt(); auto simpleStatement = Database::CreateStmt();
simpleStatement->execute(finalSQL); simpleStatement->execute(finalSQL);
delete simpleStatement; delete simpleStatement;
} } catch (sql::SQLException e) {
catch (sql::SQLException e) { Game::logger->Log("MigrationRunner", "Encountered error running migration: %s", e.what());
Game::logger->Log("MigrationRunner", "Encountered error running migration: %s", e.what()); }
} }
}
} }
Migration MigrationRunner::LoadMigration(std::string path) { Migration MigrationRunner::LoadMigration(std::string path) {
Migration migration{}; Migration migration{};
std::ifstream file("./migrations/" + path); std::ifstream file("./migrations/" + path);
if (file.is_open()) { if (file.is_open()) {
std::hash<std::string> hash; std::hash<std::string> hash;
std::string line; std::string line;
std::string total = ""; std::string total = "";
while (std::getline(file, line)) { while (std::getline(file, line)) {
total += line; total += line;
} }
file.close(); file.close();
migration.name = path; migration.name = path;
migration.data = total; migration.data = total;
} }
return migration; return migration;
} }

View File

@ -16,4 +16,4 @@ class MigrationRunner {
public: public:
static void RunMigrations(); static void RunMigrations();
static Migration LoadMigration(std::string path); static Migration LoadMigration(std::string path);
}; };

View File

@ -49,7 +49,7 @@ CDActivitiesTable::CDActivitiesTable(void) {
} }
//! Destructor //! Destructor
CDActivitiesTable::~CDActivitiesTable(void) { } CDActivitiesTable::~CDActivitiesTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDActivitiesTable::GetName(void) const { std::string CDActivitiesTable::GetName(void) const {

View File

@ -2,59 +2,59 @@
//! Constructor //! Constructor
CDActivityRewardsTable::CDActivityRewardsTable(void) { CDActivityRewardsTable::CDActivityRewardsTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ActivityRewards"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ActivityRewards");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ActivityRewards"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ActivityRewards");
while (!tableData.eof()) { while (!tableData.eof()) {
CDActivityRewards entry; CDActivityRewards entry;
entry.objectTemplate = tableData.getIntField(0, -1); entry.objectTemplate = tableData.getIntField(0, -1);
entry.ActivityRewardIndex = tableData.getIntField(1, -1); entry.ActivityRewardIndex = tableData.getIntField(1, -1);
entry.activityRating = tableData.getIntField(2, -1); entry.activityRating = tableData.getIntField(2, -1);
entry.LootMatrixIndex = tableData.getIntField(3, -1); entry.LootMatrixIndex = tableData.getIntField(3, -1);
entry.CurrencyIndex = tableData.getIntField(4, -1); entry.CurrencyIndex = tableData.getIntField(4, -1);
entry.ChallengeRating = tableData.getIntField(5, -1); entry.ChallengeRating = tableData.getIntField(5, -1);
entry.description = tableData.getStringField(6, ""); entry.description = tableData.getStringField(6, "");
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDActivityRewardsTable::~CDActivityRewardsTable(void) { } CDActivityRewardsTable::~CDActivityRewardsTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDActivityRewardsTable::GetName(void) const { std::string CDActivityRewardsTable::GetName(void) const {
return "ActivityRewards"; return "ActivityRewards";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDActivityRewards> CDActivityRewardsTable::Query(std::function<bool(CDActivityRewards)> predicate) { std::vector<CDActivityRewards> CDActivityRewardsTable::Query(std::function<bool(CDActivityRewards)> predicate) {
std::vector<CDActivityRewards> data = cpplinq::from(this->entries) std::vector<CDActivityRewards> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDActivityRewards> CDActivityRewardsTable::GetEntries(void) const { std::vector<CDActivityRewards> CDActivityRewardsTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,47 +8,47 @@
\brief Contains data for the ActivityRewards table \brief Contains data for the ActivityRewards table
*/ */
//! ActivityRewards Entry Struct //! ActivityRewards Entry Struct
struct CDActivityRewards { struct CDActivityRewards {
unsigned int objectTemplate; //!< The object template (?) unsigned int objectTemplate; //!< The object template (?)
unsigned int ActivityRewardIndex; //!< The activity reward index unsigned int ActivityRewardIndex; //!< The activity reward index
int activityRating; //!< The activity rating int activityRating; //!< The activity rating
unsigned int LootMatrixIndex; //!< The loot matrix index unsigned int LootMatrixIndex; //!< The loot matrix index
unsigned int CurrencyIndex; //!< The currency index unsigned int CurrencyIndex; //!< The currency index
unsigned int ChallengeRating; //!< The challenge rating unsigned int ChallengeRating; //!< The challenge rating
std::string description; //!< The description std::string description; //!< The description
}; };
//! ActivityRewards table //! ActivityRewards table
class CDActivityRewardsTable : public CDTable { class CDActivityRewardsTable : public CDTable {
private: private:
std::vector<CDActivityRewards> entries; std::vector<CDActivityRewards> entries;
public: public:
//! Constructor //! Constructor
CDActivityRewardsTable(void); CDActivityRewardsTable(void);
//! Destructor //! Destructor
~CDActivityRewardsTable(void); ~CDActivityRewardsTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDActivityRewards> Query(std::function<bool(CDActivityRewards)> predicate); std::vector<CDActivityRewards> Query(std::function<bool(CDActivityRewards)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDActivityRewards> GetEntries(void) const; std::vector<CDActivityRewards> GetEntries(void) const;
}; };

View File

@ -2,65 +2,65 @@
//! Constructor //! Constructor
CDAnimationsTable::CDAnimationsTable(void) { CDAnimationsTable::CDAnimationsTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM Animations"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM Animations");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Animations"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Animations");
while (!tableData.eof()) { while (!tableData.eof()) {
CDAnimations entry; CDAnimations entry;
entry.animationGroupID = tableData.getIntField(0, -1); entry.animationGroupID = tableData.getIntField(0, -1);
entry.animation_type = tableData.getStringField(1, ""); entry.animation_type = tableData.getStringField(1, "");
entry.animation_name = tableData.getStringField(2, ""); entry.animation_name = tableData.getStringField(2, "");
entry.chance_to_play = tableData.getFloatField(3, -1.0f); entry.chance_to_play = tableData.getFloatField(3, -1.0f);
entry.min_loops = tableData.getIntField(4, -1); entry.min_loops = tableData.getIntField(4, -1);
entry.max_loops = tableData.getIntField(5, -1); entry.max_loops = tableData.getIntField(5, -1);
entry.animation_length = tableData.getFloatField(6, -1.0f); entry.animation_length = tableData.getFloatField(6, -1.0f);
entry.hideEquip = tableData.getIntField(7, -1) == 1 ? true : false; entry.hideEquip = tableData.getIntField(7, -1) == 1 ? true : false;
entry.ignoreUpperBody = tableData.getIntField(8, -1) == 1 ? true : false; entry.ignoreUpperBody = tableData.getIntField(8, -1) == 1 ? true : false;
entry.restartable = tableData.getIntField(9, -1) == 1 ? true : false; entry.restartable = tableData.getIntField(9, -1) == 1 ? true : false;
entry.face_animation_name = tableData.getStringField(10, ""); entry.face_animation_name = tableData.getStringField(10, "");
entry.priority = tableData.getFloatField(11, -1.0f); entry.priority = tableData.getFloatField(11, -1.0f);
entry.blendTime = tableData.getFloatField(12, -1.0f); entry.blendTime = tableData.getFloatField(12, -1.0f);
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDAnimationsTable::~CDAnimationsTable(void) { } CDAnimationsTable::~CDAnimationsTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDAnimationsTable::GetName(void) const { std::string CDAnimationsTable::GetName(void) const {
return "Animations"; return "Animations";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDAnimations> CDAnimationsTable::Query(std::function<bool(CDAnimations)> predicate) { std::vector<CDAnimations> CDAnimationsTable::Query(std::function<bool(CDAnimations)> predicate) {
std::vector<CDAnimations> data = cpplinq::from(this->entries) std::vector<CDAnimations> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDAnimations> CDAnimationsTable::GetEntries(void) const { std::vector<CDAnimations> CDAnimationsTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,53 +8,53 @@
\brief Contains data for the Animations table \brief Contains data for the Animations table
*/ */
//! Animations Entry Struct //! Animations Entry Struct
struct CDAnimations { struct CDAnimations {
unsigned int animationGroupID; //!< The animation group ID unsigned int animationGroupID; //!< The animation group ID
std::string animation_type; //!< The animation type std::string animation_type; //!< The animation type
std::string animation_name; //!< The animation name std::string animation_name; //!< The animation name
float chance_to_play; //!< The chance to play the animation float chance_to_play; //!< The chance to play the animation
unsigned int min_loops; //!< The minimum number of loops unsigned int min_loops; //!< The minimum number of loops
unsigned int max_loops; //!< The maximum number of loops unsigned int max_loops; //!< The maximum number of loops
float animation_length; //!< The animation length float animation_length; //!< The animation length
bool hideEquip; //!< Whether or not to hide the equip bool hideEquip; //!< Whether or not to hide the equip
bool ignoreUpperBody; //!< Whether or not to ignore the upper body bool ignoreUpperBody; //!< Whether or not to ignore the upper body
bool restartable; //!< Whether or not the animation is restartable bool restartable; //!< Whether or not the animation is restartable
std::string face_animation_name; //!< The face animation name std::string face_animation_name; //!< The face animation name
float priority; //!< The priority float priority; //!< The priority
float blendTime; //!< The blend time float blendTime; //!< The blend time
}; };
//! Animations table //! Animations table
class CDAnimationsTable : public CDTable { class CDAnimationsTable : public CDTable {
private: private:
std::vector<CDAnimations> entries; std::vector<CDAnimations> entries;
public: public:
//! Constructor //! Constructor
CDAnimationsTable(void); CDAnimationsTable(void);
//! Destructor //! Destructor
~CDAnimationsTable(void); ~CDAnimationsTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDAnimations> Query(std::function<bool(CDAnimations)> predicate); std::vector<CDAnimations> Query(std::function<bool(CDAnimations)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDAnimations> GetEntries(void) const; std::vector<CDAnimations> GetEntries(void) const;
}; };

View File

@ -31,15 +31,14 @@ CDBehaviorParameterTable::CDBehaviorParameterTable(void) {
} }
//! Destructor //! Destructor
CDBehaviorParameterTable::~CDBehaviorParameterTable(void) { } CDBehaviorParameterTable::~CDBehaviorParameterTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDBehaviorParameterTable::GetName(void) const { std::string CDBehaviorParameterTable::GetName(void) const {
return "BehaviorParameter"; return "BehaviorParameter";
} }
CDBehaviorParameter CDBehaviorParameterTable::GetEntry(const uint32_t behaviorID, const std::string& name, const float defaultValue) CDBehaviorParameter CDBehaviorParameterTable::GetEntry(const uint32_t behaviorID, const std::string& name, const float defaultValue) {
{
CDBehaviorParameter returnValue; CDBehaviorParameter returnValue;
returnValue.behaviorID = 0; returnValue.behaviorID = 0;
returnValue.parameterID = m_ParametersList.end(); returnValue.parameterID = m_ParametersList.end();

View File

@ -10,11 +10,11 @@
\brief Contains data for the BehaviorParameter table \brief Contains data for the BehaviorParameter table
*/ */
//! BehaviorParameter Entry Struct //! BehaviorParameter Entry Struct
struct CDBehaviorParameter { struct CDBehaviorParameter {
unsigned int behaviorID; //!< The Behavior ID unsigned int behaviorID; //!< The Behavior ID
std::unordered_set<std::string>::iterator parameterID; //!< The Parameter ID std::unordered_set<std::string>::iterator parameterID; //!< The Parameter ID
float value; //!< The value of the behavior template float value; //!< The value of the behavior template
}; };
//! BehaviorParameter table //! BehaviorParameter table
@ -23,19 +23,19 @@ private:
std::unordered_map<size_t, CDBehaviorParameter> m_Entries; std::unordered_map<size_t, CDBehaviorParameter> m_Entries;
std::unordered_set<std::string> m_ParametersList; std::unordered_set<std::string> m_ParametersList;
public: public:
//! Constructor //! Constructor
CDBehaviorParameterTable(void); CDBehaviorParameterTable(void);
//! Destructor //! Destructor
~CDBehaviorParameterTable(void); ~CDBehaviorParameterTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
CDBehaviorParameter GetEntry(const uint32_t behaviorID, const std::string& name, const float defaultValue = 0); CDBehaviorParameter GetEntry(const uint32_t behaviorID, const std::string& name, const float defaultValue = 0);
std::map<std::string, float> GetParametersByBehaviorID(uint32_t behaviorID); std::map<std::string, float> GetParametersByBehaviorID(uint32_t behaviorID);

View File

@ -2,76 +2,76 @@
//! Constructor //! Constructor
CDBehaviorTemplateTable::CDBehaviorTemplateTable(void) { CDBehaviorTemplateTable::CDBehaviorTemplateTable(void) {
// First, get the size of the table
unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM BehaviorTemplate");
while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0);
tableSize.nextRow();
}
tableSize.finalize();
// Reserve the size
this->entries.reserve(size);
// Now get the data // First, get the size of the table
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM BehaviorTemplate"); unsigned int size = 0;
while (!tableData.eof()) { auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM BehaviorTemplate");
CDBehaviorTemplate entry; while (!tableSize.eof()) {
entry.behaviorID = tableData.getIntField(0, -1); size = tableSize.getIntField(0, 0);
entry.templateID = tableData.getIntField(1, -1);
entry.effectID = tableData.getIntField(2, -1); tableSize.nextRow();
auto candidateToAdd = tableData.getStringField(3, ""); }
auto parameter = m_EffectHandles.find(candidateToAdd);
if (parameter != m_EffectHandles.end()) { tableSize.finalize();
entry.effectHandle = parameter;
} else { // Reserve the size
entry.effectHandle = m_EffectHandles.insert(candidateToAdd).first; this->entries.reserve(size);
}
// Now get the data
this->entries.push_back(entry); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM BehaviorTemplate");
this->entriesMappedByBehaviorID.insert(std::make_pair(entry.behaviorID, entry)); while (!tableData.eof()) {
tableData.nextRow(); CDBehaviorTemplate entry;
} entry.behaviorID = tableData.getIntField(0, -1);
entry.templateID = tableData.getIntField(1, -1);
entry.effectID = tableData.getIntField(2, -1);
auto candidateToAdd = tableData.getStringField(3, "");
auto parameter = m_EffectHandles.find(candidateToAdd);
if (parameter != m_EffectHandles.end()) {
entry.effectHandle = parameter;
} else {
entry.effectHandle = m_EffectHandles.insert(candidateToAdd).first;
}
this->entries.push_back(entry);
this->entriesMappedByBehaviorID.insert(std::make_pair(entry.behaviorID, entry));
tableData.nextRow();
}
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDBehaviorTemplateTable::~CDBehaviorTemplateTable(void) { } CDBehaviorTemplateTable::~CDBehaviorTemplateTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDBehaviorTemplateTable::GetName(void) const { std::string CDBehaviorTemplateTable::GetName(void) const {
return "BehaviorTemplate"; return "BehaviorTemplate";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDBehaviorTemplate> CDBehaviorTemplateTable::Query(std::function<bool(CDBehaviorTemplate)> predicate) { std::vector<CDBehaviorTemplate> CDBehaviorTemplateTable::Query(std::function<bool(CDBehaviorTemplate)> predicate) {
std::vector<CDBehaviorTemplate> data = cpplinq::from(this->entries) std::vector<CDBehaviorTemplate> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDBehaviorTemplate> CDBehaviorTemplateTable::GetEntries(void) const { std::vector<CDBehaviorTemplate> CDBehaviorTemplateTable::GetEntries(void) const {
return this->entries; return this->entries;
} }
const CDBehaviorTemplate CDBehaviorTemplateTable::GetByBehaviorID(uint32_t behaviorID) { const CDBehaviorTemplate CDBehaviorTemplateTable::GetByBehaviorID(uint32_t behaviorID) {
auto entry = this->entriesMappedByBehaviorID.find(behaviorID); auto entry = this->entriesMappedByBehaviorID.find(behaviorID);
if (entry == this->entriesMappedByBehaviorID.end()) { if (entry == this->entriesMappedByBehaviorID.end()) {
CDBehaviorTemplate entryToReturn; CDBehaviorTemplate entryToReturn;
entryToReturn.behaviorID = 0; entryToReturn.behaviorID = 0;
entryToReturn.effectHandle = m_EffectHandles.end(); entryToReturn.effectHandle = m_EffectHandles.end();
entryToReturn.effectID = 0; entryToReturn.effectID = 0;
return entryToReturn; return entryToReturn;
} else { } else {
return entry->second; return entry->second;
} }
} }

View File

@ -10,46 +10,46 @@
\brief Contains data for the BehaviorTemplate table \brief Contains data for the BehaviorTemplate table
*/ */
//! BehaviorTemplate Entry Struct //! BehaviorTemplate Entry Struct
struct CDBehaviorTemplate { struct CDBehaviorTemplate {
unsigned int behaviorID; //!< The Behavior ID unsigned int behaviorID; //!< The Behavior ID
unsigned int templateID; //!< The Template ID (LOT) unsigned int templateID; //!< The Template ID (LOT)
unsigned int effectID; //!< The Effect ID attached unsigned int effectID; //!< The Effect ID attached
std::unordered_set<std::string>::iterator effectHandle; //!< The effect handle std::unordered_set<std::string>::iterator effectHandle; //!< The effect handle
}; };
//! BehaviorTemplate table //! BehaviorTemplate table
class CDBehaviorTemplateTable : public CDTable { class CDBehaviorTemplateTable : public CDTable {
private: private:
std::vector<CDBehaviorTemplate> entries; std::vector<CDBehaviorTemplate> entries;
std::unordered_map<uint32_t, CDBehaviorTemplate> entriesMappedByBehaviorID; std::unordered_map<uint32_t, CDBehaviorTemplate> entriesMappedByBehaviorID;
std::unordered_set<std::string> m_EffectHandles; std::unordered_set<std::string> m_EffectHandles;
public: public:
//! Constructor
CDBehaviorTemplateTable(void);
//! Destructor
~CDBehaviorTemplateTable(void);
//! Returns the table's name
/*!
\return The table name
*/
std::string GetName(void) const override;
//! Queries the table with a custom "where" clause
/*!
\param predicate The predicate
*/
std::vector<CDBehaviorTemplate> Query(std::function<bool(CDBehaviorTemplate)> predicate);
//! Gets all the entries in the table
/*!
\return The entries
*/
std::vector<CDBehaviorTemplate> GetEntries(void) const;
const CDBehaviorTemplate GetByBehaviorID(uint32_t behaviorID); //! Constructor
CDBehaviorTemplateTable(void);
//! Destructor
~CDBehaviorTemplateTable(void);
//! Returns the table's name
/*!
\return The table name
*/
std::string GetName(void) const override;
//! Queries the table with a custom "where" clause
/*!
\param predicate The predicate
*/
std::vector<CDBehaviorTemplate> Query(std::function<bool(CDBehaviorTemplate)> predicate);
//! Gets all the entries in the table
/*!
\return The entries
*/
std::vector<CDBehaviorTemplate> GetEntries(void) const;
const CDBehaviorTemplate GetByBehaviorID(uint32_t behaviorID);
}; };

View File

@ -11,9 +11,9 @@ CDBrickIDTableTable::CDBrickIDTableTable(void) {
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
@ -32,7 +32,7 @@ CDBrickIDTableTable::CDBrickIDTableTable(void) {
} }
//! Destructor //! Destructor
CDBrickIDTableTable::~CDBrickIDTableTable(void) { } CDBrickIDTableTable::~CDBrickIDTableTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDBrickIDTableTable::GetName(void) const { std::string CDBrickIDTableTable::GetName(void) const {

View File

@ -4,33 +4,33 @@
//! Constructor //! Constructor
CDComponentsRegistryTable::CDComponentsRegistryTable(void) { CDComponentsRegistryTable::CDComponentsRegistryTable(void) {
#ifdef CDCLIENT_CACHE_ALL
// First, get the size of the table
unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ComponentsRegistry");
while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0);
tableSize.nextRow();
}
tableSize.finalize();
// Reserve the size
//this->entries.reserve(size);
// Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ComponentsRegistry");
while (!tableData.eof()) {
CDComponentsRegistry entry;
entry.id = tableData.getIntField(0, -1);
entry.component_type = tableData.getIntField(1, -1);
entry.component_id = tableData.getIntField(2, -1);
this->mappedEntries.insert_or_assign(((uint64_t) entry.component_type) << 32 | ((uint64_t) entry.id), entry.component_id); #ifdef CDCLIENT_CACHE_ALL
// First, get the size of the table
//this->entries.push_back(entry); unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ComponentsRegistry");
while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0);
tableSize.nextRow();
}
tableSize.finalize();
// Reserve the size
//this->entries.reserve(size);
// Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ComponentsRegistry");
while (!tableData.eof()) {
CDComponentsRegistry entry;
entry.id = tableData.getIntField(0, -1);
entry.component_type = tableData.getIntField(1, -1);
entry.component_id = tableData.getIntField(2, -1);
this->mappedEntries.insert_or_assign(((uint64_t)entry.component_type) << 32 | ((uint64_t)entry.id), entry.component_id);
//this->entries.push_back(entry);
/* /*
//Darwin's stuff: //Darwin's stuff:
@ -48,27 +48,25 @@ CDComponentsRegistryTable::CDComponentsRegistryTable(void) {
} }
*/ */
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
#endif #endif
} }
//! Destructor //! Destructor
CDComponentsRegistryTable::~CDComponentsRegistryTable(void) { } CDComponentsRegistryTable::~CDComponentsRegistryTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDComponentsRegistryTable::GetName(void) const { std::string CDComponentsRegistryTable::GetName(void) const {
return "ComponentsRegistry"; return "ComponentsRegistry";
} }
int32_t CDComponentsRegistryTable::GetByIDAndType(uint32_t id, uint32_t componentType, int32_t defaultValue) int32_t CDComponentsRegistryTable::GetByIDAndType(uint32_t id, uint32_t componentType, int32_t defaultValue) {
{ const auto& iter = this->mappedEntries.find(((uint64_t)componentType) << 32 | ((uint64_t)id));
const auto& iter = this->mappedEntries.find(((uint64_t) componentType) << 32 | ((uint64_t) id));
if (iter == this->mappedEntries.end()) if (iter == this->mappedEntries.end()) {
{
return defaultValue; return defaultValue;
} }
@ -85,19 +83,19 @@ int32_t CDComponentsRegistryTable::GetByIDAndType(uint32_t id, uint32_t componen
*/ */
#ifndef CDCLIENT_CACHE_ALL #ifndef CDCLIENT_CACHE_ALL
// Now get the data // Now get the data
std::stringstream query; std::stringstream query;
query << "SELECT * FROM ComponentsRegistry WHERE id = " << std::to_string(id); query << "SELECT * FROM ComponentsRegistry WHERE id = " << std::to_string(id);
auto tableData = CDClientDatabase::ExecuteQuery(query.str()); auto tableData = CDClientDatabase::ExecuteQuery(query.str());
while (!tableData.eof()) { while (!tableData.eof()) {
CDComponentsRegistry entry; CDComponentsRegistry entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.component_type = tableData.getIntField(1, -1); entry.component_type = tableData.getIntField(1, -1);
entry.component_id = tableData.getIntField(2, -1); entry.component_id = tableData.getIntField(2, -1);
//this->entries.push_back(entry); //this->entries.push_back(entry);
//Darwin's stuff: //Darwin's stuff:
const auto& it = this->mappedEntries.find(entry.id); const auto& it = this->mappedEntries.find(entry.id);
@ -106,15 +104,14 @@ int32_t CDComponentsRegistryTable::GetByIDAndType(uint32_t id, uint32_t componen
if (iter == it->second.end()) { if (iter == it->second.end()) {
it->second.insert(std::make_pair(entry.component_type, entry.component_id)); it->second.insert(std::make_pair(entry.component_type, entry.component_id));
} }
} } else {
else {
std::map<unsigned int, unsigned int> map; std::map<unsigned int, unsigned int> map;
map.insert(std::make_pair(entry.component_type, entry.component_id)); map.insert(std::make_pair(entry.component_type, entry.component_id));
this->mappedEntries.insert(std::make_pair(entry.id, map)); this->mappedEntries.insert(std::make_pair(entry.id, map));
} }
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();

View File

@ -8,33 +8,33 @@
\brief Contains data for the ComponentsRegistry table \brief Contains data for the ComponentsRegistry table
*/ */
//! ComponentsRegistry Entry Struct //! ComponentsRegistry Entry Struct
struct CDComponentsRegistry { struct CDComponentsRegistry {
unsigned int id; //!< The LOT is used as the ID unsigned int id; //!< The LOT is used as the ID
unsigned int component_type; //!< See ComponentTypes enum for values unsigned int component_type; //!< See ComponentTypes enum for values
unsigned int component_id; //!< The ID used within the component's table (0 may either mean it's non-networked, or that the ID is actually 0 unsigned int component_id; //!< The ID used within the component's table (0 may either mean it's non-networked, or that the ID is actually 0
}; };
//! ComponentsRegistry table //! ComponentsRegistry table
class CDComponentsRegistryTable : public CDTable { class CDComponentsRegistryTable : public CDTable {
private: private:
//std::vector<CDComponentsRegistry> entries; //std::vector<CDComponentsRegistry> entries;
std::map<uint64_t, uint32_t> mappedEntries; //id, component_type, component_id std::map<uint64_t, uint32_t> mappedEntries; //id, component_type, component_id
public:
//! Constructor
CDComponentsRegistryTable(void);
//! Destructor
~CDComponentsRegistryTable(void);
//! Returns the table's name
/*!
\return The table name
*/
std::string GetName(void) const override;
int32_t GetByIDAndType(uint32_t id, uint32_t componentType, int32_t defaultValue = 0); public:
//! Constructor
CDComponentsRegistryTable(void);
//! Destructor
~CDComponentsRegistryTable(void);
//! Returns the table's name
/*!
\return The table name
*/
std::string GetName(void) const override;
int32_t GetByIDAndType(uint32_t id, uint32_t componentType, int32_t defaultValue = 0);
}; };

View File

@ -2,57 +2,57 @@
//! Constructor //! Constructor
CDCurrencyTableTable::CDCurrencyTableTable(void) { CDCurrencyTableTable::CDCurrencyTableTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM CurrencyTable"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM CurrencyTable");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM CurrencyTable"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM CurrencyTable");
while (!tableData.eof()) { while (!tableData.eof()) {
CDCurrencyTable entry; CDCurrencyTable entry;
entry.currencyIndex = tableData.getIntField(0, -1); entry.currencyIndex = tableData.getIntField(0, -1);
entry.npcminlevel = tableData.getIntField(1, -1); entry.npcminlevel = tableData.getIntField(1, -1);
entry.minvalue = tableData.getIntField(2, -1); entry.minvalue = tableData.getIntField(2, -1);
entry.maxvalue = tableData.getIntField(3, -1); entry.maxvalue = tableData.getIntField(3, -1);
entry.id = tableData.getIntField(4, -1); entry.id = tableData.getIntField(4, -1);
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDCurrencyTableTable::~CDCurrencyTableTable(void) { } CDCurrencyTableTable::~CDCurrencyTableTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDCurrencyTableTable::GetName(void) const { std::string CDCurrencyTableTable::GetName(void) const {
return "CurrencyTable"; return "CurrencyTable";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDCurrencyTable> CDCurrencyTableTable::Query(std::function<bool(CDCurrencyTable)> predicate) { std::vector<CDCurrencyTable> CDCurrencyTableTable::Query(std::function<bool(CDCurrencyTable)> predicate) {
std::vector<CDCurrencyTable> data = cpplinq::from(this->entries) std::vector<CDCurrencyTable> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDCurrencyTable> CDCurrencyTableTable::GetEntries(void) const { std::vector<CDCurrencyTable> CDCurrencyTableTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,44 +8,44 @@
\brief Contains data for the CurrencyTable table \brief Contains data for the CurrencyTable table
*/ */
//! CurrencyTable Struct //! CurrencyTable Struct
struct CDCurrencyTable { struct CDCurrencyTable {
unsigned int currencyIndex; //!< The Currency Index unsigned int currencyIndex; //!< The Currency Index
unsigned int npcminlevel; //!< The minimum level of the npc unsigned int npcminlevel; //!< The minimum level of the npc
unsigned int minvalue; //!< The minimum currency unsigned int minvalue; //!< The minimum currency
unsigned int maxvalue; //!< The maximum currency unsigned int maxvalue; //!< The maximum currency
unsigned int id; //!< The ID of the currency index unsigned int id; //!< The ID of the currency index
}; };
//! CurrencyTable table //! CurrencyTable table
class CDCurrencyTableTable : public CDTable { class CDCurrencyTableTable : public CDTable {
private: private:
std::vector<CDCurrencyTable> entries; std::vector<CDCurrencyTable> entries;
public: public:
//! Constructor //! Constructor
CDCurrencyTableTable(void); CDCurrencyTableTable(void);
//! Destructor //! Destructor
~CDCurrencyTableTable(void); ~CDCurrencyTableTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDCurrencyTable> Query(std::function<bool(CDCurrencyTable)> predicate); std::vector<CDCurrencyTable> Query(std::function<bool(CDCurrencyTable)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDCurrencyTable> GetEntries(void) const; std::vector<CDCurrencyTable> GetEntries(void) const;
}; };

View File

@ -2,66 +2,66 @@
//! Constructor //! Constructor
CDDestructibleComponentTable::CDDestructibleComponentTable(void) { CDDestructibleComponentTable::CDDestructibleComponentTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM DestructibleComponent"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM DestructibleComponent");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM DestructibleComponent"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM DestructibleComponent");
while (!tableData.eof()) { while (!tableData.eof()) {
CDDestructibleComponent entry; CDDestructibleComponent entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.faction = tableData.getIntField(1, -1); entry.faction = tableData.getIntField(1, -1);
entry.factionList = tableData.getStringField(2, ""); entry.factionList = tableData.getStringField(2, "");
entry.life = tableData.getIntField(3, -1); entry.life = tableData.getIntField(3, -1);
entry.imagination = tableData.getIntField(4, -1); entry.imagination = tableData.getIntField(4, -1);
entry.LootMatrixIndex = tableData.getIntField(5, -1); entry.LootMatrixIndex = tableData.getIntField(5, -1);
entry.CurrencyIndex = tableData.getIntField(6, -1); entry.CurrencyIndex = tableData.getIntField(6, -1);
entry.level = tableData.getIntField(7, -1); entry.level = tableData.getIntField(7, -1);
entry.armor = tableData.getFloatField(8, -1.0f); entry.armor = tableData.getFloatField(8, -1.0f);
entry.death_behavior = tableData.getIntField(9, -1); entry.death_behavior = tableData.getIntField(9, -1);
entry.isnpc = tableData.getIntField(10, -1) == 1 ? true : false; entry.isnpc = tableData.getIntField(10, -1) == 1 ? true : false;
entry.attack_priority = tableData.getIntField(11, -1); entry.attack_priority = tableData.getIntField(11, -1);
entry.isSmashable = tableData.getIntField(12, -1) == 1 ? true : false; entry.isSmashable = tableData.getIntField(12, -1) == 1 ? true : false;
entry.difficultyLevel = tableData.getIntField(13, -1); entry.difficultyLevel = tableData.getIntField(13, -1);
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDDestructibleComponentTable::~CDDestructibleComponentTable(void) { } CDDestructibleComponentTable::~CDDestructibleComponentTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDDestructibleComponentTable::GetName(void) const { std::string CDDestructibleComponentTable::GetName(void) const {
return "DestructibleComponent"; return "DestructibleComponent";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDDestructibleComponent> CDDestructibleComponentTable::Query(std::function<bool(CDDestructibleComponent)> predicate) { std::vector<CDDestructibleComponent> CDDestructibleComponentTable::Query(std::function<bool(CDDestructibleComponent)> predicate) {
std::vector<CDDestructibleComponent> data = cpplinq::from(this->entries) std::vector<CDDestructibleComponent> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDDestructibleComponent> CDDestructibleComponentTable::GetEntries(void) const { std::vector<CDDestructibleComponent> CDDestructibleComponentTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,53 +8,53 @@
\brief Contains data for the DestructibleComponent table \brief Contains data for the DestructibleComponent table
*/ */
//! ItemComponent Struct //! ItemComponent Struct
struct CDDestructibleComponent { struct CDDestructibleComponent {
unsigned int id; //!< The component ID from the ComponentsRegistry Table unsigned int id; //!< The component ID from the ComponentsRegistry Table
int faction; //!< The Faction ID of the object int faction; //!< The Faction ID of the object
std::string factionList; //!< A list of the faction IDs std::string factionList; //!< A list of the faction IDs
int life; //!< The amount of life of the object int life; //!< The amount of life of the object
unsigned int imagination; //!< The amount of imagination of the object unsigned int imagination; //!< The amount of imagination of the object
int LootMatrixIndex; //!< The Loot Matrix Index int LootMatrixIndex; //!< The Loot Matrix Index
int CurrencyIndex; //!< The Currency Index int CurrencyIndex; //!< The Currency Index
unsigned int level; //!< ??? unsigned int level; //!< ???
float armor; //!< The amount of armor of the object float armor; //!< The amount of armor of the object
unsigned int death_behavior; //!< The behavior ID of the death behavior unsigned int death_behavior; //!< The behavior ID of the death behavior
bool isnpc; //!< Whether or not the object is an NPC bool isnpc; //!< Whether or not the object is an NPC
unsigned int attack_priority; //!< ??? unsigned int attack_priority; //!< ???
bool isSmashable; //!< Whether or not the object is smashable bool isSmashable; //!< Whether or not the object is smashable
int difficultyLevel; //!< ??? int difficultyLevel; //!< ???
}; };
//! ItemComponent table //! ItemComponent table
class CDDestructibleComponentTable : public CDTable { class CDDestructibleComponentTable : public CDTable {
private: private:
std::vector<CDDestructibleComponent> entries; std::vector<CDDestructibleComponent> entries;
public: public:
//! Constructor //! Constructor
CDDestructibleComponentTable(void); CDDestructibleComponentTable(void);
//! Destructor //! Destructor
~CDDestructibleComponentTable(void); ~CDDestructibleComponentTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDDestructibleComponent> Query(std::function<bool(CDDestructibleComponent)> predicate); std::vector<CDDestructibleComponent> Query(std::function<bool(CDDestructibleComponent)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDDestructibleComponent> GetEntries(void) const; std::vector<CDDestructibleComponent> GetEntries(void) const;
}; };

View File

@ -2,43 +2,43 @@
//! Constructor //! Constructor
CDEmoteTableTable::CDEmoteTableTable(void) { CDEmoteTableTable::CDEmoteTableTable(void) {
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Emotes"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Emotes");
while (!tableData.eof()) { while (!tableData.eof()) {
CDEmoteTable* entry = new CDEmoteTable(); CDEmoteTable* entry = new CDEmoteTable();
entry->ID = tableData.getIntField(0, -1); entry->ID = tableData.getIntField(0, -1);
entry->animationName = tableData.getStringField(1, ""); entry->animationName = tableData.getStringField(1, "");
entry->iconFilename = tableData.getStringField(2, ""); entry->iconFilename = tableData.getStringField(2, "");
entry->channel = tableData.getIntField(3, -1); entry->channel = tableData.getIntField(3, -1);
entry->locked = tableData.getIntField(5, -1) != 0; entry->locked = tableData.getIntField(5, -1) != 0;
entry->localize = tableData.getIntField(6, -1) != 0; entry->localize = tableData.getIntField(6, -1) != 0;
entry->locState = tableData.getIntField(7, -1); entry->locState = tableData.getIntField(7, -1);
entry->gateVersion = tableData.getIntField(8, -1); entry->gateVersion = tableData.getIntField(8, -1);
entries.insert(std::make_pair(entry->ID, entry)); entries.insert(std::make_pair(entry->ID, entry));
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDEmoteTableTable::~CDEmoteTableTable(void) { CDEmoteTableTable::~CDEmoteTableTable(void) {
for (auto e : entries) { for (auto e : entries) {
if (e.second) delete e.second; if (e.second) delete e.second;
} }
entries.clear(); entries.clear();
} }
//! Returns the table's name //! Returns the table's name
std::string CDEmoteTableTable::GetName(void) const { std::string CDEmoteTableTable::GetName(void) const {
return "Emotes"; return "Emotes";
} }
CDEmoteTable * CDEmoteTableTable::GetEmote(int id) { CDEmoteTable* CDEmoteTableTable::GetEmote(int id) {
for (auto e : entries) { for (auto e : entries) {
if (e.first == id) return e.second; if (e.first == id) return e.second;
} }
return nullptr; return nullptr;
} }

View File

@ -9,7 +9,7 @@
\brief Contains data for the CDEmoteTable table \brief Contains data for the CDEmoteTable table
*/ */
//! CDEmoteEntry Struct //! CDEmoteEntry Struct
struct CDEmoteTable { struct CDEmoteTable {
CDEmoteTable() { CDEmoteTable() {
ID = -1; ID = -1;
@ -22,35 +22,35 @@ struct CDEmoteTable {
gateVersion = -1; gateVersion = -1;
} }
int ID; int ID;
std::string animationName; std::string animationName;
std::string iconFilename; std::string iconFilename;
int locState; int locState;
int channel; int channel;
bool locked; bool locked;
bool localize; bool localize;
int gateVersion; int gateVersion;
}; };
//! CDEmoteTable table //! CDEmoteTable table
class CDEmoteTableTable : public CDTable { class CDEmoteTableTable : public CDTable {
private: private:
std::map<int, CDEmoteTable*> entries; std::map<int, CDEmoteTable*> entries;
public: public:
//! Constructor //! Constructor
CDEmoteTableTable(void); CDEmoteTableTable(void);
//! Destructor //! Destructor
~CDEmoteTableTable(void); ~CDEmoteTableTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Returns an emote by ID //! Returns an emote by ID
CDEmoteTable* GetEmote(int id); CDEmoteTable* GetEmote(int id);
}; };

View File

@ -2,70 +2,67 @@
//! Constructor //! Constructor
CDFeatureGatingTable::CDFeatureGatingTable(void) { CDFeatureGatingTable::CDFeatureGatingTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM FeatureGating"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM FeatureGating");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM FeatureGating"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM FeatureGating");
while (!tableData.eof()) { while (!tableData.eof()) {
CDFeatureGating entry; CDFeatureGating entry;
entry.featureName = tableData.getStringField(0, ""); entry.featureName = tableData.getStringField(0, "");
entry.major = tableData.getIntField(1, -1); entry.major = tableData.getIntField(1, -1);
entry.current = tableData.getIntField(2, -1); entry.current = tableData.getIntField(2, -1);
entry.minor = tableData.getIntField(3, -1); entry.minor = tableData.getIntField(3, -1);
entry.description = tableData.getStringField(4, ""); entry.description = tableData.getStringField(4, "");
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDFeatureGatingTable::~CDFeatureGatingTable(void) { } CDFeatureGatingTable::~CDFeatureGatingTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDFeatureGatingTable::GetName(void) const { std::string CDFeatureGatingTable::GetName(void) const {
return "FeatureGating"; return "FeatureGating";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDFeatureGating> CDFeatureGatingTable::Query(std::function<bool(CDFeatureGating)> predicate) { std::vector<CDFeatureGating> CDFeatureGatingTable::Query(std::function<bool(CDFeatureGating)> predicate) {
std::vector<CDFeatureGating> data = cpplinq::from(this->entries) std::vector<CDFeatureGating> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
bool CDFeatureGatingTable::FeatureUnlocked(const std::string& feature) const bool CDFeatureGatingTable::FeatureUnlocked(const std::string& feature) const {
{ for (const auto& entry : entries) {
for (const auto& entry : entries) if (entry.featureName == feature) {
{ return true;
if (entry.featureName == feature) }
{ }
return true;
} return false;
}
return false;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDFeatureGating> CDFeatureGatingTable::GetEntries(void) const { std::vector<CDFeatureGating> CDFeatureGatingTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -7,46 +7,46 @@
\file CDFeatureGatingTable.hpp \file CDFeatureGatingTable.hpp
*/ */
//! ItemComponent Struct //! ItemComponent Struct
struct CDFeatureGating { struct CDFeatureGating {
std::string featureName; std::string featureName;
int32_t major; int32_t major;
int32_t current; int32_t current;
int32_t minor; int32_t minor;
std::string description; std::string description;
}; };
//! ItemComponent table //! ItemComponent table
class CDFeatureGatingTable : public CDTable { class CDFeatureGatingTable : public CDTable {
private: private:
std::vector<CDFeatureGating> entries; std::vector<CDFeatureGating> entries;
public: public:
//! Constructor //! Constructor
CDFeatureGatingTable(void); CDFeatureGatingTable(void);
//! Destructor //! Destructor
~CDFeatureGatingTable(void); ~CDFeatureGatingTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDFeatureGating> Query(std::function<bool(CDFeatureGating)> predicate); std::vector<CDFeatureGating> Query(std::function<bool(CDFeatureGating)> predicate);
bool FeatureUnlocked(const std::string& feature) const;
//! Gets all the entries in the table
/*!
\return The entries
*/
std::vector<CDFeatureGating> GetEntries(void) const;
bool FeatureUnlocked(const std::string& feature) const;
//! Gets all the entries in the table
/*!
\return The entries
*/
std::vector<CDFeatureGating> GetEntries(void) const;
}; };

View File

@ -2,56 +2,56 @@
//! Constructor //! Constructor
CDInventoryComponentTable::CDInventoryComponentTable(void) { CDInventoryComponentTable::CDInventoryComponentTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM InventoryComponent"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM InventoryComponent");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM InventoryComponent"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM InventoryComponent");
while (!tableData.eof()) { while (!tableData.eof()) {
CDInventoryComponent entry; CDInventoryComponent entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.itemid = tableData.getIntField(1, -1); entry.itemid = tableData.getIntField(1, -1);
entry.count = tableData.getIntField(2, -1); entry.count = tableData.getIntField(2, -1);
entry.equip = tableData.getIntField(3, -1) == 1 ? true : false; entry.equip = tableData.getIntField(3, -1) == 1 ? true : false;
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDInventoryComponentTable::~CDInventoryComponentTable(void) { } CDInventoryComponentTable::~CDInventoryComponentTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDInventoryComponentTable::GetName(void) const { std::string CDInventoryComponentTable::GetName(void) const {
return "InventoryComponent"; return "InventoryComponent";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDInventoryComponent> CDInventoryComponentTable::Query(std::function<bool(CDInventoryComponent)> predicate) { std::vector<CDInventoryComponent> CDInventoryComponentTable::Query(std::function<bool(CDInventoryComponent)> predicate) {
std::vector<CDInventoryComponent> data = cpplinq::from(this->entries) std::vector<CDInventoryComponent> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDInventoryComponent> CDInventoryComponentTable::GetEntries(void) const { std::vector<CDInventoryComponent> CDInventoryComponentTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,43 +8,43 @@
\brief Contains data for the InventoryComponent table \brief Contains data for the InventoryComponent table
*/ */
//! ItemComponent Struct //! ItemComponent Struct
struct CDInventoryComponent { struct CDInventoryComponent {
unsigned int id; //!< The component ID for this object unsigned int id; //!< The component ID for this object
unsigned int itemid; //!< The LOT of the object unsigned int itemid; //!< The LOT of the object
unsigned int count; //!< The count of the items the object has unsigned int count; //!< The count of the items the object has
bool equip; //!< Whether or not to equip the item bool equip; //!< Whether or not to equip the item
}; };
//! ItemComponent table //! ItemComponent table
class CDInventoryComponentTable : public CDTable { class CDInventoryComponentTable : public CDTable {
private: private:
std::vector<CDInventoryComponent> entries; std::vector<CDInventoryComponent> entries;
public: public:
//! Constructor //! Constructor
CDInventoryComponentTable(void); CDInventoryComponentTable(void);
//! Destructor //! Destructor
~CDInventoryComponentTable(void); ~CDInventoryComponentTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDInventoryComponent> Query(std::function<bool(CDInventoryComponent)> predicate); std::vector<CDInventoryComponent> Query(std::function<bool(CDInventoryComponent)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDInventoryComponent> GetEntries(void) const; std::vector<CDInventoryComponent> GetEntries(void) const;
}; };

View File

@ -5,84 +5,84 @@ CDItemComponent CDItemComponentTable::Default = {};
//! Constructor //! Constructor
CDItemComponentTable::CDItemComponentTable(void) { CDItemComponentTable::CDItemComponentTable(void) {
Default = CDItemComponent(); Default = CDItemComponent();
#ifdef CDCLIENT_CACHE_ALL #ifdef CDCLIENT_CACHE_ALL
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ItemComponent"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ItemComponent");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ItemComponent"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ItemComponent");
while (!tableData.eof()) { while (!tableData.eof()) {
CDItemComponent entry; CDItemComponent entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.equipLocation = tableData.getStringField(1, ""); entry.equipLocation = tableData.getStringField(1, "");
entry.baseValue = tableData.getIntField(2, -1); entry.baseValue = tableData.getIntField(2, -1);
entry.isKitPiece = tableData.getIntField(3, -1) == 1 ? true : false; entry.isKitPiece = tableData.getIntField(3, -1) == 1 ? true : false;
entry.rarity = tableData.getIntField(4, 0); entry.rarity = tableData.getIntField(4, 0);
entry.itemType = tableData.getIntField(5, -1); entry.itemType = tableData.getIntField(5, -1);
entry.itemInfo = tableData.getInt64Field(6, -1); entry.itemInfo = tableData.getInt64Field(6, -1);
entry.inLootTable = tableData.getIntField(7, -1) == 1 ? true : false; entry.inLootTable = tableData.getIntField(7, -1) == 1 ? true : false;
entry.inVendor = tableData.getIntField(8, -1) == 1 ? true : false; entry.inVendor = tableData.getIntField(8, -1) == 1 ? true : false;
entry.isUnique = tableData.getIntField(9, -1) == 1 ? true : false; entry.isUnique = tableData.getIntField(9, -1) == 1 ? true : false;
entry.isBOP = tableData.getIntField(10, -1) == 1 ? true : false; entry.isBOP = tableData.getIntField(10, -1) == 1 ? true : false;
entry.isBOE = tableData.getIntField(11, -1) == 1 ? true : false; entry.isBOE = tableData.getIntField(11, -1) == 1 ? true : false;
entry.reqFlagID = tableData.getIntField(12, -1); entry.reqFlagID = tableData.getIntField(12, -1);
entry.reqSpecialtyID = tableData.getIntField(13, -1); entry.reqSpecialtyID = tableData.getIntField(13, -1);
entry.reqSpecRank = tableData.getIntField(14, -1); entry.reqSpecRank = tableData.getIntField(14, -1);
entry.reqAchievementID = tableData.getIntField(15, -1); entry.reqAchievementID = tableData.getIntField(15, -1);
entry.stackSize = tableData.getIntField(16, -1); entry.stackSize = tableData.getIntField(16, -1);
entry.color1 = tableData.getIntField(17, -1); entry.color1 = tableData.getIntField(17, -1);
entry.decal = tableData.getIntField(18, -1); entry.decal = tableData.getIntField(18, -1);
entry.offsetGroupID = tableData.getIntField(19, -1); entry.offsetGroupID = tableData.getIntField(19, -1);
entry.buildTypes = tableData.getIntField(20, -1); entry.buildTypes = tableData.getIntField(20, -1);
entry.reqPrecondition = tableData.getStringField(21, ""); entry.reqPrecondition = tableData.getStringField(21, "");
entry.animationFlag = tableData.getIntField(22, -1); entry.animationFlag = tableData.getIntField(22, -1);
entry.equipEffects = tableData.getIntField(23, -1); entry.equipEffects = tableData.getIntField(23, -1);
entry.readyForQA = tableData.getIntField(24, -1) == 1 ? true : false; entry.readyForQA = tableData.getIntField(24, -1) == 1 ? true : false;
entry.itemRating = tableData.getIntField(25, -1); entry.itemRating = tableData.getIntField(25, -1);
entry.isTwoHanded = tableData.getIntField(26, -1) == 1 ? true : false; entry.isTwoHanded = tableData.getIntField(26, -1) == 1 ? true : false;
entry.minNumRequired = tableData.getIntField(27, -1); entry.minNumRequired = tableData.getIntField(27, -1);
entry.delResIndex = tableData.getIntField(28, -1); entry.delResIndex = tableData.getIntField(28, -1);
entry.currencyLOT = tableData.getIntField(29, -1); entry.currencyLOT = tableData.getIntField(29, -1);
entry.altCurrencyCost = tableData.getIntField(30, -1); entry.altCurrencyCost = tableData.getIntField(30, -1);
entry.subItems = tableData.getStringField(31, ""); entry.subItems = tableData.getStringField(31, "");
entry.audioEventUse = tableData.getStringField(32, ""); entry.audioEventUse = tableData.getStringField(32, "");
entry.noEquipAnimation = tableData.getIntField(33, -1) == 1 ? true : false; entry.noEquipAnimation = tableData.getIntField(33, -1) == 1 ? true : false;
entry.commendationLOT = tableData.getIntField(34, -1); entry.commendationLOT = tableData.getIntField(34, -1);
entry.commendationCost = tableData.getIntField(35, -1); entry.commendationCost = tableData.getIntField(35, -1);
entry.audioEquipMetaEventSet = tableData.getStringField(36, ""); entry.audioEquipMetaEventSet = tableData.getStringField(36, "");
entry.currencyCosts = tableData.getStringField(37, ""); entry.currencyCosts = tableData.getStringField(37, "");
entry.ingredientInfo = tableData.getStringField(38, ""); entry.ingredientInfo = tableData.getStringField(38, "");
entry.locStatus = tableData.getIntField(39, -1); entry.locStatus = tableData.getIntField(39, -1);
entry.forgeType = tableData.getIntField(40, -1); entry.forgeType = tableData.getIntField(40, -1);
entry.SellMultiplier = tableData.getFloatField(41, -1.0f); entry.SellMultiplier = tableData.getFloatField(41, -1.0f);
this->entries.insert(std::make_pair(entry.id, entry)); this->entries.insert(std::make_pair(entry.id, entry));
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
#endif #endif
} }
//! Destructor //! Destructor
CDItemComponentTable::~CDItemComponentTable(void) { } CDItemComponentTable::~CDItemComponentTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDItemComponentTable::GetName(void) const { std::string CDItemComponentTable::GetName(void) const {
return "ItemComponent"; return "ItemComponent";
} }
const CDItemComponent & CDItemComponentTable::GetItemComponentByID(unsigned int skillID) { const CDItemComponent& CDItemComponentTable::GetItemComponentByID(unsigned int skillID) {
const auto& it = this->entries.find(skillID); const auto& it = this->entries.find(skillID);
if (it != this->entries.end()) { if (it != this->entries.end()) {
return it->second; return it->second;
@ -94,59 +94,59 @@ const CDItemComponent & CDItemComponentTable::GetItemComponentByID(unsigned int
query << "SELECT * FROM ItemComponent WHERE id = " << std::to_string(skillID); query << "SELECT * FROM ItemComponent WHERE id = " << std::to_string(skillID);
auto tableData = CDClientDatabase::ExecuteQuery(query.str()); auto tableData = CDClientDatabase::ExecuteQuery(query.str());
if (tableData.eof()) { if (tableData.eof()) {
entries.insert(std::make_pair(skillID, Default)); entries.insert(std::make_pair(skillID, Default));
return Default; return Default;
} }
while (!tableData.eof()) { while (!tableData.eof()) {
CDItemComponent entry; CDItemComponent entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.equipLocation = tableData.getStringField(1, ""); entry.equipLocation = tableData.getStringField(1, "");
entry.baseValue = tableData.getIntField(2, -1); entry.baseValue = tableData.getIntField(2, -1);
entry.isKitPiece = tableData.getIntField(3, -1) == 1 ? true : false; entry.isKitPiece = tableData.getIntField(3, -1) == 1 ? true : false;
entry.rarity = tableData.getIntField(4, 0); entry.rarity = tableData.getIntField(4, 0);
entry.itemType = tableData.getIntField(5, -1); entry.itemType = tableData.getIntField(5, -1);
entry.itemInfo = tableData.getInt64Field(6, -1); entry.itemInfo = tableData.getInt64Field(6, -1);
entry.inLootTable = tableData.getIntField(7, -1) == 1 ? true : false; entry.inLootTable = tableData.getIntField(7, -1) == 1 ? true : false;
entry.inVendor = tableData.getIntField(8, -1) == 1 ? true : false; entry.inVendor = tableData.getIntField(8, -1) == 1 ? true : false;
entry.isUnique = tableData.getIntField(9, -1) == 1 ? true : false; entry.isUnique = tableData.getIntField(9, -1) == 1 ? true : false;
entry.isBOP = tableData.getIntField(10, -1) == 1 ? true : false; entry.isBOP = tableData.getIntField(10, -1) == 1 ? true : false;
entry.isBOE = tableData.getIntField(11, -1) == 1 ? true : false; entry.isBOE = tableData.getIntField(11, -1) == 1 ? true : false;
entry.reqFlagID = tableData.getIntField(12, -1); entry.reqFlagID = tableData.getIntField(12, -1);
entry.reqSpecialtyID = tableData.getIntField(13, -1); entry.reqSpecialtyID = tableData.getIntField(13, -1);
entry.reqSpecRank = tableData.getIntField(14, -1); entry.reqSpecRank = tableData.getIntField(14, -1);
entry.reqAchievementID = tableData.getIntField(15, -1); entry.reqAchievementID = tableData.getIntField(15, -1);
entry.stackSize = tableData.getIntField(16, -1); entry.stackSize = tableData.getIntField(16, -1);
entry.color1 = tableData.getIntField(17, -1); entry.color1 = tableData.getIntField(17, -1);
entry.decal = tableData.getIntField(18, -1); entry.decal = tableData.getIntField(18, -1);
entry.offsetGroupID = tableData.getIntField(19, -1); entry.offsetGroupID = tableData.getIntField(19, -1);
entry.buildTypes = tableData.getIntField(20, -1); entry.buildTypes = tableData.getIntField(20, -1);
entry.reqPrecondition = tableData.getStringField(21, ""); entry.reqPrecondition = tableData.getStringField(21, "");
entry.animationFlag = tableData.getIntField(22, -1); entry.animationFlag = tableData.getIntField(22, -1);
entry.equipEffects = tableData.getIntField(23, -1); entry.equipEffects = tableData.getIntField(23, -1);
entry.readyForQA = tableData.getIntField(24, -1) == 1 ? true : false; entry.readyForQA = tableData.getIntField(24, -1) == 1 ? true : false;
entry.itemRating = tableData.getIntField(25, -1); entry.itemRating = tableData.getIntField(25, -1);
entry.isTwoHanded = tableData.getIntField(26, -1) == 1 ? true : false; entry.isTwoHanded = tableData.getIntField(26, -1) == 1 ? true : false;
entry.minNumRequired = tableData.getIntField(27, -1); entry.minNumRequired = tableData.getIntField(27, -1);
entry.delResIndex = tableData.getIntField(28, -1); entry.delResIndex = tableData.getIntField(28, -1);
entry.currencyLOT = tableData.getIntField(29, -1); entry.currencyLOT = tableData.getIntField(29, -1);
entry.altCurrencyCost = tableData.getIntField(30, -1); entry.altCurrencyCost = tableData.getIntField(30, -1);
entry.subItems = tableData.getStringField(31, ""); entry.subItems = tableData.getStringField(31, "");
UNUSED(entry.audioEventUse = tableData.getStringField(32, "")); UNUSED(entry.audioEventUse = tableData.getStringField(32, ""));
entry.noEquipAnimation = tableData.getIntField(33, -1) == 1 ? true : false; entry.noEquipAnimation = tableData.getIntField(33, -1) == 1 ? true : false;
entry.commendationLOT = tableData.getIntField(34, -1); entry.commendationLOT = tableData.getIntField(34, -1);
entry.commendationCost = tableData.getIntField(35, -1); entry.commendationCost = tableData.getIntField(35, -1);
UNUSED(entry.audioEquipMetaEventSet = tableData.getStringField(36, "")); UNUSED(entry.audioEquipMetaEventSet = tableData.getStringField(36, ""));
entry.currencyCosts = tableData.getStringField(37, ""); entry.currencyCosts = tableData.getStringField(37, "");
UNUSED(entry.ingredientInfo = tableData.getStringField(38, "")); UNUSED(entry.ingredientInfo = tableData.getStringField(38, ""));
entry.locStatus = tableData.getIntField(39, -1); entry.locStatus = tableData.getIntField(39, -1);
entry.forgeType = tableData.getIntField(40, -1); entry.forgeType = tableData.getIntField(40, -1);
entry.SellMultiplier = tableData.getFloatField(41, -1.0f); entry.SellMultiplier = tableData.getFloatField(41, -1.0f);
this->entries.insert(std::make_pair(entry.id, entry)); this->entries.insert(std::make_pair(entry.id, entry));
tableData.nextRow(); tableData.nextRow();
} }
const auto& it2 = this->entries.find(skillID); const auto& it2 = this->entries.find(skillID);
if (it2 != this->entries.end()) { if (it2 != this->entries.end()) {
@ -154,26 +154,26 @@ const CDItemComponent & CDItemComponentTable::GetItemComponentByID(unsigned int
} }
#endif #endif
return Default; return Default;
} }
std::map<LOT, uint32_t> CDItemComponentTable::ParseCraftingCurrencies(const CDItemComponent& itemComponent) { std::map<LOT, uint32_t> CDItemComponentTable::ParseCraftingCurrencies(const CDItemComponent& itemComponent) {
std::map<LOT, uint32_t> currencies = {}; std::map<LOT, uint32_t> currencies = {};
if (!itemComponent.currencyCosts.empty()) { if (!itemComponent.currencyCosts.empty()) {
auto currencySplit = GeneralUtils::SplitString(itemComponent.currencyCosts, ','); auto currencySplit = GeneralUtils::SplitString(itemComponent.currencyCosts, ',');
for (const auto& currencyAmount : currencySplit) { for (const auto& currencyAmount : currencySplit) {
auto amountSplit = GeneralUtils::SplitString(currencyAmount, ':'); auto amountSplit = GeneralUtils::SplitString(currencyAmount, ':');
// Checking for 2 here, not sure what to do when there's more stuff than expected // Checking for 2 here, not sure what to do when there's more stuff than expected
if (amountSplit.size() == 2) { if (amountSplit.size() == 2) {
currencies.insert({ currencies.insert({
std::stoull(amountSplit[0]), std::stoull(amountSplit[0]),
std::stoi(amountSplit[1]) std::stoi(amountSplit[1])
}); });
} }
} }
} }
return currencies; return currencies;
} }

View File

@ -9,75 +9,75 @@
\brief Contains data for the ItemComponent table \brief Contains data for the ItemComponent table
*/ */
//! ItemComponent Struct //! ItemComponent Struct
struct CDItemComponent { struct CDItemComponent {
unsigned int id; //!< The Component ID unsigned int id; //!< The Component ID
std::string equipLocation; //!< The equip location std::string equipLocation; //!< The equip location
unsigned int baseValue; //!< The monetary base value of the item unsigned int baseValue; //!< The monetary base value of the item
bool isKitPiece; //!< Whether or not the item belongs to a kit bool isKitPiece; //!< Whether or not the item belongs to a kit
unsigned int rarity; //!< The rarity of the item unsigned int rarity; //!< The rarity of the item
unsigned int itemType; //!< The item type unsigned int itemType; //!< The item type
int64_t itemInfo; //!< The item info int64_t itemInfo; //!< The item info
bool inLootTable; //!< Whether or not the item is in a loot table bool inLootTable; //!< Whether or not the item is in a loot table
bool inVendor; //!< Whether or not the item is in a vendor inventory bool inVendor; //!< Whether or not the item is in a vendor inventory
bool isUnique; //!< ??? bool isUnique; //!< ???
bool isBOP; //!< ??? bool isBOP; //!< ???
bool isBOE; //!< ??? bool isBOE; //!< ???
unsigned int reqFlagID; //!< User must have completed this flag to get the item unsigned int reqFlagID; //!< User must have completed this flag to get the item
unsigned int reqSpecialtyID; //!< ??? unsigned int reqSpecialtyID; //!< ???
unsigned int reqSpecRank; //!< ??? unsigned int reqSpecRank; //!< ???
unsigned int reqAchievementID; //!< The required achievement must be completed unsigned int reqAchievementID; //!< The required achievement must be completed
unsigned int stackSize; //!< The stack size of the item unsigned int stackSize; //!< The stack size of the item
unsigned int color1; //!< Something to do with item color... unsigned int color1; //!< Something to do with item color...
unsigned int decal; //!< The decal of the item unsigned int decal; //!< The decal of the item
unsigned int offsetGroupID; //!< Something to do with group IDs unsigned int offsetGroupID; //!< Something to do with group IDs
unsigned int buildTypes; //!< Something to do with building unsigned int buildTypes; //!< Something to do with building
std::string reqPrecondition; //!< The required precondition std::string reqPrecondition; //!< The required precondition
unsigned int animationFlag; //!< The Animation Flag unsigned int animationFlag; //!< The Animation Flag
unsigned int equipEffects; //!< The effect played when the item is equipped unsigned int equipEffects; //!< The effect played when the item is equipped
bool readyForQA; //!< ??? bool readyForQA; //!< ???
unsigned int itemRating; //!< ??? unsigned int itemRating; //!< ???
bool isTwoHanded; //!< Whether or not the item is double handed bool isTwoHanded; //!< Whether or not the item is double handed
unsigned int minNumRequired; //!< Maybe the minimum number required for a mission, or to own this object? unsigned int minNumRequired; //!< Maybe the minimum number required for a mission, or to own this object?
unsigned int delResIndex; //!< ??? unsigned int delResIndex; //!< ???
unsigned int currencyLOT; //!< ??? unsigned int currencyLOT; //!< ???
unsigned int altCurrencyCost; //!< ??? unsigned int altCurrencyCost; //!< ???
std::string subItems; //!< A comma seperate string of sub items (maybe for multi-itemed things like faction test gear set) std::string subItems; //!< A comma seperate string of sub items (maybe for multi-itemed things like faction test gear set)
UNUSED(std::string audioEventUse); //!< ??? UNUSED(std::string audioEventUse); //!< ???
bool noEquipAnimation; //!< Whether or not there is an equip animation bool noEquipAnimation; //!< Whether or not there is an equip animation
unsigned int commendationLOT; //!< The commendation LOT unsigned int commendationLOT; //!< The commendation LOT
unsigned int commendationCost; //!< The commendation cost unsigned int commendationCost; //!< The commendation cost
UNUSED(std::string audioEquipMetaEventSet); //!< ??? UNUSED(std::string audioEquipMetaEventSet); //!< ???
std::string currencyCosts; //!< Used for crafting std::string currencyCosts; //!< Used for crafting
UNUSED(std::string ingredientInfo); //!< Unused UNUSED(std::string ingredientInfo); //!< Unused
unsigned int locStatus; //!< ??? unsigned int locStatus; //!< ???
unsigned int forgeType; //!< Forge Type unsigned int forgeType; //!< Forge Type
float SellMultiplier; //!< Something to do with early vendors perhaps (but replaced) float SellMultiplier; //!< Something to do with early vendors perhaps (but replaced)
}; };
//! ItemComponent table //! ItemComponent table
class CDItemComponentTable : public CDTable { class CDItemComponentTable : public CDTable {
private: private:
std::map<unsigned int, CDItemComponent> entries; std::map<unsigned int, CDItemComponent> entries;
public: public:
//! Constructor //! Constructor
CDItemComponentTable(void); CDItemComponentTable(void);
//! Destructor //! Destructor
~CDItemComponentTable(void); ~CDItemComponentTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
static std::map<LOT, uint32_t> ParseCraftingCurrencies(const CDItemComponent& itemComponent);
static std::map<LOT, uint32_t> ParseCraftingCurrencies(const CDItemComponent& itemComponent);
//! Gets an entry by ID //! Gets an entry by ID
const CDItemComponent& GetItemComponentByID(unsigned int skillID); const CDItemComponent& GetItemComponentByID(unsigned int skillID);
static CDItemComponent Default; static CDItemComponent Default;
}; };

View File

@ -2,63 +2,62 @@
//! Constructor //! Constructor
CDItemSetSkillsTable::CDItemSetSkillsTable(void) { CDItemSetSkillsTable::CDItemSetSkillsTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ItemSetSkills"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ItemSetSkills");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ItemSetSkills"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ItemSetSkills");
while (!tableData.eof()) { while (!tableData.eof()) {
CDItemSetSkills entry; CDItemSetSkills entry;
entry.SkillSetID = tableData.getIntField(0, -1); entry.SkillSetID = tableData.getIntField(0, -1);
entry.SkillID = tableData.getIntField(1, -1); entry.SkillID = tableData.getIntField(1, -1);
entry.SkillCastType = tableData.getIntField(2, -1); entry.SkillCastType = tableData.getIntField(2, -1);
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDItemSetSkillsTable::~CDItemSetSkillsTable(void) { } CDItemSetSkillsTable::~CDItemSetSkillsTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDItemSetSkillsTable::GetName(void) const { std::string CDItemSetSkillsTable::GetName(void) const {
return "ItemSetSkills"; return "ItemSetSkills";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDItemSetSkills> CDItemSetSkillsTable::Query(std::function<bool(CDItemSetSkills)> predicate) { std::vector<CDItemSetSkills> CDItemSetSkillsTable::Query(std::function<bool(CDItemSetSkills)> predicate) {
std::vector<CDItemSetSkills> data = cpplinq::from(this->entries) std::vector<CDItemSetSkills> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDItemSetSkills> CDItemSetSkillsTable::GetEntries(void) const { std::vector<CDItemSetSkills> CDItemSetSkillsTable::GetEntries(void) const {
return this->entries; return this->entries;
} }
std::vector<CDItemSetSkills> CDItemSetSkillsTable::GetBySkillID(unsigned int SkillSetID) std::vector<CDItemSetSkills> CDItemSetSkillsTable::GetBySkillID(unsigned int SkillSetID) {
{
std::vector<CDItemSetSkills> toReturn; std::vector<CDItemSetSkills> toReturn;
for (CDItemSetSkills entry : this->entries) { for (CDItemSetSkills entry : this->entries) {
if (entry.SkillSetID == SkillSetID) toReturn.push_back(entry); if (entry.SkillSetID == SkillSetID) toReturn.push_back(entry);
if (entry.SkillSetID > SkillSetID) return toReturn; //stop seeking in the db if it's not needed. if (entry.SkillSetID > SkillSetID) return toReturn; //stop seeking in the db if it's not needed.

View File

@ -8,45 +8,45 @@
\brief Contains data for the ItemSetSkills table \brief Contains data for the ItemSetSkills table
*/ */
//! ZoneTable Struct //! ZoneTable Struct
struct CDItemSetSkills { struct CDItemSetSkills {
unsigned int SkillSetID; //!< The skill set ID unsigned int SkillSetID; //!< The skill set ID
unsigned int SkillID; //!< The skill ID unsigned int SkillID; //!< The skill ID
unsigned int SkillCastType; //!< The skill cast type unsigned int SkillCastType; //!< The skill cast type
}; };
//! ItemSets table //! ItemSets table
class CDItemSetSkillsTable : public CDTable { class CDItemSetSkillsTable : public CDTable {
private: private:
std::vector<CDItemSetSkills> entries; std::vector<CDItemSetSkills> entries;
public: public:
//! Constructor //! Constructor
CDItemSetSkillsTable(void); CDItemSetSkillsTable(void);
//! Destructor //! Destructor
~CDItemSetSkillsTable(void); ~CDItemSetSkillsTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDItemSetSkills> Query(std::function<bool(CDItemSetSkills)> predicate); std::vector<CDItemSetSkills> Query(std::function<bool(CDItemSetSkills)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDItemSetSkills> GetEntries(void) const; std::vector<CDItemSetSkills> GetEntries(void) const;
std::vector<CDItemSetSkills> GetBySkillID(unsigned int SkillSetID); std::vector<CDItemSetSkills> GetBySkillID(unsigned int SkillSetID);
}; };

View File

@ -2,67 +2,67 @@
//! Constructor //! Constructor
CDItemSetsTable::CDItemSetsTable(void) { CDItemSetsTable::CDItemSetsTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ItemSets"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ItemSets");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ItemSets"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ItemSets");
while (!tableData.eof()) { while (!tableData.eof()) {
CDItemSets entry; CDItemSets entry;
entry.setID = tableData.getIntField(0, -1); entry.setID = tableData.getIntField(0, -1);
entry.locStatus = tableData.getIntField(1, -1); entry.locStatus = tableData.getIntField(1, -1);
entry.itemIDs = tableData.getStringField(2, ""); entry.itemIDs = tableData.getStringField(2, "");
entry.kitType = tableData.getIntField(3, -1); entry.kitType = tableData.getIntField(3, -1);
entry.kitRank = tableData.getIntField(4, -1); entry.kitRank = tableData.getIntField(4, -1);
entry.kitImage = tableData.getIntField(5, -1); entry.kitImage = tableData.getIntField(5, -1);
entry.skillSetWith2 = tableData.getIntField(6, -1); entry.skillSetWith2 = tableData.getIntField(6, -1);
entry.skillSetWith3 = tableData.getIntField(7, -1); entry.skillSetWith3 = tableData.getIntField(7, -1);
entry.skillSetWith4 = tableData.getIntField(8, -1); entry.skillSetWith4 = tableData.getIntField(8, -1);
entry.skillSetWith5 = tableData.getIntField(9, -1); entry.skillSetWith5 = tableData.getIntField(9, -1);
entry.skillSetWith6 = tableData.getIntField(10, -1); entry.skillSetWith6 = tableData.getIntField(10, -1);
entry.localize = tableData.getIntField(11, -1) == 1 ? true : false; entry.localize = tableData.getIntField(11, -1) == 1 ? true : false;
entry.gate_version = tableData.getStringField(12, ""); entry.gate_version = tableData.getStringField(12, "");
entry.kitID = tableData.getIntField(13, -1); entry.kitID = tableData.getIntField(13, -1);
entry.priority = tableData.getFloatField(14, -1.0f); entry.priority = tableData.getFloatField(14, -1.0f);
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDItemSetsTable::~CDItemSetsTable(void) { } CDItemSetsTable::~CDItemSetsTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDItemSetsTable::GetName(void) const { std::string CDItemSetsTable::GetName(void) const {
return "ItemSets"; return "ItemSets";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDItemSets> CDItemSetsTable::Query(std::function<bool(CDItemSets)> predicate) { std::vector<CDItemSets> CDItemSetsTable::Query(std::function<bool(CDItemSets)> predicate) {
std::vector<CDItemSets> data = cpplinq::from(this->entries) std::vector<CDItemSets> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDItemSets> CDItemSetsTable::GetEntries(void) const { std::vector<CDItemSets> CDItemSetsTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,55 +8,55 @@
\brief Contains data for the ItemSets table \brief Contains data for the ItemSets table
*/ */
//! ZoneTable Struct //! ZoneTable Struct
struct CDItemSets { struct CDItemSets {
unsigned int setID; //!< The item set ID unsigned int setID; //!< The item set ID
unsigned int locStatus; //!< The loc status unsigned int locStatus; //!< The loc status
std::string itemIDs; //!< THe item IDs std::string itemIDs; //!< THe item IDs
unsigned int kitType; //!< The item kit type unsigned int kitType; //!< The item kit type
unsigned int kitRank; //!< The item kit rank unsigned int kitRank; //!< The item kit rank
unsigned int kitImage; //!< The item kit image unsigned int kitImage; //!< The item kit image
unsigned int skillSetWith2; //!< The skill set with 2 unsigned int skillSetWith2; //!< The skill set with 2
unsigned int skillSetWith3; //!< The skill set with 3 unsigned int skillSetWith3; //!< The skill set with 3
unsigned int skillSetWith4; //!< The skill set with 4 unsigned int skillSetWith4; //!< The skill set with 4
unsigned int skillSetWith5; //!< The skill set with 5 unsigned int skillSetWith5; //!< The skill set with 5
unsigned int skillSetWith6; //!< The skill set with 6 unsigned int skillSetWith6; //!< The skill set with 6
bool localize; //!< Whether or localize bool localize; //!< Whether or localize
std::string gate_version; //!< The gate version std::string gate_version; //!< The gate version
unsigned int kitID; //!< The kit ID unsigned int kitID; //!< The kit ID
float priority; //!< The priority float priority; //!< The priority
}; };
//! ItemSets table //! ItemSets table
class CDItemSetsTable : public CDTable { class CDItemSetsTable : public CDTable {
private: private:
std::vector<CDItemSets> entries; std::vector<CDItemSets> entries;
public: public:
//! Constructor //! Constructor
CDItemSetsTable(void); CDItemSetsTable(void);
//! Destructor //! Destructor
~CDItemSetsTable(void); ~CDItemSetsTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDItemSets> Query(std::function<bool(CDItemSets)> predicate); std::vector<CDItemSets> Query(std::function<bool(CDItemSets)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDItemSets> GetEntries(void) const; std::vector<CDItemSets> GetEntries(void) const;
}; };

View File

@ -2,55 +2,55 @@
//! Constructor //! Constructor
CDLevelProgressionLookupTable::CDLevelProgressionLookupTable(void) { CDLevelProgressionLookupTable::CDLevelProgressionLookupTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM LevelProgressionLookup"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM LevelProgressionLookup");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM LevelProgressionLookup"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM LevelProgressionLookup");
while (!tableData.eof()) { while (!tableData.eof()) {
CDLevelProgressionLookup entry; CDLevelProgressionLookup entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.requiredUScore = tableData.getIntField(1, -1); entry.requiredUScore = tableData.getIntField(1, -1);
entry.BehaviorEffect = tableData.getStringField(2, ""); entry.BehaviorEffect = tableData.getStringField(2, "");
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDLevelProgressionLookupTable::~CDLevelProgressionLookupTable(void) { } CDLevelProgressionLookupTable::~CDLevelProgressionLookupTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDLevelProgressionLookupTable::GetName(void) const { std::string CDLevelProgressionLookupTable::GetName(void) const {
return "LevelProgressionLookup"; return "LevelProgressionLookup";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDLevelProgressionLookup> CDLevelProgressionLookupTable::Query(std::function<bool(CDLevelProgressionLookup)> predicate) { std::vector<CDLevelProgressionLookup> CDLevelProgressionLookupTable::Query(std::function<bool(CDLevelProgressionLookup)> predicate) {
std::vector<CDLevelProgressionLookup> data = cpplinq::from(this->entries) std::vector<CDLevelProgressionLookup> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDLevelProgressionLookup> CDLevelProgressionLookupTable::GetEntries(void) const { std::vector<CDLevelProgressionLookup> CDLevelProgressionLookupTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,42 +8,42 @@
\brief Contains data for the LevelProgressionLookup table \brief Contains data for the LevelProgressionLookup table
*/ */
//! LevelProgressionLookup Entry Struct //! LevelProgressionLookup Entry Struct
struct CDLevelProgressionLookup { struct CDLevelProgressionLookup {
unsigned int id; //!< The Level ID unsigned int id; //!< The Level ID
unsigned int requiredUScore; //!< The required LEGO Score unsigned int requiredUScore; //!< The required LEGO Score
std::string BehaviorEffect; //!< The behavior effect attached to this std::string BehaviorEffect; //!< The behavior effect attached to this
}; };
//! LevelProgressionLookup table //! LevelProgressionLookup table
class CDLevelProgressionLookupTable : public CDTable { class CDLevelProgressionLookupTable : public CDTable {
private: private:
std::vector<CDLevelProgressionLookup> entries; std::vector<CDLevelProgressionLookup> entries;
public: public:
//! Constructor //! Constructor
CDLevelProgressionLookupTable(void); CDLevelProgressionLookupTable(void);
//! Destructor //! Destructor
~CDLevelProgressionLookupTable(void); ~CDLevelProgressionLookupTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDLevelProgressionLookup> Query(std::function<bool(CDLevelProgressionLookup)> predicate); std::vector<CDLevelProgressionLookup> Query(std::function<bool(CDLevelProgressionLookup)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDLevelProgressionLookup> GetEntries(void) const; std::vector<CDLevelProgressionLookup> GetEntries(void) const;
}; };

View File

@ -2,61 +2,61 @@
//! Constructor //! Constructor
CDLootMatrixTable::CDLootMatrixTable(void) { CDLootMatrixTable::CDLootMatrixTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM LootMatrix"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM LootMatrix");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM LootMatrix"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM LootMatrix");
while (!tableData.eof()) { while (!tableData.eof()) {
CDLootMatrix entry; CDLootMatrix entry;
entry.LootMatrixIndex = tableData.getIntField(0, -1); entry.LootMatrixIndex = tableData.getIntField(0, -1);
entry.LootTableIndex = tableData.getIntField(1, -1); entry.LootTableIndex = tableData.getIntField(1, -1);
entry.RarityTableIndex = tableData.getIntField(2, -1); entry.RarityTableIndex = tableData.getIntField(2, -1);
entry.percent = tableData.getFloatField(3, -1.0f); entry.percent = tableData.getFloatField(3, -1.0f);
entry.minToDrop = tableData.getIntField(4, -1); entry.minToDrop = tableData.getIntField(4, -1);
entry.maxToDrop = tableData.getIntField(5, -1); entry.maxToDrop = tableData.getIntField(5, -1);
entry.id = tableData.getIntField(6, -1); entry.id = tableData.getIntField(6, -1);
entry.flagID = tableData.getIntField(7, -1); entry.flagID = tableData.getIntField(7, -1);
UNUSED(entry.gate_version = tableData.getStringField(8, "")); UNUSED(entry.gate_version = tableData.getStringField(8, ""));
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDLootMatrixTable::~CDLootMatrixTable(void) { } CDLootMatrixTable::~CDLootMatrixTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDLootMatrixTable::GetName(void) const { std::string CDLootMatrixTable::GetName(void) const {
return "LootMatrix"; return "LootMatrix";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDLootMatrix> CDLootMatrixTable::Query(std::function<bool(CDLootMatrix)> predicate) { std::vector<CDLootMatrix> CDLootMatrixTable::Query(std::function<bool(CDLootMatrix)> predicate) {
std::vector<CDLootMatrix> data = cpplinq::from(this->entries) std::vector<CDLootMatrix> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
const std::vector<CDLootMatrix>& CDLootMatrixTable::GetEntries(void) const { const std::vector<CDLootMatrix>& CDLootMatrixTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,49 +8,49 @@
\brief Contains data for the ObjectSkills table \brief Contains data for the ObjectSkills table
*/ */
//! LootMatrix Struct //! LootMatrix Struct
struct CDLootMatrix { struct CDLootMatrix {
unsigned int LootMatrixIndex; //!< The Loot Matrix Index unsigned int LootMatrixIndex; //!< The Loot Matrix Index
unsigned int LootTableIndex; //!< The Loot Table Index unsigned int LootTableIndex; //!< The Loot Table Index
unsigned int RarityTableIndex; //!< The Rarity Table Index unsigned int RarityTableIndex; //!< The Rarity Table Index
float percent; //!< The percent that this matrix is used? float percent; //!< The percent that this matrix is used?
unsigned int minToDrop; //!< The minimum amount of loot from this matrix to drop unsigned int minToDrop; //!< The minimum amount of loot from this matrix to drop
unsigned int maxToDrop; //!< The maximum amount of loot from this matrix to drop unsigned int maxToDrop; //!< The maximum amount of loot from this matrix to drop
unsigned int id; //!< The ID of the Loot Matrix unsigned int id; //!< The ID of the Loot Matrix
unsigned int flagID; //!< ??? unsigned int flagID; //!< ???
UNUSED(std::string gate_version); //!< The Gate Version UNUSED(std::string gate_version); //!< The Gate Version
}; };
//! MissionNPCComponent table //! MissionNPCComponent table
class CDLootMatrixTable : public CDTable { class CDLootMatrixTable : public CDTable {
private: private:
std::vector<CDLootMatrix> entries; std::vector<CDLootMatrix> entries;
public: public:
//! Constructor //! Constructor
CDLootMatrixTable(void); CDLootMatrixTable(void);
//! Destructor //! Destructor
~CDLootMatrixTable(void); ~CDLootMatrixTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDLootMatrix> Query(std::function<bool(CDLootMatrix)> predicate); std::vector<CDLootMatrix> Query(std::function<bool(CDLootMatrix)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
const std::vector<CDLootMatrix>& GetEntries(void) const; const std::vector<CDLootMatrix>& GetEntries(void) const;
}; };

View File

@ -2,58 +2,58 @@
//! Constructor //! Constructor
CDLootTableTable::CDLootTableTable(void) { CDLootTableTable::CDLootTableTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM LootTable"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM LootTable");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM LootTable"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM LootTable");
while (!tableData.eof()) { while (!tableData.eof()) {
CDLootTable entry; CDLootTable entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.itemid = tableData.getIntField(0, -1); entry.itemid = tableData.getIntField(0, -1);
entry.LootTableIndex = tableData.getIntField(1, -1); entry.LootTableIndex = tableData.getIntField(1, -1);
entry.id = tableData.getIntField(2, -1); entry.id = tableData.getIntField(2, -1);
entry.MissionDrop = tableData.getIntField(3, -1) == 1 ? true : false; entry.MissionDrop = tableData.getIntField(3, -1) == 1 ? true : false;
entry.sortPriority = tableData.getIntField(4, -1); entry.sortPriority = tableData.getIntField(4, -1);
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDLootTableTable::~CDLootTableTable(void) { } CDLootTableTable::~CDLootTableTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDLootTableTable::GetName(void) const { std::string CDLootTableTable::GetName(void) const {
return "LootTable"; return "LootTable";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDLootTable> CDLootTableTable::Query(std::function<bool(CDLootTable)> predicate) { std::vector<CDLootTable> CDLootTableTable::Query(std::function<bool(CDLootTable)> predicate) {
std::vector<CDLootTable> data = cpplinq::from(this->entries) std::vector<CDLootTable> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
const std::vector<CDLootTable>& CDLootTableTable::GetEntries(void) const { const std::vector<CDLootTable>& CDLootTableTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,45 +8,45 @@
\brief Contains data for the LootTable table \brief Contains data for the LootTable table
*/ */
//! LootTable Struct //! LootTable Struct
struct CDLootTable { struct CDLootTable {
unsigned int itemid; //!< The LOT of the item unsigned int itemid; //!< The LOT of the item
unsigned int LootTableIndex; //!< The Loot Table Index unsigned int LootTableIndex; //!< The Loot Table Index
unsigned int id; //!< The ID unsigned int id; //!< The ID
bool MissionDrop; //!< Whether or not this loot table is a mission drop bool MissionDrop; //!< Whether or not this loot table is a mission drop
unsigned int sortPriority; //!< The sorting priority unsigned int sortPriority; //!< The sorting priority
}; };
//! LootTable table //! LootTable table
class CDLootTableTable : public CDTable { class CDLootTableTable : public CDTable {
private: private:
std::vector<CDLootTable> entries; std::vector<CDLootTable> entries;
public: public:
//! Constructor //! Constructor
CDLootTableTable(void); CDLootTableTable(void);
//! Destructor //! Destructor
~CDLootTableTable(void); ~CDLootTableTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDLootTable> Query(std::function<bool(CDLootTable)> predicate); std::vector<CDLootTable> Query(std::function<bool(CDLootTable)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
const std::vector<CDLootTable>& GetEntries(void) const; const std::vector<CDLootTable>& GetEntries(void) const;
}; };

View File

@ -3,59 +3,59 @@
//! Constructor //! Constructor
CDMissionEmailTable::CDMissionEmailTable(void) { CDMissionEmailTable::CDMissionEmailTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM MissionEmail"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM MissionEmail");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow();
}
tableSize.nextRow();
}
tableSize.finalize(); tableSize.finalize();
// Reserve the size
this->entries.reserve(size);
// Now get the data // Reserve the size
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionEmail"); this->entries.reserve(size);
while (!tableData.eof()) {
CDMissionEmail entry;
entry.ID = tableData.getIntField(0, -1);
entry.messageType = tableData.getIntField(1, -1);
entry.notificationGroup = tableData.getIntField(2, -1);
entry.missionID = tableData.getIntField(3, -1);
entry.attachmentLOT = tableData.getIntField(4, 0);
entry.localize = (bool)tableData.getIntField(5, -1);
entry.locStatus = tableData.getIntField(6, -1);
entry.gate_version = tableData.getStringField(7, "");
this->entries.push_back(entry); // Now get the data
tableData.nextRow(); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionEmail");
} while (!tableData.eof()) {
CDMissionEmail entry;
entry.ID = tableData.getIntField(0, -1);
entry.messageType = tableData.getIntField(1, -1);
entry.notificationGroup = tableData.getIntField(2, -1);
entry.missionID = tableData.getIntField(3, -1);
entry.attachmentLOT = tableData.getIntField(4, 0);
entry.localize = (bool)tableData.getIntField(5, -1);
entry.locStatus = tableData.getIntField(6, -1);
entry.gate_version = tableData.getStringField(7, "");
this->entries.push_back(entry);
tableData.nextRow();
}
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDMissionEmailTable::~CDMissionEmailTable(void) { } CDMissionEmailTable::~CDMissionEmailTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDMissionEmailTable::GetName(void) const { std::string CDMissionEmailTable::GetName(void) const {
return "MissionEmail"; return "MissionEmail";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDMissionEmail> CDMissionEmailTable::Query(std::function<bool(CDMissionEmail)> predicate) { std::vector<CDMissionEmail> CDMissionEmailTable::Query(std::function<bool(CDMissionEmail)> predicate) {
std::vector<CDMissionEmail> data = cpplinq::from(this->entries) std::vector<CDMissionEmail> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDMissionEmail> CDMissionEmailTable::GetEntries(void) const { std::vector<CDMissionEmail> CDMissionEmailTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -10,46 +10,46 @@
//! MissionEmail Entry Struct //! MissionEmail Entry Struct
struct CDMissionEmail { struct CDMissionEmail {
unsigned int ID; unsigned int ID;
unsigned int messageType; unsigned int messageType;
unsigned int notificationGroup; unsigned int notificationGroup;
unsigned int missionID; unsigned int missionID;
unsigned int attachmentLOT; unsigned int attachmentLOT;
bool localize; bool localize;
unsigned int locStatus; unsigned int locStatus;
std::string gate_version; std::string gate_version;
}; };
//! MissionEmail table //! MissionEmail table
class CDMissionEmailTable : public CDTable { class CDMissionEmailTable : public CDTable {
private: private:
std::vector<CDMissionEmail> entries; std::vector<CDMissionEmail> entries;
public: public:
//! Constructor //! Constructor
CDMissionEmailTable(void); CDMissionEmailTable(void);
//! Destructor //! Destructor
~CDMissionEmailTable(void); ~CDMissionEmailTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDMissionEmail> Query(std::function<bool(CDMissionEmail)> predicate); std::vector<CDMissionEmail> Query(std::function<bool(CDMissionEmail)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDMissionEmail> GetEntries(void) const; std::vector<CDMissionEmail> GetEntries(void) const;
}; };

View File

@ -2,57 +2,57 @@
//! Constructor //! Constructor
CDMissionNPCComponentTable::CDMissionNPCComponentTable(void) { CDMissionNPCComponentTable::CDMissionNPCComponentTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM MissionNPCComponent"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM MissionNPCComponent");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionNPCComponent"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionNPCComponent");
while (!tableData.eof()) { while (!tableData.eof()) {
CDMissionNPCComponent entry; CDMissionNPCComponent entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.missionID = tableData.getIntField(1, -1); entry.missionID = tableData.getIntField(1, -1);
entry.offersMission = tableData.getIntField(2, -1) == 1 ? true : false; entry.offersMission = tableData.getIntField(2, -1) == 1 ? true : false;
entry.acceptsMission = tableData.getIntField(3, -1) == 1 ? true : false; entry.acceptsMission = tableData.getIntField(3, -1) == 1 ? true : false;
entry.gate_version = tableData.getStringField(4, ""); entry.gate_version = tableData.getStringField(4, "");
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDMissionNPCComponentTable::~CDMissionNPCComponentTable(void) { } CDMissionNPCComponentTable::~CDMissionNPCComponentTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDMissionNPCComponentTable::GetName(void) const { std::string CDMissionNPCComponentTable::GetName(void) const {
return "MissionNPCComponent"; return "MissionNPCComponent";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDMissionNPCComponent> CDMissionNPCComponentTable::Query(std::function<bool(CDMissionNPCComponent)> predicate) { std::vector<CDMissionNPCComponent> CDMissionNPCComponentTable::Query(std::function<bool(CDMissionNPCComponent)> predicate) {
std::vector<CDMissionNPCComponent> data = cpplinq::from(this->entries) std::vector<CDMissionNPCComponent> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDMissionNPCComponent> CDMissionNPCComponentTable::GetEntries(void) const { std::vector<CDMissionNPCComponent> CDMissionNPCComponentTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,45 +8,45 @@
\brief Contains data for the ObjectSkills table \brief Contains data for the ObjectSkills table
*/ */
//! MissionNPCComponent Struct //! MissionNPCComponent Struct
struct CDMissionNPCComponent { struct CDMissionNPCComponent {
unsigned int id; //!< The ID unsigned int id; //!< The ID
unsigned int missionID; //!< The Mission ID unsigned int missionID; //!< The Mission ID
bool offersMission; //!< Whether or not this NPC offers a mission bool offersMission; //!< Whether or not this NPC offers a mission
bool acceptsMission; //!< Whether or not this NPC accepts a mission bool acceptsMission; //!< Whether or not this NPC accepts a mission
std::string gate_version; //!< The gate version std::string gate_version; //!< The gate version
}; };
//! MissionNPCComponent table //! MissionNPCComponent table
class CDMissionNPCComponentTable : public CDTable { class CDMissionNPCComponentTable : public CDTable {
private: private:
std::vector<CDMissionNPCComponent> entries; std::vector<CDMissionNPCComponent> entries;
public: public:
//! Constructor //! Constructor
CDMissionNPCComponentTable(void); CDMissionNPCComponentTable(void);
//! Destructor //! Destructor
~CDMissionNPCComponentTable(void); ~CDMissionNPCComponentTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDMissionNPCComponent> Query(std::function<bool(CDMissionNPCComponent)> predicate); std::vector<CDMissionNPCComponent> Query(std::function<bool(CDMissionNPCComponent)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDMissionNPCComponent> GetEntries(void) const; std::vector<CDMissionNPCComponent> GetEntries(void) const;
}; };

View File

@ -2,82 +2,79 @@
//! Constructor //! Constructor
CDMissionTasksTable::CDMissionTasksTable(void) { CDMissionTasksTable::CDMissionTasksTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM MissionTasks"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM MissionTasks");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionTasks"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionTasks");
while (!tableData.eof()) { while (!tableData.eof()) {
CDMissionTasks entry; CDMissionTasks entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
UNUSED(entry.locStatus = tableData.getIntField(1, -1)); UNUSED(entry.locStatus = tableData.getIntField(1, -1));
entry.taskType = tableData.getIntField(2, -1); entry.taskType = tableData.getIntField(2, -1);
entry.target = tableData.getIntField(3, -1); entry.target = tableData.getIntField(3, -1);
entry.targetGroup = tableData.getStringField(4, ""); entry.targetGroup = tableData.getStringField(4, "");
entry.targetValue = tableData.getIntField(5, -1); entry.targetValue = tableData.getIntField(5, -1);
entry.taskParam1 = tableData.getStringField(6, ""); entry.taskParam1 = tableData.getStringField(6, "");
UNUSED(entry.largeTaskIcon = tableData.getStringField(7, "")); UNUSED(entry.largeTaskIcon = tableData.getStringField(7, ""));
UNUSED(entry.IconID = tableData.getIntField(8, -1)); UNUSED(entry.IconID = tableData.getIntField(8, -1));
entry.uid = tableData.getIntField(9, -1); entry.uid = tableData.getIntField(9, -1);
UNUSED(entry.largeTaskIconID = tableData.getIntField(10, -1)); UNUSED(entry.largeTaskIconID = tableData.getIntField(10, -1));
UNUSED(entry.localize = tableData.getIntField(11, -1) == 1 ? true : false); UNUSED(entry.localize = tableData.getIntField(11, -1) == 1 ? true : false);
UNUSED(entry.gate_version = tableData.getStringField(12, "")); UNUSED(entry.gate_version = tableData.getStringField(12, ""));
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDMissionTasksTable::~CDMissionTasksTable(void) { } CDMissionTasksTable::~CDMissionTasksTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDMissionTasksTable::GetName(void) const { std::string CDMissionTasksTable::GetName(void) const {
return "MissionTasks"; return "MissionTasks";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDMissionTasks> CDMissionTasksTable::Query(std::function<bool(CDMissionTasks)> predicate) { std::vector<CDMissionTasks> CDMissionTasksTable::Query(std::function<bool(CDMissionTasks)> predicate) {
std::vector<CDMissionTasks> data = cpplinq::from(this->entries) std::vector<CDMissionTasks> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
std::vector<CDMissionTasks*> CDMissionTasksTable::GetByMissionID(uint32_t missionID) std::vector<CDMissionTasks*> CDMissionTasksTable::GetByMissionID(uint32_t missionID) {
{ std::vector<CDMissionTasks*> tasks;
std::vector<CDMissionTasks*> tasks;
for (auto& entry : this->entries) for (auto& entry : this->entries) {
{ if (entry.id == missionID) {
if (entry.id == missionID) CDMissionTasks* task = const_cast<CDMissionTasks*>(&entry);
{
CDMissionTasks* task = const_cast<CDMissionTasks*>(&entry);
tasks.push_back(task); tasks.push_back(task);
} }
} }
return tasks; return tasks;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
const std::vector<CDMissionTasks>& CDMissionTasksTable::GetEntries(void) const { const std::vector<CDMissionTasks>& CDMissionTasksTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,54 +8,54 @@
\brief Contains data for the MissionTasks table \brief Contains data for the MissionTasks table
*/ */
//! ObjectSkills Struct //! ObjectSkills Struct
struct CDMissionTasks { struct CDMissionTasks {
unsigned int id; //!< The Mission ID that the task belongs to unsigned int id; //!< The Mission ID that the task belongs to
UNUSED(unsigned int locStatus); //!< ??? UNUSED(unsigned int locStatus); //!< ???
unsigned int taskType; //!< The task type unsigned int taskType; //!< The task type
unsigned int target; //!< The mission target unsigned int target; //!< The mission target
std::string targetGroup; //!< The mission target group std::string targetGroup; //!< The mission target group
int targetValue; //!< The target value int targetValue; //!< The target value
std::string taskParam1; //!< The task param 1 std::string taskParam1; //!< The task param 1
UNUSED(std::string largeTaskIcon); //!< ??? UNUSED(std::string largeTaskIcon); //!< ???
UNUSED(unsigned int IconID); //!< ??? UNUSED(unsigned int IconID); //!< ???
unsigned int uid; //!< ??? unsigned int uid; //!< ???
UNUSED(unsigned int largeTaskIconID); //!< ??? UNUSED(unsigned int largeTaskIconID); //!< ???
UNUSED(bool localize); //!< Whether or not the task should be localized UNUSED(bool localize); //!< Whether or not the task should be localized
UNUSED(std::string gate_version); //!< ??? UNUSED(std::string gate_version); //!< ???
}; };
//! ObjectSkills table //! ObjectSkills table
class CDMissionTasksTable : public CDTable { class CDMissionTasksTable : public CDTable {
private: private:
std::vector<CDMissionTasks> entries; std::vector<CDMissionTasks> entries;
public:
//! Constructor
CDMissionTasksTable(void);
//! Destructor
~CDMissionTasksTable(void);
//! Returns the table's name
/*!
\return The table name
*/
std::string GetName(void) const override;
//! Queries the table with a custom "where" clause
/*!
\param predicate The predicate
*/
std::vector<CDMissionTasks> Query(std::function<bool(CDMissionTasks)> predicate);
std::vector<CDMissionTasks*> GetByMissionID(uint32_t missionID); public:
//! Gets all the entries in the table //! Constructor
/*! CDMissionTasksTable(void);
\return The entries
*/ //! Destructor
const std::vector<CDMissionTasks>& GetEntries(void) const; ~CDMissionTasksTable(void);
//! Returns the table's name
/*!
\return The table name
*/
std::string GetName(void) const override;
//! Queries the table with a custom "where" clause
/*!
\param predicate The predicate
*/
std::vector<CDMissionTasks> Query(std::function<bool(CDMissionTasks)> predicate);
std::vector<CDMissionTasks*> GetByMissionID(uint32_t missionID);
//! Gets all the entries in the table
/*!
\return The entries
*/
const std::vector<CDMissionTasks>& GetEntries(void) const;
}; };

View File

@ -4,136 +4,130 @@ CDMissions CDMissionsTable::Default = {};
//! Constructor //! Constructor
CDMissionsTable::CDMissionsTable(void) { CDMissionsTable::CDMissionsTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM Missions"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM Missions");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Missions"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Missions");
while (!tableData.eof()) { while (!tableData.eof()) {
CDMissions entry; CDMissions entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.defined_type = tableData.getStringField(1, ""); entry.defined_type = tableData.getStringField(1, "");
entry.defined_subtype = tableData.getStringField(2, ""); entry.defined_subtype = tableData.getStringField(2, "");
entry.UISortOrder = tableData.getIntField(3, -1); entry.UISortOrder = tableData.getIntField(3, -1);
entry.offer_objectID = tableData.getIntField(4, -1); entry.offer_objectID = tableData.getIntField(4, -1);
entry.target_objectID = tableData.getIntField(5, -1); entry.target_objectID = tableData.getIntField(5, -1);
entry.reward_currency = tableData.getInt64Field(6, -1); entry.reward_currency = tableData.getInt64Field(6, -1);
entry.LegoScore = tableData.getIntField(7, -1); entry.LegoScore = tableData.getIntField(7, -1);
entry.reward_reputation = tableData.getIntField(8, -1); entry.reward_reputation = tableData.getIntField(8, -1);
entry.isChoiceReward = tableData.getIntField(9, -1) == 1 ? true : false; entry.isChoiceReward = tableData.getIntField(9, -1) == 1 ? true : false;
entry.reward_item1 = tableData.getIntField(10, 0); entry.reward_item1 = tableData.getIntField(10, 0);
entry.reward_item1_count = tableData.getIntField(11, 0); entry.reward_item1_count = tableData.getIntField(11, 0);
entry.reward_item2 = tableData.getIntField(12, 0); entry.reward_item2 = tableData.getIntField(12, 0);
entry.reward_item2_count = tableData.getIntField(13, 0); entry.reward_item2_count = tableData.getIntField(13, 0);
entry.reward_item3 = tableData.getIntField(14, 0); entry.reward_item3 = tableData.getIntField(14, 0);
entry.reward_item3_count = tableData.getIntField(15, 0); entry.reward_item3_count = tableData.getIntField(15, 0);
entry.reward_item4 = tableData.getIntField(16, 0); entry.reward_item4 = tableData.getIntField(16, 0);
entry.reward_item4_count = tableData.getIntField(17, 0); entry.reward_item4_count = tableData.getIntField(17, 0);
entry.reward_emote = tableData.getIntField(18, -1); entry.reward_emote = tableData.getIntField(18, -1);
entry.reward_emote2 = tableData.getIntField(19, -1); entry.reward_emote2 = tableData.getIntField(19, -1);
entry.reward_emote3 = tableData.getIntField(20, -1); entry.reward_emote3 = tableData.getIntField(20, -1);
entry.reward_emote4 = tableData.getIntField(21, -1); entry.reward_emote4 = tableData.getIntField(21, -1);
entry.reward_maximagination = tableData.getIntField(22, -1); entry.reward_maximagination = tableData.getIntField(22, -1);
entry.reward_maxhealth = tableData.getIntField(23, -1); entry.reward_maxhealth = tableData.getIntField(23, -1);
entry.reward_maxinventory = tableData.getIntField(24, -1); entry.reward_maxinventory = tableData.getIntField(24, -1);
entry.reward_maxmodel = tableData.getIntField(25, -1); entry.reward_maxmodel = tableData.getIntField(25, -1);
entry.reward_maxwidget = tableData.getIntField(26, -1); entry.reward_maxwidget = tableData.getIntField(26, -1);
entry.reward_maxwallet = tableData.getIntField(27, -1); entry.reward_maxwallet = tableData.getIntField(27, -1);
entry.repeatable = tableData.getIntField(28, -1) == 1 ? true : false; entry.repeatable = tableData.getIntField(28, -1) == 1 ? true : false;
entry.reward_currency_repeatable = tableData.getIntField(29, -1); entry.reward_currency_repeatable = tableData.getIntField(29, -1);
entry.reward_item1_repeatable = tableData.getIntField(30, -1); entry.reward_item1_repeatable = tableData.getIntField(30, -1);
entry.reward_item1_repeat_count = tableData.getIntField(31, -1); entry.reward_item1_repeat_count = tableData.getIntField(31, -1);
entry.reward_item2_repeatable = tableData.getIntField(32, -1); entry.reward_item2_repeatable = tableData.getIntField(32, -1);
entry.reward_item2_repeat_count = tableData.getIntField(33, -1); entry.reward_item2_repeat_count = tableData.getIntField(33, -1);
entry.reward_item3_repeatable = tableData.getIntField(34, -1); entry.reward_item3_repeatable = tableData.getIntField(34, -1);
entry.reward_item3_repeat_count = tableData.getIntField(35, -1); entry.reward_item3_repeat_count = tableData.getIntField(35, -1);
entry.reward_item4_repeatable = tableData.getIntField(36, -1); entry.reward_item4_repeatable = tableData.getIntField(36, -1);
entry.reward_item4_repeat_count = tableData.getIntField(37, -1); entry.reward_item4_repeat_count = tableData.getIntField(37, -1);
entry.time_limit = tableData.getIntField(38, -1); entry.time_limit = tableData.getIntField(38, -1);
entry.isMission = tableData.getIntField(39, -1) ? true : false; entry.isMission = tableData.getIntField(39, -1) ? true : false;
entry.missionIconID = tableData.getIntField(40, -1); entry.missionIconID = tableData.getIntField(40, -1);
entry.prereqMissionID = tableData.getStringField(41, ""); entry.prereqMissionID = tableData.getStringField(41, "");
entry.localize = tableData.getIntField(42, -1) == 1 ? true : false; entry.localize = tableData.getIntField(42, -1) == 1 ? true : false;
entry.inMOTD = tableData.getIntField(43, -1) == 1 ? true : false; entry.inMOTD = tableData.getIntField(43, -1) == 1 ? true : false;
entry.cooldownTime = tableData.getInt64Field(44, -1); entry.cooldownTime = tableData.getInt64Field(44, -1);
entry.isRandom = tableData.getIntField(45, -1) == 1 ? true : false; entry.isRandom = tableData.getIntField(45, -1) == 1 ? true : false;
entry.randomPool = tableData.getStringField(46, ""); entry.randomPool = tableData.getStringField(46, "");
entry.UIPrereqID = tableData.getIntField(47, -1); entry.UIPrereqID = tableData.getIntField(47, -1);
UNUSED(entry.gate_version = tableData.getStringField(48, "")); UNUSED(entry.gate_version = tableData.getStringField(48, ""));
UNUSED(entry.HUDStates = tableData.getStringField(49, "")); UNUSED(entry.HUDStates = tableData.getStringField(49, ""));
UNUSED(entry.locStatus = tableData.getIntField(50, -1)); UNUSED(entry.locStatus = tableData.getIntField(50, -1));
entry.reward_bankinventory = tableData.getIntField(51, -1); entry.reward_bankinventory = tableData.getIntField(51, -1);
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
Default.id = -1; Default.id = -1;
} }
//! Destructor //! Destructor
CDMissionsTable::~CDMissionsTable(void) { } CDMissionsTable::~CDMissionsTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDMissionsTable::GetName(void) const { std::string CDMissionsTable::GetName(void) const {
return "Missions"; return "Missions";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDMissions> CDMissionsTable::Query(std::function<bool(CDMissions)> predicate) { std::vector<CDMissions> CDMissionsTable::Query(std::function<bool(CDMissions)> predicate) {
std::vector<CDMissions> data = cpplinq::from(this->entries) std::vector<CDMissions> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
const std::vector<CDMissions>& CDMissionsTable::GetEntries(void) const { const std::vector<CDMissions>& CDMissionsTable::GetEntries(void) const {
return this->entries; return this->entries;
} }
const CDMissions* CDMissionsTable::GetPtrByMissionID(uint32_t missionID) const const CDMissions* CDMissionsTable::GetPtrByMissionID(uint32_t missionID) const {
{ for (const auto& entry : entries) {
for (const auto& entry : entries) if (entry.id == missionID) {
{ return const_cast<CDMissions*>(&entry);
if (entry.id == missionID) }
{ }
return const_cast<CDMissions*>(&entry);
}
}
return &Default; return &Default;
} }
const CDMissions& CDMissionsTable::GetByMissionID(uint32_t missionID, bool& found) const const CDMissions& CDMissionsTable::GetByMissionID(uint32_t missionID, bool& found) const {
{ for (const auto& entry : entries) {
for (const auto& entry : entries) if (entry.id == missionID) {
{ found = true;
if (entry.id == missionID)
{
found = true;
return entry; return entry;
} }
} }
found = false; found = false;
return Default; return Default;
} }

View File

@ -10,97 +10,97 @@
\brief Contains data for the Missions table \brief Contains data for the Missions table
*/ */
//! Missions Struct //! Missions Struct
struct CDMissions { struct CDMissions {
int id; //!< The Mission ID int id; //!< The Mission ID
std::string defined_type; //!< The type of mission std::string defined_type; //!< The type of mission
std::string defined_subtype; //!< The subtype of the mission std::string defined_subtype; //!< The subtype of the mission
int UISortOrder; //!< The UI Sort Order for the mission int UISortOrder; //!< The UI Sort Order for the mission
int offer_objectID; //!< The LOT of the mission giver int offer_objectID; //!< The LOT of the mission giver
int target_objectID; //!< The LOT of the mission's target int target_objectID; //!< The LOT of the mission's target
int64_t reward_currency; //!< The amount of currency to reward the player int64_t reward_currency; //!< The amount of currency to reward the player
int LegoScore; //!< The amount of LEGO Score to reward the player int LegoScore; //!< The amount of LEGO Score to reward the player
int64_t reward_reputation; //!< The reputation to award the player int64_t reward_reputation; //!< The reputation to award the player
bool isChoiceReward; //!< Whether or not the user has the option to choose their loot bool isChoiceReward; //!< Whether or not the user has the option to choose their loot
int reward_item1; //!< The first rewarded item int reward_item1; //!< The first rewarded item
int reward_item1_count; //!< The count of the first item to be rewarded int reward_item1_count; //!< The count of the first item to be rewarded
int reward_item2; //!< The second rewarded item int reward_item2; //!< The second rewarded item
int reward_item2_count; //!< The count of the second item to be rewarded int reward_item2_count; //!< The count of the second item to be rewarded
int reward_item3; //!< The third rewarded item int reward_item3; //!< The third rewarded item
int reward_item3_count; //!< The count of the third item to be rewarded int reward_item3_count; //!< The count of the third item to be rewarded
int reward_item4; //!< The fourth rewarded item int reward_item4; //!< The fourth rewarded item
int reward_item4_count; //!< The count of the fourth item to be rewarded int reward_item4_count; //!< The count of the fourth item to be rewarded
int reward_emote; //!< The first emote to be rewarded int reward_emote; //!< The first emote to be rewarded
int reward_emote2; //!< The second emote to be rewarded int reward_emote2; //!< The second emote to be rewarded
int reward_emote3; //!< The third emote to be rewarded int reward_emote3; //!< The third emote to be rewarded
int reward_emote4; //!< The fourth emote to be rewarded int reward_emote4; //!< The fourth emote to be rewarded
int reward_maximagination; //!< The amount of max imagination to reward int reward_maximagination; //!< The amount of max imagination to reward
int reward_maxhealth; //!< The amount of max health to reward int reward_maxhealth; //!< The amount of max health to reward
int reward_maxinventory; //!< The amount of max inventory to reward int reward_maxinventory; //!< The amount of max inventory to reward
int reward_maxmodel; //!< ??? int reward_maxmodel; //!< ???
int reward_maxwidget; //!< ??? int reward_maxwidget; //!< ???
int reward_maxwallet; //!< ??? int reward_maxwallet; //!< ???
bool repeatable; //!< Whether or not this mission can be repeated (for instance, is it a daily mission) bool repeatable; //!< Whether or not this mission can be repeated (for instance, is it a daily mission)
int64_t reward_currency_repeatable; //!< The repeatable reward int64_t reward_currency_repeatable; //!< The repeatable reward
int reward_item1_repeatable; //!< The first rewarded item int reward_item1_repeatable; //!< The first rewarded item
int reward_item1_repeat_count; //!< The count of the first item to be rewarded int reward_item1_repeat_count; //!< The count of the first item to be rewarded
int reward_item2_repeatable; //!< The second rewarded item int reward_item2_repeatable; //!< The second rewarded item
int reward_item2_repeat_count; //!< The count of the second item to be rewarded int reward_item2_repeat_count; //!< The count of the second item to be rewarded
int reward_item3_repeatable; //!< The third rewarded item int reward_item3_repeatable; //!< The third rewarded item
int reward_item3_repeat_count; //!< The count of the third item to be rewarded int reward_item3_repeat_count; //!< The count of the third item to be rewarded
int reward_item4_repeatable; //!< The fourth rewarded item int reward_item4_repeatable; //!< The fourth rewarded item
int reward_item4_repeat_count; //!< The count of the fourth item to be rewarded int reward_item4_repeat_count; //!< The count of the fourth item to be rewarded
int time_limit; //!< The time limit of the mission int time_limit; //!< The time limit of the mission
bool isMission; //!< Maybe to differentiate between missions and achievements? bool isMission; //!< Maybe to differentiate between missions and achievements?
int missionIconID; //!< The mission icon ID int missionIconID; //!< The mission icon ID
std::string prereqMissionID; //!< A '|' seperated list of prerequisite missions std::string prereqMissionID; //!< A '|' seperated list of prerequisite missions
bool localize; //!< Whether or not to localize the mission bool localize; //!< Whether or not to localize the mission
bool inMOTD; //!< In Match of the Day(?) bool inMOTD; //!< In Match of the Day(?)
int64_t cooldownTime; //!< The mission cooldown time int64_t cooldownTime; //!< The mission cooldown time
bool isRandom; //!< ??? bool isRandom; //!< ???
std::string randomPool; //!< ??? std::string randomPool; //!< ???
int UIPrereqID; //!< ??? int UIPrereqID; //!< ???
UNUSED(std::string gate_version); //!< The gate version UNUSED(std::string gate_version); //!< The gate version
UNUSED(std::string HUDStates); //!< ??? UNUSED(std::string HUDStates); //!< ???
UNUSED(int locStatus); //!< ??? UNUSED(int locStatus); //!< ???
int reward_bankinventory; //!< The amount of bank space this mission rewards int reward_bankinventory; //!< The amount of bank space this mission rewards
}; };
//! Missions table //! Missions table
class CDMissionsTable : public CDTable { class CDMissionsTable : public CDTable {
private: private:
std::vector<CDMissions> entries; std::vector<CDMissions> entries;
public: public:
//! Constructor
CDMissionsTable(void);
//! Destructor
~CDMissionsTable(void);
//! Returns the table's name
/*!
\return The table name
*/
std::string GetName(void) const override;
//! Queries the table with a custom "where" clause
/*!
\param predicate The predicate
*/
std::vector<CDMissions> Query(std::function<bool(CDMissions)> predicate);
//! Gets all the entries in the table //! Constructor
/*! CDMissionsTable(void);
\return The entries
*/
const std::vector<CDMissions>& GetEntries(void) const;
const CDMissions* GetPtrByMissionID(uint32_t missionID) const; //! Destructor
~CDMissionsTable(void);
const CDMissions& GetByMissionID(uint32_t missionID, bool& found) const; //! Returns the table's name
/*!
\return The table name
*/
std::string GetName(void) const override;
static CDMissions Default; //! Queries the table with a custom "where" clause
/*!
\param predicate The predicate
*/
std::vector<CDMissions> Query(std::function<bool(CDMissions)> predicate);
//! Gets all the entries in the table
/*!
\return The entries
*/
const std::vector<CDMissions>& GetEntries(void) const;
const CDMissions* GetPtrByMissionID(uint32_t missionID) const;
const CDMissions& GetByMissionID(uint32_t missionID, bool& found) const;
static CDMissions Default;
}; };

View File

@ -11,9 +11,9 @@ CDMovementAIComponentTable::CDMovementAIComponentTable(void) {
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
@ -38,7 +38,7 @@ CDMovementAIComponentTable::CDMovementAIComponentTable(void) {
} }
//! Destructor //! Destructor
CDMovementAIComponentTable::~CDMovementAIComponentTable(void) { } CDMovementAIComponentTable::~CDMovementAIComponentTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDMovementAIComponentTable::GetName(void) const { std::string CDMovementAIComponentTable::GetName(void) const {

View File

@ -2,56 +2,56 @@
//! Constructor //! Constructor
CDObjectSkillsTable::CDObjectSkillsTable(void) { CDObjectSkillsTable::CDObjectSkillsTable(void) {
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ObjectSkills"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM ObjectSkills");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ObjectSkills"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ObjectSkills");
while (!tableData.eof()) { while (!tableData.eof()) {
CDObjectSkills entry; CDObjectSkills entry;
entry.objectTemplate = tableData.getIntField(0, -1); entry.objectTemplate = tableData.getIntField(0, -1);
entry.skillID = tableData.getIntField(1, -1); entry.skillID = tableData.getIntField(1, -1);
entry.castOnType = tableData.getIntField(2, -1); entry.castOnType = tableData.getIntField(2, -1);
entry.AICombatWeight = tableData.getIntField(3, -1); entry.AICombatWeight = tableData.getIntField(3, -1);
this->entries.push_back(entry); this->entries.push_back(entry);
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
} }
//! Destructor //! Destructor
CDObjectSkillsTable::~CDObjectSkillsTable(void) { } CDObjectSkillsTable::~CDObjectSkillsTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDObjectSkillsTable::GetName(void) const { std::string CDObjectSkillsTable::GetName(void) const {
return "ObjectSkills"; return "ObjectSkills";
} }
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
std::vector<CDObjectSkills> CDObjectSkillsTable::Query(std::function<bool(CDObjectSkills)> predicate) { std::vector<CDObjectSkills> CDObjectSkillsTable::Query(std::function<bool(CDObjectSkills)> predicate) {
std::vector<CDObjectSkills> data = cpplinq::from(this->entries) std::vector<CDObjectSkills> data = cpplinq::from(this->entries)
>> cpplinq::where(predicate) >> cpplinq::where(predicate)
>> cpplinq::to_vector(); >> cpplinq::to_vector();
return data; return data;
} }
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDObjectSkills> CDObjectSkillsTable::GetEntries(void) const { std::vector<CDObjectSkills> CDObjectSkillsTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

View File

@ -8,44 +8,44 @@
\brief Contains data for the ObjectSkills table \brief Contains data for the ObjectSkills table
*/ */
//! ObjectSkills Struct //! ObjectSkills Struct
struct CDObjectSkills { struct CDObjectSkills {
unsigned int objectTemplate; //!< The LOT of the item unsigned int objectTemplate; //!< The LOT of the item
unsigned int skillID; //!< The Skill ID of the object unsigned int skillID; //!< The Skill ID of the object
unsigned int castOnType; //!< ??? unsigned int castOnType; //!< ???
unsigned int AICombatWeight; //!< ??? unsigned int AICombatWeight; //!< ???
}; };
//! ObjectSkills table //! ObjectSkills table
class CDObjectSkillsTable : public CDTable { class CDObjectSkillsTable : public CDTable {
private: private:
std::vector<CDObjectSkills> entries; std::vector<CDObjectSkills> entries;
public: public:
//! Constructor //! Constructor
CDObjectSkillsTable(void); CDObjectSkillsTable(void);
//! Destructor //! Destructor
~CDObjectSkillsTable(void); ~CDObjectSkillsTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Queries the table with a custom "where" clause //! Queries the table with a custom "where" clause
/*! /*!
\param predicate The predicate \param predicate The predicate
*/ */
std::vector<CDObjectSkills> Query(std::function<bool(CDObjectSkills)> predicate); std::vector<CDObjectSkills> Query(std::function<bool(CDObjectSkills)> predicate);
//! Gets all the entries in the table //! Gets all the entries in the table
/*! /*!
\return The entries \return The entries
*/ */
std::vector<CDObjectSkills> GetEntries(void) const; std::vector<CDObjectSkills> GetEntries(void) const;
}; };

View File

@ -3,39 +3,39 @@
//! Constructor //! Constructor
CDObjectsTable::CDObjectsTable(void) { CDObjectsTable::CDObjectsTable(void) {
#ifdef CDCLIENT_CACHE_ALL #ifdef CDCLIENT_CACHE_ALL
// First, get the size of the table // First, get the size of the table
unsigned int size = 0; unsigned int size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM Objects"); auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM Objects");
while (!tableSize.eof()) { while (!tableSize.eof()) {
size = tableSize.getIntField(0, 0); size = tableSize.getIntField(0, 0);
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Now get the data // Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Objects"); auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Objects");
while (!tableData.eof()) { while (!tableData.eof()) {
CDObjects entry; CDObjects entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.name = tableData.getStringField(1, ""); entry.name = tableData.getStringField(1, "");
entry.placeable = tableData.getIntField(2, -1); entry.placeable = tableData.getIntField(2, -1);
entry.type = tableData.getStringField(3, ""); entry.type = tableData.getStringField(3, "");
entry.description = tableData.getStringField(4, ""); entry.description = tableData.getStringField(4, "");
entry.localize = tableData.getIntField(5, -1); entry.localize = tableData.getIntField(5, -1);
entry.npcTemplateID = tableData.getIntField(6, -1); entry.npcTemplateID = tableData.getIntField(6, -1);
entry.displayName = tableData.getStringField(7, ""); entry.displayName = tableData.getStringField(7, "");
entry.interactionDistance = tableData.getFloatField(8, -1.0f); entry.interactionDistance = tableData.getFloatField(8, -1.0f);
entry.nametag = tableData.getIntField(9, -1); entry.nametag = tableData.getIntField(9, -1);
entry._internalNotes = tableData.getStringField(10, ""); entry._internalNotes = tableData.getStringField(10, "");
entry.locStatus = tableData.getIntField(11, -1); entry.locStatus = tableData.getIntField(11, -1);
entry.gate_version = tableData.getStringField(12, ""); entry.gate_version = tableData.getStringField(12, "");
entry.HQ_valid = tableData.getIntField(13, -1); entry.HQ_valid = tableData.getIntField(13, -1);
this->entries.insert(std::make_pair(entry.id, entry)); this->entries.insert(std::make_pair(entry.id, entry));
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
#endif #endif
@ -44,14 +44,14 @@ CDObjectsTable::CDObjectsTable(void) {
} }
//! Destructor //! Destructor
CDObjectsTable::~CDObjectsTable(void) { } CDObjectsTable::~CDObjectsTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDObjectsTable::GetName(void) const { std::string CDObjectsTable::GetName(void) const {
return "Objects"; return "Objects";
} }
const CDObjects & CDObjectsTable::GetByID(unsigned int LOT) { const CDObjects& CDObjectsTable::GetByID(unsigned int LOT) {
const auto& it = this->entries.find(LOT); const auto& it = this->entries.find(LOT);
if (it != this->entries.end()) { if (it != this->entries.end()) {
return it->second; return it->second;
@ -63,32 +63,32 @@ const CDObjects & CDObjectsTable::GetByID(unsigned int LOT) {
query << "SELECT * FROM Objects WHERE id = " << std::to_string(LOT); query << "SELECT * FROM Objects WHERE id = " << std::to_string(LOT);
auto tableData = CDClientDatabase::ExecuteQuery(query.str()); auto tableData = CDClientDatabase::ExecuteQuery(query.str());
if (tableData.eof()) { if (tableData.eof()) {
this->entries.insert(std::make_pair(LOT, m_default)); this->entries.insert(std::make_pair(LOT, m_default));
return m_default; return m_default;
} }
// Now get the data // Now get the data
while (!tableData.eof()) { while (!tableData.eof()) {
CDObjects entry; CDObjects entry;
entry.id = tableData.getIntField(0, -1); entry.id = tableData.getIntField(0, -1);
entry.name = tableData.getStringField(1, ""); entry.name = tableData.getStringField(1, "");
UNUSED(entry.placeable = tableData.getIntField(2, -1)); UNUSED(entry.placeable = tableData.getIntField(2, -1));
entry.type = tableData.getStringField(3, ""); entry.type = tableData.getStringField(3, "");
UNUSED(ntry.description = tableData.getStringField(4, "")); UNUSED(ntry.description = tableData.getStringField(4, ""));
UNUSED(entry.localize = tableData.getIntField(5, -1)); UNUSED(entry.localize = tableData.getIntField(5, -1));
UNUSED(entry.npcTemplateID = tableData.getIntField(6, -1)); UNUSED(entry.npcTemplateID = tableData.getIntField(6, -1));
UNUSED(entry.displayName = tableData.getStringField(7, "")); UNUSED(entry.displayName = tableData.getStringField(7, ""));
entry.interactionDistance = tableData.getFloatField(8, -1.0f); entry.interactionDistance = tableData.getFloatField(8, -1.0f);
UNUSED(entry.nametag = tableData.getIntField(9, -1)); UNUSED(entry.nametag = tableData.getIntField(9, -1));
UNUSED(entry._internalNotes = tableData.getStringField(10, "")); UNUSED(entry._internalNotes = tableData.getStringField(10, ""));
UNUSED(entry.locStatus = tableData.getIntField(11, -1)); UNUSED(entry.locStatus = tableData.getIntField(11, -1));
UNUSED(entry.gate_version = tableData.getStringField(12, "")); UNUSED(entry.gate_version = tableData.getStringField(12, ""));
UNUSED(entry.HQ_valid = tableData.getIntField(13, -1)); UNUSED(entry.HQ_valid = tableData.getIntField(13, -1));
this->entries.insert(std::make_pair(entry.id, entry)); this->entries.insert(std::make_pair(entry.id, entry));
tableData.nextRow(); tableData.nextRow();
} }
tableData.finalize(); tableData.finalize();
@ -99,4 +99,4 @@ const CDObjects & CDObjectsTable::GetByID(unsigned int LOT) {
#endif #endif
return m_default; return m_default;
} }

View File

@ -8,45 +8,45 @@
\brief Contains data for the Objects table \brief Contains data for the Objects table
*/ */
//! RebuildComponent Struct //! RebuildComponent Struct
struct CDObjects { struct CDObjects {
unsigned int id; //!< The LOT of the object unsigned int id; //!< The LOT of the object
std::string name; //!< The internal name of the object std::string name; //!< The internal name of the object
UNUSED(unsigned int placeable); //!< Whether or not the object is placable UNUSED(unsigned int placeable); //!< Whether or not the object is placable
std::string type; //!< The object type std::string type; //!< The object type
UNUSED(std::string description); //!< An internal description of the object UNUSED(std::string description); //!< An internal description of the object
UNUSED(unsigned int localize); //!< Whether or not the object should localize UNUSED(unsigned int localize); //!< Whether or not the object should localize
UNUSED(unsigned int npcTemplateID); //!< Something related to NPCs... UNUSED(unsigned int npcTemplateID); //!< Something related to NPCs...
UNUSED(std::string displayName); //!< The display name of the object UNUSED(std::string displayName); //!< The display name of the object
float interactionDistance; //!< The interaction distance of the object float interactionDistance; //!< The interaction distance of the object
UNUSED(unsigned int nametag); //!< ??? UNUSED(unsigned int nametag); //!< ???
UNUSED(std::string _internalNotes); //!< Some internal notes (rarely used) UNUSED(std::string _internalNotes); //!< Some internal notes (rarely used)
UNUSED(unsigned int locStatus); //!< ??? UNUSED(unsigned int locStatus); //!< ???
UNUSED(std::string gate_version); //!< The gate version for the object UNUSED(std::string gate_version); //!< The gate version for the object
UNUSED(unsigned int HQ_valid); //!< Probably used for the Nexus HQ database on LEGOUniverse.com UNUSED(unsigned int HQ_valid); //!< Probably used for the Nexus HQ database on LEGOUniverse.com
}; };
//! ObjectSkills table //! ObjectSkills table
class CDObjectsTable : public CDTable { class CDObjectsTable : public CDTable {
private: private:
//std::vector<CDObjects> entries; //std::vector<CDObjects> entries;
std::map<unsigned int, CDObjects> entries; std::map<unsigned int, CDObjects> entries;
CDObjects m_default; CDObjects m_default;
public: public:
//! Constructor //! Constructor
CDObjectsTable(void); CDObjectsTable(void);
//! Destructor //! Destructor
~CDObjectsTable(void); ~CDObjectsTable(void);
//! Returns the table's name //! Returns the table's name
/*! /*!
\return The table name \return The table name
*/ */
std::string GetName(void) const override; std::string GetName(void) const override;
//! Gets an entry by ID //! Gets an entry by ID
const CDObjects& GetByID(unsigned int LOT); const CDObjects& GetByID(unsigned int LOT);

View File

@ -11,9 +11,9 @@ CDPackageComponentTable::CDPackageComponentTable(void) {
tableSize.nextRow(); tableSize.nextRow();
} }
tableSize.finalize(); tableSize.finalize();
// Reserve the size // Reserve the size
this->entries.reserve(size); this->entries.reserve(size);
@ -33,7 +33,7 @@ CDPackageComponentTable::CDPackageComponentTable(void) {
} }
//! Destructor //! Destructor
CDPackageComponentTable::~CDPackageComponentTable(void) { } CDPackageComponentTable::~CDPackageComponentTable(void) {}
//! Returns the table's name //! Returns the table's name
std::string CDPackageComponentTable::GetName(void) const { std::string CDPackageComponentTable::GetName(void) const {
@ -53,4 +53,4 @@ std::vector<CDPackageComponent> CDPackageComponentTable::Query(std::function<boo
//! Gets all the entries in the table //! Gets all the entries in the table
std::vector<CDPackageComponent> CDPackageComponentTable::GetEntries(void) const { std::vector<CDPackageComponent> CDPackageComponentTable::GetEntries(void) const {
return this->entries; return this->entries;
} }

Some files were not shown because too many files have changed in this diff Show More