update network part

This commit is contained in:
AleaJactaEst 2020-05-02 20:52:28 +02:00
parent 6ec43b2a00
commit 67a9fa8dbc
24 changed files with 853 additions and 230 deletions

View file

@ -21,6 +21,8 @@ class connexion:
# var _url_register = "http://149.91.80.160/ams/index.php?page=register" # 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_register = "http://lirria.khaganat.net/ams/index.php?page=register"
var _config_filename = "user://connexion.cfg"
var _language = "fr" var _language = "fr"
var _valid_certificate = true var _valid_certificate = true
@ -31,7 +33,7 @@ class connexion:
config_file.set_value("register", "url", _url_register) config_file.set_value("register", "url", _url_register)
config_file.set_value("global", "valid_certificate", _valid_certificate) config_file.set_value("global", "valid_certificate", _valid_certificate)
config_file.set_value("global", "language", _language) config_file.set_value("global", "language", _language)
config_file.save("user://connexion.cfg") config_file.save(_config_filename)
func _init(): func _init():
print("[config connexion] Load connexion config") print("[config connexion] Load connexion config")
@ -39,9 +41,9 @@ class connexion:
var config_file = ConfigFile.new() var config_file = ConfigFile.new()
# /home/<account>/.local/share/godot/app_userdata/Khanat/connexion.cfg # /home/<account>/.local/share/godot/app_userdata/Khanat/connexion.cfg
var err = config_file.load("user://connexion.cfg") var err = config_file.load(_config_filename)
if err: if err:
print("Error code when loading player config file khanat.cfg: ", err) print("Error code when loading player config file connexion.cfg: ", err)
save() save()
self._url_login = config_file.get_value("login", "url", self._url_login) self._url_login = config_file.get_value("login", "url", self._url_login)

View file

@ -4,53 +4,53 @@ signal return_pressed
signal font_changed( value ) signal font_changed( value )
func _ready(): func _ready():
$Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Fullscreen/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/fullscreen" ) $Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Fullscreen/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/fullscreen" )
$Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Borderless/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/borderless" ) $Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Borderless/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/borderless" )
$Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Resizable/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/resizable" ) $Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Resizable/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/resizable" )
$Menus/TabContainer/Display/ScrollContainer/VBoxContainer/CurrentScreen/SpinBox.value = OS.current_screen $Menus/TabContainer/Display/ScrollContainer/VBoxContainer/CurrentScreen/SpinBox.value = OS.current_screen
$Menus/TabContainer/connexion/v_box_container/h_box_container4/language.add_item("fr") $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.add_item("fr")
$Menus/TabContainer/connexion/v_box_container/h_box_container4/language.add_item("en") $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.add_item("en")
load_settings() load_settings()
func _on_font_size_bar_value_changed(value): func _on_font_size_bar_value_changed(value):
$Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size/font_size_value.text = str( value ) $Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size/font_size_value.text = str( value )
$Menus.get_theme().default_font.size = value $Menus.get_theme().default_font.size = value
emit_signal( "font_changed", value ) emit_signal( "font_changed", value )
func load_settings(): func load_settings():
var config_file = ConfigFile.new() var config_file = ConfigFile.new()
var err = config_file.load( "user://settings.cfg" ) var err = config_file.load( "user://settings.cfg" )
if err == ERR_CANT_OPEN or err == ERR_FILE_NOT_FOUND: if err == ERR_CANT_OPEN or err == ERR_FILE_NOT_FOUND:
# On suppose que le fichier n'existe pas encore, donc on le crée. # On suppose que le fichier n'existe pas encore, donc on le crée.
config_file.set_value( "theme", "font_size", 14 ) config_file.set_value( "theme", "font_size", 14 )
config_file.save( "user://settings.cfg" ) config_file.save( "user://settings.cfg" )
elif not err == OK: elif not err == OK:
print("[res://gui_scene/GUI/Settings/Settings.gd:load_settings] Error code when loading config file: ", err) print("[res://gui_scene/GUI/Settings/Settings.gd:load_settings] Error code when loading config file: ", err)
global.font_size = config_file.get_value( "theme", "font_size" ) global.font_size = config_file.get_value( "theme", "font_size" )
if $Menus.get_theme(): if $Menus.get_theme():
$Menus.get_theme().default_font.size = global.font_size $Menus.get_theme().default_font.size = global.font_size
$Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size_bar.value = global.font_size $Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size_bar.value = global.font_size
$Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size/font_size_value.text = str( global.font_size ) $Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size/font_size_value.text = str( global.font_size )
#var connexion = load("res://assets/Scripts/Config/connexion.gd").new() #var connexion = load("res://assets/Scripts/Config/connexion.gd").new()
var script_connexion = preload("res://assets/Scripts/Config/connexion.gd") var script_connexion = preload("res://assets/Scripts/Config/connexion.gd")
var connexion = script_connexion.connexion.new() var connexion = script_connexion.connexion.new()
var language = connexion.get_language() var language = connexion.get_language()
$Menus/TabContainer/connexion/v_box_container/h_box_container/register.text = connexion.get_url_register() $Menus/TabContainer/connexion/v_box_container/h_box_container/register.text = connexion.get_url_register()
$Menus/TabContainer/connexion/v_box_container/h_box_container2/connexion.text = connexion.get_url_login() $Menus/TabContainer/connexion/v_box_container/h_box_container2/connexion.text = connexion.get_url_login()
$Menus/TabContainer/connexion/v_box_container/h_box_container3/certificate_valid.pressed = connexion.get_valid_certificate() $Menus/TabContainer/connexion/v_box_container/h_box_container3/certificate_valid.pressed = connexion.get_valid_certificate()
# language # language
for i in range(0, $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.get_item_count()): for i in range(0, $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.get_item_count()):
if $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.get_item_text(i) == language: if $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.get_item_text(i) == language:
$Menus/TabContainer/connexion/v_box_container/h_box_container4/language.select(i) $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.select(i)
break break
#$Menus/TabContainer/connexion/v_box_container/h_box_container4/language. #$Menus/TabContainer/connexion/v_box_container/h_box_container4/language.
#.selected = language #.selected = language
#$Menus/TabContainer/connexion/v_box_container/h_box_container4/language.selected #$Menus/TabContainer/connexion/v_box_container/h_box_container4/language.selected
#func _on_ReturnButton_pressed(): #func _on_ReturnButton_pressed():
# var config_file = ConfigFile.new() # var config_file = ConfigFile.new()
@ -63,64 +63,64 @@ func load_settings():
func _on_Title_text_changed(new_text): func _on_Title_text_changed(new_text):
# ---------------------------------- # ----------------------------------
# Changing windows title # Changing windows title
var new_title = "Khanat" var new_title = "Khanat"
new_text = new_text.strip_edges() new_text = new_text.strip_edges()
if not new_text == "": if not new_text == "":
new_title = new_text new_title = new_text
new_title += " (" + String(OS.get_window_size().x) + "x" + String(OS.get_window_size().y) + ")" new_title += " (" + String(OS.get_window_size().x) + "x" + String(OS.get_window_size().y) + ")"
OS.set_window_title( new_title ) OS.set_window_title( new_title )
# ---------------------------------- # ----------------------------------
func _on_Fullscreen_toggled(button_pressed): func _on_Fullscreen_toggled(button_pressed):
if ProjectSettings.has_setting( "display/window/size/fullscreen" ): if ProjectSettings.has_setting( "display/window/size/fullscreen" ):
ProjectSettings.set_setting("display/window/size/fullscreen", button_pressed) ProjectSettings.set_setting("display/window/size/fullscreen", button_pressed)
OS.window_fullscreen = ProjectSettings.get_setting("display/window/size/fullscreen") OS.window_fullscreen = ProjectSettings.get_setting("display/window/size/fullscreen")
func _on_Borderless_toggled(button_pressed): func _on_Borderless_toggled(button_pressed):
if ProjectSettings.has_setting( "display/window/size/borderless" ): if ProjectSettings.has_setting( "display/window/size/borderless" ):
ProjectSettings.set_setting("display/window/size/borderless", button_pressed) ProjectSettings.set_setting("display/window/size/borderless", button_pressed)
OS.window_borderless = ProjectSettings.get_setting("display/window/size/borderless") OS.window_borderless = ProjectSettings.get_setting("display/window/size/borderless")
func _on_Resizable_toggled(button_pressed): func _on_Resizable_toggled(button_pressed):
if ProjectSettings.has_setting( "display/window/size/resizable" ): if ProjectSettings.has_setting( "display/window/size/resizable" ):
ProjectSettings.set_setting("display/window/size/resizable", button_pressed) ProjectSettings.set_setting("display/window/size/resizable", button_pressed)
OS.window_resizable = ProjectSettings.get_setting("display/window/size/resizable") OS.window_resizable = ProjectSettings.get_setting("display/window/size/resizable")
# La fonction existe dans la doc mais le moteur lui ne la reconnait pas, # La fonction existe dans la doc mais le moteur lui ne la reconnait pas,
# soit il y a une subtilité quelquepart soit la doc n'est pas à jour. # soit il y a une subtilité quelquepart soit la doc n'est pas à jour.
func _on_AlwaysOnTop_toggled(button_pressed): func _on_AlwaysOnTop_toggled(button_pressed):
# OS.set_window_always_on_top( button_pressed ) # OS.set_window_always_on_top( button_pressed )
pass pass
func _on_SpinBox_value_changed(value): func _on_SpinBox_value_changed(value):
OS.current_screen = value OS.current_screen = value
func _on_ApplyButton_pressed(): func _on_ApplyButton_pressed():
var config_file = ConfigFile.new() var config_file = ConfigFile.new()
var err = config_file.load( "user://settings.cfg" ) var err = config_file.load( "user://settings.cfg" )
if err: if err:
print("[res://gui_scene/GUI/Settings/Settings.gd:_on_ApplyButton_pressed] Error code when loading config file: ", err) print("[res://gui_scene/GUI/Settings/Settings.gd:_on_ApplyButton_pressed] Error code when loading config file: ", err)
config_file.set_value("theme", "font_size", $Menus.get_theme().default_font.size) config_file.set_value("theme", "font_size", $Menus.get_theme().default_font.size)
config_file.save( "user://settings.cfg" ) config_file.save( "user://settings.cfg" )
# Save Connexion # Save Connexion
var script_connexion = preload("res://assets/Scripts/Config/connexion.gd") var script_connexion = preload("res://assets/Scripts/Config/connexion.gd")
var connexion = script_connexion.connexion.new() var connexion = script_connexion.connexion.new()
connexion.set_url_register($Menus/TabContainer/connexion/v_box_container/h_box_container/register.text) connexion.set_url_register($Menus/TabContainer/connexion/v_box_container/h_box_container/register.text)
connexion.set_url_login($Menus/TabContainer/connexion/v_box_container/h_box_container2/connexion.text) connexion.set_url_login($Menus/TabContainer/connexion/v_box_container/h_box_container2/connexion.text)
var id = $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.get_selected_id() var id = $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.get_selected_id()
var language = $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.get_item_text(id) var language = $Menus/TabContainer/connexion/v_box_container/h_box_container4/language.get_item_text(id)
connexion.set_language(language) connexion.set_language(language)
connexion.set_valid_certificate($Menus/TabContainer/connexion/v_box_container/h_box_container3/certificate_valid.pressed) connexion.set_valid_certificate($Menus/TabContainer/connexion/v_box_container/h_box_container3/certificate_valid.pressed)
connexion.save() connexion.save()
emit_signal( "return_pressed" ) emit_signal( "return_pressed" )
func _on_CancelButton_pressed(): func _on_CancelButton_pressed():
emit_signal( "return_pressed" ) emit_signal( "return_pressed" )
func _unhandled_input(event): func _unhandled_input(event):
if event is InputEventKey: if event is InputEventKey:
if event.pressed and event.scancode == KEY_ESCAPE: if event.pressed and event.scancode == KEY_ESCAPE:
emit_signal( "return_pressed" ) emit_signal( "return_pressed" )

