# Automatically Generated From Builtin CharacterBody Template extends CharacterBody3D class_name Player @export var SPEED = 5.0 @export var JUMP_VELOCITY = 4.5 var username: String = "" var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") # Set by camera child, switch to signals if becomes too spaghetti var movement_dir: Vector2 = Vector2.ZERO # Using signals to maintain a list of currently colliding players because it simplifies # Memory management substantially since nodes are not GC'd # Connected nodes are the colliding nodes signal is_bumping(src: Player) var _is_grounded := false signal is_grounded func _ready(): if username == "": username = "Player " + name func is_on_ground() -> bool: _is_grounded = false is_grounded.emit(self) var v := _is_grounded _is_grounded = false return v func _physics_process(delta): if not is_on_floor(): velocity.y -= gravity * delta if Input.is_action_just_pressed("ui_accept") and is_on_floor(): velocity.y = JUMP_VELOCITY if movement_dir: velocity.x = movement_dir.x * SPEED velocity.z = movement_dir.y * SPEED else: velocity.x = move_toward(velocity.x, 0, SPEED) velocity.z = move_toward(velocity.z, 0, SPEED) move_and_slide() var _first_bumper: Player = null func _bump_check(src: Player): if src._first_bumper == null: src._first_bumper = self func get_first_bumper() -> Player: _first_bumper = null is_bumping.emit(self) var player := _first_bumper _first_bumper = null return player func _on_tag_detection_area_entered(area): if not (area.get_parent() is Player): return var _other_player: Player = area.get_parent() if is_bumping.is_connected(_bump_check): return is_bumping.connect(_bump_check) func _on_tag_detection_area_exited(area): if not (area.get_parent() is Player): return var _other_player: Player = area.get_parent() if not is_bumping.is_connected(_bump_check): return is_bumping.disconnect(_bump_check) func _on_tag_detection_body_entered(body): if "grounded" in body: if not is_grounded.is_connected(body.grounded): is_grounded.connect(body.grounded) func _on_tag_detection_body_exited(body): if "grounded" in body: if is_grounded.is_connected(body.grounded): is_grounded.disconnect(body.grounded)