NSActor: add SwitchToBestWeapon(bool ignoreCurrent)
This commit is contained in:
parent
0adf97e2de
commit
c3f527d5e5
2 changed files with 54 additions and 7 deletions
|
@ -110,6 +110,7 @@ public:
|
||||||
nonvirtual void SwitchToWeapon(string);
|
nonvirtual void SwitchToWeapon(string);
|
||||||
/** Switches the entity to use the desired weapon. */
|
/** Switches the entity to use the desired weapon. */
|
||||||
nonvirtual void SwitchToExactWeapon(NSWeapon);
|
nonvirtual void SwitchToExactWeapon(NSWeapon);
|
||||||
|
nonvirtual void SwitchToBestWeapon(bool);
|
||||||
|
|
||||||
nonvirtual void LaunchProjectile(string, bool, float);
|
nonvirtual void LaunchProjectile(string, bool, float);
|
||||||
nonvirtual bool PlantCharge(string);
|
nonvirtual bool PlantCharge(string);
|
||||||
|
|
|
@ -746,7 +746,7 @@ NSActor::GiveItem(string itemName)
|
||||||
/* TODO: Replace this with a 'SwitchBest' type function? */
|
/* TODO: Replace this with a 'SwitchBest' type function? */
|
||||||
/* we have no active weapon, and this is our pick */
|
/* we have no active weapon, and this is our pick */
|
||||||
if (!m_activeWeapon) {
|
if (!m_activeWeapon) {
|
||||||
SwitchToExactWeapon((NSWeapon)linkedList);
|
SwitchToBestWeapon(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* items (not weapons) may not be added permanently by default */
|
/* items (not weapons) may not be added permanently by default */
|
||||||
|
@ -760,6 +760,53 @@ NSActor::GiveItem(string itemName)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
NSActor::SwitchToBestWeapon(bool ignoreActive)
|
||||||
|
{
|
||||||
|
string toIgnore = __NULL__;
|
||||||
|
NSItem linkedList = __NULL__;
|
||||||
|
NSItem bestWeapon = __NULL__;
|
||||||
|
float bestWeight = 0.0f;
|
||||||
|
|
||||||
|
if (ignoreActive && m_activeWeapon) {
|
||||||
|
toIgnore = m_activeWeapon.classname;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we posess nothing. auto return false. */
|
||||||
|
if (!m_itemList) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* iterate over all the inventory items */
|
||||||
|
linkedList = m_itemList;
|
||||||
|
|
||||||
|
while (linkedList) {
|
||||||
|
/* inventory item may not be a weapon */
|
||||||
|
if (linkedList.IsWeapon()) {
|
||||||
|
string weaponName = linkedList.classname;
|
||||||
|
float weight;
|
||||||
|
|
||||||
|
if (toIgnore == weaponName) {
|
||||||
|
linkedList = linkedList.chain;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
weight = stof(EntityDef_GetKeyValue(weaponName, "weight"));
|
||||||
|
|
||||||
|
if (weight > bestWeight) {
|
||||||
|
bestWeight = weight;
|
||||||
|
bestWeapon = linkedList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
linkedList = linkedList.chain;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bestWeapon) {
|
||||||
|
SwitchToExactWeapon(bestWeapon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
NSActor::RemoveItem(string itemName)
|
NSActor::RemoveItem(string itemName)
|
||||||
{
|
{
|
||||||
|
@ -775,6 +822,11 @@ NSActor::RemoveItem(string itemName)
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* prevent nonsense */
|
||||||
|
if (GetCurrentWeapon() == itemName) {
|
||||||
|
SwitchToBestWeapon(true);
|
||||||
|
}
|
||||||
|
|
||||||
/* since we have something in the inventory, start there */
|
/* since we have something in the inventory, start there */
|
||||||
linkedList = m_itemList;
|
linkedList = m_itemList;
|
||||||
|
|
||||||
|
@ -793,12 +845,6 @@ NSActor::RemoveItem(string itemName)
|
||||||
|
|
||||||
/* successfully remove the last item */
|
/* successfully remove the last item */
|
||||||
if (removeItem == true) {
|
if (removeItem == true) {
|
||||||
/* Is the item our active weapon? Handle graceful removal. */
|
|
||||||
if (m_activeWeapon == itemToRemove) {
|
|
||||||
m_activeWeapon._SwitchedFromCallback();
|
|
||||||
m_activeWeapon = __NULL__;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we had an item in front, bridge across the removed item. */
|
/* we had an item in front, bridge across the removed item. */
|
||||||
if (frontItem) {
|
if (frontItem) {
|
||||||
frontItem.chain = (NSItem)itemToRemove.chain;
|
frontItem.chain = (NSItem)itemToRemove.chain;
|
||||||
|
|
Loading…
Reference in a new issue