update network part

This commit is contained in:
AleaJactaEst 2020-04-10 18:09:06 +02:00
parent e40e7de052
commit eab87e071f
11 changed files with 1202 additions and 177 deletions

154
README.md
View file

@ -141,6 +141,80 @@ ReferentialMessageCore -> class singleton (uniq object) [Manage data provide by
### ViewMessage
Message UDP :
+-------------------+------------+---
| CurrentSendNumber | SystemMode | . . .
| 32 bits | 1 bit |
+-+-+-+-+-+-+-+-+-+-+------------+---
1 -> system mode
0 -> normal mode
+---------+
| | +----------------+
| | -> | System Message |
| Message | +----------------+
| |
| UDP | +----------------+ +---------------+ +---------+ +---------+ +---------+
| | -> | Normal Message | -> |LastReceivedAck|-| Level A +-+ Level B +-+ Level C +
| | +----------------+ +---------------+ +---------+ +---------+ +---------+
+---------+
System mode :
+---------+--
| Message | see system message
| 8 bits |
+---------+--
System Message:
SYSTEM_LOGIN_CODE = 0 : [client]
...
SYSTEM_SYNC_CODE = 1 : [server]
+----
| Synchronize (32 bits - unsigned)
+------
| stime (64 bits - signed)
+------
| LatestSync ( 32 bits - unsigned )
+------
| MsgData ( 16 * 8bits : Array - md5sum of msg.xml)
+------
| DatabaseData ( 16 * 8 bits : Array - md5sum database.xml)
+------
SYSTEM_ACK_SYNC_CODE = 2 : [client]
+----
| frontack ( 32 bits - unsigned)
+----
| backack ( 32 bits - unsigned)
+----
| longackbitfield ( 1024 )
+----
| syncCode ( 32 bits unsigned)
+----
SYSTEM_PROBE_CODE = 3 : [server]
+----
| LatestProbe ( 32 bits - signed)
+----
SYSTEM_ACK_PROBE_CODE = 4 : [client]
...
SYSTEM_DISCONNECTION_CODE = 5 : [client]
...
SYSTEM_STALLED_CODE = 6 : [server]
No more data
SYSTEM_SERVER_DOWN_CODE = 7 : [server]
No more data
SYSTEM_QUIT_CODE = 8 : [client]
...
SYSTEM_ACK_QUIT_CODE = 9 : [server]
No more data
Normal mode: :
PacketServer
+---------+ +---------+ +---------+
| Level A | | Level B | | Level C |
@ -159,35 +233,55 @@ PacketServer
| (3) |
+---------+
+---------------+
|LastReceivedAck|
| 32 bits |
+---------------+
Message UDP :
+-------------+
| Server Part |
+-------------+
| Type Message (system / application) |
+---------+ +-----+-+-----------+ +-------------+
| Level X | -> | next | shortcode | -> 1 (true) | Action code | +-----------
+---------+ | 1 bit | 1 bit | | 2 bit | | Action
+-------+-----------+ +-------------+ -> | (X bits)
+-------------+ +-----------
-> 0 (false) | Action code |
| 8 bits |
+-------------+
+---------+
| | +----------------+
| | -> | System Message |
| Message | +----------------+
| |
| UDP | +----------------+ +---------+ +---------+ +---------+
| | -> | Normal Message | -> | Level A +-+ Level B +-+ Level C +
| | +----------------+ +---------+ +---------+ +---------+
+---------+
Message UDP :
+-------------------+------------+---
| CurrentSendNumber | SystemMode | . . .
| 32 bits | 1 bit |
+-+-+-+-+-+-+-+-+-+-+------------+---
1 -> system mode
0 -> normal mode
System Message :
+---------+--
| Message | . . .
| 8 bits |
+---------+--
Action code :
ACTION_POSITION_CODE = 0: khanat-opennel-code/code/ryzom/common/src/game_share/action_position.cpp:34 void CActionPosition::unpack (NLMISC::CBitMemStream &message)
px ( 16 bit unsigned )
py ( 16 bit unsigned )
pz ( 16 bit unsigned ) : low bit have other signification
0x01 : IsRelative
0x02 : Interior
ACTION_GENERIC_CODE = 1: khanat-opennel-code/code/ryzom/common/src/game_share/action_generic.cpp void CActionGeneric::unpack (NLMISC::CBitMemStream &message)
size ( 32 bits unsigned ) : if size > 512 we have an error (normally reject by server)
StreamByte ( Array : size * 8 bits unsigned )
ACTION_GENERIC_MULTI_PART_CODE = 2 : khanat-opennel-code/code/ryzom/common/src/game_share/action_generic_multi_part.h:46 virtual void unpack (NLMISC::CBitMemStream &message)
Number ( 8 bits unsigned )
Part ( 16 bits unsigned )
NbBlock ( 16 bits unsigned )
size ( 32 bits unsigned )
PartCont ( Array : size * 8 bits unsigned )
ACTION_SINT64 = 3 : khanat-opennel-code/code/ryzom/common/src/game_share/action_sint64.cpp:86 void CActionSint64::unpack (NLMISC::CBitMemStream &message)
value ( 64 bits unsigned )
ACTION_SYNC_CODE = 10 : khanat-opennel-code/code/ryzom/common/src/game_share/action_sync.h:44 virtual void unpack (NLMISC::CBitMemStream &message)
Sync ( 32 bits unsigned )
BKEntityId ( 64 bits unsigned ) [see definition : khanat-opennel-code/code/nel/include/nel/misc/entity_id.h:64]
ACTION_DISCONNECTION_CODE = 11 : khanat-opennel-code/code/ryzom/common/src/game_share/action_disconnection.h
No data
ACTION_ASSOCIATION_CODE = 12 : khanat-opennel-code/code/ryzom/common/src/game_share/action_association.h virtual void unpack (NLMISC::CBitMemStream &message)
IsNewAssociation ( bool / 1 bit )
if IsNewAssociation is true:
SheetId ( 32 bits unsigned )
Replace ( bool / 1 bit )
ACTION_LOGIN_CODE = 13 : khanat-opennel-code/code/ryzom/common/src/game_share/action_login.h virtual void unpack (NLMISC::CBitMemStream &message)
ua ( 32 bits unsigned )
uk ( 32 bits unsigned )
ui ( 32 bits unsigned )
ACTION_TARGET_SLOT_CODE = 40 : khanat-opennel-code/code/ryzom/common/src/game_share/action_target_slot.h virtual void unpack (NLMISC::CBitMemStream &message)
Slot ( 8 bits unsigned )
TargetOrPickup (2 bits unsigned)
ACTION_DUMMY_CODE = 99 : khanat-opennel-code/code/ryzom/common/src/game_share/action_dummy.h virtual void unpack (NLMISC::CBitMemStream &message)
Dummy1 ( 32 bits unsigned )
Dummy2 ( 32 bits unsigned )

View file

@ -16,59 +16,59 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
class connexion:
# var _url_login = "http://http://149.91.80.160/login/r2_login.php"
var _url_login = "https://lirria.khaganat.net/login/r2_login.php"
# var _url_register = "http://149.91.80.160/ams/index.php?page=register"
var _url_register = "http://lirria.khaganat.net/ams/index.php?page=register"
# var _url_login = "http://http://149.91.80.160/login/r2_login.php"
var _url_login = "https://lirria.khaganat.net/login/r2_login.php"
# var _url_register = "http://149.91.80.160/ams/index.php?page=register"
var _url_register = "http://lirria.khaganat.net/ams/index.php?page=register"
var _language = "fr"
var _valid_certificate = true
var _language = "fr"
var _valid_certificate = true
func save():
print("[config connexion] Save connexion config")
var config_file = ConfigFile.new()
config_file.set_value("login", "url", _url_login)
config_file.set_value("register", "url", _url_register)
config_file.set_value("global", "valid_certificate", _valid_certificate)
config_file.set_value("global", "language", _language)
config_file.save("user://connexion.cfg")
func save():
print("[config connexion] Save connexion config")
var config_file = ConfigFile.new()
config_file.set_value("login", "url", _url_login)
config_file.set_value("register", "url", _url_register)
config_file.set_value("global", "valid_certificate", _valid_certificate)
config_file.set_value("global", "language", _language)
config_file.save("user://connexion.cfg")
func _init():
print("[config connexion] Load connexion config")
#var message = load("res://assets/Scripts/Models/nel_login_message.gd")
var config_file = ConfigFile.new()
func _init():
print("[config connexion] Load connexion config")
#var message = load("res://assets/Scripts/Models/nel_login_message.gd")
var config_file = ConfigFile.new()
# /home/<account>/.local/share/godot/app_userdata/Khanat/connexion.cfg
var err = config_file.load("user://connexion.cfg")
if err:
print("Error code when loading player config file khanat.cfg: ", err)
save()
# /home/<account>/.local/share/godot/app_userdata/Khanat/connexion.cfg
var err = config_file.load("user://connexion.cfg")
if err:
print("Error code when loading player config file khanat.cfg: ", err)
save()
self._url_login = config_file.get_value("login", "url", self._url_login)
self._url_register = config_file.get_value("register", "url", self._url_register)
self._language = config_file.get_value("global", "language", self._language)
self._valid_certificate = config_file.get_value("global", "valid_certificate", self._valid_certificate)
self._url_login = config_file.get_value("login", "url", self._url_login)
self._url_register = config_file.get_value("register", "url", self._url_register)
self._language = config_file.get_value("global", "language", self._language)
self._valid_certificate = config_file.get_value("global", "valid_certificate", self._valid_certificate)
func get_url_login():
return self._url_login
func get_url_login():
return self._url_login
func get_url_register():
return self._url_register
func get_url_register():
return self._url_register
func get_valid_certificate():
return self._valid_certificate
func get_valid_certificate():
return self._valid_certificate
func get_language():
return self._language
func get_language():
return self._language
func set_url_login(url):
self._url_login = url
func set_url_login(url):
self._url_login = url
func set_url_register(url):
self._url_register = url
func set_url_register(url):
self._url_register = url
func set_valid_certificate(value):
self._valid_certificate = value
func set_valid_certificate(value):
self._valid_certificate = value
func set_language(value):
self._language = value
func set_language(value):
self._language = value

View file

@ -9,89 +9,89 @@ var _msg_md5sum
var _msg_data = {}
func open_message_xml():
var file = File.new()
# Calculate MD5SUM
file.open("res://assets/Definition/msg.xml", File.READ)
var content = file.get_as_text()
_msg_md5sum = content.md5_text()
file.close()
print("[res://assets/Scripts/Definition/msg.gd:open_message_xml] checksum for msg.xml:" + _msg_md5sum)
#var NetworkConnexion = preload("res://networkconnexion.gdns").new()
var networkconnection = NetworkConnection.new()
networkconnection.define_checksum_msg_xml(content.md5_buffer())
# Load XML data
#_msg_xml.open("res://assets/Definition/msg.xml")
var file = File.new()
# Calculate MD5SUM
file.open("res://assets/Definition/msg.xml", File.READ)
var content = file.get_as_text()
_msg_md5sum = content.md5_text()
file.close()
print("[res://assets/Scripts/Definition/msg.gd:open_message_xml] checksum for msg.xml:" + _msg_md5sum)
#var NetworkConnexion = preload("res://networkconnexion.gdns").new()
var networkconnection = NetworkConnection.new()
networkconnection.define_checksum_msg_xml(content.md5_buffer())
# Load XML data
#_msg_xml.open("res://assets/Definition/msg.xml")
func is_correct_md5(value):
return (_msg_md5sum == value)
return (_msg_md5sum == value)
func load_node(_msg_xml, level):
var ret = _msg_xml.read()
var i
var name
var index = 0
var dico = {}
while ret == OK:
match _msg_xml.get_node_type():
XMLParser.NODE_NONE: # 0
# print("NODE_NONE")
pass
XMLParser.NODE_ELEMENT: # 1
i = 0
while i < _msg_xml.get_attribute_count() and _msg_xml.get_attribute_name(i) != "name":
i += 1
if i < _msg_xml.get_attribute_count():
name = _msg_xml.get_attribute_value(i)
#print("NODE_ELEMENT level:" + str(level) + " index:" + str(index) + " name:" + name)
if not _msg_xml.is_empty():
dico[str(index)+":"+name] = load_node(_msg_xml, level+1)
else:
dico[str(index)+":"+name] = {}
index += 1
XMLParser.NODE_ELEMENT_END: # 2
# print("NODE_ELEMENT_END")
# level -= 1
return dico
XMLParser.NODE_TEXT: # 3
#i = 0
#while i < _msg_xml.get_attribute_count() and _msg_xml.get_attribute_name(i) != "name":
# i += 1
#if i < _msg_xml.get_attribute_count():
# name = _msg_xml.get_attribute_value(i)
# print("NODE_TEXT level:" + str(level) + " name:" + name)
pass
XMLParser.NODE_COMMENT: # 4
# print("NODE_COMMENT")
pass
XMLParser.NODE_CDATA: # 5
# print("NODE_CDATA")
pass
XMLParser.NODE_UNKNOWN: # 6
# print("NODE_UNKNOWN")
pass
_:
# print("NODE_XXXXXXX")
pass
ret = _msg_xml.read()
return dico
var ret = _msg_xml.read()
var i
var name
var index = 0
var dico = {}
while ret == OK:
match _msg_xml.get_node_type():
XMLParser.NODE_NONE: # 0
# print("NODE_NONE")
pass
XMLParser.NODE_ELEMENT: # 1
i = 0
while i < _msg_xml.get_attribute_count() and _msg_xml.get_attribute_name(i) != "name":
i += 1
if i < _msg_xml.get_attribute_count():
name = _msg_xml.get_attribute_value(i)
#print("NODE_ELEMENT level:" + str(level) + " index:" + str(index) + " name:" + name)
if not _msg_xml.is_empty():
dico[str(index)+":"+name] = load_node(_msg_xml, level+1)
else:
dico[str(index)+":"+name] = {}
index += 1
XMLParser.NODE_ELEMENT_END: # 2
# print("NODE_ELEMENT_END")
# level -= 1
return dico
XMLParser.NODE_TEXT: # 3
#i = 0
#while i < _msg_xml.get_attribute_count() and _msg_xml.get_attribute_name(i) != "name":
# i += 1
#if i < _msg_xml.get_attribute_count():
# name = _msg_xml.get_attribute_value(i)
# print("NODE_TEXT level:" + str(level) + " name:" + name)
pass
XMLParser.NODE_COMMENT: # 4
# print("NODE_COMMENT")
pass
XMLParser.NODE_CDATA: # 5
# print("NODE_CDATA")
pass
XMLParser.NODE_UNKNOWN: # 6
# print("NODE_UNKNOWN")
pass
_:
# print("NODE_XXXXXXX")
pass
ret = _msg_xml.read()
return dico
func read_all_node():
var _msg_xml = XMLParser.new()
_msg_xml.open("res://assets/Definition/msg.xml")
_msg_xml.seek(0)
var dico = load_node(_msg_xml, 0)
var ref = ReferentialMessage.new()
#print(dico)
ref.read_referential(dico)
ref.show()
#print("---")
var _msg_xml = XMLParser.new()
_msg_xml.open("res://assets/Definition/msg.xml")
_msg_xml.seek(0)
var dico = load_node(_msg_xml, 0)
var ref = ReferentialMessage.new()
#print(dico)
ref.read_referential(dico)
ref.show()
#print("---")
# Called when the node enters the scene tree for the first time.
func _ready():
open_message_xml()
read_all_node()
print("[res://assets/Scripts/Definition/msg.gd] ready")
open_message_xml()
read_all_node()
print("[res://assets/Scripts/Definition/msg.gd] ready")
# Called every frame. 'delta' is the elapsed time since the previous frame.
@ -100,11 +100,11 @@ func _ready():
func read_msg(msgin):
pass
pass
func write_msg(value):
pass
pass
func _exit_tree():
pass
pass

View file

@ -23,16 +23,16 @@ func test_write():
var bitset = BitSet.new()
print ("[bitset:test_put]")
bitset.resize(1024)
print ("[bitset:test_put] " + bitset.show())
#print ("[bitset:test_put] " + bitset.show())
assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
bitset.write(1, 1)
print ("[bitset:test_put] " + bitset.show())
#print ("[bitset:test_put] " + bitset.show())
assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
bitset.write(2, 1)
print ("[bitset:test_put] " + bitset.show())
#print ("[bitset:test_put] " + bitset.show())
assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
bitset.write(1, 0)
print ("[bitset:test_put] " + bitset.show())
#print ("[bitset:test_put] " + bitset.show())
assert( bitset.show() == "0000000000000000000000000000010000000000000000000000000000000000001000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
func test_alloc():

View file

@ -109,7 +109,7 @@ void BitSet::set_bit(uint32_t bit_number)
OS::get_singleton()->print((String("INFO [") + String(__FILE__) + String(":") + String(uitos(__LINE__)) + String("] set_bit") + String("\n")).utf8());
if (bit_number >= this->_num_bits)
{
ERR_PRINTS("[BitSet::set_bit] Out of range (size:" + itos(this->_size_byte) + ", pos:" + itos(bit_number) + ")" );
ERR_PRINT("[BitSet::set_bit] Out of range (size:" + itos(this->_size_byte) + ", pos:" + itos(bit_number) + ")" );
throw "Out of range";
}
uint32_t mask = bit_number & (BITSET_SIZE - 1);
@ -122,7 +122,7 @@ void BitSet::clear_bit(uint32_t bit_number)
OS::get_singleton()->print((String("INFO [") + String(__FILE__) + String(":") + String(uitos(__LINE__)) + String("] clear_bit") + String("\n")).utf8());
if (bit_number >= this->_num_bits)
{
ERR_PRINTS("[BitSet::clear_bit] Out of range (size:" + itos(this->_size_byte) + ", pos:" + itos(bit_number) + ")" );
ERR_PRINT("[BitSet::clear_bit] Out of range (size:" + itos(this->_size_byte) + ", pos:" + itos(bit_number) + ")" );
throw "Out of range";
}
uint32_t mask = bit_number & (BITSET_SIZE - 1);
@ -134,7 +134,7 @@ void BitSet::write(uint32_t bit_number, bool value)
{
if (bit_number >= this->_num_bits)
{
ERR_PRINTS("[BitSet::put] Out of range (size:" + itos(this->_size_byte) + ", pos:" + itos(bit_number) + ")" );
ERR_PRINT("[BitSet::put] Out of range (size:" + itos(this->_size_byte) + ", pos:" + itos(bit_number) + ")" );
throw "Out of range";
}
if ( value == true )
@ -147,7 +147,7 @@ bool BitSet::read(uint32_t bit_number)
{
if (bit_number >= this->_num_bits)
{
ERR_PRINTS("[BitSet::pull] Out of range (size:" + itos(this->_size_byte) + ", pos:" + itos(bit_number) + ")" );
ERR_PRINT("[BitSet::pull] Out of range (size:" + itos(this->_size_byte) + ", pos:" + itos(bit_number) + ")" );
throw "Out of range";
}
uint32_t mask = bit_number & (BITSET_SIZE - 1);
@ -179,7 +179,7 @@ void BitSet::read_serial(Ref<BitStream> msgin)
this->_data[i] = msgin->get_uint32();
break;
default:
ERR_PRINTS("[BitSet::read_serial] Unknown version: " + itos(current_version));
ERR_PRINT("[BitSet::read_serial] Unknown version: " + itos(current_version));
throw "Unknown version";
break;
}

View file

@ -47,6 +47,19 @@ void NetworkData::initialize()
this->_server_sync = 0;
this->_client_sync = 0;
this->_current_send_number = 0;
}
void NetworkData::reset_last_ack()
{
int i;
for(i=0;i<1;++i)
this->_last_ack_0[i] = 0xffffffff;
for(i=0;i<2;++i)
this->_last_ack_1[i] = 0xffffffff;
for(i=0;i<4;++i)
this->_last_ack_2[i] = 0xffffffff;
}
void NetworkData::define_lang(String lang)

View file

@ -27,7 +27,7 @@
#include "core/ustring.h"
//define MAX_LOOP_READ_BY_STEP 10
#define NUM_BITS_IN_LONG_ACK 512
#define NUM_BITS_IN_LONG_ACK 1024
class NetworkData
{
@ -42,6 +42,8 @@ public:
uint32_t _current_received_number;
uint32_t _last_received_number;
uint32_t _current_send_number;
uint32_t _ms_per_tick;
uint32_t _current_client_time;
uint32_t _update_time;
@ -49,6 +51,8 @@ public:
int32_t _last_ack_bit;
uint32_t _last_ack_in_long_ack;
uint32_t _last_received_ack;
int32_t _client_sync;
int32_t _server_sync;
@ -61,10 +65,15 @@ public:
Array _latest_probes;
Array _checksum_msg_xml;
uint32_t _last_ack_0[1];
uint32_t _last_ack_1[2];
uint32_t _last_ack_2[4];
NetworkData();
~NetworkData();
void initialize();
void reset_last_ack();
void define_lang(String lang);
void define_user(String user_addr, String user_key, String user_id);
void define_checksum_msg_xml(Array & checksum_msg_xml);

View file

@ -35,6 +35,8 @@ inline uint32_t diff_uint32_circulate(uint32_t a, uint32_t b)
// Group 1 : < 0...1073741824 > + < 3221225472 ... 4294967295 > => number value : 2147483648
// Group 2 : < 1073741825 ... 3221225472 > => number value : 2147483648
//
// TODO - check how server manage cyclic uint32 (receivedPacket / receivedAck)
// if not managed, hum
if ( a >= 1073741825 && a <= 3221225472 )
return a - b;
@ -45,6 +47,8 @@ inline uint32_t diff_uint32_circulate(uint32_t a, uint32_t b)
inline void calculate_ack_bit(NetworkData * _data, bool ackBool)
{
// khanat-opennel-code/code/ryzom/client/src/network_connection.cpp # bool CNetworkConnection::decodeHeader(CBitMemStream &msgin, bool checkMessageNumber)
// bool ackBool = (!_SystemMode && (_ConnectionState == Connected || _ConnectionState == Synchronize));
uint32_t i;
uint32_t ackBit = (ackBool ? 1 : 0);
@ -62,7 +66,9 @@ inline void calculate_ack_bit(NetworkData * _data, bool ackBool)
for(i=_data->_last_received_number+1;i<_data->_current_received_number;++i)
_data->_long_ack_bit_field.clear_bit(i & 511);
_data->_long_ack_bit_field.write(_data->_current_received_number & 0x1ff, ackBool);
if ( diff_uint32_circulate(_data->_last_ack_in_long_ack, _data->_current_received_number) > 512 )
//if ( diff_uint32_circulate(_data->_last_ack_in_long_ack, _data->_current_received_number) <= 512 )
if ( _data->_last_ack_in_long_ack <= _data->_current_received_number - 512 )
{
_data->_last_ack_in_long_ack = _data->_current_received_number - 511;
}
@ -197,7 +203,7 @@ void StateConnectionSynchronize::receive_system_sync(Ref<BitStream> msgin)
if ( msg_xml.size() != this->_data->_checksum_msg_xml.size() )
{
valide = false;
ERR_PRINTS("MSG XML is incorrect (server:" + itos(msg_xml.size()) +", client:" + itos(this->_data->_checksum_msg_xml.size()) + ")");
ERR_PRINT("MSG XML is incorrect (server:" + itos(msg_xml.size()) +", client:" + itos(this->_data->_checksum_msg_xml.size()) + ")");
}
else
{
@ -206,7 +212,7 @@ void StateConnectionSynchronize::receive_system_sync(Ref<BitStream> msgin)
if ( (int) msg_xml[i] != (int) this->_data->_checksum_msg_xml[i] )
{
valide = false;
ERR_PRINTS("MSG XML is incorrect (pos:" + itos(i) +")");
ERR_PRINT("MSG XML is incorrect (pos:" + itos(i) +")");
}
}
}
@ -222,7 +228,7 @@ void StateConnectionSynchronize::receive_system_sync(Ref<BitStream> msgin)
//this->_state = STATE::Synchronize;
}
else
ERR_PRINTS("MSG.XML is wrong");
ERR_PRINT("MSG.XML is wrong");
}
void StateConnectionSynchronize::receive_message(int index)
@ -261,7 +267,7 @@ void StateConnectionSynchronize::receive_message(int index)
DBG_PRINT("SYSTEM_PROBE_CODE\n");
break;
default:
ERR_PRINTS("Received unknown message [" + itos(message) + "]");
ERR_PRINT("Received unknown message [" + itos(message) + "]");
break;
}
}
@ -377,7 +383,7 @@ void StateConnectionConnected::receive_system_sync(Ref<BitStream> msgin)
if ( msg_xml.size() != this->_data->_checksum_msg_xml.size() )
{
valide = false;
ERR_PRINTS("MSG XML is incorrect (server:" + itos(msg_xml.size()) +", client:" + itos(this->_data->_checksum_msg_xml.size()) + ")");
ERR_PRINT("MSG XML is incorrect (server:" + itos(msg_xml.size()) +", client:" + itos(this->_data->_checksum_msg_xml.size()) + ")");
}
else
{
@ -386,7 +392,7 @@ void StateConnectionConnected::receive_system_sync(Ref<BitStream> msgin)
if ( (int) msg_xml[i] != (int) this->_data->_checksum_msg_xml[i] )
{
valide = false;
ERR_PRINTS("MSG XML is incorrect (pos:" + itos(i) +")");
ERR_PRINT("MSG XML is incorrect (pos:" + itos(i) +")");
}
}
}
@ -402,7 +408,212 @@ void StateConnectionConnected::receive_system_sync(Ref<BitStream> msgin)
//this->_state = STATE::Synchronize;
}
else
ERR_PRINTS("MSG.XML is wrong");
ERR_PRINT("MSG.XML is wrong");
}
void StateConnectionConnected::unpack(Ref<BitStream> msgin)
{
bool shortcode = msgin->get_bool();
uint8_t code;
DBG_PRINT("shortcode:" + itos(shortcode));
if ( shortcode == true )
code = msgin->get_serial(2);
else
code = msgin->get_uint8();
DBG_PRINT("code:" + itos(code));
switch (code)
{
case ACTIONCODE::ACTION_POSITION_CODE:
{
// khanat-opennel-code/code/ryzom/common/src/game_share/action_position.cpp:34 void CActionPosition::unpack (NLMISC::CBitMemStream &message)
// px ( 16 bit unsigned )
// py ( 16 bit unsigned )
// pz ( 16 bit unsigned ) : low bit have other signification
// 0x01 : IsRelative
// 0x02 : Interior
DBG_PRINT("ACTION_GENERIC_CODE");
uint16_t px = msgin->get_uint16();
uint16_t py = msgin->get_uint16();
uint16_t pz = msgin->get_uint16();
bool IsRelative = (pz & 0x1) != 0;
bool Interior = (pz & 0x2) != 0;
DBG_PRINT("ACTION_GENERIC_CODE px:" + uitos(px) + " py:" + uitos(py) + " pz:" + uitos(pz) + " IsRelative:" + uitos(IsRelative) + " Interior:" + uitos(Interior));
break;
}
case ACTIONCODE::ACTION_GENERIC_CODE:
{
DBG_PRINT("ACTION_GENERIC_CODE");
// khanat-opennel-code/code/ryzom/common/src/game_share/action_generic.cpp void CActionGeneric::unpack (NLMISC::CBitMemStream &message)
// size ( 32 bits unsigned ) : if size > 512 we have an error (normally reject by server)
// StreamByte ( Array : size * 8 bits unsigned )
uint32_t size = msgin->get_uint32();
DBG_PRINT("ACTION_GENERIC_CODE size:" + uitos(size));
PoolByteArray StreamByte = msgin->get_array_uint8(size);
DBG_PRINT("ACTION_GENERIC_CODE size:" + uitos(size));
break;
}
case ACTIONCODE::ACTION_GENERIC_MULTI_PART_CODE:
{
DBG_PRINT("ACTION_GENERIC_MULTI_PART_CODE");
// khanat-opennel-code/code/ryzom/common/src/game_share/action_generic_multi_part.h:46 virtual void unpack (NLMISC::CBitMemStream &message)
// Number ( 8 bits unsigned )
// Part ( 16 bits unsigned )
// NbBlock ( 16 bits unsigned )
// size ( 32 bits unsigned )
// PartCont ( Array : size * 8 bits unsigned )
uint8_t Number = msgin->get_uint8();
uint16_t Part = msgin->get_uint16();
uint16_t NbBlock = msgin->get_uint16();
uint32_t size = msgin->get_uint32();
PoolByteArray StreamByte = msgin->get_array_uint8(size);
DBG_PRINT("ACTION_GENERIC_MULTI_PART_CODE Number:" + uitos(Number) + " Part:" + uitos(Part) + " NbBlock:" + uitos(NbBlock) + " size:" + uitos(size));
break;
}
case ACTIONCODE::ACTION_SINT64:
{
DBG_PRINT("ACTION_SINT64");
// khanat-opennel-code/code/ryzom/common/src/game_share/action_sint64.cpp:86 void CActionSint64::unpack (NLMISC::CBitMemStream &message)
// value ( 64 bits unsigned )
uint64_t value = msgin->get_uint64();
DBG_PRINT("ACTION_SINT64 value:" + uitos(value));
break;
}
case ACTIONCODE::ACTION_SYNC_CODE:
{
DBG_PRINT("ACTION_SYNC_CODE");
// khanat-opennel-code/code/ryzom/common/src/game_share/action_sync.h:44 virtual void unpack (NLMISC::CBitMemStream &message)
// Sync ( 32 bits unsigned )
// BKEntityId ( 64 bits unsigned ) [see definition : khanat-opennel-code/code/nel/include/nel/misc/entity_id.h:64]
uint32_t Sync = msgin->get_uint32();
uint64_t BKEntityId = msgin->get_uint64();
DBG_PRINT("ACTION_SYNC_CODE Sync:" + uitos(Sync) + " BKEntityId:" + uitos(BKEntityId));
break;
}
case ACTIONCODE::ACTION_DISCONNECTION_CODE:
{
// khanat-opennel-code/code/ryzom/common/src/game_share/action_disconnection.h
// No data
DBG_PRINT("ACTION_DISCONNECTION_CODE");
break;
}
case ACTIONCODE::ACTION_ASSOCIATION_CODE:
{
DBG_PRINT("ACTION_ASSOCIATION_CODE");
// khanat-opennel-code/code/ryzom/common/src/game_share/action_association.h virtual void unpack (NLMISC::CBitMemStream &message)
// IsNewAssociation ( bool / 1 bit )
// if IsNewAssociation is true:
// SheetId ( 32 bits unsigned )
// Replace ( bool / 1 bit )
uint32_t SheetId = msgin->get_uint32();
bool Replace = msgin->get_bool();
DBG_PRINT("ACTION_ASSOCIATION_CODE SheetId:" + uitos(SheetId) + " Replace:" + uitos(Replace));
break;
}
case ACTIONCODE::ACTION_LOGIN_CODE:
{
DBG_PRINT("ACTION_LOGIN_CODE");
// khanat-opennel-code/code/ryzom/common/src/game_share/action_login.h virtual void unpack (NLMISC::CBitMemStream &message)
// ua ( 32 bits unsigned )
// uk ( 32 bits unsigned )
// ui ( 32 bits unsigned )
uint32_t ua = msgin->get_uint32();
uint32_t uk = msgin->get_uint32();
uint32_t ui = msgin->get_uint32();
DBG_PRINT("ACTION_LOGIN_CODE ua:" + uitos(ua) + " uk:" + uitos(uk)+ " ui:" + uitos(ui));
break;
}
case ACTIONCODE::ACTION_TARGET_SLOT_CODE:
{
DBG_PRINT("ACTION_TARGET_SLOT_CODE");
// khanat-opennel-code/code/ryzom/common/src/game_share/action_target_slot.h virtual void unpack (NLMISC::CBitMemStream &message)
// Slot ( 8 bits unsigned )
// TargetOrPickup (2 bits unsigned)
uint8_t Slot = msgin->get_uint8();
uint32_t TargetOrPickup = msgin->get_serial(2);
DBG_PRINT("ACTION_TARGET_SLOT_CODE Slot:" + uitos(Slot) + " TargetOrPickup:" + uitos(TargetOrPickup));
break;
}
case ACTIONCODE::ACTION_DUMMY_CODE:
{
DBG_PRINT("ACTION_DUMMY_CODE");
// khanat-opennel-code/code/ryzom/common/src/game_share/action_dummy.h virtual void unpack (NLMISC::CBitMemStream &message)
// Dummy1 ( 32 bits unsigned )
// Dummy2 ( 32 bits unsigned )
uint32_t Dummy1 = msgin->get_uint32();
uint32_t Dummy2 = msgin->get_uint32();
DBG_PRINT("ACTION_DUMMY_CODE Dummy1:" + uitos(Dummy1) + " Dummy2:" + uitos(Dummy2));
break;
}
default:
{
ERR_PRINT("Impossible to decode message received from server (code:" + uitos(code) + ")");
break;
}
}
}
void StateConnectionConnected::decode(Ref<BitStream> msgin, uint32_t current_received_number, uint32_t received_ack, uint32_t next_sent_packet)
{
// khanat-opennel-code/code/ryzom/client/src/impulse_decoder.cpp:38 void CImpulseDecoder::decode(CBitMemStream &inbox, TPacketNumber receivedPacket, TPacketNumber receivedAck, TPacketNumber nextSentPacket, vector<CLFECOMMON::CAction *> &actions)
int keep;
bool check_once;
bool next;
uint32_t * last_ack;
int level;
int channel;
int num;
this->_data->_last_received_ack = msgin->get_uint32();
for( level=0 ; level < 3 ; ++level )
{
DBG_PRINT("level:" + itos(level));
switch(level)
{
case 0:
last_ack = this->_data->_last_ack_0;
channel = 0;
break;
case 1:
last_ack = this->_data->_last_ack_1;
channel = current_received_number & 1;
break;
default: // 2
last_ack = this->_data->_last_ack_2;
channel = current_received_number & 3;
break;
}
DBG_PRINT("channel:" + itos(channel));
keep = -1;
check_once = false;
num = 0;
next = msgin->get_bool();
DBG_PRINT("next:" + itos(next));
while(next == true)
{
if( check_once == false )
{
check_once = true;
//keep = diff_uint32_circulate(received_ack, last_ack[channel]) >= 0;
keep = received_ack >= last_ack[channel];
if(keep)
last_ack[channel] = next_sent_packet;
}
num ++;
unpack(msgin);
/*
action = self._CActionFactory.unpack(msgin)
if keep:
logging.getLogger(LOGGER).debug("keep : %s" % str(action))
actions.append(copy.copy(action))
elif action:
logging.getLogger(LOGGER).debug("append : %s" % str(action))
self.removeCAction(copy.copy(action))
*/
// read next packet
next = msgin->get_bool();
DBG_PRINT("next:" + itos(next));
}
}
}
void StateConnectionConnected::receive_message(int index)
@ -457,7 +668,8 @@ void StateConnectionConnected::receive_message(int index)
}
else
{
DBG_PRINT("Receive application message (" + itos(current_received_number) + ") [" + uitos(this->_network->_queue.length()) + "]");
DBG_PRINT("Receive application message (current_received_number:" + itos(current_received_number) + ") [queue length:" + uitos(this->_network->_queue.length()) + "]");
decode(msgin, current_received_number, this->_data->_last_received_ack, this->_data->_current_send_number);
}
calculate_ack_bit(this->_data, system_mode);