View file

@ -71,6 +71,9 @@ custom_constants/margin_top = 0
custom_constants/margin_left = 0 custom_constants/margin_left = 0
custom_constants/margin_bottom = 0 custom_constants/margin_bottom = 0
script = ExtResource( 2 ) script = ExtResource( 2 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="texture_rect" type="TextureRect" parent="."] [node name="texture_rect" type="TextureRect" parent="."]
margin_right = 1280.0 margin_right = 1280.0
@ -231,7 +234,6 @@ margin_top = 49.0
mouse_filter = 0 mouse_filter = 0
[node name="ScrollContainer" type="ScrollContainer" parent="Menus/TabContainer/Controles"] [node name="ScrollContainer" type="ScrollContainer" parent="Menus/TabContainer/Controles"]
editor/display_folded = true
margin_right = 1280.0 margin_right = 1280.0
margin_bottom = 574.0 margin_bottom = 574.0
size_flags_horizontal = 3 size_flags_horizontal = 3
@ -294,7 +296,6 @@ margin_bottom = -1.0
hint_tooltip = "Interface." hint_tooltip = "Interface."
[node name="Header" type="HBoxContainer" parent="Menus/TabContainer/Controles/ScrollContainer/TabContainer/Interface"] [node name="Header" type="HBoxContainer" parent="Menus/TabContainer/Controles/ScrollContainer/TabContainer/Interface"]
editor/display_folded = true
margin_right = 1022.0 margin_right = 1022.0
margin_bottom = 38.0 margin_bottom = 38.0
@ -401,7 +402,6 @@ margin_right = -1.0
margin_bottom = -1.0 margin_bottom = -1.0
[node name="Header" type="HBoxContainer" parent="Menus/TabContainer/Controles/ScrollContainer/TabContainer/Deplacement"] [node name="Header" type="HBoxContainer" parent="Menus/TabContainer/Controles/ScrollContainer/TabContainer/Deplacement"]
editor/display_folded = true
margin_right = 1022.0 margin_right = 1022.0
margin_bottom = 37.0 margin_bottom = 37.0
@ -707,8 +707,8 @@ margin_right = 1280.0
margin_bottom = 139.0 margin_bottom = 139.0
[node name="certificate_valid" type="CheckBox" parent="Menus/TabContainer/connexion/v_box_container/h_box_container3"] [node name="certificate_valid" type="CheckBox" parent="Menus/TabContainer/connexion/v_box_container/h_box_container3"]
margin_left = 485.0 margin_left = 517.0
margin_right = 794.0 margin_right = 762.0
margin_bottom = 33.0 margin_bottom = 33.0
size_flags_horizontal = 6 size_flags_horizontal = 6
size_flags_vertical = 6 size_flags_vertical = 6

View file

@ -6,25 +6,48 @@ extends Control
# var b = "text" # var b = "text"
var _networkconnection = NetworkConnection.new() var _networkconnection = NetworkConnection.new()
var _history = Array()
const StringManager = preload("res://assets/Scripts/Config/string_manager.gd")
var _string_manager = StringManager.new()
var _phrases_not_decoded = Array()
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready():
pass # Replace with function body. pass # Replace with function body.
func analyze_message(message):
if message['action'] == Action.ACTION_POSITION_CODE:
pass
elif message['action'] == Action.ACTION_GENERIC_CODE:
if message['impulse'] == ImpulseBase.STRING_MANAGER_RELOAD_CACHE:
print(message['timestamp'])
_string_manager.set_timestamp(message['timestamp'])
elif message['impulse'] == ImpulseBase.STRING_MANAGER_PHRASE_SEND:
if _string_manager.check_phases(message['dynId']) == false:
_phrases_not_decoded.append(message)
var command = {'action': Action.ACTION_GENERIC_CODE, 'impulse': ImpulseBase.STRING_MANAGER_STRING_RQ, "stringId": message['dynId']}
_networkconnection.put_command(command);
_networkconnection.put_command(command);
return
# Called every frame. 'delta' is the elapsed time since the previous frame. # Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta): func _process(delta):
_networkconnection.process(delta) _networkconnection.process(delta)
var data = _networkconnection.get_server_messages() var data = _networkconnection.get_server_messages()
##print("******* data:", data.size(), data) ##print("******* data:", data.size(), data)
if data.size() > 0: while data.size() >0:
var message = data.pop_front()
_history.append(message)
print(message)
analyze_message(message)
if _history.size() > 0:
# just to see last message (normally cleanned each time we read message) # just to see last message (normally cleanned each time we read message)
while data.size() > 10: while _history.size() > 10:
var ele = data.pop_front() var element = _history.pop_front()
print("*** remove:" , ele) print("*** remove:" , element)
var message = "tick :" + String(_networkconnection.get_server_tick()) + '\n' var message = "tick :" + String(_networkconnection.get_server_tick()) + '\n'
for i in range(0, data.size()): for i in range(0, _history.size()):
message += String(data[i]) + '\n' message += String(_history[i]) + '\n'
$label.text = message $label.text = message
func _show(): func _show():

View file

