diff options
Diffstat (limited to 'godot/scripts')
| -rw-r--r-- | godot/scripts/GameBase.gd | 58 | ||||
| -rw-r--r-- | godot/scripts/Server.gd | 17 | ||||
| -rw-r--r-- | godot/scripts/World.gd | 39 | ||||
| -rw-r--r-- | godot/scripts/ballistics/NetworkedProjectile.gd | 2 | ||||
| -rw-r--r-- | godot/scripts/characters/NetworkedCharacter.gd | 17 | ||||
| -rw-r--r-- | godot/scripts/characters/player_controller_new.gd | 17 | ||||
| -rw-r--r-- | godot/scripts/machines/NetworkedMachineGDS.gd | 2 | ||||
| -rw-r--r-- | godot/scripts/vehicles/Airplane.gd | 2 | ||||
| -rw-r--r-- | godot/scripts/vehicles/Gunboat.gd | 11 |
9 files changed, 82 insertions, 83 deletions
diff --git a/godot/scripts/GameBase.gd b/godot/scripts/GameBase.gd index e77d070..477e44e 100644 --- a/godot/scripts/GameBase.gd +++ b/godot/scripts/GameBase.gd @@ -2,16 +2,18 @@ extends Spatial var client var client_id: int -var is_local = false +var is_local: bool = false +var is_host: bool = false var local_server_tree = null -var player_name : String -var player_team : String +var player_name : String = "Player" +var player_team : int = -1 #-1 = spec var player_char = null onready var cam: ClippedCamera = $PLAYERCAM onready var hud = $HUD var players_info = {} #dictionary of id : name, team, ping, etc. +var teams_info = {-1: "SPEC"} #dictionary of teams for given server var is_chatting: bool = false @@ -21,6 +23,14 @@ signal screen_shake(location, strength, time) func _ready(): connect("screen_shake", self, "shake_cam") + if !is_local and !is_host: #if connecting to external server + NavigationServer.set_active(false) + elif !is_local and is_host: #dedicated server + remove_child($HUD) + remove_child($PLAYERCAM) + else: #local server + players_info[1] = ["Player", "SPEC"] + cam.attach($DEFAULTCAM, "STATIC", NodePath(".")) func shake_cam(loc, strength, time): var dist: float = (cam.global_transform.origin - loc).length() @@ -29,20 +39,17 @@ func shake_cam(loc, strength, time): cam.shake(strength, time) func _process(delta): - $HUD/Health.text = str(player_char.health) if player_char != null else "" - if is_local: - local_server_tree.call("idle",delta) + if is_local or !is_host: + $HUD/Health.text = str(player_char.health) if player_char != null else "" func _physics_process(delta): - if is_local: - local_server_tree.call("iteration", delta) + pass remote func set_up_server_info(info): $HUD/ServerJoinMenu/MOTD.text = info["MOTD"] $HUD/ServerJoinMenu/ServerName.text = info["server_name"] $DEFAULTCAM.transform = info["cam_pos"] cam.attach($DEFAULTCAM, "STATIC", NodePath(".")) - rpc_id(1, "_call_on_server", "_client_connection_confirmed", {"id" : client_id, "username" : player_name}) @@ -62,31 +69,41 @@ remote func load_entities(entity_info): #machines, players, and projectiles ent.transform = entity["transform"] ent.mp_init(entity["init_info"]) -remote func update_players_info(info): +remotesync func _call_on_server(function, arguments): + if get_network_master() != 1: return + print('Remote server call: ' + function) + $Server.call(function, arguments) + +remotesync func update_players_info(info): + players_info = info + if is_host and !is_local: return $HUD/ServerJoinMenu/Team1Players.text = "" $HUD/ServerJoinMenu/Team2Players.text = "" $HUD/ServerJoinMenu/Spectators.text = "" - players_info = info for player in players_info.keys(): var p_team = players_info[player][1] var p_name = players_info[player][0] - if p_team == "RED": + if p_team == 0: $HUD/ServerJoinMenu/Team1Players.text += p_name + ", " - elif p_team == "BLUE": + elif p_team == 1: $HUD/ServerJoinMenu/Team2Players.text += p_name + ", " - elif p_team == "SPEC": + elif p_team == -1: $HUD/ServerJoinMenu/Spectators.text += p_name + ", " -remote func game_update_chars(): +remotesync func game_update_chars(): + if is_host and !is_local: return $HUD.update_characters() -remote func game_chat_msg(msg): +remotesync func game_chat_msg(msg): + if is_host and !is_local: return $HUD.ui_chat_msg(msg) remotesync func game_hitsound(): + if is_host and !is_local: return $HUD.ui_play_hitsound() remotesync func game_killsound(): + if is_host and !is_local: return $HUD.ui_play_killsound() func request_select_character(dest): @@ -96,12 +113,13 @@ func request_select_character(dest): rpc_id(1, "_call_on_server", "_client_request_change_character", {"id" : client_id, "current_char_name" : player_char.name, "char_name" : dest}) func client_disconnect(): - if player_char != null: + if player_char != null: player_char.deselect_character() - client.close_connection() if is_local: - local_server_tree.get_root().get_node("GAMEWORLD/Server").stop_server() - local_server_tree.free() + $Server.stop_server() + else: + client.close_connection() + back_to_main() func _connection_lost(): diff --git a/godot/scripts/Server.gd b/godot/scripts/Server.gd index b4ab995..498c5d8 100644 --- a/godot/scripts/Server.gd +++ b/godot/scripts/Server.gd @@ -25,7 +25,7 @@ func _ready(): if sig != OK: print("SERVER: Error connecting one or more signals. Error code: " + str(sig)) -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, is_local: bool, port: int, tree, output_obj, output_f): output = output_obj output_func = output_f server_name = _server_name @@ -48,6 +48,11 @@ func start_server(_server_name: String, _motd: String, max_players: int, map_pat return world.add_child(self) + world.client_id = 1 + world.is_host = true + world.is_local = is_local + if is_local: + connected_players[1] = ["Player", -1] tree.get_root().add_child(world) world.client_id = 1 @@ -73,9 +78,9 @@ func _client_disconnect(id): func _client_connect(id): print_line("Client (ID: "+str(id)+") connecting...") connected_player_count += 1 - connected_players[id] = ["", "SPEC"] #Placeholder for name + connected_players[id] = ["", -1] #Placeholder for name - var server_info = {"player_count" : connected_player_count, "server_name" : server_name, "MOTD" : motd, "cam_pos" : world.get_node("DEFAULTCAM").transform} + var server_info = {"player_count" : connected_player_count, "server_name" : server_name, "MOTD" : motd, "cam_pos" : world.get_node("DEFAULTCAM").transform, "teams" : {0 : "RED", 1 : "BLUE"}} world.rpc_id(id, "set_up_server_info", server_info) var geo_info = [] @@ -91,11 +96,11 @@ func _client_connect(id): func _client_connection_confirmed(arguments): print_line("Client (ID: "+str(arguments["id"])+") connected as " +arguments["username"] +".") - connected_players[arguments["id"]] = [arguments["username"], "SPEC"] + connected_players[arguments["id"]] = [arguments["username"], -1] world.rpc("update_players_info", connected_players) func _client_change_teams(arguments): - print_line(connected_players[arguments["id"]][PLAYER_NAME] + " ("+ str(arguments["id"]) +") changed to team " + arguments["team"]) + print_line(connected_players[arguments["id"]][PLAYER_NAME] + " ("+ str(arguments["id"]) +") changed to team " + str(arguments["team"])) connected_players[arguments["id"]][PLAYER_TEAM] = arguments["team"] world.rpc("update_players_info", connected_players) @@ -106,7 +111,7 @@ func _client_request_change_character(arguments): 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_net_owner", int(1)) + old.rpc("set_net_owner", int(1), true) func _client_request_control_vehicle(arguments): var dest_machine = world.get_node(arguments["machine_path"]) diff --git a/godot/scripts/World.gd b/godot/scripts/World.gd index 90b3cf7..c560f45 100644 --- a/godot/scripts/World.gd +++ b/godot/scripts/World.gd @@ -1,10 +1,6 @@ extends Spatial - -var m = SpatialMaterial.new() var winddir = Vector3(1,0,0) -onready var pathfinder = get_node("PLAYERS/Player2") -var path = [] var map_rids var client_id var player_char: NetChar @@ -16,9 +12,6 @@ func _ready(): map_rids = NavigationServer.get_maps() for rid in map_rids: NavigationServer.map_set_edge_connection_margin(rid,1.5) - m.flags_unshaded = true - m.flags_use_point_size = true - m.albedo_color = Color.white #merge all nav meshes onto the main map yield(get_tree().create_timer(1.0), "timeout") @@ -33,37 +26,5 @@ remotesync func _call_on_server(function, arguments): print('Remote server call: ' + function) $Server.call(function, arguments) -func find_path(): - var start_pos = $START.global_transform.origin - var end_pos = $END.global_transform.origin - var t_path = NavigationServer.map_get_path(WORLD_MAP_RID, start_pos, end_pos, true) - var path_end = t_path[len(t_path)-1] - #is path end near desired end - #if not, is the end point in an unreachable region? - for rid in map_rids: - print("map " + str(rid.get_id())) - for region_rid in NavigationServer.map_get_regions(rid): - print("region " + str(region_rid.get_id())) - if NavigationServer.region_owns_point(region_rid, end_pos): - print("owns target point") - if NavigationServer.region_owns_point(region_rid, path_end): - print("owns end point") - print( (end_pos - t_path[len(t_path)-1]).length() ) - draw_path(t_path) - pass - -func draw_path(path_array): - var im = get_node("Draw") - im.set_material_override(m) - im.clear() - im.begin(Mesh.PRIMITIVE_POINTS, null) - im.add_vertex(path_array[0]) - im.add_vertex(path_array[path_array.size() - 1]) - im.end() - im.begin(Mesh.PRIMITIVE_LINE_STRIP, null) - for x in path_array: - im.add_vertex(x) - im.end() - func get_client_id() -> int: return client_id diff --git a/godot/scripts/ballistics/NetworkedProjectile.gd b/godot/scripts/ballistics/NetworkedProjectile.gd index a1d73ac..4f08d77 100644 --- a/godot/scripts/ballistics/NetworkedProjectile.gd +++ b/godot/scripts/ballistics/NetworkedProjectile.gd @@ -22,7 +22,7 @@ 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) + rpc_unreliable("update_phys_transform", transform, linear_velocity, angular_velocity) remotesync func net_remove(): queue_free() diff --git a/godot/scripts/characters/NetworkedCharacter.gd b/godot/scripts/characters/NetworkedCharacter.gd index 8a0282d..d904593 100644 --- a/godot/scripts/characters/NetworkedCharacter.gd +++ b/godot/scripts/characters/NetworkedCharacter.gd @@ -2,7 +2,7 @@ extends RigidBody class_name NetChar # Game -export var team: String = "RED" +export var team = 0 export var health: int = 100 export var weapon_slot1: Resource = null export var weapon_slot2: Resource = null @@ -40,7 +40,7 @@ remote func set_phys_transform(trfrm: Transform, lvel: Vector3): transform = trfrm linear_velocity = lvel -remotesync func set_net_owner(owner_id: int): +remotesync func set_net_owner(owner_id: int, singleplayer_reset: bool = false): $Nametag.text = "" set_network_master(owner_id) if owner_id != 1: @@ -55,12 +55,19 @@ remotesync func set_net_owner(owner_id: int): $Nametag.visible = true is_player = false world.get_node("HUD").update_characters() + elif world.is_local: + if singleplayer_reset: + is_player = false + else: + world.player_char = self + is_player = true + world.cam.attach(self, "FIRSTPERSON", "./Neck/Head") func deselect_character(): - if is_network_master(): + if is_network_master() and world.player_char == self: world.player_char = null - if world.client_id != 1: world.cam.attach(world, "STATIC", "./DEFAULTCAM") - rpc("set_net_owner", 1) + world.cam.attach(world, "STATIC", "./DEFAULTCAM") + rpc("set_net_owner", 1, true) func take_control_of_machine(slave_machine: RigidBody): machine = slave_machine diff --git a/godot/scripts/characters/player_controller_new.gd b/godot/scripts/characters/player_controller_new.gd index 62f5ef6..232e5e0 100644 --- a/godot/scripts/characters/player_controller_new.gd +++ b/godot/scripts/characters/player_controller_new.gd @@ -63,6 +63,9 @@ const DROWN_DICT: Dictionary = {"type" : "DROWN", "attacker_net_id" : 1, "attack # Called when the node enters the scene tree func _ready() -> void: + if get_parent().name == "CREW": + team = owner.team + if weapon_slot1 == null: weapon_slot1 = preload("res://scenes/weapons/hands.res") weapons = [weapon_slot1,weapon_slot2,weapon_slot3,weapon_slot4,weapon_slot5] @@ -74,8 +77,6 @@ func _ready() -> void: $"%UseRay".add_exception(self) $"%MeleeRay".add_exception(self) - $"%UseRay".add_exception($AreaDetect) - $"%MeleeRay".add_exception($AreaDetect) if ai_target_machine_path: ai_target_machine = get_node(ai_target_machine_path) @@ -181,15 +182,15 @@ func load_process(delta) -> void: if use_ray.is_colliding() and use_ray.get_collider().get_parent() == load_target and use_held: var progress: float =load_target.increase_load(delta) if progress < 0: - if get_network_master() != 1: world.hud.hide_progress() + if is_player: world.hud.hide_progress() load_target.reset_load() loading = false load_target = null inventory[load_ammo] -= 1 else: - if get_network_master() != 1: world.hud.set_progress(progress) + if is_player: world.hud.set_progress(progress) else: - if get_network_master() != 1: world.hud.hide_progress() + if is_player: world.hud.hide_progress() load_target.reset_load() loading = false load_target = null @@ -263,7 +264,7 @@ func _integrate_forces(state: PhysicsDirectBodyState) -> void: return player_state = state velocity = state.get_linear_velocity() - for i in range(player_state.get_contact_count()): + if is_player: 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 and !is_on_floor: physics_material_override.friction = 0 @@ -271,11 +272,11 @@ func _integrate_forces(state: PhysicsDirectBodyState) -> void: if i == player_state.get_contact_count() - 1: physics_material_override.friction = 1 - rpc("set_phys_transform", transform, linear_velocity) + rpc_unreliable("set_phys_transform", transform, linear_velocity) if global_transform.origin.y < -30: rpc("damage", 500000, DROWN_DICT) - nav.set_velocity(velocity) + #nav.set_velocity(velocity) func walk(_delta: float) -> void: if floor_normal != Vector3.UP: direction = direction.rotated(floor_normal.cross(Vector3.UP).normalized(), Vector3.UP.angle_to(floor_normal)) diff --git a/godot/scripts/machines/NetworkedMachineGDS.gd b/godot/scripts/machines/NetworkedMachineGDS.gd index 91dbeb4..19ff29a 100644 --- a/godot/scripts/machines/NetworkedMachineGDS.gd +++ b/godot/scripts/machines/NetworkedMachineGDS.gd @@ -19,7 +19,7 @@ remotesync func net_apply_impulse(impulse_v: Vector3): func _integrate_forces(_state: PhysicsDirectBodyState): if is_network_master() and mode == MODE_RIGID: - rpc("update_phys_transform", transform, linear_velocity, angular_velocity) + rpc_unreliable("update_phys_transform", transform, linear_velocity, angular_velocity) remotesync func set_net_owner(id: int, char_name: String): set_network_master(id) diff --git a/godot/scripts/vehicles/Airplane.gd b/godot/scripts/vehicles/Airplane.gd index 2de4792..aa084a8 100644 --- a/godot/scripts/vehicles/Airplane.gd +++ b/godot/scripts/vehicles/Airplane.gd @@ -154,7 +154,7 @@ func _integrate_forces(state): ang_vel_target += roll_constant*(roll_dir*roll_curve.curve.interpolate(roll_angle_max-abs(roll_angle)))*global_transform.basis.x else: roll_dir = 1 if roll_angle > 0 else -1 - 3*roll_constant*(roll_dir*roll_curve.curve.interpolate(roll_angle_max-abs(roll_angle)))*global_transform.basis.x + ang_vel_target += 3*roll_constant*(roll_dir*roll_curve.curve.interpolate(roll_angle_max-abs(roll_angle)))*global_transform.basis.x #turn (based on how much the plane is rolled (need to add ang_vel_target += turn_constant*Vector3.UP*roll_angle diff --git a/godot/scripts/vehicles/Gunboat.gd b/godot/scripts/vehicles/Gunboat.gd index 1defce2..1403a50 100644 --- a/godot/scripts/vehicles/Gunboat.gd +++ b/godot/scripts/vehicles/Gunboat.gd @@ -22,7 +22,7 @@ const damage_threshold = 20 const max_depth = 2 #boat ids -onready var nav_rid = $NavigationMeshInstance.get_region_rid() +onready var nav_rid = 0#$NavigationMeshInstance.get_region_rid() #controls var throttle: float = 0.0 @@ -43,8 +43,15 @@ func _ready(): for sail in $SAILS.get_children(): sail.set_sheet(sail_out) world = get_tree().get_root().find_node("GAMEWORLD", true, false) + var plr = get_tree().get_root().find_node("PLAYERS", true, false) + for player in get_node("CREW").get_children(): + var t: Transform = player.global_transform + get_node("CREW").remove_child(player) + plr.add_child(player, true) + player.global_transform = t + #call_deferred("remove_child", get_node("CREW")) if get_tree().get_network_unique_id() == 1: - print("enabling navigation for server") + pass#print("enabling navigation for server") #$NavigationMeshInstance.set_enabled(true) func on_no_control(): |
