diff options
| author | Anson Bridges <bridges.anson@gmail.com> | 2022-09-20 17:35:31 -0400 |
|---|---|---|
| committer | Anson Bridges <bridges.anson@gmail.com> | 2022-09-20 17:35:31 -0400 |
| commit | 123c1a2d9a5034902468b9f3ae5a139fff5c2f95 (patch) | |
| tree | 63125c587350495dfd1357dff4afc04e2796257f | |
| parent | 586817664cebbe670081eea0cb0a0fe2f33adfce (diff) | |
moving stuff off of laptop
| -rw-r--r-- | src/player_controller/.sconsign.dblite | bin | 0 -> 27268 bytes | |||
| -rw-r--r-- | src/player_controller/PlayerController.gd (renamed from src/PlayerController.gd) | 0 | ||||
| -rw-r--r-- | src/player_controller/SConstruct | 2 | ||||
| -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.cpp | 17 | ||||
| -rw-r--r-- | src/player_controller/gdlibrary.os | bin | 0 -> 406904 bytes | |||
| -rw-r--r-- | src/player_controller/playercam.cpp | 107 | ||||
| -rw-r--r-- | src/player_controller/playercam.h | 43 | ||||
| -rw-r--r-- | src/player_controller/playercam.os | bin | 0 -> 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 Binary files differnew file mode 100644 index 0000000..577a41d --- /dev/null +++ b/src/player_controller/.sconsign.dblite 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 Binary files differnew file mode 100644 index 0000000..c984489 --- /dev/null +++ b/src/player_controller/gdlibrary.os 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 Binary files differnew file mode 100644 index 0000000..2b88b46 --- /dev/null +++ b/src/player_controller/playercam.os 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); - }; } |