@ -21,6 +21,7 @@
#include "core/reference.h" #include "core/reference.h"
#include "core/array.h" #include "core/array.h"
#include "core/dictionary.h" #include "core/dictionary.h"
#include "core/list.h"
#include "modules/debug/debug.h" #include "modules/debug/debug.h"
#include "modules/networkconnection/network_data.h" #include "modules/networkconnection/network_data.h"
#include "modules/networkconnection/state_connexion.h" #include "modules/networkconnection/state_connexion.h"
@ -28,6 +29,8 @@
#include "modules/referentialmessage/referentialmessagecore.h" #include "modules/referentialmessage/referentialmessagecore.h"
#include "modules/impulse/impulsebase.h" #include "modules/impulse/impulsebase.h"
#include "action_factory.h" #include "action_factory.h"
#include "action_genericmultipart.h"
#include "action.h"
void ActionFactory::decode_message(NetworkData * data, Ref<BitStream> msgin) void ActionFactory::decode_message(NetworkData * data, Ref<BitStream> msgin)
{ {
@ -35,9 +38,11 @@ void ActionFactory::decode_message(NetworkData * data, Ref<BitStream> msgin)
ReferentialMessage ref_msg; ReferentialMessage ref_msg;
uint32_t id = ref_msg.read_command(msgin); uint32_t id = ref_msg.read_command(msgin);
DBG_PRINT("Decode message:" + ImpulseBase::get_command_name(id)); DBG_PRINT("Decode message:" + ImpulseBase::get_command_name(id));
value["command"] = id; value["action"] = Action::CODE::ACTION_GENERIC_CODE;
value["impulse"] = id;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
value["command_debug"] = ImpulseBase::get_command_name(id); value["action_debug"] = "ACTION_GENERIC_CODE";
value["impulse_debug"] = ImpulseBase::get_command_name(id);
#endif #endif
switch(id) switch(id)
{ {
@ -67,6 +72,65 @@ void ActionFactory::decode_message(NetworkData * data, Ref<BitStream> msgin)
} }
case ImpulseBase::Impulse::CONNECTION_USER_CHARS: case ImpulseBase::Impulse::CONNECTION_USER_CHARS:
{ {
// khanat-opennel-code/code/ryzom/client/src/net_manager.cpp void impulseUserChars(NLMISC::CBitMemStream &impulse)
// khanat-opennel-code/code/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp void sendCharactersSummary( CPlayer *player, bool AllAutorized, uint32 bitfieldOwnerOfActiveAnimSession, uint32 bitfieldOwnerOfEditSession )
uint32_t i;
value["ServerPeopleActive"] = msgin->get_uint8();
value["ServerCareerActive"] = msgin->get_uint8();
uint32_t character_summaries_Len = msgin->get_uint32();
value["CharacterSummaries_Len"] = character_summaries_Len;
Array character_summaries;
for(i=0;i<character_summaries_Len;++i)
{
Dictionary character;
character["Version"] = msgin->get_version();
character["Mainland"] = msgin->get_uint32();
character["Name"] = msgin->get_ustring();
character["People"] = msgin->get_uint32();
character["Location"] = msgin->get_uint32();
character["VisualPropA"] = msgin->get_uint64();
character["VisualPropB"] = msgin->get_uint64();
character["VisualPropC"] = msgin->get_uint64();
character["SheetId"] = msgin->get_uint32();
character["Title"] = msgin->get_sint32();
character["CharacterSlot"] = msgin->get_uint8();
character["InRingSession"] = msgin->get_bool();
character["HasEditSession"] = msgin->get_bool();
character["InNewbieland"] = msgin->get_bool();
character_summaries.append(character);
}
value["CharacterSummaries"] = character_summaries;
uint32_t shard_names_Len = msgin->get_uint32();
value["shardNames_Len"] = shard_names_Len;
Array shard_names;
for(i=0;i<shard_names_Len;++i)
{
Dictionary shard_name;
shard_name["ShardNames"] = msgin->get_string();
shard_names.append(shard_name);
}
value["ShardNames"] = shard_names;
value["Privileges"] = msgin->get_string();
value["FreeTrial"] = msgin->get_bool();
uint32_t mainlands_len = msgin->get_uint32();
value["Mainlands_Len"] = mainlands_len;
Array mainlands;
for(i=0;i<mainlands_len;++i)
{
Dictionary mainland;
mainland["id"] = msgin->get_uint32();
mainland["Name"] = msgin->get_ustring();
mainland["Description"] = msgin->get_ustring();
mainland["LanguageCode"] = msgin->get_string();
mainland["Online"] = msgin->get_bool();
mainlands.append(mainland);
}
value["Mainlands"] = mainlands;
break; break;
} }
case ImpulseBase::Impulse::CONNECTION_CREATE_CHAR: case ImpulseBase::Impulse::CONNECTION_CREATE_CHAR:
@ -935,6 +999,17 @@ void ActionFactory::decode_message(NetworkData * data, Ref<BitStream> msgin)
} }
case ImpulseBase::Impulse::STRING_MANAGER_PHRASE_SEND: case ImpulseBase::Impulse::STRING_MANAGER_PHRASE_SEND:
{ {
int i = 1;
uint32_t dynId = msgin->get_uint32();
value["dynId"] = dynId;
uint32_t StringId = msgin->get_uint32();
value["StringId_0"] = StringId;
while(msgin->number_bit_not_read() > 32)
{
StringId = msgin->get_uint32();
value["StringId_" + itos(i)] = StringId;
++i;
}
break; break;
} }
case ImpulseBase::Impulse::STRING_MANAGER_STRING_RQ: case ImpulseBase::Impulse::STRING_MANAGER_STRING_RQ:
@ -953,7 +1028,7 @@ void ActionFactory::decode_message(NetworkData * data, Ref<BitStream> msgin)
//param.push_back(timestamp); //param.push_back(timestamp);
value["timestamp"] = timestamp; value["timestamp"] = timestamp;
data->_server_messages.push_back(value); //data->_server_messages.push_back(value);
break; break;
} }
case ImpulseBase::Impulse::GUILD_CREATE: case ImpulseBase::Impulse::GUILD_CREATE:
@ -1389,6 +1464,7 @@ void ActionFactory::decode_message(NetworkData * data, Ref<BitStream> msgin)
break; break;
} }
} }
data->_server_messages.push_back(value);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
// Check if we have read all data - only on debug mode // Check if we have read all data - only on debug mode
{ {
@ -1397,7 +1473,8 @@ void ActionFactory::decode_message(NetworkData * data, Ref<BitStream> msgin)
{ {
DBG_PRINT("Read : " + itos(msgin->number_bit_not_read())); DBG_PRINT("Read : " + itos(msgin->number_bit_not_read()));
if ( msgin->number_bit_not_read() >= 8 ) if ( msgin->number_bit_not_read() >= 8 )
last_data = msgin->get_uint8(); //last_data = msgin->get_uint8();
last_data = 1;
else else
last_data = msgin->get_serial(msgin->number_bit_not_read()); last_data = msgin->get_serial(msgin->number_bit_not_read());
if ( last_data != 0 ) if ( last_data != 0 )
@ -1411,6 +1488,156 @@ void ActionFactory::decode_message(NetworkData * data, Ref<BitStream> msgin)
#endif #endif
} }
void ActionFactory::encode_message(Dictionary value, Ref<BitStream> msgout)
{
ReferentialMessage ref_msg;
int id = value["impulse"];
ref_msg.write_command((ImpulseBase::Impulse)id, msgout);
DBG_PRINT("[ActionFactory::pack] ACTION_GENERIC_CODE encode_message A:" + itos(id) + " / " + msgout->show_detail());
switch(id)
{
case ImpulseBase::Impulse::TARGET_PARTY:
{
break;
}
case ImpulseBase::Impulse::STRING_MANAGER_STRING_RQ:
{
uint32_t stringId = value["stringId"];
msgout->put_uint32(stringId);
DBG_PRINT("[ActionFactory::pack] ACTION_GENERIC_CODE encode_message B:" + itos(id) + " / " + msgout->show_detail());
break;
}
default:
{
break;
}
}
}
void ActionFactory::code(int code, Ref<BitStream> msgout)
{
if(code < 4)
{
msgout->put_bool(true);
msgout->put_serial(code, 2);
}
else
{
msgout->put_bool(false);
msgout->put_uint8(code);
}
}
void ActionFactory::pack(NetworkData * data)
{
while(data->_command_to_send.size())
{
DBG_PRINT("[ActionFactory::pack]");
Dictionary value = data->_command_to_send.pop_front();
int id = value["action"];
switch(id)
{
case Action::CODE::ACTION_POSITION_CODE:
{
break;
}
case Action::CODE::ACTION_GENERIC_CODE:
case Action::CODE::ACTION_GENERIC_MULTI_PART_CODE:
{
Ref<BitStream> msg;
msg.instance();
encode_message(value, msg);
DBG_PRINT("[ActionFactory::pack] ACTION_GENERIC_CODE encode_message :" + msg->show_detail());
if( msg->size_data() < MAX_IMPULSE_BIT_SIZE ) // 1840 bits= 230*8
{
// ACTION_GENERIC_CODE
Ref<BitStream> msgout;
msgout.instance();
code(Action::CODE::ACTION_GENERIC_CODE, msgout);
msg->complet_byte();
DBG_PRINT("[ActionFactory::pack] ACTION_GENERIC_CODE encode_message (Bis):" + msg->show_detail());
DBG_PRINT("[ActionFactory::pack] ACTION_GENERIC_CODE prepared A :" + msgout->show_detail());
msgout->put_uint32(msg->size());
DBG_PRINT("[ActionFactory::pack] ACTION_GENERIC_CODE prepared B :" + msgout->show_detail());
msgout->put_bitstream(msg.ptr());
DBG_PRINT("[ActionFactory::pack] ACTION_GENERIC_CODE prepared C :" + msgout->show_detail());
data->_client_messages.append(msgout); //data->_client_messages.append(msgout->get_data());
DBG_PRINT("[ActionFactory::pack] ACTION_GENERIC_CODE prepared D :" + msgout->show_detail());
msgout.unref();
}
else
{
// ACTION_GENERIC_MULTI_PART_CODE
uint32_t size;
uint32_t last = 0;
uint32_t minimumBitSizeForMP = 1 + 2 + 2 + 4; // header
uint32_t availableSize = (MAX_IMPULSE_BIT_SIZE - minimumBitSizeForMP); // 8
uint32_t bytelen = msg->size();
uint16_t part;
uint16_t nbBlock = (bytelen + availableSize - 1); // availableSize
uint8_t num = data->_impulse_multi_part_number;
PoolByteArray msgTemp;
data->_impulse_multi_part_number += 1;
msg->complet_byte();
for(part = 0 ; part < nbBlock ; ++part)
{
Ref<BitStream> msgout;
msgout.instance();
code(Action::CODE::ACTION_GENERIC_MULTI_PART_CODE, msgout);
msgout->put_uint8(num);
msgout->put_uint16(part);
msgout->put_uint16(nbBlock);
size = availableSize;
if ( size + last > bytelen)
size = bytelen - last;
last = size;
msgout->put_uint32(size);
msgout->get_array_uint8(size);
//msgout->put_bitstream(msg.ptr());-------TODO
data->_client_messages.append(msgout); // data->_client_messages.append(msgout->get_data());
DBG_PRINT("[ActionFactory::pack] ACTION_GENERIC_MULTI_PART_CODE prepared :" + msgout->show_detail());
msgout.unref();
}
}
msg.unref();
break;
}
case Action::CODE::ACTION_SINT64:
{
break;
}
case Action::CODE::ACTION_SYNC_CODE:
{
// not used, here
break;
}
case Action::CODE::ACTION_DISCONNECTION_CODE:
{
break;
}
case Action::CODE::ACTION_ASSOCIATION_CODE:
{
break;
}
case Action::CODE::ACTION_LOGIN_CODE:
{
// not used, here
break;
}
case Action::CODE::ACTION_TARGET_SLOT_CODE:
{
break;
}
case Action::CODE::ACTION_DUMMY_CODE:
{
break;
}
}
}
}
void ActionFactory::unpack(NetworkData * data, Ref<BitStream> msgin) void ActionFactory::unpack(NetworkData * data, Ref<BitStream> msgin)
{ {
bool shortcode = msgin->get_bool(); bool shortcode = msgin->get_bool();
@ -1423,7 +1650,7 @@ void ActionFactory::unpack(NetworkData * data, Ref<BitStream> msgin)
DBG_PRINT("code:" + itos(code)); DBG_PRINT("code:" + itos(code));
switch (code) switch (code)
{ {
case ACTIONCODE::ACTION_POSITION_CODE: case Action::CODE::ACTION_POSITION_CODE:
{ {
// khanat-opennel-code/code/ryzom/common/src/game_share/action_position.cpp:34 void CActionPosition::unpack (NLMISC::CBitMemStream &message) // khanat-opennel-code/code/ryzom/common/src/game_share/action_position.cpp:34 void CActionPosition::unpack (NLMISC::CBitMemStream &message)
// px ( 16 bit unsigned ) // px ( 16 bit unsigned )
@ -1431,21 +1658,32 @@ void ActionFactory::unpack(NetworkData * data, Ref<BitStream> msgin)
// pz ( 16 bit unsigned ) : low bit have other signification // pz ( 16 bit unsigned ) : low bit have other signification
// 0x01 : IsRelative // 0x01 : IsRelative
// 0x02 : Interior // 0x02 : Interior
DBG_PRINT("ACTION_GENERIC_CODE"); DBG_PRINT("ACTION_POSITION_CODE");
uint16_t px = msgin->get_uint16(); uint16_t px = msgin->get_uint16();
uint16_t py = msgin->get_uint16(); uint16_t py = msgin->get_uint16();
uint16_t pz = msgin->get_uint16(); uint16_t pz = msgin->get_uint16();
bool IsRelative = (pz & 0x1) != 0; bool IsRelative = (pz & 0x1) != 0;
bool Interior = (pz & 0x2) != 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)); Dictionary msg;
msg["action"] = code;
#ifdef DEBUG_ENABLED
msg["action_debug"] = "ACTION_POSITION_CODE";
#endif
msg["px"] = px;
msg["py"] = px;
msg["pz"] = px;
msg["IsRelative"] = IsRelative;
msg["Interior"] = Interior;
data->_server_messages.push_back(msg);
DBG_PRINT("ACTION_POSITION_CODE px:" + uitos(px) + " py:" + uitos(py) + " pz:" + uitos(pz) + " IsRelative:" + uitos(IsRelative) + " Interior:" + uitos(Interior));
break; break;
} }
case ACTIONCODE::ACTION_GENERIC_CODE: case Action::CODE::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) // 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) // size ( 32 bits unsigned ) : if size > 512 we have an error (normally reject by server)
// StreamByte ( Array : size * 8 bits unsigned ) // StreamByte ( Array : size * 8 bits unsigned )
DBG_PRINT("ACTION_GENERIC_CODE");
uint32_t size = msgin->get_uint32(); uint32_t size = msgin->get_uint32();
DBG_PRINT("ACTION_GENERIC_CODE size:" + uitos(size)); DBG_PRINT("ACTION_GENERIC_CODE size:" + uitos(size));
PoolByteArray StreamByte = msgin->get_array_uint8(size); PoolByteArray StreamByte = msgin->get_array_uint8(size);
@ -1458,96 +1696,183 @@ void ActionFactory::unpack(NetworkData * data, Ref<BitStream> msgin)
tmp.unref(); tmp.unref();
break; break;
} }
case ACTIONCODE::ACTION_GENERIC_MULTI_PART_CODE: case Action::CODE::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) // 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 ) // Number ( 8 bits unsigned )
// Part ( 16 bits unsigned ) // Part ( 16 bits unsigned )
// NbBlock ( 16 bits unsigned ) // NbBlock ( 16 bits unsigned )
// size ( 32 bits unsigned ) // size ( 32 bits unsigned )
// PartCont ( Array : size * 8 bits unsigned ) // PartCont ( Array : size * 8 bits unsigned )
DBG_PRINT("ACTION_GENERIC_MULTI_PART_CODE");
uint8_t Number = msgin->get_uint8(); uint8_t Number = msgin->get_uint8();
uint16_t Part = msgin->get_uint16(); uint16_t Part = msgin->get_uint16();
uint16_t NbBlock = msgin->get_uint16(); uint16_t NbBlock = msgin->get_uint16();
uint32_t size = msgin->get_uint32(); uint32_t size = msgin->get_uint32();
PoolByteArray StreamByte = msgin->get_array_uint8(size); PoolByteArray StreamByte = msgin->get_array_uint8(size);
//BitStream StreamByte = msgin->get_bitstream(size);
DBG_PRINT("ACTION_GENERIC_MULTI_PART_CODE Number:" + uitos(Number) + " Part:" + uitos(Part) + " NbBlock:" + uitos(NbBlock) + " size:" + uitos(size)); DBG_PRINT("ACTION_GENERIC_MULTI_PART_CODE Number:" + uitos(Number) + " Part:" + uitos(Part) + " NbBlock:" + uitos(NbBlock) + " size:" + uitos(size));
if ( ! data->_block.has(Number) )
{
Dictionary newelement;
data->_block[Number] = newelement;
data->_block_used[Number] = 0;
//data->_block[Number] = new GenericMultiPart(Number, NbBlock);
}
Dictionary ele = data->_block[Number]; //[Part] = StreamByte;
ele[Part] = StreamByte;
{
Ref<BitStream> tmp;
tmp.instance();
tmp->put_array_uint8(StreamByte);
tmp.unref();
}
if( ele.size() == NbBlock)
{
int used = data->_block_used[Number];
if ( used != 0 )
break;
int i;
PoolByteArray full;
for(i = 0;i < NbBlock; ++i)
{
PoolByteArray tmp = ele[i];
full.append_array(ele[i]);
}
Ref<BitStream> tmp;
tmp.instance();
tmp->put_array_uint8(full);
decode_message(data, tmp);
tmp.unref();
data->_block_used[Number] = 20;
}
break; break;
} }
case ACTIONCODE::ACTION_SINT64: case Action::CODE::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) // khanat-opennel-code/code/ryzom/common/src/game_share/action_sint64.cpp:86 void CActionSint64::unpack (NLMISC::CBitMemStream &message)
// value ( 64 bits unsigned ) // value ( 64 bits unsigned )
DBG_PRINT("ACTION_SINT64");
uint64_t value = msgin->get_uint64(); uint64_t value = msgin->get_uint64();
Dictionary msg;
msg["action"] = code;
#ifdef DEBUG_ENABLED
msg["action_debug"] = "ACTION_SINT64";
#endif
msg["value"] = value;
data->_server_messages.push_back(msg);
DBG_PRINT("ACTION_SINT64 value:" + uitos(value)); DBG_PRINT("ACTION_SINT64 value:" + uitos(value));
break; break;
} }
case ACTIONCODE::ACTION_SYNC_CODE: case Action::CODE::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) // khanat-opennel-code/code/ryzom/common/src/game_share/action_sync.h:44 virtual void unpack (NLMISC::CBitMemStream &message)
// Sync ( 32 bits unsigned ) // Sync ( 32 bits unsigned )
// BKEntityId ( 64 bits unsigned ) [see definition : khanat-opennel-code/code/nel/include/nel/misc/entity_id.h:64] // BKEntityId ( 64 bits unsigned ) [see definition : khanat-opennel-code/code/nel/include/nel/misc/entity_id.h:64]
DBG_PRINT("ACTION_SYNC_CODE");
uint32_t Sync = msgin->get_uint32(); uint32_t Sync = msgin->get_uint32();
uint64_t BKEntityId = msgin->get_uint64(); uint64_t BKEntityId = msgin->get_uint64();
Dictionary msg;
msg["action"] = code;
#ifdef DEBUG_ENABLED
msg["action_debug"] = "ACTION_SYNC_CODE";
#endif
msg["Sync"] = Sync;
msg["BKEntityId"] = BKEntityId;
data->_server_messages.push_back(msg);
DBG_PRINT("ACTION_SYNC_CODE Sync:" + uitos(Sync) + " BKEntityId:" + uitos(BKEntityId)); DBG_PRINT("ACTION_SYNC_CODE Sync:" + uitos(Sync) + " BKEntityId:" + uitos(BKEntityId));
break; break;
} }
case ACTIONCODE::ACTION_DISCONNECTION_CODE: case Action::CODE::ACTION_DISCONNECTION_CODE:
{ {
// khanat-opennel-code/code/ryzom/common/src/game_share/action_disconnection.h // khanat-opennel-code/code/ryzom/common/src/game_share/action_disconnection.h
// No data // No data
DBG_PRINT("ACTION_DISCONNECTION_CODE"); DBG_PRINT("ACTION_DISCONNECTION_CODE");
Dictionary msg;
msg["action"] = code;
#ifdef DEBUG_ENABLED
msg["action_debug"] = "ACTION_DISCONNECTION_CODE";
#endif
data->_server_messages.push_back(msg);
break; break;
} }
case ACTIONCODE::ACTION_ASSOCIATION_CODE: case Action::CODE::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) // khanat-opennel-code/code/ryzom/common/src/game_share/action_association.h virtual void unpack (NLMISC::CBitMemStream &message)
// IsNewAssociation ( bool / 1 bit ) // IsNewAssociation ( bool / 1 bit )
// if IsNewAssociation is true: // if IsNewAssociation is true:
// SheetId ( 32 bits unsigned ) // SheetId ( 32 bits unsigned )
// Replace ( bool / 1 bit ) // Replace ( bool / 1 bit )
DBG_PRINT("ACTION_ASSOCIATION_CODE");
uint32_t SheetId = msgin->get_uint32(); uint32_t SheetId = msgin->get_uint32();
bool Replace = msgin->get_bool(); bool Replace = msgin->get_bool();
Dictionary msg;
msg["action"] = code;
#ifdef DEBUG_ENABLED
msg["action_debug"] = "ACTION_ASSOCIATION_CODE";
#endif
msg["SheetId"] = SheetId;
msg["Replace"] = Replace;
data->_server_messages.push_back(msg);
DBG_PRINT("ACTION_ASSOCIATION_CODE SheetId:" + uitos(SheetId) + " Replace:" + uitos(Replace)); DBG_PRINT("ACTION_ASSOCIATION_CODE SheetId:" + uitos(SheetId) + " Replace:" + uitos(Replace));
break; break;
} }
case ACTIONCODE::ACTION_LOGIN_CODE: case Action::CODE::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) // khanat-opennel-code/code/ryzom/common/src/game_share/action_login.h virtual void unpack (NLMISC::CBitMemStream &message)
// ua ( 32 bits unsigned ) // ua ( 32 bits unsigned )
// uk ( 32 bits unsigned ) // uk ( 32 bits unsigned )
// ui ( 32 bits unsigned ) // ui ( 32 bits unsigned )
DBG_PRINT("ACTION_LOGIN_CODE");
uint32_t ua = msgin->get_uint32(); uint32_t ua = msgin->get_uint32();
uint32_t uk = msgin->get_uint32(); uint32_t uk = msgin->get_uint32();
uint32_t ui = msgin->get_uint32(); uint32_t ui = msgin->get_uint32();
Dictionary msg;
msg["action"] = code;
#ifdef DEBUG_ENABLED
msg["action_debug"] = "ACTION_LOGIN_CODE";
#endif
msg["ua"] = ua;
msg["uk"] = uk;
msg["ui"] = ui;
data->_server_messages.push_back(msg);
DBG_PRINT("ACTION_LOGIN_CODE ua:" + uitos(ua) + " uk:" + uitos(uk)+ " ui:" + uitos(ui)); DBG_PRINT("ACTION_LOGIN_CODE ua:" + uitos(ua) + " uk:" + uitos(uk)+ " ui:" + uitos(ui));
break; break;
} }
case ACTIONCODE::ACTION_TARGET_SLOT_CODE: case Action::CODE::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) // khanat-opennel-code/code/ryzom/common/src/game_share/action_target_slot.h virtual void unpack (NLMISC::CBitMemStream &message)
// Slot ( 8 bits unsigned ) // Slot ( 8 bits unsigned )
// TargetOrPickup (2 bits unsigned) // TargetOrPickup (2 bits unsigned)
DBG_PRINT("ACTION_TARGET_SLOT_CODE");
uint8_t Slot = msgin->get_uint8(); uint8_t Slot = msgin->get_uint8();
uint32_t TargetOrPickup = msgin->get_serial(2); uint32_t TargetOrPickup = msgin->get_serial(2);
Dictionary msg;
msg["action"] = code;
#ifdef DEBUG_ENABLED
msg["action_debug"] = "ACTION_TARGET_SLOT_CODE";
#endif
msg["Slot"] = Slot;
msg["TargetOrPickup"] = TargetOrPickup;
data->_server_messages.push_back(msg);
DBG_PRINT("ACTION_TARGET_SLOT_CODE Slot:" + uitos(Slot) + " TargetOrPickup:" + uitos(TargetOrPickup)); DBG_PRINT("ACTION_TARGET_SLOT_CODE Slot:" + uitos(Slot) + " TargetOrPickup:" + uitos(TargetOrPickup));
break; break;
} }
case ACTIONCODE::ACTION_DUMMY_CODE: case Action::CODE::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) // khanat-opennel-code/code/ryzom/common/src/game_share/action_dummy.h virtual void unpack (NLMISC::CBitMemStream &message)
// Dummy1 ( 32 bits unsigned ) // Dummy1 ( 32 bits unsigned )
// Dummy2 ( 32 bits unsigned ) // Dummy2 ( 32 bits unsigned )
DBG_PRINT("ACTION_DUMMY_CODE");
uint32_t Dummy1 = msgin->get_uint32(); uint32_t Dummy1 = msgin->get_uint32();
uint32_t Dummy2 = msgin->get_uint32(); uint32_t Dummy2 = msgin->get_uint32();
Dictionary msg;
msg["action"] = code;
#ifdef DEBUG_ENABLED
msg["action_debug"] = "ACTION_DUMMY_CODE";
#endif
msg["Dummy1"] = Dummy1;
msg["Dummy2"] = Dummy2;
data->_server_messages.push_back(msg);
DBG_PRINT("ACTION_DUMMY_CODE Dummy1:" + uitos(Dummy1) + " Dummy2:" + uitos(Dummy2)); DBG_PRINT("ACTION_DUMMY_CODE Dummy1:" + uitos(Dummy1) + " Dummy2:" + uitos(Dummy2));
break; break;
} }
@ -1570,6 +1895,7 @@ void ActionFactory::decode(NetworkData * data, Ref<BitStream> msgin)
int channel; int channel;
int num; int num;
data->_last_received_ack = msgin->get_uint32(); data->_last_received_ack = msgin->get_uint32();
DBG_PRINT("last_received_ack:" + itos(data->_last_received_ack));
for( level=0 ; level < 3 ; ++level ) for( level=0 ; level < 3 ; ++level )
{ {
DBG_PRINT("level:" + itos(level)); DBG_PRINT("level:" + itos(level));
@ -1612,4 +1938,46 @@ void ActionFactory::decode(NetworkData * data, Ref<BitStream> msgin)
DBG_PRINT("next:" + itos(next)); DBG_PRINT("next:" + itos(next));
} }
} }
clear_old_block(data);
}
void ActionFactory::clear_old_block(NetworkData * data)
{
int i;
i = data->_block.size();
while(i>0)
{
i--;
Variant value = data->_block_used.get_value_at_index(i);
Variant key = data->_block_used.get_key_at_index(i);
int used = data->_block_used[key];
if ( used >= 2 )
{
used --;
data->_block_used[key] = used;
}
else if ( used > 0 )
{
data->_block_used.erase(key);
data->_block.erase(key);
DBG_PRINT("Remove block - key:" + String(key));
}
}
}
void ActionFactory::clear_all_block(NetworkData * data)
{
int i;
DBG_PRINT("Remove all block");
i = data->_block.size();
while(i>0)
{
i--;
Variant key = data->_block_used.get_key_at_index(i);
data->_block_used.erase(key);
data->_block.erase(key);
DBG_PRINT("Remove block: key:" + String(key));
}
} }

