generated from Jaysyn/ModuleTemplate
253 lines
6.2 KiB
Plaintext
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);
|
|
|
|
}
|