mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-25 06:57:28 +00:00
Merge remote-tracking branch 'upstream/main' into more-cdclient-cleanup
This commit is contained in:
commit
8a065ad074
26
.github/workflows/build-and-test.yml
vendored
26
.github/workflows/build-and-test.yml
vendored
@ -36,22 +36,16 @@ jobs:
|
|||||||
testPreset: "ci-${{matrix.os}}"
|
testPreset: "ci-${{matrix.os}}"
|
||||||
- name: artifacts
|
- name: artifacts
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
if: ${{ github.ref == 'ref/head/main' }}
|
|
||||||
with:
|
with:
|
||||||
name: build-${{matrix.os}}
|
name: build-${{matrix.os}}
|
||||||
path: |
|
path: |
|
||||||
build
|
build/*Server*
|
||||||
!build/tests
|
build/*.ini
|
||||||
!build/Testing
|
build/*.so
|
||||||
!build/CMakeFiles
|
build/*.dll
|
||||||
!build/DartConfiguration.tcl
|
build/vanity/
|
||||||
!build/CTestTestfile.cmake
|
build/navmeshes/
|
||||||
!build/CMakeCache.txt
|
build/migrations/
|
||||||
!build/build.ninja
|
build/*.dcf
|
||||||
!build/_deps
|
!build/*.pdb
|
||||||
!build/cmake_install.cmake
|
!build/d*/
|
||||||
!build/*.a
|
|
||||||
!build/*.lib
|
|
||||||
!build/*.dir
|
|
||||||
!build/*.vcxproj
|
|
||||||
!build/*.vcxproj.filters
|
|
||||||
|
23
README.md
23
README.md
@ -245,30 +245,11 @@ To connect to a server follow these steps:
|
|||||||
* In the client directory, locate `boot.cfg`
|
* In the client directory, locate `boot.cfg`
|
||||||
* Open it in a text editor and locate where it says `AUTHSERVERIP=0:`
|
* Open it in a text editor and locate where it says `AUTHSERVERIP=0:`
|
||||||
* Replace the contents after to `:` and the following `,` with what you configured as the server's public facing IP. For example `AUTHSERVERIP=0:localhost` for locally hosted servers
|
* Replace the contents after to `:` and the following `,` with what you configured as the server's public facing IP. For example `AUTHSERVERIP=0:localhost` for locally hosted servers
|
||||||
|
* Next locate the line `UGCUSE3DSERVICES=7:`
|
||||||
|
* Ensure the number after the 7 is a `0`
|
||||||
* Launch `legouniverse.exe`, through `wine` if on a Unix-like operating system
|
* Launch `legouniverse.exe`, through `wine` if on a Unix-like operating system
|
||||||
* Note that if you are on WSL2, you will need to configure the public IP in the server and client to be the IP of the WSL2 instance and not localhost, which can be found by running `ifconfig` in the terminal. Windows defaults to WSL1, so this will not apply to most users.
|
* Note that if you are on WSL2, you will need to configure the public IP in the server and client to be the IP of the WSL2 instance and not localhost, which can be found by running `ifconfig` in the terminal. Windows defaults to WSL1, so this will not apply to most users.
|
||||||
|
|
||||||
## Brick-By-Brick building
|
|
||||||
Should you choose to do any brick building, you will want to have some form of a http server that returns a 404 error since we are unable to emulate live User Generated Content at the moment. If you attempt to do any brick building without a 404 server running properly, you will be unable to load into your game. Python is the easiest way to do this, but any thing that returns a 404 should work fine.
|
|
||||||
* Note: the client hard codes this request on port 80.
|
|
||||||
|
|
||||||
<font size="4">**If you do not plan on doing any Brick Building, then you can skip this step.**</font>
|
|
||||||
|
|
||||||
The easiest way to do this is to install [python](https://www.python.org/downloads/).
|
|
||||||
|
|
||||||
### Allowing a user to build in Brick-by-Brick mode
|
|
||||||
Brick-By-Brick building requires `PATCHSERVERIP=0:` and `UGCSERVERIP=0:` in the `boot.cfg` to point to a HTTP server which always returns `HTTP 404 - Not Found` for all requests. This can be most easily achieved by pointing both of those variables to `localhost` while having running in the background.
|
|
||||||
Each client must have their own 404 server running if they are using a locally hosted 404 server.
|
|
||||||
```bash
|
|
||||||
# If on linux run this command. Because this is run on a port below 1024, binary network permissions are needed.
|
|
||||||
sudo python3 -m http.server 80
|
|
||||||
|
|
||||||
# If on windows one of the following will work when run through Powershell or Command Prompt assuming python is installed
|
|
||||||
python3 -m http.server 80
|
|
||||||
python http.server 80
|
|
||||||
py -m http.server 80
|
|
||||||
```
|
|
||||||
|
|
||||||
## Updating your server
|
## Updating your server
|
||||||
To update your server to the latest version navigate to your cloned directory
|
To update your server to the latest version navigate to your cloned directory
|
||||||
```bash
|
```bash
|
||||||
|
@ -15,10 +15,13 @@
|
|||||||
|
|
||||||
//RakNet includes:
|
//RakNet includes:
|
||||||
#include "RakNetDefines.h"
|
#include "RakNetDefines.h"
|
||||||
|
#include <MessageIdentifiers.h>
|
||||||
|
|
||||||
//Auth includes:
|
//Auth includes:
|
||||||
#include "AuthPackets.h"
|
#include "AuthPackets.h"
|
||||||
#include "dMessageIdentifiers.h"
|
#include "eConnectionType.h"
|
||||||
|
#include "eServerMessageType.h"
|
||||||
|
#include "eAuthMessageType.h"
|
||||||
|
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
namespace Game {
|
namespace Game {
|
||||||
@ -168,13 +171,15 @@ dLogger* SetupLogger() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HandlePacket(Packet* packet) {
|
void HandlePacket(Packet* packet) {
|
||||||
|
if (packet->length < 4) return;
|
||||||
|
|
||||||
if (packet->data[0] == ID_USER_PACKET_ENUM) {
|
if (packet->data[0] == ID_USER_PACKET_ENUM) {
|
||||||
if (packet->data[1] == SERVER) {
|
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::SERVER) {
|
||||||
if (packet->data[3] == MSG_SERVER_VERSION_CONFIRM) {
|
if (static_cast<eServerMessageType>(packet->data[3]) == eServerMessageType::VERSION_CONFIRM) {
|
||||||
AuthPackets::HandleHandshake(Game::server, packet);
|
AuthPackets::HandleHandshake(Game::server, packet);
|
||||||
}
|
}
|
||||||
} else if (packet->data[1] == AUTH) {
|
} else if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::AUTH) {
|
||||||
if (packet->data[3] == MSG_AUTH_LOGIN_REQUEST) {
|
if (static_cast<eAuthMessageType>(packet->data[3]) == eAuthMessageType::LOGIN_REQUEST) {
|
||||||
AuthPackets::HandleLoginRequest(Game::server, packet);
|
AuthPackets::HandleLoginRequest(Game::server, packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
#include "Database.h"
|
#include "Database.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "PacketUtils.h"
|
#include "PacketUtils.h"
|
||||||
#include "dMessageIdentifiers.h"
|
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "dServer.h"
|
#include "dServer.h"
|
||||||
#include "GeneralUtils.h"
|
#include "GeneralUtils.h"
|
||||||
@ -12,15 +11,20 @@
|
|||||||
#include "eAddFriendResponseType.h"
|
#include "eAddFriendResponseType.h"
|
||||||
#include "RakString.h"
|
#include "RakString.h"
|
||||||
#include "dConfig.h"
|
#include "dConfig.h"
|
||||||
|
#include "eObjectBits.h"
|
||||||
|
#include "eConnectionType.h"
|
||||||
|
#include "eChatMessageType.h"
|
||||||
|
#include "eChatInternalMessageType.h"
|
||||||
|
#include "eClientMessageType.h"
|
||||||
|
#include "eGameMessageType.h"
|
||||||
|
|
||||||
extern PlayerContainer playerContainer;
|
extern PlayerContainer playerContainer;
|
||||||
|
|
||||||
void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
|
void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
|
||||||
//Get from the packet which player we want to do something with:
|
//Get from the packet which player we want to do something with:
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID = 0;
|
LWOOBJID playerID = 0;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
|
|
||||||
auto player = playerContainer.GetPlayerData(playerID);
|
auto player = playerContainer.GetPlayerData(playerID);
|
||||||
if (!player) return;
|
if (!player) return;
|
||||||
@ -45,8 +49,8 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
|
|||||||
FriendData fd;
|
FriendData fd;
|
||||||
fd.isFTP = false; // not a thing in DLU
|
fd.isFTP = false; // not a thing in DLU
|
||||||
fd.friendID = res->getUInt(1);
|
fd.friendID = res->getUInt(1);
|
||||||
GeneralUtils::SetBit(fd.friendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_PERSISTENT));
|
GeneralUtils::SetBit(fd.friendID, eObjectBits::PERSISTENT);
|
||||||
GeneralUtils::SetBit(fd.friendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_CHARACTER));
|
GeneralUtils::SetBit(fd.friendID, eObjectBits::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;
|
||||||
@ -71,11 +75,11 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
|
|||||||
|
|
||||||
//Now, we need to send the friendlist to the server they came from:
|
//Now, we need to send the friendlist to the server they came from:
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(playerID);
|
bitStream.Write(playerID);
|
||||||
|
|
||||||
//portion that will get routed:
|
//portion that will get routed:
|
||||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_GET_FRIENDS_LIST_RESPONSE);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::GET_FRIENDS_LIST_RESPONSE);
|
||||||
bitStream.Write<uint8_t>(0);
|
bitStream.Write<uint8_t>(0);
|
||||||
bitStream.Write<uint16_t>(1); //Length of packet -- just writing one as it doesn't matter, client skips it.
|
bitStream.Write<uint16_t>(1); //Length of packet -- just writing one as it doesn't matter, client skips it.
|
||||||
bitStream.Write((uint16_t)friends.size());
|
bitStream.Write((uint16_t)friends.size());
|
||||||
@ -94,10 +98,9 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
|
|||||||
auto maxNumberOfBestFriendsAsString = Game::config->GetValue("max_number_of_best_friends");
|
auto maxNumberOfBestFriendsAsString = Game::config->GetValue("max_number_of_best_friends");
|
||||||
// If this config option doesn't exist, default to 5 which is what live used.
|
// If this config option doesn't exist, default to 5 which is what live used.
|
||||||
auto maxNumberOfBestFriends = maxNumberOfBestFriendsAsString != "" ? std::stoi(maxNumberOfBestFriendsAsString) : 5U;
|
auto maxNumberOfBestFriends = maxNumberOfBestFriendsAsString != "" ? std::stoi(maxNumberOfBestFriendsAsString) : 5U;
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID requestorPlayerID;
|
LWOOBJID requestorPlayerID;
|
||||||
inStream.Read(requestorPlayerID);
|
inStream.Read(requestorPlayerID);
|
||||||
inStream.Read(requestorPlayerID);
|
|
||||||
uint32_t spacing{};
|
uint32_t spacing{};
|
||||||
inStream.Read(spacing);
|
inStream.Read(spacing);
|
||||||
std::string playerName = "";
|
std::string playerName = "";
|
||||||
@ -178,10 +181,10 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
|
|||||||
bestFriendStatus = oldBestFriendStatus;
|
bestFriendStatus = oldBestFriendStatus;
|
||||||
|
|
||||||
// Set the bits
|
// Set the bits
|
||||||
GeneralUtils::SetBit(queryPlayerID, static_cast<size_t>(eObjectBits::OBJECT_BIT_CHARACTER));
|
GeneralUtils::SetBit(queryPlayerID, eObjectBits::CHARACTER);
|
||||||
GeneralUtils::SetBit(queryPlayerID, static_cast<size_t>(eObjectBits::OBJECT_BIT_PERSISTENT));
|
GeneralUtils::SetBit(queryPlayerID, eObjectBits::PERSISTENT);
|
||||||
GeneralUtils::SetBit(queryFriendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_CHARACTER));
|
GeneralUtils::SetBit(queryFriendID, eObjectBits::CHARACTER);
|
||||||
GeneralUtils::SetBit(queryFriendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_PERSISTENT));
|
GeneralUtils::SetBit(queryFriendID, eObjectBits::PERSISTENT);
|
||||||
|
|
||||||
// Since this player can either be the friend of someone else or be friends with someone else
|
// Since this player can either be the friend of someone else or be friends with someone else
|
||||||
// their column in the database determines what bit gets set. When the value hits 3, they
|
// their column in the database determines what bit gets set. When the value hits 3, they
|
||||||
@ -242,10 +245,9 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleFriendResponse(Packet* packet) {
|
void ChatPacketHandler::HandleFriendResponse(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID;
|
LWOOBJID playerID;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
|
|
||||||
eAddFriendResponseCode clientResponseCode = static_cast<eAddFriendResponseCode>(packet->data[0x14]);
|
eAddFriendResponseCode clientResponseCode = static_cast<eAddFriendResponseCode>(packet->data[0x14]);
|
||||||
std::string friendName = PacketUtils::ReadString(0x15, packet, true);
|
std::string friendName = PacketUtils::ReadString(0x15, packet, true);
|
||||||
@ -318,10 +320,9 @@ void ChatPacketHandler::HandleFriendResponse(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleRemoveFriend(Packet* packet) {
|
void ChatPacketHandler::HandleRemoveFriend(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID;
|
LWOOBJID playerID;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
std::string friendName = PacketUtils::ReadString(0x14, packet, true);
|
std::string friendName = PacketUtils::ReadString(0x14, packet, true);
|
||||||
|
|
||||||
//we'll have to query the db here to find the user, since you can delete them while they're offline.
|
//we'll have to query the db here to find the user, since you can delete them while they're offline.
|
||||||
@ -336,8 +337,8 @@ void ChatPacketHandler::HandleRemoveFriend(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Convert friendID to LWOOBJID
|
// Convert friendID to LWOOBJID
|
||||||
GeneralUtils::SetBit(friendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_PERSISTENT));
|
GeneralUtils::SetBit(friendID, eObjectBits::PERSISTENT);
|
||||||
GeneralUtils::SetBit(friendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_CHARACTER));
|
GeneralUtils::SetBit(friendID, eObjectBits::CHARACTER);
|
||||||
|
|
||||||
std::unique_ptr<sql::PreparedStatement> deletestmt(Database::CreatePreppedStmt("DELETE FROM friends WHERE (player_id = ? AND friend_id = ?) OR (player_id = ? AND friend_id = ?) LIMIT 1;"));
|
std::unique_ptr<sql::PreparedStatement> deletestmt(Database::CreatePreppedStmt("DELETE FROM friends WHERE (player_id = ? AND friend_id = ?) OR (player_id = ? AND friend_id = ?) LIMIT 1;"));
|
||||||
deletestmt->setUInt(1, static_cast<uint32_t>(playerID));
|
deletestmt->setUInt(1, static_cast<uint32_t>(playerID));
|
||||||
@ -376,10 +377,9 @@ void ChatPacketHandler::HandleRemoveFriend(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleChatMessage(Packet* packet) {
|
void ChatPacketHandler::HandleChatMessage(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID = LWOOBJID_EMPTY;
|
LWOOBJID playerID = LWOOBJID_EMPTY;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
|
|
||||||
auto* sender = playerContainer.GetPlayerData(playerID);
|
auto* sender = playerContainer.GetPlayerData(playerID);
|
||||||
|
|
||||||
@ -412,10 +412,10 @@ void ChatPacketHandler::HandleChatMessage(Packet* packet) {
|
|||||||
const auto otherName = std::string(otherMember->playerName.c_str());
|
const auto otherName = std::string(otherMember->playerName.c_str());
|
||||||
|
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(otherMember->playerID);
|
bitStream.Write(otherMember->playerID);
|
||||||
|
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_PRIVATE_CHAT_MESSAGE);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE);
|
||||||
bitStream.Write(otherMember->playerID);
|
bitStream.Write(otherMember->playerID);
|
||||||
bitStream.Write<uint8_t>(8);
|
bitStream.Write<uint8_t>(8);
|
||||||
bitStream.Write<unsigned int>(69);
|
bitStream.Write<unsigned int>(69);
|
||||||
@ -451,10 +451,10 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) {
|
|||||||
//To the sender:
|
//To the sender:
|
||||||
{
|
{
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(goonA->playerID);
|
bitStream.Write(goonA->playerID);
|
||||||
|
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_PRIVATE_CHAT_MESSAGE);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE);
|
||||||
bitStream.Write(goonA->playerID);
|
bitStream.Write(goonA->playerID);
|
||||||
bitStream.Write<uint8_t>(7);
|
bitStream.Write<uint8_t>(7);
|
||||||
bitStream.Write<unsigned int>(69);
|
bitStream.Write<unsigned int>(69);
|
||||||
@ -474,10 +474,10 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) {
|
|||||||
//To the receiver:
|
//To the receiver:
|
||||||
{
|
{
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(goonB->playerID);
|
bitStream.Write(goonB->playerID);
|
||||||
|
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_PRIVATE_CHAT_MESSAGE);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE);
|
||||||
bitStream.Write(goonA->playerID);
|
bitStream.Write(goonA->playerID);
|
||||||
bitStream.Write<uint8_t>(7);
|
bitStream.Write<uint8_t>(7);
|
||||||
bitStream.Write<unsigned int>(69);
|
bitStream.Write<unsigned int>(69);
|
||||||
@ -496,10 +496,9 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleTeamInvite(Packet* packet) {
|
void ChatPacketHandler::HandleTeamInvite(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID;
|
LWOOBJID playerID;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
std::string invitedPlayer = PacketUtils::ReadString(0x14, packet, true);
|
std::string invitedPlayer = PacketUtils::ReadString(0x14, packet, true);
|
||||||
|
|
||||||
auto* player = playerContainer.GetPlayerData(playerID);
|
auto* player = playerContainer.GetPlayerData(playerID);
|
||||||
@ -537,10 +536,9 @@ void ChatPacketHandler::HandleTeamInvite(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) {
|
void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID = LWOOBJID_EMPTY;
|
LWOOBJID playerID = LWOOBJID_EMPTY;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
inStream.Read(size);
|
inStream.Read(size);
|
||||||
char declined = 0;
|
char declined = 0;
|
||||||
@ -571,10 +569,9 @@ void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleTeamLeave(Packet* packet) {
|
void ChatPacketHandler::HandleTeamLeave(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID = LWOOBJID_EMPTY;
|
LWOOBJID playerID = LWOOBJID_EMPTY;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
inStream.Read(size);
|
inStream.Read(size);
|
||||||
|
|
||||||
@ -588,10 +585,9 @@ void ChatPacketHandler::HandleTeamLeave(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleTeamKick(Packet* packet) {
|
void ChatPacketHandler::HandleTeamKick(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID = LWOOBJID_EMPTY;
|
LWOOBJID playerID = LWOOBJID_EMPTY;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
|
|
||||||
std::string kickedPlayer = PacketUtils::ReadString(0x14, packet, true);
|
std::string kickedPlayer = PacketUtils::ReadString(0x14, packet, true);
|
||||||
|
|
||||||
@ -619,10 +615,9 @@ void ChatPacketHandler::HandleTeamKick(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleTeamPromote(Packet* packet) {
|
void ChatPacketHandler::HandleTeamPromote(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID = LWOOBJID_EMPTY;
|
LWOOBJID playerID = LWOOBJID_EMPTY;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
|
|
||||||
std::string promotedPlayer = PacketUtils::ReadString(0x14, packet, true);
|
std::string promotedPlayer = PacketUtils::ReadString(0x14, packet, true);
|
||||||
|
|
||||||
@ -642,10 +637,9 @@ void ChatPacketHandler::HandleTeamPromote(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleTeamLootOption(Packet* packet) {
|
void ChatPacketHandler::HandleTeamLootOption(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID = LWOOBJID_EMPTY;
|
LWOOBJID playerID = LWOOBJID_EMPTY;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
inStream.Read(size);
|
inStream.Read(size);
|
||||||
|
|
||||||
@ -666,10 +660,9 @@ void ChatPacketHandler::HandleTeamLootOption(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) {
|
void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID = LWOOBJID_EMPTY;
|
LWOOBJID playerID = LWOOBJID_EMPTY;
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
inStream.Read(playerID);
|
|
||||||
|
|
||||||
auto* team = playerContainer.GetTeam(playerID);
|
auto* team = playerContainer.GetTeam(playerID);
|
||||||
auto* data = playerContainer.GetPlayerData(playerID);
|
auto* data = playerContainer.GetPlayerData(playerID);
|
||||||
@ -716,11 +709,11 @@ 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, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(receiver->playerID);
|
bitStream.Write(receiver->playerID);
|
||||||
|
|
||||||
//portion that will get routed:
|
//portion that will get routed:
|
||||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_TEAM_INVITE);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::TEAM_INVITE);
|
||||||
|
|
||||||
PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream);
|
PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream);
|
||||||
bitStream.Write(sender->playerID);
|
bitStream.Write(sender->playerID);
|
||||||
@ -731,14 +724,14 @@ void ChatPacketHandler::SendTeamInvite(PlayerData* receiver, PlayerData* sender)
|
|||||||
|
|
||||||
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, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(receiver->playerID);
|
bitStream.Write(receiver->playerID);
|
||||||
|
|
||||||
//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(eGameMessageType::TEAM_INVITE_CONFIRM);
|
||||||
|
|
||||||
bitStream.Write(bLeaderIsFreeTrial);
|
bitStream.Write(bLeaderIsFreeTrial);
|
||||||
bitStream.Write(i64LeaderID);
|
bitStream.Write(i64LeaderID);
|
||||||
@ -758,14 +751,14 @@ void ChatPacketHandler::SendTeamInviteConfirm(PlayerData* receiver, bool bLeader
|
|||||||
|
|
||||||
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, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(receiver->playerID);
|
bitStream.Write(receiver->playerID);
|
||||||
|
|
||||||
//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(eGameMessageType::TEAM_GET_STATUS_RESPONSE);
|
||||||
|
|
||||||
bitStream.Write(i64LeaderID);
|
bitStream.Write(i64LeaderID);
|
||||||
bitStream.Write(i64LeaderZoneID);
|
bitStream.Write(i64LeaderZoneID);
|
||||||
@ -783,14 +776,14 @@ void ChatPacketHandler::SendTeamStatus(PlayerData* receiver, LWOOBJID i64LeaderI
|
|||||||
|
|
||||||
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, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(receiver->playerID);
|
bitStream.Write(receiver->playerID);
|
||||||
|
|
||||||
//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(eGameMessageType::TEAM_SET_LEADER);
|
||||||
|
|
||||||
bitStream.Write(i64PlayerID);
|
bitStream.Write(i64PlayerID);
|
||||||
|
|
||||||
@ -800,14 +793,14 @@ void ChatPacketHandler::SendTeamSetLeader(PlayerData* receiver, LWOOBJID i64Play
|
|||||||
|
|
||||||
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, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(receiver->playerID);
|
bitStream.Write(receiver->playerID);
|
||||||
|
|
||||||
//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(eGameMessageType::TEAM_ADD_PLAYER);
|
||||||
|
|
||||||
bitStream.Write(bIsFreeTrial);
|
bitStream.Write(bIsFreeTrial);
|
||||||
bitStream.Write(bLocal);
|
bitStream.Write(bLocal);
|
||||||
@ -829,14 +822,14 @@ void ChatPacketHandler::SendTeamAddPlayer(PlayerData* receiver, bool bIsFreeTria
|
|||||||
|
|
||||||
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, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(receiver->playerID);
|
bitStream.Write(receiver->playerID);
|
||||||
|
|
||||||
//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(eGameMessageType::TEAM_REMOVE_PLAYER);
|
||||||
|
|
||||||
bitStream.Write(bDisband);
|
bitStream.Write(bDisband);
|
||||||
bitStream.Write(bIsKicked);
|
bitStream.Write(bIsKicked);
|
||||||
@ -855,14 +848,14 @@ void ChatPacketHandler::SendTeamRemovePlayer(PlayerData* receiver, bool bDisband
|
|||||||
|
|
||||||
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, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(receiver->playerID);
|
bitStream.Write(receiver->playerID);
|
||||||
|
|
||||||
//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(eGameMessageType::TEAM_SET_OFF_WORLD_FLAG);
|
||||||
|
|
||||||
bitStream.Write(i64PlayerID);
|
bitStream.Write(i64PlayerID);
|
||||||
if (receiver->zoneID.GetCloneID() == zoneID.GetCloneID()) {
|
if (receiver->zoneID.GetCloneID() == zoneID.GetCloneID()) {
|
||||||
@ -889,11 +882,11 @@ void ChatPacketHandler::SendFriendUpdate(PlayerData* friendData, PlayerData* pla
|
|||||||
[bool] - is FTP*/
|
[bool] - is FTP*/
|
||||||
|
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(friendData->playerID);
|
bitStream.Write(friendData->playerID);
|
||||||
|
|
||||||
//portion that will get routed:
|
//portion that will get routed:
|
||||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_UPDATE_FRIEND_NOTIFY);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::UPDATE_FRIEND_NOTIFY);
|
||||||
bitStream.Write<uint8_t>(notifyType);
|
bitStream.Write<uint8_t>(notifyType);
|
||||||
|
|
||||||
std::string playerName = playerData->playerName.c_str();
|
std::string playerName = playerData->playerName.c_str();
|
||||||
@ -928,11 +921,11 @@ void ChatPacketHandler::SendFriendRequest(PlayerData* receiver, PlayerData* send
|
|||||||
}
|
}
|
||||||
|
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(receiver->playerID);
|
bitStream.Write(receiver->playerID);
|
||||||
|
|
||||||
//portion that will get routed:
|
//portion that will get routed:
|
||||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_ADD_FRIEND_REQUEST);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::ADD_FRIEND_REQUEST);
|
||||||
PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream);
|
PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream);
|
||||||
bitStream.Write<uint8_t>(0); // This is a BFF flag however this is unused in live and does not have an implementation client side.
|
bitStream.Write<uint8_t>(0); // This is a BFF flag however this is unused in live and does not have an implementation client side.
|
||||||
|
|
||||||
@ -944,11 +937,11 @@ void ChatPacketHandler::SendFriendResponse(PlayerData* receiver, PlayerData* sen
|
|||||||
if (!receiver || !sender) return;
|
if (!receiver || !sender) return;
|
||||||
|
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(receiver->playerID);
|
bitStream.Write(receiver->playerID);
|
||||||
|
|
||||||
// Portion that will get routed:
|
// Portion that will get routed:
|
||||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_ADD_FRIEND_RESPONSE);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::ADD_FRIEND_RESPONSE);
|
||||||
bitStream.Write(responseCode);
|
bitStream.Write(responseCode);
|
||||||
// For all requests besides accepted, write a flag that says whether or not we are already best friends with the receiver.
|
// For all requests besides accepted, write a flag that says whether or not we are already best friends with the receiver.
|
||||||
bitStream.Write<uint8_t>(responseCode != eAddFriendResponseType::ACCEPTED ? isBestFriendsAlready : sender->sysAddr != UNASSIGNED_SYSTEM_ADDRESS);
|
bitStream.Write<uint8_t>(responseCode != eAddFriendResponseType::ACCEPTED ? isBestFriendsAlready : sender->sysAddr != UNASSIGNED_SYSTEM_ADDRESS);
|
||||||
@ -969,11 +962,11 @@ void ChatPacketHandler::SendRemoveFriend(PlayerData* receiver, std::string& pers
|
|||||||
if (!receiver) return;
|
if (!receiver) return;
|
||||||
|
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
|
||||||
bitStream.Write(receiver->playerID);
|
bitStream.Write(receiver->playerID);
|
||||||
|
|
||||||
//portion that will get routed:
|
//portion that will get routed:
|
||||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_REMOVE_FRIEND_RESPONSE);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::REMOVE_FRIEND_RESPONSE);
|
||||||
bitStream.Write<uint8_t>(isSuccessful); //isOnline
|
bitStream.Write<uint8_t>(isSuccessful); //isOnline
|
||||||
PacketUtils::WritePacketWString(personToRemove, 33, &bitStream);
|
PacketUtils::WritePacketWString(personToRemove, 33, &bitStream);
|
||||||
|
|
||||||
|
@ -9,19 +9,23 @@
|
|||||||
#include "dLogger.h"
|
#include "dLogger.h"
|
||||||
#include "Database.h"
|
#include "Database.h"
|
||||||
#include "dConfig.h"
|
#include "dConfig.h"
|
||||||
#include "dMessageIdentifiers.h"
|
|
||||||
#include "dChatFilter.h"
|
#include "dChatFilter.h"
|
||||||
#include "Diagnostics.h"
|
#include "Diagnostics.h"
|
||||||
#include "AssetManager.h"
|
#include "AssetManager.h"
|
||||||
#include "BinaryPathFinder.h"
|
#include "BinaryPathFinder.h"
|
||||||
|
#include "eConnectionType.h"
|
||||||
#include "PlayerContainer.h"
|
#include "PlayerContainer.h"
|
||||||
#include "ChatPacketHandler.h"
|
#include "ChatPacketHandler.h"
|
||||||
|
#include "eChatMessageType.h"
|
||||||
|
#include "eChatInternalMessageType.h"
|
||||||
|
#include "eWorldMessageType.h"
|
||||||
|
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
|
|
||||||
//RakNet includes:
|
//RakNet includes:
|
||||||
#include "RakNetDefines.h"
|
#include "RakNetDefines.h"
|
||||||
|
#include <MessageIdentifiers.h>
|
||||||
|
|
||||||
namespace Game {
|
namespace Game {
|
||||||
dLogger* logger = nullptr;
|
dLogger* logger = nullptr;
|
||||||
dServer* server = nullptr;
|
dServer* server = nullptr;
|
||||||
@ -68,7 +72,7 @@ int main(int argc, char** argv) {
|
|||||||
Game::assetManager = new AssetManager(clientPath);
|
Game::assetManager = new AssetManager(clientPath);
|
||||||
} catch (std::runtime_error& ex) {
|
} catch (std::runtime_error& ex) {
|
||||||
Game::logger->Log("ChatServer", "Got an error while setting up assets: %s", ex.what());
|
Game::logger->Log("ChatServer", "Got an error while setting up assets: %s", ex.what());
|
||||||
|
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,25 +203,27 @@ void HandlePacket(Packet* packet) {
|
|||||||
Game::logger->Log("ChatServer", "A server is connecting, awaiting user list.");
|
Game::logger->Log("ChatServer", "A server is connecting, awaiting user list.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet->data[1] == CHAT_INTERNAL) {
|
if (packet->length < 4) return; // Nothing left to process. Need 4 bytes to continue.
|
||||||
switch (packet->data[3]) {
|
|
||||||
case MSG_CHAT_INTERNAL_PLAYER_ADDED_NOTIFICATION:
|
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT_INTERNAL) {
|
||||||
|
switch (static_cast<eChatInternalMessageType>(packet->data[3])) {
|
||||||
|
case eChatInternalMessageType::PLAYER_ADDED_NOTIFICATION:
|
||||||
playerContainer.InsertPlayer(packet);
|
playerContainer.InsertPlayer(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION:
|
case eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION:
|
||||||
playerContainer.RemovePlayer(packet);
|
playerContainer.RemovePlayer(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_INTERNAL_MUTE_UPDATE:
|
case eChatInternalMessageType::MUTE_UPDATE:
|
||||||
playerContainer.MuteUpdate(packet);
|
playerContainer.MuteUpdate(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_INTERNAL_CREATE_TEAM:
|
case eChatInternalMessageType::CREATE_TEAM:
|
||||||
playerContainer.CreateTeamServer(packet);
|
playerContainer.CreateTeamServer(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_INTERNAL_ANNOUNCEMENT: {
|
case eChatInternalMessageType::ANNOUNCEMENT: {
|
||||||
//we just forward this packet to every connected server
|
//we just forward this packet to every connected server
|
||||||
CINSTREAM;
|
CINSTREAM;
|
||||||
Game::server->Send(&inStream, packet->systemAddress, true); //send to everyone except origin
|
Game::server->Send(&inStream, packet->systemAddress, true); //send to everyone except origin
|
||||||
@ -229,67 +235,67 @@ void HandlePacket(Packet* packet) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet->data[1] == CHAT) {
|
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT) {
|
||||||
switch (packet->data[3]) {
|
switch (static_cast<eChatMessageType>(packet->data[3])) {
|
||||||
case MSG_CHAT_GET_FRIENDS_LIST:
|
case eChatMessageType::GET_FRIENDS_LIST:
|
||||||
ChatPacketHandler::HandleFriendlistRequest(packet);
|
ChatPacketHandler::HandleFriendlistRequest(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_GET_IGNORE_LIST:
|
case eChatMessageType::GET_IGNORE_LIST:
|
||||||
Game::logger->Log("ChatServer", "Asked for ignore list, but is unimplemented right now.");
|
Game::logger->Log("ChatServer", "Asked for ignore list, but is unimplemented right now.");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_TEAM_GET_STATUS:
|
case eChatMessageType::TEAM_GET_STATUS:
|
||||||
ChatPacketHandler::HandleTeamStatusRequest(packet);
|
ChatPacketHandler::HandleTeamStatusRequest(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_ADD_FRIEND_REQUEST:
|
case eChatMessageType::ADD_FRIEND_REQUEST:
|
||||||
//this involves someone sending the initial request, the response is below, response as in from the other player.
|
//this involves someone sending the initial request, the response is below, response as in from the other player.
|
||||||
//We basically just check to see if this player is online or not and route the packet.
|
//We basically just check to see if this player is online or not and route the packet.
|
||||||
ChatPacketHandler::HandleFriendRequest(packet);
|
ChatPacketHandler::HandleFriendRequest(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_ADD_FRIEND_RESPONSE:
|
case eChatMessageType::ADD_FRIEND_RESPONSE:
|
||||||
//This isn't the response a server sent, rather it is a player's response to a received request.
|
//This isn't the response a server sent, rather it is a player's response to a received request.
|
||||||
//Here, we'll actually have to add them to eachother's friend lists depending on the response code.
|
//Here, we'll actually have to add them to eachother's friend lists depending on the response code.
|
||||||
ChatPacketHandler::HandleFriendResponse(packet);
|
ChatPacketHandler::HandleFriendResponse(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_REMOVE_FRIEND:
|
case eChatMessageType::REMOVE_FRIEND:
|
||||||
ChatPacketHandler::HandleRemoveFriend(packet);
|
ChatPacketHandler::HandleRemoveFriend(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_GENERAL_CHAT_MESSAGE:
|
case eChatMessageType::GENERAL_CHAT_MESSAGE:
|
||||||
ChatPacketHandler::HandleChatMessage(packet);
|
ChatPacketHandler::HandleChatMessage(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_PRIVATE_CHAT_MESSAGE:
|
case eChatMessageType::PRIVATE_CHAT_MESSAGE:
|
||||||
//This message is supposed to be echo'd to both the sender and the receiver
|
//This message is supposed to be echo'd to both the sender and the receiver
|
||||||
//BUT: they have to have different responseCodes, so we'll do some of the ol hacky wacky to fix that right up.
|
//BUT: they have to have different responseCodes, so we'll do some of the ol hacky wacky to fix that right up.
|
||||||
ChatPacketHandler::HandlePrivateChatMessage(packet);
|
ChatPacketHandler::HandlePrivateChatMessage(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_TEAM_INVITE:
|
case eChatMessageType::TEAM_INVITE:
|
||||||
ChatPacketHandler::HandleTeamInvite(packet);
|
ChatPacketHandler::HandleTeamInvite(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_TEAM_INVITE_RESPONSE:
|
case eChatMessageType::TEAM_INVITE_RESPONSE:
|
||||||
ChatPacketHandler::HandleTeamInviteResponse(packet);
|
ChatPacketHandler::HandleTeamInviteResponse(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_TEAM_LEAVE:
|
case eChatMessageType::TEAM_LEAVE:
|
||||||
ChatPacketHandler::HandleTeamLeave(packet);
|
ChatPacketHandler::HandleTeamLeave(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_TEAM_SET_LEADER:
|
case eChatMessageType::TEAM_SET_LEADER:
|
||||||
ChatPacketHandler::HandleTeamPromote(packet);
|
ChatPacketHandler::HandleTeamPromote(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_TEAM_KICK:
|
case eChatMessageType::TEAM_KICK:
|
||||||
ChatPacketHandler::HandleTeamKick(packet);
|
ChatPacketHandler::HandleTeamKick(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHAT_TEAM_SET_LOOT:
|
case eChatMessageType::TEAM_SET_LOOT:
|
||||||
ChatPacketHandler::HandleTeamLootOption(packet);
|
ChatPacketHandler::HandleTeamLootOption(packet);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -298,9 +304,9 @@ void HandlePacket(Packet* packet) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet->data[1] == WORLD) {
|
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::WORLD) {
|
||||||
switch (packet->data[3]) {
|
switch (static_cast<eWorldMessageType>(packet->data[3])) {
|
||||||
case MSG_WORLD_CLIENT_ROUTE_PACKET: {
|
case eWorldMessageType::ROUTE_PACKET: {
|
||||||
Game::logger->Log("ChatServer", "Routing packet from world");
|
Game::logger->Log("ChatServer", "Routing packet from world");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,10 @@
|
|||||||
#include "dLogger.h"
|
#include "dLogger.h"
|
||||||
#include "ChatPacketHandler.h"
|
#include "ChatPacketHandler.h"
|
||||||
#include "GeneralUtils.h"
|
#include "GeneralUtils.h"
|
||||||
#include "dMessageIdentifiers.h"
|
|
||||||
#include "PacketUtils.h"
|
#include "PacketUtils.h"
|
||||||
#include "Database.h"
|
#include "Database.h"
|
||||||
|
#include "eConnectionType.h"
|
||||||
|
#include "eChatInternalMessageType.h"
|
||||||
|
|
||||||
PlayerContainer::PlayerContainer() {
|
PlayerContainer::PlayerContainer() {
|
||||||
}
|
}
|
||||||
@ -18,9 +19,8 @@ PlayerContainer::~PlayerContainer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PlayerContainer::InsertPlayer(Packet* packet) {
|
void PlayerContainer::InsertPlayer(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
PlayerData* data = new PlayerData();
|
PlayerData* data = new PlayerData();
|
||||||
inStream.SetReadOffset(inStream.GetReadOffset() + 64);
|
|
||||||
inStream.Read(data->playerID);
|
inStream.Read(data->playerID);
|
||||||
|
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
@ -51,9 +51,8 @@ void PlayerContainer::InsertPlayer(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PlayerContainer::RemovePlayer(Packet* packet) {
|
void PlayerContainer::RemovePlayer(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID;
|
LWOOBJID playerID;
|
||||||
inStream.Read(playerID); //skip header
|
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
|
|
||||||
//Before they get kicked, we need to also send a message to their friends saying that they disconnected.
|
//Before they get kicked, we need to also send a message to their friends saying that they disconnected.
|
||||||
@ -96,9 +95,8 @@ void PlayerContainer::RemovePlayer(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PlayerContainer::MuteUpdate(Packet* packet) {
|
void PlayerContainer::MuteUpdate(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID;
|
LWOOBJID playerID;
|
||||||
inStream.Read(playerID); //skip header
|
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
time_t expire = 0;
|
time_t expire = 0;
|
||||||
inStream.Read(expire);
|
inStream.Read(expire);
|
||||||
@ -117,9 +115,8 @@ void PlayerContainer::MuteUpdate(Packet* packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PlayerContainer::CreateTeamServer(Packet* packet) {
|
void PlayerContainer::CreateTeamServer(Packet* packet) {
|
||||||
CINSTREAM;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerID;
|
LWOOBJID playerID;
|
||||||
inStream.Read(playerID); //skip header
|
|
||||||
inStream.Read(playerID);
|
inStream.Read(playerID);
|
||||||
size_t membersSize = 0;
|
size_t membersSize = 0;
|
||||||
inStream.Read(membersSize);
|
inStream.Read(membersSize);
|
||||||
@ -149,7 +146,7 @@ void PlayerContainer::CreateTeamServer(Packet* packet) {
|
|||||||
|
|
||||||
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, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::MUTE_UPDATE);
|
||||||
|
|
||||||
bitStream.Write(player);
|
bitStream.Write(player);
|
||||||
bitStream.Write(time);
|
bitStream.Write(time);
|
||||||
@ -348,7 +345,7 @@ void PlayerContainer::TeamStatusUpdate(TeamData* team) {
|
|||||||
|
|
||||||
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, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::TEAM_UPDATE);
|
||||||
|
|
||||||
bitStream.Write(team->teamID);
|
bitStream.Write(team->teamID);
|
||||||
bitStream.Write(deleteTeam);
|
bitStream.Write(deleteTeam);
|
||||||
|
@ -1,77 +1,81 @@
|
|||||||
#include "AMFDeserialize.h"
|
#include "AMFDeserialize.h"
|
||||||
|
|
||||||
#include "AMFFormat.h"
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include "Amf3.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AMF3 Reference document https://rtmp.veriskope.com/pdf/amf3-file-format-spec.pdf
|
* AMF3 Reference document https://rtmp.veriskope.com/pdf/amf3-file-format-spec.pdf
|
||||||
* AMF3 Deserializer written by EmosewaMC
|
* AMF3 Deserializer written by EmosewaMC
|
||||||
*/
|
*/
|
||||||
|
|
||||||
AMFValue* AMFDeserialize::Read(RakNet::BitStream* inStream) {
|
AMFBaseValue* AMFDeserialize::Read(RakNet::BitStream* inStream) {
|
||||||
if (!inStream) return nullptr;
|
if (!inStream) return nullptr;
|
||||||
AMFValue* returnValue = nullptr;
|
AMFBaseValue* returnValue = nullptr;
|
||||||
// Read in the value type from the bitStream
|
// Read in the value type from the bitStream
|
||||||
int8_t marker;
|
uint8_t i;
|
||||||
inStream->Read(marker);
|
inStream->Read(i);
|
||||||
|
if (i > static_cast<uint8_t>(eAmf::Dictionary)) return nullptr;
|
||||||
|
eAmf marker = static_cast<eAmf>(i);
|
||||||
// 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 eAmf::Undefined: {
|
||||||
returnValue = new AMFUndefinedValue();
|
returnValue = new AMFBaseValue();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case AMFValueType::AMFNull: {
|
case eAmf::Null: {
|
||||||
returnValue = new AMFNullValue();
|
returnValue = new AMFNullValue();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case AMFValueType::AMFFalse: {
|
case eAmf::False: {
|
||||||
returnValue = new AMFFalseValue();
|
returnValue = new AMFBoolValue(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case AMFValueType::AMFTrue: {
|
case eAmf::True: {
|
||||||
returnValue = new AMFTrueValue();
|
returnValue = new AMFBoolValue(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case AMFValueType::AMFInteger: {
|
case eAmf::Integer: {
|
||||||
returnValue = ReadAmfInteger(inStream);
|
returnValue = ReadAmfInteger(inStream);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case AMFValueType::AMFDouble: {
|
case eAmf::Double: {
|
||||||
returnValue = ReadAmfDouble(inStream);
|
returnValue = ReadAmfDouble(inStream);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case AMFValueType::AMFString: {
|
case eAmf::String: {
|
||||||
returnValue = ReadAmfString(inStream);
|
returnValue = ReadAmfString(inStream);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case AMFValueType::AMFArray: {
|
case eAmf::Array: {
|
||||||
returnValue = ReadAmfArray(inStream);
|
returnValue = ReadAmfArray(inStream);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO We do not need these values, but if someone wants to implement them
|
// These values are unimplemented in the live client and will remain unimplemented
|
||||||
// then please do so and add the corresponding unit tests.
|
// unless someone modifies the client to allow serializing of these values.
|
||||||
case AMFValueType::AMFXMLDoc:
|
case eAmf::XMLDoc:
|
||||||
case AMFValueType::AMFDate:
|
case eAmf::Date:
|
||||||
case AMFValueType::AMFObject:
|
case eAmf::Object:
|
||||||
case AMFValueType::AMFXML:
|
case eAmf::XML:
|
||||||
case AMFValueType::AMFByteArray:
|
case eAmf::ByteArray:
|
||||||
case AMFValueType::AMFVectorInt:
|
case eAmf::VectorInt:
|
||||||
case AMFValueType::AMFVectorUInt:
|
case eAmf::VectorUInt:
|
||||||
case AMFValueType::AMFVectorDouble:
|
case eAmf::VectorDouble:
|
||||||
case AMFValueType::AMFVectorObject:
|
case eAmf::VectorObject:
|
||||||
case AMFValueType::AMFDictionary: {
|
case eAmf::Dictionary: {
|
||||||
throw static_cast<AMFValueType>(marker);
|
throw marker;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
throw static_cast<AMFValueType>(marker);
|
throw std::invalid_argument("Invalid AMF3 marker" + std::to_string(static_cast<int32_t>(marker)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return returnValue;
|
return returnValue;
|
||||||
@ -99,7 +103,7 @@ uint32_t AMFDeserialize::ReadU29(RakNet::BitStream* inStream) {
|
|||||||
return actualNumber;
|
return actualNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) {
|
const std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) {
|
||||||
auto length = ReadU29(inStream);
|
auto length = ReadU29(inStream);
|
||||||
// Check if this is a reference
|
// Check if this is a reference
|
||||||
bool isReference = length % 2 == 1;
|
bool isReference = length % 2 == 1;
|
||||||
@ -113,48 +117,39 @@ std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) {
|
|||||||
return value;
|
return value;
|
||||||
} else {
|
} else {
|
||||||
// Length is a reference to a previous index - use that as the read in value
|
// Length is a reference to a previous index - use that as the read in value
|
||||||
return accessedElements[length];
|
return accessedElements.at(length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AMFValue* AMFDeserialize::ReadAmfDouble(RakNet::BitStream* inStream) {
|
AMFBaseValue* AMFDeserialize::ReadAmfDouble(RakNet::BitStream* inStream) {
|
||||||
auto doubleValue = new AMFDoubleValue();
|
|
||||||
double value;
|
double value;
|
||||||
inStream->Read<double>(value);
|
inStream->Read<double>(value);
|
||||||
doubleValue->SetDoubleValue(value);
|
return new AMFDoubleValue(value);
|
||||||
return doubleValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AMFValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream* inStream) {
|
AMFBaseValue* 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 associative 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 associative values when we encounter an empty string key
|
||||||
if (key.size() == 0) break;
|
if (key.size() == 0) break;
|
||||||
arrayValue->InsertValue(key, Read(inStream));
|
arrayValue->Insert(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->Insert(i, Read(inStream));
|
||||||
}
|
}
|
||||||
|
|
||||||
return arrayValue;
|
return arrayValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
AMFValue* AMFDeserialize::ReadAmfString(RakNet::BitStream* inStream) {
|
AMFBaseValue* AMFDeserialize::ReadAmfString(RakNet::BitStream* inStream) {
|
||||||
auto stringValue = new AMFStringValue();
|
return new AMFStringValue(ReadString(inStream));
|
||||||
stringValue->SetStringValue(ReadString(inStream));
|
|
||||||
return stringValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AMFValue* AMFDeserialize::ReadAmfInteger(RakNet::BitStream* inStream) {
|
AMFBaseValue* AMFDeserialize::ReadAmfInteger(RakNet::BitStream* inStream) {
|
||||||
auto integerValue = new AMFIntegerValue();
|
return new AMFIntValue(ReadU29(inStream));
|
||||||
integerValue->SetIntegerValue(ReadU29(inStream));
|
|
||||||
return integerValue;
|
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,8 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class AMFValue;
|
class AMFBaseValue;
|
||||||
|
|
||||||
class AMFDeserialize {
|
class AMFDeserialize {
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
@ -14,7 +15,7 @@ public:
|
|||||||
* @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);
|
AMFBaseValue* 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
|
||||||
@ -30,7 +31,7 @@ private:
|
|||||||
* @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);
|
const std::string ReadString(RakNet::BitStream* inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read an AMFDouble value from a bitStream
|
* @brief Read an AMFDouble value from a bitStream
|
||||||
@ -38,7 +39,7 @@ private:
|
|||||||
* @param inStream bitStream to read data from
|
* @param inStream bitStream to read data from
|
||||||
* @return Double value represented as an AMFValue
|
* @return Double value represented as an AMFValue
|
||||||
*/
|
*/
|
||||||
AMFValue* ReadAmfDouble(RakNet::BitStream* inStream);
|
AMFBaseValue* ReadAmfDouble(RakNet::BitStream* inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read an AMFArray from a bitStream
|
* @brief Read an AMFArray from a bitStream
|
||||||
@ -46,7 +47,7 @@ private:
|
|||||||
* @param inStream bitStream to read data from
|
* @param inStream bitStream to read data from
|
||||||
* @return Array value represented as an AMFValue
|
* @return Array value represented as an AMFValue
|
||||||
*/
|
*/
|
||||||
AMFValue* ReadAmfArray(RakNet::BitStream* inStream);
|
AMFBaseValue* ReadAmfArray(RakNet::BitStream* inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read an AMFString from a bitStream
|
* @brief Read an AMFString from a bitStream
|
||||||
@ -54,7 +55,7 @@ private:
|
|||||||
* @param inStream bitStream to read data from
|
* @param inStream bitStream to read data from
|
||||||
* @return String value represented as an AMFValue
|
* @return String value represented as an AMFValue
|
||||||
*/
|
*/
|
||||||
AMFValue* ReadAmfString(RakNet::BitStream* inStream);
|
AMFBaseValue* ReadAmfString(RakNet::BitStream* inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read an AMFInteger from a bitStream
|
* @brief Read an AMFInteger from a bitStream
|
||||||
@ -62,7 +63,7 @@ private:
|
|||||||
* @param inStream bitStream to read data from
|
* @param inStream bitStream to read data from
|
||||||
* @return Integer value represented as an AMFValue
|
* @return Integer value represented as an AMFValue
|
||||||
*/
|
*/
|
||||||
AMFValue* ReadAmfInteger(RakNet::BitStream* inStream);
|
AMFBaseValue* ReadAmfInteger(RakNet::BitStream* inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of strings read so far saved to be read by reference.
|
* List of strings read so far saved to be read by reference.
|
||||||
|
@ -1,156 +0,0 @@
|
|||||||
#include "AMFFormat.h"
|
|
||||||
|
|
||||||
// AMFInteger
|
|
||||||
void AMFIntegerValue::SetIntegerValue(uint32_t value) {
|
|
||||||
this->value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t AMFIntegerValue::GetIntegerValue() {
|
|
||||||
return this->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFDouble
|
|
||||||
void AMFDoubleValue::SetDoubleValue(double value) {
|
|
||||||
this->value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
double AMFDoubleValue::GetDoubleValue() {
|
|
||||||
return this->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFString
|
|
||||||
void AMFStringValue::SetStringValue(const std::string& value) {
|
|
||||||
this->value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string AMFStringValue::GetStringValue() {
|
|
||||||
return this->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFXMLDoc
|
|
||||||
void AMFXMLDocValue::SetXMLDocValue(const std::string& value) {
|
|
||||||
this->xmlData = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string AMFXMLDocValue::GetXMLDocValue() {
|
|
||||||
return this->xmlData;
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFDate
|
|
||||||
void AMFDateValue::SetDateValue(uint64_t value) {
|
|
||||||
this->millisecondTimestamp = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t AMFDateValue::GetDateValue() {
|
|
||||||
return this->millisecondTimestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFArray Insert Value
|
|
||||||
void AMFArrayValue::InsertValue(const std::string& key, AMFValue* value) {
|
|
||||||
this->associative.insert(std::make_pair(key, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFArray Remove Value
|
|
||||||
void AMFArrayValue::RemoveValue(const std::string& key) {
|
|
||||||
_AMFArrayMap_::iterator it = this->associative.find(key);
|
|
||||||
if (it != this->associative.end()) {
|
|
||||||
this->associative.erase(it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFArray Get Associative Iterator Begin
|
|
||||||
_AMFArrayMap_::iterator AMFArrayValue::GetAssociativeIteratorValueBegin() {
|
|
||||||
return this->associative.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFArray Get Associative Iterator End
|
|
||||||
_AMFArrayMap_::iterator AMFArrayValue::GetAssociativeIteratorValueEnd() {
|
|
||||||
return this->associative.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFArray Push Back Value
|
|
||||||
void AMFArrayValue::PushBackValue(AMFValue* value) {
|
|
||||||
this->dense.push_back(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFArray Pop Back Value
|
|
||||||
void AMFArrayValue::PopBackValue() {
|
|
||||||
this->dense.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFArray Get Dense List Size
|
|
||||||
uint32_t AMFArrayValue::GetDenseValueSize() {
|
|
||||||
return (uint32_t)this->dense.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFArray Get Dense Iterator Begin
|
|
||||||
_AMFArrayList_::iterator AMFArrayValue::GetDenseIteratorBegin() {
|
|
||||||
return this->dense.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFArray Get Dense Iterator End
|
|
||||||
_AMFArrayList_::iterator AMFArrayValue::GetDenseIteratorEnd() {
|
|
||||||
return this->dense.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
AMFArrayValue::~AMFArrayValue() {
|
|
||||||
for (auto valueToDelete : GetDenseArray()) {
|
|
||||||
if (valueToDelete) delete valueToDelete;
|
|
||||||
}
|
|
||||||
for (auto valueToDelete : GetAssociativeMap()) {
|
|
||||||
if (valueToDelete.second) delete valueToDelete.second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFObject Constructor
|
|
||||||
AMFObjectValue::AMFObjectValue(std::vector<std::pair<std::string, AMFValueType>> traits) {
|
|
||||||
this->traits.reserve(traits.size());
|
|
||||||
std::vector<std::pair<std::string, AMFValueType>>::iterator it = traits.begin();
|
|
||||||
while (it != traits.end()) {
|
|
||||||
this->traits.insert(std::make_pair(it->first, std::make_pair(it->second, new AMFNullValue())));
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFObject Set Value
|
|
||||||
void AMFObjectValue::SetTraitValue(const std::string& trait, AMFValue* value) {
|
|
||||||
if (value) {
|
|
||||||
_AMFObjectTraits_::iterator it = this->traits.find(trait);
|
|
||||||
if (it != this->traits.end()) {
|
|
||||||
if (it->second.first == value->GetValueType()) {
|
|
||||||
it->second.second = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFObject Get Value
|
|
||||||
AMFValue* AMFObjectValue::GetTraitValue(const std::string& trait) {
|
|
||||||
_AMFObjectTraits_::iterator it = this->traits.find(trait);
|
|
||||||
if (it != this->traits.end()) {
|
|
||||||
return it->second.second;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFObject Get Trait Iterator Begin
|
|
||||||
_AMFObjectTraits_::iterator AMFObjectValue::GetTraitsIteratorBegin() {
|
|
||||||
return this->traits.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFObject Get Trait Iterator End
|
|
||||||
_AMFObjectTraits_::iterator AMFObjectValue::GetTraitsIteratorEnd() {
|
|
||||||
return this->traits.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
// AMFObject Get Trait Size
|
|
||||||
uint32_t AMFObjectValue::GetTraitArrayCount() {
|
|
||||||
return (uint32_t)this->traits.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
AMFObjectValue::~AMFObjectValue() {
|
|
||||||
for (auto valueToDelete = GetTraitsIteratorBegin(); valueToDelete != GetTraitsIteratorEnd(); valueToDelete++) {
|
|
||||||
if (valueToDelete->second.second) delete valueToDelete->second.second;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,413 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
// Custom Classes
|
|
||||||
#include "dCommonVars.h"
|
|
||||||
|
|
||||||
// C++
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\file AMFFormat.hpp
|
|
||||||
\brief A class for managing AMF values
|
|
||||||
*/
|
|
||||||
|
|
||||||
class AMFValue; // Forward declaration
|
|
||||||
|
|
||||||
// Definitions
|
|
||||||
#define _AMFArrayMap_ std::unordered_map<std::string, AMFValue*>
|
|
||||||
#define _AMFArrayList_ std::vector<AMFValue*>
|
|
||||||
|
|
||||||
#define _AMFObjectTraits_ std::unordered_map<std::string, std::pair<AMFValueType, AMFValue*>>
|
|
||||||
#define _AMFObjectDynamicTraits_ std::unordered_map<std::string, AMFValue*>
|
|
||||||
|
|
||||||
//! An enum for each AMF value type
|
|
||||||
enum AMFValueType : unsigned char {
|
|
||||||
AMFUndefined = 0x00, //!< An undefined AMF Value
|
|
||||||
AMFNull = 0x01, //!< A null AMF value
|
|
||||||
AMFFalse = 0x02, //!< A false AMF value
|
|
||||||
AMFTrue = 0x03, //!< A true AMF value
|
|
||||||
AMFInteger = 0x04, //!< An integer AMF value
|
|
||||||
AMFDouble = 0x05, //!< A double AMF value
|
|
||||||
AMFString = 0x06, //!< A string AMF value
|
|
||||||
AMFXMLDoc = 0x07, //!< An XML Doc AMF value
|
|
||||||
AMFDate = 0x08, //!< A date AMF value
|
|
||||||
AMFArray = 0x09, //!< An array AMF value
|
|
||||||
AMFObject = 0x0A, //!< An object AMF value
|
|
||||||
AMFXML = 0x0B, //!< An XML AMF value
|
|
||||||
AMFByteArray = 0x0C, //!< A byte array AMF value
|
|
||||||
AMFVectorInt = 0x0D, //!< An integer vector AMF value
|
|
||||||
AMFVectorUInt = 0x0E, //!< An unsigned integer AMF value
|
|
||||||
AMFVectorDouble = 0x0F, //!< A double vector AMF value
|
|
||||||
AMFVectorObject = 0x10, //!< An object vector AMF value
|
|
||||||
AMFDictionary = 0x11 //!< A dictionary AMF value
|
|
||||||
};
|
|
||||||
|
|
||||||
//! An enum for the object value types
|
|
||||||
enum AMFObjectValueType : unsigned char {
|
|
||||||
AMFObjectAnonymous = 0x01,
|
|
||||||
AMFObjectTyped = 0x02,
|
|
||||||
AMFObjectDynamic = 0x03,
|
|
||||||
AMFObjectExternalizable = 0x04
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The base AMF value class
|
|
||||||
class AMFValue {
|
|
||||||
public:
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
virtual AMFValueType GetValueType() = 0;
|
|
||||||
virtual ~AMFValue() {};
|
|
||||||
};
|
|
||||||
|
|
||||||
//! A typedef for a pointer to an AMF value
|
|
||||||
typedef AMFValue* NDGFxValue;
|
|
||||||
|
|
||||||
|
|
||||||
// The various AMF value types
|
|
||||||
|
|
||||||
//! The undefined value AMF type
|
|
||||||
class AMFUndefinedValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() { return ValueType; }
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFUndefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The null value AMF type
|
|
||||||
class AMFNullValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() { return ValueType; }
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFNull;
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The false value AMF type
|
|
||||||
class AMFFalseValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() { return ValueType; }
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFFalse;
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The true value AMF type
|
|
||||||
class AMFTrueValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() { return ValueType; }
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFTrue;
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The integer value AMF type
|
|
||||||
class AMFIntegerValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
uint32_t value; //!< The value of the AMF type
|
|
||||||
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() { return ValueType; }
|
|
||||||
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFInteger;
|
|
||||||
//! Sets the integer value
|
|
||||||
/*!
|
|
||||||
\param value The value to set
|
|
||||||
*/
|
|
||||||
void SetIntegerValue(uint32_t value);
|
|
||||||
|
|
||||||
//! Gets the integer value
|
|
||||||
/*!
|
|
||||||
\return The integer value
|
|
||||||
*/
|
|
||||||
uint32_t GetIntegerValue();
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The double value AMF type
|
|
||||||
class AMFDoubleValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
double value; //!< The value of the AMF type
|
|
||||||
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() { return ValueType; }
|
|
||||||
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFDouble;
|
|
||||||
//! Sets the double value
|
|
||||||
/*!
|
|
||||||
\param value The value to set to
|
|
||||||
*/
|
|
||||||
void SetDoubleValue(double value);
|
|
||||||
|
|
||||||
//! Gets the double value
|
|
||||||
/*!
|
|
||||||
\return The double value
|
|
||||||
*/
|
|
||||||
double GetDoubleValue();
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The string value AMF type
|
|
||||||
class AMFStringValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
std::string value; //!< The value of the AMF type
|
|
||||||
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() { return ValueType; }
|
|
||||||
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFString;
|
|
||||||
//! Sets the string value
|
|
||||||
/*!
|
|
||||||
\param value The string value to set to
|
|
||||||
*/
|
|
||||||
void SetStringValue(const std::string& value);
|
|
||||||
|
|
||||||
//! Gets the string value
|
|
||||||
/*!
|
|
||||||
\return The string value
|
|
||||||
*/
|
|
||||||
std::string GetStringValue();
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The XML doc value AMF type
|
|
||||||
class AMFXMLDocValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
std::string xmlData; //!< The value of the AMF type
|
|
||||||
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() { return ValueType; }
|
|
||||||
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFXMLDoc;
|
|
||||||
//! Sets the XML Doc value
|
|
||||||
/*!
|
|
||||||
\param value The value to set to
|
|
||||||
*/
|
|
||||||
void SetXMLDocValue(const std::string& value);
|
|
||||||
|
|
||||||
//! Gets the XML Doc value
|
|
||||||
/*!
|
|
||||||
\return The XML Doc value
|
|
||||||
*/
|
|
||||||
std::string GetXMLDocValue();
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The date value AMF type
|
|
||||||
class AMFDateValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
uint64_t millisecondTimestamp; //!< The time in milliseconds since the ephoch
|
|
||||||
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() { return ValueType; }
|
|
||||||
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFDate;
|
|
||||||
//! Sets the date time
|
|
||||||
/*!
|
|
||||||
\param value The value to set to
|
|
||||||
*/
|
|
||||||
void SetDateValue(uint64_t value);
|
|
||||||
|
|
||||||
//! Gets the date value
|
|
||||||
/*!
|
|
||||||
\return The date value in milliseconds since the epoch
|
|
||||||
*/
|
|
||||||
uint64_t GetDateValue();
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The array value AMF type
|
|
||||||
// This object will manage it's own memory map and list. Do not delete its values.
|
|
||||||
class AMFArrayValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
_AMFArrayMap_ associative; //!< The array map (associative part)
|
|
||||||
_AMFArrayList_ dense; //!< The array list (dense part)
|
|
||||||
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() override { return ValueType; }
|
|
||||||
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFArray;
|
|
||||||
|
|
||||||
~AMFArrayValue() override;
|
|
||||||
//! Inserts an item into the array map for a specific key
|
|
||||||
/*!
|
|
||||||
\param key The key to set
|
|
||||||
\param value The value to add
|
|
||||||
*/
|
|
||||||
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
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
T* FindValue(const std::string& key) const {
|
|
||||||
_AMFArrayMap_::const_iterator it = this->associative.find(key);
|
|
||||||
if (it != this->associative.end() && T::ValueType == it->second->GetValueType()) {
|
|
||||||
return dynamic_cast<T*>(it->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
//! 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
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
T* GetValueAt(uint32_t index) {
|
|
||||||
if (index >= this->dense.size()) return nullptr;
|
|
||||||
AMFValue* foundValue = this->dense.at(index);
|
|
||||||
return T::ValueType == foundValue->GetValueType() ? dynamic_cast<T*>(foundValue) : nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
//! 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
|
|
||||||
class AMFObjectValue : public AMFValue {
|
|
||||||
private:
|
|
||||||
_AMFObjectTraits_ traits; //!< The object traits
|
|
||||||
|
|
||||||
//! Returns the AMF value type
|
|
||||||
/*!
|
|
||||||
\return The AMF value type
|
|
||||||
*/
|
|
||||||
AMFValueType GetValueType() override { return ValueType; }
|
|
||||||
~AMFObjectValue() override;
|
|
||||||
|
|
||||||
public:
|
|
||||||
static const AMFValueType ValueType = AMFObject;
|
|
||||||
//! Constructor
|
|
||||||
/*!
|
|
||||||
\param traits The traits to set
|
|
||||||
*/
|
|
||||||
AMFObjectValue(std::vector<std::pair<std::string, AMFValueType>> traits);
|
|
||||||
|
|
||||||
//! Gets the object value type
|
|
||||||
/*!
|
|
||||||
\return The object value type
|
|
||||||
*/
|
|
||||||
virtual AMFObjectValueType GetObjectValueType() { return AMFObjectAnonymous; }
|
|
||||||
|
|
||||||
//! Sets the value of a trait
|
|
||||||
/*!
|
|
||||||
\param trait The trait to set the value for
|
|
||||||
\param value The AMF value to set
|
|
||||||
*/
|
|
||||||
void SetTraitValue(const std::string& trait, AMFValue* value);
|
|
||||||
|
|
||||||
//! Gets a trait value
|
|
||||||
/*!
|
|
||||||
\param trait The trait to get the value for
|
|
||||||
\return The trait value
|
|
||||||
*/
|
|
||||||
AMFValue* GetTraitValue(const std::string& trait);
|
|
||||||
|
|
||||||
//! Gets the beginning of the object traits iterator
|
|
||||||
/*!
|
|
||||||
\return The AMF trait array iterator begin
|
|
||||||
*/
|
|
||||||
_AMFObjectTraits_::iterator GetTraitsIteratorBegin();
|
|
||||||
|
|
||||||
//! Gets the end of the object traits iterator
|
|
||||||
/*!
|
|
||||||
\return The AMF trait array iterator begin
|
|
||||||
*/
|
|
||||||
_AMFObjectTraits_::iterator GetTraitsIteratorEnd();
|
|
||||||
|
|
||||||
//! Gets the amount of traits
|
|
||||||
/*!
|
|
||||||
\return The amount of traits
|
|
||||||
*/
|
|
||||||
uint32_t GetTraitArrayCount();
|
|
||||||
};
|
|
@ -1,250 +0,0 @@
|
|||||||
#include "AMFFormat_BitStream.h"
|
|
||||||
|
|
||||||
// Writes an AMFValue pointer to a RakNet::BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFValue*>(AMFValue* value) {
|
|
||||||
if (value != nullptr) {
|
|
||||||
AMFValueType type = value->GetValueType();
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case AMFUndefined: {
|
|
||||||
AMFUndefinedValue* v = (AMFUndefinedValue*)value;
|
|
||||||
this->Write(*v);
|
|
||||||
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: {
|
|
||||||
AMFDoubleValue* v = (AMFDoubleValue*)value;
|
|
||||||
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
|
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
|
||||||
*/
|
|
||||||
void WriteUInt29(RakNet::BitStream* bs, uint32_t v) {
|
|
||||||
unsigned char b4 = (unsigned char)v;
|
|
||||||
if (v < 0x00200000) {
|
|
||||||
b4 = b4 & 0x7F;
|
|
||||||
if (v > 0x7F) {
|
|
||||||
unsigned char b3;
|
|
||||||
v = v >> 7;
|
|
||||||
b3 = ((unsigned char)(v)) | 0x80;
|
|
||||||
if (v > 0x7F) {
|
|
||||||
unsigned char b2;
|
|
||||||
v = v >> 7;
|
|
||||||
b2 = ((unsigned char)(v)) | 0x80;
|
|
||||||
bs->Write(b2);
|
|
||||||
}
|
|
||||||
|
|
||||||
bs->Write(b3);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
unsigned char b1;
|
|
||||||
unsigned char b2;
|
|
||||||
unsigned char b3;
|
|
||||||
|
|
||||||
v = v >> 8;
|
|
||||||
b3 = ((unsigned char)(v)) | 0x80;
|
|
||||||
v = v >> 7;
|
|
||||||
b2 = ((unsigned char)(v)) | 0x80;
|
|
||||||
v = v >> 7;
|
|
||||||
b1 = ((unsigned char)(v)) | 0x80;
|
|
||||||
|
|
||||||
bs->Write(b1);
|
|
||||||
bs->Write(b2);
|
|
||||||
bs->Write(b3);
|
|
||||||
}
|
|
||||||
|
|
||||||
bs->Write(b4);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes a flag number to a RakNet::BitStream
|
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
|
||||||
*/
|
|
||||||
void WriteFlagNumber(RakNet::BitStream* bs, uint32_t v) {
|
|
||||||
v = (v << 1) | 0x01;
|
|
||||||
WriteUInt29(bs, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes an AMFString to a RakNet::BitStream
|
|
||||||
*
|
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
|
||||||
*/
|
|
||||||
void WriteAMFString(RakNet::BitStream* bs, const std::string& str) {
|
|
||||||
WriteFlagNumber(bs, (uint32_t)str.size());
|
|
||||||
bs->Write(str.c_str(), (uint32_t)str.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes an U16 to a bitstream
|
|
||||||
*
|
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
|
||||||
*/
|
|
||||||
void WriteAMFU16(RakNet::BitStream* bs, uint16_t value) {
|
|
||||||
bs->Write(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes an U32 to a bitstream
|
|
||||||
*
|
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
|
||||||
*/
|
|
||||||
void WriteAMFU32(RakNet::BitStream* bs, uint32_t value) {
|
|
||||||
bs->Write(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes an U64 to a bitstream
|
|
||||||
*
|
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
|
||||||
*/
|
|
||||||
void WriteAMFU64(RakNet::BitStream* bs, uint64_t value) {
|
|
||||||
bs->Write(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Writes an AMFUndefinedValue to BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFUndefinedValue>(AMFUndefinedValue value) {
|
|
||||||
this->Write(AMFUndefined);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes an AMFNullValue to BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFNullValue>(AMFNullValue value) {
|
|
||||||
this->Write(AMFNull);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes an AMFFalseValue to BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFFalseValue>(AMFFalseValue value) {
|
|
||||||
this->Write(AMFFalse);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes an AMFTrueValue to BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFTrueValue>(AMFTrueValue value) {
|
|
||||||
this->Write(AMFTrue);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes an AMFIntegerValue to BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFIntegerValue>(AMFIntegerValue value) {
|
|
||||||
this->Write(AMFInteger);
|
|
||||||
WriteUInt29(this, value.GetIntegerValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes an AMFDoubleValue to BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFDoubleValue>(AMFDoubleValue value) {
|
|
||||||
this->Write(AMFDouble);
|
|
||||||
double d = value.GetDoubleValue();
|
|
||||||
WriteAMFU64(this, *((unsigned long long*) & d));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes an AMFStringValue to BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFStringValue>(AMFStringValue value) {
|
|
||||||
this->Write(AMFString);
|
|
||||||
std::string v = value.GetStringValue();
|
|
||||||
WriteAMFString(this, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes an AMFXMLDocValue to BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFXMLDocValue>(AMFXMLDocValue value) {
|
|
||||||
this->Write(AMFXMLDoc);
|
|
||||||
std::string v = value.GetXMLDocValue();
|
|
||||||
WriteAMFString(this, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes an AMFDateValue to BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFDateValue>(AMFDateValue value) {
|
|
||||||
this->Write(AMFDate);
|
|
||||||
uint64_t date = value.GetDateValue();
|
|
||||||
WriteAMFU64(this, date);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes an AMFArrayValue to BitStream
|
|
||||||
template<>
|
|
||||||
void RakNet::BitStream::Write<AMFArrayValue*>(AMFArrayValue* value) {
|
|
||||||
this->Write(AMFArray);
|
|
||||||
uint32_t denseSize = value->GetDenseValueSize();
|
|
||||||
WriteFlagNumber(this, denseSize);
|
|
||||||
|
|
||||||
_AMFArrayMap_::iterator it = value->GetAssociativeIteratorValueBegin();
|
|
||||||
_AMFArrayMap_::iterator end = value->GetAssociativeIteratorValueEnd();
|
|
||||||
|
|
||||||
while (it != end) {
|
|
||||||
WriteAMFString(this, it->first);
|
|
||||||
this->Write(it->second);
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
|
|
||||||
this->Write(AMFNull);
|
|
||||||
|
|
||||||
if (denseSize > 0) {
|
|
||||||
_AMFArrayList_::iterator it2 = value->GetDenseIteratorBegin();
|
|
||||||
_AMFArrayList_::iterator end2 = value->GetDenseIteratorEnd();
|
|
||||||
|
|
||||||
while (it2 != end2) {
|
|
||||||
this->Write(*it2);
|
|
||||||
it2++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,92 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
// Custom Classes
|
|
||||||
#include "AMFFormat.h"
|
|
||||||
|
|
||||||
// RakNet
|
|
||||||
#include <BitStream.h>
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\file AMFFormat_BitStream.h
|
|
||||||
\brief A class that implements native writing of AMF values to RakNet::BitStream
|
|
||||||
*/
|
|
||||||
|
|
||||||
// We are using the RakNet namespace
|
|
||||||
namespace RakNet {
|
|
||||||
//! Writes an AMFValue pointer to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFValue*>(AMFValue* value);
|
|
||||||
|
|
||||||
//! Writes an AMFUndefinedValue to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFUndefinedValue>(AMFUndefinedValue value);
|
|
||||||
|
|
||||||
//! Writes an AMFNullValue to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFNullValue>(AMFNullValue value);
|
|
||||||
|
|
||||||
//! Writes an AMFFalseValue to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFFalseValue>(AMFFalseValue value);
|
|
||||||
|
|
||||||
//! Writes an AMFTrueValue to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFTrueValue>(AMFTrueValue value);
|
|
||||||
|
|
||||||
//! Writes an AMFIntegerValue to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFIntegerValue>(AMFIntegerValue value);
|
|
||||||
|
|
||||||
//! Writes an AMFDoubleValue to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFDoubleValue>(AMFDoubleValue value);
|
|
||||||
|
|
||||||
//! Writes an AMFStringValue to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFStringValue>(AMFStringValue value);
|
|
||||||
|
|
||||||
//! Writes an AMFXMLDocValue to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFXMLDocValue>(AMFXMLDocValue value);
|
|
||||||
|
|
||||||
//! Writes an AMFDateValue to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFDateValue>(AMFDateValue value);
|
|
||||||
|
|
||||||
//! Writes an AMFArrayValue to a RakNet::BitStream
|
|
||||||
/*!
|
|
||||||
\param value The value to write
|
|
||||||
*/
|
|
||||||
template <>
|
|
||||||
void RakNet::BitStream::Write<AMFArrayValue*>(AMFArrayValue* value);
|
|
||||||
} // namespace RakNet
|
|
368
dCommon/Amf3.h
Normal file
368
dCommon/Amf3.h
Normal file
@ -0,0 +1,368 @@
|
|||||||
|
#ifndef __AMF3__H__
|
||||||
|
#define __AMF3__H__
|
||||||
|
|
||||||
|
#include "dCommonVars.h"
|
||||||
|
#include "dLogger.h"
|
||||||
|
#include "Game.h"
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
enum class eAmf : uint8_t {
|
||||||
|
Undefined = 0x00, // An undefined AMF Value
|
||||||
|
Null = 0x01, // A null AMF value
|
||||||
|
False = 0x02, // A false AMF value
|
||||||
|
True = 0x03, // A true AMF value
|
||||||
|
Integer = 0x04, // An integer AMF value
|
||||||
|
Double = 0x05, // A double AMF value
|
||||||
|
String = 0x06, // A string AMF value
|
||||||
|
XMLDoc = 0x07, // Unused in the live client and cannot be serialized without modification. An XML Doc AMF value
|
||||||
|
Date = 0x08, // Unused in the live client and cannot be serialized without modification. A date AMF value
|
||||||
|
Array = 0x09, // An array AMF value
|
||||||
|
Object = 0x0A, // Unused in the live client and cannot be serialized without modification. An object AMF value
|
||||||
|
XML = 0x0B, // Unused in the live client and cannot be serialized without modification. An XML AMF value
|
||||||
|
ByteArray = 0x0C, // Unused in the live client and cannot be serialized without modification. A byte array AMF value
|
||||||
|
VectorInt = 0x0D, // Unused in the live client and cannot be serialized without modification. An integer vector AMF value
|
||||||
|
VectorUInt = 0x0E, // Unused in the live client and cannot be serialized without modification. An unsigned integer AMF value
|
||||||
|
VectorDouble = 0x0F, // Unused in the live client and cannot be serialized without modification. A double vector AMF value
|
||||||
|
VectorObject = 0x10, // Unused in the live client and cannot be serialized without modification. An object vector AMF value
|
||||||
|
Dictionary = 0x11 // Unused in the live client and cannot be serialized without modification. A dictionary AMF value
|
||||||
|
};
|
||||||
|
|
||||||
|
class AMFBaseValue {
|
||||||
|
public:
|
||||||
|
virtual eAmf GetValueType() { return eAmf::Undefined; };
|
||||||
|
AMFBaseValue() {};
|
||||||
|
virtual ~AMFBaseValue() {};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename ValueType>
|
||||||
|
class AMFValue : public AMFBaseValue {
|
||||||
|
public:
|
||||||
|
AMFValue() {};
|
||||||
|
AMFValue(ValueType value) { SetValue(value); };
|
||||||
|
virtual ~AMFValue() override {};
|
||||||
|
|
||||||
|
eAmf GetValueType() override { return eAmf::Undefined; };
|
||||||
|
|
||||||
|
const ValueType& GetValue() { return data; };
|
||||||
|
void SetValue(ValueType value) { data = value; };
|
||||||
|
protected:
|
||||||
|
ValueType data;
|
||||||
|
};
|
||||||
|
|
||||||
|
// As a string this is much easier to write and read from a BitStream.
|
||||||
|
template<>
|
||||||
|
class AMFValue<const char*> : public AMFBaseValue {
|
||||||
|
public:
|
||||||
|
AMFValue() {};
|
||||||
|
AMFValue(const char* value) { SetValue(std::string(value)); };
|
||||||
|
virtual ~AMFValue() override {};
|
||||||
|
|
||||||
|
eAmf GetValueType() override { return eAmf::String; };
|
||||||
|
|
||||||
|
const std::string& GetValue() { return data; };
|
||||||
|
void SetValue(std::string value) { data = value; };
|
||||||
|
protected:
|
||||||
|
std::string data;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef AMFValue<std::nullptr_t> AMFNullValue;
|
||||||
|
typedef AMFValue<bool> AMFBoolValue;
|
||||||
|
typedef AMFValue<int32_t> AMFIntValue;
|
||||||
|
typedef AMFValue<std::string> AMFStringValue;
|
||||||
|
typedef AMFValue<double> AMFDoubleValue;
|
||||||
|
|
||||||
|
template<> inline eAmf AMFValue<std::nullptr_t>::GetValueType() { return eAmf::Null; };
|
||||||
|
template<> inline eAmf AMFValue<bool>::GetValueType() { return this->data ? eAmf::True : eAmf::False; };
|
||||||
|
template<> inline eAmf AMFValue<int32_t>::GetValueType() { return eAmf::Integer; };
|
||||||
|
template<> inline eAmf AMFValue<uint32_t>::GetValueType() { return eAmf::Integer; };
|
||||||
|
template<> inline eAmf AMFValue<std::string>::GetValueType() { return eAmf::String; };
|
||||||
|
template<> inline eAmf AMFValue<double>::GetValueType() { return eAmf::Double; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The AMFArrayValue object holds 2 types of lists:
|
||||||
|
* An associative list where a key maps to a value
|
||||||
|
* A Dense list where elements are stored back to back
|
||||||
|
*
|
||||||
|
* Objects that are Registered are owned by this object
|
||||||
|
* and are not to be deleted by a caller.
|
||||||
|
*/
|
||||||
|
class AMFArrayValue : public AMFBaseValue {
|
||||||
|
|
||||||
|
typedef std::unordered_map<std::string, AMFBaseValue*> AMFAssociative;
|
||||||
|
typedef std::vector<AMFBaseValue*> AMFDense;
|
||||||
|
|
||||||
|
public:
|
||||||
|
eAmf GetValueType() override { return eAmf::Array; };
|
||||||
|
|
||||||
|
~AMFArrayValue() override {
|
||||||
|
for (auto valueToDelete : GetDense()) {
|
||||||
|
if (valueToDelete) {
|
||||||
|
delete valueToDelete;
|
||||||
|
valueToDelete = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (auto valueToDelete : GetAssociative()) {
|
||||||
|
if (valueToDelete.second) {
|
||||||
|
delete valueToDelete.second;
|
||||||
|
valueToDelete.second = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Associative portion of the object
|
||||||
|
*/
|
||||||
|
inline AMFAssociative& GetAssociative() { return this->associative; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the dense portion of the object
|
||||||
|
*/
|
||||||
|
inline AMFDense& GetDense() { return this->dense; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts an AMFValue into the associative portion with the given key.
|
||||||
|
* If a duplicate is attempted to be inserted, it is ignored and the
|
||||||
|
* first value with that key is kept in the map.
|
||||||
|
*
|
||||||
|
* These objects are not to be deleted by the caller as they are owned by
|
||||||
|
* the AMFArray object which manages its own memory.
|
||||||
|
*
|
||||||
|
* @param key The key to associate with the value
|
||||||
|
* @param value The value to insert
|
||||||
|
*
|
||||||
|
* @return The inserted element if the type matched,
|
||||||
|
* or nullptr if a key existed and was not the same type
|
||||||
|
*/
|
||||||
|
template<typename ValueType>
|
||||||
|
std::pair<AMFValue<ValueType>*, bool> Insert(const std::string& key, ValueType value) {
|
||||||
|
auto element = associative.find(key);
|
||||||
|
AMFValue<ValueType>* val = nullptr;
|
||||||
|
bool found = true;
|
||||||
|
if (element == associative.end()) {
|
||||||
|
val = new AMFValue<ValueType>(value);
|
||||||
|
associative.insert(std::make_pair(key, val));
|
||||||
|
} else {
|
||||||
|
val = dynamic_cast<AMFValue<ValueType>*>(element->second);
|
||||||
|
found = false;
|
||||||
|
}
|
||||||
|
return std::make_pair(val, found);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Associates an array with a string key
|
||||||
|
std::pair<AMFBaseValue*, bool> Insert(const std::string& key) {
|
||||||
|
auto element = associative.find(key);
|
||||||
|
AMFArrayValue* val = nullptr;
|
||||||
|
bool found = true;
|
||||||
|
if (element == associative.end()) {
|
||||||
|
val = new AMFArrayValue();
|
||||||
|
associative.insert(std::make_pair(key, val));
|
||||||
|
} else {
|
||||||
|
val = dynamic_cast<AMFArrayValue*>(element->second);
|
||||||
|
found = false;
|
||||||
|
}
|
||||||
|
return std::make_pair(val, found);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Associates an array with an integer key
|
||||||
|
std::pair<AMFBaseValue*, bool> Insert(const uint32_t& index) {
|
||||||
|
AMFArrayValue* val = nullptr;
|
||||||
|
bool inserted = false;
|
||||||
|
if (index >= dense.size()) {
|
||||||
|
dense.resize(index + 1);
|
||||||
|
val = new AMFArrayValue();
|
||||||
|
dense.at(index) = val;
|
||||||
|
inserted = true;
|
||||||
|
}
|
||||||
|
return std::make_pair(dynamic_cast<AMFArrayValue*>(dense.at(index)), inserted);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Inserts an AMFValue into the AMFArray key'd by index.
|
||||||
|
* Attempting to insert the same key to the same value twice overwrites
|
||||||
|
* the previous value with the new one.
|
||||||
|
*
|
||||||
|
* @param index The index to associate with the value
|
||||||
|
* @param value The value to insert
|
||||||
|
* @return The inserted element, or nullptr if the type did not match
|
||||||
|
* what was at the index.
|
||||||
|
*/
|
||||||
|
template<typename ValueType>
|
||||||
|
std::pair<AMFValue<ValueType>*, bool> Insert(const uint32_t& index, ValueType value) {
|
||||||
|
AMFValue<ValueType>* val = nullptr;
|
||||||
|
bool inserted = false;
|
||||||
|
if (index >= this->dense.size()) {
|
||||||
|
this->dense.resize(index + 1);
|
||||||
|
val = new AMFValue<ValueType>(value);
|
||||||
|
this->dense.at(index) = val;
|
||||||
|
inserted = true;
|
||||||
|
}
|
||||||
|
return std::make_pair(dynamic_cast<AMFValue<ValueType>*>(this->dense.at(index)), inserted);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts an AMFValue into the associative portion with the given key.
|
||||||
|
* If a duplicate is attempted to be inserted, it replaces the original
|
||||||
|
*
|
||||||
|
* The inserted element is now owned by this object and is not to be deleted
|
||||||
|
*
|
||||||
|
* @param key The key to associate with the value
|
||||||
|
* @param value The value to insert
|
||||||
|
*/
|
||||||
|
void Insert(const std::string& key, AMFBaseValue* value) {
|
||||||
|
auto element = associative.find(key);
|
||||||
|
if (element != associative.end() && element->second) {
|
||||||
|
delete element->second;
|
||||||
|
element->second = value;
|
||||||
|
} else {
|
||||||
|
associative.insert(std::make_pair(key, value));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts an AMFValue into the associative portion with the given index.
|
||||||
|
* If a duplicate is attempted to be inserted, it replaces the original
|
||||||
|
*
|
||||||
|
* The inserted element is now owned by this object and is not to be deleted
|
||||||
|
*
|
||||||
|
* @param key The key to associate with the value
|
||||||
|
* @param value The value to insert
|
||||||
|
*/
|
||||||
|
void Insert(const uint32_t index, AMFBaseValue* value) {
|
||||||
|
if (index < dense.size()) {
|
||||||
|
AMFDense::iterator itr = dense.begin() + index;
|
||||||
|
if (*itr) delete dense.at(index);
|
||||||
|
} else {
|
||||||
|
dense.resize(index + 1);
|
||||||
|
}
|
||||||
|
dense.at(index) = value;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pushes an AMFValue into the back of the dense portion.
|
||||||
|
*
|
||||||
|
* These objects are not to be deleted by the caller as they are owned by
|
||||||
|
* the AMFArray object which manages its own memory.
|
||||||
|
*
|
||||||
|
* @param value The value to insert
|
||||||
|
*
|
||||||
|
* @return The inserted pointer, or nullptr should the key already be in use.
|
||||||
|
*/
|
||||||
|
template<typename ValueType>
|
||||||
|
inline AMFValue<ValueType>* Push(ValueType value) {
|
||||||
|
return Insert(this->dense.size(), value).first;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the key from the associative portion
|
||||||
|
*
|
||||||
|
* The pointer removed is now no longer managed by this container
|
||||||
|
*
|
||||||
|
* @param key The key to remove from the associative portion
|
||||||
|
*/
|
||||||
|
void Remove(const std::string& key, bool deleteValue = true) {
|
||||||
|
AMFAssociative::iterator it = this->associative.find(key);
|
||||||
|
if (it != this->associative.end()) {
|
||||||
|
if (deleteValue) delete it->second;
|
||||||
|
this->associative.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pops the last element in the dense portion, deleting it in the process.
|
||||||
|
*/
|
||||||
|
void Remove(const uint32_t index) {
|
||||||
|
if (!this->dense.empty() && index < this->dense.size()) {
|
||||||
|
auto itr = this->dense.begin() + index;
|
||||||
|
if (*itr) delete (*itr);
|
||||||
|
this->dense.erase(itr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pop() {
|
||||||
|
if (!this->dense.empty()) Remove(this->dense.size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
AMFArrayValue* GetArray(const std::string& key) {
|
||||||
|
AMFAssociative::const_iterator it = this->associative.find(key);
|
||||||
|
if (it != this->associative.end()) {
|
||||||
|
return dynamic_cast<AMFArrayValue*>(it->second);
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
AMFArrayValue* GetArray(const uint32_t index) {
|
||||||
|
return index >= this->dense.size() ? nullptr : dynamic_cast<AMFArrayValue*>(this->dense.at(index));
|
||||||
|
};
|
||||||
|
|
||||||
|
inline AMFArrayValue* InsertArray(const std::string& key) {
|
||||||
|
return static_cast<AMFArrayValue*>(Insert(key).first);
|
||||||
|
};
|
||||||
|
|
||||||
|
inline AMFArrayValue* InsertArray(const uint32_t index) {
|
||||||
|
return static_cast<AMFArrayValue*>(Insert(index).first);
|
||||||
|
};
|
||||||
|
|
||||||
|
inline AMFArrayValue* PushArray() {
|
||||||
|
return static_cast<AMFArrayValue*>(Insert(this->dense.size()).first);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets an AMFValue by the key from the associative portion and converts it
|
||||||
|
* to the AmfValue template type. If the key did not exist, it is inserted.
|
||||||
|
*
|
||||||
|
* @tparam The target object type
|
||||||
|
* @param key The key to lookup
|
||||||
|
*
|
||||||
|
* @return The AMFValue
|
||||||
|
*/
|
||||||
|
template <typename AmfType>
|
||||||
|
AMFValue<AmfType>* Get(const std::string& key) const {
|
||||||
|
AMFAssociative::const_iterator it = this->associative.find(key);
|
||||||
|
return it != this->associative.end() ?
|
||||||
|
dynamic_cast<AMFValue<AmfType>*>(it->second) :
|
||||||
|
nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get from the array but dont cast it
|
||||||
|
AMFBaseValue* Get(const std::string& key) const {
|
||||||
|
AMFAssociative::const_iterator it = this->associative.find(key);
|
||||||
|
return it != this->associative.end() ? it->second : nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get an AMFValue object at a position in the dense portion.
|
||||||
|
* Gets an AMFValue by the index from the dense portion and converts it
|
||||||
|
* to the AmfValue template type. If the index did not exist, it is inserted.
|
||||||
|
*
|
||||||
|
* @tparam The target object type
|
||||||
|
* @param index The index to get
|
||||||
|
* @return The casted object, or nullptr.
|
||||||
|
*/
|
||||||
|
template <typename AmfType>
|
||||||
|
AMFValue<AmfType>* Get(uint32_t index) const {
|
||||||
|
std::cout << (index < this->dense.size()) << std::endl;
|
||||||
|
return index < this->dense.size() ?
|
||||||
|
dynamic_cast<AMFValue<AmfType>*>(this->dense.at(index)) :
|
||||||
|
nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get from the dense but dont cast it
|
||||||
|
AMFBaseValue* Get(const uint32_t index) const {
|
||||||
|
return index < this->dense.size() ? this->dense.at(index) : nullptr;
|
||||||
|
};
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* The associative portion. These values are key'd with strings to an AMFValue.
|
||||||
|
*/
|
||||||
|
AMFAssociative associative;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The dense portion. These AMFValue's are stored one after
|
||||||
|
* another with the most recent addition being at the back.
|
||||||
|
*/
|
||||||
|
AMFDense dense;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__AMF3__H__
|
184
dCommon/AmfSerialize.cpp
Normal file
184
dCommon/AmfSerialize.cpp
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
#include "AmfSerialize.h"
|
||||||
|
|
||||||
|
#include "Game.h"
|
||||||
|
#include "dLogger.h"
|
||||||
|
|
||||||
|
// Writes an AMFValue pointer to a RakNet::BitStream
|
||||||
|
template<>
|
||||||
|
void RakNet::BitStream::Write<AMFBaseValue&>(AMFBaseValue& value) {
|
||||||
|
eAmf type = value.GetValueType();
|
||||||
|
this->Write(type);
|
||||||
|
switch (type) {
|
||||||
|
case eAmf::Integer: {
|
||||||
|
this->Write<AMFIntValue&>(*static_cast<AMFIntValue*>(&value));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case eAmf::Double: {
|
||||||
|
this->Write<AMFDoubleValue&>(*static_cast<AMFDoubleValue*>(&value));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case eAmf::String: {
|
||||||
|
this->Write<AMFStringValue&>(*static_cast<AMFStringValue*>(&value));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case eAmf::Array: {
|
||||||
|
this->Write<AMFArrayValue&>(*static_cast<AMFArrayValue*>(&value));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
Game::logger->Log("AmfSerialize", "Encountered unwritable AMFType %i!", type);
|
||||||
|
}
|
||||||
|
case eAmf::Undefined:
|
||||||
|
case eAmf::Null:
|
||||||
|
case eAmf::False:
|
||||||
|
case eAmf::True:
|
||||||
|
case eAmf::Date:
|
||||||
|
case eAmf::Object:
|
||||||
|
case eAmf::XML:
|
||||||
|
case eAmf::XMLDoc:
|
||||||
|
case eAmf::ByteArray:
|
||||||
|
case eAmf::VectorInt:
|
||||||
|
case eAmf::VectorUInt:
|
||||||
|
case eAmf::VectorDouble:
|
||||||
|
case eAmf::VectorObject:
|
||||||
|
case eAmf::Dictionary:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A private function to write an value to a RakNet::BitStream
|
||||||
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
|
*/
|
||||||
|
void WriteUInt29(RakNet::BitStream* bs, uint32_t v) {
|
||||||
|
unsigned char b4 = (unsigned char)v;
|
||||||
|
if (v < 0x00200000) {
|
||||||
|
b4 = b4 & 0x7F;
|
||||||
|
if (v > 0x7F) {
|
||||||
|
unsigned char b3;
|
||||||
|
v = v >> 7;
|
||||||
|
b3 = ((unsigned char)(v)) | 0x80;
|
||||||
|
if (v > 0x7F) {
|
||||||
|
unsigned char b2;
|
||||||
|
v = v >> 7;
|
||||||
|
b2 = ((unsigned char)(v)) | 0x80;
|
||||||
|
bs->Write(b2);
|
||||||
|
}
|
||||||
|
|
||||||
|
bs->Write(b3);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
unsigned char b1;
|
||||||
|
unsigned char b2;
|
||||||
|
unsigned char b3;
|
||||||
|
|
||||||
|
v = v >> 8;
|
||||||
|
b3 = ((unsigned char)(v)) | 0x80;
|
||||||
|
v = v >> 7;
|
||||||
|
b2 = ((unsigned char)(v)) | 0x80;
|
||||||
|
v = v >> 7;
|
||||||
|
b1 = ((unsigned char)(v)) | 0x80;
|
||||||
|
|
||||||
|
bs->Write(b1);
|
||||||
|
bs->Write(b2);
|
||||||
|
bs->Write(b3);
|
||||||
|
}
|
||||||
|
|
||||||
|
bs->Write(b4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a flag number to a RakNet::BitStream
|
||||||
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
|
*/
|
||||||
|
void WriteFlagNumber(RakNet::BitStream* bs, uint32_t v) {
|
||||||
|
v = (v << 1) | 0x01;
|
||||||
|
WriteUInt29(bs, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes an AMFString to a RakNet::BitStream
|
||||||
|
*
|
||||||
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
|
*/
|
||||||
|
void WriteAMFString(RakNet::BitStream* bs, const std::string& str) {
|
||||||
|
WriteFlagNumber(bs, (uint32_t)str.size());
|
||||||
|
bs->Write(str.c_str(), (uint32_t)str.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes an U16 to a bitstream
|
||||||
|
*
|
||||||
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
|
*/
|
||||||
|
void WriteAMFU16(RakNet::BitStream* bs, uint16_t value) {
|
||||||
|
bs->Write(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes an U32 to a bitstream
|
||||||
|
*
|
||||||
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
|
*/
|
||||||
|
void WriteAMFU32(RakNet::BitStream* bs, uint32_t value) {
|
||||||
|
bs->Write(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes an U64 to a bitstream
|
||||||
|
*
|
||||||
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
|
*/
|
||||||
|
void WriteAMFU64(RakNet::BitStream* bs, uint64_t value) {
|
||||||
|
bs->Write(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writes an AMFIntegerValue to BitStream
|
||||||
|
template<>
|
||||||
|
void RakNet::BitStream::Write<AMFIntValue&>(AMFIntValue& value) {
|
||||||
|
WriteUInt29(this, value.GetValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writes an AMFDoubleValue to BitStream
|
||||||
|
template<>
|
||||||
|
void RakNet::BitStream::Write<AMFDoubleValue&>(AMFDoubleValue& value) {
|
||||||
|
double d = value.GetValue();
|
||||||
|
WriteAMFU64(this, *reinterpret_cast<uint64_t*>(&d));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writes an AMFStringValue to BitStream
|
||||||
|
template<>
|
||||||
|
void RakNet::BitStream::Write<AMFStringValue&>(AMFStringValue& value) {
|
||||||
|
WriteAMFString(this, value.GetValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writes an AMFArrayValue to BitStream
|
||||||
|
template<>
|
||||||
|
void RakNet::BitStream::Write<AMFArrayValue&>(AMFArrayValue& value) {
|
||||||
|
uint32_t denseSize = value.GetDense().size();
|
||||||
|
WriteFlagNumber(this, denseSize);
|
||||||
|
|
||||||
|
auto it = value.GetAssociative().begin();
|
||||||
|
auto end = value.GetAssociative().end();
|
||||||
|
|
||||||
|
while (it != end) {
|
||||||
|
WriteAMFString(this, it->first);
|
||||||
|
this->Write<AMFBaseValue&>(*it->second);
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->Write(eAmf::Null);
|
||||||
|
|
||||||
|
if (denseSize > 0) {
|
||||||
|
auto it2 = value.GetDense().begin();
|
||||||
|
auto end2 = value.GetDense().end();
|
||||||
|
|
||||||
|
while (it2 != end2) {
|
||||||
|
this->Write<AMFBaseValue&>(**it2);
|
||||||
|
it2++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
50
dCommon/AmfSerialize.h
Normal file
50
dCommon/AmfSerialize.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Custom Classes
|
||||||
|
#include "Amf3.h"
|
||||||
|
|
||||||
|
// RakNet
|
||||||
|
#include <BitStream.h>
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\file AmfSerialize.h
|
||||||
|
\brief A class that implements native writing of AMF values to RakNet::BitStream
|
||||||
|
*/
|
||||||
|
|
||||||
|
// We are using the RakNet namespace
|
||||||
|
namespace RakNet {
|
||||||
|
//! Writes an AMFValue pointer to a RakNet::BitStream
|
||||||
|
/*!
|
||||||
|
\param value The value to write
|
||||||
|
*/
|
||||||
|
template <>
|
||||||
|
void RakNet::BitStream::Write<AMFBaseValue&>(AMFBaseValue& value);
|
||||||
|
|
||||||
|
//! Writes an AMFIntegerValue to a RakNet::BitStream
|
||||||
|
/*!
|
||||||
|
\param value The value to write
|
||||||
|
*/
|
||||||
|
template <>
|
||||||
|
void RakNet::BitStream::Write<AMFIntValue&>(AMFIntValue& value);
|
||||||
|
|
||||||
|
//! Writes an AMFDoubleValue to a RakNet::BitStream
|
||||||
|
/*!
|
||||||
|
\param value The value to write
|
||||||
|
*/
|
||||||
|
template <>
|
||||||
|
void RakNet::BitStream::Write<AMFDoubleValue&>(AMFDoubleValue& value);
|
||||||
|
|
||||||
|
//! Writes an AMFStringValue to a RakNet::BitStream
|
||||||
|
/*!
|
||||||
|
\param value The value to write
|
||||||
|
*/
|
||||||
|
template <>
|
||||||
|
void RakNet::BitStream::Write<AMFStringValue&>(AMFStringValue& value);
|
||||||
|
|
||||||
|
//! Writes an AMFArrayValue to a RakNet::BitStream
|
||||||
|
/*!
|
||||||
|
\param value The value to write
|
||||||
|
*/
|
||||||
|
template <>
|
||||||
|
void RakNet::BitStream::Write<AMFArrayValue&>(AMFArrayValue& value);
|
||||||
|
} // namespace RakNet
|
11
dCommon/Brick.h
Normal file
11
dCommon/Brick.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef __BRICK__H__
|
||||||
|
#define __BRICK__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
struct Brick {
|
||||||
|
uint32_t designerID;
|
||||||
|
uint32_t materialID;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__BRICK__H__
|
@ -1,6 +1,6 @@
|
|||||||
set(DCOMMON_SOURCES "AMFFormat.cpp"
|
set(DCOMMON_SOURCES
|
||||||
"AMFDeserialize.cpp"
|
"AMFDeserialize.cpp"
|
||||||
"AMFFormat_BitStream.cpp"
|
"AmfSerialize.cpp"
|
||||||
"BinaryIO.cpp"
|
"BinaryIO.cpp"
|
||||||
"dConfig.cpp"
|
"dConfig.cpp"
|
||||||
"Diagnostics.cpp"
|
"Diagnostics.cpp"
|
||||||
|
@ -111,7 +111,7 @@ static void ErrorCallback(void* data, const char* msg, int errnum) {
|
|||||||
|
|
||||||
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());
|
int ret = system(cmd.c_str()); // Saving a return just to prevent warning
|
||||||
}
|
}
|
||||||
|
|
||||||
void CatchUnhandled(int sig) {
|
void CatchUnhandled(int sig) {
|
||||||
|
@ -241,7 +241,7 @@ std::vector<std::wstring> GeneralUtils::SplitString(std::wstring& str, wchar_t d
|
|||||||
return vector;
|
return vector;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::u16string> GeneralUtils::SplitString(std::u16string& str, char16_t delimiter) {
|
std::vector<std::u16string> GeneralUtils::SplitString(const 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;
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "dLogger.h"
|
#include "dLogger.h"
|
||||||
|
|
||||||
enum eInventoryType : uint32_t;
|
enum eInventoryType : uint32_t;
|
||||||
|
enum class eObjectBits : size_t;
|
||||||
enum class eReplicaComponentType : uint32_t;
|
enum class eReplicaComponentType : uint32_t;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -66,9 +67,9 @@ namespace GeneralUtils {
|
|||||||
|
|
||||||
//! 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) {
|
inline void SetBit(T& value, eObjectBits bits) {
|
||||||
static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
|
static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
|
||||||
|
auto index = static_cast<size_t>(bits);
|
||||||
if (index > (sizeof(T) * 8) - 1) {
|
if (index > (sizeof(T) * 8) - 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -78,9 +79,9 @@ namespace GeneralUtils {
|
|||||||
|
|
||||||
//! Clears a bit on a numerical value
|
//! Clears a bit on a numerical value
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void ClearBit(T& value, size_t index) {
|
inline void ClearBit(T& value, eObjectBits bits) {
|
||||||
static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
|
static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
|
||||||
|
auto index = static_cast<size_t>(bits);
|
||||||
if (index > (sizeof(T) * 8 - 1)) {
|
if (index > (sizeof(T) * 8 - 1)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -139,7 +140,7 @@ namespace GeneralUtils {
|
|||||||
|
|
||||||
std::vector<std::wstring> SplitString(std::wstring& str, wchar_t delimiter);
|
std::vector<std::wstring> SplitString(std::wstring& str, wchar_t delimiter);
|
||||||
|
|
||||||
std::vector<std::u16string> SplitString(std::u16string& str, char16_t delimiter);
|
std::vector<std::u16string> SplitString(const std::u16string& str, char16_t delimiter);
|
||||||
|
|
||||||
std::vector<std::string> SplitString(const std::string& str, char delimiter);
|
std::vector<std::string> SplitString(const std::string& str, char delimiter);
|
||||||
|
|
||||||
|
@ -3,122 +3,174 @@
|
|||||||
// Custom Classes
|
// Custom Classes
|
||||||
#include "GeneralUtils.h"
|
#include "GeneralUtils.h"
|
||||||
|
|
||||||
|
#include "Game.h"
|
||||||
|
#include "dLogger.h"
|
||||||
|
|
||||||
// C++
|
// C++
|
||||||
#include <sstream>
|
#include <string_view>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
using LDFKey = std::string_view;
|
||||||
|
using LDFTypeAndValue = std::string_view;
|
||||||
|
|
||||||
|
using LDFType = std::string_view;
|
||||||
|
using LDFValue = std::string_view;
|
||||||
|
|
||||||
//! 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_view& format) {
|
||||||
|
// A valid LDF must be at least 3 characters long (=0:) is the shortest valid LDF (empty UTF-16 key with no initial value)
|
||||||
|
if (format.empty() || format.length() <= 2) return nullptr;
|
||||||
|
auto equalsPosition = format.find('=');
|
||||||
|
// You can have an empty key, just make sure the type and value might exist
|
||||||
|
if (equalsPosition == std::string::npos || equalsPosition == (format.size() - 1)) return nullptr;
|
||||||
|
|
||||||
// First, check the format
|
std::pair<LDFKey, LDFTypeAndValue> keyValue;
|
||||||
std::istringstream ssFormat(format);
|
keyValue.first = format.substr(0, equalsPosition);
|
||||||
std::string token;
|
keyValue.second = format.substr(equalsPosition + 1, format.size());
|
||||||
|
|
||||||
std::vector<std::string> keyValueArray;
|
std::u16string key = GeneralUtils::ASCIIToUTF16(keyValue.first);
|
||||||
while (std::getline(ssFormat, token, '=')) {
|
|
||||||
keyValueArray.push_back(token);
|
auto colonPosition = keyValue.second.find(':');
|
||||||
|
|
||||||
|
// If : is the first thing after an =, then this is an invalid LDF since
|
||||||
|
// we dont have a type to use.
|
||||||
|
if (colonPosition == std::string::npos || colonPosition == 0) return nullptr;
|
||||||
|
|
||||||
|
std::pair<LDFType, LDFValue> ldfTypeAndValue;
|
||||||
|
ldfTypeAndValue.first = keyValue.second.substr(0, colonPosition);
|
||||||
|
ldfTypeAndValue.second = keyValue.second.substr(colonPosition + 1, keyValue.second.size());
|
||||||
|
|
||||||
|
// Only allow empty values for string values.
|
||||||
|
if (ldfTypeAndValue.second.size() == 0 && !(ldfTypeAndValue.first == "0" || ldfTypeAndValue.first == "13")) return nullptr;
|
||||||
|
|
||||||
|
eLDFType type;
|
||||||
|
char* storage;
|
||||||
|
try {
|
||||||
|
type = static_cast<eLDFType>(strtol(ldfTypeAndValue.first.data(), &storage, 10));
|
||||||
|
} catch (std::exception) {
|
||||||
|
Game::logger->Log("LDFFormat", "Attempted to process invalid ldf type (%s) from string (%s)", ldfTypeAndValue.first.data(), format.data());
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keyValueArray.size() == 2) {
|
LDFBaseData* returnValue = nullptr;
|
||||||
std::u16string key = GeneralUtils::ASCIIToUTF16(keyValueArray[0]);
|
switch (type) {
|
||||||
|
case LDF_TYPE_UTF_16: {
|
||||||
|
std::u16string data = GeneralUtils::UTF8ToUTF16(ldfTypeAndValue.second);
|
||||||
|
returnValue = new LDFData<std::u16string>(key, data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::string> dataArray;
|
case LDF_TYPE_S32: {
|
||||||
std::istringstream ssData(keyValueArray[1]);
|
try {
|
||||||
while (std::getline(ssData, token, ':')) {
|
int32_t data = static_cast<int32_t>(strtoul(ldfTypeAndValue.second.data(), &storage, 10));
|
||||||
dataArray.push_back(token);
|
returnValue = new LDFData<int32_t>(key, data);
|
||||||
|
} catch (std::exception) {
|
||||||
|
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid int32 value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (dataArray.size() > 2) { // hacky fix for strings with colons in them
|
case LDF_TYPE_FLOAT: {
|
||||||
std::vector<std::string> newDataArray;
|
try {
|
||||||
newDataArray.push_back(dataArray[0]);
|
float data = strtof(ldfTypeAndValue.second.data(), &storage);
|
||||||
std::string value = "";
|
returnValue = new LDFData<float>(key, data);
|
||||||
for (size_t i = 1; i < dataArray.size(); ++i) {
|
} catch (std::exception) {
|
||||||
value += dataArray[i] + ':';
|
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid float value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
||||||
}
|
return nullptr;
|
||||||
value.pop_back(); // remove last colon
|
|
||||||
newDataArray.push_back(value);
|
|
||||||
dataArray = newDataArray;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if ((dataArray[0] == "0" || dataArray[0] == "13") && dataArray.size() == 1) {
|
case LDF_TYPE_DOUBLE: {
|
||||||
dataArray.push_back("");
|
try {
|
||||||
|
double data = strtod(ldfTypeAndValue.second.data(), &storage);
|
||||||
|
returnValue = new LDFData<double>(key, data);
|
||||||
|
} catch (std::exception) {
|
||||||
|
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid double value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (dataArray.size() == 2) {
|
case LDF_TYPE_U32:
|
||||||
eLDFType type = static_cast<eLDFType>(stoi(dataArray[0]));
|
{
|
||||||
|
uint32_t data;
|
||||||
|
|
||||||
switch (type) {
|
if (ldfTypeAndValue.second == "true") {
|
||||||
case LDF_TYPE_UTF_16: {
|
data = 1;
|
||||||
std::u16string data = GeneralUtils::UTF8ToUTF16(dataArray[1]);
|
} else if (ldfTypeAndValue.second == "false") {
|
||||||
return new LDFData<std::u16string>(key, data);
|
data = 0;
|
||||||
}
|
} else {
|
||||||
|
try {
|
||||||
case LDF_TYPE_S32: {
|
data = static_cast<uint32_t>(strtoul(ldfTypeAndValue.second.data(), &storage, 10));
|
||||||
int32_t data = static_cast<int32_t>(stoull(dataArray[1]));
|
} catch (std::exception) {
|
||||||
return new LDFData<int32_t>(key, data);
|
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid uint32 value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
||||||
}
|
|
||||||
|
|
||||||
case LDF_TYPE_FLOAT: {
|
|
||||||
float data = static_cast<float>(stof(dataArray[1]));
|
|
||||||
return new LDFData<float>(key, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
case LDF_TYPE_DOUBLE: {
|
|
||||||
double data = static_cast<float>(stod(dataArray[1]));
|
|
||||||
return new LDFData<double>(key, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
case LDF_TYPE_U32:
|
|
||||||
{
|
|
||||||
uint32_t data;
|
|
||||||
|
|
||||||
if (dataArray[1] == "true") {
|
|
||||||
data = 1;
|
|
||||||
} else if (dataArray[1] == "false") {
|
|
||||||
data = 0;
|
|
||||||
} else {
|
|
||||||
data = static_cast<uint32_t>(stoul(dataArray[1]));
|
|
||||||
}
|
|
||||||
|
|
||||||
return new LDFData<uint32_t>(key, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
case LDF_TYPE_BOOLEAN: {
|
|
||||||
bool data;
|
|
||||||
|
|
||||||
if (dataArray[1] == "true") {
|
|
||||||
data = true;
|
|
||||||
} else if (dataArray[1] == "false") {
|
|
||||||
data = false;
|
|
||||||
} else {
|
|
||||||
data = static_cast<bool>(stoi(dataArray[1]));
|
|
||||||
}
|
|
||||||
|
|
||||||
return new LDFData<bool>(key, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
case LDF_TYPE_U64: {
|
|
||||||
uint64_t data = static_cast<uint64_t>(stoull(dataArray[1]));
|
|
||||||
return new LDFData<uint64_t>(key, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
case LDF_TYPE_OBJID: {
|
|
||||||
LWOOBJID data = static_cast<LWOOBJID>(stoll(dataArray[1]));
|
|
||||||
return new LDFData<LWOOBJID>(key, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
case LDF_TYPE_UTF_8: {
|
|
||||||
std::string data = dataArray[1];
|
|
||||||
return new LDFData<std::string>(key, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
case LDF_TYPE_UNKNOWN: {
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
returnValue = new LDFData<uint32_t>(key, data);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
case LDF_TYPE_BOOLEAN: {
|
||||||
|
bool data;
|
||||||
|
|
||||||
|
if (ldfTypeAndValue.second == "true") {
|
||||||
|
data = true;
|
||||||
|
} else if (ldfTypeAndValue.second == "false") {
|
||||||
|
data = false;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
data = static_cast<bool>(strtol(ldfTypeAndValue.second.data(), &storage, 10));
|
||||||
|
} catch (std::exception) {
|
||||||
|
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid bool value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
returnValue = new LDFData<bool>(key, data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case LDF_TYPE_U64: {
|
||||||
|
try {
|
||||||
|
uint64_t data = static_cast<uint64_t>(strtoull(ldfTypeAndValue.second.data(), &storage, 10));
|
||||||
|
returnValue = new LDFData<uint64_t>(key, data);
|
||||||
|
} catch (std::exception) {
|
||||||
|
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid uint64 value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case LDF_TYPE_OBJID: {
|
||||||
|
try {
|
||||||
|
LWOOBJID data = static_cast<LWOOBJID>(strtoll(ldfTypeAndValue.second.data(), &storage, 10));
|
||||||
|
returnValue = new LDFData<LWOOBJID>(key, data);
|
||||||
|
} catch (std::exception) {
|
||||||
|
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid LWOOBJID value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case LDF_TYPE_UTF_8: {
|
||||||
|
std::string data = ldfTypeAndValue.second.data();
|
||||||
|
returnValue = new LDFData<std::string>(key, data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case LDF_TYPE_UNKNOWN: {
|
||||||
|
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid unknown value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: {
|
||||||
|
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid LDF type (%d) from string (%s)", type, format.data());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#ifndef __LDFFORMAT__H__
|
||||||
|
#define __LDFFORMAT__H__
|
||||||
|
|
||||||
// Custom Classes
|
// Custom Classes
|
||||||
#include "dCommonVars.h"
|
#include "dCommonVars.h"
|
||||||
@ -6,18 +7,12 @@
|
|||||||
|
|
||||||
// C++
|
// C++
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
// RakNet
|
// RakNet
|
||||||
|
#include "BitStream.h"
|
||||||
|
|
||||||
#include "../thirdparty/raknet/Source/BitStream.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\file LDFFormat.hpp
|
|
||||||
\brief A collection of LDF format classes
|
|
||||||
*/
|
|
||||||
|
|
||||||
//! 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
|
||||||
@ -31,36 +26,21 @@ enum eLDFType {
|
|||||||
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
|
|
||||||
class LDFBaseData {
|
class LDFBaseData {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//! Destructor
|
virtual ~LDFBaseData() {}
|
||||||
virtual ~LDFBaseData(void) {}
|
|
||||||
|
|
||||||
//! Writes the data to a packet
|
|
||||||
/*!
|
|
||||||
\param packet The packet
|
|
||||||
*/
|
|
||||||
virtual void WriteToPacket(RakNet::BitStream* packet) = 0;
|
virtual void WriteToPacket(RakNet::BitStream* packet) = 0;
|
||||||
|
|
||||||
//! Gets the key
|
virtual const std::u16string& GetKey() = 0;
|
||||||
/*!
|
|
||||||
\return The key
|
|
||||||
*/
|
|
||||||
virtual const std::u16string& GetKey(void) = 0;
|
|
||||||
|
|
||||||
//! Gets the value type
|
virtual eLDFType GetValueType() = 0;
|
||||||
/*!
|
|
||||||
\return The value type
|
|
||||||
*/
|
|
||||||
virtual eLDFType GetValueType(void) = 0;
|
|
||||||
|
|
||||||
//! Gets a string from the key/value pair
|
/** Gets a string from the key/value pair
|
||||||
/*!
|
* @param includeKey Whether or not to include the key in the 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
|
||||||
\param includeTypeId Whether or not to include the type id in the data
|
* @return The string representation of the data
|
||||||
\return The string representation of the data
|
|
||||||
*/
|
*/
|
||||||
virtual std::string GetString(bool includeKey = true, bool includeTypeId = true) = 0;
|
virtual std::string GetString(bool includeKey = true, bool includeTypeId = true) = 0;
|
||||||
|
|
||||||
@ -68,19 +48,15 @@ public:
|
|||||||
|
|
||||||
virtual LDFBaseData* Copy() = 0;
|
virtual LDFBaseData* Copy() = 0;
|
||||||
|
|
||||||
// MARK: Functions
|
/**
|
||||||
|
* Given an input string, return the data as a LDF key.
|
||||||
//! Returns a pointer to a LDFData value based on string format
|
|
||||||
/*!
|
|
||||||
\param format The format
|
|
||||||
*/
|
*/
|
||||||
static LDFBaseData* DataFromString(const std::string& format);
|
static LDFBaseData* DataFromString(const std::string_view& format);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//! A structure for an LDF key-value pair
|
|
||||||
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;
|
||||||
@ -164,15 +140,11 @@ public:
|
|||||||
|
|
||||||
if (includeKey) {
|
if (includeKey) {
|
||||||
const std::string& sKey = GeneralUtils::UTF16ToWTF8(this->key, this->key.size());
|
const std::string& sKey = GeneralUtils::UTF16ToWTF8(this->key, this->key.size());
|
||||||
|
stream << sKey << '=';
|
||||||
stream << sKey << "=";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (includeTypeId) {
|
if (includeTypeId) {
|
||||||
const std::string& sType = std::to_string(this->GetValueType());
|
stream << this->GetValueType() << ':';
|
||||||
|
|
||||||
|
|
||||||
stream << sType << ":";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& sData = this->GetValueString();
|
const std::string& sData = this->GetValueString();
|
||||||
@ -234,20 +206,18 @@ inline void LDFData<std::string>::WriteValue(RakNet::BitStream* packet) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: String Data
|
template<> inline std::string LDFData<std::u16string>::GetValueString() {
|
||||||
template<> inline std::string LDFData<std::u16string>::GetValueString(void) {
|
|
||||||
//std::string toReturn(this->value.begin(), this->value.end());
|
|
||||||
//return toReturn;
|
|
||||||
|
|
||||||
return GeneralUtils::UTF16ToWTF8(this->value, this->value.size());
|
return GeneralUtils::UTF16ToWTF8(this->value, this->value.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> inline std::string LDFData<int32_t>::GetValueString(void) { return std::to_string(this->value); }
|
template<> inline std::string LDFData<int32_t>::GetValueString() { return std::to_string(this->value); }
|
||||||
template<> inline std::string LDFData<float>::GetValueString(void) { return std::to_string(this->value); }
|
template<> inline std::string LDFData<float>::GetValueString() { return std::to_string(this->value); }
|
||||||
template<> inline std::string LDFData<double>::GetValueString(void) { return std::to_string(this->value); }
|
template<> inline std::string LDFData<double>::GetValueString() { return std::to_string(this->value); }
|
||||||
template<> inline std::string LDFData<uint32_t>::GetValueString(void) { return std::to_string(this->value); }
|
template<> inline std::string LDFData<uint32_t>::GetValueString() { return std::to_string(this->value); }
|
||||||
template<> inline std::string LDFData<bool>::GetValueString(void) { return std::to_string(this->value); }
|
template<> inline std::string LDFData<bool>::GetValueString() { return std::to_string(this->value); }
|
||||||
template<> inline std::string LDFData<uint64_t>::GetValueString(void) { return std::to_string(this->value); }
|
template<> inline std::string LDFData<uint64_t>::GetValueString() { return std::to_string(this->value); }
|
||||||
template<> inline std::string LDFData<LWOOBJID>::GetValueString(void) { return std::to_string(this->value); }
|
template<> inline std::string LDFData<LWOOBJID>::GetValueString() { return std::to_string(this->value); }
|
||||||
|
|
||||||
template<> inline std::string LDFData<std::string>::GetValueString(void) { return this->value; }
|
template<> inline std::string LDFData<std::string>::GetValueString() { return this->value; }
|
||||||
|
|
||||||
|
#endif //!__LDFFORMAT__H__
|
||||||
|
@ -47,6 +47,10 @@ AssetManager::AssetManager(const std::filesystem::path& path) {
|
|||||||
this->LoadPackIndex();
|
this->LoadPackIndex();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case eAssetBundleType::None:
|
||||||
|
case eAssetBundleType::Unpacked: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +115,7 @@ bool AssetManager::GetFile(const char* name, char** data, uint32_t* len) {
|
|||||||
*len = ftell(file);
|
*len = ftell(file);
|
||||||
*data = (char*)malloc(*len);
|
*data = (char*)malloc(*len);
|
||||||
fseek(file, 0, SEEK_SET);
|
fseek(file, 0, SEEK_SET);
|
||||||
fread(*data, sizeof(uint8_t), *len, file);
|
int32_t readInData = fread(*data, sizeof(uint8_t), *len, file);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -77,7 +77,7 @@ bool Pack::ReadFileFromPack(uint32_t crc, char** data, uint32_t* len) {
|
|||||||
|
|
||||||
if (!isCompressed) {
|
if (!isCompressed) {
|
||||||
char* tempData = (char*)malloc(pkRecord.m_UncompressedSize);
|
char* tempData = (char*)malloc(pkRecord.m_UncompressedSize);
|
||||||
fread(tempData, sizeof(uint8_t), pkRecord.m_UncompressedSize, file);
|
int32_t readInData = fread(tempData, sizeof(uint8_t), pkRecord.m_UncompressedSize, file);
|
||||||
|
|
||||||
*data = tempData;
|
*data = tempData;
|
||||||
*len = pkRecord.m_UncompressedSize;
|
*len = pkRecord.m_UncompressedSize;
|
||||||
@ -97,11 +97,11 @@ bool Pack::ReadFileFromPack(uint32_t crc, char** data, uint32_t* len) {
|
|||||||
if (currentReadPos >= pkRecord.m_UncompressedSize) break;
|
if (currentReadPos >= pkRecord.m_UncompressedSize) break;
|
||||||
|
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
fread(&size, sizeof(uint32_t), 1, file);
|
int32_t readInData = fread(&size, sizeof(uint32_t), 1, file);
|
||||||
pos += 4; // Move pointer position 4 to the right
|
pos += 4; // Move pointer position 4 to the right
|
||||||
|
|
||||||
char* chunk = (char*)malloc(size);
|
char* chunk = (char*)malloc(size);
|
||||||
fread(chunk, sizeof(int8_t), size, file);
|
int32_t readInData2 = fread(chunk, sizeof(int8_t), size, file);
|
||||||
pos += size; // Move pointer position the amount of bytes read to the right
|
pos += size; // Move pointer position the amount of bytes read to the right
|
||||||
|
|
||||||
int32_t err;
|
int32_t err;
|
||||||
|
@ -7,11 +7,11 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include "BitStream.h"
|
#include "BitStream.h"
|
||||||
|
#include "eConnectionType.h"
|
||||||
|
#include "eClientMessageType.h"
|
||||||
|
|
||||||
#pragma warning (disable:4251) //Disables SQL warnings
|
#pragma warning (disable:4251) //Disables SQL warnings
|
||||||
|
|
||||||
typedef int RESTICKET;
|
|
||||||
|
|
||||||
// These are the same define, but they mean two different things in different contexts
|
// These are the same define, but they mean two different things in different contexts
|
||||||
// so a different define to distinguish what calculation is happening will help clarity.
|
// so a different define to distinguish what calculation is happening will help clarity.
|
||||||
#define FRAMES_TO_MS(x) 1000 / x
|
#define FRAMES_TO_MS(x) 1000 / x
|
||||||
@ -28,9 +28,11 @@ constexpr uint32_t lowFrameDelta = FRAMES_TO_MS(lowFramerate);
|
|||||||
|
|
||||||
//========== MACROS ===========
|
//========== MACROS ===========
|
||||||
|
|
||||||
|
#define HEADER_SIZE 8
|
||||||
#define CBITSTREAM RakNet::BitStream bitStream;
|
#define CBITSTREAM RakNet::BitStream bitStream;
|
||||||
#define CINSTREAM RakNet::BitStream inStream(packet->data, packet->length, false);
|
#define CINSTREAM RakNet::BitStream inStream(packet->data, packet->length, false);
|
||||||
#define CMSGHEADER PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_GAME_MSG);
|
#define CINSTREAM_SKIP_HEADER CINSTREAM if (inStream.GetNumberOfUnreadBits() >= BYTES_TO_BITS(HEADER_SIZE)) inStream.IgnoreBytes(HEADER_SIZE); else inStream.IgnoreBits(inStream.GetNumberOfUnreadBits());
|
||||||
|
#define CMSGHEADER PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::GAME_MSG);
|
||||||
#define SEND_PACKET Game::server->Send(&bitStream, sysAddr, false);
|
#define SEND_PACKET Game::server->Send(&bitStream, sysAddr, false);
|
||||||
#define SEND_PACKET_BROADCAST Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
#define SEND_PACKET_BROADCAST Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
||||||
|
|
||||||
@ -45,23 +47,16 @@ typedef uint16_t LWOINSTANCEID; //!< Used for Instance IDs
|
|||||||
typedef uint32_t PROPERTYCLONELIST; //!< Used for Property Clone IDs
|
typedef uint32_t PROPERTYCLONELIST; //!< Used for Property Clone IDs
|
||||||
typedef uint32_t StripId;
|
typedef uint32_t StripId;
|
||||||
|
|
||||||
typedef int32_t PetTamingPiece; //!< Pet Taming Pieces
|
|
||||||
|
|
||||||
const LWOOBJID LWOOBJID_EMPTY = 0; //!< An empty object ID
|
const LWOOBJID LWOOBJID_EMPTY = 0; //!< An empty object ID
|
||||||
const LOT LOT_NULL = -1; //!< A null LOT
|
const LOT LOT_NULL = -1; //!< A null LOT
|
||||||
const int32_t LOOTTYPE_NONE = 0; //!< No loot type available
|
const int32_t LOOTTYPE_NONE = 0; //!< No loot type available
|
||||||
const float SECONDARY_PRIORITY = 1.0f; //!< Secondary Priority
|
const float SECONDARY_PRIORITY = 1.0f; //!< Secondary Priority
|
||||||
const uint32_t INVENTORY_INVALID = -1; //!< Invalid Inventory
|
|
||||||
const uint32_t INVENTORY_DEFAULT = -1; //!< Default Inventory
|
|
||||||
const uint32_t StatusChangeInfo = 0; //!< Status Change Info (???)
|
|
||||||
const uint32_t INVENTORY_MAX = 9999999; //!< The Maximum Inventory Size
|
const uint32_t INVENTORY_MAX = 9999999; //!< The Maximum Inventory Size
|
||||||
const uint32_t LWOCLONEID_INVALID = -1; //!< Invalid LWOCLONEID
|
const uint32_t LWOCLONEID_INVALID = -1; //!< Invalid LWOCLONEID
|
||||||
const uint16_t LWOINSTANCEID_INVALID = -1; //!< Invalid LWOINSTANCEID
|
const uint16_t LWOINSTANCEID_INVALID = -1; //!< Invalid LWOINSTANCEID
|
||||||
const uint16_t LWOMAPID_INVALID = -1; //!< Invalid LWOMAPID
|
const uint16_t LWOMAPID_INVALID = -1; //!< Invalid LWOMAPID
|
||||||
const uint64_t LWOZONEID_INVALID = 0; //!< Invalid LWOZONEID
|
const uint64_t LWOZONEID_INVALID = 0; //!< Invalid LWOZONEID
|
||||||
|
|
||||||
typedef std::set<LWOOBJID> TSetObjID;
|
|
||||||
|
|
||||||
const float PI = 3.14159f;
|
const float PI = 3.14159f;
|
||||||
|
|
||||||
//============ STRUCTS ==============
|
//============ STRUCTS ==============
|
||||||
@ -164,401 +159,4 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Brick {
|
|
||||||
uint32_t designerID;
|
|
||||||
uint32_t materialID;
|
|
||||||
};
|
|
||||||
|
|
||||||
//This union is used by the behavior system
|
|
||||||
union suchar {
|
|
||||||
unsigned char usigned;
|
|
||||||
char svalue;
|
|
||||||
};
|
|
||||||
|
|
||||||
//=========== LU ENUMS ============
|
|
||||||
|
|
||||||
//! An enum for object ID bits
|
|
||||||
enum eObjectBits : int32_t {
|
|
||||||
OBJECT_BIT_PERSISTENT = 32, //!< The 32 bit index
|
|
||||||
OBJECT_BIT_CLIENT = 46, //!< The 46 bit index
|
|
||||||
OBJECT_BIT_SPAWNED = 58, //!< The 58 bit index
|
|
||||||
OBJECT_BIT_CHARACTER = 60 //!< The 60 bit index
|
|
||||||
};
|
|
||||||
|
|
||||||
//! An enum for MatchUpdate types
|
|
||||||
enum eMatchUpdate : int {
|
|
||||||
MATCH_UPDATE_PLAYER_JOINED = 0,
|
|
||||||
MATCH_UPDATE_PLAYER_LEFT = 1,
|
|
||||||
MATCH_UPDATE_TIME = 3,
|
|
||||||
MATCH_UPDATE_TIME_START_DELAY = 4,
|
|
||||||
MATCH_UPDATE_PLAYER_READY = 5,
|
|
||||||
MATCH_UPDATE_PLAYER_UNREADY = 6
|
|
||||||
};
|
|
||||||
|
|
||||||
//! An enum for camera cycling modes
|
|
||||||
enum eCyclingMode : uint32_t {
|
|
||||||
ALLOW_CYCLE_TEAMMATES,
|
|
||||||
DISALLOW_CYCLING
|
|
||||||
};
|
|
||||||
|
|
||||||
enum eCinematicEvent : uint32_t {
|
|
||||||
STARTED,
|
|
||||||
WAYPOINT,
|
|
||||||
ENDED,
|
|
||||||
};
|
|
||||||
|
|
||||||
//! An enum for character creation responses
|
|
||||||
enum eCreationResponse : uint8_t {
|
|
||||||
CREATION_RESPONSE_SUCCESS = 0, //!< The creation was successful
|
|
||||||
CREATION_RESPONSE_OBJECT_ID_UNAVAILABLE, //!< The Object ID can't be used
|
|
||||||
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_CUSTOM_NAME_IN_USE //!< The custom name is already in use
|
|
||||||
};
|
|
||||||
|
|
||||||
//! An enum for login responses
|
|
||||||
enum eLoginResponse : uint8_t {
|
|
||||||
LOGIN_RESPONSE_GENERAL_FAILED = 0,
|
|
||||||
LOGIN_RESPONSE_SUCCESS = 1,
|
|
||||||
LOGIN_RESPONSE_BANNED = 2,
|
|
||||||
LOGIN_RESPONSE_PERMISSIONS_NOT_HIGH_ENOUGH = 5,
|
|
||||||
LOGIN_RESPONSE_WRONG_PASS_OR_USER = 6,
|
|
||||||
LOGIN_RESPONSE_ACCOUNT_LOCKED = 7
|
|
||||||
};
|
|
||||||
|
|
||||||
//! An enum for character rename responses
|
|
||||||
enum eRenameResponse : uint8_t {
|
|
||||||
RENAME_RESPONSE_SUCCESS = 0, //!< The renaming was successful
|
|
||||||
RENAME_RESPONSE_UNKNOWN_ERROR, //!< There was an unknown error
|
|
||||||
RENAME_RESPONSE_NAME_UNAVAILABLE, //!< The name is unavailable
|
|
||||||
RENAME_RESPONSE_NAME_IN_USE //!< The name is already in use
|
|
||||||
};
|
|
||||||
|
|
||||||
//! A replica packet type
|
|
||||||
enum eReplicaPacketType {
|
|
||||||
PACKET_TYPE_CONSTRUCTION, //!< A construction packet
|
|
||||||
PACKET_TYPE_SERIALIZATION, //!< A serialization packet
|
|
||||||
PACKET_TYPE_DESTRUCTION //!< A destruction packet
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The Behavior Types for use with the AI system
|
|
||||||
enum eCombatBehaviorTypes : uint32_t {
|
|
||||||
PASSIVE = 0, //!< The object is passive
|
|
||||||
AGGRESSIVE = 1, //!< The object is aggressive
|
|
||||||
PASSIVE_TURRET = 2, //!< The object is a passive turret
|
|
||||||
AGGRESSIVE_TURRET = 3 //!< The object is an aggressive turret
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The Combat Role Type for use with the AI system
|
|
||||||
enum eCombatRoleType : uint32_t {
|
|
||||||
MELEE = 0, //!< Used for melee attacks
|
|
||||||
RANGED = 1, //!< Used for range attacks
|
|
||||||
SUPPORT = 2 //!< Used for support
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The kill types for the Die packet
|
|
||||||
enum eKillType : uint32_t {
|
|
||||||
VIOLENT,
|
|
||||||
SILENT
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The various world states used throughout the server
|
|
||||||
enum eObjectWorldState {
|
|
||||||
WORLDSTATE_INWORLD, //!< Probably used when the object is in the world
|
|
||||||
WORLDSTATE_ATTACHED, //!< Probably used when the object is attached to another object
|
|
||||||
WORLDSTATE_INVENTORY //!< Probably used when the object is in an inventory
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The trigger stats (???)
|
|
||||||
enum eTriggerStat {
|
|
||||||
INVALID_STAT, //!< ???
|
|
||||||
HEALTH, //!< Probably used for health
|
|
||||||
ARMOR, //!< Probably used for armor
|
|
||||||
IMAGINATION //!< Probably used for imagination
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The trigger operations (???)
|
|
||||||
enum eTriggerOperator {
|
|
||||||
INVALID_OPER, //!< ???
|
|
||||||
EQUAL, //!< ???
|
|
||||||
NOT_EQUAL, //!< ???
|
|
||||||
GREATER, //!< ???
|
|
||||||
GREATER_EQUAL, //!< ???
|
|
||||||
LESS, //!< ???
|
|
||||||
LESS_EQUAL //!< ???
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The various build types
|
|
||||||
enum eBuildType {
|
|
||||||
BUILD_NOWHERE, //!< Used if something can't be built anywhere
|
|
||||||
BUILD_IN_WORLD, //!< Used if something can be built in the world
|
|
||||||
BUILD_ON_PROPERTY //!< Used if something can be build on a property
|
|
||||||
};
|
|
||||||
|
|
||||||
//! Quickbuild fail reasons
|
|
||||||
enum eFailReason : uint32_t {
|
|
||||||
REASON_NOT_GIVEN,
|
|
||||||
REASON_OUT_OF_IMAGINATION,
|
|
||||||
REASON_CANCELED_EARLY,
|
|
||||||
REASON_BUILD_ENDED
|
|
||||||
};
|
|
||||||
|
|
||||||
//! Terminate interaction type
|
|
||||||
enum eTerminateType : uint32_t {
|
|
||||||
RANGE,
|
|
||||||
USER,
|
|
||||||
FROM_INTERACTION
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The combat state
|
|
||||||
enum eCombatState {
|
|
||||||
IDLE, //!< The AI is in an idle state
|
|
||||||
AGGRO, //!< The AI is in an aggressive state
|
|
||||||
TETHER, //!< The AI is being redrawn back to tether point
|
|
||||||
SPAWN, //!< The AI is spawning
|
|
||||||
DEAD //!< The AI is dead
|
|
||||||
};
|
|
||||||
|
|
||||||
enum eControlSceme {
|
|
||||||
SCHEME_A,
|
|
||||||
SCHEME_D,
|
|
||||||
SCHEME_GAMEPAD,
|
|
||||||
SCHEME_E,
|
|
||||||
SCHEME_FPS,
|
|
||||||
SCHEME_DRIVING,
|
|
||||||
SCHEME_TAMING,
|
|
||||||
SCHEME_MODULAR_BUILD,
|
|
||||||
SCHEME_WEAR_A_ROBOT //== freecam?
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class eStateChangeType : uint32_t {
|
|
||||||
PUSH,
|
|
||||||
POP
|
|
||||||
};
|
|
||||||
|
|
||||||
enum eNotifyType {
|
|
||||||
NOTIFY_TYPE_SUCCESS,
|
|
||||||
NOTIFY_TYPE_QUIT,
|
|
||||||
NOTIFY_TYPE_FAILED,
|
|
||||||
NOTIFY_TYPE_BEGIN,
|
|
||||||
NOTIFY_TYPE_READY,
|
|
||||||
NOTIFY_TYPE_NAMINGPET
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
enum class UseItemResponse : uint32_t {
|
|
||||||
NoImaginationForPet = 1,
|
|
||||||
FailedPrecondition,
|
|
||||||
MountsNotAllowed
|
|
||||||
};
|
|
||||||
|
|
||||||
enum eRebuildState : uint32_t {
|
|
||||||
REBUILD_OPEN,
|
|
||||||
REBUILD_COMPLETED = 2,
|
|
||||||
REBUILD_RESETTING = 4,
|
|
||||||
REBUILD_BUILDING,
|
|
||||||
REBUILD_INCOMPLETE
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The loot source's type.
|
|
||||||
*/
|
|
||||||
enum eLootSourceType : int32_t {
|
|
||||||
LOOT_SOURCE_NONE = 0,
|
|
||||||
LOOT_SOURCE_CHEST,
|
|
||||||
LOOT_SOURCE_MISSION,
|
|
||||||
LOOT_SOURCE_MAIL,
|
|
||||||
LOOT_SOURCE_CURRENCY,
|
|
||||||
LOOT_SOURCE_ACHIEVEMENT,
|
|
||||||
LOOT_SOURCE_TRADE,
|
|
||||||
LOOT_SOURCE_QUICKBUILD,
|
|
||||||
LOOT_SOURCE_DELETION,
|
|
||||||
LOOT_SOURCE_VENDOR,
|
|
||||||
LOOT_SOURCE_ACTIVITY,
|
|
||||||
LOOT_SOURCE_PICKUP,
|
|
||||||
LOOT_SOURCE_BRICK,
|
|
||||||
LOOT_SOURCE_PROPERTY,
|
|
||||||
LOOT_SOURCE_MODERATION,
|
|
||||||
LOOT_SOURCE_EXHIBIT,
|
|
||||||
LOOT_SOURCE_INVENTORY,
|
|
||||||
LOOT_SOURCE_CLAIMCODE,
|
|
||||||
LOOT_SOURCE_CONSUMPTION,
|
|
||||||
LOOT_SOURCE_CRAFTING,
|
|
||||||
LOOT_SOURCE_LEVEL_REWARD,
|
|
||||||
LOOT_SOURCE_RELOCATE
|
|
||||||
};
|
|
||||||
|
|
||||||
enum eGameActivities : uint32_t {
|
|
||||||
ACTIVITY_NONE,
|
|
||||||
ACTIVITY_QUICKBUILDING,
|
|
||||||
ACTIVITY_SHOOTING_GALLERY,
|
|
||||||
ACTIVITY_RACING,
|
|
||||||
ACTIVITY_PINBALL,
|
|
||||||
ACTIVITY_PET_TAMING
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ePlayerFlags {
|
|
||||||
BTARR_TESTING = 0,
|
|
||||||
PLAYER_HAS_ENTERED_PET_RANCH = 1,
|
|
||||||
MINIMAP_UNLOCKED = 2,
|
|
||||||
ACTIVITY_REBUILDING_FAIL_TIME = 3,
|
|
||||||
ACTIVITY_REBUILDING_FAIL_RANGE = 4,
|
|
||||||
ACTIVITY_SHOOTING_GALLERY_HELP = 5,
|
|
||||||
HELP_WALKING_CONTROLS = 6,
|
|
||||||
FIRST_SMASHABLE = 7,
|
|
||||||
FIRST_IMAGINATION_PICKUP = 8,
|
|
||||||
FIRST_DAMAGE = 9,
|
|
||||||
FIRST_ITEM = 10,
|
|
||||||
FIRST_BRICK = 11,
|
|
||||||
FIRST_CONSUMABLE = 12,
|
|
||||||
FIRST_EQUIPPABLE = 13,
|
|
||||||
CHAT_HELP = 14,
|
|
||||||
FIRST_PET_TAMING_MINIGAME = 15,
|
|
||||||
FIRST_PET_ON_SWITCH = 16,
|
|
||||||
FIRST_PET_JUMPED_ON_SWITCH = 17,
|
|
||||||
FIRST_PET_FOUND_TREASURE = 18,
|
|
||||||
FIRST_PET_DUG_TREASURE = 19,
|
|
||||||
FIRST_PET_OWNER_ON_PET_BOUNCER = 20,
|
|
||||||
FIRST_PET_DESPAWN_NO_IMAGINATION = 21,
|
|
||||||
FIRST_PET_SELECTED_ENOUGH_BRICKS = 22,
|
|
||||||
FIRST_EMOTE_UNLOCKED = 23,
|
|
||||||
GF_PIRATE_REP = 24,
|
|
||||||
AG_BOB_CINEMATIC_EVENT = 25,
|
|
||||||
HELP_JUMPING_CONTROLS = 26,
|
|
||||||
HELP_DOUBLE_JUMP_CONTROLS = 27,
|
|
||||||
HELP_CAMERA_CONTROLS = 28,
|
|
||||||
HELP_ROTATE_CONTROLS = 29,
|
|
||||||
HELP_SMASH = 30,
|
|
||||||
MONUMENT_INTRO_MUSIC_PLAYED = 31,
|
|
||||||
BEGINNING_ZONE_SUMMARY_DISPLAYED = 32,
|
|
||||||
AG_FINISH_LINE_BUILT = 33,
|
|
||||||
AG_BOSS_AREA_FOUND = 34,
|
|
||||||
AG_LANDED_IN_BATTLEFIELD = 35,
|
|
||||||
GF_PLAYER_HAS_BEEN_TO_THE_RAVINE = 36,
|
|
||||||
MODULAR_BUILD_STARTED = 37,
|
|
||||||
MODULAR_BUILD_FINISHED_CLICK_BUTTON = 38,
|
|
||||||
THINKING_HAT_RECEIVED_GO_TO_MODULAR_BUILD_AREA = 39,
|
|
||||||
BUILD_AREA_ENTERED_MOD_NOT_ACTIVATED_PUT_ON_HAT = 40,
|
|
||||||
HAT_ON_INSIDE_OF_MOD_BUILD_EQUIP_A_MODULE_FROM_LEG = 41,
|
|
||||||
MODULE_EQUIPPED_PLACE_ON_GLOWING_BLUE_SPOT = 42,
|
|
||||||
FIRST_MODULE_PLACED_CORRECTLY_NOW_DO_THE_REST = 43,
|
|
||||||
ROCKET_COMPLETE_NOW_LAUNCH_FROM_PAD = 44,
|
|
||||||
JOINED_A_FACTION = 45,
|
|
||||||
VENTURE_FACTION = 46,
|
|
||||||
ASSEMBLY_FACTION = 47,
|
|
||||||
PARADOX_FACTION = 48,
|
|
||||||
SENTINEL_FACTION = 49,
|
|
||||||
LUP_WORLD_ACCESS = 50,
|
|
||||||
AG_FIRST_FLAG_COLLECTED = 51,
|
|
||||||
TOOLTIP_TALK_TO_SKYLAND_TO_GET_HAT = 52,
|
|
||||||
MODULAR_BUILD_PLAYER_PLACES_FIRST_MODEL_IN_SCRATCH = 53,
|
|
||||||
MODULAR_BUILD_FIRST_ARROW_DISPLAY_FOR_MODULE = 54,
|
|
||||||
AG_BEACON_QB_SO_THE_PLAYER_CAN_ALWAYS_BUILD_THEM = 55,
|
|
||||||
GF_PET_DIG_FLAG_1 = 56,
|
|
||||||
GF_PET_DIG_FLAG_2 = 57,
|
|
||||||
GF_PET_DIG_FLAG_3 = 58,
|
|
||||||
SUPPRESS_SPACESHIP_CINEMATIC_FLYTHROUGH = 59,
|
|
||||||
GF_PLAYER_FALL_DEATH = 60,
|
|
||||||
GF_PLAYER_CAN_GET_FLAG_1 = 61,
|
|
||||||
GF_PLAYER_CAN_GET_FLAG_2 = 62,
|
|
||||||
GF_PLAYER_CAN_GET_FLAG_3 = 63,
|
|
||||||
ENTER_BBB_FROM_PROPERTY_EDIT_CONFIRMATION_DIALOG = 64,
|
|
||||||
AG_FIRST_COMBAT_COMPLETE = 65,
|
|
||||||
AG_COMPLETE_BOB_MISSION = 66,
|
|
||||||
IS_NEWS_SCREEN_VISIBLE = 114,
|
|
||||||
NJ_GARMADON_CINEMATIC_SEEN = 125,
|
|
||||||
ELEPHANT_PET_3050 = 801,
|
|
||||||
CAT_PET_3054 = 802,
|
|
||||||
TRICERATOPS_PET_3195 = 803,
|
|
||||||
TERRIER_PET_3254 = 804,
|
|
||||||
SKUNK_PET_3261 = 805,
|
|
||||||
LION_PET_3520 = 806,
|
|
||||||
BUNNY_PET_3672 = 807,
|
|
||||||
CROCODILE_PET_3994 = 808,
|
|
||||||
DOBERMAN_PET_5635 = 809,
|
|
||||||
BUFFALO_PET_5636 = 810,
|
|
||||||
ROBOT_DOG_PET_5637 = 811,
|
|
||||||
EUROPEAN_DRAGON_PET_5639 = 812,
|
|
||||||
TORTOISE_PET_5640 = 813,
|
|
||||||
ASIAN_DRAGON_PET_5641 = 814,
|
|
||||||
MANTIS_PET_5642 = 815,
|
|
||||||
PANDA_PET_5643 = 816,
|
|
||||||
WARTHOG_PET_6720 = 817,
|
|
||||||
GOAT_PET_7638 = 818,
|
|
||||||
CRAB_PET_7694 = 819,
|
|
||||||
AG_SPACE_SHIP_BINOC_AT_LAUNCH = 1001,
|
|
||||||
AG_SPACE_SHIP_BINOC_AT_LAUNCH_PLATFORM = 1002,
|
|
||||||
AG_SPACE_SHIP_BINOC_ON_PLATFORM_TO_LEFT_OF_START = 1003,
|
|
||||||
AG_SPACE_SHIP_BINOC_ON_PLATFORM_TO_RIGHT_OF_START = 1004,
|
|
||||||
AG_SPACE_SHIP_BINOC_AT_BOB = 1005,
|
|
||||||
AG_BATTLE_BINOC_FOR_TRICERETOPS = 1101,
|
|
||||||
AG_BATTLE_BINOC_AT_PARADOX = 1102,
|
|
||||||
AG_BATTLE_BINOC_AT_MISSION_GIVER = 1103,
|
|
||||||
AG_BATTLE_BINOC_AT_BECK = 1104,
|
|
||||||
AG_MONUMENT_BINOC_INTRO = 1105,
|
|
||||||
AG_MONUMENT_BINOC_OUTRO = 1106,
|
|
||||||
AG_LAUNCH_BINOC_INTRO = 1107,
|
|
||||||
AG_LAUNCH_BINOC_BISON = 1108,
|
|
||||||
AG_LAUNCH_BINOC_SHARK = 1109,
|
|
||||||
NS_BINOC_CONCERT_TRANSITION = 1201,
|
|
||||||
NS_BINOC_RACE_PLACE_TRANSITION = 1202,
|
|
||||||
NS_BINOC_BRICK_ANNEX_TRANSITION = 1203,
|
|
||||||
NS_BINOC_GF_LAUNCH = 1204,
|
|
||||||
NS_BINOC_FV_LAUNCH = 1205,
|
|
||||||
NS_BINOC_BRICK_ANNEX_WATER = 1206,
|
|
||||||
NS_BINOC_AG_LAUNCH_AT_RACE_PLACE = 1207,
|
|
||||||
NS_BINOC_AG_LAUNCH_AT_BRICK_ANNEX = 1208,
|
|
||||||
NS_BINOC_AG_LAUNCH_AT_PLAZA = 1209,
|
|
||||||
NS_BINOC_TBA = 1210,
|
|
||||||
NS_FLAG_COLLECTABLE_1_BY_JONNY_THUNDER = 1211,
|
|
||||||
NS_FLAG_COLLECTABLE_2_UNDER_CONCERT_BRIDGE = 1212,
|
|
||||||
NS_FLAG_COLLECTABLE_3_BY_FV_LAUNCH = 1213,
|
|
||||||
NS_FLAG_COLLECTABLE_4_IN_PLAZA_BEHIND_BUILDING = 1214,
|
|
||||||
NS_FLAG_COLLECTABLE_5_BY_GF_LAUNCH = 1215,
|
|
||||||
NS_FLAG_COLLECTABLE_6_BY_DUCK_SG = 1216,
|
|
||||||
NS_FLAG_COLLECTABLE_7_BY_LUP_LAUNCH = 1217,
|
|
||||||
NS_FLAG_COLLECTABLE_8_BY_NT_LUANCH = 1218,
|
|
||||||
NS_FLAG_COLLECTABLE_9_BY_RACE_BUILD = 1219,
|
|
||||||
NS_FLAG_COLLECTABLE_10_ON_AG_LAUNCH_PATH = 1220,
|
|
||||||
PR_BINOC_AT_LAUNCH_PAD = 1251,
|
|
||||||
PR_BINOC_AT_BEGINNING_OF_ISLAND_B = 1252,
|
|
||||||
PR_BINOC_AT_FIRST_PET_BOUNCER = 1253,
|
|
||||||
PR_BINOC_ON_BY_CROWS_NEST = 1254,
|
|
||||||
PR_PET_DIG_AT_BEGINNING_OF_ISLAND_B = 1261,
|
|
||||||
PR_PET_DIG_AT_THE_LOCATION_OF_OLD_BOUNCE_BACK = 1262,
|
|
||||||
PR_PET_DIG_UNDER_QB_BRIDGE = 1263,
|
|
||||||
PR_PET_DIG_BACK_SIDE_BY_PARTNER_BOUNCE = 1264,
|
|
||||||
PR_PET_DIG_BY_LAUNCH_PAD = 1265,
|
|
||||||
PR_PET_DIG_BY_FIRST_PET_BOUNCER = 1266,
|
|
||||||
GF_BINOC_ON_LANDING_PAD = 1301,
|
|
||||||
GF_BINOC_AT_RAVINE_START = 1302,
|
|
||||||
GF_BINOC_ON_TOP_OF_RAVINE_HEAD = 1303,
|
|
||||||
GF_BINOC_AT_TURTLE_AREA = 1304,
|
|
||||||
GF_BINOC_IN_TUNNEL_TO_ELEPHANTS = 1305,
|
|
||||||
GF_BINOC_IN_ELEPHANTS_AREA = 1306,
|
|
||||||
GF_BINOC_IN_RACING_AREA = 1307,
|
|
||||||
GF_BINOC_IN_CROC_AREA = 1308,
|
|
||||||
GF_BINOC_IN_JAIL_AREA = 1309,
|
|
||||||
GF_BINOC_TELESCOPE_NEXT_TO_CAPTAIN_JACK = 1310,
|
|
||||||
NT_PLINTH_REBUILD = 1919,
|
|
||||||
NT_FACTION_SPY_DUKE = 1974,
|
|
||||||
NT_FACTION_SPY_OVERBUILD = 1976,
|
|
||||||
NT_FACTION_SPY_HAEL = 1977,
|
|
||||||
NJ_EARTH_SPINJITZU = 2030,
|
|
||||||
NJ_LIGHTNING_SPINJITZU = 2031,
|
|
||||||
NJ_ICE_SPINJITZU = 2032,
|
|
||||||
NJ_FIRE_SPINJITZU = 2033,
|
|
||||||
NJ_WU_SHOW_DAILY_CHEST = 2099
|
|
||||||
};
|
|
||||||
|
|
||||||
//======== FUNC ===========
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
inline T const& clamp(const T& val, const T& low, const T& high) {
|
|
||||||
if (val < low) return low;
|
|
||||||
else if (val > high) return high;
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //!__DCOMMONVARS__H__
|
#endif //!__DCOMMONVARS__H__
|
||||||
|
@ -1,564 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "MessageIdentifiers.h"
|
|
||||||
|
|
||||||
enum CONNECTION_TYPE {
|
|
||||||
SERVER = 0, //!< Means it is used throughout all servers
|
|
||||||
AUTH, //!< Means it is sent from the client authentication
|
|
||||||
CHAT, //!< Means it is sent from and to the chat server
|
|
||||||
CHAT_INTERNAL, //!< Unused - We can potentially use this in the future for various things
|
|
||||||
WORLD, //!< Means it is sent from the client world
|
|
||||||
CLIENT, //!< Means it is sent to the client from the world server
|
|
||||||
MASTER //!< Means it is sent to and from the master server
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The Internal Server Packet Identifiers
|
|
||||||
enum SERVER {
|
|
||||||
MSG_SERVER_VERSION_CONFIRM = 0, /*!< Sent during a handshake to confirm the server/client version */
|
|
||||||
MSG_SERVER_DISCONNECT_NOTIFY, /*!< Sent when a user disconnected */
|
|
||||||
MSG_SERVER_GENERAL_NOTIFY /*!< A general notification */
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The Internal Authentication Packet Identifiers
|
|
||||||
enum AUTH {
|
|
||||||
MSG_AUTH_LOGIN_REQUEST = 0, /*!< Sent from the client when a user logs in */
|
|
||||||
MSG_AUTH_LOGOUT_REQUEST, /*!< Sent from the client when a user logs out */
|
|
||||||
MSG_AUTH_CREATE_NEW_ACCOUNT_REQUEST, /*!< Sent from the client when a user creates a new account */
|
|
||||||
MSG_AUTH_LEGOINTERFACE_AUTH_RESPONSE, /*!< Unknown */
|
|
||||||
MSG_AUTH_SESSIONKEY_RECEIVED_CONFIRM, /*!< Sent when the server recieved the session key (?) */
|
|
||||||
MSG_AUTH_RUNTIME_CONFIG /*!< Unknown */
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The Internal Chat Packet Identifiers
|
|
||||||
enum CHAT {
|
|
||||||
MSG_CHAT_LOGIN_SESSION_NOTIFY = 0, /*!< When a user logs in */
|
|
||||||
MSG_CHAT_GENERAL_CHAT_MESSAGE, /*!< Used for global chat messages */
|
|
||||||
MSG_CHAT_PRIVATE_CHAT_MESSAGE, /*!< Used for private chat messages */
|
|
||||||
MSG_CHAT_USER_CHANNEL_CHAT_MESSAGE, /*!< Unknown */
|
|
||||||
MSG_CHAT_WORLD_DISCONNECT_REQUEST, /*!< Unknown */
|
|
||||||
MSG_CHAT_WORLD_PROXIMITY_RESPONSE, /*!< Unknown */
|
|
||||||
MSG_CHAT_WORLD_PARCEL_RESPONSE, /*!< Unknown */
|
|
||||||
MSG_CHAT_ADD_FRIEND_REQUEST, /*!< When the client requests to add a friend */
|
|
||||||
MSG_CHAT_ADD_FRIEND_RESPONSE, /*!< Sent from the server when the client adds a friend */
|
|
||||||
MSG_CHAT_REMOVE_FRIEND, /*!< When the client removes a friend */
|
|
||||||
MSG_CHAT_GET_FRIENDS_LIST, /*!< Sent when the client requests a user's friends list */
|
|
||||||
MSG_CHAT_ADD_IGNORE, /*!< Sent when the client adds a friend to the "ignore" list */
|
|
||||||
MSG_CHAT_REMOVE_IGNORE, /*!< Sent when the client removes a friend from the "ignore" list */
|
|
||||||
MSG_CHAT_GET_IGNORE_LIST, /*!< Sent when the client requests a user's ignored list */
|
|
||||||
MSG_CHAT_TEAM_MISSED_INVITE_CHECK, /*!< Unknown (Something with an unresponded-to friend request probably) */
|
|
||||||
MSG_CHAT_TEAM_INVITE, /*!< When the client invites a user to a team */
|
|
||||||
MSG_CHAT_TEAM_INVITE_RESPONSE, /*!< Sent from the server when the client invites someone to the team */
|
|
||||||
MSG_CHAT_TEAM_KICK, /*!< Sent when the client kicks a member from a team */
|
|
||||||
MSG_CHAT_TEAM_LEAVE, /*!< Sent when the client leaves a team */
|
|
||||||
MSG_CHAT_TEAM_SET_LOOT, /*!< Unknown (Something to do with team loot) */
|
|
||||||
MSG_CHAT_TEAM_SET_LEADER, /*!< Unknown (Probably sets the team leader or something) */
|
|
||||||
MSG_CHAT_TEAM_GET_STATUS, /*!< Check to see if we are in a team or not, sent on world join */
|
|
||||||
MSG_CHAT_GUILD_CREATE, /*!< Guild Creation */
|
|
||||||
MSG_CHAT_GUILD_INVITE, /*!< Guild Invitation */
|
|
||||||
MSG_CHAT_GUILD_INVITE_RESPONSE, /*!< Guild Invite Response */
|
|
||||||
MSG_CHAT_GUILD_LEAVE, /*!< Guild Leave */
|
|
||||||
MSG_CHAT_GUILD_KICK, /*!< Guild Kick */
|
|
||||||
MSG_CHAT_GUILD_GET_STATUS, /*!< Guild Get Status */
|
|
||||||
MSG_CHAT_GUILD_GET_ALL, /*!< Guild Get All */
|
|
||||||
MSG_CHAT_SHOW_ALL,
|
|
||||||
MSG_CHAT_BLUEPRINT_MODERATED,
|
|
||||||
MSG_CHAT_BLUEPRINT_MODEL_READY,
|
|
||||||
MSG_CHAT_PROPERTY_READY_FOR_APPROVAL,
|
|
||||||
MSG_CHAT_PROPERTY_MODERATION_CHANGED,
|
|
||||||
MSG_CHAT_PROPERTY_BUILDMODE_CHANGED,
|
|
||||||
MSG_CHAT_PROPERTY_BUILDMODE_CHANGED_REPORT,
|
|
||||||
MSG_CHAT_MAIL,
|
|
||||||
MSG_CHAT_WORLD_INSTANCE_LOCATION_REQUEST,
|
|
||||||
MSG_CHAT_REPUTATION_UPDATE,
|
|
||||||
MSG_CHAT_SEND_CANNED_TEXT,
|
|
||||||
MSG_CHAT_GMLEVEL_UPDATE,
|
|
||||||
MSG_CHAT_CHARACTER_NAME_CHANGE_REQUEST,
|
|
||||||
MSG_CHAT_CSR_REQUEST,
|
|
||||||
MSG_CHAT_CSR_REPLY,
|
|
||||||
MSG_CHAT_GM_KICK,
|
|
||||||
MSG_CHAT_GM_ANNOUNCE,
|
|
||||||
MSG_CHAT_GM_MUTE,
|
|
||||||
MSG_CHAT_ACTIVITY_UPDATE,
|
|
||||||
MSG_CHAT_WORLD_ROUTE_PACKET,
|
|
||||||
MSG_CHAT_GET_ZONE_POPULATIONS,
|
|
||||||
MSG_CHAT_REQUEST_MINIMUM_CHAT_MODE,
|
|
||||||
MSG_CHAT_REQUEST_MINIMUM_CHAT_MODE_PRIVATE,
|
|
||||||
MSG_CHAT_MATCH_REQUEST,
|
|
||||||
MSG_CHAT_UGCMANIFEST_REPORT_MISSING_FILE,
|
|
||||||
MSG_CHAT_UGCMANIFEST_REPORT_DONE_FILE,
|
|
||||||
MSG_CHAT_UGCMANIFEST_REPORT_DONE_BLUEPRINT,
|
|
||||||
MSG_CHAT_UGCC_REQUEST,
|
|
||||||
MSG_CHAT_WHO,
|
|
||||||
MSG_CHAT_WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE,
|
|
||||||
MSG_CHAT_ACHIEVEMENT_NOTIFY,
|
|
||||||
MSG_CHAT_GM_CLOSE_PRIVATE_CHAT_WINDOW,
|
|
||||||
MSG_CHAT_UNEXPECTED_DISCONNECT,
|
|
||||||
MSG_CHAT_PLAYER_READY,
|
|
||||||
MSG_CHAT_GET_DONATION_TOTAL,
|
|
||||||
MSG_CHAT_UPDATE_DONATION,
|
|
||||||
MSG_CHAT_PRG_CSR_COMMAND,
|
|
||||||
MSG_CHAT_HEARTBEAT_REQUEST_FROM_WORLD,
|
|
||||||
MSG_CHAT_UPDATE_FREE_TRIAL_STATUS
|
|
||||||
};
|
|
||||||
|
|
||||||
//! Used for packets related to chatting
|
|
||||||
enum CHAT_INTERNAL {
|
|
||||||
MSG_CHAT_INTERNAL_PLAYER_ADDED_NOTIFICATION = 0,
|
|
||||||
MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION,
|
|
||||||
MSG_CHAT_INTERNAL_ADD_FRIEND,
|
|
||||||
MSG_CHAT_INTERNAL_ADD_BEST_FRIEND,
|
|
||||||
MSG_CHAT_INTERNAL_ADD_TO_TEAM,
|
|
||||||
MSG_CHAT_INTERNAL_ADD_BLOCK,
|
|
||||||
MSG_CHAT_INTERNAL_REMOVE_FRIEND,
|
|
||||||
MSG_CHAT_INTERNAL_REMOVE_BLOCK,
|
|
||||||
MSG_CHAT_INTERNAL_REMOVE_FROM_TEAM,
|
|
||||||
MSG_CHAT_INTERNAL_DELETE_TEAM,
|
|
||||||
MSG_CHAT_INTERNAL_REPORT,
|
|
||||||
MSG_CHAT_INTERNAL_PRIVATE_CHAT,
|
|
||||||
MSG_CHAT_INTERNAL_PRIVATE_CHAT_RESPONSE,
|
|
||||||
MSG_CHAT_INTERNAL_ANNOUNCEMENT,
|
|
||||||
MSG_CHAT_INTERNAL_MAIL_COUNT_UPDATE,
|
|
||||||
MSG_CHAT_INTERNAL_MAIL_SEND_NOTIFY,
|
|
||||||
MSG_CHAT_INTERNAL_REQUEST_USER_LIST,
|
|
||||||
MSG_CHAT_INTERNAL_FRIEND_LIST,
|
|
||||||
MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER,
|
|
||||||
MSG_CHAT_INTERNAL_TEAM_UPDATE,
|
|
||||||
MSG_CHAT_INTERNAL_MUTE_UPDATE,
|
|
||||||
MSG_CHAT_INTERNAL_CREATE_TEAM,
|
|
||||||
};
|
|
||||||
|
|
||||||
//! Used for packets send to the world
|
|
||||||
enum WORLD {
|
|
||||||
MSG_WORLD_CLIENT_VALIDATION = 1, // Session info
|
|
||||||
MSG_WORLD_CLIENT_CHARACTER_LIST_REQUEST,
|
|
||||||
MSG_WORLD_CLIENT_CHARACTER_CREATE_REQUEST,
|
|
||||||
MSG_WORLD_CLIENT_LOGIN_REQUEST, // Character selected
|
|
||||||
MSG_WORLD_CLIENT_GAME_MSG,
|
|
||||||
MSG_WORLD_CLIENT_CHARACTER_DELETE_REQUEST,
|
|
||||||
MSG_WORLD_CLIENT_CHARACTER_RENAME_REQUEST,
|
|
||||||
MSG_WORLD_CLIENT_HAPPY_FLOWER_MODE_NOTIFY,
|
|
||||||
MSG_WORLD_CLIENT_SLASH_RELOAD_MAP, // Reload map cmp
|
|
||||||
MSG_WORLD_CLIENT_SLASH_PUSH_MAP_REQUEST, // Push map req cmd
|
|
||||||
MSG_WORLD_CLIENT_SLASH_PUSH_MAP, // Push map cmd
|
|
||||||
MSG_WORLD_CLIENT_SLASH_PULL_MAP, // Pull map cmd
|
|
||||||
MSG_WORLD_CLIENT_LOCK_MAP_REQUEST,
|
|
||||||
MSG_WORLD_CLIENT_GENERAL_CHAT_MESSAGE, // General chat message
|
|
||||||
MSG_WORLD_CLIENT_HTTP_MONITOR_INFO_REQUEST,
|
|
||||||
MSG_WORLD_CLIENT_SLASH_DEBUG_SCRIPTS, // Debug scripts cmd
|
|
||||||
MSG_WORLD_CLIENT_MODELS_CLEAR,
|
|
||||||
MSG_WORLD_CLIENT_EXHIBIT_INSERT_MODEL,
|
|
||||||
MSG_WORLD_CLIENT_LEVEL_LOAD_COMPLETE, // Character data request
|
|
||||||
MSG_WORLD_CLIENT_TMP_GUILD_CREATE,
|
|
||||||
MSG_WORLD_CLIENT_ROUTE_PACKET, // Social?
|
|
||||||
MSG_WORLD_CLIENT_POSITION_UPDATE,
|
|
||||||
MSG_WORLD_CLIENT_MAIL,
|
|
||||||
MSG_WORLD_CLIENT_WORD_CHECK, // Whitelist word check
|
|
||||||
MSG_WORLD_CLIENT_STRING_CHECK, // Whitelist string check
|
|
||||||
MSG_WORLD_CLIENT_GET_PLAYERS_IN_ZONE,
|
|
||||||
MSG_WORLD_CLIENT_REQUEST_UGC_MANIFEST_INFO,
|
|
||||||
MSG_WORLD_CLIENT_BLUEPRINT_GET_ALL_DATA_REQUEST,
|
|
||||||
MSG_WORLD_CLIENT_CANCEL_MAP_QUEUE,
|
|
||||||
MSG_WORLD_CLIENT_HANDLE_FUNNESS,
|
|
||||||
MSG_WORLD_CLIENT_FAKE_PRG_CSR_MESSAGE,
|
|
||||||
MSG_WORLD_CLIENT_REQUEST_FREE_TRIAL_REFRESH,
|
|
||||||
MSG_WORLD_CLIENT_GM_SET_FREE_TRIAL_STATUS
|
|
||||||
};
|
|
||||||
|
|
||||||
//! An enum for packets sent to the client
|
|
||||||
enum CLIENT {
|
|
||||||
MSG_CLIENT_LOGIN_RESPONSE = 0,
|
|
||||||
MSG_CLIENT_LOGOUT_RESPONSE,
|
|
||||||
MSG_CLIENT_LOAD_STATIC_ZONE,
|
|
||||||
MSG_CLIENT_CREATE_OBJECT,
|
|
||||||
MSG_CLIENT_CREATE_CHARACTER,
|
|
||||||
MSG_CLIENT_CREATE_CHARACTER_EXTENDED,
|
|
||||||
MSG_CLIENT_CHARACTER_LIST_RESPONSE,
|
|
||||||
MSG_CLIENT_CHARACTER_CREATE_RESPONSE,
|
|
||||||
MSG_CLIENT_CHARACTER_RENAME_RESPONSE,
|
|
||||||
MSG_CLIENT_CHAT_CONNECT_RESPONSE,
|
|
||||||
MSG_CLIENT_AUTH_ACCOUNT_CREATE_RESPONSE,
|
|
||||||
MSG_CLIENT_DELETE_CHARACTER_RESPONSE,
|
|
||||||
MSG_CLIENT_GAME_MSG,
|
|
||||||
MSG_CLIENT_CONNECT_CHAT,
|
|
||||||
MSG_CLIENT_TRANSFER_TO_WORLD,
|
|
||||||
MSG_CLIENT_IMPENDING_RELOAD_NOTIFY,
|
|
||||||
MSG_CLIENT_MAKE_GM_RESPONSE,
|
|
||||||
MSG_CLIENT_HTTP_MONITOR_INFO_RESPONSE,
|
|
||||||
MSG_CLIENT_SLASH_PUSH_MAP_RESPONSE,
|
|
||||||
MSG_CLIENT_SLASH_PULL_MAP_RESPONSE,
|
|
||||||
MSG_CLIENT_SLASH_LOCK_MAP_RESPONSE,
|
|
||||||
MSG_CLIENT_BLUEPRINT_SAVE_RESPONSE,
|
|
||||||
MSG_CLIENT_BLUEPRINT_LUP_SAVE_RESPONSE,
|
|
||||||
MSG_CLIENT_BLUEPRINT_LOAD_RESPONSE_ITEMID,
|
|
||||||
MSG_CLIENT_BLUEPRINT_GET_ALL_DATA_RESPONSE,
|
|
||||||
MSG_CLIENT_MODEL_INSTANTIATE_RESPONSE,
|
|
||||||
MSG_CLIENT_DEBUG_OUTPUT,
|
|
||||||
MSG_CLIENT_ADD_FRIEND_REQUEST,
|
|
||||||
MSG_CLIENT_ADD_FRIEND_RESPONSE,
|
|
||||||
MSG_CLIENT_REMOVE_FRIEND_RESPONSE,
|
|
||||||
MSG_CLIENT_GET_FRIENDS_LIST_RESPONSE,
|
|
||||||
MSG_CLIENT_UPDATE_FRIEND_NOTIFY,
|
|
||||||
MSG_CLIENT_ADD_IGNORE_RESPONSE,
|
|
||||||
MSG_CLIENT_REMOVE_IGNORE_RESPONSE,
|
|
||||||
MSG_CLIENT_GET_IGNORE_LIST_RESPONSE,
|
|
||||||
MSG_CLIENT_TEAM_INVITE,
|
|
||||||
MSG_CLIENT_TEAM_INVITE_INITIAL_RESPONSE,
|
|
||||||
MSG_CLIENT_GUILD_CREATE_RESPONSE,
|
|
||||||
MSG_CLIENT_GUILD_GET_STATUS_RESPONSE,
|
|
||||||
MSG_CLIENT_GUILD_INVITE,
|
|
||||||
MSG_CLIENT_GUILD_INVITE_INITIAL_RESPONSE,
|
|
||||||
MSG_CLIENT_GUILD_INVITE_FINAL_RESPONSE,
|
|
||||||
MSG_CLIENT_GUILD_INVITE_CONFIRM,
|
|
||||||
MSG_CLIENT_GUILD_ADD_PLAYER,
|
|
||||||
MSG_CLIENT_GUILD_REMOVE_PLAYER,
|
|
||||||
MSG_CLIENT_GUILD_LOGIN_LOGOUT,
|
|
||||||
MSG_CLIENT_GUILD_RANK_CHANGE,
|
|
||||||
MSG_CLIENT_GUILD_DATA,
|
|
||||||
MSG_CLIENT_GUILD_STATUS,
|
|
||||||
MSG_CLIENT_MAIL,
|
|
||||||
MSG_CLIENT_DB_PROXY_RESULT,
|
|
||||||
MSG_CLIENT_SHOW_ALL_RESPONSE,
|
|
||||||
MSG_CLIENT_WHO_RESPONSE,
|
|
||||||
MSG_CLIENT_SEND_CANNED_TEXT,
|
|
||||||
MSG_CLIENT_UPDATE_CHARACTER_NAME,
|
|
||||||
MSG_CLIENT_SET_NETWORK_SIMULATOR,
|
|
||||||
MSG_CLIENT_INVALID_CHAT_MESSAGE,
|
|
||||||
MSG_CLIENT_MINIMUM_CHAT_MODE_RESPONSE,
|
|
||||||
MSG_CLIENT_MINIMUM_CHAT_MODE_RESPONSE_PRIVATE,
|
|
||||||
MSG_CLIENT_CHAT_MODERATION_STRING,
|
|
||||||
MSG_CLIENT_UGC_MANIFEST_RESPONSE,
|
|
||||||
MSG_CLIENT_IN_LOGIN_QUEUE,
|
|
||||||
MSG_CLIENT_SERVER_STATES,
|
|
||||||
MSG_CLIENT_GM_CLOSE_TARGET_CHAT_WINDOW,
|
|
||||||
MSG_CLIENT_GENERAL_TEXT_FOR_LOCALIZATION,
|
|
||||||
MSG_CLIENT_UPDATE_FREE_TRIAL_STATUS,
|
|
||||||
MSG_CLIENT_UGC_DOWNLOAD_FAILED = 120
|
|
||||||
};
|
|
||||||
|
|
||||||
//! Used for packets sent to the master server
|
|
||||||
enum MASTER {
|
|
||||||
MSG_MASTER_REQUEST_PERSISTENT_ID = 1,
|
|
||||||
MSG_MASTER_REQUEST_PERSISTENT_ID_RESPONSE,
|
|
||||||
MSG_MASTER_REQUEST_ZONE_TRANSFER,
|
|
||||||
MSG_MASTER_REQUEST_ZONE_TRANSFER_RESPONSE,
|
|
||||||
MSG_MASTER_SERVER_INFO,
|
|
||||||
MSG_MASTER_REQUEST_SESSION_KEY,
|
|
||||||
MSG_MASTER_SET_SESSION_KEY,
|
|
||||||
MSG_MASTER_SESSION_KEY_RESPONSE,
|
|
||||||
MSG_MASTER_PLAYER_ADDED,
|
|
||||||
MSG_MASTER_PLAYER_REMOVED,
|
|
||||||
|
|
||||||
MSG_MASTER_CREATE_PRIVATE_ZONE,
|
|
||||||
MSG_MASTER_REQUEST_PRIVATE_ZONE,
|
|
||||||
|
|
||||||
MSG_MASTER_WORLD_READY,
|
|
||||||
MSG_MASTER_PREP_ZONE,
|
|
||||||
|
|
||||||
MSG_MASTER_SHUTDOWN,
|
|
||||||
MSG_MASTER_SHUTDOWN_RESPONSE,
|
|
||||||
MSG_MASTER_SHUTDOWN_IMMEDIATE,
|
|
||||||
|
|
||||||
MSG_MASTER_SHUTDOWN_UNIVERSE,
|
|
||||||
|
|
||||||
MSG_MASTER_AFFIRM_TRANSFER_REQUEST,
|
|
||||||
MSG_MASTER_AFFIRM_TRANSFER_RESPONSE,
|
|
||||||
|
|
||||||
MSG_MASTER_NEW_SESSION_ALERT
|
|
||||||
};
|
|
||||||
|
|
||||||
//! The Game messages
|
|
||||||
enum GAME_MSG : unsigned short {
|
|
||||||
GAME_MSG_TELEPORT = 19,
|
|
||||||
GAME_MSG_SET_PLAYER_CONTROL_SCHEME = 26,
|
|
||||||
GAME_MSG_DROP_CLIENT_LOOT = 30,
|
|
||||||
GAME_MSG_DIE = 37,
|
|
||||||
GAME_MSG_REQUEST_DIE = 38,
|
|
||||||
GAME_MSG_PLAY_EMOTE = 41,
|
|
||||||
GAME_MSG_PLAY_ANIMATION = 43,
|
|
||||||
GAME_MSG_CONTROL_BEHAVIOR = 48,
|
|
||||||
GAME_MSG_SET_NAME = 72,
|
|
||||||
GAME_MSG_ECHO_START_SKILL = 118,
|
|
||||||
GAME_MSG_START_SKILL = 119,
|
|
||||||
GAME_MSG_VERIFY_ACK = 121,
|
|
||||||
GAME_MSG_ADD_SKILL = 127,
|
|
||||||
GAME_MSG_REMOVE_SKILL = 128,
|
|
||||||
GAME_MSG_SET_CURRENCY = 133,
|
|
||||||
GAME_MSG_PICKUP_CURRENCY = 137,
|
|
||||||
GAME_MSG_PICKUP_ITEM = 139,
|
|
||||||
GAME_MSG_TEAM_PICKUP_ITEM = 140,
|
|
||||||
GAME_MSG_PLAY_FX_EFFECT = 154,
|
|
||||||
GAME_MSG_STOP_FX_EFFECT = 155,
|
|
||||||
GAME_MSG_REQUEST_RESURRECT = 159,
|
|
||||||
GAME_MSG_RESURRECT = 160,
|
|
||||||
GAME_MSG_PUSH_EQUIPPED_ITEMS_STATE = 191,
|
|
||||||
GAME_MSG_POP_EQUIPPED_ITEMS_STATE = 192,
|
|
||||||
GAME_MSG_SET_GM_LEVEL = 193,
|
|
||||||
GAME_MSG_SET_STUNNED = 198,
|
|
||||||
GAME_MSG_SET_STUN_IMMUNITY = 200,
|
|
||||||
GAME_MSG_KNOCKBACK = 202,
|
|
||||||
GAME_MSG_REBUILD_CANCEL = 209,
|
|
||||||
GAME_MSG_ENABLE_REBUILD = 213,
|
|
||||||
GAME_MSG_MOVE_ITEM_IN_INVENTORY = 224,
|
|
||||||
GAME_MSG_ADD_ITEM_TO_INVENTORY_CLIENT_SYNC = 227,
|
|
||||||
GAME_MSG_REMOVE_ITEM_FROM_INVENTORY = 230,
|
|
||||||
GAME_MSG_EQUIP_ITEM = 231,
|
|
||||||
GAME_MSG_UN_EQUIP_ITEM = 233,
|
|
||||||
GAME_MSG_OFFER_MISSION = 248,
|
|
||||||
GAME_MSG_RESPOND_TO_MISSION = 249,
|
|
||||||
GAME_MSG_NOTIFY_MISSION = 254,
|
|
||||||
GAME_MSG_NOTIFY_MISSION_TASK = 255,
|
|
||||||
GAME_MSG_REBUILD_NOTIFY_STATE = 336,
|
|
||||||
GAME_MSG_TERMINATE_INTERACTION = 357,
|
|
||||||
GAME_MSG_SERVER_TERMINATE_INTERACTION = 358,
|
|
||||||
GAME_MSG_REQUEST_USE = 364,
|
|
||||||
GAME_MSG_VENDOR_OPEN_WINDOW = 369,
|
|
||||||
GAME_MSG_BUY_FROM_VENDOR = 373,
|
|
||||||
GAME_MSG_SELL_TO_VENDOR = 374,
|
|
||||||
GAME_MSG_TEAM_SET_OFF_WORLD_FLAG = 383,
|
|
||||||
GAME_MSG_SET_INVENTORY_SIZE = 389,
|
|
||||||
GAME_MSG_ACKNOWLEDGE_POSSESSION = 391,
|
|
||||||
GAME_MSG_SET_SHOOTING_GALLERY_PARAMS = 400,
|
|
||||||
GAME_MSG_REQUEST_ACTIVITY_START_STOP = 402,
|
|
||||||
GAME_MSG_REQUEST_ACTIVITY_ENTER = 403,
|
|
||||||
GAME_MSG_REQUEST_ACTIVITY_EXIT = 404,
|
|
||||||
GAME_MSG_ACTIVITY_ENTER = 405,
|
|
||||||
GAME_MSG_ACTIVITY_EXIT = 406,
|
|
||||||
GAME_MSG_ACTIVITY_START = 407,
|
|
||||||
GAME_MSG_ACTIVITY_STOP = 408,
|
|
||||||
GAME_MSG_SHOOTING_GALLERY_CLIENT_AIM_UPDATE = 409,
|
|
||||||
GAME_MSG_SHOOTING_GALLERY_FIRE = 411,
|
|
||||||
GAME_MSG_REQUEST_VENDOR_STATUS_UPDATE = 416,
|
|
||||||
GAME_MSG_VENDOR_STATUS_UPDATE = 417,
|
|
||||||
GAME_MSG_NOTIFY_CLIENT_SHOOTING_GALLERY_SCORE = 425,
|
|
||||||
GAME_MSG_CONSUME_CLIENT_ITEM = 427,
|
|
||||||
GAME_MSG_CLIENT_ITEM_CONSUMED = 428,
|
|
||||||
GAME_MSG_UPDATE_SHOOTING_GALLERY_ROTATION = 448,
|
|
||||||
GAME_MSG_SET_FLAG = 471,
|
|
||||||
GAME_MSG_NOTIFY_CLIENT_FLAG_CHANGE = 472,
|
|
||||||
GAME_MSG_VENDOR_TRANSACTION_RESULT = 476,
|
|
||||||
GAME_MSG_HAS_BEEN_COLLECTED = 486,
|
|
||||||
GAME_MSG_DISPLAY_CHAT_BUBBLE = 495,
|
|
||||||
GAME_MSG_SPAWN_PET = 498,
|
|
||||||
GAME_MSG_DESPAWN_PET = 499,
|
|
||||||
GAME_MSG_PLAYER_LOADED = 505,
|
|
||||||
GAME_MSG_PLAYER_READY = 509,
|
|
||||||
GAME_MSG_REQUEST_LINKED_MISSION = 515,
|
|
||||||
GAME_MSG_INVALID_ZONE_TRANSFER_LIST = 519,
|
|
||||||
GAME_MSG_MISSION_DIALOGUE_OK = 520,
|
|
||||||
GAME_MSG_DISPLAY_MESSAGE_BOX = 529,
|
|
||||||
GAME_MSG_MESSAGE_BOX_RESPOND = 530,
|
|
||||||
GAME_MSG_CHOICE_BOX_RESPOND = 531,
|
|
||||||
GAME_MSG_SMASH = 537,
|
|
||||||
GAME_MSG_UNSMASH = 538,
|
|
||||||
GAME_MSG_SET_SHOOTING_GALLERY_RETICULE_EFFECT = 548,
|
|
||||||
GAME_MSG_PLACE_MODEL_RESPONSE = 0x223,
|
|
||||||
GAME_MSG_SET_JET_PACK_MODE = 561,
|
|
||||||
GAME_MSG_REGISTER_PET_ID = 565,
|
|
||||||
GAME_MSG_REGISTER_PET_DBID = 566,
|
|
||||||
GAME_MSG_SHOW_ACTIVITY_COUNTDOWN = 568,
|
|
||||||
GAME_MSG_START_ACTIVITY_TIME = 576,
|
|
||||||
GAME_MSG_ACTIVITY_PAUSE = 602,
|
|
||||||
GAME_MSG_USE_NON_EQUIPMENT_ITEM = 603,
|
|
||||||
GAME_MSG_USE_ITEM_RESULT = 607,
|
|
||||||
GAME_MSG_COMMAND_PET = 640,
|
|
||||||
GAME_MSG_PET_RESPONSE = 641,
|
|
||||||
GAME_MSG_REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 648,
|
|
||||||
GAME_MSG_SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 649,
|
|
||||||
GAME_MSG_NOTIFY_OBJECT = 656,
|
|
||||||
GAME_MSG_CLIENT_NOTIFY_PET = 659,
|
|
||||||
GAME_MSG_NOTIFY_PET = 660,
|
|
||||||
GAME_MSG_NOTIFY_PET_TAMING_MINIGAME = 661,
|
|
||||||
GAME_MSG_START_SERVER_PET_MINIGAME_TIMER = 662,
|
|
||||||
GAME_MSG_CLIENT_EXIT_TAMING_MINIGAME = 663,
|
|
||||||
GAME_MSG_PET_NAME_CHANGED = 686,
|
|
||||||
GAME_MSG_PET_TAMING_MINIGAME_RESULT = 667,
|
|
||||||
GAME_MSG_PET_TAMING_TRY_BUILD_RESULT = 668,
|
|
||||||
GAME_MSG_NOTIFY_TAMING_BUILD_SUCCESS = 673,
|
|
||||||
GAME_MSG_NOTIFY_TAMING_MODEL_LOADED_ON_SERVER = 674,
|
|
||||||
GAME_MSG_ACTIVATE_BUBBLE_BUFF = 678,
|
|
||||||
GAME_MSG_DEACTIVATE_BUBBLE_BUFF = 679,
|
|
||||||
GAME_MSG_ADD_PET_TO_PLAYER = 681,
|
|
||||||
GAME_MSG_REQUEST_SET_PET_NAME = 683,
|
|
||||||
GAME_MSG_SET_PET_NAME = 684,
|
|
||||||
GAME_MSG_NOTIFY_PET_TAMING_PUZZLE_SELECTED = 675,
|
|
||||||
GAME_MSG_SHOW_PET_ACTION_BUTTON = 692,
|
|
||||||
GAME_MSG_SET_EMOTE_LOCK_STATE = 693,
|
|
||||||
GAME_MSG_USE_ITEM_REQUIREMENTS_RESPONSE = 703,
|
|
||||||
GAME_MSG_PLAY_EMBEDDED_EFFECT_ON_ALL_CLIENTS_NEAR_OBJECT = 713,
|
|
||||||
GAME_MSG_DOWNLOAD_PROPERTY_DATA = 716,
|
|
||||||
GAME_MSG_QUERY_PROPERTY_DATA = 717,
|
|
||||||
GAME_MSG_PROPERTY_EDITOR_BEGIN = 724,
|
|
||||||
GAME_MSG_PROPERTY_EDITOR_END = 725,
|
|
||||||
GAME_MSG_IS_MINIFIG_IN_A_BUBBLE = 729,
|
|
||||||
GAME_MSG_START_PATHING = 733,
|
|
||||||
GAME_MSG_ACTIVATE_BUBBLE_BUFF_FROM_SERVER = 734,
|
|
||||||
GAME_MSG_DEACTIVATE_BUBBLE_BUFF_FROM_SERVER = 735,
|
|
||||||
GAME_MSG_NOTIFY_CLIENT_ZONE_OBJECT = 737,
|
|
||||||
GAME_MSG_UPDATE_REPUTATION = 746,
|
|
||||||
GAME_MSG_PROPERTY_RENTAL_RESPONSE = 750,
|
|
||||||
GAME_MSG_REQUEST_PLATFORM_RESYNC = 760,
|
|
||||||
GAME_MSG_PLATFORM_RESYNC = 761,
|
|
||||||
GAME_MSG_PLAY_CINEMATIC = 762,
|
|
||||||
GAME_MSG_END_CINEMATIC = 763,
|
|
||||||
GAME_MSG_CINEMATIC_UPDATE = 764,
|
|
||||||
GAME_MSG_TOGGLE_GHOST_REFERENCE_OVERRIDE = 767,
|
|
||||||
GAME_MSG_SET_GHOST_REFERENCE_POSITION = 768,
|
|
||||||
GAME_MSG_FIRE_EVENT_SERVER_SIDE = 770,
|
|
||||||
GAME_MSG_SET_NETWORK_SCRIPT_VAR = 781,
|
|
||||||
GAME_MSG_UPDATE_MODEL_FROM_CLIENT = 793,
|
|
||||||
GAME_MSG_DELETE_MODEL_FROM_CLIENT = 794,
|
|
||||||
GAME_MSG_PLAY_ND_AUDIO_EMITTER = 821,
|
|
||||||
GAME_MSG_PLAY2_DAMBIENT_SOUND = 831,
|
|
||||||
GAME_MSG_ENTER_PROPERTY1 = 840,
|
|
||||||
GAME_MSG_ENTER_PROPERTY2 = 841,
|
|
||||||
GAME_MSG_PROPERTY_ENTRANCE_SYNC = 842,
|
|
||||||
GAME_MSG_PROPERTY_SELECT_QUERY = 845,
|
|
||||||
GAME_MSG_PARSE_CHAT_MESSAGE = 850,
|
|
||||||
GAME_MSG_BROADCAST_TEXT_TO_CHATBOX = 858,
|
|
||||||
GAME_MSG_OPEN_PROPERTY_MANAGEMENT = 860,
|
|
||||||
GAME_MSG_OPEN_PROPERTY_VENDOR = 861,
|
|
||||||
GAME_MSG_UPDATE_PROPERTY_OR_MODEL_FOR_FILTER_CHECK = 863,
|
|
||||||
GAME_MSG_CLIENT_TRADE_REQUEST = 868,
|
|
||||||
GAME_MSG_SERVER_TRADE_REQUEST = 869,
|
|
||||||
GAME_MSG_SERVER_TRADE_INVITE = 870,
|
|
||||||
GAME_MSG_CLIENT_TRADE_REPLY = 871,
|
|
||||||
GAME_MSG_SERVER_TRADE_REPLY = 872,
|
|
||||||
GAME_MSG_SERVER_TRADE_INITIAL_REPLY = 873,
|
|
||||||
GAME_MSG_SERVER_TRADE_FINAL_REPLY = 874,
|
|
||||||
GAME_MSG_CLIENT_TRADE_UPDATE = 875,
|
|
||||||
GAME_MSG_SERVER_SIDE_TRADE_UPDATE = 876,
|
|
||||||
GAME_MSG_SERVER_TRADE_UPDATE = 877,
|
|
||||||
GAME_MSG_CLIENT_TRADE_CANCEL = 878,
|
|
||||||
GAME_MSG_CLIENT_SIDE_TRADE_CANCEL = 879,
|
|
||||||
GAME_MSG_CLIENT_TRADE_ACCEPT = 880,
|
|
||||||
GAME_MSG_SERVER_SIDE_TRADE_ACCEPT = 881,
|
|
||||||
GAME_MSG_SERVER_SIDE_TRADE_CANCEL = 882,
|
|
||||||
GAME_MSG_SERVER_TRADE_CANCEL = 883,
|
|
||||||
GAME_MSG_SERVER_TRADE_ACCEPT = 884,
|
|
||||||
GAME_MSG_READY_FOR_UPDATES = 888,
|
|
||||||
GAME_MSG_ORIENT_TO_OBJECT = 905,
|
|
||||||
GAME_MSG_ORIENT_TO_POSITION = 906,
|
|
||||||
GAME_MSG_ORIENT_TO_ANGLE = 907,
|
|
||||||
GAME_MSG_BOUNCER_ACTIVE_STATUS = 942,
|
|
||||||
GAME_MSG_UN_USE_BBB_MODEL = 999,
|
|
||||||
GAME_MSG_BBB_LOAD_ITEM_REQUEST = 1000,
|
|
||||||
GAME_MSG_BBB_SAVE_REQUEST = 1001,
|
|
||||||
GAME_MSG_BBB_SAVE_RESPONSE = 1006,
|
|
||||||
GAME_MSG_NOTIFY_CLIENT_OBJECT = 1042,
|
|
||||||
GAME_MSG_DISPLAY_ZONE_SUMMARY = 1043,
|
|
||||||
GAME_MSG_ZONE_SUMMARY_DISMISSED = 1044,
|
|
||||||
GAME_MSG_ACTIVITY_STATE_CHANGE_REQUEST = 1053,
|
|
||||||
GAME_MSG_MODIFY_PLAYER_ZONE_STATISTIC = 1046,
|
|
||||||
GAME_MSG_START_BUILDING_WITH_ITEM = 1057,
|
|
||||||
GAME_MSG_START_ARRANGING_WITH_ITEM = 1061,
|
|
||||||
GAME_MSG_FINISH_ARRANGING_WITH_ITEM = 1062,
|
|
||||||
GAME_MSG_DONE_ARRANGING_WITH_ITEM = 1063,
|
|
||||||
GAME_MSG_SET_BUILD_MODE = 1068,
|
|
||||||
GAME_MSG_BUILD_MODE_SET = 1069,
|
|
||||||
GAME_MSG_SET_BUILD_MODE_CONFIRMED = 1073,
|
|
||||||
GAME_MSG_NOTIFY_CLIENT_FAILED_PRECONDITION = 1081,
|
|
||||||
GAME_MSG_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1093,
|
|
||||||
GAME_MSG_MODULAR_BUILD_BEGIN = 1094,
|
|
||||||
GAME_MSG_MODULAR_BUILD_END = 1095,
|
|
||||||
GAME_MSG_MODULAR_BUILD_MOVE_AND_EQUIP = 1096,
|
|
||||||
GAME_MSG_MODULAR_BUILD_FINISH = 1097,
|
|
||||||
GAME_MSG_REPORT_BUG = 1198,
|
|
||||||
GAME_MSG_MISSION_DIALOGUE_CANCELLED = 1129,
|
|
||||||
GAME_MSG_ECHO_SYNC_SKILL = 1144,
|
|
||||||
GAME_MSG_SYNC_SKILL = 1145,
|
|
||||||
GAME_MSG_REQUEST_SERVER_PROJECTILE_IMPACT = 1148,
|
|
||||||
GAME_MSG_DO_CLIENT_PROJECTILE_IMPACT = 1151,
|
|
||||||
GAME_MSG_MODULAR_BUILD_CONVERT_MODEL = 1155,
|
|
||||||
GAME_MSG_SET_PLAYER_ALLOWED_RESPAWN = 1165,
|
|
||||||
GAME_MSG_UI_MESSAGE_SERVER_TO_SINGLE_CLIENT = 1184,
|
|
||||||
GAME_MSG_UI_MESSAGE_SERVER_TO_ALL_CLIENTS = 1185,
|
|
||||||
GAME_MSG_PET_TAMING_TRY_BUILD = 1197,
|
|
||||||
GAME_MSG_REQUEST_SMASH_PLAYER = 1202,
|
|
||||||
GAME_MSG_FIRE_EVENT_CLIENT_SIDE = 1213,
|
|
||||||
GAME_MSG_TOGGLE_GM_INVIS = 1218,
|
|
||||||
GAME_MSG_CHANGE_OBJECT_WORLD_STATE = 1223,
|
|
||||||
GAME_MSG_VEHICLE_LOCK_INPUT = 1230,
|
|
||||||
GAME_MSG_VEHICLE_UNLOCK_INPUT = 1231,
|
|
||||||
GAME_MSG_RACING_RESET_PLAYER_TO_LAST_RESET = 1252,
|
|
||||||
GAME_MSG_RACING_SERVER_SET_PLAYER_LAP_AND_PLANE = 1253,
|
|
||||||
GAME_MSG_RACING_SET_PLAYER_RESET_INFO = 1254,
|
|
||||||
GAME_MSG_RACING_PLAYER_INFO_RESET_FINISHED = 1255,
|
|
||||||
GAME_MSG_LOCK_NODE_ROTATION = 1260,
|
|
||||||
GAME_MSG_VEHICLE_SET_WHEEL_LOCK_STATE = 1273,
|
|
||||||
GAME_MSG_NOTIFY_VEHICLE_OF_RACING_OBJECT = 1276,
|
|
||||||
GAME_MSG_SET_NAME_BILLBOARD_STATE = 1284,
|
|
||||||
GAME_MSG_PLAYER_REACHED_RESPAWN_CHECKPOINT = 1296,
|
|
||||||
GAME_MSG_HANDLE_UGC_EQUIP_POST_DELETE_BASED_ON_EDIT_MODE = 1300,
|
|
||||||
GAME_MSG_HANDLE_UGC_EQUIP_PRE_CREATE_BASED_ON_EDIT_MODE = 1301,
|
|
||||||
GAME_MSG_PROPERTY_CONTENTS_FROM_CLIENT = 1305,
|
|
||||||
GAME_MSG_GET_MODELS_ON_PROPERTY = 1306,
|
|
||||||
GAME_MSG_MATCH_REQUEST = 1308,
|
|
||||||
GAME_MSG_MATCH_RESPONSE = 1309,
|
|
||||||
GAME_MSG_MATCH_UPDATE = 1310,
|
|
||||||
GAME_MSG_MODULE_ASSEMBLY_DB_DATA_FOR_CLIENT = 1131,
|
|
||||||
GAME_MSG_MODULE_ASSEMBLY_QUERY_DATA = 1132,
|
|
||||||
GAME_MSG_SHOW_BILLBOARD_INTERACT_ICON = 1337,
|
|
||||||
GAME_MSG_CHANGE_IDLE_FLAGS = 1338,
|
|
||||||
GAME_MSG_VEHICLE_ADD_PASSIVE_BOOST_ACTION = 1340,
|
|
||||||
GAME_MSG_VEHICLE_REMOVE_PASSIVE_BOOST_ACTION = 1341,
|
|
||||||
GAME_MSG_VEHICLE_NOTIFY_SERVER_ADD_PASSIVE_BOOST_ACTION = 1342,
|
|
||||||
GAME_MSG_VEHICLE_NOTIFY_SERVER_REMOVE_PASSIVE_BOOST_ACTION = 1343,
|
|
||||||
GAME_MSG_VEHICLE_ADD_SLOWDOWN_ACTION = 1344,
|
|
||||||
GAME_MSG_VEHICLE_REMOVE_SLOWDOWN_ACTION = 1345,
|
|
||||||
GAME_MSG_VEHICLE_NOTIFY_SERVER_ADD_SLOWDOWN_ACTION = 1346,
|
|
||||||
GAME_MSG_VEHICLE_NOTIFY_SERVER_REMOVE_SLOWDOWN_ACTION = 1347,
|
|
||||||
GAME_MSG_BUYBACK_FROM_VENDOR = 1350,
|
|
||||||
GAME_MSG_SET_PROPERTY_ACCESS = 1366,
|
|
||||||
GAME_MSG_ZONE_PROPERTY_MODEL_PLACED = 1369,
|
|
||||||
GAME_MSG_ZONE_PROPERTY_MODEL_ROTATED = 1370,
|
|
||||||
GAME_MSG_ZONE_PROPERTY_MODEL_REMOVED_WHILE_EQUIPPED = 1371,
|
|
||||||
GAME_MSG_ZONE_PROPERTY_MODEL_EQUIPPED = 1372,
|
|
||||||
GAME_MSG_ZONE_PROPERTY_MODEL_PICKED_UP = 1373,
|
|
||||||
GAME_MSG_ZONE_PROPERTY_MODEL_REMOVED = 1374,
|
|
||||||
GAME_MSG_NOTIFY_RACING_CLIENT = 1390,
|
|
||||||
GAME_MSG_RACING_PLAYER_HACK_CAR = 1391,
|
|
||||||
GAME_MSG_RACING_PLAYER_LOADED = 1392,
|
|
||||||
GAME_MSG_RACING_CLIENT_READY = 1393,
|
|
||||||
GAME_MSG_UPDATE_CHAT_MODE = 1395,
|
|
||||||
GAME_MSG_VEHICLE_NOTIFY_FINISHED_RACE = 1396,
|
|
||||||
GAME_MSG_SET_CONSUMABLE_ITEM = 1409,
|
|
||||||
GAME_MSG_SET_STATUS_IMMUNITY = 1435,
|
|
||||||
GAME_MSG_SET_PET_NAME_MODERATED = 1448,
|
|
||||||
GAME_MSG_MODIFY_LEGO_SCORE = 1459,
|
|
||||||
GAME_MSG_RESTORE_TO_POST_LOAD_STATS = 1468,
|
|
||||||
GAME_MSG_SET_RAIL_MOVEMENT = 1471,
|
|
||||||
GAME_MSG_START_RAIL_MOVEMENT = 1472,
|
|
||||||
GAME_MSG_CANCEL_RAIL_MOVEMENT = 1474,
|
|
||||||
GAME_MSG_CLIENT_RAIL_MOVEMENT_READY = 1476,
|
|
||||||
GAME_MSG_PLAYER_RAIL_ARRIVED_NOTIFICATION = 1477,
|
|
||||||
GAME_MSG_UPDATE_PLAYER_STATISTIC = 1481,
|
|
||||||
GAME_MSG_MODULAR_ASSEMBLY_NIF_COMPLETED = 1498,
|
|
||||||
GAME_MSG_NOTIFY_NOT_ENOUGH_INV_SPACE = 1516,
|
|
||||||
GAME_MSG_TEAM_SET_LEADER = 0x0615,
|
|
||||||
GAME_MSG_TEAM_INVITE_CONFIRM = 0x0616,
|
|
||||||
GAME_MSG_TEAM_GET_STATUS_RESPONSE = 0x0617,
|
|
||||||
GAME_MSG_TEAM_ADD_PLAYER = 0x061a,
|
|
||||||
GAME_MSG_TEAM_REMOVE_PLAYER = 0x061b,
|
|
||||||
GAME_MSG_START_CELEBRATION_EFFECT = 1618,
|
|
||||||
GAME_MSG_ADD_BUFF = 1647,
|
|
||||||
GAME_MSG_SERVER_DONE_LOADING_ALL_OBJECTS = 1642,
|
|
||||||
GAME_MSG_PLACE_PROPERTY_MODEL = 1170,
|
|
||||||
GAME_MSG_VEHICLE_NOTIFY_HIT_IMAGINATION_SERVER = 1606,
|
|
||||||
GAME_MSG_ADD_RUN_SPEED_MODIFIER = 1505,
|
|
||||||
GAME_MSG_HANDLE_HOT_PROPERTY_DATA = 1511,
|
|
||||||
GAME_MSG_SEND_HOT_PROPERTY_DATA = 1510,
|
|
||||||
GAME_MSG_REMOVE_RUN_SPEED_MODIFIER = 1506,
|
|
||||||
GAME_MSG_UPDATE_PROPERTY_PERFORMANCE_COST = 1547,
|
|
||||||
GAME_MSG_PROPERTY_ENTRANCE_BEGIN = 1553,
|
|
||||||
GAME_MSG_SET_RESURRECT_RESTORE_VALUES = 1591,
|
|
||||||
GAME_MSG_VEHICLE_STOP_BOOST = 1617,
|
|
||||||
GAME_MSG_REMOVE_BUFF = 1648,
|
|
||||||
GAME_MSG_REQUEST_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1666,
|
|
||||||
GAME_MSG_RESPONSE_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1667,
|
|
||||||
GAME_MSG_PLAYER_SET_CAMERA_CYCLING_MODE = 1676,
|
|
||||||
GAME_MSG_SET_MOUNT_INVENTORY_ID = 1726,
|
|
||||||
GAME_MSG_NOTIFY_SERVER_LEVEL_PROCESSING_COMPLETE = 1734,
|
|
||||||
GAME_MSG_NOTIFY_LEVEL_REWARDS = 1735,
|
|
||||||
GAME_MSG_DISMOUNT_COMPLETE = 1756,
|
|
||||||
GAME_MSG_MARK_INVENTORY_ITEM_AS_ACTIVE = 1767,
|
|
||||||
END
|
|
||||||
};
|
|
15
dCommon/dEnums/eAuthMessageType.h
Normal file
15
dCommon/dEnums/eAuthMessageType.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef __EAUTHMESSAGETYPE__H__
|
||||||
|
#define __EAUTHMESSAGETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eAuthMessageType : uint32_t {
|
||||||
|
LOGIN_REQUEST = 0,
|
||||||
|
LOGOUT_REQUEST,
|
||||||
|
CREATE_NEW_ACCOUNT_REQUEST,
|
||||||
|
LEGOINTERFACE_AUTH_RESPONSE,
|
||||||
|
SESSIONKEY_RECEIVED_CONFIRM,
|
||||||
|
RUNTIME_CONFIG
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EAUTHMESSAGETYPE__H__
|
12
dCommon/dEnums/eBuildType.h
Normal file
12
dCommon/dEnums/eBuildType.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef __EBUILDTYPE__H__
|
||||||
|
#define __EBUILDTYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eBuildType :uint32_t {
|
||||||
|
NOWHERE,
|
||||||
|
IN_WORLD,
|
||||||
|
ON_PROPERTY
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EBUILDTYPE__H__
|
14
dCommon/dEnums/eCharacterCreationResponse.h
Normal file
14
dCommon/dEnums/eCharacterCreationResponse.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef __ECHARACTERCREATIONRESPONSE__H__
|
||||||
|
#define __ECHARACTERCREATIONRESPONSE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eCharacterCreationResponse : uint8_t {
|
||||||
|
SUCCESS = 0,
|
||||||
|
OBJECT_ID_UNAVAILABLE,
|
||||||
|
NAME_NOT_ALLOWED,
|
||||||
|
PREDEFINED_NAME_IN_USE,
|
||||||
|
CUSTOM_NAME_IN_USE
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ECHARACTERCREATIONRESPONSE__H__
|
31
dCommon/dEnums/eChatInternalMessageType.h
Normal file
31
dCommon/dEnums/eChatInternalMessageType.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#ifndef __ECHATINTERNALMESSAGETYPE__H__
|
||||||
|
#define __ECHATINTERNALMESSAGETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum eChatInternalMessageType : uint32_t {
|
||||||
|
PLAYER_ADDED_NOTIFICATION = 0,
|
||||||
|
PLAYER_REMOVED_NOTIFICATION,
|
||||||
|
ADD_FRIEND,
|
||||||
|
ADD_BEST_FRIEND,
|
||||||
|
ADD_TO_TEAM,
|
||||||
|
ADD_BLOCK,
|
||||||
|
REMOVE_FRIEND,
|
||||||
|
REMOVE_BLOCK,
|
||||||
|
REMOVE_FROM_TEAM,
|
||||||
|
DELETE_TEAM,
|
||||||
|
REPORT,
|
||||||
|
PRIVATE_CHAT,
|
||||||
|
PRIVATE_CHAT_RESPONSE,
|
||||||
|
ANNOUNCEMENT,
|
||||||
|
MAIL_COUNT_UPDATE,
|
||||||
|
MAIL_SEND_NOTIFY,
|
||||||
|
REQUEST_USER_LIST,
|
||||||
|
FRIEND_LIST,
|
||||||
|
ROUTE_TO_PLAYER,
|
||||||
|
TEAM_UPDATE,
|
||||||
|
MUTE_UPDATE,
|
||||||
|
CREATE_TEAM,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ECHATINTERNALMESSAGETYPE__H__
|
78
dCommon/dEnums/eChatMessageType.h
Normal file
78
dCommon/dEnums/eChatMessageType.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#ifndef __ECHATMESSAGETYPE__H__
|
||||||
|
#define __ECHATMESSAGETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
//! The Internal Chat Packet Identifiers
|
||||||
|
enum class eChatMessageType :uint32_t {
|
||||||
|
LOGIN_SESSION_NOTIFY = 0,
|
||||||
|
GENERAL_CHAT_MESSAGE,
|
||||||
|
PRIVATE_CHAT_MESSAGE,
|
||||||
|
USER_CHANNEL_CHAT_MESSAGE,
|
||||||
|
WORLD_DISCONNECT_REQUEST,
|
||||||
|
WORLD_PROXIMITY_RESPONSE,
|
||||||
|
WORLD_PARCEL_RESPONSE,
|
||||||
|
ADD_FRIEND_REQUEST,
|
||||||
|
ADD_FRIEND_RESPONSE,
|
||||||
|
REMOVE_FRIEND,
|
||||||
|
GET_FRIENDS_LIST,
|
||||||
|
ADD_IGNORE,
|
||||||
|
REMOVE_IGNORE,
|
||||||
|
GET_IGNORE_LIST,
|
||||||
|
TEAM_MISSED_INVITE_CHECK,
|
||||||
|
TEAM_INVITE,
|
||||||
|
TEAM_INVITE_RESPONSE,
|
||||||
|
TEAM_KICK,
|
||||||
|
TEAM_LEAVE,
|
||||||
|
TEAM_SET_LOOT,
|
||||||
|
TEAM_SET_LEADER,
|
||||||
|
TEAM_GET_STATUS,
|
||||||
|
GUILD_CREATE,
|
||||||
|
GUILD_INVITE,
|
||||||
|
GUILD_INVITE_RESPONSE,
|
||||||
|
GUILD_LEAVE,
|
||||||
|
GUILD_KICK,
|
||||||
|
GUILD_GET_STATUS,
|
||||||
|
GUILD_GET_ALL,
|
||||||
|
SHOW_ALL,
|
||||||
|
BLUEPRINT_MODERATED,
|
||||||
|
BLUEPRINT_MODEL_READY,
|
||||||
|
PROPERTY_READY_FOR_APPROVAL,
|
||||||
|
PROPERTY_MODERATION_CHANGED,
|
||||||
|
PROPERTY_BUILDMODE_CHANGED,
|
||||||
|
PROPERTY_BUILDMODE_CHANGED_REPORT,
|
||||||
|
MAIL,
|
||||||
|
WORLD_INSTANCE_LOCATION_REQUEST,
|
||||||
|
REPUTATION_UPDATE,
|
||||||
|
SEND_CANNED_TEXT,
|
||||||
|
GMLEVEL_UPDATE,
|
||||||
|
CHARACTER_NAME_CHANGE_REQUEST,
|
||||||
|
CSR_REQUEST,
|
||||||
|
CSR_REPLY,
|
||||||
|
GM_KICK,
|
||||||
|
GM_ANNOUNCE,
|
||||||
|
GM_MUTE,
|
||||||
|
ACTIVITY_UPDATE,
|
||||||
|
WORLD_ROUTE_PACKET,
|
||||||
|
GET_ZONE_POPULATIONS,
|
||||||
|
REQUEST_MINIMUM_CHAT_MODE,
|
||||||
|
REQUEST_MINIMUM_CHAT_MODE_PRIVATE,
|
||||||
|
MATCH_REQUEST,
|
||||||
|
UGCMANIFEST_REPORT_MISSING_FILE,
|
||||||
|
UGCMANIFEST_REPORT_DONE_FILE,
|
||||||
|
UGCMANIFEST_REPORT_DONE_BLUEPRINT,
|
||||||
|
UGCC_REQUEST,
|
||||||
|
WHO,
|
||||||
|
WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE,
|
||||||
|
ACHIEVEMENT_NOTIFY,
|
||||||
|
GM_CLOSE_PRIVATE_CHAT_WINDOW,
|
||||||
|
UNEXPECTED_DISCONNECT,
|
||||||
|
PLAYER_READY,
|
||||||
|
GET_DONATION_TOTAL,
|
||||||
|
UPDATE_DONATION,
|
||||||
|
PRG_CSR_COMMAND,
|
||||||
|
HEARTBEAT_REQUEST_FROM_WORLD,
|
||||||
|
UPDATE_FREE_TRIAL_STATUS
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ECHATMESSAGETYPE__H__
|
12
dCommon/dEnums/eCinematicEvent.h
Normal file
12
dCommon/dEnums/eCinematicEvent.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef __ECINEMATICEVENT__H__
|
||||||
|
#define __ECINEMATICEVENT__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eCinematicEvent : uint32_t {
|
||||||
|
STARTED,
|
||||||
|
WAYPOINT,
|
||||||
|
ENDED,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ECINEMATICEVENT__H__
|
76
dCommon/dEnums/eClientMessageType.h
Normal file
76
dCommon/dEnums/eClientMessageType.h
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
#ifndef __ECLIENTMESSAGETYPE__H__
|
||||||
|
#define __ECLIENTMESSAGETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eClientMessageType : uint32_t {
|
||||||
|
LOGIN_RESPONSE = 0,
|
||||||
|
LOGOUT_RESPONSE,
|
||||||
|
LOAD_STATIC_ZONE,
|
||||||
|
CREATE_OBJECT,
|
||||||
|
CREATE_CHARACTER,
|
||||||
|
CREATE_CHARACTER_EXTENDED,
|
||||||
|
CHARACTER_LIST_RESPONSE,
|
||||||
|
CHARACTER_CREATE_RESPONSE,
|
||||||
|
CHARACTER_RENAME_RESPONSE,
|
||||||
|
CHAT_CONNECT_RESPONSE,
|
||||||
|
AUTH_ACCOUNT_CREATE_RESPONSE,
|
||||||
|
DELETE_CHARACTER_RESPONSE,
|
||||||
|
GAME_MSG,
|
||||||
|
CONNECT_CHAT,
|
||||||
|
TRANSFER_TO_WORLD,
|
||||||
|
IMPENDING_RELOAD_NOTIFY,
|
||||||
|
MAKE_GM_RESPONSE,
|
||||||
|
HTTP_MONITOR_INFO_RESPONSE,
|
||||||
|
SLASH_PUSH_MAP_RESPONSE,
|
||||||
|
SLASH_PULL_MAP_RESPONSE,
|
||||||
|
SLASH_LOCK_MAP_RESPONSE,
|
||||||
|
BLUEPRINT_SAVE_RESPONSE,
|
||||||
|
BLUEPRINT_LUP_SAVE_RESPONSE,
|
||||||
|
BLUEPRINT_LOAD_RESPONSE_ITEMID,
|
||||||
|
BLUEPRINT_GET_ALL_DATA_RESPONSE,
|
||||||
|
MODEL_INSTANTIATE_RESPONSE,
|
||||||
|
DEBUG_OUTPUT,
|
||||||
|
ADD_FRIEND_REQUEST,
|
||||||
|
ADD_FRIEND_RESPONSE,
|
||||||
|
REMOVE_FRIEND_RESPONSE,
|
||||||
|
GET_FRIENDS_LIST_RESPONSE,
|
||||||
|
UPDATE_FRIEND_NOTIFY,
|
||||||
|
ADD_IGNORE_RESPONSE,
|
||||||
|
REMOVE_IGNORE_RESPONSE,
|
||||||
|
GET_IGNORE_LIST_RESPONSE,
|
||||||
|
TEAM_INVITE,
|
||||||
|
TEAM_INVITE_INITIAL_RESPONSE,
|
||||||
|
GUILD_CREATE_RESPONSE,
|
||||||
|
GUILD_GET_STATUS_RESPONSE,
|
||||||
|
GUILD_INVITE,
|
||||||
|
GUILD_INVITE_INITIAL_RESPONSE,
|
||||||
|
GUILD_INVITE_FINAL_RESPONSE,
|
||||||
|
GUILD_INVITE_CONFIRM,
|
||||||
|
GUILD_ADD_PLAYER,
|
||||||
|
GUILD_REMOVE_PLAYER,
|
||||||
|
GUILD_LOGIN_LOGOUT,
|
||||||
|
GUILD_RANK_CHANGE,
|
||||||
|
GUILD_DATA,
|
||||||
|
GUILD_STATUS,
|
||||||
|
MAIL,
|
||||||
|
DB_PROXY_RESULT,
|
||||||
|
SHOW_ALL_RESPONSE,
|
||||||
|
WHO_RESPONSE,
|
||||||
|
SEND_CANNED_TEXT,
|
||||||
|
UPDATE_CHARACTER_NAME,
|
||||||
|
SET_NETWORK_SIMULATOR,
|
||||||
|
INVALID_CHAT_MESSAGE,
|
||||||
|
MINIMUM_CHAT_MODE_RESPONSE,
|
||||||
|
MINIMUM_CHAT_MODE_RESPONSE_PRIVATE,
|
||||||
|
CHAT_MODERATION_STRING,
|
||||||
|
UGC_MANIFEST_RESPONSE,
|
||||||
|
IN_LOGIN_QUEUE,
|
||||||
|
SERVER_STATES,
|
||||||
|
GM_CLOSE_TARGET_CHAT_WINDOW,
|
||||||
|
GENERAL_TEXT_FOR_LOCALIZATION,
|
||||||
|
UPDATE_FREE_TRIAL_STATUS,
|
||||||
|
UGC_DOWNLOAD_FAILED = 120
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ECLIENTMESSAGETYPE__H__
|
14
dCommon/dEnums/eConnectionType.h
Normal file
14
dCommon/dEnums/eConnectionType.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef __ECONNECTIONTYPE__H__
|
||||||
|
#define __ECONNECTIONTYPE__H__
|
||||||
|
|
||||||
|
enum class eConnectionType : uint16_t {
|
||||||
|
SERVER = 0,
|
||||||
|
AUTH,
|
||||||
|
CHAT,
|
||||||
|
CHAT_INTERNAL,
|
||||||
|
WORLD,
|
||||||
|
CLIENT,
|
||||||
|
MASTER
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ECONNECTIONTYPE__H__
|
18
dCommon/dEnums/eControlScheme.h
Normal file
18
dCommon/dEnums/eControlScheme.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#ifndef __ECONTROLSCHEME__H__
|
||||||
|
#define __ECONTROLSCHEME__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eControlScheme : uint32_t {
|
||||||
|
SCHEME_A,
|
||||||
|
SCHEME_D,
|
||||||
|
SCHEME_GAMEPAD,
|
||||||
|
SCHEME_E,
|
||||||
|
SCHEME_FPS,
|
||||||
|
SCHEME_DRIVING,
|
||||||
|
SCHEME_TAMING,
|
||||||
|
SCHEME_MODULAR_BUILD,
|
||||||
|
SCHEME_WEAR_A_ROBOT //== freecam?
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ECONTROLSCHEME__H__
|
11
dCommon/dEnums/eCyclingMode.h
Normal file
11
dCommon/dEnums/eCyclingMode.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef __ECYCLINGMODE__H__
|
||||||
|
#define __ECYCLINGMODE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eCyclingMode : uint32_t {
|
||||||
|
ALLOW_CYCLE_TEAMMATES,
|
||||||
|
DISALLOW_CYCLING
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ECYCLINGMODE__H__
|
15
dCommon/dEnums/eGameActivity.h
Normal file
15
dCommon/dEnums/eGameActivity.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef __EGAMEACTIVITY__H__
|
||||||
|
#define __EGAMEACTIVITY__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eGameActivity : uint32_t {
|
||||||
|
NONE,
|
||||||
|
QUICKBUILDING,
|
||||||
|
SHOOTING_GALLERY,
|
||||||
|
RACING,
|
||||||
|
PINBALL,
|
||||||
|
PET_TAMING
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EGAMEACTIVITY__H__
|
303
dCommon/dEnums/eGameMessageType.h
Normal file
303
dCommon/dEnums/eGameMessageType.h
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
#ifndef __EGAMEMESSAGETYPE__H__
|
||||||
|
#define __EGAMEMESSAGETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eGameMessageType : uint16_t {
|
||||||
|
TELEPORT = 19,
|
||||||
|
SET_PLAYER_CONTROL_SCHEME = 26,
|
||||||
|
DROP_CLIENT_LOOT = 30,
|
||||||
|
DIE = 37,
|
||||||
|
REQUEST_DIE = 38,
|
||||||
|
PLAY_EMOTE = 41,
|
||||||
|
PLAY_ANIMATION = 43,
|
||||||
|
CONTROL_BEHAVIOR = 48,
|
||||||
|
SET_NAME = 72,
|
||||||
|
ECHO_START_SKILL = 118,
|
||||||
|
START_SKILL = 119,
|
||||||
|
VERIFY_ACK = 121,
|
||||||
|
ADD_SKILL = 127,
|
||||||
|
REMOVE_SKILL = 128,
|
||||||
|
SET_CURRENCY = 133,
|
||||||
|
PICKUP_CURRENCY = 137,
|
||||||
|
PICKUP_ITEM = 139,
|
||||||
|
TEAM_PICKUP_ITEM = 140,
|
||||||
|
PLAY_FX_EFFECT = 154,
|
||||||
|
STOP_FX_EFFECT = 155,
|
||||||
|
REQUEST_RESURRECT = 159,
|
||||||
|
RESURRECT = 160,
|
||||||
|
PUSH_EQUIPPED_ITEMS_STATE = 191,
|
||||||
|
POP_EQUIPPED_ITEMS_STATE = 192,
|
||||||
|
SET_GM_LEVEL = 193,
|
||||||
|
SET_STUNNED = 198,
|
||||||
|
SET_STUN_IMMUNITY = 200,
|
||||||
|
KNOCKBACK = 202,
|
||||||
|
REBUILD_CANCEL = 209,
|
||||||
|
ENABLE_REBUILD = 213,
|
||||||
|
MOVE_ITEM_IN_INVENTORY = 224,
|
||||||
|
ADD_ITEM_TO_INVENTORY_CLIENT_SYNC = 227,
|
||||||
|
REMOVE_ITEM_FROM_INVENTORY = 230,
|
||||||
|
EQUIP_ITEM = 231,
|
||||||
|
UN_EQUIP_ITEM = 233,
|
||||||
|
OFFER_MISSION = 248,
|
||||||
|
RESPOND_TO_MISSION = 249,
|
||||||
|
NOTIFY_MISSION = 254,
|
||||||
|
NOTIFY_MISSION_TASK = 255,
|
||||||
|
REBUILD_NOTIFY_STATE = 336,
|
||||||
|
TERMINATE_INTERACTION = 357,
|
||||||
|
SERVER_TERMINATE_INTERACTION = 358,
|
||||||
|
REQUEST_USE = 364,
|
||||||
|
VENDOR_OPEN_WINDOW = 369,
|
||||||
|
BUY_FROM_VENDOR = 373,
|
||||||
|
SELL_TO_VENDOR = 374,
|
||||||
|
TEAM_SET_OFF_WORLD_FLAG = 383,
|
||||||
|
SET_INVENTORY_SIZE = 389,
|
||||||
|
ACKNOWLEDGE_POSSESSION = 391,
|
||||||
|
SET_SHOOTING_GALLERY_PARAMS = 400,
|
||||||
|
REQUEST_ACTIVITY_START_STOP = 402,
|
||||||
|
REQUEST_ACTIVITY_ENTER = 403,
|
||||||
|
REQUEST_ACTIVITY_EXIT = 404,
|
||||||
|
ACTIVITY_ENTER = 405,
|
||||||
|
ACTIVITY_EXIT = 406,
|
||||||
|
ACTIVITY_START = 407,
|
||||||
|
ACTIVITY_STOP = 408,
|
||||||
|
SHOOTING_GALLERY_CLIENT_AIM_UPDATE = 409,
|
||||||
|
SHOOTING_GALLERY_FIRE = 411,
|
||||||
|
REQUEST_VENDOR_STATUS_UPDATE = 416,
|
||||||
|
VENDOR_STATUS_UPDATE = 417,
|
||||||
|
NOTIFY_CLIENT_SHOOTING_GALLERY_SCORE = 425,
|
||||||
|
CONSUME_CLIENT_ITEM = 427,
|
||||||
|
CLIENT_ITEM_CONSUMED = 428,
|
||||||
|
UPDATE_SHOOTING_GALLERY_ROTATION = 448,
|
||||||
|
SET_FLAG = 471,
|
||||||
|
NOTIFY_CLIENT_FLAG_CHANGE = 472,
|
||||||
|
VENDOR_TRANSACTION_RESULT = 476,
|
||||||
|
HAS_BEEN_COLLECTED = 486,
|
||||||
|
DISPLAY_CHAT_BUBBLE = 495,
|
||||||
|
SPAWN_PET = 498,
|
||||||
|
DESPAWN_PET = 499,
|
||||||
|
PLAYER_LOADED = 505,
|
||||||
|
PLAYER_READY = 509,
|
||||||
|
REQUEST_LINKED_MISSION = 515,
|
||||||
|
INVALID_ZONE_TRANSFER_LIST = 519,
|
||||||
|
MISSION_DIALOGUE_OK = 520,
|
||||||
|
DISPLAY_MESSAGE_BOX = 529,
|
||||||
|
MESSAGE_BOX_RESPOND = 530,
|
||||||
|
CHOICE_BOX_RESPOND = 531,
|
||||||
|
SMASH = 537,
|
||||||
|
UNSMASH = 538,
|
||||||
|
PLACE_MODEL_RESPONSE = 547,
|
||||||
|
SET_SHOOTING_GALLERY_RETICULE_EFFECT = 548,
|
||||||
|
SET_JET_PACK_MODE = 561,
|
||||||
|
REGISTER_PET_ID = 565,
|
||||||
|
REGISTER_PET_DBID = 566,
|
||||||
|
SHOW_ACTIVITY_COUNTDOWN = 568,
|
||||||
|
START_ACTIVITY_TIME = 576,
|
||||||
|
ACTIVITY_PAUSE = 602,
|
||||||
|
USE_NON_EQUIPMENT_ITEM = 603,
|
||||||
|
USE_ITEM_RESULT = 607,
|
||||||
|
COMMAND_PET = 640,
|
||||||
|
PET_RESPONSE = 641,
|
||||||
|
REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 648,
|
||||||
|
SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 649,
|
||||||
|
NOTIFY_OBJECT = 656,
|
||||||
|
CLIENT_NOTIFY_PET = 659,
|
||||||
|
NOTIFY_PET = 660,
|
||||||
|
NOTIFY_PET_TAMING_MINIGAME = 661,
|
||||||
|
START_SERVER_PET_MINIGAME_TIMER = 662,
|
||||||
|
CLIENT_EXIT_TAMING_MINIGAME = 663,
|
||||||
|
PET_NAME_CHANGED = 686,
|
||||||
|
PET_TAMING_MINIGAME_RESULT = 667,
|
||||||
|
PET_TAMING_TRY_BUILD_RESULT = 668,
|
||||||
|
NOTIFY_TAMING_BUILD_SUCCESS = 673,
|
||||||
|
NOTIFY_TAMING_MODEL_LOADED_ON_SERVER = 674,
|
||||||
|
ACTIVATE_BUBBLE_BUFF = 678,
|
||||||
|
DEACTIVATE_BUBBLE_BUFF = 679,
|
||||||
|
ADD_PET_TO_PLAYER = 681,
|
||||||
|
REQUEST_SET_PET_NAME = 683,
|
||||||
|
SET_PET_NAME = 684,
|
||||||
|
NOTIFY_PET_TAMING_PUZZLE_SELECTED = 675,
|
||||||
|
SHOW_PET_ACTION_BUTTON = 692,
|
||||||
|
SET_EMOTE_LOCK_STATE = 693,
|
||||||
|
USE_ITEM_REQUIREMENTS_RESPONSE = 703,
|
||||||
|
PLAY_EMBEDDED_EFFECT_ON_ALL_CLIENTS_NEAR_OBJECT = 713,
|
||||||
|
DOWNLOAD_PROPERTY_DATA = 716,
|
||||||
|
QUERY_PROPERTY_DATA = 717,
|
||||||
|
PROPERTY_EDITOR_BEGIN = 724,
|
||||||
|
PROPERTY_EDITOR_END = 725,
|
||||||
|
IS_MINIFIG_IN_A_BUBBLE = 729,
|
||||||
|
START_PATHING = 733,
|
||||||
|
ACTIVATE_BUBBLE_BUFF_FROM_SERVER = 734,
|
||||||
|
DEACTIVATE_BUBBLE_BUFF_FROM_SERVER = 735,
|
||||||
|
NOTIFY_CLIENT_ZONE_OBJECT = 737,
|
||||||
|
UPDATE_REPUTATION = 746,
|
||||||
|
PROPERTY_RENTAL_RESPONSE = 750,
|
||||||
|
REQUEST_PLATFORM_RESYNC = 760,
|
||||||
|
PLATFORM_RESYNC = 761,
|
||||||
|
PLAY_CINEMATIC = 762,
|
||||||
|
END_CINEMATIC = 763,
|
||||||
|
CINEMATIC_UPDATE = 764,
|
||||||
|
TOGGLE_GHOST_REFERENCE_OVERRIDE = 767,
|
||||||
|
SET_GHOST_REFERENCE_POSITION = 768,
|
||||||
|
FIRE_EVENT_SERVER_SIDE = 770,
|
||||||
|
SET_NETWORK_SCRIPT_VAR = 781,
|
||||||
|
UPDATE_MODEL_FROM_CLIENT = 793,
|
||||||
|
DELETE_MODEL_FROM_CLIENT = 794,
|
||||||
|
PLAY_ND_AUDIO_EMITTER = 821,
|
||||||
|
PLAY2_DAMBIENT_SOUND = 831,
|
||||||
|
ENTER_PROPERTY1 = 840,
|
||||||
|
ENTER_PROPERTY2 = 841,
|
||||||
|
PROPERTY_ENTRANCE_SYNC = 842,
|
||||||
|
PROPERTY_SELECT_QUERY = 845,
|
||||||
|
PARSE_CHAT_MESSAGE = 850,
|
||||||
|
BROADCAST_TEXT_TO_CHATBOX = 858,
|
||||||
|
OPEN_PROPERTY_MANAGEMENT = 860,
|
||||||
|
OPEN_PROPERTY_VENDOR = 861,
|
||||||
|
UPDATE_PROPERTY_OR_MODEL_FOR_FILTER_CHECK = 863,
|
||||||
|
CLIENT_TRADE_REQUEST = 868,
|
||||||
|
SERVER_TRADE_REQUEST = 869,
|
||||||
|
SERVER_TRADE_INVITE = 870,
|
||||||
|
CLIENT_TRADE_REPLY = 871,
|
||||||
|
SERVER_TRADE_REPLY = 872,
|
||||||
|
SERVER_TRADE_INITIAL_REPLY = 873,
|
||||||
|
SERVER_TRADE_FINAL_REPLY = 874,
|
||||||
|
CLIENT_TRADE_UPDATE = 875,
|
||||||
|
SERVER_SIDE_TRADE_UPDATE = 876,
|
||||||
|
SERVER_TRADE_UPDATE = 877,
|
||||||
|
CLIENT_TRADE_CANCEL = 878,
|
||||||
|
CLIENT_SIDE_TRADE_CANCEL = 879,
|
||||||
|
CLIENT_TRADE_ACCEPT = 880,
|
||||||
|
SERVER_SIDE_TRADE_ACCEPT = 881,
|
||||||
|
SERVER_SIDE_TRADE_CANCEL = 882,
|
||||||
|
SERVER_TRADE_CANCEL = 883,
|
||||||
|
SERVER_TRADE_ACCEPT = 884,
|
||||||
|
READY_FOR_UPDATES = 888,
|
||||||
|
ORIENT_TO_OBJECT = 905,
|
||||||
|
ORIENT_TO_POSITION = 906,
|
||||||
|
ORIENT_TO_ANGLE = 907,
|
||||||
|
BOUNCER_ACTIVE_STATUS = 942,
|
||||||
|
UN_USE_BBB_MODEL = 999,
|
||||||
|
BBB_LOAD_ITEM_REQUEST = 1000,
|
||||||
|
BBB_SAVE_REQUEST = 1001,
|
||||||
|
BBB_SAVE_RESPONSE = 1006,
|
||||||
|
NOTIFY_CLIENT_OBJECT = 1042,
|
||||||
|
DISPLAY_ZONE_SUMMARY = 1043,
|
||||||
|
ZONE_SUMMARY_DISMISSED = 1044,
|
||||||
|
ACTIVITY_STATE_CHANGE_REQUEST = 1053,
|
||||||
|
MODIFY_PLAYER_ZONE_STATISTIC = 1046,
|
||||||
|
START_BUILDING_WITH_ITEM = 1057,
|
||||||
|
START_ARRANGING_WITH_ITEM = 1061,
|
||||||
|
FINISH_ARRANGING_WITH_ITEM = 1062,
|
||||||
|
DONE_ARRANGING_WITH_ITEM = 1063,
|
||||||
|
SET_BUILD_MODE = 1068,
|
||||||
|
BUILD_MODE_SET = 1069,
|
||||||
|
SET_BUILD_MODE_CONFIRMED = 1073,
|
||||||
|
NOTIFY_CLIENT_FAILED_PRECONDITION = 1081,
|
||||||
|
MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1093,
|
||||||
|
MODULAR_BUILD_BEGIN = 1094,
|
||||||
|
MODULAR_BUILD_END = 1095,
|
||||||
|
MODULAR_BUILD_MOVE_AND_EQUIP = 1096,
|
||||||
|
MODULAR_BUILD_FINISH = 1097,
|
||||||
|
REPORT_BUG = 1198,
|
||||||
|
MISSION_DIALOGUE_CANCELLED = 1129,
|
||||||
|
ECHO_SYNC_SKILL = 1144,
|
||||||
|
SYNC_SKILL = 1145,
|
||||||
|
REQUEST_SERVER_PROJECTILE_IMPACT = 1148,
|
||||||
|
DO_CLIENT_PROJECTILE_IMPACT = 1151,
|
||||||
|
MODULAR_BUILD_CONVERT_MODEL = 1155,
|
||||||
|
SET_PLAYER_ALLOWED_RESPAWN = 1165,
|
||||||
|
UI_MESSAGE_SERVER_TO_SINGLE_CLIENT = 1184,
|
||||||
|
UI_MESSAGE_SERVER_TO_ALL_CLIENTS = 1185,
|
||||||
|
PET_TAMING_TRY_BUILD = 1197,
|
||||||
|
REQUEST_SMASH_PLAYER = 1202,
|
||||||
|
FIRE_EVENT_CLIENT_SIDE = 1213,
|
||||||
|
TOGGLE_GM_INVIS = 1218,
|
||||||
|
CHANGE_OBJECT_WORLD_STATE = 1223,
|
||||||
|
VEHICLE_LOCK_INPUT = 1230,
|
||||||
|
VEHICLE_UNLOCK_INPUT = 1231,
|
||||||
|
RACING_RESET_PLAYER_TO_LAST_RESET = 1252,
|
||||||
|
RACING_SERVER_SET_PLAYER_LAP_AND_PLANE = 1253,
|
||||||
|
RACING_SET_PLAYER_RESET_INFO = 1254,
|
||||||
|
RACING_PLAYER_INFO_RESET_FINISHED = 1255,
|
||||||
|
LOCK_NODE_ROTATION = 1260,
|
||||||
|
VEHICLE_SET_WHEEL_LOCK_STATE = 1273,
|
||||||
|
NOTIFY_VEHICLE_OF_RACING_OBJECT = 1276,
|
||||||
|
SET_NAME_BILLBOARD_STATE = 1284,
|
||||||
|
PLAYER_REACHED_RESPAWN_CHECKPOINT = 1296,
|
||||||
|
HANDLE_UGC_EQUIP_POST_DELETE_BASED_ON_EDIT_MODE = 1300,
|
||||||
|
HANDLE_UGC_EQUIP_PRE_CREATE_BASED_ON_EDIT_MODE = 1301,
|
||||||
|
PROPERTY_CONTENTS_FROM_CLIENT = 1305,
|
||||||
|
GET_MODELS_ON_PROPERTY = 1306,
|
||||||
|
MATCH_REQUEST = 1308,
|
||||||
|
MATCH_RESPONSE = 1309,
|
||||||
|
MATCH_UPDATE = 1310,
|
||||||
|
MODULE_ASSEMBLY_DB_DATA_FOR_CLIENT = 1131,
|
||||||
|
MODULE_ASSEMBLY_QUERY_DATA = 1132,
|
||||||
|
SHOW_BILLBOARD_INTERACT_ICON = 1337,
|
||||||
|
CHANGE_IDLE_FLAGS = 1338,
|
||||||
|
VEHICLE_ADD_PASSIVE_BOOST_ACTION = 1340,
|
||||||
|
VEHICLE_REMOVE_PASSIVE_BOOST_ACTION = 1341,
|
||||||
|
VEHICLE_NOTIFY_SERVER_ADD_PASSIVE_BOOST_ACTION = 1342,
|
||||||
|
VEHICLE_NOTIFY_SERVER_REMOVE_PASSIVE_BOOST_ACTION = 1343,
|
||||||
|
VEHICLE_ADD_SLOWDOWN_ACTION = 1344,
|
||||||
|
VEHICLE_REMOVE_SLOWDOWN_ACTION = 1345,
|
||||||
|
VEHICLE_NOTIFY_SERVER_ADD_SLOWDOWN_ACTION = 1346,
|
||||||
|
VEHICLE_NOTIFY_SERVER_REMOVE_SLOWDOWN_ACTION = 1347,
|
||||||
|
BUYBACK_FROM_VENDOR = 1350,
|
||||||
|
SET_PROPERTY_ACCESS = 1366,
|
||||||
|
ZONE_PROPERTY_MODEL_PLACED = 1369,
|
||||||
|
ZONE_PROPERTY_MODEL_ROTATED = 1370,
|
||||||
|
ZONE_PROPERTY_MODEL_REMOVED_WHILE_EQUIPPED = 1371,
|
||||||
|
ZONE_PROPERTY_MODEL_EQUIPPED = 1372,
|
||||||
|
ZONE_PROPERTY_MODEL_PICKED_UP = 1373,
|
||||||
|
ZONE_PROPERTY_MODEL_REMOVED = 1374,
|
||||||
|
NOTIFY_RACING_CLIENT = 1390,
|
||||||
|
RACING_PLAYER_HACK_CAR = 1391,
|
||||||
|
RACING_PLAYER_LOADED = 1392,
|
||||||
|
RACING_CLIENT_READY = 1393,
|
||||||
|
UPDATE_CHAT_MODE = 1395,
|
||||||
|
VEHICLE_NOTIFY_FINISHED_RACE = 1396,
|
||||||
|
SET_CONSUMABLE_ITEM = 1409,
|
||||||
|
SET_STATUS_IMMUNITY = 1435,
|
||||||
|
SET_PET_NAME_MODERATED = 1448,
|
||||||
|
MODIFY_LEGO_SCORE = 1459,
|
||||||
|
RESTORE_TO_POST_LOAD_STATS = 1468,
|
||||||
|
SET_RAIL_MOVEMENT = 1471,
|
||||||
|
START_RAIL_MOVEMENT = 1472,
|
||||||
|
CANCEL_RAIL_MOVEMENT = 1474,
|
||||||
|
CLIENT_RAIL_MOVEMENT_READY = 1476,
|
||||||
|
PLAYER_RAIL_ARRIVED_NOTIFICATION = 1477,
|
||||||
|
UPDATE_PLAYER_STATISTIC = 1481,
|
||||||
|
MODULAR_ASSEMBLY_NIF_COMPLETED = 1498,
|
||||||
|
NOTIFY_NOT_ENOUGH_INV_SPACE = 1516,
|
||||||
|
TEAM_SET_LEADER = 1557,
|
||||||
|
TEAM_INVITE_CONFIRM = 1558,
|
||||||
|
TEAM_GET_STATUS_RESPONSE = 1559,
|
||||||
|
TEAM_ADD_PLAYER = 1562,
|
||||||
|
TEAM_REMOVE_PLAYER = 1563,
|
||||||
|
START_CELEBRATION_EFFECT = 1618,
|
||||||
|
ADD_BUFF = 1647,
|
||||||
|
SERVER_DONE_LOADING_ALL_OBJECTS = 1642,
|
||||||
|
PLACE_PROPERTY_MODEL = 1170,
|
||||||
|
VEHICLE_NOTIFY_HIT_IMAGINATION_SERVER = 1606,
|
||||||
|
ADD_RUN_SPEED_MODIFIER = 1505,
|
||||||
|
HANDLE_HOT_PROPERTY_DATA = 1511,
|
||||||
|
SEND_HOT_PROPERTY_DATA = 1510,
|
||||||
|
REMOVE_RUN_SPEED_MODIFIER = 1506,
|
||||||
|
UPDATE_PROPERTY_PERFORMANCE_COST = 1547,
|
||||||
|
PROPERTY_ENTRANCE_BEGIN = 1553,
|
||||||
|
SET_RESURRECT_RESTORE_VALUES = 1591,
|
||||||
|
VEHICLE_STOP_BOOST = 1617,
|
||||||
|
REMOVE_BUFF = 1648,
|
||||||
|
REQUEST_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1666,
|
||||||
|
RESPONSE_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1667,
|
||||||
|
PLAYER_SET_CAMERA_CYCLING_MODE = 1676,
|
||||||
|
SET_MOUNT_INVENTORY_ID = 1726,
|
||||||
|
NOTIFY_SERVER_LEVEL_PROCESSING_COMPLETE = 1734,
|
||||||
|
NOTIFY_LEVEL_REWARDS = 1735,
|
||||||
|
DISMOUNT_COMPLETE = 1756,
|
||||||
|
MARK_INVENTORY_ITEM_AS_ACTIVE = 1767,
|
||||||
|
END
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EGAMEMESSAGETYPE__H__
|
11
dCommon/dEnums/eKillType.h
Normal file
11
dCommon/dEnums/eKillType.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef __EKILLTYPE__H__
|
||||||
|
#define __EKILLTYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eKillType : uint32_t {
|
||||||
|
VIOLENT,
|
||||||
|
SILENT
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EKILLTYPE__H__
|
24
dCommon/dEnums/eLoginResponse.h
Normal file
24
dCommon/dEnums/eLoginResponse.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef __ELOGINRESPONSE__H__
|
||||||
|
#define __ELOGINRESPONSE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eLoginResponse : uint8_t {
|
||||||
|
GENERAL_FAILED = 0,
|
||||||
|
SUCCESS,
|
||||||
|
BANNED,
|
||||||
|
// Unused 3
|
||||||
|
// Unused 4
|
||||||
|
PERMISSIONS_NOT_HIGH_ENOUGH = 5,
|
||||||
|
INVALID_USER,
|
||||||
|
ACCOUNT_LOCKED,
|
||||||
|
WRONG_PASS,
|
||||||
|
ACCOUNT_ACTIVATION_PENDING,
|
||||||
|
ACCOUNT_DISABLED,
|
||||||
|
GAME_TIME_EXPIRED,
|
||||||
|
FREE_TRIAL_ENDED,
|
||||||
|
PLAY_SCHEDULE_TIME_UP,
|
||||||
|
ACCOUNT_NOT_ACTIVATED
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ELOGINRESPONSE__H__
|
31
dCommon/dEnums/eLootSourceType.h
Normal file
31
dCommon/dEnums/eLootSourceType.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#ifndef __ELOOTSOURCETYPE__H__
|
||||||
|
#define __ELOOTSOURCETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eLootSourceType : uint32_t {
|
||||||
|
NONE = 0,
|
||||||
|
CHEST,
|
||||||
|
MISSION,
|
||||||
|
MAIL,
|
||||||
|
CURRENCY,
|
||||||
|
ACHIEVEMENT,
|
||||||
|
TRADE,
|
||||||
|
QUICKBUILD,
|
||||||
|
DELETION,
|
||||||
|
VENDOR,
|
||||||
|
ACTIVITY,
|
||||||
|
PICKUP,
|
||||||
|
BRICK,
|
||||||
|
PROPERTY,
|
||||||
|
MODERATION,
|
||||||
|
EXHIBIT,
|
||||||
|
INVENTORY,
|
||||||
|
CLAIMCODE,
|
||||||
|
CONSUMPTION,
|
||||||
|
CRAFTING,
|
||||||
|
LEVEL_REWARD,
|
||||||
|
RELOCATE
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ELOOTSOURCETYPE__H__
|
36
dCommon/dEnums/eMasterMessageType.h
Normal file
36
dCommon/dEnums/eMasterMessageType.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#ifndef __EMASTERMESSAGETYPE__H__
|
||||||
|
#define __EMASTERMESSAGETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eMasterMessageType : uint32_t {
|
||||||
|
REQUEST_PERSISTENT_ID = 1,
|
||||||
|
REQUEST_PERSISTENT_ID_RESPONSE,
|
||||||
|
REQUEST_ZONE_TRANSFER,
|
||||||
|
REQUEST_ZONE_TRANSFER_RESPONSE,
|
||||||
|
SERVER_INFO,
|
||||||
|
REQUEST_SESSION_KEY,
|
||||||
|
SET_SESSION_KEY,
|
||||||
|
SESSION_KEY_RESPONSE,
|
||||||
|
PLAYER_ADDED,
|
||||||
|
PLAYER_REMOVED,
|
||||||
|
|
||||||
|
CREATE_PRIVATE_ZONE,
|
||||||
|
REQUEST_PRIVATE_ZONE,
|
||||||
|
|
||||||
|
WORLD_READY,
|
||||||
|
PREP_ZONE,
|
||||||
|
|
||||||
|
SHUTDOWN,
|
||||||
|
SHUTDOWN_RESPONSE,
|
||||||
|
SHUTDOWN_IMMEDIATE,
|
||||||
|
|
||||||
|
SHUTDOWN_UNIVERSE,
|
||||||
|
|
||||||
|
AFFIRM_TRANSFER_REQUEST,
|
||||||
|
AFFIRM_TRANSFER_RESPONSE,
|
||||||
|
|
||||||
|
NEW_SESSION_ALERT
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EMASTERMESSAGETYPE__H__
|
17
dCommon/dEnums/eMatchUpdate.h
Normal file
17
dCommon/dEnums/eMatchUpdate.h
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#ifndef __EMATCHUPDATE__H__
|
||||||
|
#define __EMATCHUPDATE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eMatchUpdate : int32_t {
|
||||||
|
PLAYER_ADDED = 0,
|
||||||
|
PLAYER_REMOVED,
|
||||||
|
PHASE_CREATED,
|
||||||
|
PHASE_WAIT_READY,
|
||||||
|
PHASE_WAIT_START,
|
||||||
|
PLAYER_READY,
|
||||||
|
PLAYER_NOT_READY,
|
||||||
|
PLAYER_UPDATE
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EMATCHUPDATE__H__
|
13
dCommon/dEnums/eObjectBits.h
Normal file
13
dCommon/dEnums/eObjectBits.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef __EOBJECTBITS__H__
|
||||||
|
#define __EOBJECTBITS__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eObjectBits : size_t {
|
||||||
|
PERSISTENT = 32,
|
||||||
|
CLIENT = 46,
|
||||||
|
SPAWNED = 58,
|
||||||
|
CHARACTER = 60
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EOBJECTBITS__H__
|
12
dCommon/dEnums/eObjectWorldState.h
Normal file
12
dCommon/dEnums/eObjectWorldState.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef __EOBJECTWORLDSTATE__H__
|
||||||
|
#define __EOBJECTWORLDSTATE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eObjectWorldState : uint32_t {
|
||||||
|
INWORLD,
|
||||||
|
ATTACHED,
|
||||||
|
INVENTORY
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EOBJECTWORLDSTATE__H__
|
15
dCommon/dEnums/ePetTamingNotifyType.h
Normal file
15
dCommon/dEnums/ePetTamingNotifyType.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef __EPETTAMINGNOTIFYTYPE__H__
|
||||||
|
#define __EPETTAMINGNOTIFYTYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class ePetTamingNotifyType : uint32_t {
|
||||||
|
SUCCESS,
|
||||||
|
QUIT,
|
||||||
|
FAILED,
|
||||||
|
BEGIN,
|
||||||
|
READY,
|
||||||
|
NAMINGPET
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EPETTAMINGNOTIFYTYPE__H__
|
172
dCommon/dEnums/ePlayerFlag.h
Normal file
172
dCommon/dEnums/ePlayerFlag.h
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
#ifndef __EPLAYERFLAG__H__
|
||||||
|
#define __EPLAYERFLAG__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum ePlayerFlag : int32_t {
|
||||||
|
BTARR_TESTING = 0,
|
||||||
|
PLAYER_HAS_ENTERED_PET_RANCH = 1,
|
||||||
|
MINIMAP_UNLOCKED = 2,
|
||||||
|
ACTIVITY_REBUILDING_FAIL_TIME = 3,
|
||||||
|
ACTIVITY_REBUILDING_FAIL_RANGE = 4,
|
||||||
|
ACTIVITY_SHOOTING_GALLERY_HELP = 5,
|
||||||
|
HELP_WALKING_CONTROLS = 6,
|
||||||
|
FIRST_SMASHABLE = 7,
|
||||||
|
FIRST_IMAGINATION_PICKUP = 8,
|
||||||
|
FIRST_DAMAGE = 9,
|
||||||
|
FIRST_ITEM = 10,
|
||||||
|
FIRST_BRICK = 11,
|
||||||
|
FIRST_CONSUMABLE = 12,
|
||||||
|
FIRST_EQUIPPABLE = 13,
|
||||||
|
CHAT_HELP = 14,
|
||||||
|
FIRST_PET_TAMING_MINIGAME = 15,
|
||||||
|
FIRST_PET_ON_SWITCH = 16,
|
||||||
|
FIRST_PET_JUMPED_ON_SWITCH = 17,
|
||||||
|
FIRST_PET_FOUND_TREASURE = 18,
|
||||||
|
FIRST_PET_DUG_TREASURE = 19,
|
||||||
|
FIRST_PET_OWNER_ON_PET_BOUNCER = 20,
|
||||||
|
FIRST_PET_DESPAWN_NO_IMAGINATION = 21,
|
||||||
|
FIRST_PET_SELECTED_ENOUGH_BRICKS = 22,
|
||||||
|
FIRST_EMOTE_UNLOCKED = 23,
|
||||||
|
GF_PIRATE_REP = 24,
|
||||||
|
AG_BOB_CINEMATIC_EVENT = 25,
|
||||||
|
HELP_JUMPING_CONTROLS = 26,
|
||||||
|
HELP_DOUBLE_JUMP_CONTROLS = 27,
|
||||||
|
HELP_CAMERA_CONTROLS = 28,
|
||||||
|
HELP_ROTATE_CONTROLS = 29,
|
||||||
|
HELP_SMASH = 30,
|
||||||
|
MONUMENT_INTRO_MUSIC_PLAYED = 31,
|
||||||
|
BEGINNING_ZONE_SUMMARY_DISPLAYED = 32,
|
||||||
|
AG_FINISH_LINE_BUILT = 33,
|
||||||
|
AG_BOSS_AREA_FOUND = 34,
|
||||||
|
AG_LANDED_IN_BATTLEFIELD = 35,
|
||||||
|
GF_PLAYER_HAS_BEEN_TO_THE_RAVINE = 36,
|
||||||
|
MODULAR_BUILD_STARTED = 37,
|
||||||
|
MODULAR_BUILD_FINISHED_CLICK_BUTTON = 38,
|
||||||
|
THINKING_HAT_RECEIVED_GO_TO_MODULAR_BUILD_AREA = 39,
|
||||||
|
BUILD_AREA_ENTERED_MOD_NOT_ACTIVATED_PUT_ON_HAT = 40,
|
||||||
|
HAT_ON_INSIDE_OF_MOD_BUILD_EQUIP_A_MODULE_FROM_LEG = 41,
|
||||||
|
MODULE_EQUIPPED_PLACE_ON_GLOWING_BLUE_SPOT = 42,
|
||||||
|
FIRST_MODULE_PLACED_CORRECTLY_NOW_DO_THE_REST = 43,
|
||||||
|
ROCKET_COMPLETE_NOW_LAUNCH_FROM_PAD = 44,
|
||||||
|
JOINED_A_FACTION = 45,
|
||||||
|
VENTURE_FACTION = 46,
|
||||||
|
ASSEMBLY_FACTION = 47,
|
||||||
|
PARADOX_FACTION = 48,
|
||||||
|
SENTINEL_FACTION = 49,
|
||||||
|
LUP_WORLD_ACCESS = 50,
|
||||||
|
AG_FIRST_FLAG_COLLECTED = 51,
|
||||||
|
TOOLTIP_TALK_TO_SKYLAND_TO_GET_HAT = 52,
|
||||||
|
MODULAR_BUILD_PLAYER_PLACES_FIRST_MODEL_IN_SCRATCH = 53,
|
||||||
|
MODULAR_BUILD_FIRST_ARROW_DISPLAY_FOR_MODULE = 54,
|
||||||
|
AG_BEACON_QB_SO_THE_PLAYER_CAN_ALWAYS_BUILD_THEM = 55,
|
||||||
|
GF_PET_DIG_FLAG_1 = 56,
|
||||||
|
GF_PET_DIG_FLAG_2 = 57,
|
||||||
|
GF_PET_DIG_FLAG_3 = 58,
|
||||||
|
SUPPRESS_SPACESHIP_CINEMATIC_FLYTHROUGH = 59,
|
||||||
|
GF_PLAYER_FALL_DEATH = 60,
|
||||||
|
GF_PLAYER_CAN_GET_FLAG_1 = 61,
|
||||||
|
GF_PLAYER_CAN_GET_FLAG_2 = 62,
|
||||||
|
GF_PLAYER_CAN_GET_FLAG_3 = 63,
|
||||||
|
ENTER_BBB_FROM_PROPERTY_EDIT_CONFIRMATION_DIALOG = 64,
|
||||||
|
AG_FIRST_COMBAT_COMPLETE = 65,
|
||||||
|
AG_COMPLETE_BOB_MISSION = 66,
|
||||||
|
FIRST_MANUAL_PET_HIBERNATE = 69,
|
||||||
|
CAGED_SPIDER = 74,
|
||||||
|
IS_NEWS_SCREEN_VISIBLE = 114,
|
||||||
|
NJ_GARMADON_CINEMATIC_SEEN = 125,
|
||||||
|
EQUPPED_TRIAL_FACTION_GEAR = 126,
|
||||||
|
ELEPHANT_PET_3050 = 801,
|
||||||
|
CAT_PET_3054 = 803,
|
||||||
|
TRICERATOPS_PET_3195 = 806,
|
||||||
|
TERRIER_PET_3254 = 807,
|
||||||
|
SKUNK_PET_3261 = 811,
|
||||||
|
BUNNY_PET_3672 = 813,
|
||||||
|
CROCODILE_PET_3994 = 814,
|
||||||
|
DOBERMAN_PET_5635 = 815,
|
||||||
|
BUFFALO_PET_5636 = 816,
|
||||||
|
ROBOT_DOG_PET_5637 = 818,
|
||||||
|
RED_DRAGON_PET_5639 = 819,
|
||||||
|
TORTOISE_PET_5640 = 820,
|
||||||
|
GREEN_DRAGON_PET_5641 = 821,
|
||||||
|
PANDA_PET_5643 = 822,
|
||||||
|
MANTIS_PET_5642 = 823,
|
||||||
|
WARTHOG_PET_6720 = 824,
|
||||||
|
LION_PET_3520 = 825,
|
||||||
|
GOAT_PET_7638 = 818,
|
||||||
|
CRAB_PET_7694 = 827,
|
||||||
|
REINDEER_PET_12294 = 829,
|
||||||
|
STEGOSAURUS_PET_12431 = 830,
|
||||||
|
SABER_CAT_PET_12432 = 831,
|
||||||
|
GRYPHON_PET_12433 = 832,
|
||||||
|
ALINE_PET_12334 = 833,
|
||||||
|
UNKNOWN_PET = 834,
|
||||||
|
EARTH_DRAGON_PET_16210 = 836,
|
||||||
|
SKELETON_DRAGON_PET_13067 = 838,
|
||||||
|
AG_SPACE_SHIP_BINOC_AT_LAUNCH = 1001,
|
||||||
|
AG_SPACE_SHIP_BINOC_AT_LAUNCH_PLATFORM = 1002,
|
||||||
|
AG_SPACE_SHIP_BINOC_ON_PLATFORM_TO_LEFT_OF_START = 1003,
|
||||||
|
AG_SPACE_SHIP_BINOC_ON_PLATFORM_TO_RIGHT_OF_START = 1004,
|
||||||
|
AG_SPACE_SHIP_BINOC_AT_BOB = 1005,
|
||||||
|
AG_BATTLE_BINOC_FOR_TRICERETOPS = 1101,
|
||||||
|
AG_BATTLE_BINOC_AT_PARADOX = 1102,
|
||||||
|
AG_BATTLE_BINOC_AT_MISSION_GIVER = 1103,
|
||||||
|
AG_BATTLE_BINOC_AT_BECK = 1104,
|
||||||
|
AG_MONUMENT_BINOC_INTRO = 1105,
|
||||||
|
AG_MONUMENT_BINOC_OUTRO = 1106,
|
||||||
|
AG_LAUNCH_BINOC_INTRO = 1107,
|
||||||
|
AG_LAUNCH_BINOC_BISON = 1108,
|
||||||
|
AG_LAUNCH_BINOC_SHARK = 1109,
|
||||||
|
NS_BINOC_CONCERT_TRANSITION = 1201,
|
||||||
|
NS_BINOC_RACE_PLACE_TRANSITION = 1202,
|
||||||
|
NS_BINOC_BRICK_ANNEX_TRANSITION = 1203,
|
||||||
|
NS_BINOC_GF_LAUNCH = 1204,
|
||||||
|
NS_BINOC_FV_LAUNCH = 1205,
|
||||||
|
NS_BINOC_BRICK_ANNEX_WATER = 1206,
|
||||||
|
NS_BINOC_AG_LAUNCH_AT_RACE_PLACE = 1207,
|
||||||
|
NS_BINOC_AG_LAUNCH_AT_BRICK_ANNEX = 1208,
|
||||||
|
NS_BINOC_AG_LAUNCH_AT_PLAZA = 1209,
|
||||||
|
NS_BINOC_TBA = 1210,
|
||||||
|
NS_FLAG_COLLECTABLE_1_BY_JONNY_THUNDER = 1211,
|
||||||
|
NS_FLAG_COLLECTABLE_2_UNDER_CONCERT_BRIDGE = 1212,
|
||||||
|
NS_FLAG_COLLECTABLE_3_BY_FV_LAUNCH = 1213,
|
||||||
|
NS_FLAG_COLLECTABLE_4_IN_PLAZA_BEHIND_BUILDING = 1214,
|
||||||
|
NS_FLAG_COLLECTABLE_5_BY_GF_LAUNCH = 1215,
|
||||||
|
NS_FLAG_COLLECTABLE_6_BY_DUCK_SG = 1216,
|
||||||
|
NS_FLAG_COLLECTABLE_7_BY_LUP_LAUNCH = 1217,
|
||||||
|
NS_FLAG_COLLECTABLE_8_BY_NT_LUANCH = 1218,
|
||||||
|
NS_FLAG_COLLECTABLE_9_BY_RACE_BUILD = 1219,
|
||||||
|
NS_FLAG_COLLECTABLE_10_ON_AG_LAUNCH_PATH = 1220,
|
||||||
|
PR_BINOC_AT_LAUNCH_PAD = 1251,
|
||||||
|
PR_BINOC_AT_BEGINNING_OF_ISLAND_B = 1252,
|
||||||
|
PR_BINOC_AT_FIRST_PET_BOUNCER = 1253,
|
||||||
|
PR_BINOC_ON_BY_CROWS_NEST = 1254,
|
||||||
|
PR_PET_DIG_AT_BEGINNING_OF_ISLAND_B = 1261,
|
||||||
|
PR_PET_DIG_AT_THE_LOCATION_OF_OLD_BOUNCE_BACK = 1262,
|
||||||
|
PR_PET_DIG_UNDER_QB_BRIDGE = 1263,
|
||||||
|
PR_PET_DIG_BACK_SIDE_BY_PARTNER_BOUNCE = 1264,
|
||||||
|
PR_PET_DIG_BY_LAUNCH_PAD = 1265,
|
||||||
|
PR_PET_DIG_BY_FIRST_PET_BOUNCER = 1266,
|
||||||
|
GF_BINOC_ON_LANDING_PAD = 1301,
|
||||||
|
GF_BINOC_AT_RAVINE_START = 1302,
|
||||||
|
GF_BINOC_ON_TOP_OF_RAVINE_HEAD = 1303,
|
||||||
|
GF_BINOC_AT_TURTLE_AREA = 1304,
|
||||||
|
GF_BINOC_IN_TUNNEL_TO_ELEPHANTS = 1305,
|
||||||
|
GF_BINOC_IN_ELEPHANTS_AREA = 1306,
|
||||||
|
GF_BINOC_IN_RACING_AREA = 1307,
|
||||||
|
GF_BINOC_IN_CROC_AREA = 1308,
|
||||||
|
GF_BINOC_IN_JAIL_AREA = 1309,
|
||||||
|
GF_BINOC_TELESCOPE_NEXT_TO_CAPTAIN_JACK = 1310,
|
||||||
|
NT_HEART_OF_DARKNESS = 1911,
|
||||||
|
NT_PLINTH_REBUILD = 1919,
|
||||||
|
NT_FACTION_SPY_DUKE = 1974,
|
||||||
|
NT_FACTION_SPY_OVERBUILD = 1976,
|
||||||
|
NT_FACTION_SPY_HAEL = 1977,
|
||||||
|
NJ_EARTH_SPINJITZU = 2030,
|
||||||
|
NJ_LIGHTNING_SPINJITZU = 2031,
|
||||||
|
NJ_ICE_SPINJITZU = 2032,
|
||||||
|
NJ_FIRE_SPINJITZU = 2033,
|
||||||
|
NJ_WU_SHOW_DAILY_CHEST = 2099
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EPLAYERFLAG__H__
|
13
dCommon/dEnums/eQuickBuildFailReason.h
Normal file
13
dCommon/dEnums/eQuickBuildFailReason.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef __EQUICKBUILDFAILREASON__H__
|
||||||
|
#define __EQUICKBUILDFAILREASON__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eQuickBuildFailReason : uint32_t {
|
||||||
|
NOT_GIVEN,
|
||||||
|
OUT_OF_IMAGINATION,
|
||||||
|
CANCELED_EARLY,
|
||||||
|
BUILD_ENDED
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EQUICKBUILDFAILREASON__H__
|
15
dCommon/dEnums/eRebuildState.h
Normal file
15
dCommon/dEnums/eRebuildState.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef __EREBUILDSTATE__H__
|
||||||
|
#define __EREBUILDSTATE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eRebuildState : uint32_t {
|
||||||
|
OPEN,
|
||||||
|
COMPLETED = 2,
|
||||||
|
RESETTING = 4,
|
||||||
|
BUILDING,
|
||||||
|
INCOMPLETE
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //!__EREBUILDSTATE__H__
|
15
dCommon/dEnums/eRenameResponse.h
Normal file
15
dCommon/dEnums/eRenameResponse.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef __ERENAMERESPONSE__H__
|
||||||
|
#define __ERENAMERESPONSE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
//! An enum for character rename responses
|
||||||
|
enum class eRenameResponse : uint8_t {
|
||||||
|
SUCCESS = 0,
|
||||||
|
UNKNOWN_ERROR,
|
||||||
|
NAME_UNAVAILABLE,
|
||||||
|
NAME_IN_USE
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //!__ERENAMERESPONSE__H__
|
@ -107,7 +107,7 @@ enum class eReplicaComponentType : uint32_t {
|
|||||||
DONATION_VENDOR,
|
DONATION_VENDOR,
|
||||||
COMBAT_MEDIATOR,
|
COMBAT_MEDIATOR,
|
||||||
COMMENDATION_VENDOR,
|
COMMENDATION_VENDOR,
|
||||||
UNKNOWN_103,
|
GATE_RUSH_CONTROL,
|
||||||
RAIL_ACTIVATOR,
|
RAIL_ACTIVATOR,
|
||||||
ROLLER,
|
ROLLER,
|
||||||
PLAYER_FORCED_MOVEMENT,
|
PLAYER_FORCED_MOVEMENT,
|
||||||
@ -119,7 +119,7 @@ enum class eReplicaComponentType : uint32_t {
|
|||||||
UNKNOWN_112,
|
UNKNOWN_112,
|
||||||
PROPERTY_PLAQUE,
|
PROPERTY_PLAQUE,
|
||||||
BUILD_BORDER,
|
BUILD_BORDER,
|
||||||
UNKOWN_115,
|
UNKNOWN_115,
|
||||||
CULLING_PLANE,
|
CULLING_PLANE,
|
||||||
DESTROYABLE = 1000 // Actually 7
|
DESTROYABLE = 1000 // Actually 7
|
||||||
};
|
};
|
||||||
|
12
dCommon/dEnums/eReplicaPacketType.h
Normal file
12
dCommon/dEnums/eReplicaPacketType.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef __EREPLICAPACKETTYPE__H__
|
||||||
|
#define __EREPLICAPACKETTYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eReplicaPacketType : uint8_t {
|
||||||
|
CONSTRUCTION,
|
||||||
|
SERIALIZATION,
|
||||||
|
DESTRUCTION
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EREPLICAPACKETTYPE__H__
|
12
dCommon/dEnums/eServerMessageType.h
Normal file
12
dCommon/dEnums/eServerMessageType.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef __ESERVERMESSAGETYPE__H__
|
||||||
|
#define __ESERVERMESSAGETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
//! The Internal Server Packet Identifiers
|
||||||
|
enum class eServerMessageType : uint32_t {
|
||||||
|
VERSION_CONFIRM = 0,
|
||||||
|
DISCONNECT_NOTIFY,
|
||||||
|
GENERAL_NOTIFY
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ESERVERMESSAGETYPE__H__
|
11
dCommon/dEnums/eStateChangeType.h
Normal file
11
dCommon/dEnums/eStateChangeType.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef __ESTATECHANGETYPE__H__
|
||||||
|
#define __ESTATECHANGETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eStateChangeType : uint32_t {
|
||||||
|
PUSH,
|
||||||
|
POP
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ESTATECHANGETYPE__H__
|
12
dCommon/dEnums/eTerminateType.h
Normal file
12
dCommon/dEnums/eTerminateType.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef __ETERMINATETYPE__H__
|
||||||
|
#define __ETERMINATETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eTerminateType : uint32_t {
|
||||||
|
RANGE,
|
||||||
|
USER,
|
||||||
|
FROM_INTERACTION
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__ETERMINATETYPE__H__
|
12
dCommon/dEnums/eUseItemResponse.h
Normal file
12
dCommon/dEnums/eUseItemResponse.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef __EUSEITEMRESPONSE__H__
|
||||||
|
#define __EUSEITEMRESPONSE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eUseItemResponse : uint32_t {
|
||||||
|
NoImaginationForPet = 1,
|
||||||
|
FailedPrecondition,
|
||||||
|
MountsNotAllowed
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EUSEITEMRESPONSE__H__
|
42
dCommon/dEnums/eWorldMessageType.h
Normal file
42
dCommon/dEnums/eWorldMessageType.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#ifndef __EWORLDMESSAGETYPE__H__
|
||||||
|
#define __EWORLDMESSAGETYPE__H__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
enum class eWorldMessageType : uint32_t {
|
||||||
|
VALIDATION = 1, // Session info
|
||||||
|
CHARACTER_LIST_REQUEST,
|
||||||
|
CHARACTER_CREATE_REQUEST,
|
||||||
|
LOGIN_REQUEST, // Character selected
|
||||||
|
GAME_MSG,
|
||||||
|
CHARACTER_DELETE_REQUEST,
|
||||||
|
CHARACTER_RENAME_REQUEST,
|
||||||
|
HAPPY_FLOWER_MODE_NOTIFY,
|
||||||
|
SLASH_RELOAD_MAP, // Reload map cmp
|
||||||
|
SLASH_PUSH_MAP_REQUEST, // Push map req cmd
|
||||||
|
SLASH_PUSH_MAP, // Push map cmd
|
||||||
|
SLASH_PULL_MAP, // Pull map cmd
|
||||||
|
LOCK_MAP_REQUEST,
|
||||||
|
GENERAL_CHAT_MESSAGE, // General chat message
|
||||||
|
HTTP_MONITOR_INFO_REQUEST,
|
||||||
|
SLASH_DEBUG_SCRIPTS, // Debug scripts cmd
|
||||||
|
MODELS_CLEAR,
|
||||||
|
EXHIBIT_INSERT_MODEL,
|
||||||
|
LEVEL_LOAD_COMPLETE, // Character data request
|
||||||
|
TMP_GUILD_CREATE,
|
||||||
|
ROUTE_PACKET, // Social?
|
||||||
|
POSITION_UPDATE,
|
||||||
|
MAIL,
|
||||||
|
WORD_CHECK, // Whitelist word check
|
||||||
|
STRING_CHECK, // Whitelist string check
|
||||||
|
GET_PLAYERS_IN_ZONE,
|
||||||
|
REQUEST_UGC_MANIFEST_INFO,
|
||||||
|
BLUEPRINT_GET_ALL_DATA_REQUEST,
|
||||||
|
CANCEL_MAP_QUEUE,
|
||||||
|
HANDLE_FUNNESS,
|
||||||
|
FAKE_PRG_CSR_MESSAGE,
|
||||||
|
REQUEST_FREE_TRIAL_REFRESH,
|
||||||
|
GM_SET_FREE_TRIAL_STATUS
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //!__EWORLDMESSAGETYPE__H__
|
@ -18,7 +18,9 @@
|
|||||||
#include "InventoryComponent.h"
|
#include "InventoryComponent.h"
|
||||||
#include "eMissionTaskType.h"
|
#include "eMissionTaskType.h"
|
||||||
#include "eMissionState.h"
|
#include "eMissionState.h"
|
||||||
|
#include "eObjectBits.h"
|
||||||
#include "eGameMasterLevel.h"
|
#include "eGameMasterLevel.h"
|
||||||
|
#include "ePlayerFlag.h"
|
||||||
|
|
||||||
Character::Character(uint32_t id, User* parentUser) {
|
Character::Character(uint32_t id, User* parentUser) {
|
||||||
//First load the name, etc:
|
//First load the name, etc:
|
||||||
@ -69,8 +71,8 @@ Character::Character(uint32_t id, User* parentUser) {
|
|||||||
|
|
||||||
//Set our objectID:
|
//Set our objectID:
|
||||||
m_ObjectID = m_ID;
|
m_ObjectID = m_ID;
|
||||||
m_ObjectID = GeneralUtils::SetBit(m_ObjectID, OBJECT_BIT_CHARACTER);
|
GeneralUtils::SetBit(m_ObjectID, eObjectBits::CHARACTER);
|
||||||
m_ObjectID = GeneralUtils::SetBit(m_ObjectID, OBJECT_BIT_PERSISTENT);
|
GeneralUtils::SetBit(m_ObjectID, eObjectBits::PERSISTENT);
|
||||||
|
|
||||||
m_ParentUser = parentUser;
|
m_ParentUser = parentUser;
|
||||||
m_OurEntity = nullptr;
|
m_OurEntity = nullptr;
|
||||||
@ -128,8 +130,8 @@ void Character::UpdateFromDatabase() {
|
|||||||
|
|
||||||
//Set our objectID:
|
//Set our objectID:
|
||||||
m_ObjectID = m_ID;
|
m_ObjectID = m_ID;
|
||||||
m_ObjectID = GeneralUtils::SetBit(m_ObjectID, OBJECT_BIT_CHARACTER);
|
GeneralUtils::SetBit(m_ObjectID, eObjectBits::CHARACTER);
|
||||||
m_ObjectID = GeneralUtils::SetBit(m_ObjectID, OBJECT_BIT_PERSISTENT);
|
GeneralUtils::SetBit(m_ObjectID, eObjectBits::PERSISTENT);
|
||||||
|
|
||||||
m_OurEntity = nullptr;
|
m_OurEntity = nullptr;
|
||||||
m_BuildMode = false;
|
m_BuildMode = false;
|
||||||
@ -361,9 +363,9 @@ void Character::SaveXMLToDatabase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Prevents the news feed from showing up on world transfers
|
// Prevents the news feed from showing up on world transfers
|
||||||
if (GetPlayerFlag(ePlayerFlags::IS_NEWS_SCREEN_VISIBLE)) {
|
if (GetPlayerFlag(ePlayerFlag::IS_NEWS_SCREEN_VISIBLE)) {
|
||||||
auto* s = m_Doc->NewElement("s");
|
auto* s = m_Doc->NewElement("s");
|
||||||
s->SetAttribute("si", ePlayerFlags::IS_NEWS_SCREEN_VISIBLE);
|
s->SetAttribute("si", ePlayerFlag::IS_NEWS_SCREEN_VISIBLE);
|
||||||
flags->LinkEndChild(s);
|
flags->LinkEndChild(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,7 +373,7 @@ void Character::SaveXMLToDatabase() {
|
|||||||
|
|
||||||
//Call upon the entity to update our xmlDoc:
|
//Call upon the entity to update our xmlDoc:
|
||||||
if (!m_OurEntity) {
|
if (!m_OurEntity) {
|
||||||
Game::logger->Log("Character", "We didn't have an entity set while saving! CHARACTER WILL NOT BE SAVED!");
|
Game::logger->Log("Character", "%i:%s didn't have an entity set while saving! CHARACTER WILL NOT BE SAVED!", this->GetID(), this->GetName().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -382,7 +384,7 @@ void Character::SaveXMLToDatabase() {
|
|||||||
//For metrics, log the time it took to save:
|
//For metrics, log the time it took to save:
|
||||||
auto end = std::chrono::system_clock::now();
|
auto end = std::chrono::system_clock::now();
|
||||||
std::chrono::duration<double> elapsed = end - start;
|
std::chrono::duration<double> elapsed = end - start;
|
||||||
Game::logger->Log("Character", "Saved character to Database in: %fs", elapsed.count());
|
Game::logger->Log("Character", "%i:%s Saved character to Database in: %fs", this->GetID(), this->GetName().c_str(), elapsed.count());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Character::SetIsNewLogin() {
|
void Character::SetIsNewLogin() {
|
||||||
@ -394,7 +396,7 @@ void Character::SetIsNewLogin() {
|
|||||||
while (currentChild) {
|
while (currentChild) {
|
||||||
if (currentChild->Attribute("si")) {
|
if (currentChild->Attribute("si")) {
|
||||||
flags->DeleteChild(currentChild);
|
flags->DeleteChild(currentChild);
|
||||||
Game::logger->Log("Character", "Removed isLoggedIn flag from character %i, saving character to database", GetID());
|
Game::logger->Log("Character", "Removed isLoggedIn flag from character %i:%s, saving character to database", GetID(), GetName().c_str());
|
||||||
WriteToDatabase();
|
WriteToDatabase();
|
||||||
}
|
}
|
||||||
currentChild = currentChild->NextSiblingElement();
|
currentChild = currentChild->NextSiblingElement();
|
||||||
@ -416,7 +418,7 @@ void Character::WriteToDatabase() {
|
|||||||
delete printer;
|
delete printer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Character::SetPlayerFlag(const uint32_t flagId, const bool value) {
|
void Character::SetPlayerFlag(const int32_t flagId, const bool value) {
|
||||||
// If the flag is already set, we don't have to recalculate it
|
// If the flag is already set, we don't have to recalculate it
|
||||||
if (GetPlayerFlag(flagId) == value) return;
|
if (GetPlayerFlag(flagId) == value) return;
|
||||||
|
|
||||||
@ -463,7 +465,7 @@ void Character::SetPlayerFlag(const uint32_t flagId, const bool value) {
|
|||||||
GameMessages::SendNotifyClientFlagChange(m_ObjectID, flagId, value, m_ParentUser->GetSystemAddress());
|
GameMessages::SendNotifyClientFlagChange(m_ObjectID, flagId, value, m_ParentUser->GetSystemAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Character::GetPlayerFlag(const uint32_t flagId) const {
|
bool Character::GetPlayerFlag(const int32_t flagId) const {
|
||||||
// Calculate the index first
|
// Calculate the index first
|
||||||
const auto flagIndex = uint32_t(std::floor(flagId / 64));
|
const auto flagIndex = uint32_t(std::floor(flagId / 64));
|
||||||
|
|
||||||
@ -480,8 +482,8 @@ bool Character::GetPlayerFlag(const uint32_t flagId) const {
|
|||||||
|
|
||||||
void Character::SetRetroactiveFlags() {
|
void Character::SetRetroactiveFlags() {
|
||||||
// Retroactive check for if player has joined a faction to set their 'joined a faction' flag to true.
|
// Retroactive check for if player has joined a faction to set their 'joined a faction' flag to true.
|
||||||
if (GetPlayerFlag(ePlayerFlags::VENTURE_FACTION) || GetPlayerFlag(ePlayerFlags::ASSEMBLY_FACTION) || GetPlayerFlag(ePlayerFlags::PARADOX_FACTION) || GetPlayerFlag(ePlayerFlags::SENTINEL_FACTION)) {
|
if (GetPlayerFlag(ePlayerFlag::VENTURE_FACTION) || GetPlayerFlag(ePlayerFlag::ASSEMBLY_FACTION) || GetPlayerFlag(ePlayerFlag::PARADOX_FACTION) || GetPlayerFlag(ePlayerFlag::SENTINEL_FACTION)) {
|
||||||
SetPlayerFlag(ePlayerFlags::JOINED_A_FACTION, true);
|
SetPlayerFlag(ePlayerFlag::JOINED_A_FACTION, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -541,7 +543,7 @@ void Character::OnZoneLoad() {
|
|||||||
if (missionComponent != nullptr) {
|
if (missionComponent != nullptr) {
|
||||||
// Fix the monument race flag
|
// Fix the monument race flag
|
||||||
if (missionComponent->GetMissionState(319) >= eMissionState::READY_TO_COMPLETE) {
|
if (missionComponent->GetMissionState(319) >= eMissionState::READY_TO_COMPLETE) {
|
||||||
SetPlayerFlag(33, true);
|
SetPlayerFlag(ePlayerFlag::AG_FINISH_LINE_BUILT, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -557,7 +559,7 @@ void Character::OnZoneLoad() {
|
|||||||
*/
|
*/
|
||||||
if (HasPermission(ePermissionMap::Old)) {
|
if (HasPermission(ePermissionMap::Old)) {
|
||||||
if (GetCoins() > 1000000) {
|
if (GetCoins() > 1000000) {
|
||||||
SetCoins(1000000, eLootSourceType::LOOT_SOURCE_NONE);
|
SetCoins(1000000, eLootSourceType::NONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -635,7 +637,7 @@ void Character::SetBillboardVisible(bool visible) {
|
|||||||
|
|
||||||
// The GameMessage we send for turning the nameplate off just deletes the BillboardSubcomponent from the parent component.
|
// The GameMessage we send for turning the nameplate off just deletes the BillboardSubcomponent from the parent component.
|
||||||
// Because that same message does not allow for custom parameters, we need to create the BillboardSubcomponent a different way
|
// Because that same message does not allow for custom parameters, we need to create the BillboardSubcomponent a different way
|
||||||
// This workaround involves sending an unrelated GameMessage that does not apply to player entites,
|
// This workaround involves sending an unrelated GameMessage that does not apply to player entites,
|
||||||
// but forces the client to create the necessary SubComponent that controls the billboard.
|
// but forces the client to create the necessary SubComponent that controls the billboard.
|
||||||
GameMessages::SendShowBillboardInteractIcon(UNASSIGNED_SYSTEM_ADDRESS, m_OurEntity->GetObjectID());
|
GameMessages::SendShowBillboardInteractIcon(UNASSIGNED_SYSTEM_ADDRESS, m_OurEntity->GetObjectID());
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ struct Packet;
|
|||||||
class Entity;
|
class Entity;
|
||||||
enum class ePermissionMap : uint64_t;
|
enum class ePermissionMap : uint64_t;
|
||||||
enum class eGameMasterLevel : uint8_t;
|
enum class eGameMasterLevel : uint8_t;
|
||||||
|
enum class eLootSourceType : uint32_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Meta information about a character, like their name and style
|
* Meta information about a character, like their name and style
|
||||||
@ -414,14 +415,14 @@ public:
|
|||||||
* @param flagId the ID of the flag to set
|
* @param flagId the ID of the flag to set
|
||||||
* @param value the value to set for the flag
|
* @param value the value to set for the flag
|
||||||
*/
|
*/
|
||||||
void SetPlayerFlag(uint32_t flagId, bool value);
|
void SetPlayerFlag(int32_t flagId, bool value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the value for a certain character flag
|
* Gets the value for a certain character flag
|
||||||
* @param flagId the ID of the flag to get a value for
|
* @param flagId the ID of the flag to get a value for
|
||||||
* @return the value of the flag given the ID (the default is false, obviously)
|
* @return the value of the flag given the ID (the default is false, obviously)
|
||||||
*/
|
*/
|
||||||
bool GetPlayerFlag(uint32_t flagId) const;
|
bool GetPlayerFlag(int32_t flagId) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notifies the character that they're now muted
|
* Notifies the character that they're now muted
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "Loot.h"
|
#include "Loot.h"
|
||||||
#include "eMissionTaskType.h"
|
#include "eMissionTaskType.h"
|
||||||
#include "eTriggerEventType.h"
|
#include "eTriggerEventType.h"
|
||||||
|
#include "eObjectBits.h"
|
||||||
|
|
||||||
//Component includes:
|
//Component includes:
|
||||||
#include "Component.h"
|
#include "Component.h"
|
||||||
@ -72,6 +73,7 @@
|
|||||||
#include "TriggerComponent.h"
|
#include "TriggerComponent.h"
|
||||||
#include "eGameMasterLevel.h"
|
#include "eGameMasterLevel.h"
|
||||||
#include "eReplicaComponentType.h"
|
#include "eReplicaComponentType.h"
|
||||||
|
#include "eReplicaPacketType.h"
|
||||||
|
|
||||||
// Table includes
|
// Table includes
|
||||||
#include "CDComponentsRegistryTable.h"
|
#include "CDComponentsRegistryTable.h"
|
||||||
@ -706,6 +708,13 @@ void Entity::Initialize() {
|
|||||||
// TODO: create movementAIcomp and set path
|
// TODO: create movementAIcomp and set path
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
} else {
|
||||||
|
// else we still need to setup moving platform if it has a moving platform comp but no path
|
||||||
|
int32_t movingPlatformComponentId = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::MOVING_PLATFORM, -1);
|
||||||
|
if (movingPlatformComponentId >= 0) {
|
||||||
|
MovingPlatformComponent* plat = new MovingPlatformComponent(this, pathName);
|
||||||
|
m_Components.insert(std::make_pair(eReplicaComponentType::MOVING_PLATFORM, plat));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int proximityMonitorID = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::PROXIMITY_MONITOR);
|
int proximityMonitorID = compRegistryTable->GetByIDAndType(m_TemplateID, eReplicaComponentType::PROXIMITY_MONITOR);
|
||||||
@ -728,7 +737,7 @@ void Entity::Initialize() {
|
|||||||
|
|
||||||
if (!m_Character && EntityManager::Instance()->GetGhostingEnabled()) {
|
if (!m_Character && EntityManager::Instance()->GetGhostingEnabled()) {
|
||||||
// Don't ghost what is likely large scene elements
|
// Don't ghost what is likely large scene elements
|
||||||
if (m_Components.size() == 2 && HasComponent(eReplicaComponentType::SIMPLE_PHYSICS) && HasComponent(eReplicaComponentType::RENDER)) {
|
if (HasComponent(eReplicaComponentType::SIMPLE_PHYSICS) && HasComponent(eReplicaComponentType::RENDER) && (m_Components.size() == 2 || (HasComponent(eReplicaComponentType::TRIGGER) && m_Components.size() == 3))) {
|
||||||
goto no_ghosting;
|
goto no_ghosting;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -876,7 +885,7 @@ void Entity::SetGMLevel(eGameMasterLevel value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Entity::WriteBaseReplicaData(RakNet::BitStream* outBitStream, eReplicaPacketType packetType) {
|
void Entity::WriteBaseReplicaData(RakNet::BitStream* outBitStream, eReplicaPacketType packetType) {
|
||||||
if (packetType == PACKET_TYPE_CONSTRUCTION) {
|
if (packetType == eReplicaPacketType::CONSTRUCTION) {
|
||||||
outBitStream->Write(m_ObjectID);
|
outBitStream->Write(m_ObjectID);
|
||||||
outBitStream->Write(m_TemplateID);
|
outBitStream->Write(m_TemplateID);
|
||||||
|
|
||||||
@ -953,9 +962,9 @@ void Entity::WriteBaseReplicaData(RakNet::BitStream* outBitStream, eReplicaPacke
|
|||||||
|
|
||||||
if (m_ParentEntity != nullptr || m_SpawnerID != 0) {
|
if (m_ParentEntity != nullptr || m_SpawnerID != 0) {
|
||||||
outBitStream->Write1();
|
outBitStream->Write1();
|
||||||
if (m_ParentEntity != nullptr) outBitStream->Write(GeneralUtils::SetBit(m_ParentEntity->GetObjectID(), OBJECT_BIT_CLIENT));
|
if (m_ParentEntity != nullptr) outBitStream->Write(GeneralUtils::SetBit(m_ParentEntity->GetObjectID(), static_cast<uint32_t>(eObjectBits::CLIENT)));
|
||||||
else if (m_Spawner != nullptr && m_Spawner->m_Info.isNetwork) outBitStream->Write(m_SpawnerID);
|
else if (m_Spawner != nullptr && m_Spawner->m_Info.isNetwork) outBitStream->Write(m_SpawnerID);
|
||||||
else outBitStream->Write(GeneralUtils::SetBit(m_SpawnerID, OBJECT_BIT_CLIENT));
|
else outBitStream->Write(GeneralUtils::SetBit(m_SpawnerID, static_cast<uint32_t>(eObjectBits::CLIENT)));
|
||||||
} else outBitStream->Write0();
|
} else outBitStream->Write0();
|
||||||
|
|
||||||
outBitStream->Write(m_HasSpawnerNodeID);
|
outBitStream->Write(m_HasSpawnerNodeID);
|
||||||
@ -978,8 +987,8 @@ void Entity::WriteBaseReplicaData(RakNet::BitStream* outBitStream, eReplicaPacke
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Only serialize parent / child info should the info be dirty (changed) or if this is the construction of the entity.
|
// Only serialize parent / child info should the info be dirty (changed) or if this is the construction of the entity.
|
||||||
outBitStream->Write(m_IsParentChildDirty || packetType == PACKET_TYPE_CONSTRUCTION);
|
outBitStream->Write(m_IsParentChildDirty || packetType == eReplicaPacketType::CONSTRUCTION);
|
||||||
if (m_IsParentChildDirty || packetType == PACKET_TYPE_CONSTRUCTION) {
|
if (m_IsParentChildDirty || packetType == eReplicaPacketType::CONSTRUCTION) {
|
||||||
m_IsParentChildDirty = false;
|
m_IsParentChildDirty = false;
|
||||||
outBitStream->Write(m_ParentEntity != nullptr);
|
outBitStream->Write(m_ParentEntity != nullptr);
|
||||||
if (m_ParentEntity) {
|
if (m_ParentEntity) {
|
||||||
@ -1004,7 +1013,7 @@ void Entity::WriteComponents(RakNet::BitStream* outBitStream, eReplicaPacketType
|
|||||||
|
|
||||||
bool destroyableSerialized = false;
|
bool destroyableSerialized = false;
|
||||||
bool bIsInitialUpdate = false;
|
bool bIsInitialUpdate = false;
|
||||||
if (packetType == PACKET_TYPE_CONSTRUCTION) bIsInitialUpdate = true;
|
if (packetType == eReplicaPacketType::CONSTRUCTION) bIsInitialUpdate = true;
|
||||||
unsigned int flags = 0;
|
unsigned int flags = 0;
|
||||||
|
|
||||||
PossessableComponent* possessableComponent;
|
PossessableComponent* possessableComponent;
|
||||||
@ -1233,6 +1242,7 @@ void Entity::Update(const float deltaTime) {
|
|||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
||||||
script->OnTimerDone(this, timerName);
|
script->OnTimerDone(this, timerName);
|
||||||
}
|
}
|
||||||
|
TriggerEvent(eTriggerEventType::TIMER_DONE, this);
|
||||||
} else {
|
} else {
|
||||||
timerPosition++;
|
timerPosition++;
|
||||||
}
|
}
|
||||||
@ -1343,6 +1353,10 @@ void Entity::OnCollisionLeavePhantom(const LWOOBJID otherEntity) {
|
|||||||
auto* other = EntityManager::Instance()->GetEntity(otherEntity);
|
auto* other = EntityManager::Instance()->GetEntity(otherEntity);
|
||||||
if (!other) return;
|
if (!other) return;
|
||||||
|
|
||||||
|
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
||||||
|
script->OnOffCollisionPhantom(this, other);
|
||||||
|
}
|
||||||
|
|
||||||
TriggerEvent(eTriggerEventType::EXIT, other);
|
TriggerEvent(eTriggerEventType::EXIT, other);
|
||||||
|
|
||||||
SwitchComponent* switchComp = GetComponent<SwitchComponent>();
|
SwitchComponent* switchComp = GetComponent<SwitchComponent>();
|
||||||
@ -1479,6 +1493,12 @@ void Entity::OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Entity::RequestActivityExit(Entity* sender, LWOOBJID player, bool canceled) {
|
||||||
|
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
||||||
|
script->OnRequestActivityExit(sender, player, canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Entity::Smash(const LWOOBJID source, const eKillType killType, const std::u16string& deathType) {
|
void Entity::Smash(const LWOOBJID source, const eKillType killType, const std::u16string& deathType) {
|
||||||
if (!m_PlayerIsReadyForUpdates) return;
|
if (!m_PlayerIsReadyForUpdates) return;
|
||||||
|
|
||||||
@ -1619,7 +1639,7 @@ void Entity::PickupItem(const LWOOBJID& objectID) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
inv->AddItem(p.second.lot, p.second.count, eLootSourceType::LOOT_SOURCE_PICKUP, eInventoryType::INVALID, {}, LWOOBJID_EMPTY, true, false, LWOOBJID_EMPTY, eInventoryType::INVALID, 1);
|
inv->AddItem(p.second.lot, p.second.count, eLootSourceType::PICKUP, eInventoryType::INVALID, {}, LWOOBJID_EMPTY, true, false, LWOOBJID_EMPTY, eInventoryType::INVALID, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "NiPoint3.h"
|
#include "NiPoint3.h"
|
||||||
#include "NiQuaternion.h"
|
#include "NiQuaternion.h"
|
||||||
#include "LDFFormat.h"
|
#include "LDFFormat.h"
|
||||||
|
#include "eKillType.h"
|
||||||
|
|
||||||
namespace Loot {
|
namespace Loot {
|
||||||
class Info;
|
class Info;
|
||||||
@ -33,6 +34,8 @@ class EntityCallbackTimer;
|
|||||||
enum class eTriggerEventType;
|
enum class eTriggerEventType;
|
||||||
enum class eGameMasterLevel : uint8_t;
|
enum class eGameMasterLevel : uint8_t;
|
||||||
enum class eReplicaComponentType : uint32_t;
|
enum class eReplicaComponentType : uint32_t;
|
||||||
|
enum class eReplicaPacketType : uint8_t;
|
||||||
|
enum class eCinematicEvent : uint32_t;
|
||||||
|
|
||||||
namespace CppScripts {
|
namespace CppScripts {
|
||||||
class Script;
|
class Script;
|
||||||
@ -204,6 +207,7 @@ public:
|
|||||||
|
|
||||||
void OnMessageBoxResponse(Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData);
|
void OnMessageBoxResponse(Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData);
|
||||||
void OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16string& buttonIdentifier, const std::u16string& identifier);
|
void OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16string& buttonIdentifier, const std::u16string& identifier);
|
||||||
|
void RequestActivityExit(Entity* sender, LWOOBJID player, bool canceled);
|
||||||
|
|
||||||
void Smash(const LWOOBJID source = LWOOBJID_EMPTY, const eKillType killType = eKillType::VIOLENT, const std::u16string& deathType = u"");
|
void Smash(const LWOOBJID source = LWOOBJID_EMPTY, const eKillType killType = eKillType::VIOLENT, const std::u16string& deathType = u"");
|
||||||
void Kill(Entity* murderer = nullptr);
|
void Kill(Entity* murderer = nullptr);
|
||||||
|
@ -20,8 +20,10 @@
|
|||||||
#include "MessageIdentifiers.h"
|
#include "MessageIdentifiers.h"
|
||||||
#include "dConfig.h"
|
#include "dConfig.h"
|
||||||
#include "eTriggerEventType.h"
|
#include "eTriggerEventType.h"
|
||||||
|
#include "eObjectBits.h"
|
||||||
#include "eGameMasterLevel.h"
|
#include "eGameMasterLevel.h"
|
||||||
#include "eReplicaComponentType.h"
|
#include "eReplicaComponentType.h"
|
||||||
|
#include "eReplicaPacketType.h"
|
||||||
|
|
||||||
EntityManager* EntityManager::m_Address = nullptr;
|
EntityManager* EntityManager::m_Address = nullptr;
|
||||||
|
|
||||||
@ -108,11 +110,11 @@ Entity* EntityManager::CreateEntity(EntityInfo info, User* user, Entity* parentE
|
|||||||
if (!controller && info.lot != 14) {
|
if (!controller && info.lot != 14) {
|
||||||
|
|
||||||
// The client flags means the client should render the entity
|
// The client flags means the client should render the entity
|
||||||
id = GeneralUtils::SetBit(id, OBJECT_BIT_CLIENT);
|
GeneralUtils::SetBit(id, eObjectBits::CLIENT);
|
||||||
|
|
||||||
// Spawned entities require the spawned flag to render
|
// Spawned entities require the spawned flag to render
|
||||||
if (info.spawnerID != 0) {
|
if (info.spawnerID != 0) {
|
||||||
id = GeneralUtils::SetBit(id, OBJECT_BIT_SPAWNED);
|
GeneralUtils::SetBit(id, eObjectBits::SPAWNED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -159,9 +161,7 @@ void EntityManager::DestroyEntity(const LWOOBJID& objectID) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EntityManager::DestroyEntity(Entity* entity) {
|
void EntityManager::DestroyEntity(Entity* entity) {
|
||||||
if (entity == nullptr) {
|
if (!entity) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
entity->TriggerEvent(eTriggerEventType::DESTROY, entity);
|
entity->TriggerEvent(eTriggerEventType::DESTROY, entity);
|
||||||
|
|
||||||
@ -180,15 +180,11 @@ void EntityManager::DestroyEntity(Entity* entity) {
|
|||||||
ScheduleForDeletion(id);
|
ScheduleForDeletion(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityManager::UpdateEntities(const float deltaTime) {
|
void EntityManager::SerializeEntities() {
|
||||||
for (const auto& e : m_Entities) {
|
|
||||||
e.second->Update(deltaTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto entry = m_EntitiesToSerialize.begin(); entry != m_EntitiesToSerialize.end(); entry++) {
|
for (auto entry = m_EntitiesToSerialize.begin(); entry != m_EntitiesToSerialize.end(); entry++) {
|
||||||
auto* entity = GetEntity(*entry);
|
auto* entity = GetEntity(*entry);
|
||||||
|
|
||||||
if (entity == nullptr) continue;
|
if (!entity) continue;
|
||||||
|
|
||||||
m_SerializationCounter++;
|
m_SerializationCounter++;
|
||||||
|
|
||||||
@ -196,8 +192,8 @@ void EntityManager::UpdateEntities(const float deltaTime) {
|
|||||||
stream.Write(static_cast<char>(ID_REPLICA_MANAGER_SERIALIZE));
|
stream.Write(static_cast<char>(ID_REPLICA_MANAGER_SERIALIZE));
|
||||||
stream.Write(static_cast<unsigned short>(entity->GetNetworkId()));
|
stream.Write(static_cast<unsigned short>(entity->GetNetworkId()));
|
||||||
|
|
||||||
entity->WriteBaseReplicaData(&stream, PACKET_TYPE_SERIALIZATION);
|
entity->WriteBaseReplicaData(&stream, eReplicaPacketType::SERIALIZATION);
|
||||||
entity->WriteComponents(&stream, PACKET_TYPE_SERIALIZATION);
|
entity->WriteComponents(&stream, eReplicaPacketType::SERIALIZATION);
|
||||||
|
|
||||||
if (entity->GetIsGhostingCandidate()) {
|
if (entity->GetIsGhostingCandidate()) {
|
||||||
for (auto* player : Player::GetAllPlayers()) {
|
for (auto* player : Player::GetAllPlayers()) {
|
||||||
@ -210,45 +206,59 @@ void EntityManager::UpdateEntities(const float deltaTime) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_EntitiesToSerialize.clear();
|
m_EntitiesToSerialize.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityManager::KillEntities() {
|
||||||
for (auto entry = m_EntitiesToKill.begin(); entry != m_EntitiesToKill.end(); entry++) {
|
for (auto entry = m_EntitiesToKill.begin(); entry != m_EntitiesToKill.end(); entry++) {
|
||||||
auto* entity = GetEntity(*entry);
|
auto* entity = GetEntity(*entry);
|
||||||
|
|
||||||
if (!entity) continue;
|
if (!entity) {
|
||||||
|
Game::logger->Log("EntityManager", "Attempting to kill null entity %llu", *entry);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (entity->GetScheduledKiller()) {
|
if (entity->GetScheduledKiller()) {
|
||||||
entity->Smash(entity->GetScheduledKiller()->GetObjectID(), SILENT);
|
entity->Smash(entity->GetScheduledKiller()->GetObjectID(), eKillType::SILENT);
|
||||||
} else {
|
} else {
|
||||||
entity->Smash(LWOOBJID_EMPTY, SILENT);
|
entity->Smash(LWOOBJID_EMPTY, eKillType::SILENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_EntitiesToKill.clear();
|
m_EntitiesToKill.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityManager::DeleteEntities() {
|
||||||
for (auto entry = m_EntitiesToDelete.begin(); entry != m_EntitiesToDelete.end(); entry++) {
|
for (auto entry = m_EntitiesToDelete.begin(); entry != m_EntitiesToDelete.end(); entry++) {
|
||||||
|
|
||||||
// Get all this info first before we delete the player.
|
|
||||||
auto entityToDelete = GetEntity(*entry);
|
auto entityToDelete = GetEntity(*entry);
|
||||||
auto networkIdToErase = entityToDelete->GetNetworkId();
|
|
||||||
const auto& ghostingToDelete = std::find(m_EntitiesToGhost.begin(), m_EntitiesToGhost.end(), entityToDelete);
|
|
||||||
|
|
||||||
if (entityToDelete) {
|
if (entityToDelete) {
|
||||||
// If we are a player run through the player destructor.
|
// Get all this info first before we delete the player.
|
||||||
if (entityToDelete->IsPlayer()) {
|
auto networkIdToErase = entityToDelete->GetNetworkId();
|
||||||
delete dynamic_cast<Player*>(entityToDelete);
|
const auto& ghostingToDelete = std::find(m_EntitiesToGhost.begin(), m_EntitiesToGhost.end(), entityToDelete);
|
||||||
} else {
|
|
||||||
delete entityToDelete;
|
delete entityToDelete;
|
||||||
}
|
|
||||||
entityToDelete = nullptr;
|
entityToDelete = nullptr;
|
||||||
|
|
||||||
if (networkIdToErase != 0) m_LostNetworkIds.push(networkIdToErase);
|
if (networkIdToErase != 0) m_LostNetworkIds.push(networkIdToErase);
|
||||||
|
|
||||||
|
if (ghostingToDelete != m_EntitiesToGhost.end()) m_EntitiesToGhost.erase(ghostingToDelete);
|
||||||
|
} else {
|
||||||
|
Game::logger->Log("EntityManager", "Attempted to delete non-existent entity %llu", *entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ghostingToDelete != m_EntitiesToGhost.end()) m_EntitiesToGhost.erase(ghostingToDelete);
|
|
||||||
|
|
||||||
m_Entities.erase(*entry);
|
m_Entities.erase(*entry);
|
||||||
}
|
}
|
||||||
m_EntitiesToDelete.clear();
|
m_EntitiesToDelete.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EntityManager::UpdateEntities(const float deltaTime) {
|
||||||
|
for (const auto& e : m_Entities) {
|
||||||
|
e.second->Update(deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
SerializeEntities();
|
||||||
|
KillEntities();
|
||||||
|
DeleteEntities();
|
||||||
|
}
|
||||||
|
|
||||||
Entity* EntityManager::GetEntity(const LWOOBJID& objectId) const {
|
Entity* EntityManager::GetEntity(const LWOOBJID& objectId) const {
|
||||||
const auto& index = m_Entities.find(objectId);
|
const auto& index = m_Entities.find(objectId);
|
||||||
|
|
||||||
@ -314,6 +324,11 @@ const std::unordered_map<std::string, LWOOBJID>& EntityManager::GetSpawnPointEnt
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EntityManager::ConstructEntity(Entity* entity, const SystemAddress& sysAddr, const bool skipChecks) {
|
void EntityManager::ConstructEntity(Entity* entity, const SystemAddress& sysAddr, const bool skipChecks) {
|
||||||
|
if (!entity) {
|
||||||
|
Game::logger->Log("EntityManager", "Attempted to construct null entity");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (entity->GetNetworkId() == 0) {
|
if (entity->GetNetworkId() == 0) {
|
||||||
uint16_t networkId;
|
uint16_t networkId;
|
||||||
|
|
||||||
@ -351,8 +366,8 @@ void EntityManager::ConstructEntity(Entity* entity, const SystemAddress& sysAddr
|
|||||||
stream.Write(true);
|
stream.Write(true);
|
||||||
stream.Write(static_cast<unsigned short>(entity->GetNetworkId()));
|
stream.Write(static_cast<unsigned short>(entity->GetNetworkId()));
|
||||||
|
|
||||||
entity->WriteBaseReplicaData(&stream, PACKET_TYPE_CONSTRUCTION);
|
entity->WriteBaseReplicaData(&stream, eReplicaPacketType::CONSTRUCTION);
|
||||||
entity->WriteComponents(&stream, PACKET_TYPE_CONSTRUCTION);
|
entity->WriteComponents(&stream, eReplicaPacketType::CONSTRUCTION);
|
||||||
|
|
||||||
if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) {
|
if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) {
|
||||||
if (skipChecks) {
|
if (skipChecks) {
|
||||||
@ -393,9 +408,7 @@ void EntityManager::ConstructAllEntities(const SystemAddress& sysAddr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EntityManager::DestructEntity(Entity* entity, const SystemAddress& sysAddr) {
|
void EntityManager::DestructEntity(Entity* entity, const SystemAddress& sysAddr) {
|
||||||
if (entity->GetNetworkId() == 0) {
|
if (!entity || entity->GetNetworkId() == 0) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
RakNet::BitStream stream;
|
RakNet::BitStream stream;
|
||||||
|
|
||||||
@ -412,9 +425,7 @@ void EntityManager::DestructEntity(Entity* entity, const SystemAddress& sysAddr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EntityManager::SerializeEntity(Entity* entity) {
|
void EntityManager::SerializeEntity(Entity* entity) {
|
||||||
if (entity->GetNetworkId() == 0) {
|
if (!entity || entity->GetNetworkId() == 0) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (std::find(m_EntitiesToSerialize.begin(), m_EntitiesToSerialize.end(), entity->GetObjectID()) == m_EntitiesToSerialize.end()) {
|
if (std::find(m_EntitiesToSerialize.begin(), m_EntitiesToSerialize.end(), entity->GetObjectID()) == m_EntitiesToSerialize.end()) {
|
||||||
m_EntitiesToSerialize.push_back(entity->GetObjectID());
|
m_EntitiesToSerialize.push_back(entity->GetObjectID());
|
||||||
|
@ -85,6 +85,10 @@ public:
|
|||||||
const uint32_t GetHardcoreUscoreEnemiesMultiplier() { return m_HardcoreUscoreEnemiesMultiplier; };
|
const uint32_t GetHardcoreUscoreEnemiesMultiplier() { return m_HardcoreUscoreEnemiesMultiplier; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void SerializeEntities();
|
||||||
|
void KillEntities();
|
||||||
|
void DeleteEntities();
|
||||||
|
|
||||||
static EntityManager* m_Address; //For singleton method
|
static EntityManager* m_Address; //For singleton method
|
||||||
static std::vector<LWOMAPID> m_GhostingExcludedZones;
|
static std::vector<LWOMAPID> m_GhostingExcludedZones;
|
||||||
static std::vector<LOT> m_GhostingExcludedLOTs;
|
static std::vector<LOT> m_GhostingExcludedLOTs;
|
||||||
|
@ -156,21 +156,21 @@ void Trade::Complete() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Now actually do the trade.
|
// Now actually do the trade.
|
||||||
characterA->SetCoins(characterA->GetCoins() - m_CoinsA + m_CoinsB, eLootSourceType::LOOT_SOURCE_TRADE);
|
characterA->SetCoins(characterA->GetCoins() - m_CoinsA + m_CoinsB, eLootSourceType::TRADE);
|
||||||
characterB->SetCoins(characterB->GetCoins() - m_CoinsB + m_CoinsA, eLootSourceType::LOOT_SOURCE_TRADE);
|
characterB->SetCoins(characterB->GetCoins() - m_CoinsB + m_CoinsA, eLootSourceType::TRADE);
|
||||||
|
|
||||||
for (const auto& tradeItem : m_ItemsA) {
|
for (const auto& tradeItem : m_ItemsA) {
|
||||||
auto* itemToRemove = inventoryA->FindItemById(tradeItem.itemId);
|
auto* itemToRemove = inventoryA->FindItemById(tradeItem.itemId);
|
||||||
if (itemToRemove) itemToRemove->SetCount(itemToRemove->GetCount() - tradeItem.itemCount);
|
if (itemToRemove) itemToRemove->SetCount(itemToRemove->GetCount() - tradeItem.itemCount);
|
||||||
missionsA->Progress(eMissionTaskType::GATHER, tradeItem.itemLot, LWOOBJID_EMPTY, "", -tradeItem.itemCount);
|
missionsA->Progress(eMissionTaskType::GATHER, tradeItem.itemLot, LWOOBJID_EMPTY, "", -tradeItem.itemCount);
|
||||||
inventoryB->AddItem(tradeItem.itemLot, tradeItem.itemCount, eLootSourceType::LOOT_SOURCE_TRADE);
|
inventoryB->AddItem(tradeItem.itemLot, tradeItem.itemCount, eLootSourceType::TRADE);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& tradeItem : m_ItemsB) {
|
for (const auto& tradeItem : m_ItemsB) {
|
||||||
auto* itemToRemove = inventoryB->FindItemById(tradeItem.itemId);
|
auto* itemToRemove = inventoryB->FindItemById(tradeItem.itemId);
|
||||||
if (itemToRemove) itemToRemove->SetCount(itemToRemove->GetCount() - tradeItem.itemCount);
|
if (itemToRemove) itemToRemove->SetCount(itemToRemove->GetCount() - tradeItem.itemCount);
|
||||||
missionsB->Progress(eMissionTaskType::GATHER, tradeItem.itemLot, LWOOBJID_EMPTY, "", -tradeItem.itemCount);
|
missionsB->Progress(eMissionTaskType::GATHER, tradeItem.itemLot, LWOOBJID_EMPTY, "", -tradeItem.itemCount);
|
||||||
inventoryA->AddItem(tradeItem.itemLot, tradeItem.itemCount, eLootSourceType::LOOT_SOURCE_TRADE);
|
inventoryA->AddItem(tradeItem.itemLot, tradeItem.itemCount, eLootSourceType::TRADE);
|
||||||
}
|
}
|
||||||
|
|
||||||
characterA->SaveXMLToDatabase();
|
characterA->SaveXMLToDatabase();
|
||||||
|
@ -22,8 +22,12 @@
|
|||||||
#include "SkillComponent.h"
|
#include "SkillComponent.h"
|
||||||
#include "AssetManager.h"
|
#include "AssetManager.h"
|
||||||
#include "CDClientDatabase.h"
|
#include "CDClientDatabase.h"
|
||||||
#include "dMessageIdentifiers.h"
|
#include "eObjectBits.h"
|
||||||
#include "eGameMasterLevel.h"
|
#include "eGameMasterLevel.h"
|
||||||
|
#include "eCharacterCreationResponse.h"
|
||||||
|
#include "eRenameResponse.h"
|
||||||
|
#include "eConnectionType.h"
|
||||||
|
#include "eChatInternalMessageType.h"
|
||||||
|
|
||||||
UserManager* UserManager::m_Address = nullptr;
|
UserManager* UserManager::m_Address = nullptr;
|
||||||
|
|
||||||
@ -268,13 +272,13 @@ void UserManager::CreateCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
|
|
||||||
if (name != "" && !UserManager::IsNameAvailable(name)) {
|
if (name != "" && !UserManager::IsNameAvailable(name)) {
|
||||||
Game::logger->Log("UserManager", "AccountID: %i chose unavailable name: %s", u->GetAccountID(), name.c_str());
|
Game::logger->Log("UserManager", "AccountID: %i chose unavailable name: %s", u->GetAccountID(), name.c_str());
|
||||||
WorldPackets::SendCharacterCreationResponse(sysAddr, CREATION_RESPONSE_CUSTOM_NAME_IN_USE);
|
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::CUSTOM_NAME_IN_USE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsNameAvailable(predefinedName)) {
|
if (!IsNameAvailable(predefinedName)) {
|
||||||
Game::logger->Log("UserManager", "AccountID: %i chose unavailable predefined name: %s", u->GetAccountID(), predefinedName.c_str());
|
Game::logger->Log("UserManager", "AccountID: %i chose unavailable predefined name: %s", u->GetAccountID(), predefinedName.c_str());
|
||||||
WorldPackets::SendCharacterCreationResponse(sysAddr, CREATION_RESPONSE_PREDEFINED_NAME_IN_USE);
|
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::PREDEFINED_NAME_IN_USE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,7 +297,7 @@ void UserManager::CreateCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
|
|
||||||
if (overlapResult->next()) {
|
if (overlapResult->next()) {
|
||||||
Game::logger->Log("UserManager", "Character object id unavailable, check objectidtracker!");
|
Game::logger->Log("UserManager", "Character object id unavailable, check objectidtracker!");
|
||||||
WorldPackets::SendCharacterCreationResponse(sysAddr, CREATION_RESPONSE_OBJECT_ID_UNAVAILABLE);
|
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::OBJECT_ID_UNAVAILABLE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -313,16 +317,16 @@ void UserManager::CreateCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
std::stringstream xml2;
|
std::stringstream xml2;
|
||||||
|
|
||||||
LWOOBJID lwoidforshirt = idforshirt;
|
LWOOBJID lwoidforshirt = idforshirt;
|
||||||
lwoidforshirt = GeneralUtils::SetBit(lwoidforshirt, OBJECT_BIT_CHARACTER);
|
GeneralUtils::SetBit(lwoidforshirt, eObjectBits::CHARACTER);
|
||||||
lwoidforshirt = GeneralUtils::SetBit(lwoidforshirt, OBJECT_BIT_PERSISTENT);
|
GeneralUtils::SetBit(lwoidforshirt, eObjectBits::PERSISTENT);
|
||||||
xml2 << xmlSave1 << "<i l=\"" << shirtLOT << "\" id=\"" << lwoidforshirt << "\" s=\"0\" c=\"1\" eq=\"1\" b=\"1\"/>";
|
xml2 << xmlSave1 << "<i l=\"" << shirtLOT << "\" id=\"" << lwoidforshirt << "\" s=\"0\" c=\"1\" eq=\"1\" b=\"1\"/>";
|
||||||
|
|
||||||
std::string xmlSave2 = xml2.str();
|
std::string xmlSave2 = xml2.str();
|
||||||
|
|
||||||
ObjectIDManager::Instance()->RequestPersistentID([=](uint32_t idforpants) {
|
ObjectIDManager::Instance()->RequestPersistentID([=](uint32_t idforpants) {
|
||||||
LWOOBJID lwoidforpants = idforpants;
|
LWOOBJID lwoidforpants = idforpants;
|
||||||
lwoidforpants = GeneralUtils::SetBit(lwoidforpants, OBJECT_BIT_CHARACTER);
|
GeneralUtils::SetBit(lwoidforpants, eObjectBits::CHARACTER);
|
||||||
lwoidforpants = GeneralUtils::SetBit(lwoidforpants, OBJECT_BIT_PERSISTENT);
|
GeneralUtils::SetBit(lwoidforpants, eObjectBits::PERSISTENT);
|
||||||
|
|
||||||
std::stringstream xml3;
|
std::stringstream xml3;
|
||||||
xml3 << xmlSave2 << "<i l=\"" << pantsLOT << "\" id=\"" << lwoidforpants << "\" s=\"1\" c=\"1\" eq=\"1\" b=\"1\"/>";
|
xml3 << xmlSave2 << "<i l=\"" << pantsLOT << "\" id=\"" << lwoidforpants << "\" s=\"1\" c=\"1\" eq=\"1\" b=\"1\"/>";
|
||||||
@ -369,7 +373,7 @@ void UserManager::CreateCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
stmt->execute();
|
stmt->execute();
|
||||||
delete stmt;
|
delete stmt;
|
||||||
|
|
||||||
WorldPackets::SendCharacterCreationResponse(sysAddr, CREATION_RESPONSE_SUCCESS);
|
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::SUCCESS);
|
||||||
UserManager::RequestCharacterList(sysAddr);
|
UserManager::RequestCharacterList(sysAddr);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -419,7 +423,7 @@ void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
stmt->execute();
|
stmt->execute();
|
||||||
delete stmt;
|
delete stmt;
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION);
|
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION);
|
||||||
bitStream.Write(objectID);
|
bitStream.Write(objectID);
|
||||||
Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
|
Game::chatServer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE, 0, Game::chatSysAddr, false);
|
||||||
}
|
}
|
||||||
@ -480,8 +484,8 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LWOOBJID objectID = PacketUtils::ReadPacketS64(8, packet);
|
LWOOBJID objectID = PacketUtils::ReadPacketS64(8, packet);
|
||||||
objectID = GeneralUtils::ClearBit(objectID, OBJECT_BIT_CHARACTER);
|
GeneralUtils::ClearBit(objectID, eObjectBits::CHARACTER);
|
||||||
objectID = GeneralUtils::ClearBit(objectID, OBJECT_BIT_PERSISTENT);
|
GeneralUtils::ClearBit(objectID, eObjectBits::PERSISTENT);
|
||||||
|
|
||||||
uint32_t charID = static_cast<uint32_t>(objectID);
|
uint32_t charID = static_cast<uint32_t>(objectID);
|
||||||
Game::logger->Log("UserManager", "Received char rename request for ID: %llu (%u)", objectID, charID);
|
Game::logger->Log("UserManager", "Received char rename request for ID: %llu (%u)", objectID, charID);
|
||||||
@ -499,10 +503,10 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
|
|
||||||
if (!hasCharacter || !character) {
|
if (!hasCharacter || !character) {
|
||||||
Game::logger->Log("UserManager", "User %i tried to rename a character that it does not own!", u->GetAccountID());
|
Game::logger->Log("UserManager", "User %i tried to rename a character that it does not own!", u->GetAccountID());
|
||||||
WorldPackets::SendCharacterRenameResponse(sysAddr, RENAME_RESPONSE_UNKNOWN_ERROR);
|
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::UNKNOWN_ERROR);
|
||||||
} else if (hasCharacter && character) {
|
} else if (hasCharacter && character) {
|
||||||
if (newName == character->GetName()) {
|
if (newName == character->GetName()) {
|
||||||
WorldPackets::SendCharacterRenameResponse(sysAddr, RENAME_RESPONSE_NAME_UNAVAILABLE);
|
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::NAME_UNAVAILABLE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -516,7 +520,7 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
delete stmt;
|
delete stmt;
|
||||||
|
|
||||||
Game::logger->Log("UserManager", "Character %s now known as %s", character->GetName().c_str(), newName.c_str());
|
Game::logger->Log("UserManager", "Character %s now known as %s", character->GetName().c_str(), newName.c_str());
|
||||||
WorldPackets::SendCharacterRenameResponse(sysAddr, RENAME_RESPONSE_SUCCESS);
|
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::SUCCESS);
|
||||||
UserManager::RequestCharacterList(sysAddr);
|
UserManager::RequestCharacterList(sysAddr);
|
||||||
} else {
|
} else {
|
||||||
sql::PreparedStatement* stmt = Database::CreatePreppedStmt("UPDATE charinfo SET pending_name=?, needs_rename=0, last_login=? WHERE id=? LIMIT 1");
|
sql::PreparedStatement* stmt = Database::CreatePreppedStmt("UPDATE charinfo SET pending_name=?, needs_rename=0, last_login=? WHERE id=? LIMIT 1");
|
||||||
@ -527,15 +531,15 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
delete stmt;
|
delete stmt;
|
||||||
|
|
||||||
Game::logger->Log("UserManager", "Character %s has been renamed to %s and is pending approval by a moderator.", character->GetName().c_str(), newName.c_str());
|
Game::logger->Log("UserManager", "Character %s has been renamed to %s and is pending approval by a moderator.", character->GetName().c_str(), newName.c_str());
|
||||||
WorldPackets::SendCharacterRenameResponse(sysAddr, RENAME_RESPONSE_SUCCESS);
|
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::SUCCESS);
|
||||||
UserManager::RequestCharacterList(sysAddr);
|
UserManager::RequestCharacterList(sysAddr);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
WorldPackets::SendCharacterRenameResponse(sysAddr, RENAME_RESPONSE_NAME_IN_USE);
|
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::NAME_IN_USE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Game::logger->Log("UserManager", "Unknown error occurred when renaming character, either hasCharacter or character variable != true.");
|
Game::logger->Log("UserManager", "Unknown error occurred when renaming character, either hasCharacter or character variable != true.");
|
||||||
WorldPackets::SendCharacterRenameResponse(sysAddr, RENAME_RESPONSE_UNKNOWN_ERROR);
|
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::UNKNOWN_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ void AirMovementBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bi
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
context->RegisterSyncBehavior(handle, this, branch);
|
context->RegisterSyncBehavior(handle, this, branch, this->m_Timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AirMovementBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void AirMovementBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
||||||
@ -47,4 +47,5 @@ void AirMovementBehavior::Sync(BehaviorContext* context, RakNet::BitStream* bitS
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AirMovementBehavior::Load() {
|
void AirMovementBehavior::Load() {
|
||||||
|
this->m_Timeout = (GetFloat("timeout_ms") / 1000.0f);
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,7 @@
|
|||||||
class AirMovementBehavior final : public Behavior
|
class AirMovementBehavior final : public Behavior
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
explicit AirMovementBehavior(const uint32_t behavior_id) : Behavior(behavior_id) {}
|
||||||
/*
|
|
||||||
* Inherited
|
|
||||||
*/
|
|
||||||
|
|
||||||
explicit AirMovementBehavior(const uint32_t behavior_id) : Behavior(behavior_id) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
@ -19,4 +13,6 @@ public:
|
|||||||
void Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Load() override;
|
void Load() override;
|
||||||
|
private:
|
||||||
|
float m_Timeout;
|
||||||
};
|
};
|
||||||
|
@ -13,7 +13,7 @@ void AttackDelayBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bi
|
|||||||
};
|
};
|
||||||
|
|
||||||
for (auto i = 0u; i < this->m_numIntervals; ++i) {
|
for (auto i = 0u; i < this->m_numIntervals; ++i) {
|
||||||
context->RegisterSyncBehavior(handle, this, branch, m_ignoreInterrupts);
|
context->RegisterSyncBehavior(handle, this, branch, this->m_delay * i, m_ignoreInterrupts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ void BasicAttackBehavior::Calculate(BehaviorContext* context, RakNet::BitStream*
|
|||||||
DoBehaviorCalculation(context, bitStream, branch);
|
DoBehaviorCalculation(context, bitStream, branch);
|
||||||
|
|
||||||
const auto endAddress = bitStream->GetWriteOffset();
|
const auto endAddress = bitStream->GetWriteOffset();
|
||||||
const uint16_t allocate = endAddress - startAddress + 1;
|
const uint16_t allocate = endAddress - startAddress;
|
||||||
|
|
||||||
bitStream->SetWriteOffset(allocatedAddress);
|
bitStream->SetWriteOffset(allocatedAddress);
|
||||||
bitStream->Write(allocate);
|
bitStream->Write(allocate);
|
||||||
|
@ -61,6 +61,7 @@
|
|||||||
#include "SpeedBehavior.h"
|
#include "SpeedBehavior.h"
|
||||||
#include "DamageReductionBehavior.h"
|
#include "DamageReductionBehavior.h"
|
||||||
#include "JetPackBehavior.h"
|
#include "JetPackBehavior.h"
|
||||||
|
#include "FallSpeedBehavior.h"
|
||||||
#include "ChangeIdleFlagsBehavior.h"
|
#include "ChangeIdleFlagsBehavior.h"
|
||||||
#include "DarkInspirationBehavior.h"
|
#include "DarkInspirationBehavior.h"
|
||||||
|
|
||||||
@ -164,7 +165,9 @@ Behavior* Behavior::CreateBehavior(const uint32_t behaviorId) {
|
|||||||
case BehaviorTemplates::BEHAVIOR_CAR_BOOST:
|
case BehaviorTemplates::BEHAVIOR_CAR_BOOST:
|
||||||
behavior = new CarBoostBehavior(behaviorId);
|
behavior = new CarBoostBehavior(behaviorId);
|
||||||
break;
|
break;
|
||||||
case BehaviorTemplates::BEHAVIOR_FALL_SPEED: break;
|
case BehaviorTemplates::BEHAVIOR_FALL_SPEED:
|
||||||
|
behavior = new FallSpeedBehavior(behaviorId);
|
||||||
|
break;
|
||||||
case BehaviorTemplates::BEHAVIOR_SHIELD: break;
|
case BehaviorTemplates::BEHAVIOR_SHIELD: break;
|
||||||
case BehaviorTemplates::BEHAVIOR_REPAIR_ARMOR:
|
case BehaviorTemplates::BEHAVIOR_REPAIR_ARMOR:
|
||||||
behavior = new RepairBehavior(behaviorId);
|
behavior = new RepairBehavior(behaviorId);
|
||||||
|
@ -10,12 +10,12 @@
|
|||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include "dMessageIdentifiers.h"
|
|
||||||
#include "DestroyableComponent.h"
|
#include "DestroyableComponent.h"
|
||||||
#include "EchoSyncSkill.h"
|
#include "EchoSyncSkill.h"
|
||||||
#include "PhantomPhysicsComponent.h"
|
#include "PhantomPhysicsComponent.h"
|
||||||
#include "RebuildComponent.h"
|
#include "RebuildComponent.h"
|
||||||
#include "eReplicaComponentType.h"
|
#include "eReplicaComponentType.h"
|
||||||
|
#include "eConnectionType.h"
|
||||||
|
|
||||||
BehaviorSyncEntry::BehaviorSyncEntry() {
|
BehaviorSyncEntry::BehaviorSyncEntry() {
|
||||||
}
|
}
|
||||||
@ -47,7 +47,7 @@ uint32_t BehaviorContext::GetUniqueSkillId() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void BehaviorContext::RegisterSyncBehavior(const uint32_t syncId, Behavior* behavior, const BehaviorBranchContext& branchContext, bool ignoreInterrupts) {
|
void BehaviorContext::RegisterSyncBehavior(const uint32_t syncId, Behavior* behavior, const BehaviorBranchContext& branchContext, const float duration, bool ignoreInterrupts) {
|
||||||
auto entry = BehaviorSyncEntry();
|
auto entry = BehaviorSyncEntry();
|
||||||
|
|
||||||
entry.handle = syncId;
|
entry.handle = syncId;
|
||||||
@ -55,6 +55,9 @@ void BehaviorContext::RegisterSyncBehavior(const uint32_t syncId, Behavior* beha
|
|||||||
entry.branchContext = branchContext;
|
entry.branchContext = branchContext;
|
||||||
entry.branchContext.isSync = true;
|
entry.branchContext.isSync = true;
|
||||||
entry.ignoreInterrupts = ignoreInterrupts;
|
entry.ignoreInterrupts = ignoreInterrupts;
|
||||||
|
// Add 10 seconds + duration time to account for lag and give clients time to send their syncs to the server.
|
||||||
|
constexpr float lagTime = 10.0f;
|
||||||
|
entry.time = lagTime + duration;
|
||||||
|
|
||||||
this->syncEntries.push_back(entry);
|
this->syncEntries.push_back(entry);
|
||||||
}
|
}
|
||||||
@ -183,6 +186,21 @@ void BehaviorContext::SyncCalculation(const uint32_t syncId, const float time, B
|
|||||||
this->syncEntries.push_back(entry);
|
this->syncEntries.push_back(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BehaviorContext::UpdatePlayerSyncs(float deltaTime) {
|
||||||
|
uint32_t i = 0;
|
||||||
|
while (i < this->syncEntries.size()) {
|
||||||
|
auto& entry = this->syncEntries.at(i);
|
||||||
|
|
||||||
|
entry.time -= deltaTime;
|
||||||
|
|
||||||
|
if (entry.time >= 0.0f) {
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
this->syncEntries.erase(this->syncEntries.begin() + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void BehaviorContext::InvokeEnd(const uint32_t id) {
|
void BehaviorContext::InvokeEnd(const uint32_t id) {
|
||||||
std::vector<BehaviorEndEntry> entries;
|
std::vector<BehaviorEndEntry> entries;
|
||||||
|
|
||||||
@ -235,7 +253,7 @@ bool BehaviorContext::CalculateUpdate(const float deltaTime) {
|
|||||||
// Write message
|
// Write message
|
||||||
RakNet::BitStream message;
|
RakNet::BitStream message;
|
||||||
|
|
||||||
PacketUtils::WriteHeader(message, CLIENT, MSG_CLIENT_GAME_MSG);
|
PacketUtils::WriteHeader(message, eConnectionType::CLIENT, eClientMessageType::GAME_MSG);
|
||||||
message.Write(this->originator);
|
message.Write(this->originator);
|
||||||
echo.Serialize(&message);
|
echo.Serialize(&message);
|
||||||
|
|
||||||
|
@ -80,7 +80,9 @@ struct BehaviorContext
|
|||||||
|
|
||||||
uint32_t GetUniqueSkillId() const;
|
uint32_t GetUniqueSkillId() const;
|
||||||
|
|
||||||
void RegisterSyncBehavior(uint32_t syncId, Behavior* behavior, const BehaviorBranchContext& branchContext, bool ignoreInterrupts = false);
|
void UpdatePlayerSyncs(float deltaTime);
|
||||||
|
|
||||||
|
void RegisterSyncBehavior(uint32_t syncId, Behavior* behavior, const BehaviorBranchContext& branchContext, const float duration, bool ignoreInterrupts = false);
|
||||||
|
|
||||||
void RegisterTimerBehavior(Behavior* behavior, const BehaviorBranchContext& branchContext, LWOOBJID second = LWOOBJID_EMPTY);
|
void RegisterTimerBehavior(Behavior* behavior, const BehaviorBranchContext& branchContext, LWOOBJID second = LWOOBJID_EMPTY);
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ set(DGAME_DBEHAVIORS_SOURCES "AirMovementBehavior.cpp"
|
|||||||
"DurationBehavior.cpp"
|
"DurationBehavior.cpp"
|
||||||
"EmptyBehavior.cpp"
|
"EmptyBehavior.cpp"
|
||||||
"EndBehavior.cpp"
|
"EndBehavior.cpp"
|
||||||
|
"FallSpeedBehavior.cpp"
|
||||||
"ForceMovementBehavior.cpp"
|
"ForceMovementBehavior.cpp"
|
||||||
"HealBehavior.cpp"
|
"HealBehavior.cpp"
|
||||||
"ImaginationBehavior.cpp"
|
"ImaginationBehavior.cpp"
|
||||||
|
@ -2,43 +2,35 @@
|
|||||||
#include "BehaviorBranchContext.h"
|
#include "BehaviorBranchContext.h"
|
||||||
#include "BehaviorContext.h"
|
#include "BehaviorContext.h"
|
||||||
#include "EntityManager.h"
|
#include "EntityManager.h"
|
||||||
#include "BaseCombatAIComponent.h"
|
|
||||||
|
|
||||||
void ChangeOrientationBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChangeOrientationBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void ChangeOrientationBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
||||||
if (!m_ToTarget) return; // TODO: Add the other arguments to this behavior
|
Entity* sourceEntity;
|
||||||
|
if (this->m_orientCaster) sourceEntity = EntityManager::Instance()->GetEntity(context->originator);
|
||||||
|
else sourceEntity = EntityManager::Instance()->GetEntity(branch.target);
|
||||||
|
if (!sourceEntity) return;
|
||||||
|
|
||||||
auto* self = EntityManager::Instance()->GetEntity(context->originator);
|
if (this->m_toTarget) {
|
||||||
auto* other = EntityManager::Instance()->GetEntity(branch.target);
|
Entity* destinationEntity;
|
||||||
|
if (this->m_orientCaster) destinationEntity = EntityManager::Instance()->GetEntity(branch.target);
|
||||||
|
else destinationEntity = EntityManager::Instance()->GetEntity(context->originator);
|
||||||
|
if (!destinationEntity) return;
|
||||||
|
|
||||||
if (self == nullptr || other == nullptr) return;
|
sourceEntity->SetRotation(
|
||||||
|
NiQuaternion::LookAt(sourceEntity->GetPosition(), destinationEntity->GetPosition())
|
||||||
const auto source = self->GetPosition();
|
);
|
||||||
const auto destination = self->GetPosition();
|
} else if (this->m_toAngle){
|
||||||
|
auto baseAngle = NiPoint3(0, 0, this->m_angle);
|
||||||
if (m_OrientCaster) {
|
if (this->m_relative) baseAngle += sourceEntity->GetRotation().GetForwardVector();
|
||||||
auto* baseCombatAIComponent = self->GetComponent<BaseCombatAIComponent>();
|
sourceEntity->SetRotation(NiQuaternion::FromEulerAngles(baseAngle));
|
||||||
|
} else return;
|
||||||
/*if (baseCombatAIComponent != nullptr)
|
EntityManager::Instance()->SerializeEntity(sourceEntity);
|
||||||
{
|
return;
|
||||||
baseCombatAIComponent->LookAt(destination);
|
|
||||||
}
|
|
||||||
else*/
|
|
||||||
{
|
|
||||||
self->SetRotation(NiQuaternion::LookAt(source, destination));
|
|
||||||
}
|
|
||||||
|
|
||||||
EntityManager::Instance()->SerializeEntity(self);
|
|
||||||
} else {
|
|
||||||
other->SetRotation(NiQuaternion::LookAt(destination, source));
|
|
||||||
|
|
||||||
EntityManager::Instance()->SerializeEntity(other);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChangeOrientationBehavior::Load() {
|
void ChangeOrientationBehavior::Load() {
|
||||||
m_OrientCaster = GetBoolean("orient_caster");
|
this->m_orientCaster = GetBoolean("orient_caster", true);
|
||||||
m_ToTarget = GetBoolean("to_target");
|
this->m_toTarget = GetBoolean("to_target", false);
|
||||||
|
this->m_toAngle = GetBoolean("to_angle", false);
|
||||||
|
this->m_angle = GetFloat("angle", 0.0f);
|
||||||
|
this->m_relative = GetBoolean("relative", false);
|
||||||
}
|
}
|
||||||
|
@ -2,24 +2,15 @@
|
|||||||
|
|
||||||
#include "Behavior.h"
|
#include "Behavior.h"
|
||||||
|
|
||||||
#include <vector>
|
class ChangeOrientationBehavior final : public Behavior {
|
||||||
|
|
||||||
class ChangeOrientationBehavior final : public Behavior
|
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
bool m_OrientCaster;
|
explicit ChangeOrientationBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {}
|
||||||
bool m_ToTarget;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Inherited
|
|
||||||
*/
|
|
||||||
|
|
||||||
explicit ChangeOrientationBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
|
||||||
|
|
||||||
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Load() override;
|
void Load() override;
|
||||||
|
private:
|
||||||
|
bool m_orientCaster;
|
||||||
|
bool m_toTarget;
|
||||||
|
bool m_toAngle;
|
||||||
|
float m_angle;
|
||||||
|
bool m_relative;
|
||||||
};
|
};
|
||||||
|
@ -12,7 +12,7 @@ void ChargeUpBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitSt
|
|||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
context->RegisterSyncBehavior(handle, this, branch);
|
context->RegisterSyncBehavior(handle, this, branch, this->m_MaxDuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChargeUpBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void ChargeUpBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
||||||
@ -24,4 +24,5 @@ void ChargeUpBehavior::Sync(BehaviorContext* context, RakNet::BitStream* bitStre
|
|||||||
|
|
||||||
void ChargeUpBehavior::Load() {
|
void ChargeUpBehavior::Load() {
|
||||||
this->m_action = GetAction("action");
|
this->m_action = GetAction("action");
|
||||||
|
this->m_MaxDuration = GetFloat("max_duration");
|
||||||
}
|
}
|
||||||
|
@ -4,14 +4,7 @@
|
|||||||
class ChargeUpBehavior final : public Behavior
|
class ChargeUpBehavior final : public Behavior
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Behavior* m_action;
|
explicit ChargeUpBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {}
|
||||||
|
|
||||||
/*
|
|
||||||
* Inherited
|
|
||||||
*/
|
|
||||||
|
|
||||||
explicit ChargeUpBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
@ -20,4 +13,7 @@ public:
|
|||||||
void Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Load() override;
|
void Load() override;
|
||||||
|
private:
|
||||||
|
Behavior* m_action;
|
||||||
|
float m_MaxDuration;
|
||||||
};
|
};
|
||||||
|
50
dGame/dBehaviors/FallSpeedBehavior.cpp
Normal file
50
dGame/dBehaviors/FallSpeedBehavior.cpp
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#include "FallSpeedBehavior.h"
|
||||||
|
|
||||||
|
#include "ControllablePhysicsComponent.h"
|
||||||
|
#include "BehaviorContext.h"
|
||||||
|
#include "BehaviorBranchContext.h"
|
||||||
|
|
||||||
|
|
||||||
|
void FallSpeedBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
||||||
|
// make sure required parameter has non-default value
|
||||||
|
if (m_PercentSlowed == 0.0f) return;
|
||||||
|
auto* target = EntityManager::Instance()->GetEntity(branch.target);
|
||||||
|
if (!target) return;
|
||||||
|
|
||||||
|
auto* controllablePhysicsComponent = target->GetComponent<ControllablePhysicsComponent>();
|
||||||
|
if (!controllablePhysicsComponent) return;
|
||||||
|
controllablePhysicsComponent->SetGravityScale(m_PercentSlowed);
|
||||||
|
EntityManager::Instance()->SerializeEntity(target);
|
||||||
|
|
||||||
|
if (branch.duration > 0.0f) {
|
||||||
|
context->RegisterTimerBehavior(this, branch);
|
||||||
|
} else if (branch.start > 0) {
|
||||||
|
context->RegisterEndBehavior(this, branch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FallSpeedBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
||||||
|
Handle(context, bitStream, branch);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FallSpeedBehavior::Timer(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) {
|
||||||
|
End(context, branch, second);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FallSpeedBehavior::UnCast(BehaviorContext* context, BehaviorBranchContext branch) {
|
||||||
|
End(context, branch, LWOOBJID_EMPTY);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FallSpeedBehavior::End(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) {
|
||||||
|
auto* target = EntityManager::Instance()->GetEntity(branch.target);
|
||||||
|
if (!target) return;
|
||||||
|
|
||||||
|
auto* controllablePhysicsComponent = target->GetComponent<ControllablePhysicsComponent>();
|
||||||
|
if (!controllablePhysicsComponent) return;
|
||||||
|
controllablePhysicsComponent->SetGravityScale(1);
|
||||||
|
EntityManager::Instance()->SerializeEntity(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FallSpeedBehavior::Load(){
|
||||||
|
m_PercentSlowed = GetFloat("percent_slowed");
|
||||||
|
}
|
18
dGame/dBehaviors/FallSpeedBehavior.h
Normal file
18
dGame/dBehaviors/FallSpeedBehavior.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "Behavior.h"
|
||||||
|
|
||||||
|
class FallSpeedBehavior final : public Behavior
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit FallSpeedBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {}
|
||||||
|
|
||||||
|
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
||||||
|
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
||||||
|
void Timer(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) override;
|
||||||
|
void End(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) override;
|
||||||
|
void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override;
|
||||||
|
void Load() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
float m_PercentSlowed;
|
||||||
|
};
|
@ -16,7 +16,7 @@ void ForceMovementBehavior::Handle(BehaviorContext* context, RakNet::BitStream*
|
|||||||
Game::logger->Log("ForceMovementBehavior", "Unable to read handle from bitStream, aborting Handle! %i", bitStream->GetNumberOfUnreadBits());
|
Game::logger->Log("ForceMovementBehavior", "Unable to read handle from bitStream, aborting Handle! %i", bitStream->GetNumberOfUnreadBits());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
context->RegisterSyncBehavior(handle, this, branch);
|
context->RegisterSyncBehavior(handle, this, branch, this->m_Duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ForceMovementBehavior::Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void ForceMovementBehavior::Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "dLogger.h"
|
#include "dLogger.h"
|
||||||
#include "DestroyableComponent.h"
|
#include "DestroyableComponent.h"
|
||||||
#include "ControllablePhysicsComponent.h"
|
#include "ControllablePhysicsComponent.h"
|
||||||
|
#include "eStateChangeType.h"
|
||||||
|
|
||||||
void ImmunityBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, const BehaviorBranchContext branch) {
|
void ImmunityBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, const BehaviorBranchContext branch) {
|
||||||
auto* target = EntityManager::Instance()->GetEntity(branch.target);
|
auto* target = EntityManager::Instance()->GetEntity(branch.target);
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "dLogger.h"
|
#include "dLogger.h"
|
||||||
#include "SkillComponent.h"
|
#include "SkillComponent.h"
|
||||||
#include "../dWorldServer/ObjectIDManager.h"
|
#include "../dWorldServer/ObjectIDManager.h"
|
||||||
|
#include "eObjectBits.h"
|
||||||
|
|
||||||
void ProjectileAttackBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void ProjectileAttackBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
||||||
LWOOBJID target{};
|
LWOOBJID target{};
|
||||||
@ -107,7 +108,7 @@ void ProjectileAttackBehavior::Calculate(BehaviorContext* context, RakNet::BitSt
|
|||||||
for (auto i = 0u; i < this->m_projectileCount; ++i) {
|
for (auto i = 0u; i < this->m_projectileCount; ++i) {
|
||||||
auto id = static_cast<LWOOBJID>(ObjectIDManager::Instance()->GenerateObjectID());
|
auto id = static_cast<LWOOBJID>(ObjectIDManager::Instance()->GenerateObjectID());
|
||||||
|
|
||||||
id = GeneralUtils::SetBit(id, OBJECT_BIT_SPAWNED);
|
GeneralUtils::SetBit(id, eObjectBits::SPAWNED);
|
||||||
|
|
||||||
bitStream->Write(id);
|
bitStream->Write(id);
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ void SwitchBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStre
|
|||||||
|
|
||||||
Game::logger->LogDebug("SwitchBehavior", "[%i] State: (%d), imagination: (%i) / (%f)", entity->GetLOT(), state, destroyableComponent->GetImagination(), destroyableComponent->GetMaxImagination());
|
Game::logger->LogDebug("SwitchBehavior", "[%i] State: (%d), imagination: (%i) / (%f)", entity->GetLOT(), state, destroyableComponent->GetImagination(), destroyableComponent->GetMaxImagination());
|
||||||
|
|
||||||
if (state || (entity->GetLOT() == 8092 && destroyableComponent->GetImagination() >= m_imagination)) {
|
if (state) {
|
||||||
this->m_actionTrue->Handle(context, bitStream, branch);
|
this->m_actionTrue->Handle(context, bitStream, branch);
|
||||||
} else {
|
} else {
|
||||||
this->m_actionFalse->Handle(context, bitStream, branch);
|
this->m_actionFalse->Handle(context, bitStream, branch);
|
||||||
|
@ -22,13 +22,9 @@ void SwitchMultipleBehavior::Handle(BehaviorContext* context, RakNet::BitStream*
|
|||||||
for (unsigned int i = 0; i < this->m_behaviors.size(); i++) {
|
for (unsigned int i = 0; i < this->m_behaviors.size(); i++) {
|
||||||
|
|
||||||
const double data = this->m_behaviors.at(i).first;
|
const double data = this->m_behaviors.at(i).first;
|
||||||
|
trigger = i;
|
||||||
|
|
||||||
if (value <= data) {
|
if (value <= data) break;
|
||||||
|
|
||||||
trigger = i;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* behavior = this->m_behaviors.at(trigger).second;
|
auto* behavior = this->m_behaviors.at(trigger).second;
|
||||||
|
@ -248,7 +248,7 @@ void BaseCombatAIComponent::CalculateCombat(const float deltaTime) {
|
|||||||
if (rebuild != nullptr) {
|
if (rebuild != nullptr) {
|
||||||
const auto state = rebuild->GetState();
|
const auto state = rebuild->GetState();
|
||||||
|
|
||||||
if (state != REBUILD_COMPLETED) {
|
if (state != eRebuildState::COMPLETED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -566,7 +566,7 @@ bool BaseCombatAIComponent::IsEnemy(LWOOBJID target) const {
|
|||||||
if (quickbuild != nullptr) {
|
if (quickbuild != nullptr) {
|
||||||
const auto state = quickbuild->GetState();
|
const auto state = quickbuild->GetState();
|
||||||
|
|
||||||
if (state != REBUILD_COMPLETED) {
|
if (state != eRebuildState::COMPLETED) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,8 +13,9 @@
|
|||||||
#include "VehiclePhysicsComponent.h"
|
#include "VehiclePhysicsComponent.h"
|
||||||
#include "GameMessages.h"
|
#include "GameMessages.h"
|
||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
#include "AMFFormat.h"
|
#include "Amf3.h"
|
||||||
#include "eGameMasterLevel.h"
|
#include "eGameMasterLevel.h"
|
||||||
|
#include "eGameActivity.h"
|
||||||
|
|
||||||
CharacterComponent::CharacterComponent(Entity* parent, Character* character) : Component(parent) {
|
CharacterComponent::CharacterComponent(Entity* parent, Character* character) : Component(parent) {
|
||||||
m_Character = character;
|
m_Character = character;
|
||||||
@ -35,7 +36,7 @@ CharacterComponent::CharacterComponent(Entity* parent, Character* character) : C
|
|||||||
m_EditorLevel = m_GMLevel;
|
m_EditorLevel = m_GMLevel;
|
||||||
m_Reputation = 0;
|
m_Reputation = 0;
|
||||||
|
|
||||||
m_CurrentActivity = 0;
|
m_CurrentActivity = eGameActivity::NONE;
|
||||||
m_CountryCode = 0;
|
m_CountryCode = 0;
|
||||||
m_LastUpdateTimestamp = std::time(nullptr);
|
m_LastUpdateTimestamp = std::time(nullptr);
|
||||||
}
|
}
|
||||||
@ -733,6 +734,6 @@ void CharacterComponent::RemoveVentureVisionEffect(std::string ventureVisionType
|
|||||||
void CharacterComponent::UpdateClientMinimap(bool showFaction, std::string ventureVisionType) const {
|
void CharacterComponent::UpdateClientMinimap(bool showFaction, std::string ventureVisionType) const {
|
||||||
if (!m_Parent) return;
|
if (!m_Parent) return;
|
||||||
AMFArrayValue arrayToSend;
|
AMFArrayValue arrayToSend;
|
||||||
arrayToSend.InsertValue(ventureVisionType, showFaction ? static_cast<AMFValue*>(new AMFTrueValue()) : static_cast<AMFValue*>(new AMFFalseValue()));
|
arrayToSend.Insert(ventureVisionType, showFaction);
|
||||||
GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent ? m_Parent->GetSystemAddress() : UNASSIGNED_SYSTEM_ADDRESS, "SetFactionVisibility", &arrayToSend);
|
GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent ? m_Parent->GetSystemAddress() : UNASSIGNED_SYSTEM_ADDRESS, "SetFactionVisibility", arrayToSend);
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
#include "tinyxml2.h"
|
#include "tinyxml2.h"
|
||||||
#include "eReplicaComponentType.h"
|
#include "eReplicaComponentType.h"
|
||||||
|
|
||||||
|
enum class eGameActivity : uint32_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The statistics that can be achieved per zone
|
* The statistics that can be achieved per zone
|
||||||
*/
|
*/
|
||||||
@ -112,13 +114,13 @@ public:
|
|||||||
* Gets the current activity that the character is partaking in, see ScriptedActivityComponent for more details
|
* Gets the current activity that the character is partaking in, see ScriptedActivityComponent for more details
|
||||||
* @return the current activity that the character is partaking in
|
* @return the current activity that the character is partaking in
|
||||||
*/
|
*/
|
||||||
const uint32_t GetCurrentActivity() const { return m_CurrentActivity; }
|
const eGameActivity GetCurrentActivity() const { return m_CurrentActivity; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the current activity of the character, see ScriptedActivityComponent for more details
|
* Set the current activity of the character, see ScriptedActivityComponent for more details
|
||||||
* @param currentActivity the activity to set
|
* @param currentActivity the activity to set
|
||||||
*/
|
*/
|
||||||
void SetCurrentActivity(uint32_t currentActivity) { m_CurrentActivity = currentActivity; m_DirtyCurrentActivity = true; }
|
void SetCurrentActivity(eGameActivity currentActivity) { m_CurrentActivity = currentActivity; m_DirtyCurrentActivity = true; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets if the entity is currently racing
|
* Gets if the entity is currently racing
|
||||||
@ -353,7 +355,7 @@ private:
|
|||||||
/**
|
/**
|
||||||
* The ID of the curently active activity
|
* The ID of the curently active activity
|
||||||
*/
|
*/
|
||||||
int m_CurrentActivity;
|
eGameActivity m_CurrentActivity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the social info has been changed
|
* Whether the social info has been changed
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "Character.h"
|
#include "Character.h"
|
||||||
#include "dZoneManager.h"
|
#include "dZoneManager.h"
|
||||||
#include "LevelProgressionComponent.h"
|
#include "LevelProgressionComponent.h"
|
||||||
|
#include "eStateChangeType.h"
|
||||||
|
|
||||||
ControllablePhysicsComponent::ControllablePhysicsComponent(Entity* entity) : Component(entity) {
|
ControllablePhysicsComponent::ControllablePhysicsComponent(Entity* entity) : Component(entity) {
|
||||||
m_Position = {};
|
m_Position = {};
|
||||||
@ -319,7 +320,7 @@ void ControllablePhysicsComponent::RemoveSpeedboost(float value) {
|
|||||||
|
|
||||||
// Recalculate speedboost since we removed one
|
// Recalculate speedboost since we removed one
|
||||||
m_SpeedBoost = 0.0f;
|
m_SpeedBoost = 0.0f;
|
||||||
if (m_ActiveSpeedBoosts.size() == 0) { // no active speed boosts left, so return to base speed
|
if (m_ActiveSpeedBoosts.empty()) { // no active speed boosts left, so return to base speed
|
||||||
auto* levelProgressionComponent = m_Parent->GetComponent<LevelProgressionComponent>();
|
auto* levelProgressionComponent = m_Parent->GetComponent<LevelProgressionComponent>();
|
||||||
if (levelProgressionComponent) m_SpeedBoost = levelProgressionComponent->GetSpeedBase();
|
if (levelProgressionComponent) m_SpeedBoost = levelProgressionComponent->GetSpeedBase();
|
||||||
} else { // Used the last applied speedboost
|
} else { // Used the last applied speedboost
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
class Entity;
|
class Entity;
|
||||||
class dpEntity;
|
class dpEntity;
|
||||||
|
enum class eStateChangeType : uint32_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the movement of controllable Entities, e.g. enemies and players
|
* Handles the movement of controllable Entities, e.g. enemies and players
|
||||||
@ -275,7 +276,7 @@ public:
|
|||||||
* The speed boosts of this component.
|
* The speed boosts of this component.
|
||||||
* @return All active Speed boosts for this component.
|
* @return All active Speed boosts for this component.
|
||||||
*/
|
*/
|
||||||
std::vector<float> GetActiveSpeedboosts() { return m_ActivePickupRadiusScales; };
|
std::vector<float> GetActiveSpeedboosts() { return m_ActiveSpeedBoosts; };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Activates the Bubble Buff
|
* Activates the Bubble Buff
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "dConfig.h"
|
#include "dConfig.h"
|
||||||
|
|
||||||
#include "AMFFormat.h"
|
#include "Amf3.h"
|
||||||
#include "AMFFormat_BitStream.h"
|
#include "AmfSerialize.h"
|
||||||
#include "GameMessages.h"
|
#include "GameMessages.h"
|
||||||
#include "User.h"
|
#include "User.h"
|
||||||
#include "CDClientManager.h"
|
#include "CDClientManager.h"
|
||||||
@ -33,6 +33,8 @@
|
|||||||
#include "dZoneManager.h"
|
#include "dZoneManager.h"
|
||||||
#include "WorldConfig.h"
|
#include "WorldConfig.h"
|
||||||
#include "eMissionTaskType.h"
|
#include "eMissionTaskType.h"
|
||||||
|
#include "eStateChangeType.h"
|
||||||
|
#include "eGameActivity.h"
|
||||||
|
|
||||||
#include "CDComponentsRegistryTable.h"
|
#include "CDComponentsRegistryTable.h"
|
||||||
|
|
||||||
@ -243,16 +245,12 @@ void DestroyableComponent::SetMaxHealth(float value, bool playAnim) {
|
|||||||
if (playAnim) {
|
if (playAnim) {
|
||||||
// Now update the player bar
|
// Now update the player bar
|
||||||
if (!m_Parent->GetParentUser()) return;
|
if (!m_Parent->GetParentUser()) return;
|
||||||
AMFStringValue* amount = new AMFStringValue();
|
|
||||||
amount->SetStringValue(std::to_string(difference));
|
|
||||||
AMFStringValue* type = new AMFStringValue();
|
|
||||||
type->SetStringValue("health");
|
|
||||||
|
|
||||||
AMFArrayValue args;
|
AMFArrayValue args;
|
||||||
args.InsertValue("amount", amount);
|
args.Insert("amount", std::to_string(difference));
|
||||||
args.InsertValue("type", type);
|
args.Insert("type", "health");
|
||||||
|
|
||||||
GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", &args);
|
GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", args);
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityManager::Instance()->SerializeEntity(m_Parent);
|
EntityManager::Instance()->SerializeEntity(m_Parent);
|
||||||
@ -288,16 +286,12 @@ void DestroyableComponent::SetMaxArmor(float value, bool playAnim) {
|
|||||||
if (playAnim) {
|
if (playAnim) {
|
||||||
// Now update the player bar
|
// Now update the player bar
|
||||||
if (!m_Parent->GetParentUser()) return;
|
if (!m_Parent->GetParentUser()) return;
|
||||||
AMFStringValue* amount = new AMFStringValue();
|
|
||||||
amount->SetStringValue(std::to_string(value));
|
|
||||||
AMFStringValue* type = new AMFStringValue();
|
|
||||||
type->SetStringValue("armor");
|
|
||||||
|
|
||||||
AMFArrayValue args;
|
AMFArrayValue args;
|
||||||
args.InsertValue("amount", amount);
|
args.Insert("amount", std::to_string(value));
|
||||||
args.InsertValue("type", type);
|
args.Insert("type", "armor");
|
||||||
|
|
||||||
GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", &args);
|
GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", args);
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityManager::Instance()->SerializeEntity(m_Parent);
|
EntityManager::Instance()->SerializeEntity(m_Parent);
|
||||||
@ -332,16 +326,12 @@ void DestroyableComponent::SetMaxImagination(float value, bool playAnim) {
|
|||||||
if (playAnim) {
|
if (playAnim) {
|
||||||
// Now update the player bar
|
// Now update the player bar
|
||||||
if (!m_Parent->GetParentUser()) return;
|
if (!m_Parent->GetParentUser()) return;
|
||||||
AMFStringValue* amount = new AMFStringValue();
|
|
||||||
amount->SetStringValue(std::to_string(difference));
|
|
||||||
AMFStringValue* type = new AMFStringValue();
|
|
||||||
type->SetStringValue("imagination");
|
|
||||||
|
|
||||||
AMFArrayValue args;
|
AMFArrayValue args;
|
||||||
args.InsertValue("amount", amount);
|
args.Insert("amount", std::to_string(difference));
|
||||||
args.InsertValue("type", type);
|
args.Insert("type", "imagination");
|
||||||
|
|
||||||
GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", &args);
|
GameMessages::SendUIMessageServerToSingleClient(m_Parent, m_Parent->GetParentUser()->GetSystemAddress(), "MaxPlayerBarUpdate", args);
|
||||||
}
|
}
|
||||||
EntityManager::Instance()->SerializeEntity(m_Parent);
|
EntityManager::Instance()->SerializeEntity(m_Parent);
|
||||||
}
|
}
|
||||||
@ -468,7 +458,7 @@ bool DestroyableComponent::IsKnockbackImmune() const {
|
|||||||
auto* characterComponent = m_Parent->GetComponent<CharacterComponent>();
|
auto* characterComponent = m_Parent->GetComponent<CharacterComponent>();
|
||||||
auto* inventoryComponent = m_Parent->GetComponent<InventoryComponent>();
|
auto* inventoryComponent = m_Parent->GetComponent<InventoryComponent>();
|
||||||
|
|
||||||
if (characterComponent != nullptr && inventoryComponent != nullptr && characterComponent->GetCurrentActivity() == eGameActivities::ACTIVITY_QUICKBUILDING) {
|
if (characterComponent != nullptr && inventoryComponent != nullptr && characterComponent->GetCurrentActivity() == eGameActivity::QUICKBUILDING) {
|
||||||
const auto hasPassive = inventoryComponent->HasAnyPassive({
|
const auto hasPassive = inventoryComponent->HasAnyPassive({
|
||||||
eItemSetPassiveAbilityID::EngineerRank2, eItemSetPassiveAbilityID::EngineerRank3,
|
eItemSetPassiveAbilityID::EngineerRank2, eItemSetPassiveAbilityID::EngineerRank3,
|
||||||
eItemSetPassiveAbilityID::SummonerRank2, eItemSetPassiveAbilityID::SummonerRank3,
|
eItemSetPassiveAbilityID::SummonerRank2, eItemSetPassiveAbilityID::SummonerRank3,
|
||||||
@ -514,7 +504,7 @@ bool DestroyableComponent::CheckValidity(const LWOOBJID target, const bool ignor
|
|||||||
if (targetQuickbuild != nullptr) {
|
if (targetQuickbuild != nullptr) {
|
||||||
const auto state = targetQuickbuild->GetState();
|
const auto state = targetQuickbuild->GetState();
|
||||||
|
|
||||||
if (state != REBUILD_COMPLETED) {
|
if (state != eRebuildState::COMPLETED) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -803,7 +793,7 @@ void DestroyableComponent::Smash(const LWOOBJID source, const eKillType killType
|
|||||||
coinsTotal -= coinsToLose;
|
coinsTotal -= coinsToLose;
|
||||||
|
|
||||||
LootGenerator::Instance().DropLoot(m_Parent, m_Parent, -1, coinsToLose, coinsToLose);
|
LootGenerator::Instance().DropLoot(m_Parent, m_Parent, -1, coinsToLose, coinsToLose);
|
||||||
character->SetCoins(coinsTotal, eLootSourceType::LOOT_SOURCE_PICKUP);
|
character->SetCoins(coinsTotal, eLootSourceType::PICKUP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -992,7 +982,7 @@ void DestroyableComponent::DoHardcoreModeDrops(const LWOOBJID source){
|
|||||||
auto uscoreToLose = uscore * (EntityManager::Instance()->GetHardcoreLoseUscoreOnDeathPercent() / 100);
|
auto uscoreToLose = uscore * (EntityManager::Instance()->GetHardcoreLoseUscoreOnDeathPercent() / 100);
|
||||||
character->SetUScore(uscore - uscoreToLose);
|
character->SetUScore(uscore - uscoreToLose);
|
||||||
|
|
||||||
GameMessages::SendModifyLEGOScore(m_Parent, m_Parent->GetSystemAddress(), -uscoreToLose, eLootSourceType::LOOT_SOURCE_MISSION);
|
GameMessages::SendModifyLEGOScore(m_Parent, m_Parent->GetSystemAddress(), -uscoreToLose, eLootSourceType::MISSION);
|
||||||
|
|
||||||
if (EntityManager::Instance()->GetHardcoreDropinventoryOnDeath()) {
|
if (EntityManager::Instance()->GetHardcoreDropinventoryOnDeath()) {
|
||||||
//drop all items from inventory:
|
//drop all items from inventory:
|
||||||
@ -1023,7 +1013,7 @@ void DestroyableComponent::DoHardcoreModeDrops(const LWOOBJID source){
|
|||||||
auto coins = chars->GetCoins();
|
auto coins = chars->GetCoins();
|
||||||
|
|
||||||
//lose all coins:
|
//lose all coins:
|
||||||
chars->SetCoins(0, eLootSourceType::LOOT_SOURCE_NONE);
|
chars->SetCoins(0, eLootSourceType::NONE);
|
||||||
|
|
||||||
//drop all coins:
|
//drop all coins:
|
||||||
GameMessages::SendDropClientLoot(m_Parent, source, LOT_NULL, coins, m_Parent->GetPosition());
|
GameMessages::SendDropClientLoot(m_Parent, source, LOT_NULL, coins, m_Parent->GetPosition());
|
||||||
@ -1047,7 +1037,7 @@ void DestroyableComponent::DoHardcoreModeDrops(const LWOOBJID source){
|
|||||||
int uscore = maxHealth * EntityManager::Instance()->GetHardcoreUscoreEnemiesMultiplier();
|
int uscore = maxHealth * EntityManager::Instance()->GetHardcoreUscoreEnemiesMultiplier();
|
||||||
|
|
||||||
playerStats->SetUScore(playerStats->GetUScore() + uscore);
|
playerStats->SetUScore(playerStats->GetUScore() + uscore);
|
||||||
GameMessages::SendModifyLEGOScore(player, player->GetSystemAddress(), uscore, eLootSourceType::LOOT_SOURCE_MISSION);
|
GameMessages::SendModifyLEGOScore(player, player->GetSystemAddress(), uscore, eLootSourceType::MISSION);
|
||||||
|
|
||||||
EntityManager::Instance()->SerializeEntity(m_Parent);
|
EntityManager::Instance()->SerializeEntity(m_Parent);
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
namespace CppScripts {
|
namespace CppScripts {
|
||||||
class Script;
|
class Script;
|
||||||
}; //! namespace CppScripts
|
}; //! namespace CppScripts
|
||||||
|
enum class eStateChangeType : uint32_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the stats of an entity, for example its health, imagination and armor. Also handles factions, which
|
* Represents the stats of an entity, for example its health, imagination and armor. Also handles factions, which
|
||||||
|
@ -29,6 +29,8 @@
|
|||||||
#include "eUnequippableActiveType.h"
|
#include "eUnequippableActiveType.h"
|
||||||
#include "CppScripts.h"
|
#include "CppScripts.h"
|
||||||
#include "eMissionTaskType.h"
|
#include "eMissionTaskType.h"
|
||||||
|
#include "eStateChangeType.h"
|
||||||
|
#include "eUseItemResponse.h"
|
||||||
|
|
||||||
#include "CDComponentsRegistryTable.h"
|
#include "CDComponentsRegistryTable.h"
|
||||||
#include "CDInventoryComponentTable.h"
|
#include "CDInventoryComponentTable.h"
|
||||||
@ -356,7 +358,7 @@ void InventoryComponent::MoveItemToInventory(Item* item, const eInventoryType in
|
|||||||
|
|
||||||
left -= delta;
|
left -= delta;
|
||||||
|
|
||||||
AddItem(lot, delta, eLootSourceType::LOOT_SOURCE_NONE, inventory, {}, LWOOBJID_EMPTY, showFlyingLot, isModMoveAndEquip, LWOOBJID_EMPTY, origin->GetType(), 0, false, preferredSlot);
|
AddItem(lot, delta, eLootSourceType::NONE, inventory, {}, LWOOBJID_EMPTY, showFlyingLot, isModMoveAndEquip, LWOOBJID_EMPTY, origin->GetType(), 0, false, preferredSlot);
|
||||||
|
|
||||||
item->SetCount(item->GetCount() - delta, false, false);
|
item->SetCount(item->GetCount() - delta, false, false);
|
||||||
|
|
||||||
@ -371,7 +373,7 @@ void InventoryComponent::MoveItemToInventory(Item* item, const eInventoryType in
|
|||||||
|
|
||||||
const auto delta = std::min<uint32_t>(item->GetCount(), count);
|
const auto delta = std::min<uint32_t>(item->GetCount(), count);
|
||||||
|
|
||||||
AddItem(lot, delta, eLootSourceType::LOOT_SOURCE_NONE, inventory, config, LWOOBJID_EMPTY, showFlyingLot, isModMoveAndEquip, subkey, origin->GetType(), 0, item->GetBound(), preferredSlot);
|
AddItem(lot, delta, eLootSourceType::NONE, inventory, config, LWOOBJID_EMPTY, showFlyingLot, isModMoveAndEquip, subkey, origin->GetType(), 0, item->GetBound(), preferredSlot);
|
||||||
|
|
||||||
item->SetCount(item->GetCount() - delta, false, false);
|
item->SetCount(item->GetCount() - delta, false, false);
|
||||||
}
|
}
|
||||||
@ -1247,7 +1249,7 @@ void InventoryComponent::SpawnPet(Item* item) {
|
|||||||
auto destroyableComponent = m_Parent->GetComponent<DestroyableComponent>();
|
auto destroyableComponent = m_Parent->GetComponent<DestroyableComponent>();
|
||||||
|
|
||||||
if (Game::config->GetValue("pets_take_imagination") == "1" && destroyableComponent && destroyableComponent->GetImagination() <= 0) {
|
if (Game::config->GetValue("pets_take_imagination") == "1" && destroyableComponent && destroyableComponent->GetImagination() <= 0) {
|
||||||
GameMessages::SendUseItemRequirementsResponse(m_Parent->GetObjectID(), m_Parent->GetSystemAddress(), UseItemResponse::NoImaginationForPet);
|
GameMessages::SendUseItemRequirementsResponse(m_Parent->GetObjectID(), m_Parent->GetSystemAddress(), eUseItemResponse::NoImaginationForPet);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "PossessorComponent.h"
|
#include "PossessorComponent.h"
|
||||||
#include "eInventoryType.h"
|
#include "eInventoryType.h"
|
||||||
#include "eReplicaComponentType.h"
|
#include "eReplicaComponentType.h"
|
||||||
|
#include "eLootSourceType.h"
|
||||||
|
|
||||||
class Entity;
|
class Entity;
|
||||||
class ItemSet;
|
class ItemSet;
|
||||||
@ -99,7 +100,7 @@ public:
|
|||||||
void AddItem(
|
void AddItem(
|
||||||
LOT lot,
|
LOT lot,
|
||||||
uint32_t count,
|
uint32_t count,
|
||||||
eLootSourceType lootSourceType = eLootSourceType::LOOT_SOURCE_NONE,
|
eLootSourceType lootSourceType = eLootSourceType::NONE,
|
||||||
eInventoryType inventoryType = INVALID,
|
eInventoryType inventoryType = INVALID,
|
||||||
const std::vector<LDFBaseData*>& config = {},
|
const std::vector<LDFBaseData*>& config = {},
|
||||||
LWOOBJID parent = LWOOBJID_EMPTY,
|
LWOOBJID parent = LWOOBJID_EMPTY,
|
||||||
|
@ -59,7 +59,7 @@ void LevelProgressionComponent::HandleLevelUp() {
|
|||||||
for (auto* reward : rewards) {
|
for (auto* reward : rewards) {
|
||||||
switch (reward->rewardType) {
|
switch (reward->rewardType) {
|
||||||
case 0:
|
case 0:
|
||||||
inventoryComponent->AddItem(reward->value, reward->count, eLootSourceType::LOOT_SOURCE_LEVEL_REWARD);
|
inventoryComponent->AddItem(reward->value, reward->count, eLootSourceType::LEVEL_REWARD);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include "InventoryComponent.h"
|
#include "InventoryComponent.h"
|
||||||
#include "GameMessages.h"
|
#include "GameMessages.h"
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "AMFFormat.h"
|
#include "Amf3.h"
|
||||||
#include "dZoneManager.h"
|
#include "dZoneManager.h"
|
||||||
#include "Mail.h"
|
#include "Mail.h"
|
||||||
#include "MissionPrerequisites.h"
|
#include "MissionPrerequisites.h"
|
||||||
|
@ -14,7 +14,7 @@ class ModuleAssemblyComponent : public Component {
|
|||||||
public:
|
public:
|
||||||
static const eReplicaComponentType ComponentType = eReplicaComponentType::MODULE_ASSEMBLY;
|
static const eReplicaComponentType ComponentType = eReplicaComponentType::MODULE_ASSEMBLY;
|
||||||
|
|
||||||
ModuleAssemblyComponent(Entity* MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION);
|
ModuleAssemblyComponent(Entity* parent);
|
||||||
~ModuleAssemblyComponent() override;
|
~ModuleAssemblyComponent() override;
|
||||||
|
|
||||||
void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags);
|
void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags);
|
||||||
|
@ -307,13 +307,14 @@ float MovementAIComponent::GetBaseSpeed(LOT lot) {
|
|||||||
|
|
||||||
foundComponent:
|
foundComponent:
|
||||||
|
|
||||||
float speed;
|
// Client defaults speed to 10 and if the speed is also null in the table, it defaults to 10.
|
||||||
|
float speed = 10.0f;
|
||||||
|
|
||||||
if (physicsComponent == nullptr) {
|
if (physicsComponent) speed = physicsComponent->speed;
|
||||||
speed = 8;
|
|
||||||
} else {
|
float delta = fabs(speed) - 1.0f;
|
||||||
speed = physicsComponent->speed;
|
|
||||||
}
|
if (delta <= std::numeric_limits<float>::epsilon()) speed = 10.0f;
|
||||||
|
|
||||||
m_PhysicsSpeedCache[lot] = speed;
|
m_PhysicsSpeedCache[lot] = speed;
|
||||||
|
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
#include "PetDigServer.h"
|
#include "PetDigServer.h"
|
||||||
#include "../dWorldServer/ObjectIDManager.h"
|
#include "../dWorldServer/ObjectIDManager.h"
|
||||||
#include "eUnequippableActiveType.h"
|
#include "eUnequippableActiveType.h"
|
||||||
|
#include "eTerminateType.h"
|
||||||
|
#include "ePetTamingNotifyType.h"
|
||||||
|
#include "eUseItemResponse.h"
|
||||||
|
#include "ePlayerFlag.h"
|
||||||
|
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "dConfig.h"
|
#include "dConfig.h"
|
||||||
@ -23,6 +27,7 @@
|
|||||||
#include "EntityInfo.h"
|
#include "EntityInfo.h"
|
||||||
#include "eMissionTaskType.h"
|
#include "eMissionTaskType.h"
|
||||||
#include "RenderComponent.h"
|
#include "RenderComponent.h"
|
||||||
|
#include "eObjectBits.h"
|
||||||
#include "eGameMasterLevel.h"
|
#include "eGameMasterLevel.h"
|
||||||
|
|
||||||
std::unordered_map<LOT, PetComponent::PetPuzzleData> PetComponent::buildCache{};
|
std::unordered_map<LOT, PetComponent::PetPuzzleData> PetComponent::buildCache{};
|
||||||
@ -33,7 +38,7 @@ std::unordered_map<LWOOBJID, LWOOBJID> PetComponent::activePets{};
|
|||||||
* Maps all the pet lots to a flag indicating that the player has caught it. All basic pets have been guessed by ObjID
|
* Maps all the pet lots to a flag indicating that the player has caught it. All basic pets have been guessed by ObjID
|
||||||
* while the faction ones could be checked using their respective missions.
|
* while the faction ones could be checked using their respective missions.
|
||||||
*/
|
*/
|
||||||
std::map<LOT, uint32_t> PetComponent::petFlags = {
|
std::map<LOT, int32_t> PetComponent::petFlags = {
|
||||||
{ 3050, 801 }, // Elephant
|
{ 3050, 801 }, // Elephant
|
||||||
{ 3054, 803 }, // Cat
|
{ 3054, 803 }, // Cat
|
||||||
{ 3195, 806 }, // Triceratops
|
{ 3195, 806 }, // Triceratops
|
||||||
@ -285,7 +290,7 @@ void PetComponent::OnUse(Entity* originator) {
|
|||||||
m_Parent->GetObjectID(),
|
m_Parent->GetObjectID(),
|
||||||
LWOOBJID_EMPTY,
|
LWOOBJID_EMPTY,
|
||||||
true,
|
true,
|
||||||
NOTIFY_TYPE_BEGIN,
|
ePetTamingNotifyType::BEGIN,
|
||||||
petPosition,
|
petPosition,
|
||||||
position,
|
position,
|
||||||
rotation,
|
rotation,
|
||||||
@ -297,7 +302,7 @@ void PetComponent::OnUse(Entity* originator) {
|
|||||||
LWOOBJID_EMPTY,
|
LWOOBJID_EMPTY,
|
||||||
originator->GetObjectID(),
|
originator->GetObjectID(),
|
||||||
true,
|
true,
|
||||||
NOTIFY_TYPE_BEGIN,
|
ePetTamingNotifyType::BEGIN,
|
||||||
petPosition,
|
petPosition,
|
||||||
position,
|
position,
|
||||||
rotation,
|
rotation,
|
||||||
@ -313,7 +318,7 @@ void PetComponent::OnUse(Entity* originator) {
|
|||||||
|
|
||||||
// Notify the start of a pet taming minigame
|
// Notify the start of a pet taming minigame
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(m_Parent)) {
|
for (CppScripts::Script* script : CppScripts::GetEntityScripts(m_Parent)) {
|
||||||
script->OnNotifyPetTamingMinigame(m_Parent, originator, NOTIFY_TYPE_BEGIN);
|
script->OnNotifyPetTamingMinigame(m_Parent, originator, ePetTamingNotifyType::BEGIN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -552,8 +557,8 @@ void PetComponent::NotifyTamingBuildSuccess(NiPoint3 position) {
|
|||||||
|
|
||||||
LWOOBJID petSubKey = ObjectIDManager::Instance()->GenerateRandomObjectID();
|
LWOOBJID petSubKey = ObjectIDManager::Instance()->GenerateRandomObjectID();
|
||||||
|
|
||||||
petSubKey = GeneralUtils::SetBit(petSubKey, OBJECT_BIT_CHARACTER);
|
GeneralUtils::SetBit(petSubKey, eObjectBits::CHARACTER);
|
||||||
petSubKey = GeneralUtils::SetBit(petSubKey, OBJECT_BIT_PERSISTENT);
|
GeneralUtils::SetBit(petSubKey, eObjectBits::PERSISTENT);
|
||||||
|
|
||||||
m_DatabaseId = petSubKey;
|
m_DatabaseId = petSubKey;
|
||||||
|
|
||||||
@ -566,7 +571,7 @@ void PetComponent::NotifyTamingBuildSuccess(NiPoint3 position) {
|
|||||||
|
|
||||||
GameMessages::SendRegisterPetDBID(m_Tamer, petSubKey, tamer->GetSystemAddress());
|
GameMessages::SendRegisterPetDBID(m_Tamer, petSubKey, tamer->GetSystemAddress());
|
||||||
|
|
||||||
inventoryComponent->AddItem(m_Parent->GetLOT(), 1, eLootSourceType::LOOT_SOURCE_ACTIVITY, eInventoryType::MODELS, {}, LWOOBJID_EMPTY, true, false, petSubKey);
|
inventoryComponent->AddItem(m_Parent->GetLOT(), 1, eLootSourceType::ACTIVITY, eInventoryType::MODELS, {}, LWOOBJID_EMPTY, true, false, petSubKey);
|
||||||
auto* item = inventoryComponent->FindItemBySubKey(petSubKey, MODELS);
|
auto* item = inventoryComponent->FindItemBySubKey(petSubKey, MODELS);
|
||||||
|
|
||||||
if (item == nullptr) {
|
if (item == nullptr) {
|
||||||
@ -590,7 +595,7 @@ void PetComponent::NotifyTamingBuildSuccess(NiPoint3 position) {
|
|||||||
LWOOBJID_EMPTY,
|
LWOOBJID_EMPTY,
|
||||||
LWOOBJID_EMPTY,
|
LWOOBJID_EMPTY,
|
||||||
false,
|
false,
|
||||||
NOTIFY_TYPE_NAMINGPET,
|
ePetTamingNotifyType::NAMINGPET,
|
||||||
NiPoint3::ZERO,
|
NiPoint3::ZERO,
|
||||||
NiPoint3::ZERO,
|
NiPoint3::ZERO,
|
||||||
NiQuaternion::IDENTITY,
|
NiQuaternion::IDENTITY,
|
||||||
@ -670,7 +675,7 @@ void PetComponent::RequestSetPetName(std::u16string name) {
|
|||||||
m_Parent->GetObjectID(),
|
m_Parent->GetObjectID(),
|
||||||
m_Tamer,
|
m_Tamer,
|
||||||
false,
|
false,
|
||||||
NOTIFY_TYPE_SUCCESS,
|
ePetTamingNotifyType::SUCCESS,
|
||||||
NiPoint3::ZERO,
|
NiPoint3::ZERO,
|
||||||
NiPoint3::ZERO,
|
NiPoint3::ZERO,
|
||||||
NiQuaternion::IDENTITY,
|
NiQuaternion::IDENTITY,
|
||||||
@ -691,7 +696,7 @@ void PetComponent::RequestSetPetName(std::u16string name) {
|
|||||||
|
|
||||||
// Notify the end of a pet taming minigame
|
// Notify the end of a pet taming minigame
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(m_Parent)) {
|
for (CppScripts::Script* script : CppScripts::GetEntityScripts(m_Parent)) {
|
||||||
script->OnNotifyPetTamingMinigame(m_Parent, tamer, NOTIFY_TYPE_SUCCESS);
|
script->OnNotifyPetTamingMinigame(m_Parent, tamer, ePetTamingNotifyType::SUCCESS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -711,7 +716,7 @@ void PetComponent::ClientExitTamingMinigame(bool voluntaryExit) {
|
|||||||
m_Parent->GetObjectID(),
|
m_Parent->GetObjectID(),
|
||||||
m_Tamer,
|
m_Tamer,
|
||||||
false,
|
false,
|
||||||
NOTIFY_TYPE_QUIT,
|
ePetTamingNotifyType::QUIT,
|
||||||
NiPoint3::ZERO,
|
NiPoint3::ZERO,
|
||||||
NiPoint3::ZERO,
|
NiPoint3::ZERO,
|
||||||
NiQuaternion::IDENTITY,
|
NiQuaternion::IDENTITY,
|
||||||
@ -732,7 +737,7 @@ void PetComponent::ClientExitTamingMinigame(bool voluntaryExit) {
|
|||||||
|
|
||||||
// Notify the end of a pet taming minigame
|
// Notify the end of a pet taming minigame
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(m_Parent)) {
|
for (CppScripts::Script* script : CppScripts::GetEntityScripts(m_Parent)) {
|
||||||
script->OnNotifyPetTamingMinigame(m_Parent, tamer, NOTIFY_TYPE_QUIT);
|
script->OnNotifyPetTamingMinigame(m_Parent, tamer, ePetTamingNotifyType::QUIT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -762,7 +767,7 @@ void PetComponent::ClientFailTamingMinigame() {
|
|||||||
m_Parent->GetObjectID(),
|
m_Parent->GetObjectID(),
|
||||||
m_Tamer,
|
m_Tamer,
|
||||||
false,
|
false,
|
||||||
NOTIFY_TYPE_FAILED,
|
ePetTamingNotifyType::FAILED,
|
||||||
NiPoint3::ZERO,
|
NiPoint3::ZERO,
|
||||||
NiPoint3::ZERO,
|
NiPoint3::ZERO,
|
||||||
NiQuaternion::IDENTITY,
|
NiQuaternion::IDENTITY,
|
||||||
@ -783,7 +788,7 @@ void PetComponent::ClientFailTamingMinigame() {
|
|||||||
|
|
||||||
// Notify the end of a pet taming minigame
|
// Notify the end of a pet taming minigame
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(m_Parent)) {
|
for (CppScripts::Script* script : CppScripts::GetEntityScripts(m_Parent)) {
|
||||||
script->OnNotifyPetTamingMinigame(m_Parent, tamer, NOTIFY_TYPE_FAILED);
|
script->OnNotifyPetTamingMinigame(m_Parent, tamer, ePetTamingNotifyType::FAILED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -884,7 +889,7 @@ void PetComponent::Activate(Item* item, bool registerPet, bool fromTaming) {
|
|||||||
|
|
||||||
EntityManager::Instance()->SerializeEntity(m_Parent);
|
EntityManager::Instance()->SerializeEntity(m_Parent);
|
||||||
|
|
||||||
owner->GetCharacter()->SetPlayerFlag(69, true);
|
owner->GetCharacter()->SetPlayerFlag(ePlayerFlag::FIRST_MANUAL_PET_HIBERNATE, true);
|
||||||
|
|
||||||
if (registerPet) {
|
if (registerPet) {
|
||||||
GameMessages::SendAddPetToPlayer(m_Owner, 0, GeneralUtils::UTF8ToUTF16(m_Name), m_DatabaseId, m_Parent->GetLOT(), owner->GetSystemAddress());
|
GameMessages::SendAddPetToPlayer(m_Owner, 0, GeneralUtils::UTF8ToUTF16(m_Name), m_DatabaseId, m_Parent->GetLOT(), owner->GetSystemAddress());
|
||||||
@ -928,7 +933,7 @@ void PetComponent::AddDrainImaginationTimer(Item* item, bool fromTaming) {
|
|||||||
auto playerEntity = playerDestroyableComponent->GetParent();
|
auto playerEntity = playerDestroyableComponent->GetParent();
|
||||||
if (!playerEntity) return;
|
if (!playerEntity) return;
|
||||||
|
|
||||||
GameMessages::SendUseItemRequirementsResponse(playerEntity->GetObjectID(), playerEntity->GetSystemAddress(), UseItemResponse::NoImaginationForPet);
|
GameMessages::SendUseItemRequirementsResponse(playerEntity->GetObjectID(), playerEntity->GetSystemAddress(), eUseItemResponse::NoImaginationForPet);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->AddDrainImaginationTimer(item);
|
this->AddDrainImaginationTimer(item);
|
||||||
|
@ -263,7 +263,7 @@ private:
|
|||||||
/**
|
/**
|
||||||
* Flags that indicate that a player has tamed a pet, indexed by the LOT of the pet
|
* Flags that indicate that a player has tamed a pet, indexed by the LOT of the pet
|
||||||
*/
|
*/
|
||||||
static std::map<LOT, uint32_t> petFlags;
|
static std::map<LOT, int32_t> petFlags;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The ID of the component in the pet component table
|
* The ID of the component in the pet component table
|
||||||
|
@ -216,6 +216,13 @@ PhantomPhysicsComponent::PhantomPhysicsComponent(Entity* parent) : Component(par
|
|||||||
m_dpEntity->SetRotation(m_Rotation);
|
m_dpEntity->SetRotation(m_Rotation);
|
||||||
m_dpEntity->SetPosition(m_Position);
|
m_dpEntity->SetPosition(m_Position);
|
||||||
dpWorld::Instance().AddEntity(m_dpEntity);
|
dpWorld::Instance().AddEntity(m_dpEntity);
|
||||||
|
} else if (info->physicsAsset == "env\\env_won_fv_gas-blocking-volume.hkx"){
|
||||||
|
m_dpEntity = new dpEntity(m_Parent->GetObjectID(), 390.496826f, 111.467964f, 600.821534f, true);
|
||||||
|
m_dpEntity->SetScale(m_Scale);
|
||||||
|
m_dpEntity->SetRotation(m_Rotation);
|
||||||
|
m_Position.y -= (111.467964f * m_Scale) / 2;
|
||||||
|
m_dpEntity->SetPosition(m_Position);
|
||||||
|
dpWorld::Instance().AddEntity(m_dpEntity);
|
||||||
} else {
|
} else {
|
||||||
//Game::logger->Log("PhantomPhysicsComponent", "This one is supposed to have %s", info->physicsAsset.c_str());
|
//Game::logger->Log("PhantomPhysicsComponent", "This one is supposed to have %s", info->physicsAsset.c_str());
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user