View file

@ -24,12 +24,20 @@
#include "core/object.h" #include "core/object.h"
#include "modules/networkconnection/network_data.h" #include "modules/networkconnection/network_data.h"
// 1840 bits= 230*8
#define MAX_IMPULSE_BIT_SIZE 1840
class ActionFactory class ActionFactory
{ {
public: public:
void decode_message(NetworkData * data, Ref<BitStream> msgin); static void decode_message(NetworkData * data, Ref<BitStream> msgin);
void unpack(NetworkData * data, Ref<BitStream> msgin); static void encode_message(Dictionary value, Ref<BitStream> msgout);
void decode(NetworkData * data, Ref<BitStream> msgin); static void code(int code, Ref<BitStream> msgout);
static void pack(NetworkData * data);
static void unpack(NetworkData * data, Ref<BitStream> msgin);
static void decode(NetworkData * data, Ref<BitStream> msgin);
static void clear_old_block(NetworkData * data);
static void clear_all_block(NetworkData * data);
}; };
#endif #endif

View file

@ -3,10 +3,11 @@
#include "register_types.h" #include "register_types.h"
#include "core/class_db.h" #include "core/class_db.h"
#include "action_factory.h" //#include "action_factory.h"
#include "action.h"
void register_action_types() { void register_action_types() {
//ClassDB::register_class<ActionFactory>(); ClassDB::register_class<Action>();
} }
void unregister_action_types() { void unregister_action_types() {

View file

@ -21,6 +21,7 @@ Build :
*/ */
#include "modules/bitstream/bitstream.h" #include "modules/bitstream/bitstream.h"
#include "modules/debug/debug.h"
// TODO - check if on godot we have a function or variable to get if processor is little_endian or not // TODO - check if on godot we have a function or variable to get if processor is little_endian or not
bool little_endian = false; bool little_endian = false;
@ -31,6 +32,7 @@ void BitStream::_bind_methods()
ClassDB::bind_method(D_METHOD("is_little_endian"), &BitStream::is_little_endian); ClassDB::bind_method(D_METHOD("is_little_endian"), &BitStream::is_little_endian);
ClassDB::bind_method(D_METHOD("complet_byte"), &BitStream::complet_byte);
ClassDB::bind_method(D_METHOD("size"), &BitStream::size); ClassDB::bind_method(D_METHOD("size"), &BitStream::size);
ClassDB::bind_method(D_METHOD("size_data"), &BitStream::size_data); ClassDB::bind_method(D_METHOD("size_data"), &BitStream::size_data);
ClassDB::bind_method(D_METHOD("number_bit_not_read"), &BitStream::number_bit_not_read); ClassDB::bind_method(D_METHOD("number_bit_not_read"), &BitStream::number_bit_not_read);
@ -49,6 +51,7 @@ void BitStream::_bind_methods()
ClassDB::bind_method(D_METHOD("put_string", "value"), &BitStream::put_string); ClassDB::bind_method(D_METHOD("put_string", "value"), &BitStream::put_string);
ClassDB::bind_method(D_METHOD("put_string_hexa32", "hexa"), &BitStream::put_string_hexa32); ClassDB::bind_method(D_METHOD("put_string_hexa32", "hexa"), &BitStream::put_string_hexa32);
ClassDB::bind_method(D_METHOD("put_array_uint8", "value"), &BitStream::put_array_uint8); ClassDB::bind_method(D_METHOD("put_array_uint8", "value"), &BitStream::put_array_uint8);
ClassDB::bind_method(D_METHOD("put_version", "value"), &BitStream::put_version);
ClassDB::bind_method(D_METHOD("show"), &BitStream::show); ClassDB::bind_method(D_METHOD("show"), &BitStream::show);
ClassDB::bind_method(D_METHOD("show_detail"), &BitStream::show_detail); ClassDB::bind_method(D_METHOD("show_detail"), &BitStream::show_detail);
@ -67,7 +70,10 @@ void BitStream::_bind_methods()
ClassDB::bind_method(D_METHOD("get_uint32"), &BitStream::get_uint32); ClassDB::bind_method(D_METHOD("get_uint32"), &BitStream::get_uint32);
ClassDB::bind_method(D_METHOD("get_sint64"), &BitStream::get_sint64); ClassDB::bind_method(D_METHOD("get_sint64"), &BitStream::get_sint64);
ClassDB::bind_method(D_METHOD("get_uint64"), &BitStream::get_uint64); ClassDB::bind_method(D_METHOD("get_uint64"), &BitStream::get_uint64);
ClassDB::bind_method(D_METHOD("get_version", "value"), &BitStream::get_version);
ClassDB::bind_method(D_METHOD("get_array_uint8", "length"), &BitStream::get_array_uint8); ClassDB::bind_method(D_METHOD("get_array_uint8", "length"), &BitStream::get_array_uint8);
ClassDB::bind_method(D_METHOD("get_string"), &BitStream::get_string);
ClassDB::bind_method(D_METHOD("get_ustring"), &BitStream::get_ustring);
} }
void BitStream::clear() void BitStream::clear()
@ -100,17 +106,23 @@ bool BitStream::is_little_endian()
return little_endian; return little_endian;
} }
int BitStream::size() void BitStream::complet_byte()
{
// function to add 0 and have size multiple of 8 bit
this->_pos = ((this->_pos + 7) / 8) * 8;
}
uint32_t BitStream::size()
{ {
return (this->_pos + 7) / 8; return (this->_pos + 7) / 8;
} }
int BitStream::size_data() uint32_t BitStream::size_data()
{ {
return this->_pos; return this->_pos;
} }
int BitStream::number_bit_not_read() uint32_t BitStream::number_bit_not_read()
{ {
return this->_pos - this->_read; return this->_pos - this->_read;
} }
@ -255,6 +267,60 @@ void BitStream::put_array_uint8(PoolByteArray value)
this->put_serial(value[i], 8); this->put_serial(value[i], 8);
} }
void BitStream::put_bitstream(BitStream & value)
{
uint32_t last_read;
uint32_t nb;
last_read = value._read;
value._read = 0;
while ( value.number_bit_not_read() >= 32 )
put_uint32(value.get_uint32());
while ( value.number_bit_not_read() >= 16 )
put_uint16(value.get_uint16());
while ( value.number_bit_not_read() >= 8 )
put_uint8(value.get_uint8());
nb = value.number_bit_not_read();
if( nb > 0 )
put_serial(value.get_serial(nb), nb);
// restore pos read
value._read = last_read;
}
void BitStream::put_bitstream(BitStream * value)
{
uint32_t last_read;
uint32_t nb;
last_read = value->_read;
value->_read = 0;
while ( value->number_bit_not_read() >= 32 )
put_uint32(value->get_uint32());
while ( value->number_bit_not_read() >= 16 )
put_uint16(value->get_uint16());
while ( value->number_bit_not_read() >= 8 )
put_uint8(value->get_uint8());
nb = value->number_bit_not_read();
if( nb > 0 )
put_serial(value->get_serial(nb), nb);
DBG_PRINT("put_bitstream: " + itos(nb) + " / " + itos(_pos));
// restore pos read
value->_read = last_read;
}
void BitStream::put_version(uint32_t value)
{
if ( value < 255 ) // 0xff
{
this->put_uint8(value);
}
else
{
this->put_uint8(255);
this->put_uint32(value);
}
}
String BitStream::show() String BitStream::show()
{ {
String ret; String ret;
@ -308,7 +374,9 @@ String BitStream::show_detail()
while ( t > 0 ) while ( t > 0 )
{ {
const char c = '0' + ( t % 10 ); const char c = '0' + ( t % 10 );
strsize = String(&c) + strsize; CharString tmp ;
tmp += c;
strsize = tmp + strsize;
t /= 10; t /= 10;
} }
@ -318,11 +386,13 @@ String BitStream::show_detail()
while ( t > 0 ) while ( t > 0 )
{ {
const char c = '0' + ( t % 10 ); const char c = '0' + ( t % 10 );
strpos = String(&c) + strpos; CharString tmp ;
tmp += c;
strpos = tmp + strpos;
t /= 10; t /= 10;
} }
return "[size:" + strsize + ", pos:" + strpos + "]" + ret ; return "[size:" + String(strsize) + ", pos:" + String(strpos) + "]" + ret ;
} }
String BitStream::show_counter() String BitStream::show_counter()
@ -466,14 +536,32 @@ uint64_t BitStream::get_uint64()
return (v1 << 32) | v2; return (v1 << 32) | v2;
} }
uint32_t BitStream::get_version()
{
uint32_t ret;
ret = this->get_uint8();
if ( ret == 255 ) // 0xff
{
ret = this->get_uint32();
}
return ret;
}
PoolByteArray BitStream::get_array_uint8(uint32_t length) PoolByteArray BitStream::get_array_uint8(uint32_t length)
{ {
PoolByteArray ret; PoolByteArray ret;
while(length != 0) while(length > 0)
{ {
ret.append(this->get_serial(8)); ret.append(this->get_serial(8));
--length; --length;
} }
/*
if (length == 1)
{
int nb = this->number_bit_not_read();
ret.append(this->get_serial(nb));
}
*/
return ret; return ret;
} }
@ -487,3 +575,47 @@ BitStream BitStream::get_bitstream(uint32_t length)
} }
return a; return a;
} }
String BitStream::get_string()
{
String ret;
uint32_t size = this->get_uint32();
union S {
uint8_t v;
char c;
};
while(size > 0)
{
S x;
x.v = this->get_uint8();
CharString cs;
cs += x.c;
ret += cs;
--size;
}
return ret;
}
String BitStream::get_ustring()
{
// Read Utf-16
String ret;
uint32_t size = this->get_uint32();
union S {
uint16_t v;
char c[2];
};
while(size > 0)
{
S x;
x.v = this->get_uint16();
CharString cs;
cs += x.c[0];
cs += x.c[1];
ret += cs;
--size;
}
return ret;
}

