diff options
| author | Anson Bridges <bridges.anson@gmail.com> | 2022-09-08 16:42:07 -0400 |
|---|---|---|
| committer | Anson Bridges <bridges.anson@gmail.com> | 2022-09-08 16:42:07 -0400 |
| commit | e2f3e4bd7118c8f55d20b29d76cb9a13acf72f8b (patch) | |
| tree | c2f177c7fc11d26f65f05f96e0a2a1996b4598ce /src/networked_entities/networked_machine.cpp | |
| parent | 366761197034a20d444282431e4a8edeb7882840 (diff) | |
gdnative testing. gdnative classes cannot be extended by gdscript
Diffstat (limited to 'src/networked_entities/networked_machine.cpp')
| -rw-r--r-- | src/networked_entities/networked_machine.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/networked_entities/networked_machine.cpp b/src/networked_entities/networked_machine.cpp new file mode 100644 index 0000000..3796f48 --- /dev/null +++ b/src/networked_entities/networked_machine.cpp @@ -0,0 +1,77 @@ +#include "networked_machine.h" + +#include <SceneTree.hpp> +#include <Viewport.hpp> +#include <PhysicsDirectBodyState.hpp> + +using namespace godot; + +void NetworkedMachine::_register_methods() { + register_method("_ready", &NetworkedMachine::_ready); + register_method("_integrate_forces", &NetworkedMachine::_integrate_forces); + register_method("relinquish_control", &NetworkedMachine::relinquish_control); + register_method("on_new_control", &NetworkedMachine::on_new_control); + register_method("on_no_control", &NetworkedMachine::on_no_control); + register_method("attack1", &NetworkedMachine::attack1); + register_method("attack2", &NetworkedMachine::attack2); + register_method("direction_input", &NetworkedMachine::direction_input); + + register_method("update_phys_transform", &NetworkedMachine::update_phys_transform, GODOT_METHOD_RPC_MODE_SYNC); + register_method("net_apply_impulse", &NetworkedMachine::net_apply_impulse, GODOT_METHOD_RPC_MODE_REMOTESYNC); + register_method("set_net_owner", &NetworkedMachine::set_net_owner, GODOT_METHOD_RPC_MODE_REMOTESYNC); +} + +NetworkedMachine::NetworkedMachine () { } + +NetworkedMachine::~NetworkedMachine () { } + +void NetworkedMachine::_init() { + in_use = false; + user = nullptr; + world = nullptr; +} + +void NetworkedMachine::_ready() { + world = (Spatial *)get_tree()->get_root()->find_node("GAMEWORLD"); +} + +void NetworkedMachine::update_phys_transform(Transform t, Vector3 lv, Vector3 av) { + set_transform(t); + set_linear_velocity(lv); + set_angular_velocity(av); +} + +void NetworkedMachine::net_apply_impulse(Vector3 impulse_v) { + apply_central_impulse(impulse_v); +} + +void NetworkedMachine::_integrate_forces(PhysicsDirectBodyState *_state) { + if(is_network_master() && get_mode() == RigidBody::MODE_RIGID) { + rpc("update_phys_transform", get_transform(), get_linear_velocity(), get_angular_velocity()); + } +} + +void NetworkedMachine::set_net_owner(int id, String char_name) { + set_network_master(id); + if (id == 1 && char_name == "NODE") { + on_no_control(); + if (user != nullptr) { + user->call("lose_machine"); + } + user = nullptr; + in_use = false; + } else { + in_use = true; + String player_path_s = String("PLAYERS/") + char_name; + NodePath player_path = NodePath(player_path_s); + user = (RigidBody *)world->get_node(player_path); + user->call("take_control_of_machine", (RigidBody *) this); + if(is_network_master()) { + on_new_control(); + } + } +} + +void NetworkedMachine::relinquish_control() { + rpc("set_net_owner", 1, "NONE"); +} |
