//#include "_persist_01a" void CreateAnObject(string sResource, object oPC, int iStackSize); void main() { object oPC = GetLastDisturbed(); object oItem = GetInventoryDisturbItem(); string sItemTag = GetTag(oItem); string sItemResRef = GetResRef(oItem); string sSuccess = ""; string sName = GetName(oItem); // 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,10)!="GEM_ROUGH_") { CopyItem(oItem,oPC,TRUE); FloatingTextStringOnCreature("This is not a rough gemstone...",oPC,FALSE); DestroyObject(oItem); return; } if (GetLocalInt(OBJECT_SELF,"iAmInUse")!=0) { CopyItem(oItem,oPC,TRUE); FloatingTextStringOnCreature("The tumbler is not yet ready for more gemstones...",oPC,FALSE); DestroyObject(oItem); return; } object oGrit1 = GetItemPossessedBy(oPC,"GRIT_COARSE"); object oGrit2 = GetItemPossessedBy(oPC,"GRIT_MEDIUM"); object oGrit3 = GetItemPossessedBy(oPC,"GRIT_FINE"); int iGrit1 = GetNumStackedItems(oGrit1)-1; int iGrit2 = GetNumStackedItems(oGrit2)-1; int iGrit3 = GetNumStackedItems(oGrit3)-1; //SendMessageToPC(oPC,"Coarse Grit ResRef : "+GetResRef(oGrit1)); //SendMessageToPC(oPC,"Medium Grit ResRef : "+GetResRef(oGrit2)); //SendMessageToPC(oPC," Fine Grit ResRef : "+GetResRef(oGrit3)); //SendMessageToPC(oPC,"Coarse Grit Tag : "+GetTag(oGrit1)); //SendMessageToPC(oPC,"Medium Grit Tag : "+GetTag(oGrit2)); //SendMessageToPC(oPC," Fine Grit Tag : "+GetTag(oGrit3)); //SendMessageToPC(oPC,"Coarse Grit Stack : "+IntToString(iGrit1)); //SendMessageToPC(oPC,"Medium Grit Stack : "+IntToString(iGrit2)); //SendMessageToPC(oPC," Fine Grit Stack : "+IntToString(iGrit3)); if (oGrit1 == OBJECT_INVALID) { CopyItem(oItem,oPC,TRUE); DestroyObject(oItem); FloatingTextStringOnCreature("You must have some coarse polishing grit in order to begin polishing gems.",oPC,FALSE); return; } if (oGrit2 == OBJECT_INVALID) { CopyItem(oItem,oPC,TRUE); DestroyObject(oItem); FloatingTextStringOnCreature("You must have some medium polishing grit in order to continue the gem polishing process.",oPC,FALSE); return; } if (oGrit3 == OBJECT_INVALID) { CopyItem(oItem,oPC,TRUE); DestroyObject(oItem); FloatingTextStringOnCreature("You must have some fine polishing grit in order to finish the gem polishing process.",oPC,FALSE); return; } //This line added June 3, 2003 and will check for a split stack, //which has no ResRef, and find the other half of the stack that //actually has the ResRef. if (sItemResRef=="") sItemResRef = GetResRef(GetItemPossessedBy(oPC,GetTag(oItem))); DestroyObject(oGrit1,0.1); DestroyObject(oGrit2,0.2); DestroyObject(oGrit3,0.3); //***IMPORTANT NOTE**** //The delay for the 1st creation of 'grit001' is required in order to //prevent an interesting bug in order of execution of creation/destruction of //stacked items. //Without the delay, the script runs properly 1st time through.. but behind the scenes //you temporarily have 2 items.. a stack of 10 and a stack of 9.. total of 19 //it then destroys the stack of 10, leaving you with 9. The second time through //however, it creates 8, giving you a stack of 10 and a stack of 7. It then //destroys the stack of 10, leaving you with 7. Big error as you should have 8. if (iGrit1 >0) DelayCommand(1.0,CreateAnObject("grit001",oPC,iGrit1)); if (iGrit2 >0) DelayCommand(10.1,CreateAnObject("grit002",oPC,iGrit2)); if (iGrit3 >0) DelayCommand(20.1,CreateAnObject("grit003",oPC,iGrit3)); FloatingTextStringOnCreature("You begin polishing the "+GetName(oItem)+"...",oPC,FALSE); DelayCommand(10.0,FloatingTextStringOnCreature("You begin the second polishing cycle...",oPC,FALSE)); DelayCommand(20.0,FloatingTextStringOnCreature("You begin the third, and final, polishing cycle.",oPC,FALSE)); SetLocalInt(OBJECT_SELF,"iAmInUse",99); DelayCommand(30.0,SetLocalInt(OBJECT_SELF,"iAmInUse",0)); // This snippet of code is cut-n-paste direct from ATS // Reason for this is because I had no clue how to assign an increase // in the z-axis of the location of the anvil for sparks to display. // After reading through this code, it is obvious that vEffecrPos.z // is the line which assigns this. Due to my own ignorance in this issue // I have decided to leave this snippet of code intact with this credit to // the original ATS script coders, whomever they may have been. // The only modification to this code is locAnvil was changed to locBath. location locBath = GetLocation(OBJECT_SELF); vector vEffectPos = GetPositionFromLocation(locBath); vEffectPos.z += 0.8; location locEffect = Location( GetAreaFromLocation(locBath), vEffectPos,GetFacingFromLocation(locBath) ); ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), locEffect); ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect); DelayCommand(0.1,PlaySound("al_cv_millwheel")); DelayCommand(6.0,PlaySound("al_cv_millwheel")); DelayCommand(12.0,PlaySound("al_cv_millwheel")); DelayCommand(18.0,PlaySound("al_cv_millwheel")); DelayCommand(24.0,PlaySound("al_cv_millwheel")); DelayCommand(0.2,PlaySound("al_cv_fanlg1")); DelayCommand(6.1,PlaySound("al_cv_fanlg1")); DelayCommand(12.1,PlaySound("al_cv_fanlg1")); DelayCommand(18.1,PlaySound("al_cv_fanlg1")); DelayCommand(24.1,PlaySound("al_cv_fanlg1")); DelayCommand(0.4,PlaySound("al_mg_jacobs1")); DelayCommand(0.4,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect)); DelayCommand(0.5,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_RED_WHITE), locEffect)); DelayCommand(1.0,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_BLUE_RED), locEffect)); DelayCommand(1.8,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(2.6,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_WHITE_BLUE), locEffect)); DelayCommand(3.3,PlaySound("al_mg_jacobs1")); DelayCommand(3.3,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect)); DelayCommand(4.0,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_RED_WHITE), locEffect)); DelayCommand(4.8,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(5.6,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_WHITE_ORANGE), locEffect)); DelayCommand(6.2,PlaySound("al_mg_jacobs1")); DelayCommand(6.2,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect)); DelayCommand(7.0,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_PINK_ORANGE), locEffect)); DelayCommand(7.8,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(8.6,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_RED_WHITE), locEffect)); DelayCommand(9.1,PlaySound("al_mg_jacobs1")); DelayCommand(9.1,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect)); DelayCommand(9.8,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_PINK_ORANGE), locEffect)); DelayCommand(10.6,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(11.4,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_BLUE_RED), locEffect)); DelayCommand(12.0,PlaySound("al_mg_jacobs1")); DelayCommand(12.0,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect)); DelayCommand(12.6,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(13.3,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_RED_ORANGE), locEffect)); DelayCommand(14.0,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(14.9,PlaySound("al_mg_jacobs1")); DelayCommand(14.9,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect)); DelayCommand(15.6,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_PINK_ORANGE), locEffect)); DelayCommand(16.3,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(17.0,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_WHITE_ORANGE), locEffect)); DelayCommand(17.8,PlaySound("al_mg_jacobs1")); DelayCommand(17.8,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect)); DelayCommand(18.6,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_BLUE_RED), locEffect)); DelayCommand(19.3,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(20.0,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_RED_ORANGE), locEffect)); DelayCommand(20.7,PlaySound("al_mg_jacobs1")); DelayCommand(20.7,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect)); DelayCommand(21.4,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_WHITE_BLUE), locEffect)); DelayCommand(22.2,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(22.9,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_PINK_ORANGE), locEffect)); DelayCommand(23.6,PlaySound("al_mg_jacobs1")); DelayCommand(23.6,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect)); DelayCommand(24.4,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_RED_WHITE), locEffect)); DelayCommand(25.2,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(25.9,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_WHITE_BLUE), locEffect)); DelayCommand(26.5,PlaySound("al_mg_jacobs1")); DelayCommand(26.5,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_ACID), locEffect)); DelayCommand(27.3,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_RED_ORANGE), locEffect)); DelayCommand(28.3,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPARKS_PARRY), locEffect)); DelayCommand(29.6,ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_SPECIAL_WHITE_BLUE), locEffect)); AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,8.5)); AssignCommand(oPC,DelayCommand(10.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,8.5))); AssignCommand(oPC,DelayCommand(20.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,8.5))); int iItem = GetNumStackedItems(oItem); //int iPolishSkill = GetTokenPair(oPC,13,6); int iPolishSkill = GetCampaignInt("UOACraft","iPolishSkill",oPC); int iPolishChance = iPolishSkill; if (iPolishChance <350) { iPolishChance = GetAbilityScore(oPC,ABILITY_INTELLIGENCE)*4; iPolishChance = iPolishChance+(GetAbilityScore(oPC,ABILITY_WISDOM)*4); iPolishChance = iPolishChance+(GetAbilityScore(oPC,ABILITY_CHARISMA)*2); iPolishChance = iPolishChance*3; if (iPolishChance>350) iPolishChance = 350; if (iPolishChance0) { if (Random(1000) >= iPolishSkill) { if (d10(1)+1 >= iPolishChance/100) iSkillGain = 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)); } } if (iSkillGain ==1) { string sOldSkill = ""; string sOldSkill2 = ""; iPolishSkill++; sOldSkill2 = IntToString(iPolishSkill); sOldSkill = "."+GetStringRight(sOldSkill2,1); if (iPolishSkill > 9) { sOldSkill = GetStringLeft(sOldSkill2,GetStringLength(sOldSkill2)-1)+sOldSkill; } else { sOldSkill = "0"+sOldSkill; } if (iPolishSkill <= 1000) { //DelayCommand(31.0,SetTokenPair(oPC,13,6,iPolishSkill)); DelayCommand(31.0,SetCampaignInt("UOACraft","iPolishSkill",iPolishSkill,oPC)); DelayCommand(31.0,SendMessageToPC(oPC,"=======================================")); DelayCommand(31.0,SendMessageToPC(oPC,"Your skill in gem polishing has gone up!")); DelayCommand(31.0,SendMessageToPC(oPC,"Current gem polishing skill : "+ sOldSkill+"%")); DelayCommand(31.0,SendMessageToPC(oPC,"========================================")); if (GetLocalInt(GetModule(),"_UOACraft_XP")!=0) DelayCommand(30.9,GiveXPToCreature(oPC,GetLocalInt(GetModule(),"_UOACraft_XP"))); } } // Only process 1 gem at a time. Return the rest of the stack to the PC. // The reason for this is due to the value of the gems a PC could make // too much gold too fast if allowed to process stacks at a time. if (iItem >1) { iItem--; CreateItemOnObject(GetResRef(oItem),oPC,iItem); } DestroyObject(oItem); } void CreateAnObject(string sResource, object oPC, int iStackSize) { CreateItemOnObject(sResource,oPC,iStackSize); return; }