## Copyright (C) 2024 Patrick_Pluto ## ## This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. ## ## This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License along with this program. If not, see . extends CharacterBody3D const SPEED = 5.0 const JUMP_VELOCITY = 4.5 var zoom = 0 var player_no var npc = false var enabled = false var caught = false var captured_by var position_pre var got_person = false var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") func _ready(): player_no = Game.players Game.players += 1 if Server.players_numbered[player_no] == multiplayer.get_unique_id(): enabled = true $cam_y/Camera3D.current = true else: npc = true func _physics_process(delta): if Input.is_action_just_pressed("escape"): get_tree().change_scene_to_file("res://menus/main_menu.tscn") Game.reset() Server.reset() if enabled: if not is_on_floor(): velocity.y -= gravity * delta if Input.is_action_just_pressed("jump") and is_on_floor(): velocity.y = JUMP_VELOCITY var input_dir = Input.get_vector("left", "right", "forwards", "backwards") var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() if direction: velocity.x = direction.x * SPEED velocity.z = direction.z * SPEED else: velocity.x = move_toward(velocity.x, 0, SPEED) velocity.z = move_toward(velocity.z, 0, SPEED) move_and_slide() Server.sync_player.rpc(name, position, rotation) if caught and !npc: Server.sync_player.rpc(name, position, rotation) func _input(event): if !npc: if event is InputEventMouseMotion and (Input.is_action_pressed("cam_look") or $cam_y/Camera3D.position.z == 0): var camera_rotation = event.relative * 0.01 if $cam_y.rotation.x <= 1.6 && camera_rotation.y <= 0: $cam_y.rotate(Vector3.RIGHT, -camera_rotation.y) elif $cam_y.rotation.x >= -1.6 && camera_rotation.y >= 0: $cam_y.rotate(Vector3.RIGHT, -camera_rotation.y) if $cam_y.rotation.x >= 1.6: $cam_y.rotation.x = 1.6 elif $cam_y.rotation.x <= -1.6: $cam_y.rotation.x = -1.6 rotate(Vector3.DOWN, camera_rotation.x) func _unhandled_input(event): if !npc: if event.is_action_pressed("zoom_in") && $cam_y/Camera3D.position.z > 0: zoom = -1 $cam_y/Camera3D.position.z += zoom elif event.is_action_pressed("zoom_out") && $cam_y/Camera3D.position.z <= 20: zoom = 1 $cam_y/Camera3D.position.z += zoom else: zoom = 0 func beast_init(): position.y += 10 $detect_hit.monitoring = true $detect_hit.monitorable = true $detect_hit/CollisionShape3D.disabled = false $hammer_bag.visible = true func _on_detect_hit_body_entered(body): if enabled and body is CharacterBody3D and !got_person: Server.player_hit.rpc(body.name, name) func captured(beast): if !npc: $in_bag.visible = true $time_in_bag.start() visible = false enabled = false caught = true captured_by = beast position_pre = position position = Vector3(10000, 10000, 10000) func got_one(target): got_person = true $hammer_bag/CSGCylinder3D/CSGSphere3D.visible = true func lost_one(): got_person = false $hammer_bag/CSGCylinder3D/CSGSphere3D.visible = false func _on_time_in_bag_timeout(): visible = true if !npc: enabled = true caught = false captured_by.lost_one() position = position_pre $in_bag.visible = false