From e2f3e4bd7118c8f55d20b29d76cb9a13acf72f8b Mon Sep 17 00:00:00 2001 From: Anson Bridges Date: Thu, 8 Sep 2022 16:42:07 -0400 Subject: gdnative testing. gdnative classes cannot be extended by gdscript --- src/networked_entities/networked_machine.cpp | 77 ++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/networked_entities/networked_machine.cpp (limited to 'src/networked_entities/networked_machine.cpp') 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 +#include +#include + +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"); +} -- cgit v1.2.3