package script.ai; import script.*; import script.base_class.*; import script.combat_engine.*; import java.util.Arrays; import java.util.Hashtable; import java.util.Vector; import script.base_script; import script.library.ai_lib; import script.library.battlefield; import script.library.beast_lib; import script.library.bio_engineer; import script.library.buff; import script.library.callable; import script.library.consumable; import script.library.create; import script.library.factions; import script.library.healing; import script.library.hue; import script.library.incubator; import script.library.pet_lib; import script.library.prose; import script.library.space_crafting; import script.library.space_transition; import script.library.space_utils; import script.library.stealth; import script.library.sui; import script.library.target_dummy; import script.library.utils; import script.library.vehicle; public class pet_control_device extends script.base_script { public pet_control_device() { } public static final String CREATURE_TABLE = "datatables/mob/creatures.iff"; public static final String PCDPING_PCD_SCRIPT_NAME = "ai.pcd_ping_response"; public static final String MESSAGE_PET_ID = "petId"; public static final String CALLED_FOR_PET = "player.calledForPet"; public static final string_id SID_NO_VALID_MEDICINE = new string_id("pet/pet_menu", "no_valid_medicine"); public static final string_id SID_MUST_DISMOUNT = new string_id("pet/pet_menu", "must_dismount"); public static final string_id SID_CONVERT_PROMPT = new string_id(pet_lib.MENU_FILE, "convert_pet_prompt"); public static final string_id SID_CONVERT_TITLE = new string_id(pet_lib.MENU_FILE, "convert_pet_title"); public static final string_id SID_NO_MOUNT_WHILE_STEALTH = new string_id(pet_lib.MENU_FILE, "no_mount_stealth"); public static final string_id SHAPECHANGE = new string_id("spam", "not_while_shapechanged"); public static final boolean debug = false; public int OnInitialize(obj_id self) throws InterruptedException { if (debug) { LOG("pcdping-debug", "pet_control_device.OnInitialize(): self=[" + self + "] entered"); } if (!hasScript(self, PCDPING_PCD_SCRIPT_NAME)) { if (debug) { LOG("pcdping-debug", "pet_control_device.OnInitialize(): attaching script [" + PCDPING_PCD_SCRIPT_NAME + "] to PCD id=[" + self + "]"); } attachScript(self, PCDPING_PCD_SCRIPT_NAME); } if (debug) { LOG("pcdping-debug", "pet_control_device.OnInitialize(): self=[" + self + "] exited"); } if (hasObjVar(self, "module_data.struct_maint")) { int struct = getIntObjVar(self, "module_data.struct_maint"); if (struct > 15) { struct = 15; setObjVar(self, "module_data.struct_maint", struct); } } if (hasObjVar(self, "ai.pet.commandList")) { String[] commandList = getStringArrayObjVar(self, "ai.pet.commandList"); if (commandList != null && commandList.length > 0) { for (int i = 0; i < commandList.length; i++) { if (!commandList[i].equals("")) { setObjVar(self, "ai.pet.command." + i, commandList[i]); } } } removeObjVar(self, "ai.pet.commandList"); } if (!hasObjVar(self, "ai.petAbility.available")) { int petType = getIntObjVar(self, "ai.pet.type"); if (petType == pet_lib.PET_TYPE_AGGRO || petType == pet_lib.PET_TYPE_NON_AGGRO) { int level = getLevelFromPetControlDevice(self); int maxSlots = pet_lib.getMaxAbilitySlots(level); if (hasObjVar(self, "pet.crafted")) { maxSlots = (int)(maxSlots * 0.7f); } else { maxSlots = (int)(maxSlots * 0.9f); } setObjVar(self, "ai.petAbility.toBeEarned", maxSlots); setObjVar(self, "ai.petAbility.available", 0); } } if (hasObjVar(self, "ai.pet.trainedMount")) { setObjVar(self, "ai.pet.type", pet_lib.PET_TYPE_MOUNT); } if (hasObjVar(self, "dancingDroid.soundObject")) { obj_id soundObject = getObjIdObjVar(self, "dancingDroid.soundObject"); dictionary dict = new dictionary(); dict.put("pcd", self); messageTo(soundObject, "destroyDancingDroidSoundObject", dict, 0, true); } return SCRIPT_CONTINUE; } public int OnObjectMenuRequest(obj_id self, obj_id player, menu_info mi) throws InterruptedException { if (ai_lib.aiIsDead(player)) { return SCRIPT_CONTINUE; } obj_id myContainer = getContainedBy(self); obj_id yourPad = utils.getPlayerDatapad(player); if (myContainer != yourPad) { if (hasScript(myContainer, "ai.pet_control_device")) { putIn(self, yourPad); } return SCRIPT_CONTINUE; } if (!hasObjVar(self, beast_lib.OBJVAR_OLD_PET_IDENTIFIER) && !pet_lib.isPetType(self, pet_lib.PET_TYPE_FAMILIAR) && !pet_lib.isPetType(self, pet_lib.PET_TYPE_NPC) && !pet_lib.isPetType(self, pet_lib.PET_TYPE_DROID)) { if (!hasObjVar(self, "noStuff")) { mi.addRootMenu(menu_info_types.SERVER_MENU1, new string_id(pet_lib.MENU_FILE, "convert_pet")); } } if (pet_lib.isMountPcd(self) && callable.getControlDeviceType(self) == callable.CALLABLE_TYPE_RIDEABLE && !pet_lib.hasMountName(self)) { mi.addRootMenu(menu_info_types.SERVER_MENU2, new string_id("pet/pet_menu", "name_mount")); } obj_id currentPet = callable.getCDCallable(self); if (!isIdValid(currentPet)) { if (callable.hasCDCallable(self)) { if (currentPet.isLoaded()) { destroyObject(currentPet); callable.setCDCallable(self, null); } else { messageTo(currentPet, "handlePackRequest", null, 1, false); } } if (!isSpaceScene() || getState(player, STATE_SHIP_INTERIOR) == 1) { setCount(self, 0); mi.addRootMenu(menu_info_types.PET_CALL, new string_id(pet_lib.MENU_FILE, "menu_call")); } } else { if (currentPet.isLoaded() && exists(currentPet)) { if (!hasObjVar(currentPet, battlefield.VAR_CONSTRUCTED)) { mi.addRootMenu(menu_info_types.PET_CALL, new string_id(pet_lib.MENU_FILE, "menu_store")); } } else { mi.addRootMenu(menu_info_types.PET_CALL, new string_id(pet_lib.MENU_FILE, "menu_store")); } } int maxVitality = pet_lib.MAX_VITALITY_LOSS - getIntObjVar(self, "pet.maxVitality"); if (maxVitality < 1) { setObjVar(self, "pet.maxVitality", pet_lib.MAX_VITALITY_LOSS); maxVitality = 0; } int vitality = maxVitality - getIntObjVar(self, "pet.vitality"); if (vitality < 1) { setObjVar(self, "pet.vitality", pet_lib.MAX_VITALITY_LOSS); vitality = 0; } if (vitality < maxVitality) { mi.addRootMenu(menu_info_types.SERVER_HEAL_WOUND, new string_id(pet_lib.MENU_FILE, "menu_vitapack")); } if (hasObjVar(self, "ai.pet.command")) { if (hasObjVar(self, "ai.pet.type")) { int petType = getIntObjVar(self, "ai.pet.type"); if (petType == 4) { return SCRIPT_CONTINUE; } } mi.addRootMenu(menu_info_types.PET_COMMAND, new string_id(pet_lib.MENU_FILE, "menu_commandlist")); } return SCRIPT_CONTINUE; } public int OnObjectMenuSelect(obj_id self, obj_id player, int item) throws InterruptedException { if (ai_lib.aiIsDead(player) || getPerformanceType(player) != 0) { sendSystemMessage(player, new string_id("spam", "cant_do_it_state")); return SCRIPT_CONTINUE; } if (item == menu_info_types.PET_COMMAND) { listAllCommands(self, player); return SCRIPT_CONTINUE; } if (item == menu_info_types.PET_CALL) { int petType = getIntObjVar(self, "ai.pet.type"); if ((petType == pet_lib.PET_TYPE_NON_AGGRO || petType == pet_lib.PET_TYPE_AGGRO) && !hasObjVar(self, "ai.pet.trainedMount")) { return SCRIPT_CONTINUE; } String petObjVar = getStringObjVar(self, "pet.creatureName"); if (utils.hasScriptVar(player, "petCreationPending") && utils.getIntScriptVar(player, "petCreationPending") > getGameTime()) { return SCRIPT_CONTINUE; } if (isSpaceScene() && getState(player, STATE_SHIP_INTERIOR) != 1) { string_id strSpam = new string_id("space/space_interaction", "no_action_station"); sendSystemMessage(player, strSpam); return SCRIPT_CONTINUE; } if (isOnMaintRun(self)) { sendSystemMessage(player, new string_id("pet/droid_modules", "droid_maint_on_maint_run")); return SCRIPT_CONTINUE; } if (utils.hasScriptVar(player, CALLED_FOR_PET)) { int timeLeft = pet_lib.getTimeLeft(player, CALLED_FOR_PET, pet_lib.CALL_FINISH); if (timeLeft < 0) { utils.removeScriptVar(player, CALLED_FOR_PET); return SCRIPT_CONTINUE; } prose_package pp = prose.getPackage(pet_lib.SID_SYS_CALL_DELAY_FINISH_PET, timeLeft); sendSystemMessageProse(player, pp); return SCRIPT_CONTINUE; } String creatureName = getStringObjVar(self, "pet.creatureName"); if (creatureName == null || creatureName.equals("")) { return SCRIPT_CONTINUE; } obj_id currentPet = obj_id.NULL_ID; if (callable.hasCallable(player, callable.CALLABLE_TYPE_RIDEABLE) && callable.getControlDeviceType(self) == callable.CALLABLE_TYPE_RIDEABLE) { currentPet = callable.getCallable(player, callable.CALLABLE_TYPE_RIDEABLE); obj_id cd = callable.getCallableCD(currentPet); if (cd != self) { sendSystemMessage(player, pet_lib.SID_SYS_CANT_CALL_ANOTHER_RIDEABLE); return SCRIPT_CONTINUE; } else { if (pet_lib.isMountedOnCreatureQueried(currentPet, player)) { dismountCreature(player); pet_lib.setUnmountedMovementRate(player, currentPet); utils.removeScriptVar(player, callable.OBJVAR_CALLABLE_TYPE_RIDEABLE); } destroyCurrentPet(self); callable.restoreCallable(player); return SCRIPT_CONTINUE; } } if (callable.hasCallable(player, callable.CALLABLE_TYPE_RIDEABLE) && callable.getControlDeviceType(self) != callable.CALLABLE_TYPE_RIDEABLE) { obj_id rideable = callable.getCallable(player, callable.CALLABLE_TYPE_RIDEABLE); if (isIdValid(rideable) && exists(rideable)) { callable.storeCallable(player, rideable); } } if (callable.hasCDCallable(self) && !ai_lib.isInCombat(player)) { callable.storeCallable(player, callable.getCDCallable(self)); return SCRIPT_CONTINUE; } else { if (ai_lib.isInCombat(player)) { return SCRIPT_CONTINUE; } } if (callable.hasCallable(player, callable.CALLABLE_TYPE_FAMILIAR) && callable.getControlDeviceType(self) == callable.CALLABLE_TYPE_FAMILIAR) { currentPet = callable.getCallable(player, callable.CALLABLE_TYPE_FAMILIAR); obj_id cd = callable.getCallableCD(currentPet); if (cd != self) { sendSystemMessage(player, pet_lib.SID_SYS_CANT_CALL_ANOTHER_FAMILIAR); return SCRIPT_CONTINUE; } else { destroyCurrentPet(self); } return SCRIPT_CONTINUE; } if (callable.hasCDCallable(self)) { return SCRIPT_CONTINUE; } if (!pet_lib.isInValidUnpackLocation(player)) { sendSystemMessage(player, pet_lib.SID_SYS_CANT_CALL); return SCRIPT_CONTINUE; } if (pet_lib.isMountPcd(self) && pet_lib.isInRestrictedScene(player)) { sendSystemMessage(player, pet_lib.SID_SYS_CANT_CALL); return SCRIPT_CONTINUE; } if ((getLocation(player).area).startsWith("kashyyyk_pob") && getTopMostContainer(player) == player) { sendSystemMessage(player, pet_lib.SID_SYS_CANT_CALL); return SCRIPT_CONTINUE; } if (!validatePetStats(self, player)) { return SCRIPT_CONTINUE; } if (petIsDead(self, player, petType)) { return SCRIPT_CONTINUE; } if (pet_lib.hasMaxPets(player, petType)) { sendSystemMessage(player, pet_lib.SID_SYS_CANT_CALL); return SCRIPT_CONTINUE; } int petLevel = getLevelFromPetControlDevice(self); if (getLevel(player) < petLevel - pet_lib.MAX_PET_LEVELS_ABOVE_CALLER && !pet_lib.isMountPcd(self)) { sendSystemMessage(player, pet_lib.SID_SYS_CANT_CALL_LEVEL); return SCRIPT_CONTINUE; } if (!isSameFaction(self)) { return SCRIPT_CONTINUE; } if (callable.getControlDeviceType(self) == callable.CALLABLE_TYPE_RIDEABLE && getMovementPercent(player) == 0.0f) { sendSystemMessage(player, new string_id("pet/pet_menu", "cant_mount_rooted")); return SCRIPT_CONTINUE; } if (callable.getControlDeviceType(self) == callable.CALLABLE_TYPE_RIDEABLE && getPosture(player) != POSTURE_UPRIGHT) { setPosture(player, POSTURE_UPRIGHT); } if (callable.getControlDeviceType(self) == callable.CALLABLE_TYPE_RIDEABLE && callable.hasCallable(player, callable.CALLABLE_TYPE_COMBAT_PET)) { obj_id objCallable = callable.getCallable(player, callable.CALLABLE_TYPE_COMBAT_PET); if (beast_lib.isBeast(objCallable)) { utils.setScriptVar(player, callable.SCRIPTVAR_RIDEABLE_PACKED_CALLABLE, callable.getCallableCD(objCallable)); } callable.storeCallable(player, objCallable); } if (callable.getControlDeviceType(self) == callable.CALLABLE_TYPE_RIDEABLE && callable.hasCallable(player, callable.CALLABLE_TYPE_FAMILIAR)) { obj_id objCallable = callable.getCallable(player, callable.CALLABLE_TYPE_COMBAT_PET); callable.storeCallable(player, objCallable); } int callTime = pet_lib.CALL_DELAY; if (pet_lib.wasInCombat(player)) { callTime = pet_lib.modifyCallTime(player, pet_lib.COMBAT_ENDED, pet_lib.CALL_DELAY, pet_lib.POST_COMBAT_DELAY); } prose_package pp = prose.getPackage(pet_lib.SID_SYS_CALL_PET_DELAY, callTime); sendSystemMessageProse(player, pp); dictionary data = new dictionary(); data.put("player", player); data.put("pcd", self); utils.setScriptVar(player, CALLED_FOR_PET, getGameTime()); utils.setScriptVar(player, pet_lib.CALL_FINISH, callTime); utils.setScriptVar(player, "petCreationPending", (getGameTime() + pet_lib.BUTTON_MASHING_DELAY)); messageTo(self, "delayCreatePet", data, callTime, false); return SCRIPT_CONTINUE; } else if (item == menu_info_types.SERVER_HEAL_WOUND) { obj_id pet_med = healing.findPetVitalityMed(player); if (!isIdValid(pet_med)) { obj_id pet = callable.getCDCallable(self); if (pet_lib.performVitalityHeal(player, pet, self, pet_med)) { consumable.decrementCharges(pet_med, player); } } else { sendSystemMessage(self, SID_NO_VALID_MEDICINE); } } else if (item == menu_info_types.SERVER_MENU1 && !hasObjVar(self, beast_lib.OBJVAR_OLD_PET_IDENTIFIER) && !pet_lib.isPetType(self, pet_lib.PET_TYPE_FAMILIAR) && !pet_lib.isPetType(self, pet_lib.PET_TYPE_NPC) && !pet_lib.isPetType(self, pet_lib.PET_TYPE_DROID)) { int pid = sui.msgbox(self, player, "@" + SID_CONVERT_PROMPT, sui.YES_NO, "@" + SID_CONVERT_TITLE, "handleConvertPetSui"); } if (item == menu_info_types.SERVER_MENU2 && callable.getControlDeviceType(self) == callable.CALLABLE_TYPE_RIDEABLE && !pet_lib.hasMountName(self)) { sui.inputbox(self, player, "@pet/pet_menu:name_d", sui.OK_CANCEL, "@pet/pet_menu:name_t", sui.INPUT_NORMAL, null, "handleSetMountName", null); return SCRIPT_CONTINUE; } return SCRIPT_CONTINUE; } public int handleSetMountName(obj_id self, dictionary params) throws InterruptedException { obj_id player = sui.getPlayerId(params); String mountName = sui.getInputBoxText(params); int btn = sui.getIntButtonPressed(params); if (btn == sui.BP_CANCEL) { return SCRIPT_CONTINUE; } if (mountName.equals("") || isNameReserved(mountName)) { sendSystemMessage(player, new string_id("player_structure", "obscene")); sui.inputbox(self, player, "@pet/pet_menu:name_d", sui.OK_CANCEL, "@pet/pet_menu:name_t", sui.INPUT_NORMAL, null, "handleSetMountName", null); return SCRIPT_CONTINUE; } if (mountName.length() < 3) { sendSystemMessage(player, new string_id("pet/pet_menu", "mount_name_too_short")); sui.inputbox(self, player, "@pet/pet_menu:name_d", sui.OK_CANCEL, "@pet/pet_menu:name_t", sui.INPUT_NORMAL, null, "handleSetMountName", null); return SCRIPT_CONTINUE; } if (mountName.length() > 40) { sendSystemMessage(player, new string_id("pet/pet_menu", "mount_name_too_long")); sui.inputbox(self, player, "@pet/pet_menu:name_d", sui.OK_CANCEL, "@pet/pet_menu:name_t", sui.INPUT_NORMAL, null, "handleSetMountName", null); return SCRIPT_CONTINUE; } sendDirtyObjectMenuNotification(self); pet_lib.setMountName(self, mountName); return SCRIPT_CONTINUE; } public int delayCreatePet(obj_id self, dictionary params) throws InterruptedException { obj_id player = params.getObjId("player"); obj_id pcd = params.getObjId("pcd"); if (ai_lib.isInCombat(player) || pet_lib.wasInCombat(player)) { utils.removeScriptVar(player, CALLED_FOR_PET); return SCRIPT_CONTINUE; } if (!isGod(player)) { obj_id mount = getMountId(player); if (vehicle.isRidingVehicle(player) || isIdValid(mount)) { if (!vehicle.canQuickUnpack(player)) { utils.removeScriptVar(player, CALLED_FOR_PET); return SCRIPT_CONTINUE; } } } if (!pet_lib.isInValidUnpackLocation(player)) { sendSystemMessage(player, pet_lib.SID_SYS_CANT_CALL); utils.removeScriptVar(player, CALLED_FOR_PET); return SCRIPT_CONTINUE; } if (hasObjVar(pcd, "pet.creatureName")) { int petType = pet_lib.getPetType(getStringObjVar(pcd, "pet.creatureName")); if (hasObjVar(pcd, "ai.pet.trainedMount")) { petType = pet_lib.PET_TYPE_MOUNT; } if (pet_lib.countPetsOfType(self, petType) >= pet_lib.getMaxPets(self, petType)) { utils.removeScriptVar(player, CALLED_FOR_PET); return SCRIPT_CONTINUE; } } pet_lib.createPetFromData(pcd); obj_id pet = callable.getCDCallable(pcd); if (pet_lib.isMountPcd(pcd)) { if (!hasObjVar(pcd, "pet.species")) { int species = getSpecies(pet); if (species >= 0) { setObjVar(pcd, "pet.species", species); } } } if (isIdValid(pet)) { dictionary parms = new dictionary(); parms.put("calledPet", pet); messageTo(pcd, "handleValidatePet", parms, 5, false); } utils.removeScriptVar(player, CALLED_FOR_PET); if (hasObjVar(pcd, "ai.pet.trainedMount")) { String invis = stealth.getInvisBuff(player); if (invis != null && !invis.equals("")) { sendSystemMessage(player, SID_NO_MOUNT_WHILE_STEALTH); callable.storeCallable(player, pet); return SCRIPT_CONTINUE; } dictionary dict = new dictionary(); dict.put("player", player); dict.put("pet", pet); if (hasObjVar(self, beast_lib.OBJVAR_BEAST_HUE)) { int mountHue = getIntObjVar(self, beast_lib.OBJVAR_BEAST_HUE); hue.setColor(pet, hue.INDEX_1, mountHue); } messageTo(self, "delayMountPet", dict, 1, false); } return SCRIPT_CONTINUE; } public int delayMountPet(obj_id self, dictionary params) throws InterruptedException { if (params == null || params.isEmpty()) { return SCRIPT_CONTINUE; } obj_id player = params.getObjId("player"); obj_id pet = params.getObjId("pet"); if (!isIdValid(player) || !exists(player) || !isIdValid(pet) || !exists(pet)) { return SCRIPT_CONTINUE; } if (getPosture(player) != POSTURE_UPRIGHT || ai_lib.isInCombat(player) || getPerformanceType(player) != 0) { destroyCurrentPet(self); return SCRIPT_CONTINUE; } int shapechange = buff.getBuffOnTargetFromGroup(player, "shapechange"); if (shapechange != 0) { sendSystemMessage(player, SHAPECHANGE); return SCRIPT_CONTINUE; } mountCreature(player, pet); pet_lib.setMountedMovementRate(player, pet); return SCRIPT_CONTINUE; } public void destroyCurrentPet(obj_id petControlDevice) throws InterruptedException { obj_id datapad = getContainedBy(petControlDevice); obj_id player = getContainedBy(datapad); obj_id currentPet = callable.getCDCallable(petControlDevice); if (isIdValid(currentPet)) { if (currentPet.isLoaded() && exists(currentPet)) { if (!destroyObject(currentPet)) { sendSystemMessage(player, SID_MUST_DISMOUNT); return; } } else { messageTo(currentPet, "handlePackRequest", null, 1, false); } } setTimeStored(petControlDevice); callable.setCDCallable(petControlDevice, null); } public int handleStorePetRequest(obj_id self, dictionary params) throws InterruptedException { obj_id currentPet = callable.getCDCallable(self); if (!isIdValid(currentPet)) { destroyCurrentPet(self); return SCRIPT_CONTINUE; } obj_id player = params.getObjId("master"); if (player.isLoaded() && currentPet.isLoaded()) { if (pet_lib.wasInCombatRecently(currentPet, player, true)) { return SCRIPT_CONTINUE; } } if (currentPet.isLoaded() && ai_lib.isInCombat(currentPet)) { return SCRIPT_CONTINUE; } destroyCurrentPet(self); return SCRIPT_CONTINUE; } public int OnAboutToReceiveItem(obj_id self, obj_id srcContainer, obj_id transferer, obj_id item) throws InterruptedException { if (hasScript(item, "ai.pet_control_device")) { return SCRIPT_OVERRIDE; } if (!isIdValid(transferer)) { return SCRIPT_CONTINUE; } return SCRIPT_OVERRIDE; } public int OnDestroy(obj_id self) throws InterruptedException { if (!hasObjVar(self, "pet.releasingPet")) { destroyCurrentPet(self); } obj_id datapad = getContainedBy(self); if (!isIdValid(datapad)) { return SCRIPT_CONTINUE; } obj_id master = getContainedBy(datapad); if (!isIdValid(master)) { return SCRIPT_CONTINUE; } if (!hasObjVar(self, "pet.isDead")) { int petType = getIntObjVar(self, "ai.pet.type"); if (petType == pet_lib.PET_TYPE_NON_AGGRO || petType == pet_lib.PET_TYPE_AGGRO) { sendSystemMessage(master, new string_id("pet/pet_menu", "pet_released")); } } if (callable.hasCDCallable(self)) { obj_id pet = callable.getCDCallable(self); obj_id rider = getRiderId(pet); if (isIdValid(rider) && exists(rider)) { dismountCreature(rider); utils.removeScriptVar(rider, callable.OBJVAR_CALLABLE_TYPE_RIDEABLE); } destroyObject(pet); } return SCRIPT_CONTINUE; } public int OnTransferred(obj_id self, obj_id sourceContainer, obj_id destContainer, obj_id transferer) throws InterruptedException { if (!exists(self)) { return SCRIPT_CONTINUE; } destroyCurrentPet(self); return SCRIPT_CONTINUE; } public int handleGrowthChoice(obj_id self, dictionary params) throws InterruptedException { obj_id player = sui.getPlayerId(params); obj_id petControlDevice = null; if (!isIdValid(player)) { return SCRIPT_CONTINUE; } int bp = sui.getIntButtonPressed(params); if (utils.hasScriptVar(player, "mountgrowthcheck.pcd")) { petControlDevice = utils.getObjIdScriptVar(player, "mountgrowthcheck.pcd"); utils.removeScriptVar(player, "mountgrowthcheck.pcd"); } if (bp == sui.BP_CANCEL) { setObjVar(petControlDevice, "ai.petAdvance.letPetGrow", 1); return SCRIPT_CONTINUE; } int growthStage; if (!hasObjVar(petControlDevice, "ai.petAdvance.growthStage")) { growthStage = 10; } else { growthStage = getIntObjVar(petControlDevice, "ai.petAdvance.growthStage"); } int largestMountableGrowthStage = getIntObjVar(petControlDevice, "ai.petAdvance.lrgMnt"); setObjVar(petControlDevice, "ai.petAdvance.growthStage", largestMountableGrowthStage); setObjVar(petControlDevice, "ai.petAdvance.freezegrowth", largestMountableGrowthStage); pet_lib.createPetFromData(petControlDevice); return SCRIPT_CONTINUE; } public int OnAttach(obj_id self) throws InterruptedException { obj_id datapad = getContainedBy(self); if (!isIdValid(datapad)) { return SCRIPT_CONTINUE; } obj_id master = getContainedBy(datapad); if (!isIdValid(master)) { return SCRIPT_CONTINUE; } sendSystemMessage(master, new string_id("pet/pet_menu", "device_added")); return SCRIPT_CONTINUE; } public int OnGetAttributes(obj_id self, obj_id player, String[] names, String[] attribs) throws InterruptedException { if (!exists(self)) { return SCRIPT_CONTINUE; } String creatureName = getStringObjVar(self, "pet.creatureName"); if (creatureName == null || creatureName.equals("")) { return SCRIPT_CONTINUE; } int idx = utils.getValidAttributeIndex(names); if (idx == -1) { return SCRIPT_CONTINUE; } if (callable.getControlDeviceType(self) == callable.CALLABLE_TYPE_RIDEABLE) { names[idx] = "rideables_current_of_max"; int currentRideables = callable.getNumStoredCDByType(player, callable.CALLABLE_TYPE_RIDEABLE); int maxRideables = callable.getMaxAllowedStoredRideables(player); attribs[idx] = "" + target_dummy.BLUE + currentRideables + " of " + maxRideables; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } boolean isMount = pet_lib.isMountPcd(self); if (pet_lib.isDroidPet(self)) { int level = getLevelFromPetControlDevice(self); names[idx] = "challenge_level"; int adultLevel = pet_lib.getAdultLevel(creatureName); if (hasObjVar(self, "creature_attribs.level")) { adultLevel = getIntObjVar(self, "creature_attribs.level"); } if (adultLevel != level) { attribs[idx] = Integer.toString(level) + " (" + Integer.toString(adultLevel) + ")"; } else { attribs[idx] = Integer.toString(level); } idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } if (hasObjVar(self, "ai.petAbility.available")) { int available = getIntObjVar(self, "ai.petAbility.available"); int toBeEarned = getIntObjVar(self, "ai.petAbility.toBeEarned"); names[idx] = "ability_slots"; if (available == 0 && toBeEarned == 0) { attribs[idx] = utils.packStringId(new string_id("obj_attr_n", "ability_slot_max")); } else { attribs[idx] = "" + available; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } int trainingPts = getIntObjVar(self, "ai.petAbility.trainingPts"); names[idx] = "ability_points"; attribs[idx] = "" + trainingPts; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } int xpEarned = getIntObjVar(self, "ai.petAdvance.xpEarned"); int xpToLevel = pet_lib.getPcdXpForNextLevel(self); names[idx] = "ability_xp"; attribs[idx] = "" + xpEarned + "/" + xpToLevel; } idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } int maxVitality = pet_lib.MAX_VITALITY_LOSS - getIntObjVar(self, "pet.maxVitality"); if (maxVitality < 1) { setObjVar(self, "pet.maxVitality", pet_lib.MAX_VITALITY_LOSS); maxVitality = 0; } int vitality = maxVitality - getIntObjVar(self, "pet.vitality"); if (vitality < 1) { setObjVar(self, "pet.vitality", pet_lib.MAX_VITALITY_LOSS); vitality = 0; } names[idx] = "creature_vitality"; attribs[idx] = "" + vitality + "/" + maxVitality; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } if (hasObjVar(self, "pet.crafted")) { if (hasObjVar(self, "creature_attribs." + create.MAXATTRIBNAMES[HEALTH])) { names[idx] = "pet_stats.creature_health"; int health = getIntObjVar(self, "creature_attribs." + create.MAXATTRIBNAMES[HEALTH]); health += pet_lib.getPetAbilityHealthBonus(self, health); if (vitality < pet_lib.MAX_VITALITY_LOSS) { attribs[idx] = "" + pet_lib.getReducedStatValue(health, vitality) + "/"; } else { attribs[idx] = ""; } attribs[idx] += "" + health; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "creature_attribs." + create.MAXATTRIBNAMES[CONSTITUTION])) { names[idx] = "pet_stats.creature_health_regen"; int regen = getIntObjVar(self, "creature_attribs." + create.MAXATTRIBNAMES[CONSTITUTION]); regen += pet_lib.getPetAbilityRegenBonus(self, regen); if (vitality < pet_lib.MAX_VITALITY_LOSS) { attribs[idx] = "" + pet_lib.getReducedStatValue(regen, vitality) + "/"; } else { attribs[idx] = ""; } attribs[idx] += "" + regen; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "creature_attribs.general_protection")) { int general_protection = getIntObjVar(self, "creature_attribs.general_protection"); names[idx] = "pet_stats.dna_comp_armor_effectiveness"; attribs[idx] = "" + general_protection; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } int niche = dataTableGetInt(CREATURE_TABLE, creatureName, "niche"); if (niche != NICHE_DROID || pet_lib.isCombatDroidPCD(self)) { if (hasObjVar(self, "creature_attribs.toHitChance")) { names[idx] = "pet_stats.creature_tohit"; int value = getIntObjVar(self, "creature_attribs.toHitChance"); attribs[idx] = "" + value; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "creature_attribs.defenseValue")) { names[idx] = "pet_stats.creature_defense"; int value = getIntObjVar(self, "creature_attribs.defenseValue"); attribs[idx] = "" + value; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "creature_attribs.stateResist")) { names[idx] = "pet_stats.creature_state_resist"; float value = getFloatObjVar(self, "creature_attribs.stateResist"); attribs[idx] = "" + value * 100 + "%"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "creature_attribs.critChance")) { names[idx] = "pet_stats.creature_crit_chance"; float value = getFloatObjVar(self, "creature_attribs.critChance"); attribs[idx] = "" + value * 100 + "%"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "creature_attribs.critSave")) { names[idx] = "pet_stats.creature_crit_save"; float value = getFloatObjVar(self, "creature_attribs.critSave"); attribs[idx] = "" + value * 100 + "%"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "creature_attribs.aggroBonus")) { names[idx] = "pet_stats.creature_aggro_bonus"; float value = getFloatObjVar(self, "creature_attribs.aggroBonus"); attribs[idx] = "" + value * 100 + "%"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "creature_attribs.minDamage")) { names[idx] = "pet_stats.creature_damage"; int min = getIntObjVar(self, "creature_attribs.minDamage"); int max = getIntObjVar(self, "creature_attribs.maxDamage"); int[] dmgBonus = pet_lib.getPetAbilityDamageBonus(self, min, max); min += dmgBonus[0]; max += dmgBonus[1]; attribs[idx] = "" + min + " - " + max; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } if (hasObjVar(self, "creature_attribs." + bio_engineer.ATTRIB_DICT_RANGED_WEAPON)) { String weapon = getStringObjVar(self, "creature_attribs." + bio_engineer.ATTRIB_DICT_RANGED_WEAPON); if (weapon != null) { names[idx] = "pet_stats.dna_comp_ranged_attack"; if (weapon.equals("")) { attribs[idx] = "No"; } else { attribs[idx] = "Yes"; } idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } if (niche == NICHE_DROID || niche == NICHE_ANDROID) { int powerLevel = getIntObjVar(self, "ai.pet.powerLevel"); float percentRemaining = (((float)pet_lib.OUT_OF_POWER - (float)powerLevel) / (float)pet_lib.OUT_OF_POWER) * 100.0f; names[idx] = "pet_stats.battery_power"; attribs[idx] = " " + (int)percentRemaining + "%"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "medpower")) { names[idx] = "pet_stats.medpower"; float med = getFloatObjVar(self, "medpower"); attribs[idx] = " " + ((int)(med * 100)); idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "ai.pet.isRepairDroid")) { names[idx] = "pet_stats.is_repair_droid"; attribs[idx] = " installed"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "storageModuleRating")) { names[idx] = "pet_stats.storage_module_rating"; int storage = getIntObjVar(self, "storageModuleRating"); attribs[idx] = "" + storage; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "ai.pet.hasContainer")) { names[idx] = "pet_stats.storage_module_rating"; int storage = getIntObjVar(self, "ai.pet.hasContainer"); attribs[idx] = "" + storage; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } obj_id petInv = utils.getInventoryContainer(self); if (isIdValid(petInv)) { storage = getTotalVolume(petInv); if (storage > 0) { names[idx] = "pet_stats.inventory_capacity"; attribs[idx] = "" + storage; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } } if (hasObjVar(self, "dataModuleRating")) { int datastorage = getIntObjVar(self, "dataModuleRating"); if (space_crafting.isUsableAstromechPet(self)) { obj_id[] loadedDroidCommands = space_crafting.getDatapadDroidCommands(self); if ((loadedDroidCommands != null) && (loadedDroidCommands.length > 0)) { names[idx] = "pet_stats.droid_program_loaded"; attribs[idx] = " "; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } for (int i = 0; i < loadedDroidCommands.length; i++) { if (hasObjVar(loadedDroidCommands[i], "strDroidCommand")) { String programName = getStringObjVar(loadedDroidCommands[i], "strDroidCommand"); names[idx] = "pet_stats.droid_program"; attribs[idx] = " " + localize(new string_id("space/droid_commands", programName)); idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } } names[idx] = "pet_stats.data_module_cert_needed"; String certNeeded = "Level 1"; if ((datastorage > 0) && (datastorage <= 2)) { certNeeded = "Level 1"; } else if (datastorage <= 4) { certNeeded = "Level 2"; } else if (datastorage <= 6) { certNeeded = "Level 3"; } else if (datastorage <= 8) { certNeeded = "Level 4"; } else if (datastorage <= 10) { certNeeded = "Level 5"; } else if (datastorage > 10) { certNeeded = "Level 6"; } attribs[idx] = " " + certNeeded; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.data_module_rating"; attribs[idx] = "" + datastorage; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } obj_id petInv = utils.getObjectInSlot(self, "datapad"); if (isIdValid(petInv)) { int storage = getTotalVolume(petInv); if (storage > 0) { names[idx] = "pet_stats.datapad_slots"; attribs[idx] = "" + storage; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } } } if (hasObjVar(self, "craftingStation")) { names[idx] = "pet_stats.crafting_station"; attribs[idx] = " installed"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "craftingStationSpace")) { names[idx] = "pet_stats.crafting_station_space"; attribs[idx] = " installed"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "craftingStationStructure")) { names[idx] = "pet_stats.crafting_station_structure"; attribs[idx] = " installed"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "craftingStationClothing")) { names[idx] = "pet_stats.crafting_station_clothing"; attribs[idx] = " installed"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "craftingStationFood")) { names[idx] = "pet_stats.crafting_station_food"; attribs[idx] = " installed"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "craftingStationWeapon")) { names[idx] = "pet_stats.crafting_station_weapon"; attribs[idx] = " installed"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "ai.diction")) { names[idx] = "pet_stats.ai_diction"; String personality = getStringObjVar(self, "ai.diction"); attribs[idx] = " " + localize(new string_id("npc_reaction/npc_diction", personality)); idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.bomb_level")) { names[idx] = "pet_stats.bomb_level"; int datastorage = getIntObjVar(self, "module_data.bomb_level"); if (hasObjVar(self, "module_data.bomb_level_bonus")) { datastorage += getIntObjVar(self, "module_data.bomb_level_bonus"); } int minDamage = datastorage * pet_lib.DETONATION_DROID_MIN_DAMAGE; int maxDamage = datastorage * pet_lib.DETONATION_DROID_MAX_DAMAGE; attribs[idx] = " " + datastorage + " (" + minDamage + " - " + maxDamage + ")"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.merchant_barker")) { names[idx] = "pet_stats.merchant_barker"; attribs[idx] = " installed"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.stimpack_capacity")) { names[idx] = "pet_stats.stimpack_power"; int power = getIntObjVar(self, "module_data.stim_power"); int supply = getIntObjVar(self, "module_data.stimpack_supply"); int capacity = getIntObjVar(self, "module_data.stimpack_capacity"); int speed = getIntObjVar(self, "module_data.stimpack_speed"); if (power < 0) { power = 0; } if (supply < 0) { supply = 0; } attribs[idx] = " " + power; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.stimpack_capacity"; attribs[idx] = " " + supply + " / " + capacity; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.stimpack_speed"; attribs[idx] = " " + speed; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.auto_repair_power")) { names[idx] = "pet_stats.auto_repair_power"; int datastorage = getIntObjVar(self, "module_data.auto_repair_power"); attribs[idx] = " " + datastorage; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.playback.modules")) { names[idx] = "pet_stats.playback_modules"; int numModules = getIntObjVar(self, "module_data.playback.modules"); attribs[idx] = " " + numModules; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.harvest_power")) { names[idx] = "pet_stats.harvest_power"; int bonusHarvest = getIntObjVar(self, "module_data.harvest_power"); attribs[idx] = " " + bonusHarvest; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.entertainer_effects")) { String[] effects = pet_lib.getLightingEffects(self); if (effects != null) { for (int i = 0; i < effects.length; i++) { names[idx] = "pet_stats." + effects[i]; attribs[idx] = " installed"; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } } if (hasObjVar(self, "module_data.struct_maint")) { names[idx] = "pet_stats.struct_module_rating"; int struct = getIntObjVar(self, "module_data.struct_maint"); attribs[idx] = " " + struct; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.trap_bonus")) { names[idx] = "pet_stats.trap_bonus"; int trapBonus = getIntObjVar(self, "module_data.trap_bonus"); attribs[idx] = " " + trapBonus; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.fire_potency")) { names[idx] = "pet_stats.fire_potency"; int firePotency = getIntObjVar(self, "module_data.fire_potency"); attribs[idx] = " " + firePotency; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.flame_jet_level"; int bonusFlameJetLevel = pet_lib.getDroidModuleCommandLevel(player, firePotency); attribs[idx] = " " + bonusFlameJetLevel; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.arc_projector")) { names[idx] = "pet_stats.arc_projector"; int attribValue = getIntObjVar(self, "module_data.arc_projector"); attribs[idx] = " " + attribValue; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.electrical_shock_level"; int bonusCommandLevel = pet_lib.getDroidModuleCommandLevel(player, attribValue); attribs[idx] = " " + bonusCommandLevel; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.shield_heatsink")) { names[idx] = "pet_stats.shield_heatsink"; int attribValue = getIntObjVar(self, "module_data.shield_heatsink"); attribs[idx] = " " + attribValue; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.droideka_shield_level"; int bonusCommandLevel = pet_lib.getDroidModuleCommandLevel(player, attribValue); attribs[idx] = " " + bonusCommandLevel; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.pain_inducer")) { names[idx] = "pet_stats.pain_inducer"; int attribValue = getIntObjVar(self, "module_data.pain_inducer"); attribs[idx] = " " + attribValue; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.torturous_needle_level"; int bonusCommandLevel = pet_lib.getDroidModuleCommandLevel(player, attribValue); attribs[idx] = " " + bonusCommandLevel; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.quickset_metal")) { names[idx] = "pet_stats.quickset_metal"; int attribValue = getIntObjVar(self, "module_data.quickset_metal"); attribs[idx] = " " + attribValue; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.regenerative_plating_level"; int bonusCommandLevel = pet_lib.getDroidModuleCommandLevel(player, attribValue); attribs[idx] = " " + bonusCommandLevel; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "module_data.dump_capacitors")) { names[idx] = "pet_stats.dump_capacitors"; int attribValue = getIntObjVar(self, "module_data.dump_capacitors"); attribs[idx] = " " + attribValue; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.battery_dump_level"; int bonusCommandLevel = pet_lib.getDroidModuleCommandLevel(player, attribValue); attribs[idx] = " " + bonusCommandLevel; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } else { dictionary creatureDict = utils.dataTableGetRow(create.CREATURE_TABLE, creatureName); if (creatureDict == null) { return SCRIPT_CONTINUE; } int baseLevel = creatureDict.getInt("BaseLevel"); int dmgLevel = baseLevel + creatureDict.getInt("Damagelevelmodifier"); int statLevel = baseLevel + creatureDict.getInt("StatLevelModifier"); int toHitLevel = baseLevel + creatureDict.getInt("ToHitLevelModifier"); int armorLevel = baseLevel + creatureDict.getInt("ArmorLevelModifier"); if (dmgLevel <= 0) { dmgLevel = 1; } if (statLevel <= 0) { statLevel = 1; } if (toHitLevel <= 0) { toHitLevel = 1; } if (armorLevel <= 0) { armorLevel = 1; } int myHealth = dataTableGetInt(create.STAT_BALANCE_TABLE, statLevel - 1, "HP"); if (myHealth < 1) { myHealth = 1; } names[idx] = "pet_stats.creature_health"; myHealth += pet_lib.getPetAbilityHealthBonus(self, myHealth); if (vitality < pet_lib.MAX_VITALITY_LOSS) { attribs[idx] = "" + pet_lib.getReducedStatValue(myHealth, vitality) + "/"; } else { attribs[idx] = ""; } attribs[idx] += "" + myHealth; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.creature_attack"; float attackSpeed = creatureDict.getInt("attackSpeed"); attackSpeed = (float)((int)(attackSpeed * 100) / 100f); attribs[idx] = "" + attackSpeed; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.creature_tohit"; int toHit = dataTableGetInt(create.STAT_BALANCE_TABLE, toHitLevel - 1, "ToHit"); attribs[idx] = "" + toHit; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } names[idx] = "pet_stats.creature_defense"; int defenseValue = dataTableGetInt(create.STAT_BALANCE_TABLE, toHitLevel - 1, "Def"); attribs[idx] = "" + defenseValue; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } float dps = dataTableGetFloat(create.STAT_BALANCE_TABLE, dmgLevel - 1, "damagePerSecond"); int minDamage = Math.round((dps * attackSpeed) * 0.5f); int maxDamage = Math.round((dps * attackSpeed) * 1.5f); int[] dmgBonus = pet_lib.getPetAbilityDamageBonus(self, minDamage, maxDamage); minDamage += dmgBonus[0]; maxDamage += dmgBonus[1]; names[idx] = "pet_stats.creature_damage"; attribs[idx] = "" + minDamage + " - " + maxDamage; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } int niche = dataTableGetInt(pet_lib.CREATURE_TABLE, creatureName, "niche"); if ((niche == NICHE_DROID || niche == NICHE_ANDROID) && hasObjVar(self, pet_lib.VAR_PALVAR_CNT)) { names[idx] = "pet_stats.customization_cnt"; attribs[idx] = Integer.toString(getIntObjVar(self, pet_lib.VAR_PALVAR_CNT)); idx++; } if (hasObjVar(self, "droid_trap")) { int maxTrapCount = pet_lib.calculateMaxTrapLoad(self); names[idx] = "pet_stats.max_trap_load"; attribs[idx] = Integer.toString(maxTrapCount); idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } String trapName = localize(new string_id("item_n", "trap_" + getStringObjVar(self, "droid_trap.trap_num.trap_name"))); names[idx] = "pet_stats.droid_trap_type"; attribs[idx] = trapName; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } int numTraps = getIntObjVar(self, "droid_trap.trap_num.charges"); names[idx] = "pet_stats.droid_trap_number"; attribs[idx] = Integer.toString(numTraps); idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } if (hasObjVar(self, "ai.petAbility.abilityList")) { int[] abilityList = getIntArrayObjVar(self, "ai.petAbility.abilityList"); if (abilityList != null && abilityList.length > 0) { if (idx >= names.length) { return SCRIPT_CONTINUE; } for (int i = 0; i < abilityList.length; i++) { if (abilityList[i] != 0) { names[idx] = "pet_ability." + pet_lib.getPetAbilityFromCrc(abilityList[i]); attribs[idx] = " "; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } } } if (hasObjVar(self, "ai.pet.command")) { if (hasObjVar(self, "ai.pet.type")) { int petType = getIntObjVar(self, "ai.pet.type"); if (petType == 4) { return SCRIPT_CONTINUE; } } obj_var_list commandList = getObjVarList(self, "ai.pet.command"); if (commandList != null && commandList.getNumItems() > 0) { if (idx >= names.length) { return SCRIPT_CONTINUE; } int numItems = commandList.getNumItems(); for (int i = 0; i < numItems; i++) { obj_var ov = commandList.getObjVar(i); String command = ov.getName(); int commandNum = Integer.parseInt(command); if (commandNum >= pet_lib.COMMAND_FOLLOW && commandNum < pet_lib.NUM_COMMANDS) { names[idx] = "pet_command.pet_command_" + ov.getName(); attribs[idx] = ov.getStringData(); idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } } } if (hasObjVar(self, "module_data.sampling_power")) { names[idx] = "sampling_power"; int bonusHarvest = getIntObjVar(self, "module_data.sampling_power"); attribs[idx] = " " + bonusHarvest; idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } if (isMount) { int speciesNum = getIntObjVar(self, "pet.species"); String strSkeleton = ai_lib.getSkeleton(speciesNum); if (strSkeleton != null && !strSkeleton.equals("")) { dictionary dctMountInfo = dataTableGetRow("datatables/mount/mount_movement_speeds.iff", strSkeleton); if (dctMountInfo != null) { float fltBaseWalkSpeed = dctMountInfo.getFloat("fltBaseWalkSpeed"); float fltBurstRunSpeed = dctMountInfo.getFloat("fltBaseRunSpeed"); names[idx] = "mount"; attribs[idx++] = "" + pet_lib.isMountPcd(self); if (hasObjVar(self, "mount_type")) { int mountType = getIntObjVar(self, "mount_type"); if (mountType == 0) { names[idx] = "walkspeed"; attribs[idx++] = "" + fltBaseWalkSpeed; names[idx] = "runspeed"; attribs[idx++] = "" + fltBurstRunSpeed; } else if (mountType == 1) { names[idx] = "glide_speed"; attribs[idx++] = "" + fltBaseWalkSpeed; names[idx] = "fly_speed"; attribs[idx++] = "" + fltBurstRunSpeed; } else { names[idx] = "walkspeed"; attribs[idx++] = "" + fltBaseWalkSpeed; names[idx] = "runspeed"; attribs[idx++] = "" + fltBurstRunSpeed; } } else { names[idx] = "walkspeed"; attribs[idx++] = "" + fltBaseWalkSpeed; names[idx] = "runspeed"; attribs[idx++] = "" + fltBurstRunSpeed; } idx++; if (idx >= names.length) { return SCRIPT_CONTINUE; } } } } return SCRIPT_CONTINUE; } public boolean isSameFaction(obj_id petControlDevice) throws InterruptedException { obj_id datapad = getContainedBy(petControlDevice); if (!isIdValid(datapad)) { return false; } obj_id master = getContainedBy(datapad); if (!isIdValid(master)) { return false; } String creatureName = getStringObjVar(petControlDevice, "pet.creatureName"); if (creatureName == null || creatureName.equals("")) { return false; } String petFaction = utils.dataTableGetString(CREATURE_TABLE, creatureName, "pvpFaction"); if (petFaction == null || petFaction.equals("")) { return true; } if (!petFaction.equals("Imperial") && !petFaction.equals("Rebel")) { return true; } if (pvpGetType(master) == PVPTYPE_NEUTRAL) { sendSystemMessage(master, new string_id(pet_lib.MENU_FILE, "not_declared")); return false; } String masterFaction = factions.getFaction(master); if (masterFaction == null || !masterFaction.equals(petFaction)) { sendSystemMessageTestingOnly(master, "masterFaction is " + masterFaction + " pet is " + petFaction); sendSystemMessage(master, new string_id(pet_lib.MENU_FILE, "not_declared")); return false; } return true; } public int OnAboutToBeTransferred(obj_id self, obj_id destContainer, obj_id transferer) throws InterruptedException { obj_id newMaster = getContainedBy(destContainer); if (!isPlayer(newMaster)) { sendSystemMessage(transferer, new string_id("pet/pet_menu", "cant_transfer_bad_container")); return SCRIPT_OVERRIDE; } if (isIdValid(transferer)) { obj_id currentContainer = getContainedBy(self); if (isIdValid(currentContainer)) { obj_id currentContOwner = getContainedBy(currentContainer); if (isIdValid(currentContOwner)) { if (hasScript(currentContOwner, "ai.pet_control_device")) { obj_id yourPad = utils.getPlayerDatapad(transferer); if (destContainer == yourPad) { return SCRIPT_CONTINUE; } } } } } if (!hasScript(newMaster, "ai.pet_master")) { attachScript(newMaster, "ai.pet_master"); } int petType = getIntObjVar(self, "ai.pet.type"); if (pet_lib.hasMaxStoredPetsOfType(newMaster, petType)) { sendSystemMessage(newMaster, pet_lib.SID_SYS_TOO_MANY_STORED_PETS); sendSystemMessage(transferer, new string_id("pet/pet_menu", "targ_too_many_stored")); return SCRIPT_OVERRIDE; } if (!canBeTransferred(self, newMaster, transferer)) { return SCRIPT_OVERRIDE; } return SCRIPT_CONTINUE; } public int getLevelFromPetControlDevice(obj_id petControlDevice) throws InterruptedException { int growthStage = 10; if (hasObjVar(petControlDevice, "ai.petAdvance.growthStage")) { growthStage = getIntObjVar(petControlDevice, "ai.petAdvance.growthStage"); } String creatureName = getStringObjVar(petControlDevice, "pet.creatureName"); if (creatureName == null) { return 1; } int maxDiff = create.calcCreatureLevel(creatureName); if (hasObjVar(petControlDevice, "creature_attribs.level")) { maxDiff = getIntObjVar(petControlDevice, "creature_attribs.level"); } if (maxDiff < 1) { maxDiff = 1; } return maxDiff; } public int handlePetDeathblow(obj_id self, dictionary params) throws InterruptedException { if (utils.hasScriptVar(self, "lastDeathBlow")) { int lastDeathBlow = utils.getIntScriptVar(self, "lastDeathBlow"); int nextDeathBlow = lastDeathBlow + 300; if (nextDeathBlow > getGameTime()) { return SCRIPT_CONTINUE; } } utils.setScriptVar(self, "lastDeathBlow", getGameTime()); obj_id killer = params.getObjId("killer"); if (!isPlayer(killer)) { int vitality = getIntObjVar(self, "pet.vitality"); vitality += 2; if (vitality > pet_lib.MAX_VITALITY_LOSS) { vitality = pet_lib.MAX_VITALITY_LOSS; } setObjVar(self, "pet.vitality", vitality); } return SCRIPT_CONTINUE; } public void setTimeStored(obj_id PCD) throws InterruptedException { setObjVar(PCD, "pet.timeStored", getGameTime()); } public int handleFlagDeadCreature(obj_id self, dictionary params) throws InterruptedException { setObjVar(self, "pet.isDead", true); return SCRIPT_CONTINUE; } public boolean petIsDead(obj_id petControlDevice, obj_id player, int petType) throws InterruptedException { if (hasObjVar(petControlDevice, "pet.isDead")) { if (petType == pet_lib.PET_TYPE_NON_AGGRO || petType == pet_lib.PET_TYPE_AGGRO || petType == pet_lib.PET_TYPE_DROID) { removeObjVar(petControlDevice, "pet.isDead"); return false; } sendSystemMessage(player, new string_id("pet/pet_menu", "dead_pet")); return true; } return false; } public boolean canBeTransferred(obj_id petControlDevice, obj_id newMaster, obj_id transferer) throws InterruptedException { String creatureName = getStringObjVar(petControlDevice, "pet.creatureName"); if (creatureName == null || creatureName.equals("")) { return false; } if (isVetRewardPet(creatureName)) { return true; } int niche = dataTableGetInt(pet_lib.CREATURE_TABLE, creatureName, "niche"); if (niche == NICHE_NPC || niche == NICHE_VEHICLE) { sendSystemMessage(newMaster, new string_id("pet/pet_menu", "bad_type")); sendSystemMessage(transferer, new string_id("pet/pet_menu", "bad_type")); return false; } int tameLevelSkillMod = pet_lib.getMaxTameLevel(transferer); int petType = getIntObjVar(petControlDevice, "ai.pet.type"); int level = create.calcCreatureLevel(creatureName); if (level > tameLevelSkillMod) { return true; } if (petType == pet_lib.PET_TYPE_NON_AGGRO && level <= pet_lib.MAX_NONCH_PET_LEVEL) { return true; } if (!hasObjVar(petControlDevice, "ai.pet.command")) { sendSystemMessage(newMaster, new string_id("pet/pet_menu", "no_xfer_command")); sendSystemMessage(transferer, new string_id("pet/pet_menu", "no_xfer_command")); return false; } String xferCommand = getStringObjVar(petControlDevice, "ai.pet.command." + pet_lib.COMMAND_TRANSFER); if (xferCommand == null || xferCommand.equals("")) { sendSystemMessage(newMaster, new string_id("pet/pet_menu", "no_xfer_command")); sendSystemMessage(transferer, new string_id("pet/pet_menu", "no_xfer_command")); return false; } else { return true; } } public boolean validatePetStats(obj_id pcd, obj_id player) throws InterruptedException { if (!hasObjVar(pcd, "pet.crafted")) { return true; } if (hasObjVar(pcd, "ai.pet.trainedMount")) { return true; } final int MAX_HAM_VALUE = 20000; final int MAX_HIT_VALUE = 500; final int MAX_DAM_VALUE = 1500; if (getIntObjVar(pcd, "creature_attribs." + create.MAXATTRIBNAMES[HEALTH]) > MAX_HAM_VALUE || getIntObjVar(pcd, "creature_attribs.toHitChance") > MAX_HIT_VALUE || getIntObjVar(pcd, "creature_attribs.defenseValue") > MAX_HIT_VALUE || getIntObjVar(pcd, "creature_attribs.minDamage") > MAX_DAM_VALUE || getIntObjVar(pcd, "creature_attribs.maxDamage") > MAX_DAM_VALUE) { sendSystemMessage(player, pet_lib.SID_INVALID_CRAFTED_PET); return false; } if (!bio_engineer.validatePcdLevel(pcd, player)) { return false; } return true; } public int handleValidatePet(obj_id self, dictionary params) throws InterruptedException { obj_id currentPet = callable.getCDCallable(self); obj_id calledPet = params.getObjId("calledPet"); if (!isIdValid(currentPet)) { if (isIdValid(calledPet)) { if (calledPet.isLoaded()) { destroyObject(calledPet); } else { messageTo(calledPet, "handlePackRequest", null, 1, false); } } return SCRIPT_CONTINUE; } if (!isIdValid(calledPet)) { return SCRIPT_CONTINUE; } int petType = pet_lib.getPetType(calledPet, self); if (pet_lib.countPetsOfType(self, petType) > pet_lib.getMaxPets(self, petType)) { messageTo(calledPet, "handlePackRequest", null, 1, false); } if (calledPet == currentPet) { return SCRIPT_CONTINUE; } if (isIdValid(calledPet)) { if (calledPet.isLoaded()) { destroyObject(calledPet); } else { messageTo(calledPet, "handlePackRequest", null, 1, false); } } return SCRIPT_CONTINUE; } public int removeGallop(obj_id self, dictionary params) throws InterruptedException { obj_id objPet = callable.getCDCallable(self); utils.removeScriptVar(self, "mount.intGalloping"); obj_id objDataPad = getContainedBy(self); obj_id objRider = getContainedBy(objDataPad); if (!isIdNull(objRider) && !isIdNull(objPet)) { string_id strSpam = new string_id("combat_effects", "gallop_stop"); LOG("pet", "sending System Message of " + strSpam + " to " + objRider); sendSystemMessage(objRider, strSpam); } else { return SCRIPT_CONTINUE; } int intState = getState(objRider, STATE_COMBAT); if (intState > 0) { pet_lib.setMountCombatMoveSpeed(objRider, objPet); return SCRIPT_CONTINUE; } else { pet_lib.setMountedMovementRate(objRider, objPet); } return SCRIPT_CONTINUE; } public int removeGallopTired(obj_id self, dictionary params) throws InterruptedException { utils.removeScriptVar(self, "mount.intTired"); obj_id objDataPad = getContainedBy(self); obj_id objRider = getContainedBy(objDataPad); if (!isIdNull(objRider)) { string_id strSpam = new string_id("combat_effects", "mount_not_tired"); sendSystemMessage(objRider, strSpam); } return SCRIPT_CONTINUE; } public void listAllCommands(obj_id petControlDevice, obj_id player) throws InterruptedException { if (!hasObjVar(petControlDevice, "ai.pet.command")) { return; } Vector commandList = new Vector(); commandList.setSize(0); commandList = utils.addElement(commandList, pet_lib.createLearnCommandListHeader(new string_id("obj_attr_n", "pet_command"))); Vector abilityList = new Vector(); abilityList.setSize(0); abilityList = utils.addElement(abilityList, pet_lib.createLearnCommandListHeader(new string_id("obj_attr_n", "pet_ability"))); obj_var_list petCommandList = getObjVarList(petControlDevice, "ai.pet.command"); if (petCommandList != null && petCommandList.getNumItems() > 0) { int numItems = petCommandList.getNumItems(); for (int i = 0; i < numItems; i++) { obj_var ov = petCommandList.getObjVar(i); String command = ov.getName(); int commandNum = Integer.parseInt(command); if (commandNum >= pet_lib.COMMAND_FOLLOW && commandNum < pet_lib.NUM_COMMANDS) { String display = pet_lib.createLearnCommandListEntry(new string_id("obj_attr_n", "pet_command_" + command), " - " + ov.getStringData()); commandList = utils.addElement(commandList, display); } else { String display = pet_lib.createLearnCommandListEntry(new string_id("obj_attr_n", pet_lib.getPetAbilityFromCrc(commandNum)), " - " + ov.getStringData()); abilityList = utils.addElement(abilityList, display); } } Vector displayList = utils.concatArrays(commandList, abilityList); sui.listbox(player, player, "", displayList); } } public int handleStatUpdate(obj_id self, dictionary params) throws InterruptedException { int[] mainAttribs = params.getIntArray("attribs"); setObjVar(self, "ai.pet.currentStats", mainAttribs); int timeStored = params.getInt("time"); setObjVar(self, "pet.timeStored", timeStored); return SCRIPT_CONTINUE; } public int handleRemoveCurrentPet(obj_id self, dictionary params) throws InterruptedException { obj_id sendingPetId = params.getObjId(MESSAGE_PET_ID); if (!isIdValid(sendingPetId)) { if (debug) { LOG("pcd-debug", "pet_control_device.handleRemoveCurrentPet(): vcd id=[" + self + "]: sending pet's ID is invalid, ignoring"); } return SCRIPT_CONTINUE; } if (callable.hasCDCallable(self)) { sendDirtyObjectMenuNotification(self); obj_id controlledPetId = callable.getCDCallable(self); if (controlledPetId == sendingPetId) { callable.setCDCallable(self, null); } else { LOG("pcd", "pet_control_device.handleRemoveCurrentPet(): vcd id=[" + self + "]: ignoring request from pet id=[" + sendingPetId + "]: PCD thinks it is controlling a different pet, id=[" + controlledPetId + "]"); } } return SCRIPT_CONTINUE; } public int handlePetFixDialog(obj_id self, dictionary params) throws InterruptedException { if ((params == null) || (params.isEmpty())) { return SCRIPT_CONTINUE; } obj_id player = sui.getPlayerId(params); String revert = params.getString(sui.MSGBOX_BTN_REVERT + ".RevertWasPressed"); int bp = sui.getIntButtonPressed(params); switch (bp) { case sui.BP_OK: if (revert != null && !revert.equals("")) { bio_engineer.adjustBrokenPetLevel(self, player); } else { bio_engineer.adjustBrokenPetStats(self, player); } return SCRIPT_CONTINUE; case sui.BP_CANCEL: sendSystemMessage(player, pet_lib.SID_INVALID_CRAFTED_PET); return SCRIPT_CONTINUE; } return SCRIPT_CONTINUE; } public boolean isOnMaintRun(obj_id pet) throws InterruptedException { if (hasObjVar(pet, "module_data.maint_run_time")) { int curTime = getGameTime(); int runTime = getIntObjVar(pet, "module_data.maint_run_time"); if (curTime < runTime) { return true; } removeObjVar(pet, "module_data.maint_run_time"); } return false; } public boolean isVetRewardPet(String creatureName) throws InterruptedException { return creatureName.equals("ep3_mount_varactyl"); } public int respawnDroid(obj_id self, dictionary params) throws InterruptedException { obj_id player = params.getObjId("master"); obj_id currentPet = callable.getCDCallable(self); if (!isIdValid(currentPet)) { if (callable.hasCDCallable(self)) { if (currentPet.isLoaded()) { destroyObject(currentPet); callable.setCDCallable(self, null); } else { messageTo(currentPet, "handlePackRequest", null, 1, false); } } if (!isSpaceScene() || getState(player, STATE_SHIP_INTERIOR) == 1) { pet_lib.createPetFromData(self); } } return SCRIPT_CONTINUE; } public int handleConvertPetSui(obj_id self, dictionary params) throws InterruptedException { int bp = sui.getIntButtonPressed(params); if (bp == sui.BP_CANCEL) { return SCRIPT_CONTINUE; } obj_id player = sui.getPlayerId(params); if (incubator.convertPcdIntoPetItem(player, self)) { CustomerServiceLog("BeastPetConversion: ", "Player (" + player + ") has converted Old Pcd (" + self + ")" + " we are now going to store its pet and destroy the pcd."); obj_id currentPet = callable.getCDCallable(self); if (isValidId(currentPet) && exists(currentPet)) { pet_lib.storePet(currentPet); } destroyObject(self); return SCRIPT_CONTINUE; } else { CustomerServiceLog("BeastPetConversion: ", "Player (" + player + ") tried to convert Old Pcd (" + self + ")." + " Conversion was not a success. New Item was NOT created and pcd was NOT destroyed."); return SCRIPT_CONTINUE; } } public int dancingDroidSoundObjectDestroyed(obj_id self, dictionary params) throws InterruptedException { removeObjVar(self, "dancingDroid.soundObject"); return SCRIPT_CONTINUE; } }