summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/ClientUI.gd54
-rw-r--r--scripts/CmdPrompt.gd26
-rw-r--r--scripts/Console.gd14
-rw-r--r--scripts/GameBase.gd22
-rw-r--r--scripts/Server.gd15
-rw-r--r--scripts/ServerUI.gd38
-rw-r--r--scripts/ballistics/Cannonball.gd2
-rw-r--r--scripts/ballistics/NetworkedProjectile.gd9
-rw-r--r--scripts/boats/Gunboat.gd5
-rw-r--r--scripts/characters/player_controller_new.gd81
-rw-r--r--scripts/machines/Cannon.gd7
11 files changed, 108 insertions, 165 deletions
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: