include library.hue; include library.sui; include library.utils; include library.pclib; include library.prose; include library.pet_lib; include java.util.Enumeration; const string SCRIPTVAR_PID = "tool.pid"; const string SCRIPTVAR_PLAYER = "tool.player"; const string SCRIPTVAR_TARGET = "tool.target"; const string SCRIPTVAR_OPT = "tool.opt"; const string STF = "tool/customizer"; const string_id MNU_CUSTOMIZE = new string_id(STF, "mnu_customize"); const string_id OPT_COLOR_TRIM = new string_id(STF, "opt_color_trim"); const string_id OPT_COLOR_FRAME = new string_id(STF, "opt_color_frame"); const string_id SID_DROID_PET_ONLY = new string_id(STF, "droid_pet_only"); const string_id SID_NEED_CONSENT = new string_id(STF, "need_consent"); const string_id SID_NO_DATA = new string_id(STF, "no_data"); const string_id PROSE_NO_CUSTOMIZATION = new string_id(STF, "prose_no_customization"); const string_id VAR_SELECT_PROMPT = new string_id(STF, "var_select_prompt"); const string_id PROSE_COMPLETE = new string_id(STF, "prose_complete"); const string_id PROSE_COMPLETE_OWNER = new string_id(STF, "prose_complete_owner"); const string_id PROSE_CANCELLED = new string_id(STF, "prose_cancelled"); const string_id PROSE_CANCELLED_OWNER = new string_id(STF, "prose_cancelled_owner"); const string_id PROSE_FAIL = new string_id(STF, "prose_fail"); const string_id PROSE_FAIL_OWNER = new string_id(STF, "prose_fail_owner"); const string TBL = "datatables/item/droid_customizer/indices.iff"; const string[] CUSTOMIZATION_SKILL_MODS = {"droid_customization"}; trigger OnAboutToBeTransferred(obj_id dest, obj_id transferer) { cleanupCustomizationMenu(); return SCRIPT_CONTINUE; } trigger OnObjectMenuRequest(obj_id player, menu_info mi) { if ( !utils.isNestedWithin(self, player) ) return SCRIPT_CONTINUE; menu_info_data mid = mi.getMenuItemByType (menu_info_types.ITEM_USE); if (mid != null) mid.setServerNotify (true); // int mnuColor = mi.addRootMenu(menu_info_types.SERVER_MENU1, MNU_CUSTOMIZE); return SCRIPT_CONTINUE; } trigger OnObjectMenuSelect(obj_id player, int item) { if ( !utils.isNestedWithin(self, player) ) return SCRIPT_CONTINUE; if ( item == menu_info_types.SERVER_MENU1 || item == menu_info_types.ITEM_USE ) //customize { //try to get blue brackets first obj_id lookat = getLookAtTarget(player); if ( !isIdValid(lookat) || !pet_lib.isDroidPet(lookat)) { //if no blue bracket check to see if we have green lookat = getIntendedTarget(player); if ( !isIdValid(lookat) ) { sendSystemMessage(player, SID_DROID_PET_ONLY); return SCRIPT_CONTINUE; } } queueCommand(player, ##"customizeDroid", self, lookat.toString(), COMMAND_PRIORITY_DEFAULT); } return SCRIPT_CONTINUE; } commandHandler cmdCustomizeDroid() { if ( !isIdValid(self) || !isIdValid(target) ) return SCRIPT_CONTINUE; obj_id pet = utils.stringToObjId(params); if ( !isIdValid(pet) || !pet_lib.isDroidPet(pet) ) { sendSystemMessage(target, SID_DROID_PET_ONLY); return SCRIPT_CONTINUE; } obj_id master = pet_lib.getMaster(pet); if ( !isIdValid(master) ) return SCRIPT_CONTINUE; if ( (master != target) && (!pclib.hasConsent(target, master)) ) { sendSystemMessage(target, SID_NEED_CONSENT); return SCRIPT_CONTINUE; } cleanupCustomizationMenu(target); string template = utils.getTemplateFilenameNoPath(pet); dictionary row = dataTableGetRow(TBL, template); if ( row == null || row.isEmpty() ) { prose_package ppNoCustomization = prose.getPackage(PROSE_NO_CUSTOMIZATION, pet); sendSystemMessageProse(target, ppNoCustomization); return SCRIPT_CONTINUE; } resizeable string[] entries = new string[0]; resizeable string[] opt = new string[0]; Enumeration keys = row.keys(); while ( keys.hasMoreElements() ) { string key = (string)keys.nextElement(); if ( !key.equals("TEMPLATE") ) { string var = row.getString(key); if ( var != null && !var.equals("") && !var.equals("none") ) { entries = utils.addElement(entries, "@" + STF + ":opt_color_" + toLower(key)); opt = utils.addElement(opt, var); } } } if ( entries != null && entries.length > 0 && opt != null && opt.length > 0 ) { string title = utils.getStringName(pet); string prompt = utils.packStringId(VAR_SELECT_PROMPT); int pid = sui.listbox(self, target, prompt, sui.OK_CANCEL, title, entries, "handleSelectionSui"); if ( pid > -1 ) { utils.setScriptVar(self, SCRIPTVAR_PID, pid); utils.setScriptVar(self, SCRIPTVAR_PLAYER, target); utils.setScriptVar(self, SCRIPTVAR_TARGET, pet); utils.setScriptVar(self, SCRIPTVAR_OPT, opt); } return SCRIPT_CONTINUE; } prose_package ppNoCustomization = prose.getPackage(PROSE_NO_CUSTOMIZATION, pet); sendSystemMessageProse(target, ppNoCustomization); return SCRIPT_CONTINUE; } void cleanupCustomizationMenu(obj_id player) { obj_id self = getSelf(); if ( utils.hasScriptVar(self, SCRIPTVAR_PID) ) { int oldpid = utils.getIntScriptVar(self, SCRIPTVAR_PID); sui.closeSUI(player, oldpid); clearTrackingScriptVars(self); } } void cleanupCustomizationMenu() { obj_id self = getSelf(); if ( utils.hasScriptVar(self, SCRIPTVAR_PLAYER) ) { obj_id player = utils.getObjIdScriptVar(self, SCRIPTVAR_PLAYER); if ( isIdValid(player) ) cleanupCustomizationMenu(player); } } void clearTrackingScriptVars(obj_id self) { utils.removeScriptVar(self, SCRIPTVAR_PID); utils.removeScriptVar(self, SCRIPTVAR_PLAYER); utils.removeScriptVar(self, SCRIPTVAR_TARGET); utils.removeScriptVar(self, SCRIPTVAR_OPT); } messageHandler handleSelectionSui() { obj_id player = utils.getObjIdScriptVar(self, SCRIPTVAR_PLAYER); obj_id target = utils.getObjIdScriptVar(self, SCRIPTVAR_TARGET); string[] opt = utils.getStringArrayScriptVar(self, SCRIPTVAR_OPT); clearTrackingScriptVars(self); if ( !isIdValid(player) || !isIdValid(target) || opt == null || opt.length == 0 ) return SCRIPT_CONTINUE; obj_id master = pet_lib.getMaster(target); if ( !isIdValid(master) ) return SCRIPT_CONTINUE; int bp = sui.getIntButtonPressed(params); int idx = sui.getListboxSelectedRow(params); if ( bp == sui.BP_CANCEL || idx == -1 || idx >= opt.length ) { prose_package ppCancel = prose.getPackage(PROSE_CANCELLED, target); sendSystemMessageProse(player, ppCancel); if ( master != player ) { prose_package ppCancelOwner = prose.getPackage(PROSE_CANCELLED_OWNER, player, target); sendSystemMessageProse(master, ppCancelOwner); } return SCRIPT_CONTINUE; } //int pid = sui.colorize(self, player, target, opt[idx], "handleColorSelection"); int playerCustomizationMod = 0; int[] mods = getSkillStatisticModifiers(player, CUSTOMIZATION_SKILL_MODS); for(int i = 0; i < mods.length; ++i) { playerCustomizationMod += mods[i]; } if(playerCustomizationMod < 32) playerCustomizationMod = 32; if(playerCustomizationMod > 64) playerCustomizationMod = 64; string rangeMax = String.valueOf(playerCustomizationMod); string customizationVar = opt[idx]; customizationVar = customizationVar.trim(); if(customizationVar.startsWith("/")) customizationVar = customizationVar.substring(1); int pid = createSUIPage(sui.SUI_COLORPICKER, self, player, "handleColorSelection"); if(pid > -1) { setSUIProperty(pid, sui.COLORPICKER_COLORPICKER, sui.PROP_TARGETID, target.toString()); setSUIProperty(pid, sui.COLORPICKER_COLORPICKER, sui.PROP_TARGETVAR, customizationVar); setSUIProperty(pid, sui.COLORPICKER_COLORPICKER, sui.PROP_TARGETRANGEMAX, rangeMax); setSUIProperty(pid, sui.COLORPICKER_TITLE, sui.PROP_TEXT, sui.DEFAULT_TITLE); subscribeToSUIProperty(pid, sui.COLORPICKER_COLORPICKER, sui.PROP_SELECTEDINDEX); showSUIPage(pid); utils.setScriptVar(self, SCRIPTVAR_PID, pid); utils.setScriptVar(self, SCRIPTVAR_PLAYER, player); utils.setScriptVar(self, SCRIPTVAR_TARGET, target); utils.setScriptVar(self, SCRIPTVAR_OPT, opt[idx]); } return SCRIPT_CONTINUE; } messageHandler handleColorSelection() { obj_id player = utils.getObjIdScriptVar(self, SCRIPTVAR_PLAYER); obj_id target = utils.getObjIdScriptVar(self, SCRIPTVAR_TARGET); string var = utils.getStringScriptVar(self, SCRIPTVAR_OPT); clearTrackingScriptVars(self); if ( !isIdValid(player) || !isIdValid(target) || var == null || var.equals("") ) return SCRIPT_CONTINUE; obj_id master = pet_lib.getMaster(target); if ( !isIdValid(master) ) return SCRIPT_CONTINUE; int bp = sui.getIntButtonPressed(params); if ( bp == sui.BP_CANCEL ) { prose_package ppCancel = prose.getPackage(PROSE_CANCELLED, target); sendSystemMessageProse(player, ppCancel); if ( master != player ) { prose_package ppCancelOwner = prose.getPackage(PROSE_CANCELLED_OWNER, player, target); sendSystemMessageProse(master, ppCancelOwner); } return SCRIPT_CONTINUE; } int idx = sui.getColorPickerIndex(params); if ( idx > -1 ) { //debugSpeakMsg(player, "attempting to setColor: var = " + var + " idx = " + idx); dictionary d = new dictionary(); d.put("player", player); d.put("target", target); d.put("master", master); d.put("tool", self); dictionary dc = new dictionary(); dc.put(var, idx); d.put("dc", dc); messageTo(target, "handleSetCustomization", d, 0f, false); } return SCRIPT_CONTINUE; } messageHandler customizationSuccess() { if ( params != null && !params.isEmpty() ) { obj_id player = params.getObjId("player"); obj_id target = params.getObjId("target"); obj_id master = params.getObjId("master"); if ( isIdValid(player) && isIdValid(target) && isIdValid(master) ) { prose_package ppComplete = prose.getPackage(PROSE_COMPLETE, target); sendSystemMessageProse(player, ppComplete); if ( master != player && exists(master) && master.isLoaded() ) { prose_package ppCompleteOwner = prose.getPackage(PROSE_COMPLETE_OWNER, player, target); sendSystemMessageProse(master, ppCompleteOwner); } utils.setScriptVar(target, "customizationUpdated", player); } } incrementCount(self, -1); if ( getCount(self) < 1 ) destroyObject(self); return SCRIPT_CONTINUE; } messageHandler customizationFailed() { if ( params != null && !params.isEmpty() ) { obj_id player = params.getObjId("player"); obj_id target = params.getObjId("target"); obj_id master = params.getObjId("master"); if ( isIdValid(player) && isIdValid(target) && isIdValid(master) ) { prose_package ppFail = prose.getPackage(PROSE_FAIL, target); sendSystemMessageProse(player, ppFail); if ( master != player && exists(master) && master.isLoaded() ) { prose_package ppFailOwner = prose.getPackage(PROSE_FAIL_OWNER, player, target); sendSystemMessageProse(master, ppFailOwner); } } } return SCRIPT_CONTINUE; }