Added CCOH and missing areas Changed some areas to be craftable, Fixed some on death issues, Fixed the Gaurd
615 lines
16 KiB
Plaintext
615 lines
16 KiB
Plaintext
#include "nw_i0_plot"
|
|
#include "aps_include"
|
|
|
|
void CreateAnObject(string sResource, object oPC, int iStackSize);
|
|
void GetNextStackedItem(object oPC, string sItemTag, int iCount, int iMode, string sStackResRef);
|
|
void GetNextItemPossessedBy(object oPC, string sItemTag);
|
|
object CreatePlaceable(string sObject, location lPlace, float fDuration);
|
|
|
|
void main()
|
|
{
|
|
object oPC = GetLastDisturbed();
|
|
object oSelf = OBJECT_SELF;
|
|
object oItem = GetInventoryDisturbItem();
|
|
string sItemTag = GetTag(oItem);
|
|
string sTagSelf = GetTag(oSelf);
|
|
string sItemResRef;
|
|
|
|
//nwn database
|
|
//int iCookSkill = GetCampaignInt("UOACraft","iCookSkill",oPC);
|
|
|
|
//external database
|
|
int iCookSkill = GetPersistentInt(oPC,"iCookSkill","UOACraft");
|
|
|
|
int iCookChance = iCookSkill;
|
|
int iDifficulty;
|
|
string sComponent1;
|
|
string sComponent2;
|
|
string sComponent3;
|
|
string sComponent1Name;
|
|
string sComponent2Name;
|
|
string sComponent3Name;
|
|
string sComponentResRef;
|
|
int iComponent1;
|
|
int iComponent2;
|
|
int iComponent3;
|
|
int iComponent1Stackable;
|
|
int iComponent2Stackable;
|
|
int iComponent3Stackable;
|
|
int iStackSize;
|
|
int iRandom;
|
|
int iSkillGain;
|
|
object oTemp;
|
|
string sSuccess;
|
|
string sFail;
|
|
int iItemStackSize=1;
|
|
|
|
|
|
if (iCookChance<350)
|
|
{
|
|
iCookChance = GetAbilityScore(oPC,ABILITY_WISDOM)*5;
|
|
iCookChance = iCookChance+(GetAbilityScore(oPC,ABILITY_DEXTERITY)*3);
|
|
iCookChance = iCookChance+(GetAbilityScore(oPC,ABILITY_CHARISMA)*2);
|
|
iCookChance = iCookChance*3;
|
|
if (iCookChance>350)iCookChance=350;
|
|
if (iCookSkill > iCookChance) iCookChance=iCookSkill;
|
|
}
|
|
|
|
if (GetInventoryDisturbType()== INVENTORY_DISTURB_TYPE_ADDED)
|
|
{
|
|
// The following 3 lines are to ensure compatability with UOAbigal's Persistent Token System.
|
|
// You can replace them with whatever 'no-drop' code you have or comment them out.
|
|
string sNoDropFlag = (GetStringLeft(GetTag(oItem),6));
|
|
if (sNoDropFlag == "NoDrop" || sNoDropFlag == "TOKEN_"||sNoDropFlag=="_TBOX_")
|
|
return;
|
|
if (GetBaseItemType(oItem)==BASE_ITEM_LARGEBOX)
|
|
{
|
|
DestroyObject(oItem);
|
|
SendMessageToPC(oPC,"To avoid possible dupe exploits, the container placed in this bag may be destroyed.");
|
|
return;
|
|
}
|
|
// End of compatability portion.
|
|
CopyItem(oItem,oPC,TRUE);
|
|
DestroyObject(oItem);
|
|
FloatingTextStringOnCreature("You can only cook by selecting a recipe!",oPC,FALSE);
|
|
return;
|
|
}
|
|
|
|
if (GetLocalInt(oSelf,"iAmInUse")!=0)
|
|
{
|
|
FloatingTextStringOnCreature("You can only cook one thing at a time!",oPC,FALSE);
|
|
CopyObject(oItem,GetLocation(oSelf),oSelf,GetTag(oItem));
|
|
DestroyObject(oItem);
|
|
return;
|
|
}
|
|
|
|
int iRecipeNumber = StringToInt(GetStringRight(sItemTag,3));
|
|
sItemResRef = "food_"+GetStringRight(sItemTag,3);
|
|
|
|
iComponent1 = 1;
|
|
iComponent2 = 0;
|
|
iComponent3 = 0;
|
|
sSuccess = "The meat cooks to a tender juiciness.";
|
|
sFail = "You have burned the meat to a crisp!";
|
|
|
|
switch (iRecipeNumber)
|
|
{
|
|
case 1: //BBQ Ancient Dire Bear Meat
|
|
{
|
|
iDifficulty = 500;
|
|
sComponent1 = "MEAT_ANCIENTDIREBEAR";
|
|
sComponent1Name = "raw ancient dire bear meat";
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
sComponent1 = "MEAT_BADGER";
|
|
sComponent1Name = "raw badger meat";
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
sComponent1 = "MEAT_BAT";
|
|
sComponent1Name = "raw bat meat";
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
iDifficulty = 350;
|
|
sComponent1 = "MEAT_BLACKBEAR";
|
|
sComponent1Name = "raw black bear meat";
|
|
break;
|
|
}
|
|
case 5:
|
|
{
|
|
iDifficulty = 400;
|
|
sComponent1 = "MEAT_BROWNBEAR";
|
|
sComponent1Name = "raw brown bear meat";
|
|
break;
|
|
}
|
|
case 6:
|
|
{
|
|
iDifficulty = 350;
|
|
sComponent1 = "MEAT_COUGAR";
|
|
sComponent1Name = "raw cougar meat";
|
|
break;
|
|
}
|
|
case 7:
|
|
{
|
|
sComponent1 = "MEAT_COW";
|
|
sComponent1Name = "raw cow meat";
|
|
break;
|
|
}
|
|
case 8:
|
|
{
|
|
sComponent1 = "MEAT_CRAGCAT";
|
|
sComponent1Name = "raw crag cat meat";
|
|
iDifficulty = 350;
|
|
break;
|
|
}
|
|
case 9:
|
|
{
|
|
sComponent1 = "MEAT_DEER";
|
|
sComponent1Name = "raw deer meat";
|
|
break;
|
|
}
|
|
case 10:
|
|
{
|
|
sComponent1 = "MEAT_DIREBADGER";
|
|
sComponent1Name = "raw dire badger meat";
|
|
break;
|
|
}
|
|
case 11:
|
|
{
|
|
sComponent1 = "MEAT_DIREBEAR";
|
|
sComponent1Name = "raw dire bear meat";
|
|
iDifficulty = 450;
|
|
break;
|
|
}
|
|
case 12:
|
|
{
|
|
sComponent1 = "MEAT_DIRERAT";
|
|
sComponent1Name = "raw dire rat meat";
|
|
break;
|
|
}
|
|
case 13:
|
|
{
|
|
sComponent1 = "MEAT_DIRETIGER";
|
|
sComponent1Name = "raw dire tiger meat";
|
|
iDifficulty = 450;
|
|
break;
|
|
}
|
|
case 14:
|
|
{
|
|
sComponent1 = "MEAT_DIREWOLF";
|
|
sComponent1Name = "raw dire wolf meat";
|
|
iDifficulty = 375;
|
|
break;
|
|
}
|
|
case 15:
|
|
{
|
|
sComponent1 = "MEAT_DOG";
|
|
sComponent1Name = "raw dog meat";
|
|
break;
|
|
}
|
|
case 16:
|
|
{
|
|
sComponent1 = "MEAT_GRIZZLYBEAR";
|
|
sComponent1Name = "raw grizzly bear meat";
|
|
iDifficulty = 425;
|
|
break;
|
|
}
|
|
case 17:
|
|
{
|
|
sComponent1 = "MEAT_JAGUAR";
|
|
sComponent1Name = "raw jaguar meat";
|
|
iDifficulty = 350;
|
|
break;
|
|
}
|
|
case 18:
|
|
{
|
|
sComponent1 = "MEAT_LEOPARD";
|
|
sComponent1Name = "raw leopard meat";
|
|
iDifficulty = 375;
|
|
break;
|
|
}
|
|
case 19:
|
|
{
|
|
sComponent1 = "MEAT_LION";
|
|
sComponent1Name = "raw lion meat";
|
|
iDifficulty = 400;
|
|
break;
|
|
}
|
|
case 20:
|
|
{
|
|
sComponent1 = "MEAT_MALARPANTHER";
|
|
sComponent1Name = "raw malar panther meat";
|
|
iDifficulty = 475;
|
|
break;
|
|
}
|
|
case 21:
|
|
{
|
|
sComponent1 = "MEAT_OX";
|
|
sComponent1Name = "raw ox meat";
|
|
break;
|
|
}
|
|
case 22:
|
|
{
|
|
sComponent1 = "MEAT_PANTHER";
|
|
sComponent1Name = "raw panther meat";
|
|
iDifficulty = 300;
|
|
break;
|
|
}
|
|
case 23:
|
|
{
|
|
sComponent1 = "MEAT_POLARBEAR";
|
|
sComponent1Name = "raw polar bear meat";
|
|
iDifficulty = 450;
|
|
break;
|
|
}
|
|
case 24:
|
|
{
|
|
sComponent1 = "MEAT_RAT";
|
|
sComponent1Name = "raw rat meat";
|
|
break;
|
|
}
|
|
case 25:
|
|
{
|
|
sComponent1 = "MEAT_WHITESTAG";
|
|
sComponent1Name = "raw white stag meat";
|
|
break;
|
|
}
|
|
case 26:
|
|
{
|
|
sComponent1 = "MEAT_WINTERWOLF";
|
|
sComponent1Name = "raw winter wolf meat";
|
|
iDifficulty = 400;
|
|
break;
|
|
}
|
|
case 27:
|
|
{
|
|
sComponent1 = "MEAT_WOLF";
|
|
sComponent1Name = "raw wolf meat";
|
|
break;
|
|
}
|
|
case 28:
|
|
{
|
|
sComponent1 = "MEAT_WORG";
|
|
sComponent1Name = "raw worg meat";
|
|
iDifficulty = 350;
|
|
break;
|
|
}
|
|
case 29:
|
|
{
|
|
iComponent1Stackable=1;
|
|
sComponent1 = "MEAT_RawFishFillet";
|
|
sComponent1Name = "raw fish fillets";
|
|
sSuccess = "The fillet cooks to a tender juiciness.";
|
|
sFail = "You have burned the fillet to a crisp!";
|
|
//iDifficulty = ;
|
|
break;
|
|
}
|
|
case 30:
|
|
{
|
|
sComponent1 = "MEAT_WOOLYRAZORBACK";
|
|
sComponent1Name = "wooly razorback meat";
|
|
break;
|
|
}
|
|
case 31:
|
|
case 32:
|
|
case 33:
|
|
case 34:
|
|
case 35:
|
|
case 36:
|
|
case 37:
|
|
case 38:
|
|
case 39:
|
|
case 40:
|
|
default:
|
|
}
|
|
|
|
CopyObject(oItem,GetLocation(oSelf),oSelf,GetTag(oItem));
|
|
DestroyObject(oItem);
|
|
|
|
//Check for components
|
|
if (GetNumItems(oPC,sComponent1) < iComponent1)
|
|
{
|
|
FloatingTextStringOnCreature("You do not have enough "+sComponent1Name+" to do this.",oPC,FALSE);
|
|
return;
|
|
}
|
|
if (iComponent2 > 0)
|
|
{
|
|
if (GetNumItems(oPC,sComponent2) < iComponent2)
|
|
{
|
|
FloatingTextStringOnCreature("You do not have enough "+sComponent2Name+" to do this.",oPC,FALSE);
|
|
return;
|
|
}
|
|
}
|
|
if (iComponent3 > 0)
|
|
{
|
|
if (GetNumItems(oPC,sComponent3) < iComponent3)
|
|
{
|
|
FloatingTextStringOnCreature("You do not have enough "+sComponent3Name+" to do this.",oPC,FALSE);
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
// Remove all components
|
|
if (iComponent1Stackable != 0)
|
|
{
|
|
oTemp = GetItemPossessedBy(oPC,sComponent1);
|
|
sComponentResRef = GetResRef(oTemp);
|
|
iStackSize = GetNumStackedItems(oTemp);
|
|
DestroyObject(oTemp);
|
|
if (iStackSize < iComponent1)
|
|
{
|
|
iComponent1 = iComponent1 - iStackSize;
|
|
DelayCommand(2.0,GetNextStackedItem(oPC,sComponent1,iComponent1,1,sComponentResRef));
|
|
}
|
|
else
|
|
{
|
|
if (iStackSize > iComponent1)
|
|
{
|
|
iStackSize = iStackSize - iComponent1;
|
|
DelayCommand(1.0,CreateAnObject(sComponentResRef,oPC,iStackSize));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (iComponent1; iComponent1>0; iComponent1--)
|
|
{
|
|
GetNextItemPossessedBy(oPC,sComponent1);
|
|
}
|
|
}
|
|
if (sComponent2 != "")
|
|
{
|
|
if (iComponent2Stackable != 0)
|
|
{
|
|
oTemp = GetItemPossessedBy(oPC,sComponent2);
|
|
sComponentResRef = GetResRef(oTemp);
|
|
iStackSize = GetNumStackedItems(oTemp);
|
|
DestroyObject(oTemp);
|
|
if (iStackSize < iComponent2)
|
|
{
|
|
iComponent2 = iComponent2 - iStackSize;
|
|
DelayCommand(2.0,GetNextStackedItem(oPC,sComponent2,iComponent2,1, sComponentResRef));
|
|
}
|
|
else
|
|
{
|
|
if (iStackSize > iComponent2)
|
|
{
|
|
iStackSize = iStackSize - iComponent2;
|
|
DelayCommand(1.0,CreateAnObject(sComponentResRef,oPC,iStackSize));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (iComponent2; iComponent2>0; iComponent2--)
|
|
{
|
|
GetNextItemPossessedBy(oPC,sComponent2);
|
|
}
|
|
}
|
|
}
|
|
if (sComponent3 != "")
|
|
{
|
|
if (iComponent3Stackable != 0)
|
|
{
|
|
oTemp = GetItemPossessedBy(oPC,sComponent3);
|
|
sComponentResRef = GetResRef(oTemp);
|
|
iStackSize = GetNumStackedItems(oTemp);
|
|
DestroyObject(oTemp);
|
|
if (iStackSize < iComponent3)
|
|
{
|
|
iComponent3 = iComponent3 - iStackSize;
|
|
DelayCommand(2.0,GetNextStackedItem(oPC,sComponent3,iComponent3,1, sComponentResRef));
|
|
}
|
|
else
|
|
{
|
|
if (iStackSize > iComponent3)
|
|
{
|
|
iStackSize = iStackSize - iComponent3;
|
|
DelayCommand(1.0,CreateAnObject(sComponentResRef,oPC,iStackSize));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (iComponent3; iComponent3>0; iComponent3--)
|
|
{
|
|
GetNextItemPossessedBy(oPC,sComponent3);
|
|
}
|
|
}
|
|
}
|
|
|
|
SetLocalInt(oSelf,"iAmInUse",99);
|
|
DelayCommand(15.0,SetLocalInt(oSelf,"iAmInUse",0));
|
|
|
|
|
|
//Assign Animations
|
|
AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,15.0));
|
|
|
|
location lSelf = GetLocation(OBJECT_SELF);
|
|
float fSelf = GetFacing(OBJECT_SELF)+180.0;
|
|
vector vSelf = GetPosition(OBJECT_SELF);
|
|
object oArea = GetArea(OBJECT_SELF);
|
|
vector vFire;
|
|
int vDirection;
|
|
location lFire;
|
|
object oFire;
|
|
if (GetStringRight(sTagSelf,1)=="1")
|
|
{
|
|
vFire = vSelf + (AngleToVector(fSelf) * 0.7);
|
|
lFire = Location(oArea,vFire,fSelf);
|
|
oFire = CreatePlaceable("plc_flamemedium", lFire, 14.3);
|
|
}
|
|
else
|
|
{
|
|
vFire = vSelf + (AngleToVector(fSelf) * 0.1);
|
|
lFire = Location(oArea,vFire,fSelf);
|
|
oFire = CreatePlaceable("plc_dustplume", lFire, 14.3);
|
|
}
|
|
DelayCommand(2.0,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_HIT_FIRE,FALSE),GetLocation(oFire),1.0));
|
|
DelayCommand(5.0,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_SPECIAL_PINK_ORANGE,FALSE),GetLocation(oFire),1.0));
|
|
DelayCommand(8.0,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_SPECIAL_RED_WHITE,FALSE),GetLocation(oFire),1.0));
|
|
DelayCommand(10.0,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_SPARKS_PARRY,FALSE),GetLocation(oFire),1.0));
|
|
DelayCommand(12.0,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_HIT_FIRE,FALSE),GetLocation(oFire),1.0));
|
|
DelayCommand(14.0,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_SPECIAL_WHITE_ORANGE,FALSE),GetLocation(oFire),1.0));
|
|
|
|
switch (StringToInt(GetStringRight(sTagSelf,1)))
|
|
{
|
|
case 1: //Oven
|
|
{
|
|
PlaySound("al_cv_furnace1");
|
|
PlaySound("al_cv_firelarge1");
|
|
DelayCommand(4.5,PlaySound("al_cv_furnace1"));
|
|
DelayCommand(4.5,PlaySound("al_cv_firelarge1"));
|
|
DelayCommand(9.0,PlaySound("al_cv_furnace1"));
|
|
DelayCommand(9.0,PlaySound("al_cv_firelarge1"));
|
|
break;
|
|
}
|
|
case 3: //campfire & spit
|
|
{
|
|
PlaySound("al_cv_firepit1");
|
|
DelayCommand(4.5,PlaySound("al_cv_firepit1"));
|
|
DelayCommand(9.0,PlaySound("al_cv_firepit1"));
|
|
break;
|
|
}
|
|
case 4: //campfire & pot
|
|
{
|
|
PlaySound("al_cv_firecppot1");
|
|
DelayCommand(4.5,PlaySound("al_cv_firecppot1"));
|
|
DelayCommand(9.0,PlaySound("al_cv_firecppot1"));
|
|
break;
|
|
}
|
|
default:// campfire & perma-campfire
|
|
{
|
|
PlaySound("al_cv_firecamp1");
|
|
DelayCommand(4.5,PlaySound("al_cv_firecamp1"));
|
|
DelayCommand(9.0,PlaySound("al_cv_firecamp1"));
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
iCookChance=iCookChance-iDifficulty;
|
|
if (iCookChance<1)iCookChance=1;
|
|
|
|
iRandom = Random(1000)+Random(1000)+Random(800);//Adjusted difficulty downwards by a small percent to make lowlevel cooks succeed a bit more.
|
|
iRandom = iRandom/3;
|
|
if (iRandom<=iCookChance)
|
|
{
|
|
if (Random(1000) >= iCookSkill)
|
|
{
|
|
if (d10(1)+1 >= iCookChance/100) iSkillGain = 1;
|
|
}
|
|
DelayCommand(14.8,PlaySound("as_na_steamshrt2"));
|
|
AssignCommand(GetArea(oPC),DelayCommand(15.0,FloatingTextStringOnCreature(sSuccess,oPC,FALSE)));
|
|
AssignCommand(GetArea(oPC),DelayCommand(15.1,CreateAnObject(sItemResRef,oPC,iItemStackSize)));
|
|
}
|
|
else
|
|
{
|
|
DelayCommand(14.8,PlaySound("as_cv_woodbreak3"));
|
|
AssignCommand(GetArea(oPC),DelayCommand(15.0,FloatingTextStringOnCreature(sFail,oPC,FALSE)));
|
|
return;
|
|
}
|
|
//Ensure no more than 1 skill gain every 10 seconds to avoid token droppage.
|
|
if (iSkillGain ==1)
|
|
{
|
|
if (GetLocalInt(oPC,"iSkillGain")!= 0)
|
|
{
|
|
iSkillGain = 0;
|
|
}
|
|
else
|
|
{
|
|
SetLocalInt(oPC,"iSkillGain",99);
|
|
DelayCommand(10.0,SetLocalInt(oPC,"iSkillGain",0));
|
|
}
|
|
}
|
|
|
|
if (iSkillGain ==1)
|
|
{
|
|
string sOldSkill = "";
|
|
string sOldSkill2 = "";
|
|
iCookSkill++;
|
|
sOldSkill2 = IntToString(iCookSkill);
|
|
sOldSkill = "."+GetStringRight(sOldSkill2,1);
|
|
if (iCookSkill > 9)
|
|
{
|
|
sOldSkill = GetStringLeft(sOldSkill2,GetStringLength(sOldSkill2)-1)+sOldSkill;
|
|
}
|
|
else
|
|
{
|
|
sOldSkill = "0"+sOldSkill;
|
|
}
|
|
if (iCookSkill <= 1000)
|
|
{
|
|
//DelayCommand(13.0,SetTokenPair(oPC,13,3,iCookSkill));
|
|
|
|
//nwn database
|
|
//DelayCommand(14.5,SetCampaignInt("UOACraft","iCookSkill",iCookSkill,oPC));
|
|
|
|
//external database
|
|
DelayCommand(14.5,SetPersistentInt(oPC,"iCookSkill",iCookSkill,0,"UOACraft"));
|
|
|
|
DelayCommand(14.5,SendMessageToPC(oPC,"=================================="));
|
|
DelayCommand(14.5,SendMessageToPC(oPC,"Your skill in cooking has gone up!"));
|
|
DelayCommand(14.5,SendMessageToPC(oPC,"Current cooking skill : "+ sOldSkill+"%"));
|
|
DelayCommand(14.5,SendMessageToPC(oPC,"=================================="));
|
|
if (GetLocalInt(GetModule(),"_UOACraft_XP")!=0) DelayCommand(14.4,GiveXPToCreature(oPC,GetLocalInt(GetModule(),"_UOACraft_XP")));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
void GetNextStackedItem(object oPC, string sItemTag, int iCount, int iMode, string sStackResRef)
|
|
{
|
|
object oTemp = GetItemPossessedBy(oPC,sItemTag);
|
|
int iStackCount = GetNumStackedItems(oTemp);
|
|
int iTemp = iCount - iStackCount;
|
|
iStackCount = iStackCount-iCount;
|
|
DestroyObject(oTemp);
|
|
if (iStackCount > 0)
|
|
{
|
|
SendMessageToPC(oPC,"You should get back "+IntToString(iStackCount));
|
|
DelayCommand(1.0,CreateAnObject(sStackResRef,oPC,iStackCount));
|
|
}
|
|
// this next line *should* recursively call this function if the number of
|
|
// stacked items does not meet the required number of items to be destroyed.
|
|
if (iTemp > 0) DelayCommand(1.0,GetNextStackedItem(oPC,sItemTag,iTemp, iMode, sStackResRef));
|
|
return;
|
|
}
|
|
|
|
void GetNextItemPossessedBy(object oPC, string sItemTag)
|
|
{
|
|
object oTemp = GetItemPossessedBy(oPC,sItemTag);
|
|
DestroyObject(oTemp);
|
|
return;
|
|
}
|
|
|
|
void CreateAnObject(string sResource, object oPC, int iStackSize)
|
|
{
|
|
CreateItemOnObject(sResource,oPC,iStackSize);
|
|
return;
|
|
}
|
|
|
|
object CreatePlaceable(string sObject, location lPlace, float fDuration)
|
|
{
|
|
object oPlaceable = CreateObject(OBJECT_TYPE_PLACEABLE,sObject,lPlace,FALSE);
|
|
if (fDuration != 0.0)
|
|
DestroyObject(oPlaceable,fDuration);
|
|
return oPlaceable;
|
|
}
|