//#include "_persist_01a" #include "nw_i0_plot" #include "aps_include" void CreateAnObject(string sResource, object oPC, int iStackSize); void GetNextItemPossessedBy(object oPC, string sItemTag); void main() { object oItem = GetInventoryDisturbItem(); object oPC = GetLastDisturbed(); object oSelf = OBJECT_SELF; string sTag = GetTag(oItem); string sSuccess = ""; string sFail = ""; string sItemResRef = ""; int iComponent1 = 0; string sComponent1 = ""; string sComponent1Name = ""; 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 craft by removing pattern tokens from this station.",oPC,FALSE); return; } CopyObject(oItem,GetLocation(oSelf),oSelf,GetTag(oItem)); //int iClothSkill = GetTokenPair(oPC,13,4); // Clothmaking int iClothSkill = GetPersistentInt(oPC,"iClothSkill","UOACraft"); int iClothChance = iClothSkill; if (iClothChance < 350) { iClothChance = GetAbilityScore(oPC,ABILITY_DEXTERITY)*5; iClothChance = iClothChance+(GetAbilityScore(oPC,ABILITY_INTELLIGENCE)*3); iClothChance = iClothChance+(GetAbilityScore(oPC,ABILITY_WISDOM)*2); iClothChance = iClothChance*3; if (iClothChance>350)iClothChance=350; if (iClothSkill > iClothChance) iClothChance=iClothSkill; } effect vEffect; int iDifficulty = 0; if (sTag == "P_CLOTH_NORMAL") { sSuccess = "You carefully weave the threads upon the loom to create a bolt of normal cloth."; sFail = "The threads begin to break and snap as you fail in your attempt to create the cloth."; sItemResRef = "boltofcloth001"; iComponent1 = 5; sComponent1 = "THREAD_COTTON"; // Spindle of Normal Thread sComponent1Name = "spindles of thread"; vEffect = EffectVisualEffect(VFX_DUR_PROT_STONESKIN,FALSE); } if (sTag == "P_CLOTH_WOOL") { iDifficulty = 500; sSuccess = "You carefully weave the yarn upon the loom to create a bolt of wool cloth."; sFail = "The yarn breaks in several places as you fail in your attempt to create the cloth."; sItemResRef = "boltofcloth002"; iComponent1 = 5; sComponent1 = "THREAD_WOOL"; // ball of wool yarn sComponent1Name = "balls of wool yarn"; vEffect = EffectVisualEffect(VFX_DUR_PROT_BARKSKIN,FALSE); } if (sTag == "P_CLOTH_SILK") { iDifficulty = 750; sSuccess = "You carefully weave the silken threads upon the loom to create a bolt of silk cloth."; sFail = "The threads begin to break and snap as you fail in your attempt to create the cloth."; sItemResRef = "boltofcloth003"; iComponent1 = 5; sComponent1 = "THREAD_SILK"; // Spindle of silk thread sComponent1Name = "spindles of silk thread"; vEffect = EffectVisualEffect(VFX_DUR_PROT_GREATER_STONESKIN,FALSE); } // check for components if (GetNumItems(oPC,sComponent1) < iComponent1) { FloatingTextStringOnCreature("You do not have enough "+sComponent1Name+" to do this.",oPC,FALSE); DestroyObject(oItem); return; } if (GetLocalInt(oSelf,"iAmInUse")!=0) { FloatingTextStringOnCreature("You can only weave one bolt at a time.",oPC,FALSE); DestroyObject(oItem); return; } SetLocalInt(oSelf,"iAmInUse",99); DelayCommand(13.1,SetLocalInt(oSelf,"iAmInUse",0)); if (iDifficulty > iClothChance) { FloatingTextStringOnCreature("You do not know how to weave this material into cloth yet.",oPC,FALSE); DestroyObject(oItem); return; } // Set Anvil to 'in use' SetLocalInt(OBJECT_SELF,"iAmInUse",99); DelayCommand(12.0,SetLocalInt(OBJECT_SELF,"iAmInUse",0)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,vEffect,oSelf,12.0); float fPause = 1.0; // Remove Components for (iComponent1; iComponent1>0; iComponent1--) { fPause = fPause+2.0; AssignCommand(oPC,DelayCommand(fPause,GetNextItemPossessedBy(oPC,sComponent1))); AssignCommand(oPC,DelayCommand(fPause,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,1.0))); AssignCommand(oPC,DelayCommand(fPause+0.1,PlaySound("as_cn_smithmet2"))); AssignCommand(oPC,DelayCommand(fPause+1.0,ActionPlayAnimation(ANIMATION_LOOPING_TALK_PLEADING,1.0,1.0))); AssignCommand(oPC,DelayCommand(fPause+1.1,PlaySound("as_cn_smithmet2"))); } DelayCommand(0.2,PlaySound("as_cv_ropepully1")); DelayCommand(3.2,PlaySound("as_cv_ropepully1")); DelayCommand(6.2,PlaySound("as_cv_ropepully1")); DelayCommand(9.2,PlaySound("as_cv_ropepully1")); DestroyObject(oItem); iClothChance = iClothChance - (iDifficulty/2); int iSkillGain = 0; if (Random(1000) <= iClothChance) { if (Random(1000) >= iClothSkill) { if (d10(1)+1 >= iClothChance/100) iSkillGain = 1; } } else { DelayCommand(12.0,FloatingTextStringOnCreature(sFail,oPC,FALSE)); return; } // Create the item AssignCommand(oPC,DelayCommand(12.0,CreateAnObject(sItemResRef,oPC,1))); AssignCommand(oPC,DelayCommand(12.0,FloatingTextStringOnCreature(sSuccess,oPC,FALSE))); //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)); } } // Do skill gains if (iSkillGain ==1) { string sOldSkill = ""; string sOldSkill2 = ""; iClothSkill++; sOldSkill2 = IntToString(iClothSkill); sOldSkill = "."+GetStringRight(sOldSkill2,1); if (iClothSkill > 9) { sOldSkill = GetStringLeft(sOldSkill2,GetStringLength(sOldSkill2)-1)+sOldSkill; } else { sOldSkill = "0"+sOldSkill; } if (iClothSkill <= 1000) { //DelayCommand(13.0,SetTokenPair(oPC,13,4,iClothSkill)); DelayCommand(13.0,SetPersistentInt(oPC,"iClothSkill",iClothSkill,0,"UOACraft")); DelayCommand(13.0,SendMessageToPC(oPC,"=========================================")); DelayCommand(13.0,SendMessageToPC(oPC,"Your skill in clothmaking has gone up!")); DelayCommand(13.0,SendMessageToPC(oPC,"Current clothmaking skill : "+ sOldSkill+"%")); DelayCommand(13.0,SendMessageToPC(oPC,"=========================================")); if (GetLocalInt(GetModule(),"_UOACraft_XP")!=0) DelayCommand(12.9,GiveXPToCreature(oPC,GetLocalInt(GetModule(),"_UOACraft_XP"))); } } } void CreateAnObject(string sResource, object oPC, int iStackSize) { CreateItemOnObject(sResource,oPC,iStackSize); return; } void GetNextItemPossessedBy(object oPC, string sItemTag) { object oTemp = GetItemPossessedBy(oPC,sItemTag); DestroyObject(oTemp); return; }