test-client-godot/modules/referentialmessage/referentialmessagecore.h

442 lines
12 KiB
C
Raw Normal View History

2020-03-30 20:20:59 +00:00
/*
Header ReferentialMessageCore : Class to store referential to decode message
Copyright (C) 2019 AleaJactaEst
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef REFERENTIAL_MESSAGE_CORE_H
#define REFERENTIAL_MESSAGE_CORE_H
#include "core/reference.h"
#include "core/dictionary.h"
#include "modules/bitstream/bitstream.h"
2020-04-10 16:09:06 +00:00
#include "modules/debug/debug.h"
2020-03-30 20:20:59 +00:00
inline uint32_t getPowerOf2(uint32_t v)
{
// See code : khanat-opennel-code/code/nel/src/misc/common.cpp
uint32_t res = 1;
uint32_t ret = 0;
uint32_t limit = 8*sizeof(uint32_t);
2020-04-10 16:09:06 +00:00
while(res < v && ret < limit)
2020-03-30 20:20:59 +00:00
{
ret ++;
res <<= 1; // res *= 2;
}
return ret;
}
class ElementReferential : public Reference
{
GDCLASS(ElementReferential, Reference)
private:
uint32_t _id;
uint32_t _power2;
Vector<Ref<ElementReferential>> _children;
public:
ElementReferential() {_id=0; _power2=0;}
~ElementReferential() {_children.clear();}
void set_id(uint32_t id) {_id=id;}
2020-04-10 16:09:06 +00:00
void set_size(uint32_t size) {_children.resize(size); _power2=getPowerOf2(size);DBG_PRINT("[" + itos(size) + " /" + itos(_power2) + "]");}
2020-03-30 20:20:59 +00:00
int get_size() { return _children.size();}
Ref<ElementReferential> add_child(uint32_t id, uint32_t pos) { Ref<ElementReferential> tmp; tmp.instance(); tmp->_id = id; _children.set(pos, tmp); tmp.unref(); return _children[pos]; }
void show(int level=0, int pos=0);
};
class ReferentialMessageCore : public Reference
{
GDCLASS(ReferentialMessageCore, Reference)
protected:
static void _bind_methods();
public:
enum Command {
TARGET_PARTY,
TARGET_INVENTORY,
TARGET_FOLLOW,
TARGET_NO_FOLLOW,
CONNECTION_USER_CHAR,
CONNECTION_NO_USER_CHAR,
CONNECTION_USER_CHARS,
CONNECTION_CREATE_CHAR,
CONNECTION_SELECT_CHAR,
CONNECTION_DELETE_CHAR,
CONNECTION_RENAME_CHAR,
CONNECTION_ENTER,
CONNECTION_READY,
CONNECTION_TIME_DATE_SYNCHRO,
CONNECTION_ASK_NAME,
CONNECTION_VALID_NAME,
CONNECTION_CREATE_CHAR_ERROR,
CONNECTION_RECONNECT,
CONNECTION_SERVER_RECONNECT_OK,
CONNECTION_SHARD_ID,
CONNECTION_SERVER_QUIT_OK,
CONNECTION_SERVER_QUIT_ABORT,
CONNECTION_CLIENT_QUIT_REQUEST,
CONNECTION_MAIL_AVAILABLE,
CONNECTION_GUILD_MESSAGE_AVAILABLE,
CONNECTION_PERMANENT_BAN,
CONNECTION_UNBAN,
CONNECTION_FAR_TP,
CONNECTION_RET_MAINLAND,
DB_UPD_PLR,
DB_UPD_INV,
DB_INIT_PLR,
DB_INIT_INV,
DB_GROUP_UPDATE_BANK,
DB_GROUP_INIT_BANK,
DB_GROUP_RESET_BANK,
POSITION,
HARVEST_DEPOSIT,
HARVEST_CORPSE,
HARVEST_INTERRUPT,
HARVEST_CLOSE_TEMP_INVENTORY,
TRAINING,
JOB_SET_JOB_STATUS,
JOB_SWAP_JOB_STATUS,
CASTING_BEGIN,
CASTING_INTERRUPT,
FABER_OPEN,
FABER_CLOSE,
FABER_EXECUTE,
FABER_SET_NUM_ITEM,
FABER_START_CREATE,
FABER_START_REPAIR,
FABER_START_REFINE,
FABER_SET_MP_QUALITY,
FABER_SET_MP_REFINE,
FABER_SET_TOOL,
FABER_RESET_TOOL,
FABER_INTERRUPT,
COMBAT_ENGAGE,
COMBAT_DISENGAGE,
COMBAT_DEFAULT_ATTACK,
COMBAT_ENGAGE_FAILED,
COMBAT_VALIDATE_MELEE,
COMBAT_PARRY,
COMBAT_DODGE,
COMBAT_PROTECTED_SLOT,
COMBAT_FLYING_ChaScore1_DELTA,
COMBAT_FLYING_TEXT_ISE,
COMBAT_FLYING_TEXT,
STRING_TELL,
STRING_FAR_TELL,
STRING_CHAT,
STRING_CHAT_TEAM,
STRING_ADD_DYN_STR,
STRING_FILTER,
STRING_CHAT_MODE,
STRING_CHAT2,
STRING_TELL2,
STRING_DYN_STRING,
STRING_DYN_STRING_GROUP,
STRING_AFK_TXT,
STUN_STUN,
STUN_WAKE_UP,
SENTENCE_EXECUTE,
SENTENCE_CANCEL,
SENTENCE_CANCEL_CURRENT,
SENTENCE_CANCEL_ALL,
SENTENCE_CLEAR,
SENTENCE_MEMORIZE,
SENTENCE_FORGET,
SENTENCE_EVALUATE,
SENTENCE_ADD_BRICK,
SENTENCE_REMOVE_BRICK,
SENTENCE_START,
SENTENCE_STOP,
TEAM_JOIN,
TEAM_LEAVE,
TEAM_INVITATION,
TEAM_JOIN_PROPOSAL,
TEAM_JOIN_PROPOSAL_DECLINE,
TEAM_KICK,
TEAM_SET_SUCCESSOR,
TEAM_SHARE_OPEN,
TEAM_SHARE_VALID_ITEM,
TEAM_SHARE_INVALID_ITEM,
TEAM_SHARE_VALID,
TEAM_SHARE_INVALID,
TEAM_SHARE_CLOSE,
TEAM_CONTACT_INIT,
TEAM_CONTACT_ADD,
TEAM_CONTACT_DEL,
TEAM_CONTACT_MOVE,
TEAM_CONTACT_CREATE,
TEAM_CONTACT_STATUS,
TEAM_CONTACT_REMOVE,
ITEM_DROP,
ITEM_PICK_UP,
ITEM_PICK_UP_CLOSE,
ITEM_SWAP,
ITEM_ACTIVATE_SHEATH,
ITEM_HARVEST,
ITEM_HARVEST_CLOSE,
ITEM_GIVE,
ITEM_DESTROY,
ITEM_EQUIP,
ITEM_UNEQUIP,
ITEM_TEMP_TO_BAG,
ITEM_ALL_TEMP,
ITEM_NO_TEMP,
ITEM_ENCHANT,
ITEM_OPEN_ROOM_INVENTORY,
ITEM_CLOSE_ROOM_INVENTORY,
ITEM_USE_ITEM,
ITEM_STOP_USE_XP_CAT,
TP_RESPAWN,
TP_BOT,
TP_WANTED,
TP_DEST,
TP_DEST_WITH_SEASON,
TP_ACK,
TP_CORRECT,
DEATH_RESPAWN_POINT,
DEATH_ASK_RESPAWN,
DEATH_RESPAWN,
ANIMALS_BEAST,
ANIMALS_MOUNT_ABORT,
EXCHANGE_INVITATION,
EXCHANGE_CLOSE_INVITATION,
EXCHANGE_PROPOSAL,
EXCHANGE_ACCEPT_INVITATION,
EXCHANGE_DECLINE_INVITATION,
EXCHANGE_VALIDATE,
EXCHANGE_INVALIDATE,
EXCHANGE_END,
EXCHANGE_SEEDS,
EXCHANGE_ADD,
EXCHANGE_REMOVE,
DEBUG_WHERE,
DEBUG_WHO,
DEBUG_REPLY_WHERE,
DEBUG_SERVICES,
DEBUG_CMD,
DEBUG_PING,
DEBUG_COUNTER,
COMMAND_EMOTE,
COMMAND_CUSTOM_EMOTE,
COMMAND_WHERE,
COMMAND_ADMIN,
COMMAND_ADMIN_OFFLINE,
COMMAND_REMOTE_ADMIN,
COMMAND_REMOTE_ADMIN_ANSWER,
COMMAND_SIT,
COMMAND_AFK,
COMMAND_RANDOM,
COMMAND_GUILDMOTD,
MP_EVAL_SET_MP,
MP_EVAL_SET_MP_LEVEL,
MP_EVAL_SET_MARKET,
MP_EVAL_EXECUTE,
BOTCHAT_NEXT_PAGE_ITEM,
BOTCHAT_NEXT_PAGE_MISSION,
BOTCHAT_START_TRADE_ITEM,
BOTCHAT_START_TRADE_TELEPORT,
BOTCHAT_START_TRADE_FACTION,
BOTCHAT_START_TRADE_SKILL,
BOTCHAT_START_TRADE_PACT,
BOTCHAT_START_TRADE_ACTION,
BOTCHAT_BUY,
BOTCHAT_SELL,
BOTCHAT_DESTROY_ITEM,
BOTCHAT_REFRESH_TRADE_LIST,
BOTCHAT_SET_FILTERS,
BOTCHAT_START_CHOOSE_MISSION,
BOTCHAT_START_DYNAMIC_MISSION,
BOTCHAT_CONTINUE_MISSION,
BOTCHAT_VALIDATE_PLAYER_GIFT,
BOTCHAT_PICK_MISSION,
BOTCHAT_DM_CHOICE,
BOTCHAT_DM_ACCEPT,
BOTCHAT_START_NEWS,
BOTCHAT_START_CREATE_GUILD,
BOTCHAT_END,
BOTCHAT_FORCE_END,
BOTCHAT_START_CHOOSE_DUTY,
BOTCHAT_NEXT_PAGE_DUTY,
BOTCHAT_DUTY_APPLY,
BOTCHAT_DUTY_CANCEL_APPLY,
BOTCHAT_START_TRADE_GUILD_OPTIONS,
BOTCHAT_BUY_GUILD_OPTION,
BOTCHAT_START_GUILD_RESEARCH,
BOTCHAT_DESTROY_BUILDING,
BOTCHAT_DYNCHAT_OPEN,
BOTCHAT_DYNCHAT_CLOSE,
BOTCHAT_DYNCHAT_SEND,
JOURNAL_INIT_COMPLETED_MISSIONS,
JOURNAL_UPDATE_COMPLETED_MISSIONS,
JOURNAL_MISSION_ABANDON,
JOURNAL_GROUP_MISSION_ABANDON,
JOURNAL_ADD_COMPASS,
JOURNAL_ADD_COMPASS_BOT,
JOURNAL_REMOVE_COMPASS,
JOURNAL_REMOVE_COMPASS_BOT,
STRING_MANAGER_SET_LANGUAGE,
STRING_MANAGER_PHRASE_SEND,
STRING_MANAGER_STRING_RQ,
STRING_MANAGER_STRING_RESP,
STRING_MANAGER_RELOAD_CACHE,
GUILD_CREATE,
GUILD_ABORT_CREATION,
GUILD_OPEN_GUILD_WINDOW,
GUILD_INVITATION,
GUILD_ACCEPT_INVITATION,
GUILD_REFUSE_INVITATION,
GUILD_JOIN_PROPOSAL,
GUILD_SET_GRADE,
GUILD_SET_LEADER,
GUILD_KICK_MEMBER,
GUILD_TELEPORT,
GUILD_ASCENSOR,
GUILD_FIRST_ASCENSOR_PAGE,
GUILD_NEXT_ASCENSOR_PAGE,
GUILD_LEAVE_ASCENSOR,
GUILD_QUIT,
GUILD_SET_PLAYER_TITLE,
GUILD_UPDATE_PLAYER_TITLE,
GUILD_USE_FEMALE_TITLES,
GUILD_PUT_MONEY,
GUILD_TAKE_MONEY,
GUILD_OPEN_INVENTORY,
GUILD_CLOSE_INVENTORY,
OUTPOST_GIVEUP_OUTPOST,
OUTPOST_SELECT,
OUTPOST_UNSELECT,
OUTPOST_DECLARE_WAR_START,
OUTPOST_DECLARE_WAR_ACK,
OUTPOST_DECLARE_WAR_VALIDATE,
OUTPOST_SET_DEF_PERIOD,
OUTPOST_SET_SQUAD,
OUTPOST_SET_SQUAD_SPAWN,
OUTPOST_INSERT_SQUAD,
OUTPOST_REMOVE_SQUAD,
OUTPOST_SET_SQUAD_CAPITAL,
OUTPOST_CHOOSE_SIDE,
OUTPOST_SIDE_CHOSEN,
OUTPOST_BANISH_PLAYER,
OUTPOST_BANISH_GUILD,
OUTPOST_BUY_BUILDING,
OUTPOST_DESTROY_BUILDING,
PHRASE_DELETE,
PHRASE_LEARN,
PHRASE_MEMORIZE,
PHRASE_FORGET,
PHRASE_EXECUTE,
PHRASE_EXECUTE_CYCLIC,
PHRASE_EXECUTE_FABER,
PHRASE_DOWNLOAD,
PHRASE_BUY,
PHRASE_CONFIRM_BUY,
PHRASE_BUY_SHEET,
PHRASE_CANCEL_LINK,
PHRASE_CANCEL_TOP,
PHRASE_CANCEL_ALL,
PHRASE_CRISTALIZE,
PHRASE_EXEC_CYCLIC_ACK,
PHRASE_EXEC_NEXT_ACK,
ITEM_INFO_GET,
ITEM_INFO_SET,
ITEM_INFO_REFRESH_VERSION,
MISSION_PREREQ_GET,
MISSION_PREREQ_SET,
MISSION_ENTER_CRITICAL,
MISSION_ASK_ENTER_CRITICAL,
MISSION_CLOSE_ENTER_CRITICAL,
MISSION_WAKE,
MISSION_GROUP_WAKE,
DUEL_ASK,
DUEL_ACCEPT,
DUEL_REFUSE,
DUEL_ABANDON,
DUEL_INVITATION,
DUEL_CANCEL_INVITATION,
PVP_CHALLENGE_ASK,
PVP_CHALLENGE_ACCEPT,
PVP_CHALLENGE_REFUSE,
PVP_CHALLENGE_ABANDON,
PVP_CHALLENGE_INVITATION,
PVP_CHALLENGE_CANCEL_INVITATION,
PVP_PVP_TAG,
PVP_SET_NEUTRAL_ALLEGIANCE,
PVP_SET_NEUTRAL_ALLEGIANCE_GUILD,
PVP_FACTION_PUSH_FACTION_WAR,
PVP_FACTION_POP_FACTION_WAR,
PVP_FACTION_FACTION_WARS,
ENCYCLOPEDIA_UPDATE,
ENCYCLOPEDIA_INIT,
USER_BARS,
USER_POPUP,
EVENT_SET_ITEM_CUSTOM_TEXT,
EVENT_DUMMY,
TOTEM_BUILD,
TOTEM_DUMMY,
MODULE_GATEWAY_FEOPEN,
MODULE_GATEWAY_GATEWAY_MSG,
MODULE_GATEWAY_FECLOSE,
SEASON_SET,
SEASON_DUMMY,
DM_GIFT_BEGIN,
DM_GIFT_VALIDATE,
RING_MISSION_MISSION_RING_SELECT,
RING_MISSION_DSS_DOWN,
NPC_ICON_GET_DESC,
NPC_ICON_SET_DESC,
NPC_ICON_SVR_EVENT_MIS_AVL,
NPC_ICON_SET_TIMER,
__LAST_ELEMENT
};
class ElementHead
{
private:
uint32_t _size;
uint32_t _pos;
String _name;
public:
ElementHead() {}
~ElementHead() {}
void set_size(uint32_t size){_size = size;}
void set_pos(uint32_t pos){_pos = pos;}
void set_name(String name){_name = name;}
void create(uint32_t pos, uint32_t size,String name) {set_pos(pos);set_size(size);set_name(name);}
uint32_t get_size() {return _size;}
uint32_t get_pos() {return _pos;}
String get_name() {return _name;}
};
private:
static ReferentialMessageCore *singleton;
BitStream _encoder[Command::__LAST_ELEMENT];
Ref<ElementReferential> _decoder;
int get_command(String name);
void read_referential_step(Dictionary step, Vector<ElementHead> head, Ref<ElementReferential> root);
public:
static ReferentialMessageCore * get_singleton();
ReferentialMessageCore() {_decoder.instance();}
~ReferentialMessageCore() {_decoder.unref();}
void read_referential(Dictionary dictionary_message);
void show();
static void clear_session();
};
VARIANT_ENUM_CAST(ReferentialMessageCore::Command);
#endif