View file

@ -28,7 +28,7 @@
#include "network_data.h"
#define MAX_SIZE_BIT_STREAM_QUEUE 10
#define NUM_BITS_IN_LONG_ACK 512
//define NUM_BITS_IN_LONG_ACK 512
enum STATE {
NotInitialised = 0,
@ -58,6 +58,20 @@ enum CLFECOMMON {
NUMBITSINLONGACK = 512
};
enum ACTIONCODE {
ACTION_POSITION_CODE = 0,
ACTION_GENERIC_CODE = 1,
ACTION_GENERIC_MULTI_PART_CODE = 2,
ACTION_SINT64 = 3,
ACTION_SYNC_CODE = 10,
ACTION_DISCONNECTION_CODE = 11,
ACTION_ASSOCIATION_CODE = 12,
ACTION_LOGIN_CODE = 13,
ACTION_TARGET_SLOT_CODE = 40,
ACTION_DUMMY_CODE = 99,
ACTION_NONE = 999
};
class NetworkConnectionCore;
@ -128,7 +142,9 @@ public:
void send_system_disconnect();
void send_system_ack_sync();
void send_system_ack_probe();
void unpack(Ref<BitStream> msgin);
void receive_system_sync(Ref<BitStream> msgin);
void decode(Ref<BitStream> msgin, uint32_t current_received_number, uint32_t received_ack, uint32_t next_sent_packet);
void receive_message(int index);
void send_message();
};

