summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--godot/scripts/GameBase.gd10
-rw-r--r--godot/scripts/World.gd2
-rw-r--r--src/playercontroller.cpp118
-rw-r--r--src/playercontroller.h4
4 files changed, 73 insertions, 61 deletions
diff --git a/godot/scripts/GameBase.gd b/godot/scripts/GameBase.gd
index e8f7ad0..89d457b 100644
--- a/godot/scripts/GameBase.gd
+++ b/godot/scripts/GameBase.gd
@@ -1,7 +1,7 @@
extends Spatial
var client
-var client_id
+var client_id: int
var is_local = false
var local_server_tree = null
@@ -12,7 +12,7 @@ onready var cam = $PLAYERCAM
var players_info = {} #dictionary of id : name, team, ping, etc.
-var is_chatting = false
+var is_chatting: bool = false
var winddir = Vector3(1,0,0)
@@ -108,3 +108,9 @@ func join_team(team):
$DEFAULTCAM.current = true
player_team = team
rpc_id(1, "_call_on_server", "_client_change_teams", {"id" : client_id, "team" : team})
+
+func get_client_id() -> int:
+ return client_id
+
+func is_chatting_f() -> bool:
+ return is_chatting
diff --git a/godot/scripts/World.gd b/godot/scripts/World.gd
index 7e60423..01df1b5 100644
--- a/godot/scripts/World.gd
+++ b/godot/scripts/World.gd
@@ -64,3 +64,5 @@ func draw_path(path_array):
im.add_vertex(x)
im.end()
+func get_client_id() -> int:
+ return client_id
diff --git a/src/playercontroller.cpp b/src/playercontroller.cpp
index edf85be..af8aa5a 100644
--- a/src/playercontroller.cpp
+++ b/src/playercontroller.cpp
@@ -68,6 +68,8 @@ void PlayerController::_init() {
void PlayerController::_ready() {
head = get_node<Spatial>(NodePath("Neck/Head"));
neck = get_node<Spatial>(NodePath("Neck"));
+ useray = get_node<RayCast>(NodePath("Neck/Head/UseRay"));
+ nametag = get_node<Label3D>(NodePath("Nametag"));
nav = get_node<NavigationAgent>(NodePath("NavigationAgent"));
weapon = (Node *)ResourceLoader::get_singleton()->load("res://scenes/weapons/w_Rockets.tscn")->instance()
add_child(weapon)
@@ -81,7 +83,7 @@ Dictionary PlayerController::get_init_info() {
void PlayerController::mp_init(Dictionary init_info) {
for(int i = 0; i < init_info.keys().size(); i++)
set(init_info.keys()[i], init_info[init_info.keys()[i]]);
- get_node<Label3D>("Nametag")->set_text(init_info["nametag"]);
+ nametag->set_text(init_info["nametag"]);
}
void PlayerController::set_phys_transform(Transform trfrm, Vector3 lvel) {
@@ -89,56 +91,55 @@ void PlayerController::set_phys_transform(Transform trfrm, Vector3 lvel) {
set_linear_velocity(lvel);
}
-PlayerController::_process(float _delta) {
-// if is_player and !world.is_chatting:
-// if Input.is_action_just_pressed("use"):
-// initiate_use()
+void PlayerController::_process(float _delta) {
+ const Input *input_singleton = Input::get_singleton();
+ if(is_player && !world->call("is_chatting_f")){
+ if(input_singleton->is_action_just_pressed("use"))
+ initiate_use();
+ if(controlling_machine) {
+ if(input_singleton->is_action_just_pressed("fire"))machine->call("attack1");
+ if(input_singleton->is_action_just_pressed("fire2"))machine->call("attack2");
+ }
}
void PlayerController::initiate_use() {
-// if controlling_machine:
-// machine.relinquish_control()
-// return
-// if ladder_m != null:
-// leave_ladder()
-// return
-// if $"%UseRay".is_colliding():
-// var area_c = $"%UseRay".get_collider()
-// match area_c.name:
-// "SteerArea":
-// world.rpc_id(1, "_call_on_server", "_client_request_control_vehicle", {"id" : world.client_id, "machine_path" : area_c.get_parent().get_path(), "char_name" : name})
-// "LadderArea":
-// mount_ladder(area_c.get_parent())
-// "TugArea":
-// pass
-// "PickupArea":
-// pass
-// _:
-// pass
+ if(controlling_machine){machine->call("relinquish_control"); return; }
+ if(ladder_m != nullptr) { leave_ladder(); return; }
+ if(useray->is_colliding()){
+ const Node *area_c = useray->get_collider();
+ if(area_c->get_name() == "SteerArea")
+ world.rpc_id(1, "_call_on_server", "_client_request_control_vehicle", {"id" : world->call("get_client_id"), "machine_path" : area_c->get_parent()->get_path(), "char_name" : get_name()});
+ else if(area_c->get_name() == "LadderArea")
+ mount_ladder(area_c->get_parent());
+ else if(area_c->get_name() == "TugArea")return;
+ else if(area_c->get_name() == "PickupArea")return;
+ }
}
void PlayerController::set_net_owner(int 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
-// world.cam.attach(self, "FIRSTPERSON", "./Neck/Head")
-// else:
-// $Nametag.visible = true
-// is_player = false
-// world.get_node("HUD").update_characters()
+ nametag->set_text("");
+ set_network_master(owner_id);
+ if(owner_id != 1)
+ nametag->set_text(String(world->get_players_info()[owner_id][0]));
+ if(get_tree()->get_network_unique_id() != 1){
+ if(owner_id == world->get_client_id()){
+ nametag->set_visible(false);
+ world.player_char = self;
+ is_player = true;
+ world.cam.attach(this, "FIRSTPERSON", "./Neck/Head");
+ }else{
+ nametag->set_visible(true);
+ is_player = false;
+ }
+ world->get_node("HUD")->call("update_characters");
+ }
}
void PlayerController::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)
+ if is_network_master():
+ world.player_char = null
+ if(world->get_client_id() != 1) world.cam.attach(world, "STATIC", "./DEFAULTCAM")
+ rpc("set_net_owner", 1)
}
void PlayerController::take_control_of_machine(RigidBody *slave_machine) {
@@ -152,7 +153,7 @@ void PlayerController::lose_machine() {
machine = nullptr;
}
-PlayerController::_physics_process(float delta) {
+void PlayerController::_physics_process(float delta) {
if(is_network_master()) {
if (ladder_m != nullptr)
climb_ladder(delta);
@@ -200,7 +201,7 @@ void PlayerController::_integrate_forces(PhysicsDirectBodyState *state) {
}
rpc("set_phys_transform", get_transform(), get_linear_velocity());
if(get_global_transform().origin.y < -30)
- rpc("damage", 500000, "drown", Array::make(1, "Davy Jones"]);
+ rpc("damage", 500000, "drown", Array::make(1, String("Davy Jones"));
}
void PlayerController::walk(float _delta) {
@@ -279,24 +280,25 @@ void PlayerController::climb_ladder(float delta) {
}
void PlayerController::leave_ladder() {
-// if (ladder_m.get_parent().top.global_transform.origin - global_transform.origin).length_squared() < 0.01:
-// apply_central_impulse(-400*ladder_m.global_transform.basis.z)
-// global_transform.basis = world.global_transform.basis
-// set_gravity_scale(1.0)
-// ladder_m.queue_free()
-// ladder_m = null
+ if((ladder_m->get_parent()->get_node<Spatial>("TOP")->global_transform.origin - get_global_transform().origin).length_squared() < 0.01)
+ apply_central_impulse(-400*ladder_m->get_global_transform().basis.z);
+ global_transform.basis = world.global_transform.basis
+ set_gravity_scale(1.0);
+ ladder_m->queue_free();
+ ladder_m = nullptr;
}
void PlayerController::damage(int dmg_amt, String _type, Array shooter, String extra = ".") {
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")
+ if(health <= 0 && 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});
+ } else if( is_network_master())
+ if(shooter[0] != get_network_master() and shooter[0] != 1) world.rpc_id(shooter[0], "game_hitsound");
+ }
}
void PlayerController::remove_dead_character() {
diff --git a/src/playercontroller.h b/src/playercontroller.h
index 388de3f..b373db8 100644
--- a/src/playercontroller.h
+++ b/src/playercontroller.h
@@ -19,6 +19,8 @@ private:
Vector2 mouse_axis;
Spatial *head;
Spatial *neck;
+ RayCast *useray;
+ Label3D *nametag;
Vector3 velocity;
Vector3 direction;
Vector3 move_axis;
@@ -70,7 +72,7 @@ public:
void swim(float _delta);
void enter_water();
void exit_water();
- void mount_ladder(Spatial target_ladder);
+ void mount_ladder(Spatial *target_ladder);
void climb_ladder(float delta);
void leave_ladder();
void damage(int dmg_amt, String _type, Array shooter, String extra);