//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); }