forked from interstellar_development/freeftf
		
	 812821b510
			
		
	
	
		812821b510
		
	
	
	
	
		
			
			This update to the code adds a fully working beast, which is randomly selected and can capture any of the other players.
		
			
				
	
	
		
			127 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
| ## 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 <https://www.gnu.org/licenses/>. 
 | |
| 
 | |
| 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 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
 | |
| 	print(beast)
 | |
| 	$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
 |