View file

@ -40,9 +40,11 @@ public:
bool is_little_endian(); bool is_little_endian();
int size(); void complet_byte();
int size_data();
int number_bit_not_read(); uint32_t size();
uint32_t size_data();
uint32_t number_bit_not_read();
void put_serial(uint32_t value, uint32_t nbits); void put_serial(uint32_t value, uint32_t nbits);
void put_bool(bool value); void put_bool(bool value);
@ -58,6 +60,9 @@ public:
void put_char(String value); void put_char(String value);
void put_string(String value); void put_string(String value);
void put_array_uint8(PoolByteArray value); void put_array_uint8(PoolByteArray value);
void put_bitstream(BitStream & value);
void put_bitstream(BitStream * value);
void put_version(uint32_t value);
String show(); String show();
String show_detail(); String show_detail();
@ -79,8 +84,11 @@ public:
uint32_t get_uint32(); uint32_t get_uint32();
int64_t get_sint64(); int64_t get_sint64();
uint64_t get_uint64(); uint64_t get_uint64();
uint32_t get_version();
PoolByteArray get_array_uint8(uint32_t length); PoolByteArray get_array_uint8(uint32_t length);
BitStream get_bitstream(uint32_t length); BitStream get_bitstream(uint32_t length);
String get_string();
String get_ustring();
}; };
#endif #endif

View file

