added areas and ccoh, fixed some areas to work with crafting fixed some on death issues added server entry/ooc
165 lines
6.2 KiB
Plaintext
165 lines
6.2 KiB
Plaintext
//#include "_persist_01a"
|
|
void CreateAnObject(string sResource, object oPC);
|
|
void CreatePlaceable(string sObject, location lPlace, float fDuration);
|
|
|
|
void main()
|
|
{
|
|
if (GetLocalInt(OBJECT_SELF,"sIAmUsed") != 0) return;
|
|
SetLocalInt(OBJECT_SELF,"sIAmUsed",99);
|
|
object oPC = GetLastUsedBy();
|
|
object oSelf = OBJECT_SELF;
|
|
location lSelf = GetLocation(oSelf);
|
|
object oTool = GetItemPossessedBy(oPC,"SkinningKnife");
|
|
if (oTool == OBJECT_INVALID)
|
|
{
|
|
SetLocalInt(OBJECT_SELF,"sIAmUsed",0);
|
|
FloatingTextStringOnCreature("You must have a skinning knife to skin this corpse",oPC,FALSE);
|
|
return;
|
|
}
|
|
string sPeltTag = GetLocalString(OBJECT_SELF,"sPelt");
|
|
string sMeatTag = GetLocalString(OBJECT_SELF,"sMeat");
|
|
object oCorpse = GetLocalObject(OBJECT_SELF,"oCorpse");
|
|
int iSkinPenalty = GetLocalInt(OBJECT_SELF,"iPenalty");
|
|
//int iSkinSkill = GetTokenPair(oPC,14,8);
|
|
int iSkinSkill = GetCampaignInt("UOACraft","iSkinningSkill",oPC);
|
|
int iSkinChance = iSkinSkill;
|
|
if (iSkinChance < 350)
|
|
{
|
|
iSkinChance = GetAbilityScore(oPC,ABILITY_DEXTERITY)*5;
|
|
iSkinChance = iSkinChance+(GetAbilityScore(oPC,ABILITY_STRENGTH)*3);
|
|
iSkinChance = iSkinChance+(GetAbilityScore(oPC,ABILITY_INTELLIGENCE)*2);
|
|
iSkinChance = iSkinChance*3;
|
|
if (iSkinChance >350) iSkinChance = 350;
|
|
if (iSkinSkill > iSkinChance) iSkinChance = iSkinSkill;
|
|
}
|
|
iSkinChance = iSkinChance - iSkinPenalty;
|
|
if (iSkinChance <1)
|
|
{
|
|
FloatingTextStringOnCreature("You have no idea how to properly skin this corpse",oPC,FALSE);
|
|
SetLocalInt(OBJECT_SELF,"sIAmUsed",0);
|
|
return;
|
|
}
|
|
iSkinChance = iSkinChance+200;
|
|
int iRandom = Random(1000);
|
|
if (iRandom > iSkinChance)
|
|
{
|
|
//SendMessageToPC(oPC,"SkinChance: "+IntToString(iSkinChance));
|
|
AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,6.0));
|
|
AssignCommand(oPC,DelayCommand(5.0,FloatingTextStringOnCreature("You mangle the pelt while trying to skin this creature.",oPC,FALSE)));
|
|
AssignCommand(oPC,DelayCommand(2.5,CreatePlaceable("plc_pileskulls",lSelf,30.0)));
|
|
AssignCommand(oPC,DelayCommand(2.0,CreatePlaceable("plc_bloodstain",lSelf,60.0)));
|
|
AssignCommand(oCorpse,DelayCommand(2.0,ExecuteScript("_kill_corpse",oCorpse)));
|
|
DestroyObject(OBJECT_SELF);
|
|
return;
|
|
}
|
|
iRandom = Random(1000);
|
|
int iSkillGain = 0;
|
|
if (iRandom > (iSkinSkill - iSkinPenalty))iSkillGain = 1;
|
|
int iPeltQty = 1;
|
|
int iMeatQty = 1;
|
|
//SendMessageToPC(oPC,"iSkinSkill : "+IntToString(iSkinSkill));
|
|
//SendMessageToPC(oPC,"iSkinPenalty : "+IntToString(iSkinPenalty));
|
|
//SendMessageToPC(oPC,"iRandom : "+IntToString(iRandom));
|
|
//SendMessageToPC(oPC,"iSkillGaiin : "+IntToString(iSkillGain));
|
|
|
|
// Determine 1-4 meat and/or pelts based on skill level and random determination checks.
|
|
if (iSkinSkill>=500)
|
|
{
|
|
if (Random(1000)<=iSkinChance) iPeltQty++;
|
|
if (Random(1000)<=iSkinChance) iMeatQty++;
|
|
}
|
|
if (iSkinSkill>=750)
|
|
{
|
|
if (Random(1000)<=iSkinChance) iPeltQty++;
|
|
if (Random(1000)<=iSkinChance) iMeatQty++;
|
|
}
|
|
if (iSkinSkill>=950)
|
|
{
|
|
if (Random(1000)<=iSkinChance) iPeltQty++;
|
|
if (Random(1000)<=iSkinChance) iMeatQty++;
|
|
}
|
|
if (iSkinSkill>999)
|
|
{
|
|
iPeltQty++;
|
|
iMeatQty++;
|
|
}
|
|
string sPCMessage1 = "You carefully skin the creature, collecting "+IntToString(iPeltQty)+" pelt";
|
|
string sPCMessage2 = "You also collect "+IntToString(iMeatQty)+" portion";
|
|
if (iPeltQty >1) sPCMessage1 = sPCMessage1+"s";
|
|
if (iMeatQty >1) sPCMessage2 = sPCMessage2+"s";
|
|
sPCMessage1 = sPCMessage1+".";
|
|
sPCMessage2 = sPCMessage2+" of meat.";
|
|
AssignCommand(oPC,DelayCommand(5.0,FloatingTextStringOnCreature(sPCMessage1,oPC,FALSE)));
|
|
AssignCommand(oPC,DelayCommand(6.0,FloatingTextStringOnCreature(sPCMessage2,oPC,FALSE)));
|
|
float fPause =0.0;
|
|
for (iPeltQty; iPeltQty > 0; iPeltQty--)
|
|
{
|
|
AssignCommand(oPC,DelayCommand(4.0+fPause,CreateAnObject(sPeltTag,oPC)));
|
|
fPause = fPause+0.3;
|
|
}
|
|
for (iMeatQty; iMeatQty > 0; iMeatQty--)
|
|
{
|
|
AssignCommand(oPC,DelayCommand(4.0+fPause,CreateAnObject(sMeatTag,oPC)));
|
|
fPause = fPause+0.3;
|
|
}
|
|
AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,6.0));
|
|
AssignCommand(oPC,DelayCommand(2.5,CreatePlaceable("plc_pileskulls",lSelf,300.0)));
|
|
AssignCommand(oPC,DelayCommand(2.0,CreatePlaceable("plc_bloodstain",lSelf,600.0)));
|
|
|
|
//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);
|
|
AssignCommand(oPC,DelayCommand(10.0,SetLocalInt(oPC,"iSkillGain",0)));
|
|
}
|
|
}
|
|
|
|
if (iSkillGain ==1)
|
|
{
|
|
string sOldSkill = "";
|
|
string sOldSkill2 = "";
|
|
iSkinSkill++;
|
|
sOldSkill2 = IntToString(iSkinSkill);
|
|
sOldSkill = "."+GetStringRight(sOldSkill2,1);
|
|
if (iSkinSkill > 9)
|
|
{
|
|
sOldSkill = GetStringLeft(sOldSkill2,GetStringLength(sOldSkill2)-1)+sOldSkill;
|
|
}
|
|
else
|
|
{
|
|
sOldSkill = "0"+sOldSkill;
|
|
}
|
|
if (iSkinSkill <= 1000)
|
|
{
|
|
//DelayCommand(5.0,SetTokenPair(oPC,14,8,iSkinSkill));
|
|
DelayCommand(5.0,SetCampaignInt("UOACraft","iSkinningSkill",iSkinSkill,oPC));
|
|
AssignCommand(oPC,DelayCommand(7.0,SendMessageToPC(oPC,"================================")));
|
|
AssignCommand(oPC,DelayCommand(7.0,SendMessageToPC(oPC,"Your Skinning skill has gone up!")));
|
|
AssignCommand(oPC,DelayCommand(7.0,SendMessageToPC(oPC,"Current Skinning skill : "+ sOldSkill+"%")));
|
|
AssignCommand(oPC,DelayCommand(7.0,SendMessageToPC(oPC,"================================")));
|
|
if (GetLocalInt(GetModule(),"_UOACraft_XP")!=0) AssignCommand(oPC,DelayCommand(6.9,GiveXPToCreature(oPC,GetLocalInt(GetModule(),"_UOACraft_XP"))));
|
|
}
|
|
}
|
|
AssignCommand(oCorpse,DelayCommand(2.0,ExecuteScript("_kill_corpse",oCorpse)));
|
|
DestroyObject(OBJECT_SELF,6.0);
|
|
}
|
|
|
|
void CreateAnObject(string sResource, object oPC)
|
|
{
|
|
CreateItemOnObject(sResource,oPC,1);
|
|
return;
|
|
}
|
|
|
|
void CreatePlaceable(string sObject, location lPlace, float fDuration)
|
|
{
|
|
object oPlaceable = CreateObject(OBJECT_TYPE_PLACEABLE,sObject,lPlace,FALSE);
|
|
if (fDuration != 0.0)
|
|
DestroyObject(oPlaceable,fDuration);
|
|
}
|