extends Node class_name PlayerNetworkingComponent #@export var character_movement_component : NodePath #@onready var player_ref = get_node(character_movement_component) ## Refrence to character mesh, should be assigned to a [Node3D] that is a parent to the actual mesh (Skeleton3D) @export var mesh_ref : Node ## Refrence to a [RayCast3D] that should detect if character is on ground @export var ground_check : RayCast3D ## Reference to Object CharacterMovementComponent @export var character_movement_component : CharacterMovementComponent ## Reference Player @export var player_ref:CharacterBody3D #var sync_camera_h_transform : Transform3D #var sync_camera_v_transform : Transform3D #var sync_view_mode : Global.VIEW_MODE = Global.VIEW_MODE.THIRD_PERSON #var sync_CameraHOffset : float #var sync_position : Vector3: # set(value): # sync_position = value # processed_position = false #var sync_mesh_rotation : Vector3 #var sync_direction : Vector3 #var sync_input_is_moving : bool #var sync_gait : Global.GAIT = Global.GAIT.WALKING #var sync_rotation_mode : Global.ROTATION_MODE = Global.ROTATION_MODE.VELOCITY_DIRECTION #var sync_stance : Global.STANCE = Global.STANCE.STANDING #var sync_movement_state : Global.MOVEMENT_STATE = Global.MOVEMENT_STATE.GROUNDED #var sync_movement_action : Global.MOVEMENT_ACTION = Global.MOVEMENT_ACTION.NONE #var sync_velocity : Vector3 #var processed_position : bool var save_rot:Vector3 var tick:int = 0 var jump:Vector3 = Vector3(0.0, 0.0, 0.0) var tickjump: int = 0 @export var id:int = 0: get: return id set(value): id = value func _ready(): #$MultiplayerSynchronizer.set_multiplayer_authority(str(get_parent().name).to_int()) pass func set_id(value:int) -> void: id = value func is_local_authority() -> bool: if Multi.is_offline(): return true else: return id == Multi.get_id() #return str(get_parent().name).to_int() == Multi.get_id() # if multiplayer.multiplayer_peer is OfflineMultiplayerPeer: # return true # else: # return str(get_parent().name).to_int() == multiplayer.get_unique_id() #sync player on clients func _physics_process(_delta): return # if !is_local_authority(): # if not processed_position: # PlayerRef.character_node.position = sync_position # processed_position = true # PlayerRef.mesh_ref.rotation = sync_mesh_rotation # PlayerRef.input_direction = sync_direction # PlayerRef.gait = sync_gait # PlayerRef.stance = sync_stance # PlayerRef.rotation_mode = sync_rotation_mode # PlayerRef.camera_root.VObject.transform = sync_camera_v_transform # PlayerRef.camera_root.HObject.transform = sync_camera_h_transform # PlayerRef.camera_root.view_mode = sync_CameraHOffset # PlayerRef.camera_root.CameraHOffset = sync_CameraHOffset # PlayerRef.movement_state = sync_movement_state # PlayerRef.movement_action = sync_movement_action ## PlayerRef.velocity = sync_velocity # PlayerRef.input_is_moving = sync_input_is_moving # return # sync_position = PlayerRef.character_node.position # sync_mesh_rotation = PlayerRef.mesh_ref.rotation # sync_direction = PlayerRef.input_direction # sync_gait = PlayerRef.gait # sync_stance = PlayerRef.stance # sync_rotation_mode = PlayerRef.rotation_mode # sync_camera_h_transform = PlayerRef.camera_root.HObject.transform # sync_camera_v_transform = PlayerRef.camera_root.VObject.transform # sync_movement_state = PlayerRef.movement_state # sync_movement_action = PlayerRef.movement_action # sync_input_is_moving = PlayerRef.input_is_moving # sync_view_mode = PlayerRef.camera_root.view_mode # sync_CameraHOffset = PlayerRef.camera_root.CameraHOffset func get_my_position() -> Vector3: #return $SpringArm3D/Camera3D.get_global_position() return player_ref.get_global_position() func get_my_rotation() -> Vector3: return mesh_ref.get_global_rotation() func set_first_position_player(ctick:int, pos:Vector3, rot:Vector3): set_my_position(pos) set_my_rotation(rot) func update_player(ctick:int, pos:Vector3, rot:Vector3, extra:int, ctickjump:int, vel:Vector3): #print(tick, " - ", ctick) if tick != ctick: #set_my_rotation(rot) print("extra:", extra, " ctickjump:", ctickjump, " tickjump:", tickjump) if extra & 1: set_my_position_onlyground(pos) if tickjump == ctickjump: print("Already Jump") return tickjump = ctickjump - 1 character_movement_component.jump() print("Go Jump") elif tickjump == 0 or ground_check.is_colliding(): print("No Jump") tickjump = 0 set_my_position(pos) set_my_rotation(rot) else: #set_my_position_onlyground(pos) print("Always Jump") tick = ctick func set_my_position(pos:Vector3): player_ref.set_global_position(pos) func set_my_position_onlyground(pos:Vector3): var newpos:Vector3 = Vector3(pos.x, player_ref.get_global_position().y ,pos.z) player_ref.set_global_position(newpos) func set_my_rotation(rot:Vector3): save_rot = rot print("Update ->" + str(rot), " ", mesh_ref.get_global_rotation()) mesh_ref.set_global_rotation(rot) #$CharacterMovementComponent.input_direction = rot pass func is_jump() -> bool: return jump != Vector3( 0.0, 0.0, 0.0) func get_jump() -> Vector3: var ret:Vector3 = jump jump = Vector3(0.0, 0.0, 0.0) return ret func get_tickjump() -> int: return tickjump func get_comment() -> String: return "" func start_jump(vertical_velocity:Vector3): jump = vertical_velocity tickjump += 1