@ -31,6 +31,7 @@ void NetworkConnection::_bind_methods()
ClassDB::bind_method(D_METHOD("process", "delta"), &NetworkConnection::process); ClassDB::bind_method(D_METHOD("process", "delta"), &NetworkConnection::process);
ClassDB::bind_method(D_METHOD("get_state"), &NetworkConnection::get_state); ClassDB::bind_method(D_METHOD("get_state"), &NetworkConnection::get_state);
ClassDB::bind_method(D_METHOD("connect_to_server"), &NetworkConnection::connect_to_server); ClassDB::bind_method(D_METHOD("connect_to_server"), &NetworkConnection::connect_to_server);
ClassDB::bind_method(D_METHOD("put_command"), &NetworkConnection::put_command);
ClassDB::bind_method(D_METHOD("get_server_messages"), &NetworkConnection::get_server_messages); ClassDB::bind_method(D_METHOD("get_server_messages"), &NetworkConnection::get_server_messages);
ClassDB::bind_method(D_METHOD("get_server_tick"), &NetworkConnection::get_server_tick); ClassDB::bind_method(D_METHOD("get_server_tick"), &NetworkConnection::get_server_tick);
ClassDB::bind_method(D_METHOD("terminate_network_connection"), &NetworkConnection::terminate_network_connection); ClassDB::bind_method(D_METHOD("terminate_network_connection"), &NetworkConnection::terminate_network_connection);
@ -92,6 +93,11 @@ MessageDescriptionNode & NetworkConnection::get_master_message_description_node(
} }
*/ */
void NetworkConnection::put_command(Variant command)
{
NetworkConnectionCore::get_singleton()->put_command(command);
}
Variant NetworkConnection::get_server_messages() Variant NetworkConnection::get_server_messages()
{ {
return NetworkConnectionCore::get_singleton()->get_server_messages(); return NetworkConnectionCore::get_singleton()->get_server_messages();

View file

@ -45,6 +45,8 @@ public:
void process(int delta); void process(int delta);
int get_state(); int get_state();
void put_command(Variant command);
Variant get_server_messages(); Variant get_server_messages();
Variant get_server_tick(); Variant get_server_tick();

View file

@ -23,6 +23,7 @@
#include "check_memory.h" #include "check_memory.h"
#include "network_connection_core.h" #include "network_connection_core.h"
#include "modules/action/action_factory.h"
#include "modules/debug/debug.h" #include "modules/debug/debug.h"
NetworkConnectionCore *NetworkConnectionCore::singleton = nullptr; NetworkConnectionCore *NetworkConnectionCore::singleton = nullptr;
@ -200,6 +201,11 @@ void NetworkConnectionCore::process(int delta)
this->_state_connexion->send_message(); this->_state_connexion->send_message();
} }
void NetworkConnectionCore::put_command(Variant command)
{
_network_data._command_to_send.append(command);
}
Variant NetworkConnectionCore::get_server_messages() Variant NetworkConnectionCore::get_server_messages()
{ {
return _network_data._server_messages; return _network_data._server_messages;
@ -223,6 +229,7 @@ void NetworkConnectionCore::terminate_connexion()
if ( NetworkConnectionCore::singleton == nullptr ) if ( NetworkConnectionCore::singleton == nullptr )
return; return;
DBG_PRINT("Terminate network connexion .."); DBG_PRINT("Terminate network connexion ..");
ActionFactory::clear_all_block(& NetworkConnectionCore::get_singleton()->_network_data);
delete NetworkConnectionCore::singleton; delete NetworkConnectionCore::singleton;
NetworkConnectionCore::singleton = nullptr; NetworkConnectionCore::singleton = nullptr;
} }

View file

@ -91,6 +91,8 @@ public:
void process(int delta); void process(int delta);
bool connected(); bool connected();
void put_command(Variant command);
Variant get_server_messages(); Variant get_server_messages();
Variant get_server_tick(); Variant get_server_tick();

View file

@ -50,6 +50,8 @@ void NetworkData::initialize()
this->_client_sync = 0; this->_client_sync = 0;
this->_current_send_number = 0; this->_current_send_number = 0;
this->_impulse_multi_part_number = 0;
} }
void NetworkData::reset_last_ack() void NetworkData::reset_last_ack()

View file

@ -26,7 +26,7 @@
#include "core/reference.h" #include "core/reference.h"
#include "modules/bitset/bitset.h" #include "modules/bitset/bitset.h"
#include "core/ustring.h" #include "core/ustring.h"
//#include "core/dictionary.h" #include "core/dictionary.h"
#include "core/array.h" #include "core/array.h"
//define MAX_LOOP_READ_BY_STEP 10 //define MAX_LOOP_READ_BY_STEP 10
@ -73,9 +73,16 @@ public:
uint32_t _last_ack_1[2]; uint32_t _last_ack_1[2];
uint32_t _last_ack_2[4]; uint32_t _last_ack_2[4];
//Dictionary _server_messages; Array _server_messages; // Array contains all messages we received (from server)
Array _server_messages;
// Manage GENERIC_MULTI_PART_CODE
Dictionary _block;
Dictionary _block_used; // true if we red this block
//
Array _client_messages; // Array contains all messages we will send
Array _command_to_send; // Array all command to send (all data will be send to _client_messages)
uint8_t _impulse_multi_part_number;
NetworkData(); NetworkData();
~NetworkData(); ~NetworkData();

View file

