From 4d51178d32e07c070c61aa7567856bec7eda3639 Mon Sep 17 00:00:00 2001 From: Anson Bridges Date: Fri, 2 Sep 2022 23:12:33 -0700 Subject: hit/killsounds, swimming, main menu, fixed explosion physics --- scripts/ClientUI.gd | 54 ------------------- scripts/CmdPrompt.gd | 26 --------- scripts/Console.gd | 14 ----- scripts/GameBase.gd | 22 +++++++- scripts/Server.gd | 15 ++++-- scripts/ServerUI.gd | 38 -------------- scripts/ballistics/Cannonball.gd | 2 +- scripts/ballistics/NetworkedProjectile.gd | 9 +++- scripts/boats/Gunboat.gd | 5 +- scripts/characters/player_controller_new.gd | 81 +++++++++++++++++++++-------- scripts/machines/Cannon.gd | 7 ++- 11 files changed, 108 insertions(+), 165 deletions(-) delete mode 100644 scripts/ClientUI.gd delete mode 100644 scripts/CmdPrompt.gd delete mode 100644 scripts/Console.gd delete mode 100644 scripts/ServerUI.gd (limited to 'scripts') diff --git a/scripts/ClientUI.gd b/scripts/ClientUI.gd deleted file mode 100644 index 32e7269..0000000 --- a/scripts/ClientUI.gd +++ /dev/null @@ -1,54 +0,0 @@ -extends Node2D - -var client : NetworkedMultiplayerENet -var world -var local_server_tree = null -var is_local = false - -func _ready(): - world = preload("res://scenes/GameBase.tscn").instance() - #get_tree().connect("network_peer_connected", self, "_player_connected") - #get_tree().connect("network_peer_disconnected", self, "_player_disconnected") - get_tree().connect("connected_to_server", self, "_connection_successful") - get_tree().connect("connection_failed", self, "_connected_fail") - get_tree().connect("server_disconnected", world, "client_disconnect") - set_process(false) - set_physics_process(false) - -func _connect_btn(): - client = NetworkedMultiplayerENet.new() - client.create_client($IP.text, $Port.value) - - get_tree().set_network_peer(client) - -func _connection_successful(): - get_tree().get_root().add_child(world) - world.client = client - world.client_id = get_tree().get_network_unique_id() - world.player_name = $Name.text - if is_local: - world.is_local = true - world.local_server_tree = local_server_tree - print("Connected.") - queue_free() - -func _run_local_server(): - local_server_tree = SceneTree.new() - local_server_tree.init() - local_server_tree.get_root().set_update_mode(Viewport.UPDATE_DISABLED) - var server_script = preload("res://scenes/Server.tscn").instance() - - #CHANGE LEVEL HERE - server_script.start_server("Local Server", "Local Singleplayer Server", 3, "res://maps/Main.tscn", "127.0.0.1", 25565, local_server_tree, null, "print") - set_process(true) - set_physics_process(true) - is_local = true - client = NetworkedMultiplayerENet.new() - client.create_client("127.0.0.1", 25565) - get_tree().set_network_peer(client) - -func _process(delta): - local_server_tree.idle(delta) - -func _physics_process(delta): - local_server_tree.iteration(delta) diff --git a/scripts/CmdPrompt.gd b/scripts/CmdPrompt.gd deleted file mode 100644 index 965631b..0000000 --- a/scripts/CmdPrompt.gd +++ /dev/null @@ -1,26 +0,0 @@ -extends LineEdit - -export var console_path := @""; onready var console := get_node(console_path) as ScrollContainer -var server_ref = null -var ui_ref = null - -func enter_cmd(new_text: String): - console.add_line(new_text) - text = "" - if new_text.substr(0,1) == "/": #PROCESS COMMAND - var end_ind = new_text.find(" ")-1 - if end_ind < -1: end_ind = -1 - var cmd : String = new_text.substr(1, end_ind) - var args = new_text.substr(end_ind+1, -1).split(" ", false) - - if cmd == "say": - if server_ref != null: - var m_args = {"name" : "SERVER", "msg" : args.join(" ")} - server_ref._send_chat(m_args) - elif cmd == "start": - if server_ref == null: - ui_ref.start_server() - elif cmd == "stop": - if server_ref != null: - ui_ref.stop_server() - diff --git a/scripts/Console.gd b/scripts/Console.gd deleted file mode 100644 index ac73525..0000000 --- a/scripts/Console.gd +++ /dev/null @@ -1,14 +0,0 @@ -extends ScrollContainer - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass - -func add_line(text): - var lbl = Label.new() - lbl.autowrap = true - lbl.text = text - text = "" - $ConsoleLines.add_child(lbl) - yield(get_tree().create_timer(0.05), "timeout") - ensure_control_visible(lbl) diff --git a/scripts/GameBase.gd b/scripts/GameBase.gd index 019aa14..571ba84 100644 --- a/scripts/GameBase.gd +++ b/scripts/GameBase.gd @@ -16,6 +16,7 @@ var is_chatting = false var winddir = Vector3(1,0,0) func _process(delta): + $HUD/Health.text = str(player_char.health) if player_char != null else "" if is_local: local_server_tree.idle(delta) @@ -67,6 +68,12 @@ remote func game_update_chars(): remote func game_chat_msg(msg): $HUD.ui_chat_msg(msg) +remotesync func game_hitsound(): + $HUD.ui_play_hitsound() + +remotesync func game_killsound(): + $HUD.ui_play_killsound() + func select_character(dest): print(dest) if player_char == null: @@ -78,7 +85,20 @@ func client_disconnect(): if player_char != null: player_char.deselect_character() client.close_connection() - get_tree().quit() + if is_local: + local_server_tree.free() + back_to_main() + +func _connection_lost(): + if is_local: + local_server_tree.free() + back_to_main() + +func back_to_main(): + var main_menu = load("res://ui/MainMenu.tscn").instance() + get_tree().get_root().add_child(main_menu) + get_tree().get_root().remove_child(self) + queue_free() func join_team(team): if player_char != null: diff --git a/scripts/Server.gd b/scripts/Server.gd index 531f30e..2814b7b 100644 --- a/scripts/Server.gd +++ b/scripts/Server.gd @@ -21,7 +21,7 @@ func _ready(): get_tree().connect("network_peer_connected", self, "_client_connect") get_tree().connect("network_peer_disconnected", self, "_client_disconnect") -func start_server(_server_name: String, _motd: String, max_players: int, map_path: String, ip: String, port: int, tree, output_obj, output_f): +func start_server(_server_name: String, _motd: String, max_players: int, map_path: String, _ip: String, port: int, tree, output_obj, output_f): output = output_obj output_func = output_f server_name = _server_name @@ -92,18 +92,23 @@ func _client_change_teams(arguments): func _client_request_change_character(arguments): var dest = world.get_node("PLAYERS/"+arguments["char_name"]) - if dest.get_network_master() == 1: + if dest != null and dest.get_network_master() == 1: print_line(connected_players[arguments["id"]][0] + " selected character " + arguments["char_name"]) - dest.rpc("set_owner", arguments["id"]) + dest.rpc("set_net_owner", arguments["id"]) if arguments["current_char_name"] != "NULL": var old = world.get_node("PLAYERS/"+arguments["current_char_name"]) - old.rpc("set_owner", 1) + old.rpc("set_net_owner", 1) + +func _client_request_control_vehicle(arguments): + var dest_machine = world.get_node("MACHINES/"+arguments["machine"]) + if dest_machine != null and dest_machine.get_network_master() == 1 and !dest_machine.in_use: + pass func _character_death(arguments): var victim_player = connected_players[arguments["victim_mp_id"]][0] if arguments["victim_mp_id"] != 1 else "" print_line(arguments["victim"] + " ("+victim_player+") killed by " + arguments["killer"] + " " + arguments["extra"] + ".") world.rpc("game_chat_msg", arguments["victim"] + " ("+victim_player+") killed by " + arguments["killer"] + " " + arguments["extra"] + ".") - world.get_node("PLAYERS/"+arguments["victim"]).rpc("remove_dead") + world.get_node("PLAYERS/"+arguments["victim"]).rpc("remove_dead_character") world.rpc("game_update_chars") func _send_chat(arguments): diff --git a/scripts/ServerUI.gd b/scripts/ServerUI.gd deleted file mode 100644 index 8daf086..0000000 --- a/scripts/ServerUI.gd +++ /dev/null @@ -1,38 +0,0 @@ -extends Node2D - - -var server -onready var console = get_node("Console") - -var is_running :bool = false - -func _ready(): - $CmdPrompt.ui_ref = self - -func hide_init_fields(): - for node in get_tree().get_nodes_in_group("init_fields"): - node.visible = false - $StopButton.visible = true - -func show_init_fields(): - for node in get_tree().get_nodes_in_group("init_fields"): - node.visible = true - $StopButton.visible = false - -func start_server(): - console.add_line("Server starting...") - is_running = true - - server = preload("res://scenes/Server.tscn").instance() - $CmdPrompt.server_ref = server - server.start_server($ServerName.text, $MOTD.text, $PlayerCount.value, $MapPath.text, $IP.text, $Port.value, get_tree(), console, "add_line") - - Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) - hide_init_fields() - -func stop_server(): - server.stop_server() - is_running = false - $CmdPrompt.server_ref = null - - show_init_fields() diff --git a/scripts/ballistics/Cannonball.gd b/scripts/ballistics/Cannonball.gd index 15f35a3..7b56577 100644 --- a/scripts/ballistics/Cannonball.gd +++ b/scripts/ballistics/Cannonball.gd @@ -9,7 +9,7 @@ func _physics_process(_delta): add_force(-1*linear_velocity*drag_constant, Vector3.ZERO) func get_init_info(): - return {"linear_velocity" : linear_velocity, "angular_velocity" : angular_velocity, "oldvel" : oldvel, "shooter" : shooter} + return {"linear_velocity" : linear_velocity, "angular_velocity" : angular_velocity, "oldvel" : oldvel, "shooter" : shooter, "shooter_id" : shooter_id} func _on_collision(body): if linear_velocity.length() > 20 and !damage_exceptions.has(body) and body.has_method("damage"): diff --git a/scripts/ballistics/NetworkedProjectile.gd b/scripts/ballistics/NetworkedProjectile.gd index 0626e9f..d9304cf 100644 --- a/scripts/ballistics/NetworkedProjectile.gd +++ b/scripts/ballistics/NetworkedProjectile.gd @@ -1,7 +1,7 @@ extends RigidBody - var shooter = "WORLD" +var shooter_id = 1 # Called when the node enters the scene tree for the first time. @@ -20,3 +20,10 @@ remote func update_phys_transform(t, lv, av): func _integrate_forces(state): if is_network_master(): rpc("update_phys_transform", transform, linear_velocity, angular_velocity) + +remotesync func net_remove(): + queue_free() + +func net_master_remove(): + if is_network_master(): + rpc("net_remove") diff --git a/scripts/boats/Gunboat.gd b/scripts/boats/Gunboat.gd index 1e8dd49..6f4f807 100644 --- a/scripts/boats/Gunboat.gd +++ b/scripts/boats/Gunboat.gd @@ -85,10 +85,13 @@ func direction_input(fwd,bwd,left,right,_left,_right): rudder = left - right mainsheet = _left - _right -func damage(amount, type, shooter, extra = ""): +remotesync func damage(amount, _type, shooter, extra = ""): health -= amount print(health) +remotesync func net_apply_impulse(impulse_v): + apply_central_impulse(impulse_v) + # Called every frame. 'delta' is the elapsed time since the previous frame. func _physics_process(delta): $Mast/Sail.scale.y = sail_out 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) diff --git a/scripts/machines/Cannon.gd b/scripts/machines/Cannon.gd index fcd842b..e7a5441 100644 --- a/scripts/machines/Cannon.gd +++ b/scripts/machines/Cannon.gd @@ -40,7 +40,11 @@ func _ready(): add_collision_exception_with(get_parent()) mode = RigidBody.MODE_STATIC world = get_tree().get_root().find_node("BALLISTICS", true, false) - + +remotesync func set_net_owner(id, char_name): + set_network_master(id) + if id != 1 or char_name != "NONE": + pass func is_in_use(): return in_use @@ -54,6 +58,7 @@ func take_control(controller): func relinquish_control(): in_use = false user = null + rpc("set_owner", 1, "NONE") func _physics_process(delta): if cooldown > 0: -- cgit v1.2.3