Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extends KinematicBody
- const SPEED = 6
- const GRAVITY = 20
- var velocity = Vector3()
- var movedir = Vector3()
- onready var camera = $Camera
- var queue = []
- var time = 0
- var server_transform
- var server_queue = []
- var server_timestamp = 0
- func get_movedir():
- movedir = Vector3(0,0,0)
- movedir += camera.global_transform.basis.z * (-int(Input.is_action_pressed("up")) + int(Input.is_action_pressed("down")))
- movedir += camera.global_transform.basis.x * (-int(Input.is_action_pressed("left")) + int(Input.is_action_pressed("right")))
- movedir.y = 0
- movedir = movedir.normalized()
- func _physics_process(delta):
- # CLIENT
- if is_network_master():
- camera.current = true
- get_movedir()
- append_queue()
- move(movedir)
- rpc_unreliable_id(1, "send_input", movedir, time)
- if server_transform:
- global_transform.origin = global_transform.origin.linear_interpolate(server_transform, 0.2)
- while queue.size() > 0:
- if queue[0].timestamp >= server_timestamp:
- move(queue[0].movedir)
- queue.pop_front()
- # SERVER
- if get_tree().is_network_server():
- while server_queue.size() > 0:
- move(server_queue[0].movedir)
- server_queue.pop_front()
- rpc_unreliable("update_player", global_transform.origin)
- # send input from client to server
- remote func send_input(dir, timestamp):
- if timestamp > server_timestamp:
- server_timestamp = timestamp
- var new_input = {
- movedir = dir,
- timestamp = timestamp,
- }
- server_queue.append(new_input)
- # sends new transform from server to client
- remote func update_player(trans):
- server_transform = trans
- # basic move w/ no gravity
- func move(dir):
- dir *= SPEED
- velocity = move_and_slide(dir, Vector3(0,1,0))
- # add to client's queue
- func append_queue():
- time += 1
- var new_input = {
- movedir = movedir,
- timestamp = time,
- }
- queue.append(new_input)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement