//#include "_persist_01a" void CreateAnObject(string sResource, object oPC, int iStackSize); void main() { int iUseMode = 0; if (GetInventoryDisturbType()!= INVENTORY_DISTURB_TYPE_ADDED) { iUseMode = 99; if (GetLastDisturbed() == OBJECT_SELF) { DestroyObject(GetInventoryDisturbItem()); return; } } object oPC = GetLastDisturbed(); object oItem = GetInventoryDisturbItem(); string sItemTag = GetTag(oItem); object oTemp = OBJECT_INVALID; object oSelf = OBJECT_SELF; if (iUseMode == 0) { // 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. if (GetStringLeft(sItemTag,4)!= "DYE_") { CopyItem(oItem,oPC,TRUE); DestroyObject(oItem); FloatingTextStringOnCreature("You can only dye cloth by placing dyes into this dyetub.",oPC,FALSE); return; } } string sTag = GetTag(oItem); if (GetStringLeft(GetResRef(oItem),10)=="flagswitch") { if (sTag == "USE_CLOTH_NORMAL") SetLocalInt(oPC,"iUseThisCloth",0); if (sTag == "USE_CLOTH_WOOL") SetLocalInt(oPC,"iUseThisCloth",1); if (sTag == "USE_CLOTH_SILK") SetLocalInt(oPC,"iUseThisCloth",2); string sClothMessage = "Switching cloth types. Now set to "+GetStringLowerCase(GetName(oItem))+"."; FloatingTextStringOnCreature(sClothMessage,oPC,FALSE); DestroyObject(oItem); AssignCommand(oPC,DoPlaceableObjectAction(oSelf,PLACEABLE_ACTION_USE)); AssignCommand(oPC,DelayCommand(1.0,DoPlaceableObjectAction(oSelf,PLACEABLE_ACTION_USE))); return; } if (GetLocalInt(oSelf,"iAmInUse")!=0) { FloatingTextStringOnCreature("Only one bolt of cloth may be dyed at a time.",oPC,FALSE); CopyItem(oItem,oPC,TRUE); DestroyObject(oItem); return; } int iClothType = GetLocalInt(oPC,"iUseThisCloth"); string sClothTag = "ITEM_CLOTH_NORMAL"; if (iClothType==1) sClothTag = "ITEM_CLOTH_WOOL"; if (iClothType==2) sClothTag = "ITEM_CLOTH_SILK"; if (iClothType>2) iClothType=0; if (iClothType<0) iClothType = 0; object oCloth = GetItemPossessedBy(oPC,sClothTag); if (oCloth == OBJECT_INVALID) { FloatingTextStringOnCreature("You do not have the selected cloth type to work with..",oPC,FALSE); CopyItem(oItem,oPC,TRUE); DestroyObject(oItem); return; } int iDye = 0; if (sItemTag=="DYE_AQUA") iDye = 1; if (sItemTag=="DYE_BLACK") iDye = 2; if (sItemTag=="DYE_BLUE") iDye = 3; if (sItemTag=="DYE_YELLOW") iDye = 4; if (sItemTag=="DYE_GREEN") iDye = 5; if (sItemTag=="DYE_BROWN") iDye = 6; if (sItemTag=="DYE_GOLD") iDye = 7; if (sItemTag=="DYE_BRONZE") iDye = 8; if (sItemTag=="DYE_SILVER") iDye = 9; if (sItemTag=="DYE_GREY") iDye = 10; if (sItemTag=="DYE_PINK") iDye = 11; if (sItemTag=="DYE_ORANGE") iDye = 12; if (sItemTag=="DYE_TAN") iDye = 13; if (sItemTag=="DYE_COPPER") iDye = 14; if (sItemTag=="DYE_WHITE") iDye = 15; if (sItemTag=="DYE_PLATINUM") iDye = 16; if (sItemTag=="DYE_PURPLE") iDye = 17; if (sItemTag=="DYE_CHARCOAL") iDye = 18; if (sItemTag=="DYE_MINTGREEN") iDye = 19; if (sItemTag=="DYE_DARKRED") iDye = 20; if (sItemTag=="DYE_DARKGREEN") iDye = 21; if (sItemTag=="DYE_DARKBLUE") iDye = 22; if (sItemTag=="DYE_PEACH") iDye = 23; if (sItemTag=="DYE_SMOKE") iDye = 24; if (sItemTag=="DYE_FUSCHIA") iDye = 25; if (sItemTag=="DYE_OLIVE") iDye = 26; if (sItemTag=="DYE_YELLOWGREEN") iDye = 27; if (sItemTag=="DYE_YELLOWGRN") iDye = 27; if (sItemTag=="DYE_RUST") iDye = 28; if (sItemTag=="DYE_CHROMATIC") iDye = 29; if (sItemTag=="DYE_METALLIC") iDye = 30; if (iDye==0) { FloatingTextStringOnCreature("This item is not useable in this tub..",oPC,FALSE); CopyItem(oItem,oPC,TRUE); DestroyObject(oItem); return; } string sDyeResRef = "dye0"; if (iDye<10) sDyeResRef = sDyeResRef+"0"+IntToString(iDye); if (iDye>9) sDyeResRef = sDyeResRef+IntToString(iDye); //int iDyeSkill = GetTokenPair(oPC,13,12); //Cloth Dyeing Skill int iDyeSkill = GetCampaignInt("UOACraft","iDyeSkill",oPC); int iDyeChance = iDyeSkill; if (iDyeChance < 350) { iDyeChance = GetAbilityScore(oPC,ABILITY_WISDOM)*5; iDyeChance = iDyeChance+(GetAbilityScore(oPC,ABILITY_INTELLIGENCE)*3); iDyeChance = iDyeChance+(GetAbilityScore(oPC,ABILITY_DEXTERITY)*2); iDyeChance = iDyeChance*3; if (iDyeChance>350)iDyeChance=350; if (iDyeSkill > iDyeChance) iDyeChance=iDyeSkill; } // Determine Cloth-dyeing difficulty based on type of cloth and color value int iPenalty = iDye*10; iPenalty = iPenalty + (iClothType*200); iDyeChance = iDyeChance - iPenalty; if (iDyeChance <1) { FloatingTextStringOnCreature("You do not have the skill in cloth dyeing to dye this cloth in the selected color..",oPC,FALSE); CopyItem(oItem,oPC,TRUE); DestroyObject(oItem); return; } // Ensure correct stack information for dyes is gathered, and set stack to be less by 1. object oDye = GetItemPossessedBy(oSelf,sItemTag); int iDyeStack = GetNumStackedItems(oDye)-1; DestroyObject(oDye); string sItemResRef = "dyed_cloth0"; if (iClothType==1) sItemResRef=sItemResRef+IntToString(iDye+30); if (iClothType==2) sItemResRef=sItemResRef+IntToString(iDye+60); if (iClothType==0) { if (iDye >9)sItemResRef=sItemResRef+IntToString(iDye); if (iDye<10)sItemResRef=sItemResRef+"0"+IntToString(iDye); } DelayCommand(0.5,DestroyObject(oCloth)); // Do skill check for success/fail int iSkillGain = 0; string sSuccess = "You have successfully dyed the cloth."; string sFail = "The cloth fails to absorb the dye evenly, resulting in ruined cloth."; string sFailResRef = "boltofcloth004"; if (iClothType==1) sFailResRef = "boltofcloth005"; if (iClothType==2) sFailResRef = "boltofcloth006"; DelayCommand(1.0,CreateAnObject(sDyeResRef,oPC,iDyeStack)); if (Random(1000) <= iDyeChance) { DelayCommand(6.0,FloatingTextStringOnCreature(sSuccess,oPC,FALSE)); DelayCommand(6.0,CreateAnObject(sItemResRef,oPC,1)); if (Random(1000) >= iDyeSkill) { if (d10(1)+1 >= iDyeChance/100) iSkillGain = 1; } } else { DelayCommand(6.0,FloatingTextStringOnCreature(sFail,oPC,FALSE)); DelayCommand(6.0,CreateAnObject(sFailResRef,oPC,1)); } //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 string sOldSkill = ""; string sOldSkill2 = ""; if (iSkillGain==1) { iDyeSkill++; sOldSkill2 = IntToString(iDyeSkill); sOldSkill = "."+GetStringRight(sOldSkill2,1); if (iDyeSkill > 9) { sOldSkill = GetStringLeft(sOldSkill2,GetStringLength(sOldSkill2)-1)+sOldSkill; } else { sOldSkill = "0"+sOldSkill; } if (iDyeSkill <= 1000) { //DelayCommand(13.0,SetTokenPair(oPC,13,12,iDyeSkill)); DelayCommand(13.0,SetCampaignInt("UOACraft","iDyeSkill",iDyeSkill,oPC)); DelayCommand(13.0,SendMessageToPC(oPC,"=======================================")); DelayCommand(13.0,SendMessageToPC(oPC,"Your skill in cloth dyeing has gone up!")); DelayCommand(13.0,SendMessageToPC(oPC,"Current cloth dyeing skill : "+ sOldSkill+"%")); DelayCommand(13.0,SendMessageToPC(oPC,"=======================================")); if (GetLocalInt(GetModule(),"_UOACraft_XP")!=0) DelayCommand(12.9,GiveXPToCreature(oPC,GetLocalInt(GetModule(),"_UOACraft_XP"))); } } SetLocalInt(oSelf,"iAmInUse",99); DelayCommand(7.0,SetLocalInt(oSelf,"iAmInUse",0)); // Assign sounds and animations PlaySound("as_na_waterlap1"); AssignCommand(oPC,PlaySound("as_na_splash2")); AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,6.0)); } void CreateAnObject(string sResource, object oPC, int iStackSize) { CreateItemOnObject(sResource,oPC,iStackSize); return; }