summaryrefslogtreecommitdiff
path: root/scripts/characters/player_controller_new.gd
diff options
context:
space:
mode:
authorAnson Bridges <bridges.anson@gmail.com>2022-09-02 23:12:33 -0700
committerAnson Bridges <bridges.anson@gmail.com>2022-09-02 23:12:33 -0700
commit4d51178d32e07c070c61aa7567856bec7eda3639 (patch)
tree7ef4884dd2221340f9c1ed96bd0f52c761ae9fb0 /scripts/characters/player_controller_new.gd
parent0939d84e611f1c63fd5805339a2f777251fb1653 (diff)
hit/killsounds, swimming, main menu, fixed explosion physics
Diffstat (limited to 'scripts/characters/player_controller_new.gd')
-rw-r--r--scripts/characters/player_controller_new.gd81
1 files changed, 58 insertions, 23 deletions
diff --git a/scripts/characters/player_controller_new.gd b/scripts/characters/player_controller_new.gd
index 37f8562..9c8f4ee 100644
--- a/scripts/characters/player_controller_new.gd
+++ b/scripts/characters/player_controller_new.gd
@@ -18,11 +18,14 @@ var velocity := Vector3()
var direction := Vector3()
var move_axis := Vector2()
var floorspeed := Vector3()
+var jumping = false
onready var nav = $NavigationAgent
# Walk
const FLOOR_MAX_ANGLE: float = deg2rad(46.0)
-export(float) var jump_height = 400
+export(float) var jump_height = 400.0
+var in_water : bool = false
+var swim_speed : float = 400.0
# Control
var controlling_machine = false #whether character is riding/controlling something
@@ -46,9 +49,11 @@ func _ready() -> void:
world = get_tree().get_root().get_node("GAMEWORLD")
if is_player:
cam.current = true
+
$Head/Camera/UseRay.add_exception(self)
$Head/Camera/MeleeRay.add_exception(self)
- $Head/Camera/LongRay.add_exception(self)
+ $Head/Camera/UseRay.add_exception($AreaDetect)
+ $Head/Camera/MeleeRay.add_exception($AreaDetect)
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
cam.fov = FOV
@@ -66,7 +71,6 @@ remote func set_phys_transform(trfrm, lvel):
# Called every frame. 'delta' is the elapsed time since the previous frame
func _process(_delta: float) -> void:
-
if is_player and !world.is_chatting:
if Input.is_action_just_pressed("use"):
initiate_use()
@@ -78,6 +82,7 @@ func _process(_delta: float) -> void:
machine.attack2()
machine.direction_input(Input.get_action_strength("move_forward"),Input.get_action_strength("move_backward"), Input.get_action_strength("move_right"),Input.get_action_strength("move_left"), Input.get_action_strength("alt_right"),Input.get_action_strength("alt_left"))
else:
+ jumping = Input.get_action_strength("move_jump")
if Input.is_action_just_pressed("fire"):
weapon.attack1()
move_axis.x = Input.get_action_strength("move_forward") - Input.get_action_strength("move_backward")
@@ -93,28 +98,33 @@ func initiate_use():
cam.current = true
return
if $Head/Camera/UseRay.is_colliding():
- var type = $Head/Camera/UseRay.get_collider().name
- match type:
+ var area_c = $Head/Camera/UseRay.get_collider()
+ match area_c.name:
"SteerArea":
- controlling_machine = true
- machine = $Head/Camera/UseRay.get_collider().get_parent().take_control(self)
- var gt = global_transform.origin
- velocity = Vector3.ZERO
- global_transform.origin = gt
+ world.rpc_id(1, "_call_on_server", "_client_request_control_vehicle", {"id" : world.client_id, "machine" : area_c.get_parent().name})
+ #controlling_machine = true
+ #machine = $Head/Camera/UseRay.get_collider().get_parent().take_control(self)
+ #var gt = global_transform.origin
+ #velocity = Vector3.ZERO
+ #global_transform.origin = gt
+ "LadderArea":
+ pass
_:
pass
-remotesync func set_owner(owner_id):
+remotesync func set_net_owner(owner_id):
$Nametag.text = ""
set_network_master(owner_id)
if owner_id != 1:
$Nametag.text = world.players_info[owner_id][0]
if get_tree().get_network_unique_id() != 1:
if owner_id == world.client_id:
+ $Nametag.visible = false
world.player_char = self
is_player = true
cam.current = true
else:
+ $Nametag.visible = true
cam.current = false
is_player = false
world.get_node("HUD").update_characters()
@@ -123,7 +133,7 @@ func deselect_character():
if is_network_master():
world.player_char = null
world.get_node("DEFAULTCAM").current = true
- rpc("set_owner", 1)
+ rpc("set_net_owner", 1)
func regain_control(_gt):
controlling_machine = false
@@ -131,24 +141,30 @@ func regain_control(_gt):
# Called every physics tick. 'delta' is constant
func _physics_process(delta: float) -> void:
- walk(delta)
if is_network_master():
+ if !on_floor_test() and in_water:
+ swim(delta)
+ else:
+ walk(delta)
rpc("set_phys_transform", transform, linear_velocity)
+ is_on_floor = false #reset whether is on floor in between frames
-# called by signal when character is collided with
-func on_floor_test() -> void:
+# called each physics frame
+func on_floor_test() -> bool:
if $Feet.is_colliding():
is_on_floor = true
if $Feet.get_collider().has_method("get_linear_velocity"):
floorspeed = $Feet.get_collider().get_linear_velocity()
else:
floorspeed = Vector3.ZERO
- return
+ return true
if player_state:
for i in range(player_state.get_contact_count()):
var contact_angle_from_up : float = Vector3.UP.angle_to(player_state.get_contact_local_normal(i))
if contact_angle_from_up < FLOOR_MAX_ANGLE:
is_on_floor = true
+ return true
+ return false
#modify simulated physics results
func _integrate_forces(state) -> void:
@@ -167,7 +183,6 @@ func _input(event: InputEvent) -> void:
camera_rotation()
func walk(_delta:float) -> void:
- on_floor_test()
# Input
direction = Vector3()
var aim: Basis = head.get_global_transform().basis
@@ -181,7 +196,7 @@ func walk(_delta:float) -> void:
# Jump
if is_on_floor and is_player:
- if Input.is_action_just_pressed("move_jump"):
+ if jumping:
apply_central_impulse(Vector3.UP*jump_height)
#max walk speed
@@ -202,18 +217,36 @@ func walk(_delta:float) -> void:
elif _airspeed_cap - projVel > 0:
add_central_force (mass*Vector3(direction.x*_temp_accel, 0, direction.z*_temp_accel))
- is_on_floor = false #reset whether is on floor in between frames
+func swim(_delta):
+ #drag and buoyancy
+ add_central_force(Vector3.UP*weight*1.0)
+ add_central_force(-1*linear_velocity*75)
+ #controls
+ var dir: Basis = cam.get_global_transform().basis
+ var m_dir: Vector3 = -move_axis.x * dir.z + move_axis.y * dir.x
+ m_dir = m_dir.normalized()
+ add_central_force(swim_speed*m_dir)
+ if jumping:
+ add_central_force(Vector3.UP*weight*0.5)
+
+func enter_water():
+ in_water = true
+
+func exit_water():
+ in_water = false
remotesync func damage(dmg_amt, type, shooter, extra = ""):
health -= dmg_amt
if health <= 0 and is_network_master():
+ if shooter[0] != get_network_master(): world.rpc_id(shooter[0], "game_killsound")
if get_network_master() == 1:
- world._call_on_server("_character_death", {"killer" : shooter, "victim_mp_id" : get_network_master(), "victim" : name, "extra" : extra})
+ world._call_on_server("_character_death", {"killer_id" : shooter[0], "killer" : shooter[1], "victim_mp_id" : get_network_master(), "victim" : name, "extra" : extra})
else:
- world.rpc_id(1, "_call_on_server", "_character_death", {"killer" : shooter, "victim_mp_id" : get_network_master(), "victim" : name, "extra" : extra})
-
+ world.rpc_id(1, "_call_on_server", "_character_death", {"killer_id" : shooter[0], "killer" : shooter[1], "victim_mp_id" : get_network_master(), "victim" : name, "extra" : extra})
+ elif is_network_master():
+ if shooter[0] != get_network_master(): world.rpc_id(shooter[0], "game_hitsound")
-remotesync func remove_dead():
+remotesync func remove_dead_character():
deselect_character()
queue_free()
@@ -234,3 +267,5 @@ func camera_rotation() -> void:
temp_rot.x = clamp(temp_rot.x, -90, 90)
cam.rotation_degrees = temp_rot
+remotesync func net_apply_impulse(impulse_v):
+ apply_central_impulse(impulse_v)