summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/player_controller/.sconsign.dblitebin0 -> 27268 bytes
-rw-r--r--src/player_controller/PlayerController.gd (renamed from src/PlayerController.gd)0
-rw-r--r--src/player_controller/SConstruct2
-rw-r--r--src/player_controller/___player_controller.h (renamed from src/player_controller/player_controller.h)0
-rw-r--r--src/player_controller/gdlibrary.cpp17
-rw-r--r--src/player_controller/gdlibrary.osbin0 -> 406904 bytes
-rw-r--r--src/player_controller/playercam.cpp107
-rw-r--r--src/player_controller/playercam.h43
-rw-r--r--src/player_controller/playercam.osbin0 -> 413784 bytes
-rw-r--r--src/player_controller/playercontroller.cpp (renamed from src/playercontroller.cpp)100
-rw-r--r--src/player_controller/playercontroller.h (renamed from src/playercontroller.h)16
11 files changed, 235 insertions, 50 deletions
diff --git a/src/player_controller/.sconsign.dblite b/src/player_controller/.sconsign.dblite
new file mode 100644
index 0000000..577a41d
--- /dev/null
+++ b/src/player_controller/.sconsign.dblite
Binary files differ
diff --git a/src/PlayerController.gd b/src/player_controller/PlayerController.gd
index 241cbe0..241cbe0 100644
--- a/src/PlayerController.gd
+++ b/src/player_controller/PlayerController.gd
diff --git a/src/player_controller/SConstruct b/src/player_controller/SConstruct
index f4bb318..119ad0b 100644
--- a/src/player_controller/SConstruct
+++ b/src/player_controller/SConstruct
@@ -12,7 +12,7 @@ opts.Add(EnumVariable('platform', "Compilation platform", '', ['', 'windows', 'x
opts.Add(EnumVariable('p', "Compilation target, alias for 'platform'", '', ['', 'windows', 'x11', 'linux', 'osx']))
opts.Add(BoolVariable('use_llvm', "Use the LLVM / Clang compiler", 'no'))
opts.Add(PathVariable('target_path', 'The path where the lib is installed.', '../../godot/bin/'))
-opts.Add(PathVariable('target_name', 'The library name.', 'libgdexample', PathVariable.PathAccept))
+opts.Add(PathVariable('target_name', 'The library name.', 'libplayercontroller', PathVariable.PathAccept))
# Local dependency paths, adapt them to your setup
godot_headers_path = "../../godot-cpp/godot-headers/"
diff --git a/src/player_controller/player_controller.h b/src/player_controller/___player_controller.h
index 2514f79..2514f79 100644
--- a/src/player_controller/player_controller.h
+++ b/src/player_controller/___player_controller.h
diff --git a/src/player_controller/gdlibrary.cpp b/src/player_controller/gdlibrary.cpp
new file mode 100644
index 0000000..13bc8a1
--- /dev/null
+++ b/src/player_controller/gdlibrary.cpp
@@ -0,0 +1,17 @@
+#include "playercam.h"
+#include "playercontroller.h"
+
+extern "C" void GDN_EXPORT godot_gdnative_init(godot_gdnative_init_options *o) {
+ godot::Godot::gdnative_init(o);
+}
+
+extern "C" void GDN_EXPORT godot_gdnative_terminate(godot_gdnative_terminate_options *o) {
+ godot::Godot::gdnative_terminate(o);
+}
+
+extern "C" void GDN_EXPORT godot_nativescript_init(void *handle) {
+ godot::Godot::nativescript_init(handle);
+
+ godot::register_class<godot::PlayerCam>();
+ godot::register_class<godot::PlayerController>();
+}
diff --git a/src/player_controller/gdlibrary.os b/src/player_controller/gdlibrary.os
new file mode 100644
index 0000000..c984489
--- /dev/null
+++ b/src/player_controller/gdlibrary.os
Binary files differ
diff --git a/src/player_controller/playercam.cpp b/src/player_controller/playercam.cpp
new file mode 100644
index 0000000..f321c09
--- /dev/null
+++ b/src/player_controller/playercam.cpp
@@ -0,0 +1,107 @@
+#include "playercam.h"
+#include "InputEventMouseMotion.hpp"
+
+
+using namespace godot;
+
+PlayerCam::PlayerCam () { }
+PlayerCam::~PlayerCam () { }
+
+void PlayerCam::_register_methods() {
+ register_method("_ready", &PlayerCam::_ready);
+ register_method("_input", &PlayerCam::_input);
+ register_method("attach", &PlayerCam::attach);
+ register_method("mouse_firstperson", &PlayerCam::mouse_firstperson);
+ register_method("mouse_thirdperson", &PlayerCam::mouse_thirdperson);
+ register_method("mouse_arm", &PlayerCam::mouse_arm);
+ register_method("mouse_freecam", &PlayerCam::mouse_freecam);
+}
+
+void PlayerCam::_init() {
+ mode = String("STATIC");
+ head = nullptr;
+ neck = nullptr;
+ player = nullptr;
+ arm = nullptr;
+ mouse_axis = Vector2::ZERO;
+ mouse_sensitivity = 12.0;
+}
+
+void PlayerCam::_ready() {
+ Input *input_singleton = Input::get_singleton();
+ input_singleton->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
+ set_current(true);
+}
+
+void PlayerCam::_input(const Ref<InputEvent> event) {
+ Input const *input_singleton = Input::get_singleton();
+ Ref<InputEventMouseMotion> event_m(event);
+ if(event_m.is_valid() && input_singleton->get_mouse_mode() == Input::MOUSE_MODE_CAPTURED){
+ mouse_axis = event_m->get_relative();
+ if(mode == "FIRSTPERSON")mouse_firstperson();
+ else if(mode == "THIRDPERSON")mouse_thirdperson();
+ else if(mode == "STATIC");
+ else if(mode == "ARM")mouse_arm();
+ else if(mode == "FREECAM")mouse_freecam();
+ }
+}
+
+void PlayerCam::attach(Node* new_parent, String c_mode, String extra_path) {
+ if(get_parent() != nullptr)
+ get_parent()->remove_child(this);
+ if(c_mode == "FIRSTPERSON") {
+ head = (Spatial*)new_parent->find_node("Head", true, false); neck = (Spatial*)new_parent->find_node("Neck", true, false);
+ arm = nullptr; mode = c_mode;
+ }
+ else if (c_mode == "THIRDPERSON") {
+ head = (Spatial*)new_parent->find_node("Head", true, false); neck = (Spatial*)new_parent->find_node("Neck", true, false);
+ arm = (SpringArm*)new_parent->find_node("SpringArm", true, false); mode = c_mode;
+ }
+ else if(c_mode == "ARM") {
+ head = nullptr; neck = nullptr;
+ arm = (SpringArm*)new_parent->find_node("SpringArm", true, false); mode = c_mode;
+ }
+ else {
+ head = nullptr; neck = nullptr; arm = nullptr;
+ }
+ new_parent->get_node(NodePath(extra_path))->add_child(this);
+ set_transform(Transform::IDENTITY);
+}
+
+void PlayerCam::mouse_firstperson() {
+ if(mouse_axis.length_squared() > 0.0){
+ float horizontal = -mouse_axis.x * (mouse_sensitivity / 100.0);
+ float vertical = -mouse_axis.y * (mouse_sensitivity / 100.0);
+
+ neck->rotate_y(Math::deg2rad(horizontal));
+ head->rotate_x(Math::deg2rad(vertical));
+
+ //vertical clamp
+ Vector3 new_rot = head->get_rotation_degrees();
+ new_rot.x = Math::clamp((double)new_rot.x, -90.0, 90.0);
+ head->set_rotation_degrees(new_rot);
+ }
+}
+
+void PlayerCam::mouse_thirdperson() {
+ Vector3 new_arm_rot = arm->get_rotation_degrees();
+ new_arm_rot.x = Math::clamp((double)(get_rotation_degrees().x-mouse_axis.y*(mouse_sensitivity / 100)),-90.0,90.0);
+ new_arm_rot.y -= mouse_axis.x*(mouse_sensitivity / 100.0);
+ arm->set_rotation_degrees(new_arm_rot);
+ Vector3 new_head_rot = Vector3(arm->get_rotation_degrees().x, 0, 0);
+ Vector3 new_neck_rot = Vector3(0, arm->get_rotation_degrees().y, 0);
+
+ head->set_rotation_degrees(new_head_rot);
+ neck->set_rotation_degrees(new_neck_rot);
+}
+
+void PlayerCam::mouse_arm() {
+ //arm->rotation_degrees.x = Math::clamp(rotation_degrees.x-mouse_axis.y*(mouse_sensitivity / 100),-70,70);
+ //arm->rotation_degrees.y -= mouse_axis.x*(mouse_sensitivity / 100);
+}
+
+void PlayerCam::mouse_freecam() {
+// pass
+}
+
+
diff --git a/src/player_controller/playercam.h b/src/player_controller/playercam.h
new file mode 100644
index 0000000..dd089de
--- /dev/null
+++ b/src/player_controller/playercam.h
@@ -0,0 +1,43 @@
+#ifndef PLAYERCAMGDS_H
+#define PLAYERCAMGDS_H
+
+#include <Godot.hpp>
+#include <ClippedCamera.hpp>
+#include <RigidBody.hpp>
+#include <SpringArm.hpp>
+#include <Input.hpp>
+
+namespace godot {
+
+class PlayerCam : public ClippedCamera {
+ GODOT_CLASS(PlayerCam, ClippedCamera)
+
+private:
+ String mode;
+ Spatial* head;
+ Spatial* neck;
+ RigidBody* player;
+ SpringArm* arm;
+ Vector2 mouse_axis;
+ float mouse_sensitivity;
+
+public:
+ static void _register_methods();
+
+ PlayerCam();
+ ~PlayerCam();
+
+ void _init();
+
+ void _ready();
+ void _input(const Ref<InputEvent> event);
+ void attach(Node* new_parent, String c_mode, String extra_path = ".");
+ void mouse_firstperson();
+ void mouse_thirdperson();
+ void mouse_arm();
+ void mouse_freecam();
+
+};
+
+}
+#endif
diff --git a/src/player_controller/playercam.os b/src/player_controller/playercam.os
new file mode 100644
index 0000000..2b88b46
--- /dev/null
+++ b/src/player_controller/playercam.os
Binary files differ
diff --git a/src/playercontroller.cpp b/src/player_controller/playercontroller.cpp
index af8aa5a..6ea5544 100644
--- a/src/playercontroller.cpp
+++ b/src/player_controller/playercontroller.cpp
@@ -1,4 +1,7 @@
#include "playercontroller.h"
+#include <ResourceLoader.hpp>
+#include <PackedScene.hpp>
+#include <Input.hpp>
using namespace godot;
@@ -50,7 +53,7 @@ void PlayerController::_init() {
floorspeed = Vector3::ZERO;
jumping = false;
can_jump = true;
- FLOOR_MAX_ANGLE = deg2rad(46.0);
+ FLOOR_MAX_ANGLE = Math::deg2rad(46.0);
in_water = false;
swim_speed = 450.0;
climb_speed = 5.0;
@@ -71,9 +74,11 @@ void PlayerController::_ready() {
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)
- world = get_tree()->get_root()->get_node("GAMEWORLD")
+ Ref<PackedScene> p = ResourceLoader::get_singleton()->load("res://scenes/weapons/w_Rockets.tscn");
+ weapon = (Node *)p->instance();
+ add_child(weapon);
+ world = get_tree()->get_root()->get_node<Spatial>("GAMEWORLD");
+ cam = (PlayerCam *)world->call("get_cam");
}
Dictionary PlayerController::get_init_info() {
@@ -99,6 +104,7 @@ void PlayerController::_process(float _delta) {
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");
+ }
}
}
@@ -106,11 +112,11 @@ void PlayerController::initiate_use() {
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();
+ const Node *area_c = (Node *) 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()});
+ world->rpc_id(1, "_call_on_server", "_client_request_control_vehicle", Dictionary::make("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());
+ mount_ladder((Spatial *)area_c->get_parent());
else if(area_c->get_name() == "TugArea")return;
else if(area_c->get_name() == "PickupArea")return;
}
@@ -120,13 +126,13 @@ void PlayerController::set_net_owner(int owner_id) {
nametag->set_text("");
set_network_master(owner_id);
if(owner_id != 1)
- nametag->set_text(String(world->get_players_info()[owner_id][0]));
+ nametag->set_text(String(world->call("get_players_info")[owner_id][0]));
if(get_tree()->get_network_unique_id() != 1){
- if(owner_id == world->get_client_id()){
+ if(owner_id == (int)world->call("get_client_id")){
nametag->set_visible(false);
- world.player_char = self;
+ world->call("set_player_char", this);
is_player = true;
- world.cam.attach(this, "FIRSTPERSON", "./Neck/Head");
+ cam->attach(this, "FIRSTPERSON", "./Neck/Head");
}else{
nametag->set_visible(true);
is_player = false;
@@ -136,10 +142,11 @@ void PlayerController::set_net_owner(int owner_id) {
}
void PlayerController::deselect_character() {
- 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)
+ if(is_network_master()){
+ world->call("set_player_char", nullptr);
+ if((int)world->call("get_client_id") != 1)cam->attach(world, "STATIC", "./DEFAULTCAM");
+ rpc("set_net_owner", 1);
+ }
}
void PlayerController::take_control_of_machine(RigidBody *slave_machine) {
@@ -148,7 +155,7 @@ void PlayerController::take_control_of_machine(RigidBody *slave_machine) {
}
void PlayerController::lose_machine() {
- if is_network_master()world.cam.attach(self, "FIRSTPERSON", "./Neck/Head");
+ if(is_network_master())cam->attach(this, "FIRSTPERSON", "./Neck/Head");
controlling_machine = false;
machine = nullptr;
}
@@ -236,14 +243,14 @@ void PlayerController::jump() {
void PlayerController::swim(float _delta) {
// #drag and buoyancy
- add_central_force(Vector3.UP*weight*1.0);
- add_central_force(-1*linear_velocity*100);
+ add_central_force(Vector3::UP*weight);
+ add_central_force(-100*linear_velocity);
// #controls
Basis dir = head->get_global_transform().basis;
Vector3 m_dir = -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*get_weight()*0.5);
+ if(jumping) add_central_force(Vector3::UP*get_weight()*0.5);
}
void PlayerController::enter_water() {
@@ -254,35 +261,37 @@ void PlayerController::exit_water() {
in_water = false;
}
-void PlayerController::mount_ladder(Spatial target_ladder) {
-// var ladder_tracker = Spatial.new()
-// ladder_tracker.name = name
-// target_ladder.add_child(ladder_tracker)
-// ladder_tracker.transform = target_ladder.bottom.transform
-//
-// ladder_tracker.global_transform.origin = target_ladder.get_nearest_point_to_route(global_transform.origin)
-// look_at(global_transform.origin + target_ladder.global_transform.basis.x, target_ladder.global_transform.basis.y)
-//
-// ladder_m = ladder_tracker
-// global_transform.origin = ladder_m.global_transform.origin
-// global_transform.basis = ladder_m.global_transform.basis.orthonormalized()
-// linear_velocity = Vector3.ZERO
-// set_gravity_scale(0.0)
+void PlayerController::mount_ladder(Spatial *target_ladder) {
+ Spatial *ladder_tracker = Spatial::new();
+ ladder_tracker->name = get_name();
+ target_ladder->add_child(ladder_tracker);
+ ladder_tracker->set_transform(target_ladder->get_node<Spatial>("BOTTOM")->get_transform();
+
+ ladder_tracker->set_global_transform( Transform(target_ladder->call("get_nearest_point_to_route", get_global_transform().origin), ladder_tracker->get_global_transform().basis ) );
+ look_at(get_global_transform().origin + target_ladder->get_global_transform().basis.x, target_ladder->get_global_transform().basis.y)
+
+ ladder_m = ladder_tracker;
+ Transform t = ladder_m->get_global_transform();
+ set_global_transform( Transform(t.origin, t.basis.orthonormalized()));
+ set_linear_velocity(Vector3::ZERO);
+ set_gravity_scale(0.0);
}
void PlayerController::climb_ladder(float delta) {
-// var new_ladder_pos = ladder_m.global_transform.origin + ladder_m.global_transform.basis.y.normalized() * move_axis.x * delta * climb_speed
-// var prog = ladder_m.get_parent().get_climb_scalar(new_ladder_pos)
-// if prog >= 0.0 and prog <= 1.0:
-// ladder_m.global_transform.origin = new_ladder_pos
-// global_transform.origin = ladder_m.global_transform.origin
-// global_transform.basis = ladder_m.global_transform.basis.orthonormalized()
+ Vector3 new_ladder_pos = ladder_m->get_global_transform().origin + ladder_m->get_global_transform().basis.y.normalized() * move_axis.x * delta * climb_speed;
+ float prog = ladder_m->get_parent()->call("get_climb_scalar", new_ladder_pos)
+ if(prog >= 0.0 and && <= 1.0)
+ ladder_m->set_global_transform(Transform(new_ladder_pos, ladder_m->get_global_transform().basis));
+ Transform t = ladder_m->get_global_transform();
+ set_global_transform( Transform(t.origin, t.basis.orthonormalized()));
}
void PlayerController::leave_ladder() {
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
+ Transform t = get_global_transform();
+ t.basis = world->get_global_transform().basis;
+ set_global_transform(t);
set_gravity_scale(1.0);
ladder_m->queue_free();
ladder_m = nullptr;
@@ -290,15 +299,16 @@ void PlayerController::leave_ladder() {
void PlayerController::damage(int dmg_amt, String _type, Array shooter, String extra = ".") {
health -= dmg_amt;
+ int shooter_id = shooter[0];
+ String shooter_text = shooter[1];
if(health <= 0 && is_network_master()){
- if(shooter[0] != get_network_master() and shooter[0] != 1) world.rpc_id(shooter[0], "game_killsound");
+ if(shooter_id != get_network_master() && shooter_id != 1) world->rpc_id(shooter_id, "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});
+ world->call("_call_on_server", "_character_death", Dictionary::make("killer_id", shooter_id, "killer", shooter_text, "victim_mp_id", get_network_master(), "victim", get_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});
+ world->rpc_id(1, "_call_on_server", "_character_death", Dictionary::make("killer_id", shooter_id, "killer", shooter_text, "victim_mp_id", get_network_master(), "victim", get_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");
- }
+ if(shooter_id != get_network_master() && shooter_id != 1) world->rpc_id(shooter_id, "game_hitsound");
}
void PlayerController::remove_dead_character() {
diff --git a/src/playercontroller.h b/src/player_controller/playercontroller.h
index b373db8..402f7d3 100644
--- a/src/playercontroller.h
+++ b/src/player_controller/playercontroller.h
@@ -1,8 +1,16 @@
#ifndef PLAYERCONTROLLER_H
#define PLAYERCONTROLLER_H
+#include "playercam.h"
#include <Godot.hpp>
#include <RigidBody.hpp>
+#include <RayCast.hpp>
+#include <NavigationAgent.hpp>
+#include <PhysicsDirectBodyState.hpp>
+#include <Label3D.hpp>
+#include <SceneTree.hpp>
+#include <Viewport.hpp>
+#include <ClippedCamera.hpp>
namespace godot {
@@ -14,6 +22,7 @@ private:
int health;
Node *weapon;
Spatial *world;
+ PlayerCam *cam;
float mouse_sensitivity;
float FOV;
Vector2 mouse_axis;
@@ -23,11 +32,11 @@ private:
Label3D *nametag;
Vector3 velocity;
Vector3 direction;
- Vector3 move_axis;
+ Vector2 move_axis;
Vector3 floorspeed;
bool jumping;
bool can_jump;
- NavigationAgent nav;
+ NavigationAgent *nav;
float FLOOR_MAX_ANGLE;
float jump_height;
bool in_water;
@@ -62,7 +71,7 @@ public:
void initiate_use();
void set_net_owner(int owner_id);
void deselect_character();
- void take_control_of_machine(RigidBody slave_machine);
+ void take_control_of_machine(RigidBody *slave_machine);
void lose_machine();
void _physics_process(float delta);
bool on_floor_test();
@@ -78,7 +87,6 @@ public:
void damage(int dmg_amt, String _type, Array shooter, String extra);
void remove_dead_character();
void net_apply_impulse(Vector3 impulse_v);
-
};
}