#include "weapon_inventory.h" #include "macros.h" #include "weapon_base.h" void WeaponInventory::_bind_methods() { BIND_HPROPERTY(Variant::OBJECT, fallback_weapon, PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"); } void WeaponInventory::on_switch_input() { this->current = (this->current + 1) % 1; this->select_weapon(this->weapons[this->current]); } void WeaponInventory::ready() { // initialize the fallback weapon this->weapon_parent = cast_to(get_node(NodePath("%PlayerCamera"))); if (this->fallback_weapon_scene.is_valid()) { Node *fallback_as_node{ this->fallback_weapon_scene->instantiate() }; this->weapon_parent->add_child(fallback_as_node); if ((this->fallback_weapon = cast_to(fallback_as_node))) { this->select_weapon(this->fallback_weapon); } else if (fallback_as_node != nullptr) { fallback_as_node->queue_free(); } } if (this->fallback_weapon == nullptr) { print_error("WeaponInventory::ready(): fallback weapon is invalid, expect unintended behaviour."); } } void WeaponInventory::_notification(int what) { if (Engine::get_singleton()->is_editor_hint()) { return; } switch (what) { default: return; case NOTIFICATION_READY: ready(); return; } } void WeaponInventory::set_fallback_weapon(Ref scene) { this->fallback_weapon_scene = scene; } Ref WeaponInventory::get_fallback_weapon() const { return this->fallback_weapon_scene; } void WeaponInventory::select_weapon(WeaponBase *new_weapon) { if (new_weapon == nullptr) { new_weapon = this->fallback_weapon; } if (this->current_weapon != nullptr) { this->current_weapon->set_process_mode(PROCESS_MODE_DISABLED); this->current_weapon->set_visible(false); } this->current_weapon = new_weapon; if (new_weapon != nullptr) { this->current_weapon->set_process_mode(PROCESS_MODE_PAUSABLE); this->current_weapon->set_visible(true); this->current_weapon->notify_selected(); if (new_weapon == this->weapons[0]) { this->current = 0; } else if (new_weapon == this->weapons[1]) { this->current = 1; } else { print_error("WeaponInventory::select_weapon: Attempt to select weapon that is not in inventory"); } } } WeaponBase *WeaponInventory::get_current_weapon() const { return this->current_weapon; } void WeaponInventory::pickup_weapon(Ref weapon_scene) { Node *weapon_as_node{ weapon_scene->instantiate() }; if (WeaponBase * weapon{ cast_to(weapon_as_node) }) { if (this->weapons[0] == nullptr) { this->weapons[0] = weapon; select_weapon(weapon); return; } else if (this->weapons[1] == nullptr) { this->weapons[1] = weapon; select_weapon(weapon); return; } else { this->current_weapon->queue_free(); this->weapons[this->current] = weapon; this->current_weapon = nullptr; select_weapon(weapon); } } else if (weapon_as_node != nullptr) { weapon_as_node->queue_free(); } }