@ -103,24 +103,27 @@ void StateConnectionNotInitialized::connect_to_server()
*/ */
void StateConnectionLogin::send_system_quit() void StateConnectionLogin::send_system_quit()
{ {
DBG_PRINT("send quit to server"); DBG_PRINT("send quit to server msg:" + itos(this->_data->_current_send_number));
BitStream msgout; BitStream msgout;
msgout.put_uint32(this->_data->_current_received_number); msgout.put_uint32(this->_data->_current_send_number);
msgout.put_bool(true); msgout.put_bool(true);
msgout.put_uint8(CLFECOMMON::SYSTEM_QUIT_CODE); msgout.put_uint8(CLFECOMMON::SYSTEM_QUIT_CODE);
msgout.put_sint32(this->_data->_quit_id); msgout.put_sint32(this->_data->_quit_id);
DBG_PRINT("Send msg:" + itos(this->_data->_current_send_number) + " - " + msgout.show_detail());
if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK ) if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK )
{ {
ERR_PRINT("Error to send disconnect"); ERR_PRINT("Error to send disconnect");
} }
this->_network->_state_connexion = & this->_network->_state_quit; this->_network->_state_connexion = & this->_network->_state_quit;
this->_data->_current_send_number ++;
} }
void StateConnectionLogin::send_message() void StateConnectionLogin::send_message()
{ {
BitStream msgout; BitStream msgout;
msgout.put_uint32(this->_data->_current_received_number); DBG_PRINT("Send quit to server msg:" + itos(this->_data->_current_send_number));
msgout.put_uint32(this->_data->_current_send_number);
msgout.put_bool(true); msgout.put_bool(true);
msgout.put_uint8(CLFECOMMON::SYSTEM_LOGIN_CODE); msgout.put_uint8(CLFECOMMON::SYSTEM_LOGIN_CODE);
msgout.put_string_hexa32(this->_data->_user_addr); msgout.put_string_hexa32(this->_data->_user_addr);
@ -128,6 +131,7 @@ void StateConnectionLogin::send_message()
msgout.put_string_hexa32(this->_data->_user_id); msgout.put_string_hexa32(this->_data->_user_id);
msgout.put_string(this->_data->_lang); msgout.put_string(this->_data->_lang);
Error ret; Error ret;
DBG_PRINT("Send msg:" + itos(this->_data->_current_send_number) + " - " + msgout.show_detail());
ret = this->_network->_socketUDP->put_packet_buffer(msgout.get_data()); // , msgout.get_data().size() ret = this->_network->_socketUDP->put_packet_buffer(msgout.get_data()); // , msgout.get_data().size()
if ( ret != Error::OK) if ( ret != Error::OK)
{ {
@ -143,6 +147,7 @@ void StateConnectionLogin::send_message()
} }
DBG_PRINT("Connected to khganat"); DBG_PRINT("Connected to khganat");
this->_network->_state_connexion = & this->_network->_state_synchronize; this->_network->_state_connexion = & this->_network->_state_synchronize;
this->_data->_current_send_number ++;
} }
/* /*
@ -151,32 +156,35 @@ void StateConnectionLogin::send_message()
void StateConnectionSynchronize::send_system_quit() void StateConnectionSynchronize::send_system_quit()
{ {
DBG_PRINT("Send quit to server"); DBG_PRINT("Send quit to server msg:" + itos(this->_data->_current_send_number));
BitStream msgout; BitStream msgout;
msgout.put_uint32(this->_data->_current_received_number); msgout.put_uint32(this->_data->_current_send_number);
msgout.put_bool(true); msgout.put_bool(true);
msgout.put_uint8(CLFECOMMON::SYSTEM_QUIT_CODE); msgout.put_uint8(CLFECOMMON::SYSTEM_QUIT_CODE);
msgout.put_sint32(this->_data->_quit_id); msgout.put_sint32(this->_data->_quit_id);
DBG_PRINT("Send msg:" + itos(this->_data->_current_send_number) + " - " + msgout.show_detail());
if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK ) if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK )
{ {
ERR_PRINT("Error to send quit"); ERR_PRINT("Error to send quit");
} }
this->_network->_state_connexion = & this->_network->_state_quit; this->_network->_state_connexion = & this->_network->_state_quit;
this->_data->_current_send_number ++;
} }
void StateConnectionSynchronize::send_system_ack_sync() void StateConnectionSynchronize::send_system_ack_sync()
{ {
DBG_PRINT("Send system ACK Sync to server"); DBG_PRINT("Send system ACK Sync to server msg:" + itos(this->_data->_current_send_number));
Ref<BitStream> msgout; Ref<BitStream> msgout;
msgout.instance(); msgout.instance();
msgout->put_uint32(this->_data->_current_received_number); msgout->put_uint32(this->_data->_current_send_number);
msgout->put_bool(true); msgout->put_bool(true);
msgout->put_uint8(CLFECOMMON::SYSTEM_ACK_SYNC_CODE); msgout->put_uint8(CLFECOMMON::SYSTEM_ACK_SYNC_CODE);
msgout->put_sint32(this->_data->_last_received_number); msgout->put_sint32(this->_data->_last_received_number);
msgout->put_sint32(this->_data->_last_ack_in_long_ack); msgout->put_sint32(this->_data->_last_ack_in_long_ack);
this->_data->_long_ack_bit_field.write_serial(msgout); this->_data->_long_ack_bit_field.write_serial(msgout);
msgout->put_sint32(this->_data->_server_sync); msgout->put_sint32(this->_data->_server_sync);
DBG_PRINT("Send msg:" + itos(this->_data->_current_send_number) + " - " + msgout->show_detail());
if (this->_network->_socketUDP->put_packet_buffer(msgout->get_data()) != Error::OK) if (this->_network->_socketUDP->put_packet_buffer(msgout->get_data()) != Error::OK)
{ {
ERR_PRINT("Error to send ack sync"); ERR_PRINT("Error to send ack sync");
@ -185,6 +193,7 @@ void StateConnectionSynchronize::send_system_ack_sync()
msgout.unref(); msgout.unref();
this->_data->_client_sync = this->_data->_server_sync; this->_data->_client_sync = this->_data->_server_sync;
this->_network->_state_connexion = & this->_network->_state_connected; this->_network->_state_connexion = & this->_network->_state_connected;
this->_data->_current_send_number ++;
} }
void StateConnectionSynchronize::receive_system_sync(Ref<BitStream> msgin) void StateConnectionSynchronize::receive_system_sync(Ref<BitStream> msgin)
@ -289,29 +298,32 @@ void StateConnectionSynchronize::send_message()
void StateConnectionConnected::send_system_quit() void StateConnectionConnected::send_system_quit()
{ {
DBG_PRINT("Send quit to server"); DBG_PRINT("Send quit to server msg:" + itos(this->_data->_current_send_number));
BitStream msgout; BitStream msgout;
msgout.put_uint32(this->_data->_current_received_number); msgout.put_uint32(this->_data->_current_send_number);
msgout.put_bool(true); msgout.put_bool(true);
msgout.put_uint8(CLFECOMMON::SYSTEM_QUIT_CODE); msgout.put_uint8(CLFECOMMON::SYSTEM_QUIT_CODE);
msgout.put_sint32(this->_data->_quit_id); msgout.put_sint32(this->_data->_quit_id);
DBG_PRINT("Send msg:" + itos(this->_data->_current_send_number) + " - " + msgout.show_detail());
if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK ) if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK )
{ {
ERR_PRINT("Error to send disconnect"); ERR_PRINT("Error to send disconnect");
} }
this->_network->_state_connexion = & this->_network->_state_quit; this->_network->_state_connexion = & this->_network->_state_quit;
this->_data->_current_send_number ++;
} }
void StateConnectionConnected::send_system_disconnect() void StateConnectionConnected::send_system_disconnect()
{ {
//if ( this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize ) return; //if ( this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize ) return;
DBG_PRINT("Send disconnect to server"); DBG_PRINT("Send disconnect to server msg:" + itos(this->_data->_current_send_number));
BitStream msgout; BitStream msgout;
msgout.put_uint32(this->_data->_current_received_number); msgout.put_uint32(this->_data->_current_send_number);
msgout.put_bool(true); msgout.put_bool(true);
msgout.put_uint8(CLFECOMMON::SYSTEM_DISCONNECTION_CODE); msgout.put_uint8(CLFECOMMON::SYSTEM_DISCONNECTION_CODE);
DBG_PRINT("Send msg:" + itos(this->_data->_current_send_number) + " - " + msgout.show_detail());
if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK ) if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK )
{ {
ERR_PRINT("Error to send disconnect"); ERR_PRINT("Error to send disconnect");
@ -319,15 +331,15 @@ void StateConnectionConnected::send_system_disconnect()
this->_network->_socketUDP->close(); this->_network->_socketUDP->close();
// this->_state = STATE::Disconnect; // this->_state = STATE::Disconnect;
this->_network->_state_connexion = & this->_network->_state_not_initialized; this->_network->_state_connexion = & this->_network->_state_not_initialized;
this->_data->_current_send_number ++;
} }
void StateConnectionConnected::send_system_ack_sync() void StateConnectionConnected::send_system_ack_sync()
{ {
DBG_PRINT("Send system ACK Sync to server"); DBG_PRINT("Send system ACK Sync to server msg:" + itos(this->_data->_current_send_number));
Ref<BitStream> msgout; Ref<BitStream> msgout;
msgout.instance(); msgout.instance();
msgout->put_uint32(this->_data->_current_received_number); msgout->put_uint32(this->_data->_current_send_number);
msgout->put_bool(true); msgout->put_bool(true);
msgout->put_uint8(CLFECOMMON::SYSTEM_ACK_SYNC_CODE); msgout->put_uint8(CLFECOMMON::SYSTEM_ACK_SYNC_CODE);
msgout->put_sint32(this->_data->_last_received_number); msgout->put_sint32(this->_data->_last_received_number);
@ -341,16 +353,17 @@ void StateConnectionConnected::send_system_ack_sync()
} }
msgout.unref(); msgout.unref();
this->_data->_client_sync = this->_data->_server_sync; this->_data->_client_sync = this->_data->_server_sync;
this->_data->_current_send_number ++;
} }
void StateConnectionConnected::send_system_ack_probe() void StateConnectionConnected::send_system_ack_probe()
{ {
// khanat-opennel-code/code/ryzom/server/src/frontend_service/fe_receive_sub.cpp:1121 void CFeReceiveSub::handleReceivedMsg( CClientHost *clienthost ) // khanat-opennel-code/code/ryzom/server/src/frontend_service/fe_receive_sub.cpp:1121 void CFeReceiveSub::handleReceivedMsg( CClientHost *clienthost )
DBG_PRINT("Send system ACK PROBE to server"); DBG_PRINT("Send system ACK PROBE to server msg:" + itos(this->_data->_current_send_number));
int max = this->_data->_latest_probes.size() ; int max = this->_data->_latest_probes.size() ;
BitStream msgout; BitStream msgout;
msgout.put_uint32(this->_data->_current_received_number); msgout.put_uint32(this->_data->_current_send_number);
msgout.put_bool(true); msgout.put_bool(true);
msgout.put_uint8(CLFECOMMON::SYSTEM_ACK_PROBE_CODE); msgout.put_uint8(CLFECOMMON::SYSTEM_ACK_PROBE_CODE);
msgout.put_sint32(max); msgout.put_sint32(max);
@ -359,31 +372,62 @@ void StateConnectionConnected::send_system_ack_probe()
int data = this->_data->_latest_probes[i]; int data = this->_data->_latest_probes[i];
msgout.put_sint32(data); msgout.put_sint32(data);
} }
DBG_PRINT("Send msg:" + itos(this->_data->_current_send_number) + " - " + msgout.show_detail());
if (this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK) if (this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK)
{ {
ERR_PRINT("Error to send disconnect"); ERR_PRINT("Error to send disconnect");
return; return;
} }
this->_data->_latest_probes.clear(); this->_data->_latest_probes.clear();
this->_data->_current_send_number ++;
} }
void StateConnectionConnected::send_system_ask_tick() void StateConnectionConnected::send_normal_message()
{ {
// khanat-opennel-code/code/ryzom/client/src/network_connection.cpp # void CNetworkConnection::sendNormalMessage() // khanat-opennel-code/code/ryzom/client/src/network_connection.cpp # void CNetworkConnection::sendNormalMessage()
DBG_PRINT("Send system ACK TICK"); DBG_PRINT("Send Normal Message msg:" + itos(this->_data->_current_send_number));
BitStream msgout; BitStream msgout;
msgout.put_uint32(this->_data->_current_received_number); msgout.put_uint32(this->_data->_current_send_number);
DBG_PRINT("msgout A:" + msgout.show_detail());
msgout.put_bool(false); msgout.put_bool(false);
DBG_PRINT("msgout B:" + msgout.show_detail());
msgout.put_uint32(this->_data->_last_received_number); msgout.put_uint32(this->_data->_last_received_number);
DBG_PRINT("msgout C:" + msgout.show_detail());
msgout.put_uint32(this->_data->_ack_bit_mask); msgout.put_uint32(this->_data->_ack_bit_mask);
DBG_PRINT("current_received_number:" + itos(this->_data->_current_received_number) + " last_received_number:" + itos(this->_data->_last_received_number) + " ack_bit_mask:" + itos(this->_data->_ack_bit_mask)); DBG_PRINT("msgout D:" + msgout.show_detail());
/*
msgout.pushUint32(self.Cycle) // cycle = self._CurrentServerTick
numberActions = len(self.Actions)
msgout.pushUint8(numberActions)
*/
while( this->_data->_client_messages.size() > 0 )
{
DBG_PRINT("Send message");
msgout.put_uint32(this->_data->_current_server_tick);
DBG_PRINT("msgout E:" + msgout.show_detail());
msgout.put_uint8(1);
DBG_PRINT("msgout F:" + msgout.show_detail());
Ref<BitStream> tmp = this->_data->_client_messages.pop_front(); // PoolByteArray tmp = this->_data->_client_messages.pop_front();
//msgout.put_array_uint8(tmp); // TODO - Erreur de copie (changer le type)
msgout.put_bitstream(tmp.ptr()); /// ERREUR COPIE
DBG_PRINT("Send message " + msgout.show_detail());
if ( msgout.number_bit_not_read() > 3840 ) // 3840 = 480*8
break;
// break; // TODO - a supprimer pour l'instant on envoie qu'un paquet
}
DBG_PRINT("msgout G:" + msgout.show_detail());
DBG_PRINT("Send msg:" + itos(this->_data->_current_send_number) + " - " + msgout.show_detail());
DBG_PRINT("current_received_number:" + itos(this->_data->_current_send_number) + " last_received_number:" + itos(this->_data->_last_received_number) + " ack_bit_mask:" + itos(this->_data->_ack_bit_mask));
if (this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK) if (this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK)
{ {
ERR_PRINT("Error to send disconnect"); ERR_PRINT("Error to send disconnect");
return; return;
} }
this->_data->_recieved_new_server_tick = false; this->_data->_recieved_new_server_tick = false;
this->_data->_current_send_number ++;
} }
void StateConnectionConnected::receive_system_sync(Ref<BitStream> msgin) void StateConnectionConnected::receive_system_sync(Ref<BitStream> msgin)
@ -500,12 +544,15 @@ void StateConnectionConnected::receive_message(int index)
void StateConnectionConnected::send_message() void StateConnectionConnected::send_message()
{ {
ActionFactory::pack(this->_data);
if ( this->_data->_server_sync != this->_data->_client_sync ) if ( this->_data->_server_sync != this->_data->_client_sync )
this->send_system_ack_sync(); this->send_system_ack_sync();
else if (this->_data->_latest_probes.size() != 0 ) else if (this->_data->_latest_probes.size() != 0 )
this->send_system_ack_probe(); this->send_system_ack_probe();
else if (this->_data->_recieved_new_server_tick == true) else if (this->_data->_recieved_new_server_tick == true)
this->send_system_ask_tick(); this->send_normal_message();
//else if (this->_data->_client_messages.size() > 0)
/// this->send_normal_message();
} }
/* /*
* *

View file

@ -26,6 +26,7 @@
#include "modules/bitset/bitset.h" #include "modules/bitset/bitset.h"
#include "modules/bitstreamqueue/bitstreamqueue.h" #include "modules/bitstreamqueue/bitstreamqueue.h"
#include "network_data.h" #include "network_data.h"
#include "modules/action/action.h"
#define MAX_SIZE_BIT_STREAM_QUEUE 10 #define MAX_SIZE_BIT_STREAM_QUEUE 10
//define NUM_BITS_IN_LONG_ACK 512 //define NUM_BITS_IN_LONG_ACK 512
@ -58,21 +59,6 @@ enum CLFECOMMON {
NUMBITSINLONGACK = 512 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; class NetworkConnectionCore;
// Virtual class reference for network state // Virtual class reference for network state
@ -142,7 +128,7 @@ public:
void send_system_disconnect(); void send_system_disconnect();
void send_system_ack_sync(); void send_system_ack_sync();
void send_system_ack_probe(); void send_system_ack_probe();
void send_system_ask_tick(); void send_normal_message();
void receive_system_sync(Ref<BitStream> msgin); void receive_system_sync(Ref<BitStream> msgin);
void receive_message(int index); void receive_message(int index);
void send_message(); void send_message();

View file

@ -21,6 +21,7 @@
#include "referentialmessage.h" #include "referentialmessage.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "modules/impulse/impulsebase.h"
void ReferentialMessage::_bind_methods() void ReferentialMessage::_bind_methods()
{ {
@ -46,6 +47,11 @@ int ReferentialMessage::read_command(Ref<BitStream> msgin)
return ReferentialMessageCore::get_singleton()->read_command(msgin); return ReferentialMessageCore::get_singleton()->read_command(msgin);
} }
void ReferentialMessage::write_command(ImpulseBase::Impulse command, Ref<BitStream> msgout)
{
ReferentialMessageCore::get_singleton()->write_command(command, msgout);
}
void ReferentialMessage::clear_session() void ReferentialMessage::clear_session()
{ {
ReferentialMessageCore::clear_session(); ReferentialMessageCore::clear_session();

View file

@ -25,6 +25,7 @@
//#include "core/dictionary.h" //#include "core/dictionary.h"
//#include "modules/bitstream/bitstream.h" //#include "modules/bitstream/bitstream.h"
#include "modules/referentialmessage/referentialmessagecore.h" #include "modules/referentialmessage/referentialmessagecore.h"
#include "modules/impulse/impulsebase.h"
class ReferentialMessage : public Reference { class ReferentialMessage : public Reference {
GDCLASS(ReferentialMessage, Reference) GDCLASS(ReferentialMessage, Reference)
@ -38,7 +39,9 @@ public:
void _init() {}; void _init() {};
void read_referential(Dictionary dictionary_message); void read_referential(Dictionary dictionary_message);
void show(); void show();
int read_command(Ref<BitStream> msgin); int read_command(Ref<BitStream> msgin);
void write_command(ImpulseBase::Impulse command, Ref<BitStream> msgout);
void clear_session(); void clear_session();
}; };

View file

@ -170,3 +170,15 @@ int ReferentialMessageCore::read_command(Ref<BitStream> msgin)
{ {
return _decoder->read_command(msgin); return _decoder->read_command(msgin);
} }
void ReferentialMessageCore::write_command(ImpulseBase::Impulse command, Ref<BitStream> msgout)
{
#ifdef DEBUG_ENABLED
if ( command >= ImpulseBase::Impulse::__LAST_ELEMENT )
{
ERR_PRINT("Out of range (" + itos(command) + " / " + itos(ImpulseBase::Impulse::__LAST_ELEMENT) + ")");
throw "Out of range";
}
#endif
msgout->put_bitstream(_encoder[command]);
}

View file

@ -100,6 +100,7 @@ public:
static void clear_session(); static void clear_session();
int read_command(Ref<BitStream> msgin); int read_command(Ref<BitStream> msgin);
void write_command(ImpulseBase::Impulse command, Ref<BitStream> msgout);
}; };
#endif #endif

View file

@ -8,9 +8,14 @@
config_version=4 config_version=4
_global_script_classes=[ ] _global_script_classes=[ {
"base": "Reference",
"class": "string_manager",
"language": "GDScript",
"path": "res://assets/Scripts/Config/string_manager.gd"
} ]
_global_script_class_icons={ _global_script_class_icons={
"string_manager": ""
} }
[application] [application]

View file

@ -4,87 +4,87 @@ signal return_pressed
signal font_changed( value ) signal font_changed( value )
func _ready(): func _ready():
$Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Fullscreen/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/fullscreen" ) $Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Fullscreen/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/fullscreen" )
$Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Borderless/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/borderless" ) $Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Borderless/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/borderless" )
$Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Resizable/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/resizable" ) $Menus/TabContainer/Display/ScrollContainer/VBoxContainer/Resizable/CheckBox.pressed = ProjectSettings.get_setting( "display/window/size/resizable" )
$Menus/TabContainer/Display/ScrollContainer/VBoxContainer/CurrentScreen/SpinBox.value = OS.current_screen $Menus/TabContainer/Display/ScrollContainer/VBoxContainer/CurrentScreen/SpinBox.value = OS.current_screen
load_settings() load_settings()
func _on_font_size_bar_value_changed(value): func _on_font_size_bar_value_changed(value):
$Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size/font_size_value.text = str( value ) $Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size/font_size_value.text = str( value )
$Menus.get_theme().default_font.size = value $Menus.get_theme().default_font.size = value
emit_signal( "font_changed", value ) emit_signal( "font_changed", value )
func load_settings(): func load_settings():
var config_file = ConfigFile.new() var config_file = ConfigFile.new()
var err = config_file.load( "user://settings.cfg" ) var err = config_file.load( "user://settings.cfg" )
if err == ERR_CANT_OPEN or err == ERR_FILE_NOT_FOUND: if err == ERR_CANT_OPEN or err == ERR_FILE_NOT_FOUND:
# On suppose que le fichier n'existe pas encore, donc on le crée. # On suppose que le fichier n'existe pas encore, donc on le crée.
config_file.set_value( "theme", "font_size", 14 ) config_file.set_value( "theme", "font_size", 14 )
config_file.save( "user://settings.cfg" ) config_file.save( "user://settings.cfg" )
elif not err == OK: elif not err == OK:
print("[res://scenes/GUI/Settings/Settings.gd:load_settings] Error code when loading config file: ", err) print("[res://scenes/GUI/Settings/Settings.gd:load_settings] Error code when loading config file: ", err)
global.font_size = config_file.get_value( "theme", "font_size" ) global.font_size = config_file.get_value( "theme", "font_size" )
if $Menus.get_theme(): if $Menus.get_theme():
$Menus.get_theme().default_font.size = global.font_size $Menus.get_theme().default_font.size = global.font_size
$Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size_bar.value = global.font_size $Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size_bar.value = global.font_size
$Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size/font_size_value.text = str( global.font_size ) $Menus/TabContainer/Test/ScrollContainer/VBoxContainer/font_size/font_size_value.text = str( global.font_size )
func _on_ReturnButton_pressed(): func _on_ReturnButton_pressed():
var config_file = ConfigFile.new() var config_file = ConfigFile.new()
var err = config_file.load( "user://settings.cfg" ) var err = config_file.load( "user://settings.cfg" )
if err: if err:
print("[res://scenes/GUI/Settings/Settings.gd:_on_ReturnButton_pressed] Error code when loading config file: ", err) print("[res://scenes/GUI/Settings/Settings.gd:_on_ReturnButton_pressed] Error code when loading config file: ", err)
config_file.set_value("theme", "font_size", $Menus.get_theme().default_font.size) config_file.set_value("theme", "font_size", $Menus.get_theme().default_font.size)
config_file.save( "user://settings.cfg" ) config_file.save( "user://settings.cfg" )
emit_signal( "return_pressed" ) emit_signal( "return_pressed" )
func _on_Title_text_changed(new_text): func _on_Title_text_changed(new_text):
# ---------------------------------- # ----------------------------------
# Changing windows title # Changing windows title
var new_title = "Khanat" var new_title = "Khanat"
new_text = new_text.strip_edges() new_text = new_text.strip_edges()
if not new_text == "": if not new_text == "":
new_title = new_text new_title = new_text
new_title += " (" + String(OS.get_window_size().x) + "x" + String(OS.get_window_size().y) + ")" new_title += " (" + String(OS.get_window_size().x) + "x" + String(OS.get_window_size().y) + ")"
OS.set_window_title( new_title ) OS.set_window_title( new_title )
# ---------------------------------- # ----------------------------------
func _on_Fullscreen_toggled(button_pressed): func _on_Fullscreen_toggled(button_pressed):
if ProjectSettings.has_setting( "display/window/size/fullscreen" ): if ProjectSettings.has_setting( "display/window/size/fullscreen" ):
ProjectSettings.set_setting("display/window/size/fullscreen", button_pressed) ProjectSettings.set_setting("display/window/size/fullscreen", button_pressed)
OS.window_fullscreen = ProjectSettings.get_setting("display/window/size/fullscreen") OS.window_fullscreen = ProjectSettings.get_setting("display/window/size/fullscreen")
func _on_Borderless_toggled(button_pressed): func _on_Borderless_toggled(button_pressed):
if ProjectSettings.has_setting( "display/window/size/borderless" ): if ProjectSettings.has_setting( "display/window/size/borderless" ):
ProjectSettings.set_setting("display/window/size/borderless", button_pressed) ProjectSettings.set_setting("display/window/size/borderless", button_pressed)
OS.window_borderless = ProjectSettings.get_setting("display/window/size/borderless") OS.window_borderless = ProjectSettings.get_setting("display/window/size/borderless")
func _on_Resizable_toggled(button_pressed): func _on_Resizable_toggled(button_pressed):
if ProjectSettings.has_setting( "display/window/size/resizable" ): if ProjectSettings.has_setting( "display/window/size/resizable" ):
ProjectSettings.set_setting("display/window/size/resizable", button_pressed) ProjectSettings.set_setting("display/window/size/resizable", button_pressed)
OS.window_resizable = ProjectSettings.get_setting("display/window/size/resizable") OS.window_resizable = ProjectSettings.get_setting("display/window/size/resizable")
# La fonction existe dans la doc mais le moteur lui ne la reconnait pas, # La fonction existe dans la doc mais le moteur lui ne la reconnait pas,
# soit il y a une subtilité quelquepart soit la doc n'est pas à jour. # soit il y a une subtilité quelquepart soit la doc n'est pas à jour.
func _on_AlwaysOnTop_toggled(button_pressed): func _on_AlwaysOnTop_toggled(button_pressed):
# OS.set_window_always_on_top( button_pressed ) # OS.set_window_always_on_top( button_pressed )
pass pass
func _on_SpinBox_value_changed(value): func _on_SpinBox_value_changed(value):
OS.current_screen = value OS.current_screen = value
func _on_FluteButton_pressed(): func _on_FluteButton_pressed():
pass # Replace with function body. pass # Replace with function body.

View file

@ -89,7 +89,6 @@ custom_styles/tab_bg = SubResource( 5 )
custom_styles/panel = SubResource( 6 ) custom_styles/panel = SubResource( 6 )
[node name="Display" type="MarginContainer" parent="Menus/TabContainer"] [node name="Display" type="MarginContainer" parent="Menus/TabContainer"]
editor/display_folded = true
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
margin_top = 49.0 margin_top = 49.0
@ -112,7 +111,6 @@ size_flags_vertical = 2
custom_constants/separation = 8 custom_constants/separation = 8
[node name="Fullscreen" type="HBoxContainer" parent="Menus/TabContainer/Display/ScrollContainer/VBoxContainer"] [node name="Fullscreen" type="HBoxContainer" parent="Menus/TabContainer/Display/ScrollContainer/VBoxContainer"]
editor/display_folded = true
margin_right = 1196.0 margin_right = 1196.0
margin_bottom = 41.0 margin_bottom = 41.0
@ -150,7 +148,6 @@ margin_bottom = 41.0
size_flags_horizontal = 2 size_flags_horizontal = 2
[node name="Resizable" type="HBoxContainer" parent="Menus/TabContainer/Display/ScrollContainer/VBoxContainer"] [node name="Resizable" type="HBoxContainer" parent="Menus/TabContainer/Display/ScrollContainer/VBoxContainer"]
editor/display_folded = true
margin_top = 98.0 margin_top = 98.0
margin_right = 1196.0 margin_right = 1196.0
margin_bottom = 139.0 margin_bottom = 139.0
@ -278,7 +275,6 @@ margin_bottom = -1.0
hint_tooltip = "Interface." hint_tooltip = "Interface."
[node name="Header" type="HBoxContainer" parent="Menus/TabContainer/Controles/ScrollContainer/TabContainer/Interface"] [node name="Header" type="HBoxContainer" parent="Menus/TabContainer/Controles/ScrollContainer/TabContainer/Interface"]
editor/display_folded = true
margin_right = 1022.0 margin_right = 1022.0
margin_bottom = 38.0 margin_bottom = 38.0
@ -385,7 +381,6 @@ margin_right = -1.0
margin_bottom = -1.0 margin_bottom = -1.0
[node name="Header" type="HBoxContainer" parent="Menus/TabContainer/Controles/ScrollContainer/TabContainer/Deplacement"] [node name="Header" type="HBoxContainer" parent="Menus/TabContainer/Controles/ScrollContainer/TabContainer/Deplacement"]
editor/display_folded = true
margin_right = 1022.0 margin_right = 1022.0
margin_bottom = 37.0 margin_bottom = 37.0