Files
HeroesStone_PRC8/_module/nss/loot_h.nss
Jaysyn904 1eefc84201 Initial Commit
Initial Commit.
2025-09-14 15:40:46 -04:00

253 lines
6.2 KiB
Plaintext

//void main() {}
//::///////////////////////////////////////////////
//:: Name Lootable include file
//:: FileName loot_h
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
//:: Created By: Sentur Signe
//:://////////////////////////////////////////////
const float fLOOT_DELAY_BEFORE_DECAY = 60.0f;
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
const string sCORPE_PLACEABLE_RESREF = "loot_corpse";
object LOOT_GetFirstItemInSlots(object oOwner);
object LOOT_GetNextItemInSlots(object oOwner);
void LOOT_MobDecay(object oRemains);
void LOOT_OpenCorpse()
{
if ( GetLocalInt(OBJECT_SELF, "bReady") == TRUE ) return;
object oItem, oNewItem;
object oOwner = GetLocalObject(OBJECT_SELF, "oOwner");
int nItemCounter = 0;
oItem = GetFirstItemInInventory(oOwner);
while (oItem != OBJECT_INVALID)
{
if (GetDroppableFlag(oItem) == TRUE)
{
oNewItem = CopyItem(oItem, OBJECT_SELF);
SetLocalObject(oNewItem, "oOriginal", oItem);
SetDroppableFlag(oItem, FALSE);
if (GetPlotFlag(oItem) == FALSE)
{
SetLocalObject(oOwner, IntToString(nItemCounter)+"_pt", oNewItem);
nItemCounter++;
}
else
{
SetPlotFlag(oItem, FALSE);
SetPlotFlag(oNewItem, TRUE);
}
}
oItem = GetNextItemInInventory(oOwner);
}
oItem = LOOT_GetFirstItemInSlots(oOwner);
while (oItem != OBJECT_INVALID)
{
if (GetDroppableFlag(oItem) == TRUE)
{
oNewItem = CopyItem(oItem, OBJECT_SELF);
SetLocalObject(oNewItem, "oOriginal", oItem);
SetDroppableFlag(oItem, FALSE);
if (GetPlotFlag(oItem) == FALSE)
{
SetLocalObject(oOwner, IntToString(nItemCounter)+"_pt", oNewItem);
nItemCounter++;
}
else
{
SetPlotFlag(oNewItem, TRUE);
}
}
oItem = LOOT_GetNextItemInSlots(oOwner);
}
SetLocalInt(oOwner, "nNbOfItem", nItemCounter);
SetLocalInt(OBJECT_SELF, "bReady", TRUE);
object oRemains = OBJECT_SELF;
AssignCommand(oOwner, DelayCommand(fLOOT_DELAY_BEFORE_DECAY, LOOT_MobDecay(oRemains)));
}
void LOOT_CloseCorpse()
{
if ( GetLocalInt(OBJECT_SELF, "bReady") != TRUE ) return;
object oItem = GetFirstItemInInventory(OBJECT_SELF);
if (oItem == OBJECT_INVALID)
{
SetPlotFlag(OBJECT_SELF, FALSE);
object oOwner = GetLocalObject(OBJECT_SELF, "oOwner");
AssignCommand(oOwner, DelayCommand(fLOOT_DELAY_BEFORE_DECAY, LOOT_MobDecay(OBJECT_INVALID)));
DestroyObject(OBJECT_SELF, 2.0f);
}
}
void LOOT_OnAcquired()
{
object oItem = GetModuleItemAcquired();
AssignCommand(GetModuleItemAcquiredBy(), PlayAnimation(ANIMATION_LOOPING_GET_LOW));
object oOriginal = GetLocalObject(oItem, "oOriginal");
if ( oOriginal != OBJECT_INVALID)
{
SetPlotFlag(oOriginal, FALSE);
DestroyObject(oOriginal);
}
}
object LOOT_GetNextItemInSlots(object oOwner)
{
int nLastSlotIndex = GetLocalInt(OBJECT_SELF, "nLastSlotIndex");
SetLocalInt(OBJECT_SELF, "nLastSlotIndex", nLastSlotIndex+1);
int nSlot = 0;
object oItem;
while (nSlot != -1)
{
switch(nLastSlotIndex)
{
case 0:
nSlot = INVENTORY_SLOT_RIGHTHAND;
break;
case 1:
nSlot = INVENTORY_SLOT_LEFTHAND;
break;
case 2:
nSlot = INVENTORY_SLOT_HEAD;
break;
case 3:
nSlot = INVENTORY_SLOT_NECK;
break;
case 4:
nSlot = INVENTORY_SLOT_CLOAK;
break;
case 5:
nSlot = INVENTORY_SLOT_BELT;
break;
case 6:
nSlot = INVENTORY_SLOT_BOOTS;
break;
case 7:
nSlot = INVENTORY_SLOT_ARROWS;
break;
case 8:
nSlot = INVENTORY_SLOT_BOLTS;
break;
case 9:
nSlot = INVENTORY_SLOT_BULLETS;
break;
case 10:
nSlot = INVENTORY_SLOT_ARMS;
break;
case 11:
nSlot = INVENTORY_SLOT_CHEST;
break;
case 12:
nSlot = INVENTORY_SLOT_RIGHTRING;
break;
case 13:
nSlot = INVENTORY_SLOT_LEFTRING;
break;
default:
nSlot = -1;
}
if (nSlot == -1) return OBJECT_INVALID;
else
{
oItem = GetItemInSlot(nSlot, oOwner);
if (oItem == OBJECT_INVALID)
{
nLastSlotIndex++;
SetLocalInt(OBJECT_SELF, "nLastSlotIndex", nLastSlotIndex+1);
}
else return oItem;
}
}
return OBJECT_INVALID;
}
object LOOT_GetFirstItemInSlots(object oOwner)
{
SetLocalInt(OBJECT_SELF, "nLastSlotIndex", 0);
return LOOT_GetNextItemInSlots(oOwner);
}
void LOOT_MobOnDeath();
void LOOT_MobOnDeath()
{
SetIsDestroyable(FALSE, FALSE, FALSE);
vector vMe = GetPosition(OBJECT_SELF);
// location lCorpse = Location(GetArea(OBJECT_SELF), Vector(vMe.x, vMe.y, vMe.z - 0.1f), GetFacing(OBJECT_SELF));
location lCorpse = GetLocation(OBJECT_SELF);
object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, sCORPE_PLACEABLE_RESREF, lCorpse);
SetLocalObject(oCorpse, "oOwner", OBJECT_SELF);
}
void LOOT_MobDecay(object oRemains)
{
object oMob = OBJECT_SELF;
object oPossessor;
int nNbOfItems = GetLocalInt(oMob, "nNbOfItem");
int nItemIndex = 0;
object oItem;
while (nItemIndex < nNbOfItems)
{
oItem = GetLocalObject(oMob, IntToString(nItemIndex)+"_pt");
oPossessor = GetItemPossessor(oItem);
if ( ( oPossessor == OBJECT_INVALID) || ( GetObjectType(oPossessor) != OBJECT_TYPE_CREATURE ) )
{
DestroyObject(oItem);
}
nItemIndex++;
}
SetPlotFlag(oRemains, FALSE);
DestroyObject(oRemains, 6.0f);
SetIsDestroyable(TRUE);
}