View file

@ -30,6 +30,685 @@ ReferentialMessageCore *ReferentialMessageCore::singleton = nullptr;
* ElementReferential
*/
String get_command_name(uint32_t id)
{
switch (id)
{
case ReferentialMessageCore::Command::TARGET_PARTY:
return "TARGET_PARTY";
case ReferentialMessageCore::Command::TARGET_INVENTORY:
return "TARGET_INVENTORY";
case ReferentialMessageCore::Command::TARGET_FOLLOW:
return "TARGET_FOLLOW";
case ReferentialMessageCore::Command::TARGET_NO_FOLLOW:
return "TARGET_NO_FOLLOW";
case ReferentialMessageCore::Command::CONNECTION_USER_CHAR:
return "CONNECTION_USER_CHAR";
case ReferentialMessageCore::Command::CONNECTION_NO_USER_CHAR:
return "CONNECTION_NO_USER_CHAR";
case ReferentialMessageCore::Command::CONNECTION_USER_CHARS:
return "CONNECTION_USER_CHARS";
case ReferentialMessageCore::Command::CONNECTION_CREATE_CHAR:
return "CONNECTION_CREATE_CHAR";
case ReferentialMessageCore::Command::CONNECTION_SELECT_CHAR:
return "CONNECTION_SELECT_CHAR";
case ReferentialMessageCore::Command::CONNECTION_DELETE_CHAR:
return "CONNECTION_DELETE_CHAR";
case ReferentialMessageCore::Command::CONNECTION_RENAME_CHAR:
return "CONNECTION_RENAME_CHAR";
case ReferentialMessageCore::Command::CONNECTION_ENTER:
return "CONNECTION_ENTER";
case ReferentialMessageCore::Command::CONNECTION_READY:
return "CONNECTION_READY";
case ReferentialMessageCore::Command::CONNECTION_TIME_DATE_SYNCHRO:
return "CONNECTION_TIME_DATE_SYNCHRO";
case ReferentialMessageCore::Command::CONNECTION_ASK_NAME:
return "CONNECTION_ASK_NAME";
case ReferentialMessageCore::Command::CONNECTION_VALID_NAME:
return "CONNECTION_VALID_NAME";
case ReferentialMessageCore::Command::CONNECTION_CREATE_CHAR_ERROR:
return "CONNECTION_CREATE_CHAR_ERROR";
case ReferentialMessageCore::Command::CONNECTION_RECONNECT:
return "CONNECTION_RECONNECT";
case ReferentialMessageCore::Command::CONNECTION_SERVER_RECONNECT_OK:
return "CONNECTION_SERVER_RECONNECT_OK";
case ReferentialMessageCore::Command::CONNECTION_SHARD_ID:
return "CONNECTION_SHARD_ID";
case ReferentialMessageCore::Command::CONNECTION_SERVER_QUIT_OK:
return "CONNECTION_SERVER_QUIT_OK";
case ReferentialMessageCore::Command::CONNECTION_SERVER_QUIT_ABORT:
return "CONNECTION_SERVER_QUIT_ABORT";
case ReferentialMessageCore::Command::CONNECTION_CLIENT_QUIT_REQUEST:
return "CONNECTION_CLIENT_QUIT_REQUEST";
case ReferentialMessageCore::Command::CONNECTION_MAIL_AVAILABLE:
return "CONNECTION_MAIL_AVAILABLE";
case ReferentialMessageCore::Command::CONNECTION_GUILD_MESSAGE_AVAILABLE:
return "CONNECTION_GUILD_MESSAGE_AVAILABLE";
case ReferentialMessageCore::Command::CONNECTION_PERMANENT_BAN:
return "CONNECTION_PERMANENT_BAN";
case ReferentialMessageCore::Command::CONNECTION_UNBAN:
return "CONNECTION_UNBAN";
case ReferentialMessageCore::Command::CONNECTION_FAR_TP:
return "CONNECTION_FAR_TP";
case ReferentialMessageCore::Command::CONNECTION_RET_MAINLAND:
return "CONNECTION_RET_MAINLAND";
case ReferentialMessageCore::Command::DB_UPD_PLR:
return "DB_UPD_PLR";
case ReferentialMessageCore::Command::DB_UPD_INV:
return "DB_UPD_INV";
case ReferentialMessageCore::Command::DB_INIT_PLR:
return "DB_INIT_PLR";
case ReferentialMessageCore::Command::DB_INIT_INV:
return "DB_INIT_INV";
case ReferentialMessageCore::Command::DB_GROUP_UPDATE_BANK:
return "DB_GROUP_UPDATE_BANK";
case ReferentialMessageCore::Command::DB_GROUP_INIT_BANK:
return "DB_GROUP_INIT_BANK";
case ReferentialMessageCore::Command::DB_GROUP_RESET_BANK:
return "DB_GROUP_RESET_BANK";
case ReferentialMessageCore::Command::POSITION:
return "POSITION";
case ReferentialMessageCore::Command::HARVEST_DEPOSIT:
return "HARVEST_DEPOSIT";
case ReferentialMessageCore::Command::HARVEST_CORPSE:
return "HARVEST_CORPSE";
case ReferentialMessageCore::Command::HARVEST_INTERRUPT:
return "HARVEST_INTERRUPT";
case ReferentialMessageCore::Command::HARVEST_CLOSE_TEMP_INVENTORY:
return "HARVEST_CLOSE_TEMP_INVENTORY";
case ReferentialMessageCore::Command::TRAINING:
return "TRAINING";
case ReferentialMessageCore::Command::JOB_SET_JOB_STATUS:
return "JOB_SET_JOB_STATUS";
case ReferentialMessageCore::Command::JOB_SWAP_JOB_STATUS:
return "JOB_SWAP_JOB_STATUS";
case ReferentialMessageCore::Command::CASTING_BEGIN:
return "CASTING_BEGIN";
case ReferentialMessageCore::Command::CASTING_INTERRUPT:
return "CASTING_INTERRUPT";
case ReferentialMessageCore::Command::FABER_OPEN:
return "FABER_OPEN";
case ReferentialMessageCore::Command::FABER_CLOSE:
return "FABER_CLOSE";
case ReferentialMessageCore::Command::FABER_EXECUTE:
return "FABER_EXECUTE";
case ReferentialMessageCore::Command::FABER_SET_NUM_ITEM:
return "FABER_SET_NUM_ITEM";
case ReferentialMessageCore::Command::FABER_START_CREATE:
return "FABER_START_CREATE";
case ReferentialMessageCore::Command::FABER_START_REPAIR:
return "FABER_START_REPAIR";
case ReferentialMessageCore::Command::FABER_START_REFINE:
return "FABER_START_REFINE";
case ReferentialMessageCore::Command::FABER_SET_MP_QUALITY:
return "FABER_SET_MP_QUALITY";
case ReferentialMessageCore::Command::FABER_SET_MP_REFINE:
return "FABER_SET_MP_REFINE";
case ReferentialMessageCore::Command::FABER_SET_TOOL:
return "FABER_SET_TOOL";
case ReferentialMessageCore::Command::FABER_RESET_TOOL:
return "FABER_RESET_TOOL";
case ReferentialMessageCore::Command::FABER_INTERRUPT:
return "FABER_INTERRUPT";
case ReferentialMessageCore::Command::COMBAT_ENGAGE:
return "COMBAT_ENGAGE";
case ReferentialMessageCore::Command::COMBAT_DISENGAGE:
return "COMBAT_DISENGAGE";
case ReferentialMessageCore::Command::COMBAT_DEFAULT_ATTACK:
return "COMBAT_DEFAULT_ATTACK";
case ReferentialMessageCore::Command::COMBAT_ENGAGE_FAILED:
return "COMBAT_ENGAGE_FAILED";
case ReferentialMessageCore::Command::COMBAT_VALIDATE_MELEE:
return "COMBAT_VALIDATE_MELEE";
case ReferentialMessageCore::Command::COMBAT_PARRY:
return "COMBAT_PARRY";
case ReferentialMessageCore::Command::COMBAT_DODGE:
return "COMBAT_DODGE";
case ReferentialMessageCore::Command::COMBAT_PROTECTED_SLOT:
return "COMBAT_PROTECTED_SLOT";
case ReferentialMessageCore::Command::COMBAT_FLYING_ChaScore1_DELTA:
return "COMBAT_FLYING_ChaScore1_DELTA";
case ReferentialMessageCore::Command::COMBAT_FLYING_TEXT_ISE:
return "COMBAT_FLYING_TEXT_ISE";
case ReferentialMessageCore::Command::COMBAT_FLYING_TEXT:
return "COMBAT_FLYING_TEXT";
case ReferentialMessageCore::Command::STRING_TELL:
return "STRING_TELL";
case ReferentialMessageCore::Command::STRING_FAR_TELL:
return "STRING_FAR_TELL";
case ReferentialMessageCore::Command::STRING_CHAT:
return "STRING_CHAT";
case ReferentialMessageCore::Command::STRING_CHAT_TEAM:
return "STRING_CHAT_TEAM";
case ReferentialMessageCore::Command::STRING_ADD_DYN_STR:
return "STRING_ADD_DYN_STR";
case ReferentialMessageCore::Command::STRING_FILTER:
return "STRING_FILTER";
case ReferentialMessageCore::Command::STRING_CHAT_MODE:
return "STRING_CHAT_MODE";
case ReferentialMessageCore::Command::STRING_CHAT2:
return "STRING_CHAT2";
case ReferentialMessageCore::Command::STRING_TELL2:
return "STRING_TELL2";
case ReferentialMessageCore::Command::STRING_DYN_STRING:
return "STRING_DYN_STRING";
case ReferentialMessageCore::Command::STRING_DYN_STRING_GROUP:
return "STRING_DYN_STRING_GROUP";
case ReferentialMessageCore::Command::STRING_AFK_TXT:
return "STRING_AFK_TXT";
case ReferentialMessageCore::Command::STUN_STUN:
return "STUN_STUN";
case ReferentialMessageCore::Command::STUN_WAKE_UP:
return "STUN_WAKE_UP";
case ReferentialMessageCore::Command::SENTENCE_EXECUTE:
return "SENTENCE_EXECUTE";
case ReferentialMessageCore::Command::SENTENCE_CANCEL:
return "SENTENCE_CANCEL";
case ReferentialMessageCore::Command::SENTENCE_CANCEL_CURRENT:
return "SENTENCE_CANCEL_CURRENT";
case ReferentialMessageCore::Command::SENTENCE_CANCEL_ALL:
return "SENTENCE_CANCEL_ALL";
case ReferentialMessageCore::Command::SENTENCE_CLEAR:
return "SENTENCE_CLEAR";
case ReferentialMessageCore::Command::SENTENCE_MEMORIZE:
return "SENTENCE_MEMORIZE";
case ReferentialMessageCore::Command::SENTENCE_FORGET:
return "SENTENCE_FORGET";
case ReferentialMessageCore::Command::SENTENCE_EVALUATE:
return "SENTENCE_EVALUATE";
case ReferentialMessageCore::Command::SENTENCE_ADD_BRICK:
return "SENTENCE_ADD_BRICK";
case ReferentialMessageCore::Command::SENTENCE_REMOVE_BRICK:
return "SENTENCE_REMOVE_BRICK";
case ReferentialMessageCore::Command::SENTENCE_START:
return "SENTENCE_START";
case ReferentialMessageCore::Command::SENTENCE_STOP:
return "SENTENCE_STOP";
case ReferentialMessageCore::Command::TEAM_JOIN:
return "TEAM_JOIN";
case ReferentialMessageCore::Command::TEAM_LEAVE:
return "TEAM_LEAVE";
case ReferentialMessageCore::Command::TEAM_INVITATION:
return "TEAM_INVITATION";
case ReferentialMessageCore::Command::TEAM_JOIN_PROPOSAL:
return "TEAM_JOIN_PROPOSAL";
case ReferentialMessageCore::Command::TEAM_JOIN_PROPOSAL_DECLINE:
return "TEAM_JOIN_PROPOSAL_DECLINE";
case ReferentialMessageCore::Command::TEAM_KICK:
return "TEAM_KICK";
case ReferentialMessageCore::Command::TEAM_SET_SUCCESSOR:
return "TEAM_SET_SUCCESSOR";
case ReferentialMessageCore::Command::TEAM_SHARE_OPEN:
return "TEAM_SHARE_OPEN";
case ReferentialMessageCore::Command::TEAM_SHARE_VALID_ITEM:
return "TEAM_SHARE_VALID_ITEM";
case ReferentialMessageCore::Command::TEAM_SHARE_INVALID_ITEM:
return "TEAM_SHARE_INVALID_ITEM";
case ReferentialMessageCore::Command::TEAM_SHARE_VALID:
return "TEAM_SHARE_VALID";
case ReferentialMessageCore::Command::TEAM_SHARE_INVALID:
return "TEAM_SHARE_INVALID";
case ReferentialMessageCore::Command::TEAM_SHARE_CLOSE:
return "TEAM_SHARE_CLOSE";
case ReferentialMessageCore::Command::TEAM_CONTACT_INIT:
return "TEAM_CONTACT_INIT";
case ReferentialMessageCore::Command::TEAM_CONTACT_ADD:
return "TEAM_CONTACT_ADD";
case ReferentialMessageCore::Command::TEAM_CONTACT_DEL:
return "TEAM_CONTACT_DEL";
case ReferentialMessageCore::Command::TEAM_CONTACT_MOVE:
return "TEAM_CONTACT_MOVE";
case ReferentialMessageCore::Command::TEAM_CONTACT_CREATE:
return "TEAM_CONTACT_CREATE";
case ReferentialMessageCore::Command::TEAM_CONTACT_STATUS:
return "TEAM_CONTACT_STATUS";
case ReferentialMessageCore::Command::TEAM_CONTACT_REMOVE:
return "TEAM_CONTACT_REMOVE";
case ReferentialMessageCore::Command::ITEM_DROP:
return "ITEM_DROP";
case ReferentialMessageCore::Command::ITEM_PICK_UP:
return "ITEM_PICK_UP";
case ReferentialMessageCore::Command::ITEM_PICK_UP_CLOSE:
return "ITEM_PICK_UP_CLOSE";
case ReferentialMessageCore::Command::ITEM_SWAP:
return "ITEM_SWAP";
case ReferentialMessageCore::Command::ITEM_ACTIVATE_SHEATH:
return "ITEM_ACTIVATE_SHEATH";
case ReferentialMessageCore::Command::ITEM_HARVEST:
return "ITEM_HARVEST";
case ReferentialMessageCore::Command::ITEM_HARVEST_CLOSE:
return "ITEM_HARVEST_CLOSE";
case ReferentialMessageCore::Command::ITEM_GIVE:
return "ITEM_GIVE";
case ReferentialMessageCore::Command::ITEM_DESTROY:
return "ITEM_DESTROY";
case ReferentialMessageCore::Command::ITEM_EQUIP:
return "ITEM_EQUIP";
case ReferentialMessageCore::Command::ITEM_UNEQUIP:
return "ITEM_UNEQUIP";
case ReferentialMessageCore::Command::ITEM_TEMP_TO_BAG:
return "ITEM_TEMP_TO_BAG";
case ReferentialMessageCore::Command::ITEM_ALL_TEMP:
return "ITEM_ALL_TEMP";
case ReferentialMessageCore::Command::ITEM_NO_TEMP:
return "ITEM_NO_TEMP";
case ReferentialMessageCore::Command::ITEM_ENCHANT:
return "ITEM_ENCHANT";
case ReferentialMessageCore::Command::ITEM_OPEN_ROOM_INVENTORY:
return "ITEM_OPEN_ROOM_INVENTORY";
case ReferentialMessageCore::Command::ITEM_CLOSE_ROOM_INVENTORY:
return "ITEM_CLOSE_ROOM_INVENTORY";
case ReferentialMessageCore::Command::ITEM_USE_ITEM:
return "ITEM_USE_ITEM";
case ReferentialMessageCore::Command::ITEM_STOP_USE_XP_CAT:
return "ITEM_STOP_USE_XP_CAT";
case ReferentialMessageCore::Command::TP_RESPAWN:
return "TP_RESPAWN";
case ReferentialMessageCore::Command::TP_BOT:
return "TP_BOT";
case ReferentialMessageCore::Command::TP_WANTED:
return "TP_WANTED";
case ReferentialMessageCore::Command::TP_DEST:
return "TP_DEST";
case ReferentialMessageCore::Command::TP_DEST_WITH_SEASON:
return "TP_DEST_WITH_SEASON";
case ReferentialMessageCore::Command::TP_ACK:
return "TP_ACK";
case ReferentialMessageCore::Command::TP_CORRECT:
return "TP_CORRECT";
case ReferentialMessageCore::Command::DEATH_RESPAWN_POINT:
return "DEATH_RESPAWN_POINT";
case ReferentialMessageCore::Command::DEATH_ASK_RESPAWN:
return "DEATH_ASK_RESPAWN";
case ReferentialMessageCore::Command::DEATH_RESPAWN:
return "DEATH_RESPAWN";
case ReferentialMessageCore::Command::ANIMALS_BEAST:
return "ANIMALS_BEAST";
case ReferentialMessageCore::Command::ANIMALS_MOUNT_ABORT:
return "ANIMALS_MOUNT_ABORT";
case ReferentialMessageCore::Command::EXCHANGE_INVITATION:
return "EXCHANGE_INVITATION";
case ReferentialMessageCore::Command::EXCHANGE_CLOSE_INVITATION:
return "EXCHANGE_CLOSE_INVITATION";
case ReferentialMessageCore::Command::EXCHANGE_PROPOSAL:
return "EXCHANGE_PROPOSAL";
case ReferentialMessageCore::Command::EXCHANGE_ACCEPT_INVITATION:
return "EXCHANGE_ACCEPT_INVITATION";
case ReferentialMessageCore::Command::EXCHANGE_DECLINE_INVITATION:
return "EXCHANGE_DECLINE_INVITATION";
case ReferentialMessageCore::Command::EXCHANGE_VALIDATE:
return "EXCHANGE_VALIDATE";
case ReferentialMessageCore::Command::EXCHANGE_INVALIDATE:
return "EXCHANGE_INVALIDATE";
case ReferentialMessageCore::Command::EXCHANGE_END:
return "EXCHANGE_END";
case ReferentialMessageCore::Command::EXCHANGE_SEEDS:
return "EXCHANGE_SEEDS";
case ReferentialMessageCore::Command::EXCHANGE_ADD:
return "EXCHANGE_ADD";
case ReferentialMessageCore::Command::EXCHANGE_REMOVE:
return "EXCHANGE_REMOVE";
case ReferentialMessageCore::Command::DEBUG_WHERE:
return "DEBUG_WHERE";
case ReferentialMessageCore::Command::DEBUG_WHO:
return "DEBUG_WHO";
case ReferentialMessageCore::Command::DEBUG_REPLY_WHERE:
return "DEBUG_REPLY_WHERE";
case ReferentialMessageCore::Command::DEBUG_SERVICES:
return "DEBUG_SERVICES";
case ReferentialMessageCore::Command::DEBUG_CMD:
return "DEBUG_CMD";
case ReferentialMessageCore::Command::DEBUG_PING:
return "DEBUG_PING";
case ReferentialMessageCore::Command::DEBUG_COUNTER:
return "DEBUG_COUNTER";
case ReferentialMessageCore::Command::COMMAND_EMOTE:
return "COMMAND_EMOTE";
case ReferentialMessageCore::Command::COMMAND_CUSTOM_EMOTE:
return "COMMAND_CUSTOM_EMOTE";
case ReferentialMessageCore::Command::COMMAND_WHERE:
return "COMMAND_WHERE";
case ReferentialMessageCore::Command::COMMAND_ADMIN:
return "COMMAND_ADMIN";
case ReferentialMessageCore::Command::COMMAND_ADMIN_OFFLINE:
return "COMMAND_ADMIN_OFFLINE";
case ReferentialMessageCore::Command::COMMAND_REMOTE_ADMIN:
return "COMMAND_REMOTE_ADMIN";
case ReferentialMessageCore::Command::COMMAND_REMOTE_ADMIN_ANSWER:
return "COMMAND_REMOTE_ADMIN_ANSWER";
case ReferentialMessageCore::Command::COMMAND_SIT:
return "COMMAND_SIT";
case ReferentialMessageCore::Command::COMMAND_AFK:
return "COMMAND_AFK";
case ReferentialMessageCore::Command::COMMAND_RANDOM:
return "COMMAND_RANDOM";
case ReferentialMessageCore::Command::COMMAND_GUILDMOTD:
return "COMMAND_GUILDMOTD";
case ReferentialMessageCore::Command::MP_EVAL_SET_MP:
return "MP_EVAL_SET_MP";
case ReferentialMessageCore::Command::MP_EVAL_SET_MP_LEVEL:
return "MP_EVAL_SET_MP_LEVEL";
case ReferentialMessageCore::Command::MP_EVAL_SET_MARKET:
return "MP_EVAL_SET_MARKET";
case ReferentialMessageCore::Command::MP_EVAL_EXECUTE:
return "MP_EVAL_EXECUTE";
case ReferentialMessageCore::Command::BOTCHAT_NEXT_PAGE_ITEM:
return "BOTCHAT_NEXT_PAGE_ITEM";
case ReferentialMessageCore::Command::BOTCHAT_NEXT_PAGE_MISSION:
return "BOTCHAT_NEXT_PAGE_MISSION";
case ReferentialMessageCore::Command::BOTCHAT_START_TRADE_ITEM:
return "BOTCHAT_START_TRADE_ITEM";
case ReferentialMessageCore::Command::BOTCHAT_START_TRADE_TELEPORT:
return "BOTCHAT_START_TRADE_TELEPORT";
case ReferentialMessageCore::Command::BOTCHAT_START_TRADE_FACTION:
return "BOTCHAT_START_TRADE_FACTION";
case ReferentialMessageCore::Command::BOTCHAT_START_TRADE_SKILL:
return "BOTCHAT_START_TRADE_SKILL";
case ReferentialMessageCore::Command::BOTCHAT_START_TRADE_PACT:
return "BOTCHAT_START_TRADE_PACT";
case ReferentialMessageCore::Command::BOTCHAT_START_TRADE_ACTION:
return "BOTCHAT_START_TRADE_ACTION";
case ReferentialMessageCore::Command::BOTCHAT_BUY:
return "BOTCHAT_BUY";
case ReferentialMessageCore::Command::BOTCHAT_SELL:
return "BOTCHAT_SELL";
case ReferentialMessageCore::Command::BOTCHAT_DESTROY_ITEM:
return "BOTCHAT_DESTROY_ITEM";
case ReferentialMessageCore::Command::BOTCHAT_REFRESH_TRADE_LIST:
return "BOTCHAT_REFRESH_TRADE_LIST";
case ReferentialMessageCore::Command::BOTCHAT_SET_FILTERS:
return "BOTCHAT_SET_FILTERS";
case ReferentialMessageCore::Command::BOTCHAT_START_CHOOSE_MISSION:
return "BOTCHAT_START_CHOOSE_MISSION";
case ReferentialMessageCore::Command::BOTCHAT_START_DYNAMIC_MISSION:
return "BOTCHAT_START_DYNAMIC_MISSION";
case ReferentialMessageCore::Command::BOTCHAT_CONTINUE_MISSION:
return "BOTCHAT_CONTINUE_MISSION";
case ReferentialMessageCore::Command::BOTCHAT_VALIDATE_PLAYER_GIFT:
return "BOTCHAT_VALIDATE_PLAYER_GIFT";
case ReferentialMessageCore::Command::BOTCHAT_PICK_MISSION:
return "BOTCHAT_PICK_MISSION";
case ReferentialMessageCore::Command::BOTCHAT_DM_CHOICE:
return "BOTCHAT_DM_CHOICE";
case ReferentialMessageCore::Command::BOTCHAT_DM_ACCEPT:
return "BOTCHAT_DM_ACCEPT";
case ReferentialMessageCore::Command::BOTCHAT_START_NEWS:
return "BOTCHAT_START_NEWS";
case ReferentialMessageCore::Command::BOTCHAT_START_CREATE_GUILD:
return "BOTCHAT_START_CREATE_GUILD";
case ReferentialMessageCore::Command::BOTCHAT_END:
return "BOTCHAT_END";
case ReferentialMessageCore::Command::BOTCHAT_FORCE_END:
return "BOTCHAT_FORCE_END";
case ReferentialMessageCore::Command::BOTCHAT_START_CHOOSE_DUTY:
return "BOTCHAT_START_CHOOSE_DUTY";
case ReferentialMessageCore::Command::BOTCHAT_NEXT_PAGE_DUTY:
return "BOTCHAT_NEXT_PAGE_DUTY";
case ReferentialMessageCore::Command::BOTCHAT_DUTY_APPLY:
return "BOTCHAT_DUTY_APPLY";
case ReferentialMessageCore::Command::BOTCHAT_DUTY_CANCEL_APPLY:
return "BOTCHAT_DUTY_CANCEL_APPLY";
case ReferentialMessageCore::Command::BOTCHAT_START_TRADE_GUILD_OPTIONS:
return "BOTCHAT_START_TRADE_GUILD_OPTIONS";
case ReferentialMessageCore::Command::BOTCHAT_BUY_GUILD_OPTION:
return "BOTCHAT_BUY_GUILD_OPTION";
case ReferentialMessageCore::Command::BOTCHAT_START_GUILD_RESEARCH:
return "BOTCHAT_START_GUILD_RESEARCH";
case ReferentialMessageCore::Command::BOTCHAT_DESTROY_BUILDING:
return "BOTCHAT_DESTROY_BUILDING";
case ReferentialMessageCore::Command::BOTCHAT_DYNCHAT_OPEN:
return "BOTCHAT_DYNCHAT_OPEN";
case ReferentialMessageCore::Command::BOTCHAT_DYNCHAT_CLOSE:
return "BOTCHAT_DYNCHAT_CLOSE";
case ReferentialMessageCore::Command::BOTCHAT_DYNCHAT_SEND:
return "BOTCHAT_DYNCHAT_SEND";
case ReferentialMessageCore::Command::JOURNAL_INIT_COMPLETED_MISSIONS:
return "JOURNAL_INIT_COMPLETED_MISSIONS";
case ReferentialMessageCore::Command::JOURNAL_UPDATE_COMPLETED_MISSIONS:
return "JOURNAL_UPDATE_COMPLETED_MISSIONS";
case ReferentialMessageCore::Command::JOURNAL_MISSION_ABANDON:
return "JOURNAL_MISSION_ABANDON";
case ReferentialMessageCore::Command::JOURNAL_GROUP_MISSION_ABANDON:
return "JOURNAL_GROUP_MISSION_ABANDON";
case ReferentialMessageCore::Command::JOURNAL_ADD_COMPASS:
return "JOURNAL_ADD_COMPASS";
case ReferentialMessageCore::Command::JOURNAL_ADD_COMPASS_BOT:
return "JOURNAL_ADD_COMPASS_BOT";
case ReferentialMessageCore::Command::JOURNAL_REMOVE_COMPASS:
return "JOURNAL_REMOVE_COMPASS";
case ReferentialMessageCore::Command::JOURNAL_REMOVE_COMPASS_BOT:
return "JOURNAL_REMOVE_COMPASS_BOT";
case ReferentialMessageCore::Command::STRING_MANAGER_SET_LANGUAGE:
return "STRING_MANAGER_SET_LANGUAGE";
case ReferentialMessageCore::Command::STRING_MANAGER_PHRASE_SEND:
return "STRING_MANAGER_PHRASE_SEND";
case ReferentialMessageCore::Command::STRING_MANAGER_STRING_RQ:
return "STRING_MANAGER_STRING_RQ";
case ReferentialMessageCore::Command::STRING_MANAGER_STRING_RESP:
return "STRING_MANAGER_STRING_RESP";
case ReferentialMessageCore::Command::STRING_MANAGER_RELOAD_CACHE:
return "STRING_MANAGER_RELOAD_CACHE";
case ReferentialMessageCore::Command::GUILD_CREATE:
return "GUILD_CREATE";
case ReferentialMessageCore::Command::GUILD_ABORT_CREATION:
return "GUILD_ABORT_CREATION";
case ReferentialMessageCore::Command::GUILD_OPEN_GUILD_WINDOW:
return "GUILD_OPEN_GUILD_WINDOW";
case ReferentialMessageCore::Command::GUILD_INVITATION:
return "GUILD_INVITATION";
case ReferentialMessageCore::Command::GUILD_ACCEPT_INVITATION:
return "GUILD_ACCEPT_INVITATION";
case ReferentialMessageCore::Command::GUILD_REFUSE_INVITATION:
return "GUILD_REFUSE_INVITATION";
case ReferentialMessageCore::Command::GUILD_JOIN_PROPOSAL:
return "GUILD_JOIN_PROPOSAL";
case ReferentialMessageCore::Command::GUILD_SET_GRADE:
return "GUILD_SET_GRADE";
case ReferentialMessageCore::Command::GUILD_SET_LEADER:
return "GUILD_SET_LEADER";
case ReferentialMessageCore::Command::GUILD_KICK_MEMBER:
return "GUILD_KICK_MEMBER";
case ReferentialMessageCore::Command::GUILD_TELEPORT:
return "GUILD_TELEPORT";
case ReferentialMessageCore::Command::GUILD_ASCENSOR:
return "GUILD_ASCENSOR";
case ReferentialMessageCore::Command::GUILD_FIRST_ASCENSOR_PAGE:
return "GUILD_FIRST_ASCENSOR_PAGE";
case ReferentialMessageCore::Command::GUILD_NEXT_ASCENSOR_PAGE:
return "GUILD_NEXT_ASCENSOR_PAGE";
case ReferentialMessageCore::Command::GUILD_LEAVE_ASCENSOR:
return "GUILD_LEAVE_ASCENSOR";
case ReferentialMessageCore::Command::GUILD_QUIT:
return "GUILD_QUIT";
case ReferentialMessageCore::Command::GUILD_SET_PLAYER_TITLE:
return "GUILD_SET_PLAYER_TITLE";
case ReferentialMessageCore::Command::GUILD_UPDATE_PLAYER_TITLE:
return "GUILD_UPDATE_PLAYER_TITLE";
case ReferentialMessageCore::Command::GUILD_USE_FEMALE_TITLES:
return "GUILD_USE_FEMALE_TITLES";
case ReferentialMessageCore::Command::GUILD_PUT_MONEY:
return "GUILD_PUT_MONEY";
case ReferentialMessageCore::Command::GUILD_TAKE_MONEY:
return "GUILD_TAKE_MONEY";
case ReferentialMessageCore::Command::GUILD_OPEN_INVENTORY:
return "GUILD_OPEN_INVENTORY";
case ReferentialMessageCore::Command::GUILD_CLOSE_INVENTORY:
return "GUILD_CLOSE_INVENTORY";
case ReferentialMessageCore::Command::OUTPOST_GIVEUP_OUTPOST:
return "OUTPOST_GIVEUP_OUTPOST";
case ReferentialMessageCore::Command::OUTPOST_SELECT:
return "OUTPOST_SELECT";
case ReferentialMessageCore::Command::OUTPOST_UNSELECT:
return "OUTPOST_UNSELECT";
case ReferentialMessageCore::Command::OUTPOST_DECLARE_WAR_START:
return "OUTPOST_DECLARE_WAR_START";
case ReferentialMessageCore::Command::OUTPOST_DECLARE_WAR_ACK:
return "OUTPOST_DECLARE_WAR_ACK";
case ReferentialMessageCore::Command::OUTPOST_DECLARE_WAR_VALIDATE:
return "OUTPOST_DECLARE_WAR_VALIDATE";
case ReferentialMessageCore::Command::OUTPOST_SET_DEF_PERIOD:
return "OUTPOST_SET_DEF_PERIOD";
case ReferentialMessageCore::Command::OUTPOST_SET_SQUAD:
return "OUTPOST_SET_SQUAD";
case ReferentialMessageCore::Command::OUTPOST_SET_SQUAD_SPAWN:
return "OUTPOST_SET_SQUAD_SPAWN";
case ReferentialMessageCore::Command::OUTPOST_INSERT_SQUAD:
return "OUTPOST_INSERT_SQUAD";
case ReferentialMessageCore::Command::OUTPOST_REMOVE_SQUAD:
return "OUTPOST_REMOVE_SQUAD";
case ReferentialMessageCore::Command::OUTPOST_SET_SQUAD_CAPITAL:
return "OUTPOST_SET_SQUAD_CAPITAL";
case ReferentialMessageCore::Command::OUTPOST_CHOOSE_SIDE:
return "OUTPOST_CHOOSE_SIDE";
case ReferentialMessageCore::Command::OUTPOST_SIDE_CHOSEN:
return "OUTPOST_SIDE_CHOSEN";
case ReferentialMessageCore::Command::OUTPOST_BANISH_PLAYER:
return "OUTPOST_BANISH_PLAYER";
case ReferentialMessageCore::Command::OUTPOST_BANISH_GUILD:
return "OUTPOST_BANISH_GUILD";
case ReferentialMessageCore::Command::OUTPOST_BUY_BUILDING:
return "OUTPOST_BUY_BUILDING";
case ReferentialMessageCore::Command::OUTPOST_DESTROY_BUILDING:
return "OUTPOST_DESTROY_BUILDING";
case ReferentialMessageCore::Command::PHRASE_DELETE:
return "PHRASE_DELETE";
case ReferentialMessageCore::Command::PHRASE_LEARN:
return "PHRASE_LEARN";
case ReferentialMessageCore::Command::PHRASE_MEMORIZE:
return "PHRASE_MEMORIZE";
case ReferentialMessageCore::Command::PHRASE_FORGET:
return "PHRASE_FORGET";
case ReferentialMessageCore::Command::PHRASE_EXECUTE:
return "PHRASE_EXECUTE";
case ReferentialMessageCore::Command::PHRASE_EXECUTE_CYCLIC:
return "PHRASE_EXECUTE_CYCLIC";
case ReferentialMessageCore::Command::PHRASE_EXECUTE_FABER:
return "PHRASE_EXECUTE_FABER";
case ReferentialMessageCore::Command::PHRASE_DOWNLOAD:
return "PHRASE_DOWNLOAD";
case ReferentialMessageCore::Command::PHRASE_BUY:
return "PHRASE_BUY";
case ReferentialMessageCore::Command::PHRASE_CONFIRM_BUY:
return "PHRASE_CONFIRM_BUY";
case ReferentialMessageCore::Command::PHRASE_BUY_SHEET:
return "PHRASE_BUY_SHEET";
case ReferentialMessageCore::Command::PHRASE_CANCEL_LINK:
return "PHRASE_CANCEL_LINK";
case ReferentialMessageCore::Command::PHRASE_CANCEL_TOP:
return "PHRASE_CANCEL_TOP";
case ReferentialMessageCore::Command::PHRASE_CANCEL_ALL:
return "PHRASE_CANCEL_ALL";
case ReferentialMessageCore::Command::PHRASE_CRISTALIZE:
return "PHRASE_CRISTALIZE";
case ReferentialMessageCore::Command::PHRASE_EXEC_CYCLIC_ACK:
return "PHRASE_EXEC_CYCLIC_ACK";
case ReferentialMessageCore::Command::PHRASE_EXEC_NEXT_ACK:
return "PHRASE_EXEC_NEXT_ACK";
case ReferentialMessageCore::Command::ITEM_INFO_GET:
return "ITEM_INFO_GET";
case ReferentialMessageCore::Command::ITEM_INFO_SET:
return "ITEM_INFO_SET";
case ReferentialMessageCore::Command::ITEM_INFO_REFRESH_VERSION:
return "ITEM_INFO_REFRESH_VERSION";
case ReferentialMessageCore::Command::MISSION_PREREQ_GET:
return "MISSION_PREREQ_GET";
case ReferentialMessageCore::Command::MISSION_PREREQ_SET:
return "MISSION_PREREQ_SET";
case ReferentialMessageCore::Command::MISSION_ENTER_CRITICAL:
return "MISSION_ENTER_CRITICAL";
case ReferentialMessageCore::Command::MISSION_ASK_ENTER_CRITICAL:
return "MISSION_ASK_ENTER_CRITICAL";
case ReferentialMessageCore::Command::MISSION_CLOSE_ENTER_CRITICAL:
return "MISSION_CLOSE_ENTER_CRITICAL";
case ReferentialMessageCore::Command::MISSION_WAKE:
return "MISSION_WAKE";
case ReferentialMessageCore::Command::MISSION_GROUP_WAKE:
return "MISSION_GROUP_WAKE";
case ReferentialMessageCore::Command::DUEL_ASK:
return "DUEL_ASK";
case ReferentialMessageCore::Command::DUEL_ACCEPT:
return "DUEL_ACCEPT";
case ReferentialMessageCore::Command::DUEL_REFUSE:
return "DUEL_REFUSE";
case ReferentialMessageCore::Command::DUEL_ABANDON:
return "DUEL_ABANDON";
case ReferentialMessageCore::Command::DUEL_INVITATION:
return "DUEL_INVITATION";
case ReferentialMessageCore::Command::DUEL_CANCEL_INVITATION:
return "DUEL_CANCEL_INVITATION";
case ReferentialMessageCore::Command::PVP_CHALLENGE_ASK:
return "PVP_CHALLENGE_ASK";
case ReferentialMessageCore::Command::PVP_CHALLENGE_ACCEPT:
return "PVP_CHALLENGE_ACCEPT";
case ReferentialMessageCore::Command::PVP_CHALLENGE_REFUSE:
return "PVP_CHALLENGE_REFUSE";
case ReferentialMessageCore::Command::PVP_CHALLENGE_ABANDON:
return "PVP_CHALLENGE_ABANDON";
case ReferentialMessageCore::Command::PVP_CHALLENGE_INVITATION:
return "PVP_CHALLENGE_INVITATION";
case ReferentialMessageCore::Command::PVP_CHALLENGE_CANCEL_INVITATION:
return "PVP_CHALLENGE_CANCEL_INVITATION";
case ReferentialMessageCore::Command::PVP_PVP_TAG:
return "PVP_PVP_TAG";
case ReferentialMessageCore::Command::PVP_SET_NEUTRAL_ALLEGIANCE:
return "PVP_SET_NEUTRAL_ALLEGIANCE";
case ReferentialMessageCore::Command::PVP_SET_NEUTRAL_ALLEGIANCE_GUILD:
return "PVP_SET_NEUTRAL_ALLEGIANCE_GUILD";
case ReferentialMessageCore::Command::PVP_FACTION_PUSH_FACTION_WAR:
return "PVP_FACTION_PUSH_FACTION_WAR";
case ReferentialMessageCore::Command::PVP_FACTION_POP_FACTION_WAR:
return "PVP_FACTION_POP_FACTION_WAR";
case ReferentialMessageCore::Command::PVP_FACTION_FACTION_WARS:
return "PVP_FACTION_FACTION_WARS";
case ReferentialMessageCore::Command::ENCYCLOPEDIA_UPDATE:
return "ENCYCLOPEDIA_UPDATE";
case ReferentialMessageCore::Command::ENCYCLOPEDIA_INIT:
return "ENCYCLOPEDIA_INIT";
case ReferentialMessageCore::Command::USER_BARS:
return "USER_BARS";
case ReferentialMessageCore::Command::USER_POPUP:
return "USER_POPUP";
case ReferentialMessageCore::Command::EVENT_SET_ITEM_CUSTOM_TEXT:
return "EVENT_SET_ITEM_CUSTOM_TEXT";
case ReferentialMessageCore::Command::EVENT_DUMMY:
return "EVENT_DUMMY";
case ReferentialMessageCore::Command::TOTEM_BUILD:
return "TOTEM_BUILD";
case ReferentialMessageCore::Command::TOTEM_DUMMY:
return "TOTEM_DUMMY";
case ReferentialMessageCore::Command::MODULE_GATEWAY_FEOPEN:
return "MODULE_GATEWAY_FEOPEN";
case ReferentialMessageCore::Command::MODULE_GATEWAY_GATEWAY_MSG:
return "MODULE_GATEWAY_GATEWAY_MSG";
case ReferentialMessageCore::Command::MODULE_GATEWAY_FECLOSE:
return "MODULE_GATEWAY_FECLOSE";
case ReferentialMessageCore::Command::SEASON_SET:
return "SEASON_SET";
case ReferentialMessageCore::Command::SEASON_DUMMY:
return "SEASON_DUMMY";
case ReferentialMessageCore::Command::DM_GIFT_BEGIN:
return "DM_GIFT_BEGIN";
case ReferentialMessageCore::Command::DM_GIFT_VALIDATE:
return "DM_GIFT_VALIDATE";
case ReferentialMessageCore::Command::RING_MISSION_MISSION_RING_SELECT:
return "RING_MISSION_MISSION_RING_SELECT";
case ReferentialMessageCore::Command::RING_MISSION_DSS_DOWN:
return "RING_MISSION_DSS_DOWN";
case ReferentialMessageCore::Command::NPC_ICON_GET_DESC:
return "NPC_ICON_GET_DESC";
case ReferentialMessageCore::Command::NPC_ICON_SET_DESC:
return "NPC_ICON_SET_DESC";
case ReferentialMessageCore::Command::NPC_ICON_SVR_EVENT_MIS_AVL:
return "NPC_ICON_SVR_EVENT_MIS_AVL";
case ReferentialMessageCore::Command::NPC_ICON_SET_TIMER:
return "NPC_ICON_SET_TIMER";
case ReferentialMessageCore::Command::__LAST_ELEMENT:
return "__LAST_ELEMENT";
default:
return "?";
}
}
void ElementReferential::show(int level, int pos)
{
String a;
@ -38,14 +717,14 @@ void ElementReferential::show(int level, int pos)
if(_id == ReferentialMessageCore::Command::__LAST_ELEMENT)
{
//OS::get_singleton()->print("[%s:%d] level:%d %s pos:%3d ------ power:%d\n", __FILE__, __LINE__, level, a.ascii().get_data(), pos, _power2);
DBG_PRINT("level:" + itos(level) + " " + a + " pos:" + itos(pos) + " ------ power:" + itos(_power2));
DBG_PRINT("level:" + itos(level) + " " + a + " id:" + get_command_name(_id) + " pos:" + itos(pos) + " ------ power:" + itos(_power2));
}
else
{
DBG_PRINT("level:" + itos(level) + " " + a + " pos:" + itos(pos) + " id:" + itos(_id));
DBG_PRINT("level:" + itos(level) + " " + a + " pos:" + itos(pos) + " id:" + get_command_name(_id));
}
level ++;
for(int i=0;i<_children.size() - 1;++i)
for(int i=0;i<_children.size();++i)
{
Ref<ElementReferential> child = _children[i];
child->show(level, i);
@ -1072,7 +1751,7 @@ int ReferentialMessageCore::get_command(String name)
} else if( name == "NPC_ICON_SET_TIMER" ) {
return Command::NPC_ICON_SET_TIMER;
} else {
WARN_PRINTS("Ignore unknown keyword command '" + name + "'");
WARN_PRINT("Ignore unknown keyword command '" + name + "'");
}
return Command::__LAST_ELEMENT;
}
@ -1141,15 +1820,17 @@ void ReferentialMessageCore::read_referential(Dictionary dictionary_message)
void ReferentialMessageCore::show()
{
// For fun, list powerOf2 - TODO check is same with server side, and check size is same value for msg.xml
/*
{
for(int i=0;i<67;++i)
DBG_PRINT(itos(i) + "=> powerOf2 = " + itos(getPowerOf2(i)));
}
*/
// show Element to push data
{
for(int i = 0; i < Command::__LAST_ELEMENT; ++i)
{
DBG_PRINT(itos(i) + ") " + this->_encoder[i].show().ascii().get_data() + ".");
DBG_PRINT(itos(i) + ") " + get_command_name(i) + " " + this->_encoder[i].show().ascii().get_data() + ".");
}
}
// show element to read data

View file

@ -24,6 +24,7 @@
#include "core/reference.h"
#include "core/dictionary.h"
#include "modules/bitstream/bitstream.h"
#include "modules/debug/debug.h"
inline uint32_t getPowerOf2(uint32_t v)
{
@ -31,7 +32,7 @@ inline uint32_t getPowerOf2(uint32_t v)
uint32_t res = 1;
uint32_t ret = 0;
uint32_t limit = 8*sizeof(uint32_t);
while(res < v && res < limit)
while(res < v && ret < limit)
{
ret ++;
res <<= 1; // res *= 2;
@ -51,7 +52,7 @@ public:
~ElementReferential() {_children.clear();}
void set_id(uint32_t id) {_id=id;}
void set_size(uint32_t size) {_children.resize(size); _power2=getPowerOf2(size);}
void set_size(uint32_t size) {_children.resize(size); _power2=getPowerOf2(size);DBG_PRINT("[" + itos(size) + " /" + itos(_power2) + "]");}
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);
@ -413,7 +414,6 @@ public:
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;}