Skip to content

Commit 208c8dd

Browse files
committed
implementing states_udp and states_tcp
1 parent 163c016 commit 208c8dd

File tree

4 files changed

+137
-62
lines changed

4 files changed

+137
-62
lines changed

client/assets/net/server_to_client.gd

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,20 +55,36 @@ func free_player_on_client(id):
5555

5656

5757
@rpc("call_remote", "unreliable_ordered")
58-
func send_output_to_client_unreliable(output_json_string: String):
59-
var output: Dictionary = JSON.parse_string(output_json_string)
60-
var id = int(output["id"])
61-
var rotation = Vector3(str_to_var("Vector3" + output["rotation"]))
62-
get_node("/root/main/players/" + str(id) + "/" + str(id)).rotation = rotation
63-
var position = Vector3(str_to_var("Vector3" + output["position"]))
64-
get_node("/root/main/players/" + str(id) + "/" + str(id)).position = position
65-
var camera_arm_rotation = Vector3(str_to_var("Vector3" + output["camera_arm_rotation"]))
66-
get_node("/root/main/players/" + str(id) + "/" + str(id) + "/SpringArm3D").rotation = camera_arm_rotation
58+
func send_output_to_client_unreliable(states_udp_json_string: String):
59+
var states_udp: Dictionary = JSON.parse_string(states_udp_json_string)
60+
# print("udp_received: " + str(states_udp))
61+
for id in states_udp["player"]:
62+
var player = get_node("/root/main/players/" + id + "/" + id)
63+
if states_udp["player"][id].has("rotation"):
64+
player.rotation = Vector3(str_to_var("Vector3" + states_udp["player"][id]["rotation"]))
65+
if states_udp["player"][id].has("position"):
66+
player.position = Vector3(str_to_var("Vector3" + states_udp["player"][id]["position"]))
67+
if states_udp["player"][id].has("camera_arm_rotation"):
68+
player.camera_arm.rotation = Vector3(str_to_var("Vector3" + states_udp["player"][id]["camera_arm_rotation"]))
69+
70+
# var rotation = Vector3(str_to_var("Vector3" + output["rotation"]))
71+
# get_node("/root/main/players/" + str(id) + "/" + str(id)).rotation = rotation
72+
# var position = Vector3(str_to_var("Vector3" + output["position"]))
73+
# get_node("/root/main/players/" + str(id) + "/" + str(id)).position = position
74+
# var camera_arm_rotation = Vector3(str_to_var("Vector3" + output["camera_arm_rotation"]))
75+
# get_node("/root/main/players/" + str(id) + "/" + str(id) + "/SpringArm3D").rotation = camera_arm_rotation
6776

6877
@rpc("call_remote", "reliable")
69-
func send_output_to_client_reliable(output_json_string: String):
70-
var output: Dictionary = JSON.parse_string(output_json_string)
71-
var id = int(output["id"])
72-
var camera_arm_scale = Vector3(str_to_var("Vector3" + output["camera_arm_scale"]))
73-
# print("received scale: " + str(camera_arm_scale))
74-
get_node("/root/main/players/" + str(id) + "/" + str(id) + "/SpringArm3D").scale = camera_arm_scale
78+
func send_output_to_client_reliable(states_tcp_json_string: String):
79+
var states_tcp: Dictionary = JSON.parse_string(states_tcp_json_string)
80+
# print("tcp_received: " + str(states_tcp))
81+
for id in states_tcp["player"]:
82+
var player = get_node("/root/main/players/" + id + "/" + id)
83+
if states_tcp["player"][id].has("camera_arm_scale"):
84+
player.camera_arm.scale = Vector3(str_to_var("Vector3" + states_tcp["player"][id]["camera_arm_scale"]))
85+
86+
# var output: Dictionary = JSON.parse_string(output_json_string)
87+
# var id = int(output["id"])
88+
# var camera_arm_scale = Vector3(str_to_var("Vector3" + output["camera_arm_scale"]))
89+
## print("received scale: " + str(camera_arm_scale))
90+
# get_node("/root/main/players/" + str(id) + "/" + str(id) + "/SpringArm3D").scale = camera_arm_scale
Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
extends StaticBody3D
22

3-
var from_player : int
4-
var moving_cube_state : Array
3+
#var moving_cube_state : Array
4+
var vel = 0
5+
var length = 0.8
6+
var speed = 5
7+
var accel = 0.1
8+
var pos
59

