summaryrefslogtreecommitdiff
path: root/src/networked_entities/networked_machine.cpp
diff options
context:
space:
mode:
authorAnson Bridges <bridges.anson@gmail.com>2022-09-08 16:42:07 -0400
committerAnson Bridges <bridges.anson@gmail.com>2022-09-08 16:42:07 -0400
commite2f3e4bd7118c8f55d20b29d76cb9a13acf72f8b (patch)
treec2f177c7fc11d26f65f05f96e0a2a1996b4598ce /src/networked_entities/networked_machine.cpp
parent366761197034a20d444282431e4a8edeb7882840 (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.cpp77
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");
+}