## 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 var jump_velocity = 6 var speed = 10.0 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 caught_body var beast = false var mouse_locked = true var is_frozen = false var hp = 100 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 enabled: if not is_on_floor(): velocity.y -= gravity * delta if Input.is_action_just_pressed("jump") and is_on_floor(): if beast: speed -= 6 $jump_timeout.start() 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() if !npc: print(hp) Server.sync_player.rpc(name, position, rotation) if $cam_y/Camera3D.position.z == 0: $cam_y.position.y = 1 if mouse_locked: Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) else: Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) else: Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) $cam_y.position.y = 0 if Input.is_action_just_pressed("escape"): get_tree().change_scene_to_file("res://menus/main_menu.tscn") Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) Game.reset() Server.reset() if Input.is_action_just_pressed("mouse_lock"): mouse_locked = !mouse_locked 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 and !beast: 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(): beast = true speed += 1 position.y += 10 $cam_y/Camera3D.position.z = 0 $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): caught_body = target got_person = true $hammer_bag/CSGCylinder3D/CSGSphere3D.visible = true func lost_one(): got_person = false $hammer_bag/CSGCylinder3D/CSGSphere3D.visible = false func frozen(): $in_bag.visible = false is_frozen = true func unfreeze(): is_frozen = 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 func _on_show_fps_timeout(): print("FPS: "+str(Engine.get_frames_per_second())) func _on_jump_timeout_timeout(): speed += 6