feat: implementations of initial weapon inventory interface
This commit is contained in:
parent
6cdb2cbd4f
commit
6fa9d11af5
12 changed files with 126 additions and 11 deletions
|
|
@ -1,10 +1,99 @@
|
|||
#include "weapon_inventory.h"
|
||||
#include "macros.h"
|
||||
#include "weapon_base.h"
|
||||
|
||||
void WeaponInventory::_bind_methods() {}
|
||||
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<Node3D>(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<WeaponBase>(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<PackedScene> scene) {
|
||||
this->fallback_weapon_scene = scene;
|
||||
}
|
||||
|
||||
Ref<PackedScene> 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<PackedScene> weapon_scene) {
|
||||
Node *weapon_as_node{ weapon_scene->instantiate() };
|
||||
if (WeaponBase *weapon{ cast_to<WeaponBase>(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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue