diff options
| author | Anson Bridges <bridges.anson@gmail.com> | 2022-10-07 15:49:57 -0400 |
|---|---|---|
| committer | Anson Bridges <bridges.anson@gmail.com> | 2022-10-07 15:49:57 -0400 |
| commit | 7dbec964a375598d454e04719576eb6c469a5d7b (patch) | |
| tree | fa819e5e843ecdd88375ad1806ab43358b1ea670 /godot/scripts/characters/player_controller_new.gd | |
| parent | 62c33688cf2f48d7669790a89e3d1cdec16798be (diff) | |
ai work
Diffstat (limited to 'godot/scripts/characters/player_controller_new.gd')
| -rw-r--r-- | godot/scripts/characters/player_controller_new.gd | 134 |
1 files changed, 48 insertions, 86 deletions
diff --git a/godot/scripts/characters/player_controller_new.gd b/godot/scripts/characters/player_controller_new.gd index b1a8718..6e2a28b 100644 --- a/godot/scripts/characters/player_controller_new.gd +++ b/godot/scripts/characters/player_controller_new.gd @@ -1,18 +1,4 @@ -extends RigidBody - -# Game -export var team: String = "RED" -export var health: int = 100 -export var weapon_slot1: Resource = null -export var weapon_slot2: Resource = null -export var weapon_slot3: Resource = null -export var weapon_slot4: Resource = null -export var weapon_slot5: Resource = null -var weapons = [null,null,null,null,null] -var weapon: Resource = null -var world: Spatial = null -var carrying: bool = false -var carrying_object: RigidBody = null +extends "res://scripts/characters/NetworkedCharacter.gd" # Camera export var mouse_sensitivity:float = 12.0 @@ -41,12 +27,6 @@ var in_water: bool = false var swim_speed: float = 450.0 var climb_speed: float = 5.0 -# Control -var controlling_machine: bool = false #whether character is riding/controlling something -var machine: RigidBody = null -export var is_player: bool = false #whether character is currently controlled by a player -var ladder_m: Spatial = null - #physics var player_state: PhysicsDirectBodyState = null var is_on_floor:bool = false @@ -56,6 +36,18 @@ export var walk_speed:float = 5.0 var c_friction:float = 4.0 var air_control:float = 0.3 +#ai +var ai_state: String = "IDLE" + +var ai_should_pathfind: bool = false +var ai_path_target_global: Vector3 = Vector3.ZERO + +var ai_look_target: Vector3 = Vector3.ZERO +var ai_should_look: bool = false +var ai_should_track: bool = false +var ai_track_object: Spatial = null +const AI_LOOK_SPEED: float = 4.0 + # Called when the node enters the scene tree func _ready() -> void: if weapon_slot1 == null: @@ -76,18 +68,6 @@ func add_weapon_vm(weapon_vm: Spatial, trfrm: Transform): viewmodel.get_node("Skeleton/GunBone").add_child(weapon_vm) weapon_vm.transform = trfrm -func get_init_info() -> Dictionary: - return {"linear_velocity" : linear_velocity, "angular_velocity" : angular_velocity, "controlling_machine" : controlling_machine, "team" : team, "health" : health, "nametag" : $Nametag.text} - -func mp_init(init_info: Dictionary): - for variable in init_info.keys(): - set(variable, init_info[variable]) - $Nametag.text = init_info["nametag"] - -remote func set_phys_transform(trfrm: Transform, lvel: Vector3): - transform = trfrm - linear_velocity = 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: @@ -159,37 +139,6 @@ func initiate_use(): _: pass -remotesync func set_net_owner(owner_id: int): - $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 - world.cam.attach(self, "FIRSTPERSON", "./Neck/Head") - else: - $Nametag.visible = true - is_player = false - world.get_node("HUD").update_characters() - -func deselect_character(): - if is_network_master(): - world.player_char = null - if world.client_id != 1: world.cam.attach(world, "STATIC", "./DEFAULTCAM") - rpc("set_net_owner", 1) - -func take_control_of_machine(slave_machine: RigidBody): - machine = slave_machine - controlling_machine = true - -func lose_machine(): - if is_network_master(): world.cam.attach(self, "FIRSTPERSON", "./Neck/Head") - controlling_machine = false - machine = null - func carry_process() -> void: if !is_instance_valid(carrying_object): carrying_object = null @@ -208,6 +157,8 @@ func carry_process() -> void: # Called every physics tick. 'delta' is constant func _physics_process(delta: float) -> void: if is_network_master(): + if !is_player: #ai behavior + if ai_should_look: ai_look_at() if carrying: carry_process() if ladder_m != null: @@ -247,10 +198,10 @@ func _integrate_forces(state: PhysicsDirectBodyState) -> void: break if i == player_state.get_contact_count() - 1: friction = 1 - + nav.set_velocity(velocity) rpc("set_phys_transform", transform, linear_velocity) if global_transform.origin.y < -30: - rpc("damage", 500000, "drown", [1, "Davy Jones"]) + rpc("damage", 500000, "drown", [1, "Davy Jones"], "") func walk(_delta: float) -> void: # Input @@ -345,26 +296,6 @@ func leave_ladder(): ladder_m.queue_free() ladder_m = null -remotesync func damage(dmg_amt: int, _type: String, shooter: Array, extra: String): - health -= dmg_amt - if health <= 0 and is_network_master(): - if shooter[0] != get_network_master() and shooter[0] != 1: world.rpc_id(shooter[0], "game_killsound") - if get_network_master() == 1: - 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_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() and shooter[0] != 1: world.rpc_id(shooter[0], "game_hitsound") - -remotesync func remove_dead_character(): - if is_network_master() and machine != null: - machine.relinquish_control() - deselect_character() - queue_free() - -remotesync func net_apply_impulse(impulse_v: Vector3): - apply_central_impulse(impulse_v) - remotesync func anim_event(event: Dictionary): $"%VIEWMODEL_ARMS".get_node("AnimationPlayer").play(event["VMANIMPLAY"]) @@ -380,3 +311,34 @@ remotesync func add_rocket_to_scene(pos, dir, id): rocket.global_transform.origin = pos rocket.global_transform.basis = Basis(-1*dir.z, dir.y, dir.x) rocket.add_collision_exception_with(self) + +func set_look_status(target, type="STATIC"): + if type == "STATIC": + ai_look_target = target + ai_should_look = true + elif type == "TRACK": + ai_track_object = target + ai_should_look = true + ai_should_track = true + else: + ai_should_track = false + +func set_path_target(target): + ai_path_target_global = target + +func ai_look_at(): + if ai_should_track: + if is_instance_valid(ai_track_object): + ai_look_target = ai_track_object.global_transform.origin + else: + ai_track_object = null + ai_should_track = false + var p_neck: float = Vector3(ai_look_target.x - neck.global_transform.origin.x, 0, ai_look_target.z - neck.global_transform.origin.z).signed_angle_to(-neck.global_transform.basis.z, neck.global_transform.basis.y ) + var p_head: float = Vector3(ai_look_target.x - neck.global_transform.origin.x, ai_look_target.y - head.global_transform.origin.y, ai_look_target.z - neck.global_transform.origin.z).signed_angle_to( -head.global_transform.basis.z, head.global_transform.basis.x) + if abs(p_neck) > 0.01: + neck.rotation_degrees.y = lerp(neck.rotation_degrees.y, neck.rotation_degrees.y-p_neck, AI_LOOK_SPEED+abs(p_neck/3.1415)) + if abs(p_head) > 0.01: + head.rotation_degrees.x = lerp(head.rotation_degrees.x, head.rotation_degrees.x-p_head, AI_LOOK_SPEED+abs(p_head/3.1415)) + + if abs(p_neck) <= 0.01 and abs(p_head) <= 0.01 and !ai_should_track: + ai_should_look = false |
