summaryrefslogtreecommitdiff
path: root/godot/scripts/characters/NetworkedCharacter.gd
diff options
context:
space:
mode:
authorAnson Bridges <bridges.anson@gmail.com>2022-10-07 15:49:57 -0400
committerAnson Bridges <bridges.anson@gmail.com>2022-10-07 15:49:57 -0400
commit7dbec964a375598d454e04719576eb6c469a5d7b (patch)
treefa819e5e843ecdd88375ad1806ab43358b1ea670 /godot/scripts/characters/NetworkedCharacter.gd
parent62c33688cf2f48d7669790a89e3d1cdec16798be (diff)
ai work
Diffstat (limited to 'godot/scripts/characters/NetworkedCharacter.gd')
-rw-r--r--godot/scripts/characters/NetworkedCharacter.gd85
1 files changed, 85 insertions, 0 deletions
diff --git a/godot/scripts/characters/NetworkedCharacter.gd b/godot/scripts/characters/NetworkedCharacter.gd
new file mode 100644
index 0000000..c8e90a4
--- /dev/null
+++ b/godot/scripts/characters/NetworkedCharacter.gd
@@ -0,0 +1,85 @@
+extends RigidBody
+class_name NetChar
+
+# 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: NetObject = null
+
+# 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
+
+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
+
+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
+
+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)