6-
func _physics_process(_delta):
7-
# if category moving_cube doesnt exist in global_state add it
10+
func _ready():
11+
pass
12+
13+
func _process(delta):
14+
vel += delta * speed
15+
pos = cos(vel*length)
16+
position.x += pos
17+
18+
# moving_cube_state = [position]
19+
#
20+
# #if moving_cube doesnt exist add it to global_state
821
# if !get_node("/root/Main").global_state.has("moving_cube"):
922
# get_node("/root/Main").global_state["moving_cube"] = {}
1023
#
11-
# # add global moving_cube_state into vars
12-
# if get_node("/root/Main").global_state["moving_cube"].has(name):
13-
# moving_cube_state = get_node("/root/Main").global_state["moving_cube"][name]
14-
# position = moving_cube_state[0]
15-
pass
24+
# # add moving_cube_state to global_state
25+
# get_node("/root/Main").global_state["moving_cube"][name] = moving_cube_state

server/assets/net/net.gd

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@ var server: Dictionary = {
1919
var peer: ENetMultiplayerPeer
2020
var sv_tickrate: int = 66
2121
var sv_tickid: int
22-
var states: Array
22+
var states_tcp: Dictionary
23+
var states_udp: Dictionary
24+
25+
var cl_updaterate = float(20)
26+
var cl_updaterate_timer = 0.0
2327

2428
func _ready():
2529
#set server tickrate -> relevant for physics_process() function --> needed for interpolation
@@ -209,18 +213,29 @@ func print_net_info():
209213
print("****************************************")
210214

211215

212-
#func _physics_process(delta):
213-
# sv_tickid += 1
214-
# if states.is_empty() == false:
215-
# for p in get_node("/root/Main/Players").get_children():
216-
# if p.client_ready == true:
217-
# p.cl_updaterate_timer += delta
218-
# if p.cl_updaterate_timer >= 1.0/p.cl_updaterate:
219-
# p.cl_updaterate_timer = 0.0 #1.0/p.cl_updaterate
220-
# print(str(states))
216+
func _physics_process(delta):
217+
sv_tickid += 1
218+
if !states_udp.is_empty() or !states_tcp.is_empty():
219+
220+
for peer in get_node("/root/main/players").get_children():
221+
var p = peer.get_node(str(peer.name))
222+
if p.client_ready == true:
223+
# cl_updaterate_timer += delta
224+
# if cl_updaterate_timer >= 1.0/cl_updaterate:
225+
# cl_updaterate_timer = 0.0 #1.0/p.cl_updaterate
226+
# print(str(states_udp))
221227
## rpc_unreliable_id(int(p.get_name()), "update_states", states)
222228
# update_states_on_clients.rpc_id(int(str(p.name)), states)
223-
# states = []
229+
if !states_udp.is_empty():
230+
var states_udp_json_string: String = JSON.stringify(states_udp)
231+
print("udp: " + states_udp_json_string)
232+
$/root/main/net/server_to_client.send_output_to_client_unreliable.rpc_id(int(str(p.get_name())), states_udp_json_string)
233+
if !states_tcp.is_empty():
234+
var states_tcp_json_string: String = JSON.stringify(states_tcp)
235+
print("tcp: " + states_tcp_json_string)
236+
$/root/main/net/server_to_client.send_output_to_client_reliable.rpc_id(int(str(p.get_name())), states_tcp_json_string)
237+
states_udp = {}
238+
states_tcp = {}
224239

225240
#@rpc("unreliable_ordered")
226241
#func update_states_on_clients():

server/assets/player/player.gd

Lines changed: 61 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var player_name: String
66
var color: Color
77
var ip: String
88
var respawn_position: Vector3 = Vector3(randf_range(700.0, 705.0), 200.0, randf_range(5.0, 10.0))
9-
var oldpos: Transform3D
9+
var old_position: Vector3
1010
#Movement
1111
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
1212
var movement_speed: float = 5.0
@@ -16,6 +16,10 @@ var speed: float
1616
var jump_force: float = 6
1717
#Rotation
1818
var mouse_sensitivity: float = 4.0
19+
var old_rotation: Vector3
20+
var old_camera_arm_rotation
21+
#Zoom
22+
var old_camera_arm_scale
1923

2024
@onready var camera_arm = $"SpringArm3D"
2125
@onready var camera = camera_arm.get_node("Camera3D")
@@ -30,7 +34,7 @@ func _ready():
3034
func _physics_process(delta):
3135

3236
if client_ready == true:
33-
oldpos = global_transform
37+
# old_position = global_transform
3438

3539
#if u fall from map
3640
if position.y < -20:
@@ -89,33 +93,63 @@ func _physics_process(delta):
8993
velocity.z = move_toward(velocity.z, 0, speed)
9094
move_and_slide()
9195

92-
# output_udp
93-
var newpos = global_transform
94-
if newpos.origin.distance_to(oldpos.origin) >0.00001 or newpos.basis != oldpos.basis:
95-
oldpos=newpos
96-
for p in get_node("/root/main/players").get_children():
97-
if p.get_node(str(p.name)).client_ready == true:
98-
var output_udp: Dictionary = {
99-
"id": int(str(name)),
100-
"position": position,
101-
"rotation": rotation,
102-
"camera_arm_rotation": camera_arm.rotation}
103-
var output_udp_json_string: String = JSON.stringify(output_udp)
104-
$/root/main/net/server_to_client.send_output_to_client_unreliable.rpc_id(int(str(p.get_name())), output_udp_json_string)
105-
# print("send udp: " + str(output_udp_json_string))
96+
#UDP: add player_state_udp to states_udp
97+
var player_state_udp: Dictionary = {}
98+
if position.distance_to(old_position) >0.00001: # only add if changed enough
99+
old_position=position
100+
player_state_udp["position"] = position
101+
if rotation != old_rotation: # only add if changed
102+
old_rotation=rotation
103+
player_state_udp["rotation"] = rotation
104+
if camera_arm.rotation != old_camera_arm_rotation: # only add if changed
105+
old_camera_arm_rotation = camera_arm.rotation
106+
player_state_udp["camera_arm_rotation"] = camera_arm.rotation
107+
if !player_state_udp.is_empty(): # only add if not empty
108+
#if states_udp doesnt have player category add it to states_udp
109+
if !get_node("/root/main/net").states_udp.has("player"):
110+
get_node("/root/main/net").states_udp["player"] = {}
111+
# add player_state to states_udp
112+
get_node("/root/main/net").states_udp["player"][name] = player_state_udp
113+
114+
#TCP: add player_state_tcp to states_tcp
115+
var player_state_tcp: Dictionary = {}
116+
if camera_arm.scale != old_camera_arm_scale: # only add if changed
117+
old_camera_arm_scale=camera_arm.scale
118+
player_state_tcp["camera_arm_scale"] = camera_arm.scale
119+
if !player_state_tcp.is_empty(): # only add if not empty
120+
#if states_tcp doesnt have player category add it to states_udp
121+
if !get_node("/root/main/net").states_tcp.has("player"):
122+
get_node("/root/main/net").states_tcp["player"] = {}
123+
# add player_state to states_tcp
124+
get_node("/root/main/net").states_tcp["player"][name] = player_state_tcp
125+
126+
# # output_udp
127+
# var newpos = global_transform
128+
# if newpos.origin.distance_to(oldpos.origin) >0.00001 or newpos.basis != oldpos.basis:
129+
# oldpos=newpos
130+
# for p in get_node("/root/main/players").get_children():
131+
# if p.get_node(str(p.name)).client_ready == true:
132+
# var output_udp: Dictionary = {
133+
# "id": int(str(name)),
134+
# "position": position,
135+
# "rotation": rotation,
136+
# "camera_arm_rotation": camera_arm.rotation}
137+
# var output_udp_json_string: String = JSON.stringify(output_udp)
138+
# $/root/main/net/server_to_client.send_output_to_client_unreliable.rpc_id(int(str(p.get_name())), output_udp_json_string)
139+
## print("send udp: " + str(output_udp_json_string))
106140

107141
#output_tcp
108-
if $inputs.zoom != $inputs.old_zoom:
109-
$inputs.old_zoom = $inputs.zoom
110-
for p in get_node("/root/main/players").get_children():
111-
if p.get_node(str(p.name)).client_ready == true:
112-
# Network.update_remote_states(int(str(self.name)))
113-
var output_tcp: Dictionary = {
114-
"id": int(str(name)),
115-
"camera_arm_scale": camera_arm.scale}
116-
var output_tcp_json_string: String = JSON.stringify(output_tcp)
117-
$/root/main/net/server_to_client.send_output_to_client_reliable.rpc_id(int(str(p.get_name())), output_tcp_json_string)
118-
# print("send tcp: " + str(output_tcp_json_string))
142+
# if $inputs.zoom != $inputs.old_zoom:
143+
# $inputs.old_zoom = $inputs.zoom
144+
# for p in get_node("/root/main/players").get_children():
145+
# if p.get_node(str(p.name)).client_ready == true:
146+
## Network.update_remote_states(int(str(self.name)))
147+
# var output_tcp: Dictionary = {
148+
# "id": int(str(name)),
149+
# "camera_arm_scale": camera_arm.scale}
150+
# var output_tcp_json_string: String = JSON.stringify(output_tcp)
151+
# $/root/main/net/server_to_client.send_output_to_client_reliable.rpc_id(int(str(p.get_name())), output_tcp_json_string)
152+
## print("send tcp: " + str(output_tcp_json_string))
119153

120154
#Reset inputs (only some, $inputs.zoom should keep its value)
121155
$inputs.mouse_motion = Vector2()

0 commit comments

Comments
 (0)