[refactor] Move files to core/ and servers/ subdirectories

CNProtocol, CNShared, CNStructs and Defines are now in core/.
CNLoginServer, CNShardServer and Monitor are now in servers/.

core/Core.hpp wraps all the core headers except for CNShared.hpp.

Defines.cpp has been renamed to Packets.cpp, and so has its
corresponding namespace, but not the header file. This is in preparation
for upcoming changes.
This commit is contained in:
2021-03-17 20:07:40 +01:00
parent e9bc2fe561
commit a55a34e09a
47 changed files with 89 additions and 96 deletions

478
src/core/CNProtocol.cpp Normal file
View File

@@ -0,0 +1,478 @@
#include "core/CNProtocol.hpp"
#include "CNStructs.hpp"
#include <assert.h>
// ========================================================[[ CNSocketEncryption ]]========================================================
// literally C/P from the client and converted to C++ (does some byte swapping /shrug)
int CNSocketEncryption::Encrypt_byte_change_A(int ERSize, uint8_t* data, int size) {
int num = 0;
int num2 = 0;
int num3 = 0;
while (num + ERSize <= size) {
int num4 = num + num3;
int num5 = num + (ERSize - 1 - num3);
uint8_t b = data[num4];
data[num4] = data[num5];
data[num5] = b;
num += ERSize;
num3++;
if (num3 > ERSize / 2) {
num3 = 0;
}
}
num2 = ERSize - (num + ERSize - size);
return num + num2;
}
int CNSocketEncryption::xorData(uint8_t* buffer, uint8_t* key, int size) {
// xor every 8 bytes with 8 byte key
for (int i = 0; i < size; i++) {
buffer[i] ^= key[i % keyLength];
}
return size;
}
uint64_t CNSocketEncryption::createNewKey(uint64_t uTime, int32_t iv1, int32_t iv2) {
uint64_t num = (uint64_t)(iv1 + 1);
uint64_t num2 = (uint64_t)(iv2 + 1);
uint64_t dEKey = (uint64_t)(*(uint64_t*)&defaultKey[0]);
return dEKey * (uTime * num * num2);
}
int CNSocketEncryption::encryptData(uint8_t* buffer, uint8_t* key, int size) {
int eRSize = size % (keyLength / 2 + 1) * 2 + keyLength; // C/P from client
int size2 = xorData(buffer, key, size);
return Encrypt_byte_change_A(eRSize, buffer, size2);
}
int CNSocketEncryption::decryptData(uint8_t* buffer, uint8_t* key, int size) {
int eRSize = size % (keyLength / 2 + 1) * 2 + keyLength; // size % of 18????
int size2 = Encrypt_byte_change_A(eRSize, buffer, size);
return xorData(buffer, key, size2);
}
// ========================================================[[ CNPacketData ]]========================================================
CNPacketData::CNPacketData(void* b, uint32_t t, int l): buf(b), size(l), type(t) {}
// ========================================================[[ CNSocket ]]========================================================
CNSocket::CNSocket(SOCKET s, struct sockaddr_in &addr, PacketHandler ph): sock(s), sockaddr(addr), pHandler(ph) {
EKey = (uint64_t)(*(uint64_t*)&CNSocketEncryption::defaultKey[0]);
}
bool CNSocket::sendData(uint8_t* data, int size) {
int sentBytes = 0;
int maxTries = 10;
while (sentBytes < size) {
int sent = send(sock, (buffer_t*)(data + sentBytes), size - sentBytes, 0);
if (SOCKETERROR(sent)) {
if (OF_ERRNO == OF_EWOULD && maxTries > 0) {
maxTries--;
continue; // try again
}
printSocketError("send");
return false; // error occured while sending bytes
}
sentBytes += sent;
}
return true; // it worked!
}
void CNSocket::setEKey(uint64_t k) {
EKey = k;
}
void CNSocket::setFEKey(uint64_t k) {
FEKey = k;
}
uint64_t CNSocket::getEKey() {
return EKey;
}
uint64_t CNSocket::getFEKey() {
return FEKey;
}
bool CNSocket::isAlive() {
return alive;
}
void CNSocket::kill() {
alive = false;
#ifdef _WIN32
shutdown(sock, SD_BOTH);
closesocket(sock);
#else
shutdown(sock, SHUT_RDWR);
close(sock);
#endif
}
void CNSocket::sendPacket(void* buf, uint32_t type, size_t size) {
if (!alive)
return;
uint8_t fullpkt[CN_PACKET_BUFFER_SIZE]; // length, type, body
uint8_t* body = fullpkt + 4; // packet without length (type, body)
size_t bodysize = size + 4;
// set packet length
memcpy(fullpkt, (void*)&bodysize, 4);
// copy packet type to the front of the buffer & then the actual buffer
memcpy(body, (void*)&type, 4);
memcpy(body+4, buf, size);
// encrypt the packet
switch (activeKey) {
case SOCKETKEY_E:
CNSocketEncryption::encryptData((uint8_t*)body, (uint8_t*)(&EKey), bodysize);
break;
case SOCKETKEY_FE:
CNSocketEncryption::encryptData((uint8_t*)body, (uint8_t*)(&FEKey), bodysize);
break;
default:
DEBUGLOG(
std::cout << "[WARN]: UNSET KEYTYPE FOR SOCKET!! ABORTING SEND" << std::endl;
)
return;
}
// send packet data!
if (alive && !sendData(fullpkt, bodysize+4))
kill();
}
void CNSocket::setActiveKey(ACTIVEKEY key) {
activeKey = key;
}
void CNSocket::step() {
// read step
// XXX NOTE: we must not recv() twice without a poll() inbetween
if (readSize <= 0) {
// we aren't reading a packet yet, try to start looking for one
int recved = recv(sock, (buffer_t*)readBuffer, sizeof(int32_t), 0);
if (recved == 0) {
// the socket was closed normally
kill();
} else if (!SOCKETERROR(recved)) {
// we got our packet size!!!!
readSize = *((int32_t*)readBuffer);
// sanity check
if (readSize > CN_PACKET_BUFFER_SIZE) {
kill();
return;
}
// we'll just leave bufferIndex at 0 since we already have the packet size, it's safe to overwrite those bytes
activelyReading = true;
} else if (OF_ERRNO != OF_EWOULD) {
// serious socket issue, disconnect connection
printSocketError("recv");
kill();
return;
}
}
if (readSize > 0 && readBufferIndex < readSize) {
// read until the end of the packet! (or at least try too)
int recved = recv(sock, (buffer_t*)(readBuffer + readBufferIndex), readSize - readBufferIndex, 0);
if (recved == 0) {
// the socket was closed normally
kill();
} else if (!SOCKETERROR(recved))
readBufferIndex += recved;
else if (OF_ERRNO != OF_EWOULD) {
// serious socket issue, disconnect connection
printSocketError("recv");
kill();
return;
}
}
if (activelyReading && readBufferIndex >= readSize) {
// decrypt readBuffer and copy to CNPacketData
CNSocketEncryption::decryptData((uint8_t*)&readBuffer, (uint8_t*)(&EKey), readSize);
void* tmpBuf = readBuffer+sizeof(uint32_t);
CNPacketData tmp(tmpBuf, *((uint32_t*)readBuffer), readSize-sizeof(int32_t));
// call packet handler!!
pHandler(this, &tmp);
// reset vars :)
readSize = 0;
readBufferIndex = 0;
activelyReading = false;
}
}
void printSocketError(const char *call) {
#ifdef _WIN32
std::cerr << call << ": ";
LPSTR lpMsgBuf = nullptr; // string buffer
DWORD errCode = WSAGetLastError(); // error code
if (errCode == 0) {
std::cerr << "no error code" << std::endl;
return;
}
size_t bufSize = FormatMessageA( // actually get the error message
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errCode, // in
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf, // out
0, NULL);
// convert buffer to string and output message to terminal
std::string msg(lpMsgBuf, bufSize);
std::cerr << msg; // newline included
LocalFree(lpMsgBuf); // free the buffer
#else
perror(call);
#endif
}
bool setSockNonblocking(SOCKET listener, SOCKET newSock) {
#ifdef _WIN32
unsigned long mode = 1;
if (ioctlsocket(newSock, FIONBIO, &mode) != 0) {
#else
if (fcntl(newSock, F_SETFL, (fcntl(newSock, F_GETFL, 0) | O_NONBLOCK)) != 0) {
#endif
printSocketError("fcntl");
std::cerr << "[WARN] OpenFusion: fcntl failed on new connection" << std::endl;
#ifdef _WIN32
shutdown(newSock, SD_BOTH);
closesocket(newSock);
#else
shutdown(newSock, SHUT_RDWR);
close(newSock);
#endif
return false;
}
return true;
}
// ========================================================[[ CNServer ]]========================================================
void CNServer::init() {
// create socket file descriptor
sock = socket(AF_INET, SOCK_STREAM, 0);
if (SOCKETINVALID(sock)) {
printSocketError("socket");
std::cerr << "[FATAL] OpenFusion: socket failed" << std::endl;
exit(EXIT_FAILURE);
}
// attach socket to the port
int opt = 1;
#ifdef _WIN32
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt)) != 0) {
#else
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) != 0) {
#endif
std::cerr << "[FATAL] OpenFusion: setsockopt failed" << std::endl;
printSocketError("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(port);
addressSize = sizeof(address);
// Bind to the port
if (SOCKETERROR(bind(sock, (struct sockaddr *)&address, addressSize))) {
std::cerr << "[FATAL] OpenFusion: bind failed" << std::endl;
printSocketError("bind");
exit(EXIT_FAILURE);
}
if (SOCKETERROR(listen(sock, SOMAXCONN))) {
std::cerr << "[FATAL] OpenFusion: listen failed" << std::endl;
printSocketError("listen");
exit(EXIT_FAILURE);
}
// set server listener to non-blocking
#ifdef _WIN32
unsigned long mode = 1;
if (ioctlsocket(sock, FIONBIO, &mode) != 0) {
#else
if (fcntl(sock, F_SETFL, (fcntl(sock, F_GETFL, 0) | O_NONBLOCK)) != 0) {
#endif
printSocketError("fcntl");
std::cerr << "[FATAL] OpenFusion: fcntl failed" << std::endl;
exit(EXIT_FAILURE);
}
// poll() configuration
fds.reserve(STARTFDSCOUNT);
fds.push_back({sock, POLLIN});
}
CNServer::CNServer() {};
CNServer::CNServer(uint16_t p): port(p) {}
void CNServer::addPollFD(SOCKET s) {
fds.push_back({s, POLLIN});
}
void CNServer::removePollFD(int i) {
auto it = fds.begin();
while (it != fds.end() && it->fd != fds[i].fd)
it++;
assert(it != fds.end());
fds.erase(it);
}
void CNServer::start() {
std::cout << "Starting server at *:" << port << std::endl;
while (active) {
// the timeout is to ensure shard timers are ticking
int n = poll(fds.data(), fds.size(), 50);
if (SOCKETERROR(n)) {
#ifndef _WIN32
if (errno == EINTR)
continue;
#endif
std::cout << "[FATAL] poll() returned error" << std::endl;
printSocketError("poll");
terminate(0);
}
for (int i = 0; i < fds.size() && n > 0; i++) {
// about the same as fds[i], O(1)
std::vector<PollFD>::iterator iter = fds.begin() + i;
if ((*iter).revents == 0)
continue; // nothing in this one; don't decrement n
n--;
// is it the listener?
if ((*iter).fd == sock) {
// any sort of error on the listener
if ((*iter).revents & ~POLLIN) {
std::cout << "[FATAL] Error on listener socket" << std::endl;
terminate(0);
}
SOCKET newConnectionSocket = accept(sock, (struct sockaddr *)&address, (socklen_t*)&addressSize);
if (SOCKETINVALID(newConnectionSocket)) {
printSocketError("accept");
continue;
}
if (!setSockNonblocking(sock, newConnectionSocket))
continue;
std::cout << "New connection! " << inet_ntoa(address.sin_addr) << std::endl;
addPollFD(newConnectionSocket);
// add connection to list!
CNSocket* tmp = new CNSocket(newConnectionSocket, address, pHandler);
connections[newConnectionSocket] = tmp;
newConnection(tmp);
} else if (checkExtraSockets(i)) {
// no-op. handled in checkExtraSockets().
} else {
std::lock_guard<std::mutex> lock(activeCrit); // protect operations on connections
// player sockets
if (connections.find((*iter).fd) == connections.end()) {
std::cout << "[WARN] Event on non-existant socket?" << std::endl;
continue; // just to be safe
}
CNSocket* cSock = connections[(*iter).fd];
// kill the socket on hangup/error
if ((*iter).revents & ~POLLIN)
cSock->kill();
if (cSock->isAlive()) {
cSock->step();
} else {
killConnection(cSock);
connections.erase((*iter).fd);
delete cSock;
fds.erase(iter);
// a new entry was moved to this position, so we check it again
i--;
}
}
}
onStep();
}
}
void CNServer::kill() {
std::lock_guard<std::mutex> lock(activeCrit); // the lock will be removed when the function ends
active = false;
// kill all connections
for (auto& pair : connections) {
CNSocket *cSock = pair.second;
if (cSock->isAlive())
cSock->kill();
delete cSock;
}
connections.clear();
}
void CNServer::printPacket(CNPacketData *data, int type) {
if (settings::VERBOSITY < 2)
return;
if (settings::VERBOSITY < 3) switch (data->type) {
case P_CL2LS_REP_LIVE_CHECK:
case P_CL2FE_REP_LIVE_CHECK:
case P_CL2FE_REQ_PC_MOVE:
case P_CL2FE_REQ_PC_JUMP:
case P_CL2FE_REQ_PC_SLOPE:
case P_CL2FE_REQ_PC_MOVEPLATFORM:
case P_CL2FE_REQ_PC_MOVETRANSPORTATION:
case P_CL2FE_REQ_PC_ZIPLINE:
case P_CL2FE_REQ_PC_JUMPPAD:
case P_CL2FE_REQ_PC_LAUNCHER:
case P_CL2FE_REQ_PC_STOP:
return;
}
std::cout << "OpenFusion: received " << Packets::p2str(type, data->type) << " (" << data->type << ")" << std::endl;
}
bool CNServer::checkExtraSockets(int i) { return false; } // stubbed
void CNServer::newConnection(CNSocket* cns) {} // stubbed
void CNServer::killConnection(CNSocket* cns) {} // stubbed
void CNServer::onStep() {} // stubbed

233
src/core/CNProtocol.hpp Normal file
View File

@@ -0,0 +1,233 @@
#pragma once
#define DEBUGLOG(x) if (settings::VERBOSITY) {x};
#include <iostream>
#include <stdio.h>
#include <stdint.h>
#ifdef _WIN32
// windows
#ifndef NOMINMAX
#define NOMINMAX
#endif
#define M_PI 3.14159265358979323846
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
typedef char buffer_t;
#define PollFD WSAPOLLFD
#define poll WSAPoll
#define OF_ERRNO WSAGetLastError()
#define OF_EWOULD WSAEWOULDBLOCK
#define SOCKETINVALID(x) (x == INVALID_SOCKET)
#define SOCKETERROR(x) (x == SOCKET_ERROR)
#else
// posix platform
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <poll.h>
#include <unistd.h>
#include <errno.h>
typedef int SOCKET;
typedef void buffer_t;
#define PollFD struct pollfd
#define OF_ERRNO errno
#define OF_EWOULD EWOULDBLOCK
#define SOCKETINVALID(x) (x < 0)
#define SOCKETERROR(x) (x == -1)
#endif
#include <fcntl.h>
#include <string>
#include <cstring>
#include <csignal>
#include <list>
#include <queue>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include "Defines.hpp"
#include "settings.hpp"
#if defined(__MINGW32__) && !defined(_GLIBCXX_HAS_GTHREADS)
#include "mingw/mingw.mutex.h"
#else
#include <mutex>
#endif
/*
* Packets format (sent from the client):
* [4 bytes] - size of packet including the 4 byte packet type
* [size bytes] - Encrypted packet (byte swapped && xor'd with 8 byte key; see CNSocketEncryption)
* [4 bytes] - packet type (which is a combination of the first 4 bytes of the packet and a checksum in some versions)
* [structure] - one member contains length of trailing data (expressed in packet-dependant structures)
* [trailing data] - optional variable-length data that only some packets make use of
*/
// error checking calloc wrapper
inline void* xmalloc(size_t sz) {
void* res = calloc(1, sz);
if (res == NULL) {
std::cerr << "[FATAL] OpenFusion: out of memory!" << std::endl;
exit(EXIT_FAILURE);
}
return res;
}
// overflow-safe validation of variable-length packets
// for outbound packets
inline bool validOutVarPacket(size_t base, int32_t npayloads, size_t plsize) {
// check for multiplication overflow
if (npayloads > 0 && (CN_PACKET_BUFFER_SIZE - 8) / (size_t)npayloads < plsize)
return false;
// it's safe to multiply
size_t trailing = npayloads * plsize;
// does it fit in a packet?
if (base + trailing > CN_PACKET_BUFFER_SIZE - 8)
return false;
// everything is a-ok!
return true;
}
// for inbound packets
inline bool validInVarPacket(size_t base, int32_t npayloads, size_t plsize, size_t datasize) {
// check for multiplication overflow
if (npayloads > 0 && (CN_PACKET_BUFFER_SIZE - 8) / (size_t)npayloads < plsize)
return false;
// it's safe to multiply
size_t trailing = npayloads * plsize;
// make sure size is exact
// datasize has already been validated against CN_PACKET_BUFFER_SIZE
if (datasize != base + trailing)
return false;
// everything is a-ok!
return true;
}
void printSocketError(const char *func);
bool setSockNonblocking(SOCKET listener, SOCKET newSock);
namespace CNSocketEncryption {
// you won't believe how complicated they made it in the client :facepalm:
static constexpr const char* defaultKey = "m@rQn~W#";
static const unsigned int keyLength = 8;
int Encrypt_byte_change_A(int ERSize, uint8_t* data, int size);
int xorData(uint8_t* buffer, uint8_t* key, int size);
uint64_t createNewKey(uint64_t uTime, int32_t iv1, int32_t iv2);
int encryptData(uint8_t* buffer, uint8_t* key, int size);
int decryptData(uint8_t* buffer, uint8_t* key, int size);
}
struct CNPacketData {
void* buf;
int size;
uint32_t type;
CNPacketData(void* b, uint32_t t, int l);
};
enum ACTIVEKEY {
SOCKETKEY_E,
SOCKETKEY_FE
};
class CNSocket;
typedef void (*PacketHandler)(CNSocket* sock, CNPacketData* data);
class CNSocket {
private:
uint64_t EKey;
uint64_t FEKey;
int32_t readSize = 0;
uint8_t readBuffer[CN_PACKET_BUFFER_SIZE];
int readBufferIndex = 0;
bool activelyReading = false;
bool alive = true;
ACTIVEKEY activeKey;
bool sendData(uint8_t* data, int size);
int recvData(buffer_t* data, int size);
public:
SOCKET sock;
sockaddr_in sockaddr;
PacketHandler pHandler;
CNSocket(SOCKET s, struct sockaddr_in &addr, PacketHandler ph);
void setEKey(uint64_t k);
void setFEKey(uint64_t k);
uint64_t getEKey();
uint64_t getFEKey();
void setActiveKey(ACTIVEKEY t);
void kill();
void sendPacket(void* buf, uint32_t packetType, size_t size);
void step();
bool isAlive();
};
class CNServer;
typedef void (*TimerHandler)(CNServer* serv, time_t time);
// timer struct
struct TimerEvent {
TimerHandler handlr;
time_t delta; // time to be added to the current time on reset
time_t scheduledEvent; // time to call handlr()
TimerEvent(TimerHandler h, time_t d): handlr(h), delta(d) {
scheduledEvent = 0;
}
};
// in charge of accepting new connections and making sure each connection is kept alive
class CNServer {
protected:
std::unordered_map<SOCKET, CNSocket*> connections;
std::mutex activeCrit;
const size_t STARTFDSCOUNT = 8; // number of initial PollFD slots
std::vector<PollFD> fds;
SOCKET sock;
uint16_t port;
socklen_t addressSize;
struct sockaddr_in address;
void init();
bool active = true;
public:
PacketHandler pHandler;
CNServer();
CNServer(uint16_t p);
void addPollFD(SOCKET s);
void removePollFD(int i);
void start();
void kill();
static void printPacket(CNPacketData *data, int type);
virtual bool checkExtraSockets(int i);
virtual void newConnection(CNSocket* cns);
virtual void killConnection(CNSocket* cns);
virtual void onStep();
};

27
src/core/CNShared.cpp Normal file
View File

@@ -0,0 +1,27 @@
#include "core/CNShared.hpp"
#if defined(__MINGW32__) && !defined(_GLIBCXX_HAS_GTHREADS)
#include "mingw/mingw.mutex.h"
#else
#include <mutex>
#endif
std::map<int64_t, Player> CNSharedData::players;
std::mutex playerCrit;
void CNSharedData::setPlayer(int64_t sk, Player& plr) {
std::lock_guard<std::mutex> lock(playerCrit); // the lock will be removed when the function ends
players[sk] = plr;
}
Player CNSharedData::getPlayer(int64_t sk) {
std::lock_guard<std::mutex> lock(playerCrit); // the lock will be removed when the function ends
return players[sk];
}
void CNSharedData::erasePlayer(int64_t sk) {
std::lock_guard<std::mutex> lock(playerCrit); // the lock will be removed when the function ends
players.erase(sk);
}

20
src/core/CNShared.hpp Normal file
View File

@@ -0,0 +1,20 @@
/*
* core/CNShared.hpp
* There's some data shared between the Login Server and the Shard Server. Of course all of this needs to be thread-safe. No mucking about on this one!
*/
#pragma once
#include <map>
#include <string>
#include "Player.hpp"
namespace CNSharedData {
// serialkey corresponds to player data
extern std::map<int64_t, Player> players;
void setPlayer(int64_t sk, Player& plr);
Player getPlayer(int64_t sk);
void erasePlayer(int64_t sk);
}

59
src/core/CNStructs.hpp Normal file
View File

@@ -0,0 +1,59 @@
/*
* CNStructs.hpp - defines some basic structs & useful methods for packets used by FusionFall based on the version defined
*/
#pragma once
#ifdef _MSC_VER
// codecvt_* is deprecated in C++17 and MSVC will throw an annoying warning because of that.
// Defining this before anything else to silence it.
#define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING
#endif
#include <iostream>
#include <stdio.h>
#include <stdint.h>
#ifndef _MSC_VER
#include <sys/time.h>
#else
// Can't use this in MSVC.
#include <time.h>
#endif
#include <cstring>
#include <string>
#include <locale>
#include <codecvt>
// yes this is ugly, but this is needed to zero out the memory so we don't have random stackdata in our structs.
#define INITSTRUCT(T, x) T x; \
memset(&x, 0, sizeof(T));
// macros to extract fields from instanceIDs
#define MAPNUM(x) ((x) & 0xffffffff)
#define PLAYERID(x) ((x) >> 32)
// typedef for chunk position tuple
typedef std::tuple<int, int, uint64_t> ChunkPos;
// TODO: rewrite U16toU8 & U8toU16 to not use codecvt
std::string U16toU8(char16_t* src);
size_t U8toU16(std::string src, char16_t* des, size_t max); // returns number of char16_t that was written at des
time_t getTime();
time_t getTimestamp();
void terminate(int);
// The PROTOCOL_VERSION definition is defined by the build system.
#if !defined(PROTOCOL_VERSION)
#include "structs/0104.hpp"
#elif PROTOCOL_VERSION == 728
#include "structs/0728.hpp"
#elif PROTOCOL_VERSION == 104
#include "structs/0104.hpp"
#elif PROTOCOL_VERSION == 1013
#include "structs/1013.hpp"
#else
#error Invalid PROTOCOL_VERSION
#endif
sSYSTEMTIME timeStampToStruct(uint64_t time);

11
src/core/Core.hpp Normal file
View File

@@ -0,0 +1,11 @@
#pragma once
/*
* Convenience header.
*
* We omit CNShared, as it's only relevant to the Login and Shard servers
* and the PlayerManager. We omit Defines, as CNProtocol already includes it.
*/
#include "core/CNProtocol.hpp"
#include "core/CNStructs.hpp"

946
src/core/Defines.hpp Normal file
View File

@@ -0,0 +1,946 @@
/* enum definitions from the client */
#pragma once
// floats
const float VALUE_BATTERY_EMPTY_PENALTY = 0.5f;
const float CN_EP_RANK_1 = 0.8f;
const float CN_EP_RANK_2 = 0.7f;
const float CN_EP_RANK_3 = 0.5f;
const float CN_EP_RANK_4 = 0.3f;
const float CN_EP_RANK_5 = 0.29f;
// methods of finding players for GM commands
enum eCN_GM_TargetSearchBy {
eCN_GM_TargetSearchBy__PC_ID, // player id
eCN_GM_TargetSearchBy__PC_Name, // firstname, lastname
eCN_GM_TargetSearchBy__PC_UID // account id
};
enum eCN_GM_TeleportType {
eCN_GM_TeleportMapType__XYZ,
eCN_GM_TeleportMapType__MapXYZ,
eCN_GM_TeleportMapType__MyLocation,
eCN_GM_TeleportMapType__SomeoneLocation,
eCN_GM_TeleportMapType__Unstick
};
// NPC classes
enum NPCClass {
NPC_BASE = 0,
NPC_MOB = 1,
NPC_BUS = 2,
NPC_EGG = 3
};
// nano powers
enum {
EST_NONE = 0,
EST_DAMAGE = 1,
EST_HEAL_HP = 2,
EST_KNOCKDOWN = 3,
EST_SLEEP = 4,
EST_SNARE = 5,
EST_HEAL_STAMINA = 6,
EST_STAMINA_SELF = 7,
EST_STUN = 8,
EST_WEAPONSLOW = 9,
EST_JUMP = 10,
EST_RUN = 11,
EST_STEALTH = 12,
EST_SWIM = 13,
EST_MINIMAPENEMY = 14,
EST_MINIMAPTRESURE = 15,
EST_PHOENIX = 16,
EST_PROTECTBATTERY = 17,
EST_PROTECTINFECTION = 18,
EST_REWARDBLOB = 19,
EST_REWARDCASH = 20,
EST_BATTERYDRAIN = 21,
EST_CORRUPTIONATTACK = 22,
EST_INFECTIONDAMAGE = 23,
EST_KNOCKBACK = 24,
EST_FREEDOM = 25,
EST_PHOENIX_GROUP = 26,
EST_RECALL = 27,
EST_RECALL_GROUP = 28,
EST_RETROROCKET_SELF = 29,
EST_BLOODSUCKING = 30,
EST_BOUNDINGBALL = 31,
EST_INVULNERABLE = 32,
EST_NANOSTIMPAK = 33,
EST_RETURNHOMEHEAL = 34,
EST_BUFFHEAL = 35,
EST_EXTRABANK = 36,
EST__END = 37,
EST_CORRUPTIONATTACKWIN = 38,
EST_CORRUPTIONATTACKLOSE = 39,
ECSB_NONE = 0,
ECSB_UP_MOVE_SPEED = 1,
ECSB_UP_SWIM_SPEED = 2,
ECSB_UP_JUMP_HEIGHT = 3,
ECSB_UP_STEALTH = 4,
ECSB_PHOENIX = 5,
ECSB_PROTECT_BATTERY = 6,
ECSB_PROTECT_INFECTION = 7,
ECSB_DN_MOVE_SPEED = 8,
ECSB_DN_ATTACK_SPEED = 9,
ECSB_STUN = 10,
ECSB_MEZ = 11,
ECSB_KNOCKDOWN = 12,
ECSB_MINIMAP_ENEMY = 13,
ECSB_MINIMAP_TRESURE = 14,
ECSB_REWARD_BLOB = 15,
ECSB_REWARD_CASH = 16,
ECSB_INFECTION = 17,
ECSB_FREEDOM = 18,
ECSB_BOUNDINGBALL = 19,
ECSB_INVULNERABLE = 20,
ECSB_STIMPAKSLOT1 = 21,
ECSB_STIMPAKSLOT2 = 22,
ECSB_STIMPAKSLOT3 = 23,
ECSB_HEAL = 24,
ECSB_EXTRABANK = 25,
ECSTB__END = 26,
};
enum {
SUCC = 1,
FAIL = 0,
SIZEOF_BYTE = 1,
SIZEOF_DWORD = 4,
SIZEOF_INT = 4,
SIZEOF_FLOAT = 4,
SIZEOF_SHORT = 2,
SIZEOF_ULONG = 4,
SIZEOF_UINT64 = 8,
SIZEOF_IP_STRING = 16,
SIZEOF_CN_UID_STRING = 50,
SIZEOF_ACCOUNT_STRING = 33,
SIZEOF_PASSWORD_STRING = 33,
SIZEOF_AUTH_ID_STRING = 255,
CN_MAX_COUNT_GROUP_MEMBER = 5,
CN_MAX_COUNT_PC_GROUP_MEMBER = 4,
CN_MAX_COUNT_NPC_GROUP_MEMBER = 5,
CHAT_MAX_STRING = 128,
PC_START_LOCATION_RANDOM_RANGE = 10000,
SIZEOF_ANNOUNCE_STRING = 512,
SERVER_COUNT_SHARD_CLIENT = 25,
EXIT_CODE_DISCONNECT = 0,
EXIT_CODE_REQ_BY_PC = 1,
EXIT_CODE_REQ_BY_SVR = 2,
EXIT_CODE_REQ_BY_GM = 3,
EXIT_CODE_HACK = 4,
EXIT_CODE_ERROR = 5,
EXIT_CODE_LIVE_CHECK = 6,
EXIT_CODE_REQ_BY_PC_DUPE_LOGIN = 7,
EXIT_CODE_SERVER_ERROR = 99,
SIZEOF_USER_ID = 32,
SIZEOF_USER_PW = 32,
SIZEOF_PC_SLOT = 4,
SIZEOF_PC_NAME = 16,
SIZEOF_PC_FIRST_NAME = 9,
SIZEOF_PC_LAST_NAME = 17,
SIZEOF_PC_NAME_FLAG = 8,
GENDER_NONE = 0,
GENDER_MALE = 1,
GENDER_FEMALE = 2,
MENTOR_CHANGE_BASE_COST = 100,
REPEAT_MISSION_RESET_TIME = 9,
SIZEOF_REPEAT_QUESTFLAG_NUMBER = 8,
FATIGUE_RESET_TIME = 0,
PC_FATIGUE_KILL_UNIT = 7,
PC_FATIGUE_1_LEVEL = 11420,
PC_FATIGUE_2_LEVEL = 6480,
PC_FATIGUE_MAX_LEVEL = 2,
PC_FUSIONMATTER_MAX = 999999999,
PC_CANDY_MAX = 999999999,
PC_BATTERY_MAX = 9999,
PC_LEVEL_MAX = 36,
SIZEOF_PC_BULLET_SLOT = 3,
PC_TICK_TIME = 5000,
SIZEOF_EQUIP_SLOT = 9,
EQUIP_SLOT_HAND = 0,
EQUIP_SLOT_UPPERBODY = 1,
EQUIP_SLOT_LOWERBODY = 2,
EQUIP_SLOT_FOOT = 3,
EQUIP_SLOT_HEAD = 4,
EQUIP_SLOT_FACE = 5,
EQUIP_SLOT_BACK = 6,
EQUIP_SLOT_END = 6,
EQUIP_SLOT_HAND_EX = 7,
EQUIP_SLOT_VEHICLE = 8,
WPN_EQUIP_TYPE_NONE = 0,
WPN_EQUIP_TYPE_OH_BLADE = 1,
WPN_EQUIP_TYPE_OH_CLUB = 2,
WPN_EQUIP_TYPE_OH_PISTOL = 3,
WPN_EQUIP_TYPE_OH_RIPLE = 4,
WPN_EQUIP_TYPE_OH_THROW = 5,
WPN_EQUIP_TYPE_DH_BLADE = 6,
WPN_EQUIP_TYPE_DH_CLUB = 7,
WPN_EQUIP_TYPE_DH_DPISTOL = 8,
WPN_EQUIP_TYPE_DH_RIPLE = 9,
WPN_EQUIP_TYPE_DH_THROW = 10,
WPN_EQUIP_TYPE_DH_ROCKET = 11,
SIZEOF_INVEN_SLOT = 50,
SIZEOF_QINVEN_SLOT = 50,
SIZEOF_BANK_SLOT = 119,
SIZEOF_RESTORE_SLOT = 5,
SIZEOF_NANO_BANK_SLOT = 37,
SIZEOF_QUEST_SLOT = 1024,
NANO_QUEST_INDEX = 0,
SIZEOF_RQUEST_SLOT = 9,
SIZEOF_QUESTFLAG_NUMBER = 32,
SIZEOF_EP_RECORD_SLOT = 51,
SIZEOF_TRADE_SLOT = 12,
SIZEOF_VENDOR_TABLE_SLOT = 20,
SIZEOF_VENDOR_RESTORE_SLOT = 5,
SIZEOF_QUEST_NPC_SLOT = 3,
SIZEOF_QUEST_ITEM_SLOT = 3,
SIZEOF_MAX_ITEM_STACK = 100,
SIZEOF_PC_SKILL_SLOT = 33,
SIZEOF_QUICK_SLOT = 8,
ENCHANT_WEAPON_MATERIAL_ID = 101,
ENCHANT_DEFENCE_MATERIAL_ID = 102,
SIZEOF_NANO_CARRY_SLOT = 3,
COUNTOF_NANO_PER_SET = 3,
SIZEOF_NANO_SET = 13,
SIZEOF_NANO_STYLE = 3,
NANO_STYLE_NONE = 1,
NANO_STYLE_CRYSTAL = 0,
NANO_STYLE_ENERGY = 1,
NANO_STYLE_FLUID = 2,
SIZEOF_NANO_TYPE = 4,
NANO_TYPE_POWER = 0,
NANO_TYPE_ACCURACY = 1,
NANO_TYPE_PROTECT = 2,
NANO_TYPE_DODGE = 3,
SIZEOF_NANO_TUNE_NEED_ITEM_SLOT = 10,
VALUE_ATTACK_MISS = 1,
MSG_ONLINE = 1,
MSG_BUSY = 2,
MSG_OFFLINE = 0,
SIZEOF_FREE_CHAT_STRING = 128,
SIZEOF_MENU_CHAT_STRING = 128,
SIZEOF_BUDDYLIST_SLOT = 50,
SIZEOF_EMAIL_SUBJECT_STRING = 32,
SIZEOF_EMAIL_CONTENT_STRING = 512,
SIZEOF_EMAIL_PAGE_SIZE = 5,
SIZEOF_EMAIL_ITEM_CNT = 4,
EMAIL_AND_MONEY_COST = 50,
EMAIL_ITEM_COST = 20,
BUDDYWARP_INTERVAL = 60,
EMAILSEND_TIME_DELAY = 60,
DB_ERROR_INVALID_DATA = 1,
DB_ERROR_HACK_ATTEMPT = 2,
DB_ERROR_ACCESS_FAIL = 3,
DB_ERROR_PC_INSERT_FAIL = 4,
CALL_NPC_MAX_CNT = 2048,
CN_EP_RING_MAX_CNT = 999,
HF_BIT_NONE = 0,
HF_BIT_NORMAL = 1,
HF_BIT_CRITICAL = 2,
HF_BIT_STYLE_WIN = 4,
HF_BIT_STYLE_TIE = 8,
HF_BIT_STYLE_LOSE = 16,
SKIN_COLOR_MAX = 12,
HAIR_COLOR_MAX = 18,
EYE_COLOR_MAX = 5,
BODY_TYPE_MAX = 3,
HEIGHT_TYPE_MAX = 5,
CLASS_TYPE_MAX = 4,
CN_EP_RACE_MODE_PRACTICE = 0,
CN_EP_RACE_MODE_RECORD = 1,
CN_EP_SECOM_NPC_TYPE_NUM = 13,
CN_EP_EECOM_NPC_TYPE_NUM = 14,
CN_EP_SIZE_SMALL = 0,
CN_EP_SIZE_MIDDLE = 1,
CN_EP_SIZE_BIG = 2,
CN_EP_TICKET_ITEM_ID_SMALL = 115,
CN_EP_TICKET_ITEM_ID_MIDDLE = 116,
CN_EP_TICKET_ITEM_ID_BIG = 117,
CN_EP_TICKET_ITEM_ID_FREE = 118,
CN_EP_DISTANCE_ERROR_SAFE_RANGE = 1200,
CN_ACCOUNT_LEVEL__MASTER = 1,
CN_ACCOUNT_LEVEL__POWER_DEVELOPER = 10,
CN_ACCOUNT_LEVEL__QA = 20,
CN_ACCOUNT_LEVEL__GM = 30,
CN_ACCOUNT_LEVEL__CS = 40,
CN_ACCOUNT_LEVEL__FREE_USER = 48,
CN_ACCOUNT_LEVEL__PAY_USER = 49,
CN_ACCOUNT_LEVEL__DEVELOPER = 50,
CN_ACCOUNT_LEVEL__CLOSEBETA_USER = 80,
CN_ACCOUNT_LEVEL__OPENBETA_USER = 85,
CN_ACCOUNT_LEVEL__USER = 99,
CN_SPECIAL_STATE_FLAG__PRINT_GM = 1,
CN_SPECIAL_STATE_FLAG__INVISIBLE = 2,
CN_SPECIAL_STATE_FLAG__INVULNERABLE = 4,
CN_SPECIAL_STATE_FLAG__FULL_UI = 16,
CN_SPECIAL_STATE_FLAG__COMBAT = 32,
CN_SPECIAL_STATE_FLAG__MUTE_FREECHAT = 64,
CN_GM_SET_VALUE_TYPE__HP = 1,
CN_GM_SET_VALUE_TYPE__WEAPON_BATTERY = 2,
CN_GM_SET_VALUE_TYPE__NANO_BATTERY = 3,
CN_GM_SET_VALUE_TYPE__FUSION_MATTER = 4,
CN_GM_SET_VALUE_TYPE__CANDY = 5,
CN_GM_SET_VALUE_TYPE__SPEED = 6,
CN_GM_SET_VALUE_TYPE__JUMP = 7,
CN_GM_SET_VALUE_TYPE__END = 8,
HEIGHT_CLIMBABLE = 150,
CN_GROUP_WARP_CHECK_RANGE = 1000,
WYVERN_LOCATION_FLAG_SIZE = 2,
CN_PC_EVENT_ID_GET_NANO_QUEST = 1,
CN_PC_EVENT_ID_DEFEAT_FUSE_AND_GET_NANO = 2,
_dCN_STREETSTALL__ITEMLIST_COUNT_MAX = 5,
CSB_BIT_NONE = 0, // 0
CSB_BIT_UP_MOVE_SPEED = 0x1, // 1
CSB_BIT_UP_SWIM_SPEED = 0x2, // 2
CSB_BIT_UP_JUMP_HEIGHT = 0x4, // 4
CSB_BIT_UP_STEALTH = 0x8, // 8
CSB_BIT_PHOENIX = 0x10, // 16
CSB_BIT_PROTECT_BATTERY = 0x20, // 32
CSB_BIT_PROTECT_INFECTION = 0x40, // 64
CSB_BIT_DN_MOVE_SPEED = 0x80, // 128
CSB_BIT_DN_ATTACK_SPEED = 0x100, // 256
CSB_BIT_STUN = 0x200, // 512
CSB_BIT_MEZ = 0x400, // 1024
CSB_BIT_KNOCKDOWN = 0x800, // 2048
CSB_BIT_MINIMAP_ENEMY = 0x1000, // 4096
CSB_BIT_MINIMAP_TRESURE = 0x2000, // 8192
CSB_BIT_REWARD_BLOB = 0x4000, // 16384
CSB_BIT_REWARD_CASH = 0x8000, // 32768
CSB_BIT_INFECTION = 0x10000, // 65536
CSB_BIT_FREEDOM = 0x20000, // 131072
CSB_BIT_BOUNDINGBALL = 0x40000, // 262144
CSB_BIT_INVULNERABLE = 0x80000, // 524288
CSB_BIT_STIMPAKSLOT1 = 0x100000, // 1048576
CSB_BIT_STIMPAKSLOT2 = 0x200000, // 2097152
CSB_BIT_STIMPAKSLOT3 = 0x400000, // 4194304
CSB_BIT_HEAL = 0x800000, // 8388608
CSB_BIT_EXTRABANK = 0x1000000, // 16777216
TIME_BUFF_CONFIRM_KEY_MAX = 2000000000,
READPACKET_SUCC = 0,
READPACKET_FAIL = 1,
READPACKET_RETURN = 2,
BITMASK_FROM2TO = 0x7fffffff, // 2147483647
BITMASK_FROM = 0x7fffffff, // 2147483647
BITMASK_TO = 0xf000000, // 251658240
BITMASK_SENDBLOCK = 0x800000, // 8388608
BITMASK_AUTHED = 0x400000, // 4194304
BITMASK_U_ID = 0xfff, // 4095
CL2LS = 0x12000000,
CL2FE = 0x13000000,
LS2CL = 0x21000000,
LS2LS = 0x22000000,
LS2DBA = 0x27000000,
FE2CL = 0x31000000,
FE2FE = 0x33000000,
FE2GS = 0x34000000,
FE2EP = 0x36000000,
FE2MSG = 0x38000000,
GS2FE = 0x43000000,
GS2GS = 0x44000000,
GS2AI = 0x45000000,
GS2EP = 0x46000000,
GS2DBA = 0x47000000,
GS2MSG = 0x48000000,
GS2MGR = 0x4a000000,
AI2GS = 0x54000000,
EP2FE = 0x63000000,
EP2GS = 0x64000000,
DBA2GS = 0x74000000,
DBA2EP = 0x75000000,
MSG2FE = 0x7fffffff,
MSG2GS = 0x7fffffff,
MSG2CMSG = 0x7fffffff,
CMSG2MSG = 0x7fffffff,
MGR2SPY = 0x7fffffff,
SPY2MGR = 0x7fffffff,
MGR2SA = 0x7fffffff,
SA2MGR = 0x7fffffff,
SA2SPY = 0x7fffffff,
SPY2SA = 0x7fffffff,
SPY2SVR = 0x7fffffff,
SVR2SPY = 0x7fffffff,
SCH2SVR = 0x7fffffff,
SCH2LS = 0x7fffffff,
SCH2FE = 0x7fffffff,
SCH2GS = 0x7fffffff,
SCH2AI = 0x7fffffff,
SCH2EP = 0x7fffffff,
SCH2DBA = 0x7fffffff,
SCH2MSG = 0x7fffffff,
SCH2CMSG = 0x7fffffff,
CL2CDR = 0x1f000000,
SENDBLOCK = 0x800000, // 8388608
AUTHED_X = 0, // 0
AUTHED_O = 0x400000, // 4194304
SEND_SVR_FE = 1,
SEND_SVR_FE_ANY = 2,
SEND_SVR_FE_ALL = 3,
SEND_SVR_AI = 4,
SEND_SVR_AI_ANY = 5,
SEND_SVR_AI_ALL = 6,
SEND_SVR_FE_AI_ALL = 7,
SEND_SVR_DBA = 8,
SEND_SVR_GS = 9,
SEND_SVR_MSG = 10,
SEND_SVR_MSG_ANY = 11,
SEND_SVR_MSG_ALL = 12,
SEND_UNICAST = 1,
SEND_ANYCAST = 2,
SEND_ANYCAST_NEW = 3,
SEND_BROADCAST = 4,
CN_PACKET_BUFFER_SIZE = 4096,
P_CL2LS_REQ_LOGIN = 0x12000001, // 301989889
P_CL2LS_REQ_CHECK_CHAR_NAME = 0x12000002, // 301989890
P_CL2LS_REQ_SAVE_CHAR_NAME = 0x12000003, // 301989891
P_CL2LS_REQ_CHAR_CREATE = 0x12000004, // 301989892
P_CL2LS_REQ_CHAR_SELECT = 0x12000005, // 301989893
P_CL2LS_REQ_CHAR_DELETE = 0x12000006, // 301989894
P_CL2LS_REQ_SHARD_SELECT = 0x12000007, // 301989895
P_CL2LS_REQ_SHARD_LIST_INFO = 0x12000008, // 301989896
P_CL2LS_CHECK_NAME_LIST = 0x12000009, // 301989897
P_CL2LS_REQ_SAVE_CHAR_TUTOR = 0x1200000a, // 301989898
P_CL2LS_REQ_PC_EXIT_DUPLICATE = 0x1200000b, // 301989899
P_CL2LS_REP_LIVE_CHECK = 0x1200000c, // 301989900
P_CL2LS_REQ_CHANGE_CHAR_NAME = 0x1200000d, // 301989901
P_CL2LS_REQ_SERVER_SELECT = 0x1200000e, // 301989902
P_CL2FE_REQ_PC_ENTER = 0x13000001, // 318767105
P_CL2FE_REQ_PC_EXIT = 0x13000002, // 318767106
P_CL2FE_REQ_PC_MOVE = 0x13000003, // 318767107
P_CL2FE_REQ_PC_STOP = 0x13000004, // 318767108
P_CL2FE_REQ_PC_JUMP = 0x13000005, // 318767109
P_CL2FE_REQ_PC_ATTACK_NPCs = 0x13000006, // 318767110
P_CL2FE_REQ_SEND_FREECHAT_MESSAGE = 0x13000007, // 318767111
P_CL2FE_REQ_SEND_MENUCHAT_MESSAGE = 0x13000008, // 318767112
P_CL2FE_REQ_PC_REGEN = 0x13000009, // 318767113
P_CL2FE_REQ_ITEM_MOVE = 0x1300000a, // 318767114
P_CL2FE_REQ_PC_TASK_START = 0x1300000b, // 318767115
P_CL2FE_REQ_PC_TASK_END = 0x1300000c, // 318767116
P_CL2FE_REQ_NANO_EQUIP = 0x1300000d, // 318767117
P_CL2FE_REQ_NANO_UNEQUIP = 0x1300000e, // 318767118
P_CL2FE_REQ_NANO_ACTIVE = 0x1300000f, // 318767119
P_CL2FE_REQ_NANO_TUNE = 0x13000010, // 318767120
P_CL2FE_REQ_NANO_SKILL_USE = 0x13000011, // 318767121
P_CL2FE_REQ_PC_TASK_STOP = 0x13000012, // 318767122
P_CL2FE_REQ_PC_TASK_CONTINUE = 0x13000013, // 318767123
P_CL2FE_REQ_PC_GOTO = 0x13000014, // 318767124
P_CL2FE_REQ_CHARGE_NANO_STAMINA = 0x13000015, // 318767125
P_CL2FE_REQ_PC_KILL_QUEST_NPCs = 0x13000016, // 318767126
P_CL2FE_REQ_PC_VENDOR_ITEM_BUY = 0x13000017, // 318767127
P_CL2FE_REQ_PC_VENDOR_ITEM_SELL = 0x13000018, // 318767128
P_CL2FE_REQ_PC_ITEM_DELETE = 0x13000019, // 318767129
P_CL2FE_REQ_PC_GIVE_ITEM = 0x1300001a, // 318767130
P_CL2FE_REQ_PC_ROCKET_STYLE_READY = 0x1300001b, // 318767131
P_CL2FE_REQ_PC_ROCKET_STYLE_FIRE = 0x1300001c, // 318767132
P_CL2FE_REQ_PC_ROCKET_STYLE_HIT = 0x1300001d, // 318767133
P_CL2FE_REQ_PC_GRENADE_STYLE_READY = 0x1300001e, // 318767134
P_CL2FE_REQ_PC_GRENADE_STYLE_FIRE = 0x1300001f, // 318767135
P_CL2FE_REQ_PC_GRENADE_STYLE_HIT = 0x13000020, // 318767136
P_CL2FE_REQ_PC_NANO_CREATE = 0x13000021, // 318767137
P_CL2FE_REQ_PC_TRADE_OFFER = 0x13000022, // 318767138
P_CL2FE_REQ_PC_TRADE_OFFER_CANCEL = 0x13000023, // 318767139
P_CL2FE_REQ_PC_TRADE_OFFER_ACCEPT = 0x13000024, // 318767140
P_CL2FE_REQ_PC_TRADE_OFFER_REFUSAL = 0x13000025, // 318767141
P_CL2FE_REQ_PC_TRADE_OFFER_ABORT = 0x13000026, // 318767142
P_CL2FE_REQ_PC_TRADE_CONFIRM = 0x13000027, // 318767143
P_CL2FE_REQ_PC_TRADE_CONFIRM_CANCEL = 0x13000028, // 318767144
P_CL2FE_REQ_PC_TRADE_CONFIRM_ABORT = 0x13000029, // 318767145
P_CL2FE_REQ_PC_TRADE_ITEM_REGISTER = 0x1300002a, // 318767146
P_CL2FE_REQ_PC_TRADE_ITEM_UNREGISTER = 0x1300002b, // 318767147
P_CL2FE_REQ_PC_TRADE_CASH_REGISTER = 0x1300002c, // 318767148
P_CL2FE_REQ_PC_TRADE_EMOTES_CHAT = 0x1300002d, // 318767149
P_CL2FE_REQ_PC_BANK_OPEN = 0x1300002e, // 318767150
P_CL2FE_REQ_PC_BANK_CLOSE = 0x1300002f, // 318767151
P_CL2FE_REQ_PC_VENDOR_START = 0x13000030, // 318767152
P_CL2FE_REQ_PC_VENDOR_TABLE_UPDATE = 0x13000031, // 318767153
P_CL2FE_REQ_PC_VENDOR_ITEM_RESTORE_BUY = 0x13000032, // 318767154
P_CL2FE_REQ_PC_COMBAT_BEGIN = 0x13000033, // 318767155
P_CL2FE_REQ_PC_COMBAT_END = 0x13000034, // 318767156
P_CL2FE_REQ_REQUEST_MAKE_BUDDY = 0x13000035, // 318767157
P_CL2FE_REQ_ACCEPT_MAKE_BUDDY = 0x13000036, // 318767158
P_CL2FE_REQ_SEND_BUDDY_FREECHAT_MESSAGE = 0x13000037, // 318767159
P_CL2FE_REQ_SEND_BUDDY_MENUCHAT_MESSAGE = 0x13000038, // 318767160
P_CL2FE_REQ_GET_BUDDY_STYLE = 0x13000039, // 318767161
P_CL2FE_REQ_SET_BUDDY_BLOCK = 0x1300003a, // 318767162
P_CL2FE_REQ_REMOVE_BUDDY = 0x1300003b, // 318767163
P_CL2FE_REQ_GET_BUDDY_STATE = 0x1300003c, // 318767164
P_CL2FE_REQ_PC_JUMPPAD = 0x1300003d, // 318767165
P_CL2FE_REQ_PC_LAUNCHER = 0x1300003e, // 318767166
P_CL2FE_REQ_PC_ZIPLINE = 0x1300003f, // 318767167
P_CL2FE_REQ_PC_MOVEPLATFORM = 0x13000040, // 318767168
P_CL2FE_REQ_PC_SLOPE = 0x13000041, // 318767169
P_CL2FE_REQ_PC_STATE_CHANGE = 0x13000042, // 318767170
P_CL2FE_REQ_PC_MAP_WARP = 0x13000043, // 318767171
P_CL2FE_REQ_PC_GIVE_NANO = 0x13000044, // 318767172
P_CL2FE_REQ_NPC_SUMMON = 0x13000045, // 318767173
P_CL2FE_REQ_NPC_UNSUMMON = 0x13000046, // 318767174
P_CL2FE_REQ_ITEM_CHEST_OPEN = 0x13000047, // 318767175
P_CL2FE_REQ_PC_GIVE_NANO_SKILL = 0x13000048, // 318767176
P_CL2FE_DOT_DAMAGE_ONOFF = 0x13000049, // 318767177
P_CL2FE_REQ_PC_VENDOR_BATTERY_BUY = 0x1300004a, // 318767178
P_CL2FE_REQ_PC_WARP_USE_NPC = 0x1300004b, // 318767179
P_CL2FE_REQ_PC_GROUP_INVITE = 0x1300004c, // 318767180
P_CL2FE_REQ_PC_GROUP_INVITE_REFUSE = 0x1300004d, // 318767181
P_CL2FE_REQ_PC_GROUP_JOIN = 0x1300004e, // 318767182
P_CL2FE_REQ_PC_GROUP_LEAVE = 0x1300004f, // 318767183
P_CL2FE_REQ_PC_AVATAR_EMOTES_CHAT = 0x13000050, // 318767184
P_CL2FE_REQ_PC_BUDDY_WARP = 0x13000051, // 318767185
P_CL2FE_REQ_GET_MEMBER_STYLE = 0x13000052, // 318767186
P_CL2FE_REQ_GET_GROUP_STYLE = 0x13000053, // 318767187
P_CL2FE_REQ_PC_CHANGE_MENTOR = 0x13000054, // 318767188
P_CL2FE_REQ_GET_BUDDY_LOCATION = 0x13000055, // 318767189
P_CL2FE_REQ_NPC_GROUP_SUMMON = 0x13000056, // 318767190
P_CL2FE_REQ_PC_WARP_TO_PC = 0x13000057, // 318767191
P_CL2FE_REQ_EP_RANK_GET_LIST = 0x13000058, // 318767192
P_CL2FE_REQ_EP_RANK_GET_DETAIL = 0x13000059, // 318767193
P_CL2FE_REQ_EP_RANK_GET_PC_INFO = 0x1300005a, // 318767194
P_CL2FE_REQ_EP_RACE_START = 0x1300005b, // 318767195
P_CL2FE_REQ_EP_RACE_END = 0x1300005c, // 318767196
P_CL2FE_REQ_EP_RACE_CANCEL = 0x1300005d, // 318767197
P_CL2FE_REQ_EP_GET_RING = 0x1300005e, // 318767198
P_CL2FE_REQ_IM_CHANGE_SWITCH_STATUS = 0x1300005f, // 318767199
P_CL2FE_REQ_SHINY_PICKUP = 0x13000060, // 318767200
P_CL2FE_REQ_SHINY_SUMMON = 0x13000061, // 318767201
P_CL2FE_REQ_PC_MOVETRANSPORTATION = 0x13000062, // 318767202
P_CL2FE_REQ_SEND_ALL_GROUP_FREECHAT_MESSAGE = 0x13000063, // 318767203
P_CL2FE_REQ_SEND_ANY_GROUP_FREECHAT_MESSAGE = 0x13000064, // 318767204
P_CL2FE_REQ_BARKER = 0x13000065, // 318767205
P_CL2FE_REQ_SEND_ALL_GROUP_MENUCHAT_MESSAGE = 0x13000066, // 318767206
P_CL2FE_REQ_SEND_ANY_GROUP_MENUCHAT_MESSAGE = 0x13000067, // 318767207
P_CL2FE_REQ_REGIST_TRANSPORTATION_LOCATION = 0x13000068, // 318767208
P_CL2FE_REQ_PC_WARP_USE_TRANSPORTATION = 0x13000069, // 318767209
P_CL2FE_GM_REQ_PC_SPECIAL_STATE_SWITCH = 0x1300006a, // 318767210
P_CL2FE_GM_REQ_PC_SET_VALUE = 0x1300006b, // 318767211
P_CL2FE_GM_REQ_KICK_PLAYER = 0x1300006c, // 318767212
P_CL2FE_GM_REQ_TARGET_PC_TELEPORT = 0x1300006d, // 318767213
P_CL2FE_GM_REQ_PC_LOCATION = 0x1300006e, // 318767214
P_CL2FE_GM_REQ_PC_ANNOUNCE = 0x1300006f, // 318767215
P_CL2FE_REQ_SET_PC_BLOCK = 0x13000070, // 318767216
P_CL2FE_REQ_REGIST_RXCOM = 0x13000071, // 318767217
P_CL2FE_GM_REQ_PC_MOTD_REGISTER = 0x13000072, // 318767218
P_CL2FE_REQ_ITEM_USE = 0x13000073, // 318767219
P_CL2FE_REQ_WARP_USE_RECALL = 0x13000074, // 318767220
P_CL2FE_REP_LIVE_CHECK = 0x13000075, // 318767221
P_CL2FE_REQ_PC_MISSION_COMPLETE = 0x13000076, // 318767222
P_CL2FE_REQ_PC_TASK_COMPLETE = 0x13000077, // 318767223
P_CL2FE_REQ_NPC_INTERACTION = 0x13000078, // 318767224
P_CL2FE_DOT_HEAL_ONOFF = 0x13000079, // 318767225
P_CL2FE_REQ_PC_SPECIAL_STATE_SWITCH = 0x1300007a, // 318767226
P_CL2FE_REQ_PC_EMAIL_UPDATE_CHECK = 0x1300007b, // 318767227
P_CL2FE_REQ_PC_READ_EMAIL = 0x1300007c, // 318767228
P_CL2FE_REQ_PC_RECV_EMAIL_PAGE_LIST = 0x1300007d, // 318767229
P_CL2FE_REQ_PC_DELETE_EMAIL = 0x1300007e, // 318767230
P_CL2FE_REQ_PC_SEND_EMAIL = 0x1300007f, // 318767231
P_CL2FE_REQ_PC_RECV_EMAIL_ITEM = 0x13000080, // 318767232
P_CL2FE_REQ_PC_RECV_EMAIL_CANDY = 0x13000081, // 318767233
P_CL2FE_GM_REQ_TARGET_PC_SPECIAL_STATE_ONOFF = 0x13000082, // 318767234
P_CL2FE_REQ_PC_SET_CURRENT_MISSION_ID = 0x13000083, // 318767235
P_CL2FE_REQ_NPC_GROUP_INVITE = 0x13000084, // 318767236
P_CL2FE_REQ_NPC_GROUP_KICK = 0x13000085, // 318767237
P_CL2FE_REQ_PC_FIRST_USE_FLAG_SET = 0x13000086, // 318767238
P_CL2FE_REQ_PC_TRANSPORT_WARP = 0x13000087, // 318767239
P_CL2FE_REQ_PC_TIME_TO_GO_WARP = 0x13000088, // 318767240
P_CL2FE_REQ_PC_RECV_EMAIL_ITEM_ALL = 0x13000089, // 318767241
P_CL2FE_REQ_CHANNEL_INFO = 0x1300008a, // 318767242
P_CL2FE_REQ_PC_CHANNEL_NUM = 0x1300008b, // 318767243
P_CL2FE_REQ_PC_WARP_CHANNEL = 0x1300008c, // 318767244
P_CL2FE_REQ_PC_LOADING_COMPLETE = 0x1300008d, // 318767245
P_CL2FE_REQ_PC_FIND_NAME_MAKE_BUDDY = 0x1300008e, // 318767246
P_CL2FE_REQ_PC_FIND_NAME_ACCEPT_BUDDY = 0x1300008f, // 318767247
P_CL2FE_REQ_PC_ATTACK_CHARs = 0x13000090, // 318767248
P_CL2FE_PC_STREETSTALL_REQ_READY = 0x13000091, // 318767249
P_CL2FE_PC_STREETSTALL_REQ_CANCEL = 0x13000092, // 318767250
P_CL2FE_PC_STREETSTALL_REQ_REGIST_ITEM = 0x13000093, // 318767251
P_CL2FE_PC_STREETSTALL_REQ_UNREGIST_ITEM = 0x13000094, // 318767252
P_CL2FE_PC_STREETSTALL_REQ_SALE_START = 0x13000095, // 318767253
P_CL2FE_PC_STREETSTALL_REQ_ITEM_LIST = 0x13000096, // 318767254
P_CL2FE_PC_STREETSTALL_REQ_ITEM_BUY = 0x13000097, // 318767255
P_CL2FE_REQ_PC_ITEM_COMBINATION = 0x13000098, // 318767256
P_CL2FE_GM_REQ_SET_PC_SKILL = 0x13000099, // 318767257
P_CL2FE_REQ_PC_SKILL_ADD = 0x1300009a, // 318767258
P_CL2FE_REQ_PC_SKILL_DEL = 0x1300009b, // 318767259
P_CL2FE_REQ_PC_SKILL_USE = 0x1300009c, // 318767260
P_CL2FE_REQ_PC_ROPE = 0x1300009d, // 318767261
P_CL2FE_REQ_PC_BELT = 0x1300009e, // 318767262
P_CL2FE_REQ_PC_VEHICLE_ON = 0x1300009f, // 318767263
P_CL2FE_REQ_PC_VEHICLE_OFF = 0x130000a0, // 318767264
P_CL2FE_REQ_PC_REGIST_QUICK_SLOT = 0x130000a1, // 318767265
P_CL2FE_REQ_PC_DISASSEMBLE_ITEM = 0x130000a2, // 318767266
P_CL2FE_GM_REQ_REWARD_RATE = 0x130000a3, // 318767267
P_CL2FE_REQ_PC_ITEM_ENCHANT = 0x130000a4, // 318767268
P_FE2CL_ERROR = 0x31000000, // 822083584
P_FE2CL_REP_PC_ENTER_FAIL = 0x31000001, // 822083585
P_FE2CL_REP_PC_ENTER_SUCC = 0x31000002, // 822083586
P_FE2CL_PC_NEW = 0x31000003, // 822083587
P_FE2CL_REP_PC_EXIT_FAIL = 0x31000004, // 822083588
P_FE2CL_REP_PC_EXIT_SUCC = 0x31000005, // 822083589
P_FE2CL_PC_EXIT = 0x31000006, // 822083590
P_FE2CL_PC_AROUND = 0x31000007, // 822083591
P_FE2CL_PC_MOVE = 0x31000008, // 822083592
P_FE2CL_PC_STOP = 0x31000009, // 822083593
P_FE2CL_PC_JUMP = 0x3100000a, // 822083594
P_FE2CL_NPC_ENTER = 0x3100000b, // 822083595
P_FE2CL_NPC_EXIT = 0x3100000c, // 822083596
P_FE2CL_NPC_MOVE = 0x3100000d, // 822083597
P_FE2CL_NPC_NEW = 0x3100000e, // 822083598
P_FE2CL_NPC_AROUND = 0x3100000f, // 822083599
P_FE2CL_AROUND_DEL_PC = 0x31000010, // 822083600
P_FE2CL_AROUND_DEL_NPC = 0x31000011, // 822083601
P_FE2CL_REP_SEND_FREECHAT_MESSAGE_SUCC = 0x31000012, // 822083602
P_FE2CL_REP_SEND_FREECHAT_MESSAGE_FAIL = 0x31000013, // 822083603
P_FE2CL_PC_ATTACK_NPCs_SUCC = 0x31000014, // 822083604
P_FE2CL_PC_ATTACK_NPCs = 0x31000015, // 822083605
P_FE2CL_NPC_ATTACK_PCs = 0x31000016, // 822083606
P_FE2CL_REP_PC_REGEN_SUCC = 0x31000017, // 822083607
P_FE2CL_REP_SEND_MENUCHAT_MESSAGE_SUCC = 0x31000018, // 822083608
P_FE2CL_REP_SEND_MENUCHAT_MESSAGE_FAIL = 0x31000019, // 822083609
P_FE2CL_PC_ITEM_MOVE_SUCC = 0x3100001a, // 822083610
P_FE2CL_PC_EQUIP_CHANGE = 0x3100001b, // 822083611
P_FE2CL_REP_PC_TASK_START_SUCC = 0x3100001c, // 822083612
P_FE2CL_REP_PC_TASK_START_FAIL = 0x3100001d, // 822083613
P_FE2CL_REP_PC_TASK_END_SUCC = 0x3100001e, // 822083614
P_FE2CL_REP_PC_TASK_END_FAIL = 0x3100001f, // 822083615
P_FE2CL_NPC_SKILL_READY = 0x31000020, // 822083616
P_FE2CL_NPC_SKILL_FIRE = 0x31000021, // 822083617
P_FE2CL_NPC_SKILL_HIT = 0x31000022, // 822083618
P_FE2CL_NPC_SKILL_CORRUPTION_READY = 0x31000023, // 822083619
P_FE2CL_NPC_SKILL_CORRUPTION_HIT = 0x31000024, // 822083620
P_FE2CL_NPC_SKILL_CANCEL = 0x31000025, // 822083621
P_FE2CL_REP_NANO_EQUIP_SUCC = 0x31000026, // 822083622
P_FE2CL_REP_NANO_UNEQUIP_SUCC = 0x31000027, // 822083623
P_FE2CL_REP_NANO_ACTIVE_SUCC = 0x31000028, // 822083624
P_FE2CL_REP_NANO_TUNE_SUCC = 0x31000029, // 822083625
P_FE2CL_NANO_ACTIVE = 0x3100002a, // 822083626
P_FE2CL_NANO_SKILL_USE_SUCC = 0x3100002b, // 822083627
P_FE2CL_NANO_SKILL_USE = 0x3100002c, // 822083628
P_FE2CL_REP_PC_TASK_STOP_SUCC = 0x3100002d, // 822083629
P_FE2CL_REP_PC_TASK_STOP_FAIL = 0x3100002e, // 822083630
P_FE2CL_REP_PC_TASK_CONTINUE_SUCC = 0x3100002f, // 822083631
P_FE2CL_REP_PC_TASK_CONTINUE_FAIL = 0x31000030, // 822083632
P_FE2CL_REP_PC_GOTO_SUCC = 0x31000031, // 822083633
P_FE2CL_REP_CHARGE_NANO_STAMINA = 0x31000032, // 822083634
P_FE2CL_REP_PC_TICK = 0x31000033, // 822083635
P_FE2CL_REP_PC_KILL_QUEST_NPCs_SUCC = 0x31000034, // 822083636
P_FE2CL_REP_PC_VENDOR_ITEM_BUY_SUCC = 0x31000035, // 822083637
P_FE2CL_REP_PC_VENDOR_ITEM_BUY_FAIL = 0x31000036, // 822083638
P_FE2CL_REP_PC_VENDOR_ITEM_SELL_SUCC = 0x31000037, // 822083639
P_FE2CL_REP_PC_VENDOR_ITEM_SELL_FAIL = 0x31000038, // 822083640
P_FE2CL_REP_PC_ITEM_DELETE_SUCC = 0x31000039, // 822083641
P_FE2CL_PC_ROCKET_STYLE_READY = 0x3100003a, // 822083642
P_FE2CL_REP_PC_ROCKET_STYLE_FIRE_SUCC = 0x3100003b, // 822083643
P_FE2CL_PC_ROCKET_STYLE_FIRE = 0x3100003c, // 822083644
P_FE2CL_PC_ROCKET_STYLE_HIT = 0x3100003d, // 822083645
P_FE2CL_PC_GRENADE_STYLE_READY = 0x3100003e, // 822083646
P_FE2CL_REP_PC_GRENADE_STYLE_FIRE_SUCC = 0x3100003f, // 822083647
P_FE2CL_PC_GRENADE_STYLE_FIRE = 0x31000040, // 822083648
P_FE2CL_PC_GRENADE_STYLE_HIT = 0x31000041, // 822083649
P_FE2CL_REP_PC_TRADE_OFFER = 0x31000042, // 822083650
P_FE2CL_REP_PC_TRADE_OFFER_CANCEL = 0x31000043, // 822083651
P_FE2CL_REP_PC_TRADE_OFFER_SUCC = 0x31000044, // 822083652
P_FE2CL_REP_PC_TRADE_OFFER_REFUSAL = 0x31000045, // 822083653
P_FE2CL_REP_PC_TRADE_OFFER_ABORT = 0x31000046, // 822083654
P_FE2CL_REP_PC_TRADE_CONFIRM = 0x31000047, // 822083655
P_FE2CL_REP_PC_TRADE_CONFIRM_CANCEL = 0x31000048, // 822083656
P_FE2CL_REP_PC_TRADE_CONFIRM_ABORT = 0x31000049, // 822083657
P_FE2CL_REP_PC_TRADE_CONFIRM_SUCC = 0x3100004a, // 822083658
P_FE2CL_REP_PC_TRADE_CONFIRM_FAIL = 0x3100004b, // 822083659
P_FE2CL_REP_PC_TRADE_ITEM_REGISTER_SUCC = 0x3100004c, // 822083660
P_FE2CL_REP_PC_TRADE_ITEM_REGISTER_FAIL = 0x3100004d, // 822083661
P_FE2CL_REP_PC_TRADE_ITEM_UNREGISTER_SUCC = 0x3100004e, // 822083662
P_FE2CL_REP_PC_TRADE_ITEM_UNREGISTER_FAIL = 0x3100004f, // 822083663
P_FE2CL_REP_PC_TRADE_CASH_REGISTER_SUCC = 0x31000050, // 822083664
P_FE2CL_REP_PC_TRADE_CASH_REGISTER_FAIL = 0x31000051, // 822083665
P_FE2CL_REP_PC_TRADE_EMOTES_CHAT = 0x31000052, // 822083666
P_FE2CL_REP_PC_NANO_CREATE_SUCC = 0x31000053, // 822083667
P_FE2CL_REP_PC_NANO_CREATE_FAIL = 0x31000054, // 822083668
P_FE2CL_REP_NANO_TUNE_FAIL = 0x31000055, // 822083669
P_FE2CL_REP_PC_BANK_OPEN_SUCC = 0x31000056, // 822083670
P_FE2CL_REP_PC_BANK_OPEN_FAIL = 0x31000057, // 822083671
P_FE2CL_REP_PC_BANK_CLOSE_SUCC = 0x31000058, // 822083672
P_FE2CL_REP_PC_BANK_CLOSE_FAIL = 0x31000059, // 822083673
P_FE2CL_REP_PC_VENDOR_START_SUCC = 0x3100005a, // 822083674
P_FE2CL_REP_PC_VENDOR_START_FAIL = 0x3100005b, // 822083675
P_FE2CL_REP_PC_VENDOR_TABLE_UPDATE_SUCC = 0x3100005c, // 822083676
P_FE2CL_REP_PC_VENDOR_TABLE_UPDATE_FAIL = 0x3100005d, // 822083677
P_FE2CL_REP_PC_VENDOR_ITEM_RESTORE_BUY_SUCC = 0x3100005e, // 822083678
P_FE2CL_REP_PC_VENDOR_ITEM_RESTORE_BUY_FAIL = 0x3100005f, // 822083679
P_FE2CL_CHAR_TIME_BUFF_TIME_OUT = 0x31000060, // 822083680
P_FE2CL_REP_PC_GIVE_ITEM_SUCC = 0x31000061, // 822083681
P_FE2CL_REP_PC_GIVE_ITEM_FAIL = 0x31000062, // 822083682
P_FE2CL_REP_PC_BUDDYLIST_INFO_SUCC = 0x31000063, // 822083683
P_FE2CL_REP_PC_BUDDYLIST_INFO_FAIL = 0x31000064, // 822083684
P_FE2CL_REP_REQUEST_MAKE_BUDDY_SUCC = 0x7fffffff, // 2147483647
P_FE2CL_REP_REQUEST_MAKE_BUDDY_FAIL = 0x31000066, // 822083686
P_FE2CL_REP_ACCEPT_MAKE_BUDDY_SUCC = 0x31000067, // 822083687
P_FE2CL_REP_ACCEPT_MAKE_BUDDY_FAIL = 0x31000068, // 822083688
P_FE2CL_REP_SEND_BUDDY_FREECHAT_MESSAGE_SUCC = 0x31000069, // 822083689
P_FE2CL_REP_SEND_BUDDY_FREECHAT_MESSAGE_FAIL = 0x3100006a, // 822083690
P_FE2CL_REP_SEND_BUDDY_MENUCHAT_MESSAGE_SUCC = 0x3100006b, // 822083691
P_FE2CL_REP_SEND_BUDDY_MENUCHAT_MESSAGE_FAIL = 0x3100006c, // 822083692
P_FE2CL_REP_GET_BUDDY_STYLE_SUCC = 0x3100006d, // 822083693
P_FE2CL_REP_GET_BUDDY_STYLE_FAIL = 0x3100006e, // 822083694
P_FE2CL_REP_GET_BUDDY_STATE_SUCC = 0x3100006f, // 822083695
P_FE2CL_REP_GET_BUDDY_STATE_FAIL = 0x31000070, // 822083696
P_FE2CL_REP_SET_BUDDY_BLOCK_SUCC = 0x31000071, // 822083697
P_FE2CL_REP_SET_BUDDY_BLOCK_FAIL = 0x31000072, // 822083698
P_FE2CL_REP_REMOVE_BUDDY_SUCC = 0x31000073, // 822083699
P_FE2CL_REP_REMOVE_BUDDY_FAIL = 0x31000074, // 822083700
P_FE2CL_PC_JUMPPAD = 0x31000075, // 822083701
P_FE2CL_PC_LAUNCHER = 0x31000076, // 822083702
P_FE2CL_PC_ZIPLINE = 0x31000077, // 822083703
P_FE2CL_PC_MOVEPLATFORM = 0x31000078, // 822083704
P_FE2CL_PC_SLOPE = 0x31000079, // 822083705
P_FE2CL_PC_STATE_CHANGE = 0x3100007a, // 822083706
P_FE2CL_REP_REQUEST_MAKE_BUDDY_SUCC_TO_ACCEPTER = 0x3100007b, // 822083707
P_FE2CL_REP_REWARD_ITEM = 0x3100007c, // 822083708
P_FE2CL_REP_ITEM_CHEST_OPEN_SUCC = 0x3100007d, // 822083709
P_FE2CL_REP_ITEM_CHEST_OPEN_FAIL = 0x3100007e, // 822083710
P_FE2CL_CHAR_TIME_BUFF_TIME_TICK = 0x3100007f, // 822083711
P_FE2CL_REP_PC_VENDOR_BATTERY_BUY_SUCC = 0x31000080, // 822083712
P_FE2CL_REP_PC_VENDOR_BATTERY_BUY_FAIL = 0x31000081, // 822083713
P_FE2CL_NPC_ROCKET_STYLE_FIRE = 0x31000082, // 822083714
P_FE2CL_NPC_GRENADE_STYLE_FIRE = 0x31000083, // 822083715
P_FE2CL_NPC_BULLET_STYLE_HIT = 0x31000084, // 822083716
P_FE2CL_CHARACTER_ATTACK_CHARACTERs = 0x31000085, // 822083717
P_FE2CL_PC_GROUP_INVITE = 0x31000086, // 822083718
P_FE2CL_PC_GROUP_INVITE_FAIL = 0x31000087, // 822083719
P_FE2CL_PC_GROUP_INVITE_REFUSE = 0x31000088, // 822083720
P_FE2CL_PC_GROUP_JOIN = 0x31000089, // 822083721
P_FE2CL_PC_GROUP_JOIN_FAIL = 0x3100008a, // 822083722
P_FE2CL_PC_GROUP_JOIN_SUCC = 0x3100008b, // 822083723
P_FE2CL_PC_GROUP_LEAVE = 0x3100008c, // 822083724
P_FE2CL_PC_GROUP_LEAVE_FAIL = 0x3100008d, // 822083725
P_FE2CL_PC_GROUP_LEAVE_SUCC = 0x3100008e, // 822083726
P_FE2CL_PC_GROUP_MEMBER_INFO = 0x3100008f, // 822083727
P_FE2CL_REP_PC_WARP_USE_NPC_SUCC = 0x31000090, // 822083728
P_FE2CL_REP_PC_WARP_USE_NPC_FAIL = 0x31000091, // 822083729
P_FE2CL_REP_PC_AVATAR_EMOTES_CHAT = 0x31000092, // 822083730
P_FE2CL_REP_PC_CHANGE_MENTOR_SUCC = 0x31000093, // 822083731
P_FE2CL_REP_PC_CHANGE_MENTOR_FAIL = 0x31000094, // 822083732
P_FE2CL_REP_GET_MEMBER_STYLE_FAIL = 0x31000095, // 822083733
P_FE2CL_REP_GET_MEMBER_STYLE_SUCC = 0x31000096, // 822083734
P_FE2CL_REP_GET_GROUP_STYLE_FAIL = 0x31000097, // 822083735
P_FE2CL_REP_GET_GROUP_STYLE_SUCC = 0x31000098, // 822083736
P_FE2CL_PC_REGEN = 0x31000099, // 822083737
P_FE2CL_INSTANCE_MAP_INFO = 0x3100009a, // 822083738
P_FE2CL_TRANSPORTATION_ENTER = 0x3100009b, // 822083739
P_FE2CL_TRANSPORTATION_EXIT = 0x3100009c, // 822083740
P_FE2CL_TRANSPORTATION_MOVE = 0x3100009d, // 822083741
P_FE2CL_TRANSPORTATION_NEW = 0x3100009e, // 822083742
P_FE2CL_TRANSPORTATION_AROUND = 0x3100009f, // 822083743
P_FE2CL_AROUND_DEL_TRANSPORTATION = 0x310000a0, // 822083744
P_FE2CL_REP_EP_RANK_LIST = 0x310000a1, // 822083745
P_FE2CL_REP_EP_RANK_DETAIL = 0x310000a2, // 822083746
P_FE2CL_REP_EP_RANK_PC_INFO = 0x310000a3, // 822083747
P_FE2CL_REP_EP_RACE_START_SUCC = 0x310000a4, // 822083748
P_FE2CL_REP_EP_RACE_START_FAIL = 0x310000a5, // 822083749
P_FE2CL_REP_EP_RACE_END_SUCC = 0x310000a6, // 822083750
P_FE2CL_REP_EP_RACE_END_FAIL = 0x310000a7, // 822083751
P_FE2CL_REP_EP_RACE_CANCEL_SUCC = 0x310000a8, // 822083752
P_FE2CL_REP_EP_RACE_CANCEL_FAIL = 0x310000a9, // 822083753
P_FE2CL_REP_EP_GET_RING_SUCC = 0x310000aa, // 822083754
P_FE2CL_REP_EP_GET_RING_FAIL = 0x310000ab, // 822083755
P_FE2CL_REP_IM_CHANGE_SWITCH_STATUS = 0x310000ac, // 822083756
P_FE2CL_SHINY_ENTER = 0x310000ad, // 822083757
P_FE2CL_SHINY_EXIT = 0x310000ae, // 822083758
P_FE2CL_SHINY_NEW = 0x310000af, // 822083759
P_FE2CL_SHINY_AROUND = 0x310000b0, // 822083760
P_FE2CL_AROUND_DEL_SHINY = 0x310000b1, // 822083761
P_FE2CL_REP_SHINY_PICKUP_FAIL = 0x310000b2, // 822083762
P_FE2CL_REP_SHINY_PICKUP_SUCC = 0x310000b3, // 822083763
P_FE2CL_PC_MOVETRANSPORTATION = 0x310000b4, // 822083764
P_FE2CL_REP_SEND_ALL_GROUP_FREECHAT_MESSAGE_SUCC = 0x310000b5, // 822083765
P_FE2CL_REP_SEND_ALL_GROUP_FREECHAT_MESSAGE_FAIL = 0x310000b6, // 822083766
P_FE2CL_REP_SEND_ANY_GROUP_FREECHAT_MESSAGE_SUCC = 0x310000b7, // 822083767
P_FE2CL_REP_SEND_ANY_GROUP_FREECHAT_MESSAGE_FAIL = 0x310000b8, // 822083768
P_FE2CL_REP_BARKER = 0x310000b9, // 822083769
P_FE2CL_REP_SEND_ALL_GROUP_MENUCHAT_MESSAGE_SUCC = 0x310000ba, // 822083770
P_FE2CL_REP_SEND_ALL_GROUP_MENUCHAT_MESSAGE_FAIL = 0x310000bb, // 822083771
P_FE2CL_REP_SEND_ANY_GROUP_MENUCHAT_MESSAGE_SUCC = 0x310000bc, // 822083772
P_FE2CL_REP_SEND_ANY_GROUP_MENUCHAT_MESSAGE_FAIL = 0x310000bd, // 822083773
P_FE2CL_REP_PC_REGIST_TRANSPORTATION_LOCATION_FAIL = 0x310000be, // 822083774
P_FE2CL_REP_PC_REGIST_TRANSPORTATION_LOCATION_SUCC = 0x310000bf, // 822083775
P_FE2CL_REP_PC_WARP_USE_TRANSPORTATION_FAIL = 0x310000c0, // 822083776
P_FE2CL_REP_PC_WARP_USE_TRANSPORTATION_SUCC = 0x310000c1, // 822083777
P_FE2CL_ANNOUNCE_MSG = 0x310000c2, // 822083778
P_FE2CL_REP_PC_SPECIAL_STATE_SWITCH_SUCC = 0x310000c3, // 822083779
P_FE2CL_PC_SPECIAL_STATE_CHANGE = 0x310000c4, // 822083780
P_FE2CL_GM_REP_PC_SET_VALUE = 0x310000c5, // 822083781
P_FE2CL_GM_PC_CHANGE_VALUE = 0x310000c6, // 822083782
P_FE2CL_GM_REP_PC_LOCATION = 0x310000c7, // 822083783
P_FE2CL_GM_REP_PC_ANNOUNCE = 0x310000c8, // 822083784
P_FE2CL_REP_PC_BUDDY_WARP_FAIL = 0x310000c9, // 822083785
P_FE2CL_REP_PC_CHANGE_LEVEL = 0x310000ca, // 822083786
P_FE2CL_REP_SET_PC_BLOCK_SUCC = 0x310000cb, // 822083787
P_FE2CL_REP_SET_PC_BLOCK_FAIL = 0x310000cc, // 822083788
P_FE2CL_REP_REGIST_RXCOM = 0x310000cd, // 822083789
P_FE2CL_REP_REGIST_RXCOM_FAIL = 0x310000ce, // 822083790
P_FE2CL_PC_INVEN_FULL_MSG = 0x310000cf, // 822083791
P_FE2CL_REQ_LIVE_CHECK = 0x310000d0, // 822083792
P_FE2CL_PC_MOTD_LOGIN = 0x310000d1, // 822083793
P_FE2CL_REP_PC_ITEM_USE_FAIL = 0x310000d2, // 822083794
P_FE2CL_REP_PC_ITEM_USE_SUCC = 0x310000d3, // 822083795
P_FE2CL_PC_ITEM_USE = 0x310000d4, // 822083796
P_FE2CL_REP_GET_BUDDY_LOCATION_SUCC = 0x310000d5, // 822083797
P_FE2CL_REP_GET_BUDDY_LOCATION_FAIL = 0x310000d6, // 822083798
P_FE2CL_REP_PC_RIDING_FAIL = 0x310000d7, // 822083799
P_FE2CL_REP_PC_RIDING_SUCC = 0x310000d8, // 822083800
P_FE2CL_PC_RIDING = 0x310000d9, // 822083801
P_FE2CL_PC_BROOMSTICK_MOVE = 0x310000da, // 822083802
P_FE2CL_REP_PC_BUDDY_WARP_OTHER_SHARD_SUCC = 0x310000db, // 822083803
P_FE2CL_REP_WARP_USE_RECALL_FAIL = 0x310000dc, // 822083804
P_FE2CL_REP_PC_EXIT_DUPLICATE = 0x310000dd, // 822083805
P_FE2CL_REP_PC_MISSION_COMPLETE_SUCC = 0x310000de, // 822083806
P_FE2CL_PC_BUFF_UPDATE = 0x310000df, // 822083807
P_FE2CL_REP_PC_NEW_EMAIL = 0x310000e0, // 822083808
P_FE2CL_REP_PC_READ_EMAIL_SUCC = 0x310000e1, // 822083809
P_FE2CL_REP_PC_READ_EMAIL_FAIL = 0x310000e2, // 822083810
P_FE2CL_REP_PC_RECV_EMAIL_PAGE_LIST_SUCC = 0x310000e3, // 822083811
P_FE2CL_REP_PC_RECV_EMAIL_PAGE_LIST_FAIL = 0x310000e4, // 822083812
P_FE2CL_REP_PC_DELETE_EMAIL_SUCC = 0x310000e5, // 822083813
P_FE2CL_REP_PC_DELETE_EMAIL_FAIL = 0x310000e6, // 822083814
P_FE2CL_REP_PC_SEND_EMAIL_SUCC = 0x310000e7, // 822083815
P_FE2CL_REP_PC_SEND_EMAIL_FAIL = 0x310000e8, // 822083816
P_FE2CL_REP_PC_RECV_EMAIL_ITEM_SUCC = 0x310000e9, // 822083817
P_FE2CL_REP_PC_RECV_EMAIL_ITEM_FAIL = 0x310000ea, // 822083818
P_FE2CL_REP_PC_RECV_EMAIL_CANDY_SUCC = 0x310000eb, // 822083819
P_FE2CL_REP_PC_RECV_EMAIL_CANDY_FAIL = 0x310000ec, // 822083820
P_FE2CL_PC_SUDDEN_DEAD = 0x310000ed, // 822083821
P_FE2CL_REP_GM_REQ_TARGET_PC_SPECIAL_STATE_ONOFF_SUCC = 0x310000ee, // 822083822
P_FE2CL_REP_PC_SET_CURRENT_MISSION_ID = 0x310000ef, // 822083823
P_FE2CL_REP_NPC_GROUP_INVITE_FAIL = 0x310000f0, // 822083824
P_FE2CL_REP_NPC_GROUP_INVITE_SUCC = 0x310000f1, // 822083825
P_FE2CL_REP_NPC_GROUP_KICK_FAIL = 0x310000f2, // 822083826
P_FE2CL_REP_NPC_GROUP_KICK_SUCC = 0x310000f3, // 822083827
P_FE2CL_PC_EVENT = 0x310000f4, // 822083828
P_FE2CL_REP_PC_TRANSPORT_WARP_SUCC = 0x310000f5, // 822083829
P_FE2CL_REP_PC_TRADE_EMOTES_CHAT_FAIL = 0x310000f6, // 822083830
P_FE2CL_REP_PC_RECV_EMAIL_ITEM_ALL_SUCC = 0x310000f7, // 822083831
P_FE2CL_REP_PC_RECV_EMAIL_ITEM_ALL_FAIL = 0x310000f8, // 822083832
P_FE2CL_REP_PC_LOADING_COMPLETE_SUCC = 0x310000f9, // 822083833
P_FE2CL_REP_CHANNEL_INFO = 0x310000fa, // 822083834
P_FE2CL_REP_PC_CHANNEL_NUM = 0x310000fb, // 822083835
P_FE2CL_REP_PC_WARP_CHANNEL_FAIL = 0x310000fc, // 822083836
P_FE2CL_REP_PC_WARP_CHANNEL_SUCC = 0x310000fd, // 822083837
P_FE2CL_REP_PC_FIND_NAME_MAKE_BUDDY_SUCC = 0x310000fe, // 822083838
P_FE2CL_REP_PC_FIND_NAME_MAKE_BUDDY_FAIL = 0x310000ff, // 822083839
P_FE2CL_REP_PC_FIND_NAME_ACCEPT_BUDDY_FAIL = 0x31000100, // 822083840
P_FE2CL_REP_PC_BUDDY_WARP_SAME_SHARD_SUCC = 0x31000101, // 822083841
P_FE2CL_PC_ATTACK_CHARs_SUCC = 0x31000102, // 822083842
P_FE2CL_PC_ATTACK_CHARs = 0x31000103, // 822083843
P_FE2CL_NPC_ATTACK_CHARs = 0x31000104, // 822083844
P_FE2CL_REP_PC_CHANGE_LEVEL_SUCC = 0x31000105, // 822083845
P_FE2CL_REP_PC_NANO_CREATE = 0x31000106, // 822083846
P_FE2CL_PC_STREETSTALL_REP_READY_SUCC = 0x31000107, // 822083847
P_FE2CL_PC_STREETSTALL_REP_READY_FAIL = 0x31000108, // 822083848
P_FE2CL_PC_STREETSTALL_REP_CANCEL_SUCC = 0x31000109, // 822083849
P_FE2CL_PC_STREETSTALL_REP_CANCEL_FAIL = 0x3100010a, // 822083850
P_FE2CL_PC_STREETSTALL_REP_REGIST_ITEM_SUCC = 0x3100010b, // 822083851
P_FE2CL_PC_STREETSTALL_REP_REGIST_ITEM_FAIL = 0x3100010c, // 822083852
P_FE2CL_PC_STREETSTALL_REP_UNREGIST_ITEM_SUCC = 0x3100010d, // 822083853
P_FE2CL_PC_STREETSTALL_REP_UNREGIST_ITEM_FAIL = 0x3100010e, // 822083854
P_FE2CL_PC_STREETSTALL_REP_SALE_START_SUCC = 0x3100010f, // 822083855
P_FE2CL_PC_STREETSTALL_REP_SALE_START_FAIL = 0x31000110, // 822083856
P_FE2CL_PC_STREETSTALL_REP_ITEM_LIST = 0x31000111, // 822083857
P_FE2CL_PC_STREETSTALL_REP_ITEM_LIST_FAIL = 0x31000112, // 822083858
P_FE2CL_PC_STREETSTALL_REP_ITEM_BUY_SUCC_BUYER = 0x31000113, // 822083859
P_FE2CL_PC_STREETSTALL_REP_ITEM_BUY_SUCC_SELLER = 0x31000114, // 822083860
P_FE2CL_PC_STREETSTALL_REP_ITEM_BUY_FAIL = 0x31000115, // 822083861
P_FE2CL_REP_PC_ITEM_COMBINATION_SUCC = 0x31000116, // 822083862
P_FE2CL_REP_PC_ITEM_COMBINATION_FAIL = 0x31000117, // 822083863
P_FE2CL_PC_CASH_BUFF_UPDATE = 0x31000118, // 822083864
P_FE2CL_REP_PC_SKILL_ADD_SUCC = 0x31000119, // 822083865
P_FE2CL_REP_PC_SKILL_ADD_FAIL = 0x3100011a, // 822083866
P_FE2CL_REP_PC_SKILL_DEL_SUCC = 0x3100011b, // 822083867
P_FE2CL_REP_PC_SKILL_DEL_FAIL = 0x3100011c, // 822083868
P_FE2CL_REP_PC_SKILL_USE_SUCC = 0x3100011d, // 822083869
P_FE2CL_REP_PC_SKILL_USE_FAIL = 0x3100011e, // 822083870
P_FE2CL_PC_SKILL_USE = 0x3100011f, // 822083871
P_FE2CL_PC_ROPE = 0x31000120, // 822083872
P_FE2CL_PC_BELT = 0x31000121, // 822083873
P_FE2CL_PC_VEHICLE_ON_SUCC = 0x31000122, // 822083874
P_FE2CL_PC_VEHICLE_ON_FAIL = 0x31000123, // 822083875
P_FE2CL_PC_VEHICLE_OFF_SUCC = 0x31000124, // 822083876
P_FE2CL_PC_VEHICLE_OFF_FAIL = 0x31000125, // 822083877
P_FE2CL_PC_QUICK_SLOT_INFO = 0x31000126, // 822083878
P_FE2CL_REP_PC_REGIST_QUICK_SLOT_FAIL = 0x31000127, // 822083879
P_FE2CL_REP_PC_REGIST_QUICK_SLOT_SUCC = 0x31000128, // 822083880
P_FE2CL_PC_DELETE_TIME_LIMIT_ITEM = 0x31000129, // 822083881
P_FE2CL_REP_PC_DISASSEMBLE_ITEM_SUCC = 0x3100012a, // 822083882
P_FE2CL_REP_PC_DISASSEMBLE_ITEM_FAIL = 0x3100012b, // 822083883
P_FE2CL_GM_REP_REWARD_RATE_SUCC = 0x3100012c, // 822083884
P_FE2CL_REP_PC_ITEM_ENCHANT_SUCC = 0x3100012d, // 822083885
P_FE2CL_REP_PC_ITEM_ENCHANT_FAIL = 0x3100012e, // 822083886
P_LS2CL_REP_LOGIN_SUCC = 0x21000001, // 553648129
P_LS2CL_REP_LOGIN_FAIL = 0x21000002, // 553648130
P_LS2CL_REP_CHAR_INFO = 0x21000003, // 553648131
P_LS2CL_REP_CHECK_CHAR_NAME_SUCC = 0x21000005, // 553648133
P_LS2CL_REP_CHECK_CHAR_NAME_FAIL = 0x21000006, // 553648134
P_LS2CL_REP_SAVE_CHAR_NAME_SUCC = 0x21000007, // 553648135
P_LS2CL_REP_SAVE_CHAR_NAME_FAIL = 0x21000008, // 553648136
P_LS2CL_REP_CHAR_CREATE_SUCC = 0x21000009, // 553648137
P_LS2CL_REP_CHAR_CREATE_FAIL = 0x2100000a, // 553648138
P_LS2CL_REP_CHAR_SELECT_SUCC = 0x2100000b, // 553648139
P_LS2CL_REP_CHAR_SELECT_FAIL = 0x2100000c, // 553648140
P_LS2CL_REP_CHAR_DELETE_SUCC = 0x2100000d, // 553648141
P_LS2CL_REP_CHAR_DELETE_FAIL = 0x2100000e, // 553648142
P_LS2CL_REP_SHARD_SELECT_SUCC = 0x2100000f, // 553648143
P_LS2CL_REP_SHARD_SELECT_FAIL = 0x21000010, // 553648144
P_LS2CL_REP_VERSION_CHECK_SUCC = 0x21000011, // 553648145
P_LS2CL_REP_VERSION_CHECK_FAIL = 0x21000012, // 553648146
P_LS2CL_REP_CHECK_NAME_LIST_SUCC = 0x21000013, // 553648147
P_LS2CL_REP_CHECK_NAME_LIST_FAIL = 0x21000014, // 553648148
P_LS2CL_REP_PC_EXIT_DUPLICATE = 0x21000015, // 553648149
P_LS2CL_REQ_LIVE_CHECK = 0x21000016, // 553648150
P_LS2CL_REP_CHANGE_CHAR_NAME_SUCC = 0x21000017, // 553648151
P_LS2CL_REP_CHANGE_CHAR_NAME_FAIL = 0x21000018, // 553648152
P_LS2CL_REP_SHARD_LIST_INFO_SUCC = 0x21000019, // 553648153
};
/*
* Numbers of packets by type.
* Each is the last packet - the upper bits + 1
*/
enum {
N_CL2LS = 0xf,
N_CL2FE = 0xa5,
N_FE2CL = 0x12f,
N_LS2CL = 0x1a,
N_PACKETS = N_CL2LS + N_CL2FE + N_FE2CL + N_LS2CL
};
namespace Packets {
std::string p2str(int type, int val);
}

220
src/core/Packets.cpp Normal file
View File

@@ -0,0 +1,220 @@
#include <string>
#include "Defines.hpp"
#define STRINGIFY(x) PacketMap(x, #x)
/*
* Turns out there isn't better way to do this...
* We'll only support CL2* packets for now, since we only
* need to print those.
*/
struct PacketMap {
int val;
std::string name;
PacketMap(int v, std::string n) : val(v), name(n) {};
};
PacketMap cl2ls_map[] = {
STRINGIFY(P_CL2LS_REQ_LOGIN),
STRINGIFY(P_CL2LS_REQ_CHECK_CHAR_NAME),
STRINGIFY(P_CL2LS_REQ_SAVE_CHAR_NAME),
STRINGIFY(P_CL2LS_REQ_CHAR_CREATE),
STRINGIFY(P_CL2LS_REQ_CHAR_SELECT),
STRINGIFY(P_CL2LS_REQ_CHAR_DELETE),
STRINGIFY(P_CL2LS_REQ_SHARD_SELECT),
STRINGIFY(P_CL2LS_REQ_SHARD_LIST_INFO),
STRINGIFY(P_CL2LS_CHECK_NAME_LIST),
STRINGIFY(P_CL2LS_REQ_SAVE_CHAR_TUTOR),
STRINGIFY(P_CL2LS_REQ_PC_EXIT_DUPLICATE),
STRINGIFY(P_CL2LS_REP_LIVE_CHECK),
STRINGIFY(P_CL2LS_REQ_CHANGE_CHAR_NAME),
STRINGIFY(P_CL2LS_REQ_SERVER_SELECT),
};
PacketMap cl2fe_map[] = {
STRINGIFY(P_CL2FE_REQ_PC_ENTER),
STRINGIFY(P_CL2FE_REQ_PC_EXIT),
STRINGIFY(P_CL2FE_REQ_PC_MOVE),
STRINGIFY(P_CL2FE_REQ_PC_STOP),
STRINGIFY(P_CL2FE_REQ_PC_JUMP),
STRINGIFY(P_CL2FE_REQ_PC_ATTACK_NPCs),
STRINGIFY(P_CL2FE_REQ_SEND_FREECHAT_MESSAGE),
STRINGIFY(P_CL2FE_REQ_SEND_MENUCHAT_MESSAGE),
STRINGIFY(P_CL2FE_REQ_PC_REGEN),
STRINGIFY(P_CL2FE_REQ_ITEM_MOVE),
STRINGIFY(P_CL2FE_REQ_PC_TASK_START),
STRINGIFY(P_CL2FE_REQ_PC_TASK_END),
STRINGIFY(P_CL2FE_REQ_NANO_EQUIP),
STRINGIFY(P_CL2FE_REQ_NANO_UNEQUIP),
STRINGIFY(P_CL2FE_REQ_NANO_ACTIVE),
STRINGIFY(P_CL2FE_REQ_NANO_TUNE),
STRINGIFY(P_CL2FE_REQ_NANO_SKILL_USE),
STRINGIFY(P_CL2FE_REQ_PC_TASK_STOP),
STRINGIFY(P_CL2FE_REQ_PC_TASK_CONTINUE),
STRINGIFY(P_CL2FE_REQ_PC_GOTO),
STRINGIFY(P_CL2FE_REQ_CHARGE_NANO_STAMINA),
STRINGIFY(P_CL2FE_REQ_PC_KILL_QUEST_NPCs),
STRINGIFY(P_CL2FE_REQ_PC_VENDOR_ITEM_BUY),
STRINGIFY(P_CL2FE_REQ_PC_VENDOR_ITEM_SELL),
STRINGIFY(P_CL2FE_REQ_PC_ITEM_DELETE),
STRINGIFY(P_CL2FE_REQ_PC_GIVE_ITEM),
STRINGIFY(P_CL2FE_REQ_PC_ROCKET_STYLE_READY),
STRINGIFY(P_CL2FE_REQ_PC_ROCKET_STYLE_FIRE),
STRINGIFY(P_CL2FE_REQ_PC_ROCKET_STYLE_HIT),
STRINGIFY(P_CL2FE_REQ_PC_GRENADE_STYLE_READY),
STRINGIFY(P_CL2FE_REQ_PC_GRENADE_STYLE_FIRE),
STRINGIFY(P_CL2FE_REQ_PC_GRENADE_STYLE_HIT),
STRINGIFY(P_CL2FE_REQ_PC_NANO_CREATE),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_OFFER),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_OFFER_CANCEL),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_OFFER_ACCEPT),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_OFFER_REFUSAL),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_OFFER_ABORT),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_CONFIRM),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_CONFIRM_CANCEL),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_CONFIRM_ABORT),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_ITEM_REGISTER),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_ITEM_UNREGISTER),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_CASH_REGISTER),
STRINGIFY(P_CL2FE_REQ_PC_TRADE_EMOTES_CHAT),
STRINGIFY(P_CL2FE_REQ_PC_BANK_OPEN),
STRINGIFY(P_CL2FE_REQ_PC_BANK_CLOSE),
STRINGIFY(P_CL2FE_REQ_PC_VENDOR_START),
STRINGIFY(P_CL2FE_REQ_PC_VENDOR_TABLE_UPDATE),
STRINGIFY(P_CL2FE_REQ_PC_VENDOR_ITEM_RESTORE_BUY),
STRINGIFY(P_CL2FE_REQ_PC_COMBAT_BEGIN),
STRINGIFY(P_CL2FE_REQ_PC_COMBAT_END),
STRINGIFY(P_CL2FE_REQ_REQUEST_MAKE_BUDDY),
STRINGIFY(P_CL2FE_REQ_ACCEPT_MAKE_BUDDY),
STRINGIFY(P_CL2FE_REQ_SEND_BUDDY_FREECHAT_MESSAGE),
STRINGIFY(P_CL2FE_REQ_SEND_BUDDY_MENUCHAT_MESSAGE),
STRINGIFY(P_CL2FE_REQ_GET_BUDDY_STYLE),
STRINGIFY(P_CL2FE_REQ_SET_BUDDY_BLOCK),
STRINGIFY(P_CL2FE_REQ_REMOVE_BUDDY),
STRINGIFY(P_CL2FE_REQ_GET_BUDDY_STATE),
STRINGIFY(P_CL2FE_REQ_PC_JUMPPAD),
STRINGIFY(P_CL2FE_REQ_PC_LAUNCHER),
STRINGIFY(P_CL2FE_REQ_PC_ZIPLINE),
STRINGIFY(P_CL2FE_REQ_PC_MOVEPLATFORM),
STRINGIFY(P_CL2FE_REQ_PC_SLOPE),
STRINGIFY(P_CL2FE_REQ_PC_STATE_CHANGE),
STRINGIFY(P_CL2FE_REQ_PC_MAP_WARP),
STRINGIFY(P_CL2FE_REQ_PC_GIVE_NANO),
STRINGIFY(P_CL2FE_REQ_NPC_SUMMON),
STRINGIFY(P_CL2FE_REQ_NPC_UNSUMMON),
STRINGIFY(P_CL2FE_REQ_ITEM_CHEST_OPEN),
STRINGIFY(P_CL2FE_REQ_PC_GIVE_NANO_SKILL),
STRINGIFY(P_CL2FE_DOT_DAMAGE_ONOFF),
STRINGIFY(P_CL2FE_REQ_PC_VENDOR_BATTERY_BUY),
STRINGIFY(P_CL2FE_REQ_PC_WARP_USE_NPC),
STRINGIFY(P_CL2FE_REQ_PC_GROUP_INVITE),
STRINGIFY(P_CL2FE_REQ_PC_GROUP_INVITE_REFUSE),
STRINGIFY(P_CL2FE_REQ_PC_GROUP_JOIN),
STRINGIFY(P_CL2FE_REQ_PC_GROUP_LEAVE),
STRINGIFY(P_CL2FE_REQ_PC_AVATAR_EMOTES_CHAT),
STRINGIFY(P_CL2FE_REQ_PC_BUDDY_WARP),
STRINGIFY(P_CL2FE_REQ_GET_MEMBER_STYLE),
STRINGIFY(P_CL2FE_REQ_GET_GROUP_STYLE),
STRINGIFY(P_CL2FE_REQ_PC_CHANGE_MENTOR),
STRINGIFY(P_CL2FE_REQ_GET_BUDDY_LOCATION),
STRINGIFY(P_CL2FE_REQ_NPC_GROUP_SUMMON),
STRINGIFY(P_CL2FE_REQ_PC_WARP_TO_PC),
STRINGIFY(P_CL2FE_REQ_EP_RANK_GET_LIST),
STRINGIFY(P_CL2FE_REQ_EP_RANK_GET_DETAIL),
STRINGIFY(P_CL2FE_REQ_EP_RANK_GET_PC_INFO),
STRINGIFY(P_CL2FE_REQ_EP_RACE_START),
STRINGIFY(P_CL2FE_REQ_EP_RACE_END),
STRINGIFY(P_CL2FE_REQ_EP_RACE_CANCEL),
STRINGIFY(P_CL2FE_REQ_EP_GET_RING),
STRINGIFY(P_CL2FE_REQ_IM_CHANGE_SWITCH_STATUS),
STRINGIFY(P_CL2FE_REQ_SHINY_PICKUP),
STRINGIFY(P_CL2FE_REQ_SHINY_SUMMON),
STRINGIFY(P_CL2FE_REQ_PC_MOVETRANSPORTATION),
STRINGIFY(P_CL2FE_REQ_SEND_ALL_GROUP_FREECHAT_MESSAGE),
STRINGIFY(P_CL2FE_REQ_SEND_ANY_GROUP_FREECHAT_MESSAGE),
STRINGIFY(P_CL2FE_REQ_BARKER),
STRINGIFY(P_CL2FE_REQ_SEND_ALL_GROUP_MENUCHAT_MESSAGE),
STRINGIFY(P_CL2FE_REQ_SEND_ANY_GROUP_MENUCHAT_MESSAGE),
STRINGIFY(P_CL2FE_REQ_REGIST_TRANSPORTATION_LOCATION),
STRINGIFY(P_CL2FE_REQ_PC_WARP_USE_TRANSPORTATION),
STRINGIFY(P_CL2FE_GM_REQ_PC_SPECIAL_STATE_SWITCH),
STRINGIFY(P_CL2FE_GM_REQ_PC_SET_VALUE),
STRINGIFY(P_CL2FE_GM_REQ_KICK_PLAYER),
STRINGIFY(P_CL2FE_GM_REQ_TARGET_PC_TELEPORT),
STRINGIFY(P_CL2FE_GM_REQ_PC_LOCATION),
STRINGIFY(P_CL2FE_GM_REQ_PC_ANNOUNCE),
STRINGIFY(P_CL2FE_REQ_SET_PC_BLOCK),
STRINGIFY(P_CL2FE_REQ_REGIST_RXCOM),
STRINGIFY(P_CL2FE_GM_REQ_PC_MOTD_REGISTER),
STRINGIFY(P_CL2FE_REQ_ITEM_USE),
STRINGIFY(P_CL2FE_REQ_WARP_USE_RECALL),
STRINGIFY(P_CL2FE_REP_LIVE_CHECK),
STRINGIFY(P_CL2FE_REQ_PC_MISSION_COMPLETE),
STRINGIFY(P_CL2FE_REQ_PC_TASK_COMPLETE),
STRINGIFY(P_CL2FE_REQ_NPC_INTERACTION),
STRINGIFY(P_CL2FE_DOT_HEAL_ONOFF),
STRINGIFY(P_CL2FE_REQ_PC_SPECIAL_STATE_SWITCH),
STRINGIFY(P_CL2FE_REQ_PC_EMAIL_UPDATE_CHECK),
STRINGIFY(P_CL2FE_REQ_PC_READ_EMAIL),
STRINGIFY(P_CL2FE_REQ_PC_RECV_EMAIL_PAGE_LIST),
STRINGIFY(P_CL2FE_REQ_PC_DELETE_EMAIL),
STRINGIFY(P_CL2FE_REQ_PC_SEND_EMAIL),
STRINGIFY(P_CL2FE_REQ_PC_RECV_EMAIL_ITEM),
STRINGIFY(P_CL2FE_REQ_PC_RECV_EMAIL_CANDY),
STRINGIFY(P_CL2FE_GM_REQ_TARGET_PC_SPECIAL_STATE_ONOFF),
STRINGIFY(P_CL2FE_REQ_PC_SET_CURRENT_MISSION_ID),
STRINGIFY(P_CL2FE_REQ_NPC_GROUP_INVITE),
STRINGIFY(P_CL2FE_REQ_NPC_GROUP_KICK),
STRINGIFY(P_CL2FE_REQ_PC_FIRST_USE_FLAG_SET),
STRINGIFY(P_CL2FE_REQ_PC_TRANSPORT_WARP),
STRINGIFY(P_CL2FE_REQ_PC_TIME_TO_GO_WARP),
STRINGIFY(P_CL2FE_REQ_PC_RECV_EMAIL_ITEM_ALL),
STRINGIFY(P_CL2FE_REQ_CHANNEL_INFO),
STRINGIFY(P_CL2FE_REQ_PC_CHANNEL_NUM),
STRINGIFY(P_CL2FE_REQ_PC_WARP_CHANNEL),
STRINGIFY(P_CL2FE_REQ_PC_LOADING_COMPLETE),
STRINGIFY(P_CL2FE_REQ_PC_FIND_NAME_MAKE_BUDDY),
STRINGIFY(P_CL2FE_REQ_PC_FIND_NAME_ACCEPT_BUDDY),
STRINGIFY(P_CL2FE_REQ_PC_ATTACK_CHARs),
STRINGIFY(P_CL2FE_PC_STREETSTALL_REQ_READY),
STRINGIFY(P_CL2FE_PC_STREETSTALL_REQ_CANCEL),
STRINGIFY(P_CL2FE_PC_STREETSTALL_REQ_REGIST_ITEM),
STRINGIFY(P_CL2FE_PC_STREETSTALL_REQ_UNREGIST_ITEM),
STRINGIFY(P_CL2FE_PC_STREETSTALL_REQ_SALE_START),
STRINGIFY(P_CL2FE_PC_STREETSTALL_REQ_ITEM_LIST),
STRINGIFY(P_CL2FE_PC_STREETSTALL_REQ_ITEM_BUY),
STRINGIFY(P_CL2FE_REQ_PC_ITEM_COMBINATION),
STRINGIFY(P_CL2FE_GM_REQ_SET_PC_SKILL),
STRINGIFY(P_CL2FE_REQ_PC_SKILL_ADD),
STRINGIFY(P_CL2FE_REQ_PC_SKILL_DEL),
STRINGIFY(P_CL2FE_REQ_PC_SKILL_USE),
STRINGIFY(P_CL2FE_REQ_PC_ROPE),
STRINGIFY(P_CL2FE_REQ_PC_BELT),
STRINGIFY(P_CL2FE_REQ_PC_VEHICLE_ON),
STRINGIFY(P_CL2FE_REQ_PC_VEHICLE_OFF),
STRINGIFY(P_CL2FE_REQ_PC_REGIST_QUICK_SLOT),
STRINGIFY(P_CL2FE_REQ_PC_DISASSEMBLE_ITEM),
STRINGIFY(P_CL2FE_GM_REQ_REWARD_RATE),
STRINGIFY(P_CL2FE_REQ_PC_ITEM_ENCHANT),
};
std::string Packets::p2str(int type, int val) {
switch (type) {
case CL2LS:
val = val - CL2LS - 1;
if (val > N_CL2LS || val < 0)
break;
return cl2ls_map[val].name;
case CL2FE:
val = val - CL2FE - 1;
if (val > N_CL2FE || val < 0)
break;
return cl2fe_map[val].name;
}
return "UNKNOWN";
}