mirror of
https://bitbucket.org/seefoe/dsrc.git
synced 2026-07-31 01:15:55 -04:00
You can now rename your beast as much as you would like. Police officers will no longer harass corpses. Static NPC's conversing will now successfully converse with one another. When a player dies, the pet will go invulnerable and be immediately packed up. When respecing professions, your weapon will now be unequiped. Fixed the chat system for some NPC's. You can now only mount your vehicle from less than 5 meters. Quest items that can be clicked on cannot be used from less than 5 meters. Added a message to the QaSetup script, notifying the QA that they have received their items.
1777 lines
44 KiB
Plaintext
1777 lines
44 KiB
Plaintext
/**
|
|
* Title: player.player_beastmaster
|
|
* Description:
|
|
*/
|
|
|
|
include library.ai_lib;
|
|
include library.beast_lib;
|
|
include library.buff;
|
|
include library.chat;
|
|
include library.colors;
|
|
include library.combat;
|
|
include library.create;
|
|
include library.incubator;
|
|
include library.pet_lib;
|
|
include library.qa;
|
|
include library.sui;
|
|
include library.utils;
|
|
|
|
const string ABILITY_TO_EXECUTE = "abilityToExecute";
|
|
|
|
const string TRAIN_DIALOGUE_PID = "petTraining.sui_pid";
|
|
|
|
const boolean BEAST_DEBUG = false;
|
|
|
|
void blog(string text)
|
|
{
|
|
if(BEAST_DEBUG)
|
|
{
|
|
LOG("player_beastmaster.script", text);
|
|
}
|
|
}
|
|
|
|
trigger OnRemovingFromWorld()
|
|
{
|
|
if(!beast_lib.isValidBeast(beast_lib.getBeastOnPlayer(self)))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
beast_lib.storeBeasts(self);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnLogout()
|
|
{
|
|
if(!beast_lib.isValidBeast(beast_lib.getBeastOnPlayer(self)))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
beast_lib.storeBeasts(self);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnDeath(obj_id killer, obj_id corpseId)
|
|
{
|
|
if(!beast_lib.isValidBeast(beast_lib.getBeastOnPlayer(self)))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
blog("Player killed. Packing beast: " + beast + " killer: " + killer);
|
|
|
|
beast_lib.playerDeathStoreBeast(bcd);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnLogin()
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(beast_lib.isValidBeast(beast))
|
|
{
|
|
setBeastmasterPet(self, beast);
|
|
}
|
|
else
|
|
{
|
|
setBeastmasterPet(self, null);
|
|
}
|
|
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnSkillGranted(string skill)
|
|
{
|
|
if (skill.equals("expertise_bm_attack_1"))
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if (!isIdValid(beast))
|
|
return SCRIPT_CONTINUE;
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
beast_lib.updatePetAbilityList(bcd, beast);
|
|
|
|
}
|
|
|
|
if (skill.endsWith("pet_bar_1"))
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if (!isIdValid(beast))
|
|
return SCRIPT_CONTINUE;
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
beast_lib.updatePetAbilityList(bcd, beast);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnSkillRevoked(string skill)
|
|
{
|
|
if (skill.equals("expertise_bm_attack_1"))
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if (!isIdValid(beast))
|
|
return SCRIPT_CONTINUE;
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
beast_lib.updatePetAbilityList(bcd, beast);
|
|
|
|
}
|
|
|
|
if (skill.endsWith("pet_bar_1"))
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if (!isIdValid(beast))
|
|
return SCRIPT_CONTINUE;
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
beast_lib.updatePetAbilityList(bcd, beast);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnEnteredCombat()
|
|
{
|
|
if(!beast_lib.isBeastMaster(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast) || ai_lib.isInCombat(beast) || !beast_lib.getBeastDefensive(beast) || utils.hasScriptVar(beast, "petIgnoreAttacks"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// If the master is in combat and the beast is defensive, then add hate on the beast with a target on the master.
|
|
if(ai_lib.isInCombat(self) && beast_lib.getBeastDefensive(beast))
|
|
{
|
|
obj_id target = getIntendedTarget(self);
|
|
|
|
if(isIdValid(target) && pvpCanAttack(beast,target))
|
|
{
|
|
startCombat(beast,target);
|
|
|
|
addHate(beast,target,0.0f);
|
|
|
|
utils.setScriptVar(beast,"ai.combat.target",target);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id[] masterAttackers = getWhoIsTargetingMe(self);
|
|
|
|
if(masterAttackers != null)
|
|
{
|
|
for(int i=0;i<masterAttackers.length;i++)
|
|
{
|
|
if(pvpCanAttack(beast,target))
|
|
{
|
|
startCombat(beast, masterAttackers[i]);
|
|
|
|
addHate(beast, masterAttackers[i], 0.0f);
|
|
|
|
utils.setScriptVar(beast, "ai.combat.target", masterAttackers[i]);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnDefenderCombatAction(obj_id attacker,obj_id weapon,int combatResult)
|
|
{
|
|
if(!beast_lib.isBeastMaster(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(beast_lib.isValidBeast(beast) && !ai_lib.isInCombat(beast) && beast_lib.getBeastDefensive(beast) &&
|
|
pvpCanAttack(beast, attacker)&&!utils.hasScriptVar(beast,"petIgnoreAttacks"))
|
|
{
|
|
startCombat(beast, attacker);
|
|
|
|
addHate(beast, attacker,0.0f);
|
|
|
|
utils.setScriptVar(beast, "ai.combat.target", attacker);
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnSpeaking(string strText)
|
|
{
|
|
string[] strCommands = split(strText, ' ');
|
|
|
|
if(!isGod(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
if(!beast_lib.isValidBCD(bcd))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
if(strText.equals("setPet"))
|
|
{
|
|
setBeastmasterPet(self, getTarget(self));
|
|
}
|
|
|
|
if(strText.equals("clearTrainedSkills"))
|
|
beast_lib.clearTrainedSkills(beast);
|
|
|
|
|
|
else if(strCommands[0].equals("doability"))
|
|
{
|
|
dictionary dict = new dictionary();
|
|
dict.put(ABILITY_TO_EXECUTE, strCommands[1]);
|
|
|
|
messageTo(self, "performCreatureAbility", dict, 0, false);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("next"))
|
|
{
|
|
int lastBeast = getIntObjVar(self, "lastBeast");
|
|
|
|
if(lastBeast >= 132)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
lastBeast++;
|
|
|
|
dictionary beastDict = utils.dataTableGetRow(beast_lib.BEASTS_TABLE, lastBeast - 1);
|
|
|
|
string template = beastDict.getString("template");
|
|
|
|
setObjVar(self, "lastBeast", lastBeast);
|
|
|
|
beast_lib.setBeastType(beast, template);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("last"))
|
|
{
|
|
int lastBeast = getIntObjVar(self, "lastBeast");
|
|
|
|
if(lastBeast <= 1)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
lastBeast--;
|
|
|
|
dictionary beastDict = utils.dataTableGetRow(beast_lib.BEASTS_TABLE, lastBeast - 1);
|
|
|
|
string template = beastDict.getString("template");
|
|
|
|
setObjVar(self, "lastBeast", lastBeast);
|
|
|
|
beast_lib.setBeastType(beast, template);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("beastLevel") && strCommands.length > 1)
|
|
{
|
|
int level = Integer.parseInt(strCommands[1]);
|
|
|
|
beast_lib.setBCDBeastLevel(bcd, level);
|
|
beast_lib.setBeastLevel(beast, level);
|
|
|
|
beast_lib.initializeBeastStats(bcd, beast);
|
|
|
|
blog("Beast: " + beast + " Level set: " + level);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("beastScale") && strCommands.length > 1)
|
|
{
|
|
float scale = Float.parseFloat(strCommands[1]);
|
|
|
|
setScale(beast, scale);
|
|
|
|
blog("Beast: " + beast + " scale: " + scale);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("attack") && getMaster(beast) == self)
|
|
{
|
|
beast_lib.doAttackCommand(beast, self);
|
|
|
|
blog("doAttackCommand() beast: " + beast + " self: " + self);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("follow") && getMaster(beast) == self)
|
|
{
|
|
beast_lib.doFollowCommand(beast, self);
|
|
|
|
blog("doFollowCommand() beast: " + beast + " self: " + self);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("revive") && getMaster(beast) == self)
|
|
{
|
|
int beastHealth = getMaxAttrib(beast, HEALTH);
|
|
|
|
setAttrib(beast, HEALTH, beastHealth);
|
|
|
|
if(ai_lib.isInCombat(beast))
|
|
{
|
|
obj_id target = getCombatTarget(beast);
|
|
|
|
if(isIdValid(target) && exists(target))
|
|
{
|
|
int beastTargetHealth = getMaxAttrib(target, HEALTH);
|
|
|
|
setAttrib(target, HEALTH, beastTargetHealth);
|
|
}
|
|
}
|
|
|
|
blog("Beast revived.");
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("rez") && getMaster(beast) == self)
|
|
{
|
|
if(!isDead(beast))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
int maxHealth = getMaxAttrib(beast, HEALTH);
|
|
|
|
beast_lib.storeBeast(bcd);
|
|
|
|
beast_lib.setBCDBeastIsDead(bcd, false);
|
|
|
|
beast_lib.setBCDBeastHealth(bcd, maxHealth / 10);
|
|
|
|
beast_lib.createBeastFromBCD(self, bcd);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("beastType") && strCommands.length > 1)
|
|
{
|
|
beast_lib.setBeastType(beast, strCommands[1]);
|
|
|
|
blog("Beast: " + beast + " Type set: " + strCommands[1]);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("learnAbility"))
|
|
{
|
|
beast_lib.playerLearnBeastMasterSkill(self, strCommands[1], true);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("makeTypeThreeEnzyme"))
|
|
{
|
|
if(strCommands.length == 2)
|
|
{
|
|
float value = utils.stringToFloat(strCommands[1]);
|
|
beast_lib.generateTypeThreeEnzyme(self, value);
|
|
}
|
|
else if(strCommands.length == 3)
|
|
{
|
|
float purity = utils.stringToFloat(strCommands[1]);
|
|
float mutagen = utils.stringToFloat(strCommands[2]);
|
|
beast_lib.generateTypeThreeEnzyme(self, purity, mutagen);
|
|
}
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("toggleDefend"))
|
|
{
|
|
beast_lib.setBeastDefensive(beast, self, !beast_lib.getBeastDefensive(beast));
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("moveInfo"))
|
|
{
|
|
debugSpeakMsg(beast, "Run: " + (getLocomotion(beast) == LOCOMOTION_RUNNING));
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("setupHappiness"))
|
|
{
|
|
setupHappinessMenu(self);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("showHappiness"))
|
|
{
|
|
showHappiness(self);
|
|
}
|
|
else if(strCommands[0].equalsIgnoreCase("incrementbeastexperience"))
|
|
{
|
|
showBeastExperienceGain(self);
|
|
}
|
|
|
|
// incrementBeastExperience(beast);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
void showBeastExperienceGain(obj_id self)
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast))
|
|
{
|
|
return;
|
|
}
|
|
|
|
debugSpeakMsg(beast, "Current experience: " + beast_lib.getBeastExperience(beast));
|
|
|
|
beast_lib.incrementBeastExperience(beast);
|
|
|
|
debugSpeakMsg(beast, "Incremented experience: " + beast_lib.getBeastExperience(beast));
|
|
}
|
|
|
|
// Show likes/dislikes as well as current happiness value.
|
|
void showHappiness(obj_id self)
|
|
{
|
|
if(!isIdValid(self) || !exists(self) || !isGod(self))
|
|
{
|
|
return;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast))
|
|
{
|
|
return;
|
|
}
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
string[] favoriteFood = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_FOOD_COL);
|
|
string[] favoriteActivity = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_ACTIVITY_COL);
|
|
string[] favoriteLocation = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_LOCATION_COL);
|
|
int [] favorites = getIntArrayObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR);
|
|
|
|
debugSpeakMsg(beast, "Favorite Food: " + favoriteFood[favorites[0] - 1] + " Hated Food: " + favoriteFood[favorites[1] - 1]);
|
|
debugSpeakMsg(beast, "Favorite Activity: " + favoriteActivity[favorites[2] - 1] + " Hated Activity: " + favoriteActivity[favorites[3] - 1]);
|
|
debugSpeakMsg(beast, "Favorite Location: " + favoriteLocation[favorites[4] - 1] + " Hated Location: " + favoriteLocation[favorites[5] - 1]);
|
|
|
|
debugSpeakMsg(beast, "Current Happiness: " + beast_lib.getBCDBeastHappiness(bcd));
|
|
}
|
|
|
|
// This is a test menu for testing happiness.
|
|
void setupHappinessMenu(obj_id self)
|
|
{
|
|
if(!isIdValid(self) || !exists(self) || !isGod(self))
|
|
{
|
|
return;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast))
|
|
{
|
|
return;
|
|
}
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
// get first happiness column
|
|
string[] favoriteFood = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_FOOD_COL);
|
|
|
|
beast_lib.setupHappinessLoyalty(bcd);
|
|
|
|
qa.refreshMenu(self, "Select Food...", "-Favorite Food-", favoriteFood, "handleFavoriteFoodMenu", "happiness_menu", "happiness_menu", sui.OK_CANCEL_REFRESH);
|
|
}
|
|
|
|
// This is a test message handler for testing happiness.
|
|
messageHandler handleFavoriteFoodMenu()
|
|
{
|
|
if(!isGod(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id player = sui.getPlayerId(params);
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
int btn = sui.getIntButtonPressed(params);
|
|
|
|
if(btn == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
// get first happiness column
|
|
string [] favoriteFood = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_FOOD_COL);
|
|
|
|
int [] favorites = getIntArrayObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR);
|
|
|
|
if(idx >= 0 && idx < favoriteFood.length)
|
|
{
|
|
string food = "";
|
|
|
|
if(favorites == null || favorites.length <= 0)
|
|
{
|
|
debugSpeakMsg(self, "No favorites defined.");
|
|
}
|
|
else
|
|
{
|
|
debugSpeakMsg(self, "Favorite food: " + favoriteFood[favorites[0] - 1] + " Changed to: " + favoriteFood[idx]);
|
|
}
|
|
|
|
favorites[0] = idx + 1;
|
|
|
|
setObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR, favorites);
|
|
|
|
qa.refreshMenu(self, "Select Food...", "-Hated Food-", favoriteFood, "handleHatedFoodMenu", "happiness_menu", "happiness_menu", sui.OK_CANCEL_REFRESH);
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// This is a test message handler for testing happiness.
|
|
messageHandler handleHatedFoodMenu()
|
|
{
|
|
if(!isGod(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id player = sui.getPlayerId(params);
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
int btn = sui.getIntButtonPressed(params);
|
|
|
|
if(btn == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
// get first happiness column
|
|
string [] favoriteFood = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_FOOD_COL);
|
|
|
|
int [] favorites = getIntArrayObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR);
|
|
|
|
if(idx >= 0 && idx < favoriteFood.length)
|
|
{
|
|
string food = "";
|
|
|
|
if(favorites == null || favorites.length <= 0)
|
|
{
|
|
debugSpeakMsg(self, "No favorites defined.");
|
|
}
|
|
else
|
|
{
|
|
debugSpeakMsg(self, "Hated food: " + favoriteFood[favorites[1] - 1] + " Changed to: " + favoriteFood[idx]);
|
|
}
|
|
|
|
favorites[1] = idx + 1;
|
|
|
|
setObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR, favorites);
|
|
|
|
string[] favoriteActivity = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_ACTIVITY_COL);
|
|
|
|
qa.refreshMenu(self, "Select Activity...", "-Favorite Activity-", favoriteActivity, "handleFavoriteActivityMenu", "happiness_menu", "happiness_menu", sui.OK_CANCEL_REFRESH);
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// This is a test message handler for testing happiness.
|
|
messageHandler handleFavoriteActivityMenu()
|
|
{
|
|
if(!isGod(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id player = sui.getPlayerId(params);
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
int btn = sui.getIntButtonPressed(params);
|
|
|
|
if(btn == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
// get first happiness column
|
|
string[] favoriteActivity = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_ACTIVITY_COL);
|
|
|
|
int [] favorites = getIntArrayObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR);
|
|
|
|
if(idx >= 0 && idx < favoriteActivity.length)
|
|
{
|
|
string food = "";
|
|
|
|
if(favorites == null || favorites.length <= 0)
|
|
{
|
|
debugSpeakMsg(self, "No favorites defined.");
|
|
}
|
|
else
|
|
{
|
|
debugSpeakMsg(self, "Favorite activity: " + favoriteActivity[favorites[2] - 1] + " Changed to: " + favoriteActivity[idx]);
|
|
}
|
|
|
|
favorites[2] = idx + 1;
|
|
|
|
setObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR, favorites);
|
|
|
|
qa.refreshMenu(self, "Select Activity...", "-Hated Activity-", favoriteActivity, "handleHatedActivityMenu", "happiness_menu", "happiness_menu", sui.OK_CANCEL_REFRESH);
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// This is a test message handler for testing happiness.
|
|
messageHandler handleHatedActivityMenu()
|
|
{
|
|
if(!isGod(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id player = sui.getPlayerId(params);
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
int btn = sui.getIntButtonPressed(params);
|
|
|
|
if(btn == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
// get first happiness column
|
|
string[] favoriteActivity = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_ACTIVITY_COL);
|
|
|
|
int [] favorites = getIntArrayObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR);
|
|
|
|
if(idx >= 0 && idx < favoriteActivity.length)
|
|
{
|
|
string food = "";
|
|
|
|
if(favorites == null || favorites.length <= 0)
|
|
{
|
|
debugSpeakMsg(self, "No favorites defined.");
|
|
}
|
|
else
|
|
{
|
|
debugSpeakMsg(self, "Hated activity: " + favoriteActivity[favorites[3] - 1] + " Changed to: " + favoriteActivity[idx]);
|
|
}
|
|
|
|
favorites[3] = idx + 1;
|
|
|
|
setObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR, favorites);
|
|
|
|
string[] favoriteLocation = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_LOCATION_COL);
|
|
|
|
qa.refreshMenu(self, "Select Location...", "-Favorite Location-", favoriteLocation, "handleFavoriteLocationMenu", "happiness_menu", "happiness_menu", sui.OK_CANCEL_REFRESH);
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// This is a test message handler for testing happiness.
|
|
messageHandler handleFavoriteLocationMenu()
|
|
{
|
|
if(!isGod(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id player = sui.getPlayerId(params);
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
int btn = sui.getIntButtonPressed(params);
|
|
|
|
if(btn == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
// get first happiness column
|
|
string[] favoriteLocation = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_LOCATION_COL);
|
|
|
|
int [] favorites = getIntArrayObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR);
|
|
|
|
if(idx >= 0 && idx < favoriteLocation.length)
|
|
{
|
|
string food = "";
|
|
|
|
if(favorites == null || favorites.length <= 0)
|
|
{
|
|
debugSpeakMsg(self, "No favorites defined.");
|
|
}
|
|
else
|
|
{
|
|
debugSpeakMsg(self, "Hated activity: " + favoriteLocation[favorites[4] - 1] + " Changed to: " + favoriteLocation[idx]);
|
|
}
|
|
|
|
favorites[4] = idx + 1;
|
|
|
|
setObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR, favorites);
|
|
|
|
qa.refreshMenu(self, "Select Location...", "-Hated Location-", favoriteLocation, "handleHatedLocationMenu", "happiness_menu", "happiness_menu", sui.OK_CANCEL_REFRESH);
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// This is a test message handler for testing happiness.
|
|
messageHandler handleHatedLocationMenu()
|
|
{
|
|
if(!isGod(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id player = sui.getPlayerId(params);
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
int btn = sui.getIntButtonPressed(params);
|
|
|
|
if(btn == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.isValidBeast(beast))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
// get first happiness column
|
|
string[] favoriteLocation = dataTableGetStringColumnNoDefaults(beast_lib.DATATABLE_BEAST_FAVORITES, beast_lib.DATATABLE_LOCATION_COL);
|
|
|
|
int [] favorites = getIntArrayObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR);
|
|
|
|
if(idx >= 0 && idx < favoriteLocation.length)
|
|
{
|
|
string food = "";
|
|
|
|
if(favorites == null || favorites.length <= 0)
|
|
{
|
|
debugSpeakMsg(self, "No favorites defined.");
|
|
}
|
|
else
|
|
{
|
|
debugSpeakMsg(self, "Hated activity: " + favoriteLocation[favorites[5] - 1] + " Changed to: " + favoriteLocation[idx]);
|
|
}
|
|
|
|
favorites[5] = idx + 1;
|
|
|
|
setObjVar(bcd, beast_lib.PET_FAVORITES_OBJVAR, favorites);
|
|
|
|
debugSpeakMsg(self, "Happiness setup completed!");
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
messageHandler channelRevivePet()
|
|
{
|
|
if(utils.hasScriptVar(self, "bm_revive.suiPid"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
if(!isIdValid(beast_lib.getBeastOnPlayer(self)) || !exists(beast_lib.getBeastOnPlayer(self)))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!isDead(beast))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
location myStartLocation = getLocation(self);
|
|
int duration = 20;
|
|
int reviveTimeMod = getEnhancedSkillStatisticModifierUncapped(self, "expertise_bm_pet_revive_time");
|
|
duration -= reviveTimeMod;
|
|
|
|
int flags = sui.CD_EVENT_INCAPACITATE;
|
|
|
|
int pid = sui.smartCountdownTimerSUI(self, self, "bm_revive_pet", null, 0, duration, "", 0, flags);
|
|
|
|
// Using a timestamp because multiple messages will screw things up.
|
|
duration += getGameTime();
|
|
|
|
utils.setScriptVar(self, "bm_revive.suiPid", pid);
|
|
utils.setScriptVar(self, "bm_revive.duration", duration);
|
|
utils.setScriptVar(self, "bm_revive.location", myStartLocation);
|
|
|
|
messageTo(self, "checkChannelRevivePet", null, 5, false);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
messageHandler checkChannelRevivePet()
|
|
{
|
|
// ifwe lack this, we're apparently not channeling any more
|
|
if(!utils.hasScriptVar(self, "bm_revive.suiPid"))
|
|
{
|
|
utils.removeScriptVarTree(self,"bm_revive");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
if(!isIdValid(beast_lib.getBeastOnPlayer(self)) || !exists(beast_lib.getBeastOnPlayer(self)))
|
|
{
|
|
int pid = utils.getIntScriptVar(self, "bm_revive.suiPid");
|
|
forceCloseSUIPage(pid);
|
|
utils.removeScriptVarTree(self,"bm_revive");
|
|
//sendSystemMessageTestingOnly(self, "messageHandler checkChannelRevivePet(): !isIdValid(beast_lib.getBeastOnPlayer(self)) || !exists(beast_lib.getBeastOnPlayer(self))");
|
|
sendSystemMessage(self, new string_id("spam", "no_beast_out") );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
location myStartLocation = utils.getLocationScriptVar(self, "bm_revive.location");
|
|
int duration = utils.getIntScriptVar(self, "bm_revive.duration");
|
|
|
|
// Channel over, do the thing and clean up
|
|
if(duration - getGameTime() < 1)
|
|
{
|
|
int pid = utils.getIntScriptVar(self, "bm_revive.suiPid");
|
|
forceCloseSUIPage(pid);
|
|
utils.removeScriptVarTree(self,"bm_revive");
|
|
reviveBeast(self, beast);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else // Pulse again
|
|
{
|
|
utils.setScriptVar(self, "bm_revive.duration", duration);
|
|
messageTo(self, "checkChannelRevivePet", null, 5, false);
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
void reviveBeast(obj_id self, obj_id beast)
|
|
{
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
|
|
if(!exists(beast) || isIdNull(beast) )
|
|
{
|
|
sendSystemMessage(self, new string_id("spam", "no_beast_out") );
|
|
return;
|
|
}
|
|
|
|
if(!isDead(beast))
|
|
{
|
|
return;
|
|
}
|
|
|
|
float revivePercent = 10;
|
|
float maxHealthFloat = getMaxAttrib(beast, HEALTH);
|
|
revivePercent += getEnhancedSkillStatisticModifierUncapped(self, "expertise_bm_pet_recovery");
|
|
maxHealthFloat = maxHealthFloat * (revivePercent / 100);
|
|
int maxHealth = (int)maxHealthFloat;
|
|
|
|
beast_lib.checkForFavoriteLocation (bcd);
|
|
|
|
utils.setScriptVar(self, "beast.no_store_message", 1);
|
|
|
|
beast_lib.storeBeast(bcd);
|
|
beast_lib.setBCDBeastIsDead(bcd, false);
|
|
beast_lib.setBCDBeastHealth(bcd, (int)(maxHealth * (float)(revivePercent/100)));
|
|
beast_lib.createBeastFromBCD(self, bcd);
|
|
|
|
return;
|
|
}
|
|
|
|
/*** commandHandlers ***/
|
|
|
|
commandHandler bm_follow_1()
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!isIdValid(beast) || !exists(beast))
|
|
{
|
|
sendSystemMessage(self, new string_id("spam", "no_beast_out"));
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
if(isDead(beast))
|
|
{
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
sendSystemMessage(self, new string_id("spam", "pet_beyond_healing") );
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
beast_lib.doFollowCommand(beast, self);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_stay_1()
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!isIdValid(beast) || !exists(beast))
|
|
{
|
|
sendSystemMessage(self, new string_id("spam", "no_beast_out"));
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
if(isDead(beast))
|
|
{
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
sendSystemMessage(self, new string_id("spam", "pet_beyond_healing") );
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
beast_lib.doStayCommand(beast, self);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_pet_attack_1()
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!isIdValid(beast) || !exists(beast))
|
|
{
|
|
sendSystemMessage(self, new string_id("spam", "no_beast_out"));
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
if(isDead(beast))
|
|
{
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
sendSystemMessage(self, new string_id("spam", "pet_beyond_healing") );
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
beast_lib.doAttackCommand(beast, self);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_pet_trick_1()
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!isIdValid(beast) || !exists(beast))
|
|
{
|
|
sendSystemMessage(self, new string_id("spam", "no_beast_out"));
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
if(isDead(beast))
|
|
{
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
sendSystemMessage(self, new string_id("spam", "pet_beyond_healing") );
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
beast_lib.doTrickCommand(beast, 1);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_pet_trick_2()
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!isIdValid(beast) || !exists(beast))
|
|
{
|
|
sendSystemMessage(self, new string_id("spam", "no_beast_out"));
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
if(isDead(beast))
|
|
{
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
sendSystemMessage(self, new string_id("spam", "pet_beyond_healing") );
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
beast_lib.doTrickCommand(beast, 2);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_pet_trick_3()
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!isIdValid(beast) || !exists(beast))
|
|
{
|
|
sendSystemMessage(self, new string_id("spam", "no_beast_out"));
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
if(isDead(beast))
|
|
{
|
|
setCommandTimerValue(self, TIMER_COOLDOWN, 0f);
|
|
sendSystemMessage(self, new string_id("spam", "pet_beyond_healing") );
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
// Not in yet
|
|
// TODO: beast_lib.doTrick(beast, self);
|
|
sendSystemMessageTestingOnly(self, "Beast Command: Trick 3 (not hooked up yet)");
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
messageHandler performCreatureAbility()
|
|
{
|
|
string ability = params.getString(ABILITY_TO_EXECUTE);
|
|
obj_id pet = beast_lib.getBeastOnPlayer(self);
|
|
int toExecute = utils.stringToInt(ability);
|
|
|
|
if(toExecute < 1 || toExecute > 4)
|
|
{
|
|
sendSystemMessageTestingOnly(self, "SYNTAX: doability 1-4");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
toExecute = toExecute - 1;//Counting starts at 0, lolz
|
|
|
|
if(!beast_lib.isBeastMaster(self))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Only beastmasters may use this command");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
if(!isIdValid(pet) || !exists(pet))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "You do not have a valid pet");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
string[] skillList = beast_lib.getTrainedSkills(pet);
|
|
|
|
if(skillList[toExecute] == "")
|
|
{
|
|
sendSystemMessageTestingOnly(self, "No ability for slot " + toExecute);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
sendSystemMessageTestingOnly(self, "Queue'd pet command: " + skillList[toExecute]);
|
|
|
|
//(!beastmaster.canExecuteCommand(self, pet)){return SCRIPT_CONTINUE;}
|
|
|
|
obj_id target = isIdValid(getTarget(pet)) ? getTarget(pet) : getTarget(self);
|
|
|
|
queueCommand(pet, getStringCrc(skillList[toExecute].toLowerCase()), target, "", COMMAND_PRIORITY_DEFAULT);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
int getPetTrainPid(obj_id player)
|
|
{
|
|
return utils.hasScriptVar(player, TRAIN_DIALOGUE_PID) ? utils.getIntScriptVar(player, TRAIN_DIALOGUE_PID) : 0;
|
|
}
|
|
|
|
void setPetTrainPid(obj_id player, int pid)
|
|
{
|
|
if(pid == -1)
|
|
{
|
|
utils.removeScriptVar(player, TRAIN_DIALOGUE_PID);
|
|
}
|
|
else
|
|
{
|
|
utils.setScriptVar(player, TRAIN_DIALOGUE_PID, pid);
|
|
}
|
|
}
|
|
|
|
commandHandler cmdTrainPet()
|
|
{
|
|
obj_id pet = beast_lib.getBeastOnPlayer(self);
|
|
|
|
if(!beast_lib.canTrainPet(self, pet))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
int pid = getPetTrainPid(self);
|
|
|
|
if(pid > 0)
|
|
{
|
|
sui.closeSUI(self, pid);
|
|
}
|
|
|
|
createTrainingSui(self, pet);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
void createTrainingSui(obj_id player, obj_id pet)
|
|
{
|
|
if(!beast_lib.isValidPlayer(player) || !beast_lib.isValidBeast(pet))
|
|
{
|
|
return;
|
|
}
|
|
|
|
string[] playerKnownSkills = beast_lib.getKnownSkills(player);
|
|
|
|
if(playerKnownSkills == null || playerKnownSkills.length == 0)
|
|
{
|
|
sendSystemMessage(player, new string_id("beast", "player_no_known_skills"));
|
|
return;
|
|
}
|
|
|
|
string title = utils.packStringId (new string_id("beast", "train_sui_title"));
|
|
string prompt = utils.packStringId (new string_id("beast", "train_sui_heading"));
|
|
|
|
int pid = createSUIPage(sui.SUI_LISTBOX, player, player, "handlePetTrainingDialog");
|
|
|
|
setSUIProperty(pid, "", "Size", "650,375");
|
|
setSUIProperty(pid, sui.LISTBOX_TITLE, sui.PROP_TEXT, title);
|
|
setSUIProperty(pid, sui.LISTBOX_PROMPT, sui.PROP_TEXT, prompt);
|
|
|
|
// Add buttons.
|
|
sui.listboxButtonSetup(pid, sui.OK_CANCEL);
|
|
setSUIProperty(pid, sui.LISTBOX_BTN_OK, sui.PROP_TEXT, "@train");
|
|
setSUIProperty(pid, sui.LISTBOX_BTN_CANCEL, sui.PROP_TEXT, "@cancel");
|
|
//sui.listboxUseOtherButton(pid, "@known_abilities");
|
|
|
|
clearSUIDataSource(pid, sui.LISTBOX_DATASOURCE);
|
|
|
|
obj_id bcd = beast_lib.getBeastBCD(pet);
|
|
|
|
if(!beast_lib.isValidBCD(bcd))
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
for (int i = 0; i < playerKnownSkills.length; i++)
|
|
{
|
|
string abilityName = playerKnownSkills[i];
|
|
|
|
int returnCode = beast_lib.getTrainingSuccessCode(pet, abilityName);
|
|
prose_package pp = new prose_package();
|
|
|
|
switch (returnCode)
|
|
{
|
|
case beast_lib.TRAINING_INVALID_PETTYPE:
|
|
pp.stringId = new string_id("beast", "train_fail_bad_pet_type_for_ability");
|
|
pp.actor.set(new string_id("cmd_n", abilityName));
|
|
abilityName = " \0"+packOutOfBandProsePackage(null, pp);
|
|
break;
|
|
|
|
case beast_lib.TRAINING_SKILL_TOO_HIGH:
|
|
pp.stringId = new string_id("beast", "train_fail_single_skill_max");
|
|
pp.actor.set(new string_id("cmd_n", abilityName));
|
|
abilityName = " \0"+packOutOfBandProsePackage(null, pp);
|
|
break;
|
|
|
|
case beast_lib.TRAINING_INSUFFICIENT_POINTS:
|
|
pp.stringId = new string_id("beast", "train_fail_insufficient_points");
|
|
pp.actor.set(new string_id("cmd_n", abilityName));
|
|
abilityName = " \0"+packOutOfBandProsePackage(null, pp);
|
|
break;
|
|
|
|
case beast_lib.TRAINING_NON_IMPROVED_SKILL:
|
|
pp.stringId = new string_id("beast", "train_fail_already_known");
|
|
pp.actor.set(new string_id("cmd_n", abilityName));
|
|
abilityName = " \0"+packOutOfBandProsePackage(null, pp);
|
|
break;
|
|
|
|
case beast_lib.TRAINING_NO_AVAILABLE_SLOTS:
|
|
pp.stringId = new string_id("beast", "train_fail_no_slots");
|
|
pp.actor.set(new string_id("cmd_n", abilityName));
|
|
abilityName = " \0"+packOutOfBandProsePackage(null, pp);
|
|
break;
|
|
|
|
case beast_lib.TRAINING_VALID:
|
|
pp.stringId = new string_id("cmd_n", abilityName);
|
|
abilityName = " \0"+packOutOfBandProsePackage(null, pp);
|
|
break;
|
|
|
|
}
|
|
|
|
addSUIDataItem(pid, sui.LISTBOX_DATASOURCE, "" + i);
|
|
setSUIProperty(pid, sui.LISTBOX_DATASOURCE + "." + i, sui.PROP_TEXT, abilityName);
|
|
}
|
|
|
|
subscribeToSUIEvent(pid, sui_event_type.SET_onGenericSelection, sui.LISTBOX_LIST, "handlePetTrainingUpdate");
|
|
subscribeToSUIPropertyForEvent(pid, sui_event_type.SET_onGenericSelection, sui.LISTBOX_LIST, sui.LISTBOX_LIST, sui.PROP_SELECTEDROW);
|
|
|
|
subscribeToSUIProperty(pid, sui.LISTBOX_LIST, sui.PROP_SELECTEDROW);
|
|
subscribeToSUIProperty(pid, sui.LISTBOX_TITLE, sui.PROP_TEXT);
|
|
|
|
showSUIPage(pid);
|
|
flushSUIPage(pid);
|
|
|
|
setPetTrainPid(player, pid);
|
|
}
|
|
|
|
messageHandler handlePetTrainingDialog()
|
|
{
|
|
obj_id player = sui.getPlayerId(params);
|
|
|
|
if((params == null) || (params.isEmpty()))
|
|
{
|
|
setPetTrainPid(self, -1);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id pet = beast_lib.getBeastOnPlayer(player);
|
|
string[] abilityList = beast_lib.getKnownSkills(player);
|
|
int bp = sui.getIntButtonPressed(params);
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
|
|
if(sui.getListboxOtherButtonPressed(params))
|
|
{
|
|
//createKnownAbilitySui(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
switch (bp)
|
|
{
|
|
case sui.BP_OK:
|
|
if(idx > -1)
|
|
{
|
|
beast_lib.trainPetAbility(pet, abilityList[idx]);
|
|
queueCommand(player, ##"trainPet", player, "", COMMAND_PRIORITY_DEFAULT);
|
|
|
|
}
|
|
break;
|
|
}
|
|
|
|
setPetTrainPid(player, -1);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
|
|
messageHandler handlePetTrainingUpdate()
|
|
{
|
|
if((params == null) || (params.isEmpty()))
|
|
{
|
|
setPetTrainPid(self, -1);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id player = sui.getPlayerId(params);
|
|
string[] abilityList = beast_lib.getKnownSkills(player);
|
|
int pid = getPetTrainPid(player);
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
|
|
if(idx == -1)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
string ability = abilityList[idx];
|
|
string prompt = utils.packStringId (new string_id("beast", "train_sui_heading"));
|
|
prompt += getPetAbilityDescription(ability);
|
|
|
|
setSUIProperty(pid, sui.LISTBOX_PROMPT, sui.PROP_TEXT, prompt);
|
|
flushSUIPage(pid);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
string getPetAbilityDescription(string ability)
|
|
{
|
|
string desc = "";
|
|
/*
|
|
int row = dataTableSearchColumnForString(ability, "ability_name", beast_lib.BEASTS_SPECIALS);
|
|
if(row != -1)
|
|
{
|
|
|
|
// Ability Name
|
|
desc += " \\#pcontrast1 \n\n"+utils.packStringId (new string_id("cmd_n", ability));
|
|
|
|
// Ability Type
|
|
int abilityType = dataTableGetInt(pet_lib.PET_ABILITY_TABLE, row, "type");
|
|
if(abilityType == pet_lib.PET_ABILITY_INNATE)
|
|
{
|
|
desc += " \\#. "+utils.packStringId (new string_id("pet/pet_ability", "innate"));
|
|
}
|
|
else if(abilityType == pet_lib.PET_ABILITY_TRIGGERED || abilityType == pet_lib.PET_ABILITY_ACTION)
|
|
{
|
|
desc += " \\#. "+utils.packStringId (new string_id("pet/pet_ability", "triggered"));
|
|
}
|
|
|
|
// Ability Cost
|
|
int trainingCost = dataTableGetInt(pet_lib.PET_ABILITY_TABLE, row, "trainingCost");
|
|
desc += " \n"+utils.packStringId (new string_id("pet/pet_ability", "training_cost"));
|
|
desc += " " + trainingCost;
|
|
|
|
// Ability Description
|
|
desc += " \\#.\n"+utils.packStringId (new string_id("pet/pet_ability", abilityName+"_desc"));
|
|
|
|
// Ability Prerequisite
|
|
string prereqName = dataTableGetString(pet_lib.PET_ABILITY_TABLE, row, "prereq");
|
|
if(prereqName != null && !prereqName.equals(""))
|
|
{
|
|
desc += " \n\n"+utils.packStringId (new string_id("pet/pet_ability", "prereq_desc_begin"));
|
|
desc += " \\#pcontrast2 "+utils.packStringId (new string_id("pet/pet_ability", prereqName));
|
|
desc += " \\#. "+utils.packStringId (new string_id("pet/pet_ability", "prereq_desc_end"));
|
|
}
|
|
}
|
|
*/
|
|
return desc;
|
|
}
|
|
|
|
|
|
commandHandler bm_creature_knowledge()
|
|
{
|
|
|
|
obj_id objTarget = getIntendedTarget(self);
|
|
|
|
//Must be type creature that is neither pet or beastmater pet
|
|
if(!isIdValid(objTarget) || !ai_lib.isMonster(objTarget) || beast_lib.isBeast(objTarget) || pet_lib.isPet(objTarget))
|
|
{
|
|
sendSystemMessage(getSelf(), new string_id("beast", "invalid_target_for_creature_knowledge"));
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
if ( hasObjVar(objTarget, "bm_doNotShowExamineInfo") )
|
|
{
|
|
sendSystemMessage(getSelf(), new string_id("beast", "invalid_target_for_creature_knowledge"));
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
|
|
int flags = 0;
|
|
|
|
//Break on Incap or damage. You would think you would need to be damaged to be incaped, oh how wrong you are.
|
|
flags |= sui.CD_EVENT_INCAPACITATE;
|
|
flags |= sui.CD_EVENT_DAMAGED;
|
|
|
|
int startTime = 0;
|
|
int endTime = 6;
|
|
|
|
string displayGroup = "bm_creature_knowledge";
|
|
string_id prompt = new string_id ("beast", "ability_activate_creature_knowledge");
|
|
string handler = "completeTheZipTimer";
|
|
|
|
//Min 24 to activate from comand_table, this allows a bit of wiggle with loitering creatures
|
|
float maxRange = 32;
|
|
|
|
int pid = sui.smartCountdownTimerSUI(self, self, displayGroup, prompt, startTime, endTime, handler, maxRange, flags);
|
|
|
|
utils.setScriptVar(self, sui.COUNTDOWNTIMER_SUI_VAR, pid);
|
|
utils.setScriptVar(self, "target", objTarget);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
messageHandler completeTheZipTimer()
|
|
{
|
|
int pid = params.getInt("id");
|
|
obj_id player = params.getObjId("player");
|
|
|
|
if(!isIdValid(player))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
int bp = sui.getIntButtonPressed(params);
|
|
|
|
if(bp == sui.BP_CANCEL)
|
|
{
|
|
detachScript(player, sui.COUNTDOWNTIMER_PLAYER_SCRIPT);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
else if(bp == sui.BP_REVERT)
|
|
{
|
|
int event = params.getInt("event");
|
|
|
|
if(event == sui.CD_EVENT_DAMAGED)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if(event == sui.CD_EVENT_INCAPACITATE)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
|
|
// Get the ID off of the player. ifit doesn't exist then this is an invalid message.
|
|
if(!hasObjVar(player, sui.COUNTDOWNTIMER_SUI_VAR))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
int test_pid = getIntObjVar(player, sui.COUNTDOWNTIMER_SUI_VAR);
|
|
|
|
// ifthe IDs don't match, then this is an invalid message.
|
|
if(pid != test_pid)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// Don't forget to close the window!
|
|
forceCloseSUIPage(pid);
|
|
|
|
// Cleanup!
|
|
detachScript(player, sui.COUNTDOWNTIMER_PLAYER_SCRIPT);
|
|
|
|
obj_id target = utils.getObjIdScriptVar(self, "target");
|
|
utils.removeScriptVar(self, "target");
|
|
buff.applyBuff(self, "bm_creature_knowledge");
|
|
|
|
//Grant youself the creature knowledge buff, this will allow you to learn special attacks from creatures.
|
|
int[] buffs = buff.getAllBuffs(target);
|
|
|
|
if(buffs != null && buffs.length > 0)
|
|
{
|
|
//Attempt to learn any active buffs off the target
|
|
for (int i=0;i<buffs.length;i++)
|
|
{
|
|
string name = buff.getBuffNameFromCrc(buffs[i]);
|
|
if (beast_lib.makeAbilityLearnSkillCheck(self, name))
|
|
beast_lib.playerLearnBeastMasterSkill(self, name);
|
|
}
|
|
}
|
|
|
|
|
|
int species = getSpecies(target);
|
|
utils.setScriptVar(self, "creature_knowledge.species", species);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_pig_forage()
|
|
{
|
|
obj_id player = self;
|
|
|
|
if(!buff.hasBuff(player, "bm_truffle_pig"))
|
|
buff.applyBuff(player, "bm_truffle_pig");
|
|
else
|
|
return SCRIPT_OVERRIDE;
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_helper_monkey_domestic()
|
|
{
|
|
obj_id player = self;
|
|
|
|
if(!buff.hasBuff(player, "bm_helper_monkey_domestic"))
|
|
buff.applyBuff(player, "bm_helper_monkey_domestic");
|
|
else
|
|
return SCRIPT_OVERRIDE;
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_helper_monkey_engineering()
|
|
{
|
|
obj_id player = self;
|
|
|
|
if(!buff.hasBuff(player, "bm_helper_monkey_engineering"))
|
|
buff.applyBuff(player, "bm_helper_monkey_engineering");
|
|
else
|
|
return SCRIPT_OVERRIDE;
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_helper_monkey_structure()
|
|
{
|
|
obj_id player = self;
|
|
|
|
if(!buff.hasBuff(player, "bm_helper_monkey_structure"))
|
|
buff.applyBuff(player, "bm_helper_monkey_structure");
|
|
else
|
|
return SCRIPT_OVERRIDE;
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_helper_monkey_munitions()
|
|
{
|
|
obj_id player = self;
|
|
|
|
if(!buff.hasBuff(player, "bm_helper_monkey_munitions"))
|
|
buff.applyBuff(player, "bm_helper_monkey_munitions");
|
|
else
|
|
return SCRIPT_OVERRIDE;
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_helper_monkey_jedi()
|
|
{
|
|
obj_id player = self;
|
|
|
|
if(!buff.hasBuff(player, "bm_helper_monkey_jedi"))
|
|
buff.applyBuff(player, "bm_helper_monkey_jedi");
|
|
else
|
|
return SCRIPT_OVERRIDE;
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_helper_monkey_shipwright()
|
|
{
|
|
obj_id player = self;
|
|
|
|
if(!buff.hasBuff(player, "bm_helper_monkey_shipwright"))
|
|
buff.applyBuff(player, "bm_helper_monkey_shipwright");
|
|
else
|
|
return SCRIPT_OVERRIDE;
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_dancing_cat()
|
|
{
|
|
obj_id player = self;
|
|
|
|
if(!beast_lib.isBeastMaster(player))
|
|
{
|
|
sendSystemMessage(player, beast_lib.SID_NOT_BEAST_MASTER);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
//get your beasts id
|
|
obj_id beast = beast_lib.getBeastOnPlayer(player);
|
|
|
|
if(!isIdValid(beast) || !exists(beast))
|
|
{
|
|
sendSystemMessage(player, beast_lib.SID_NO_BEAST_OUT);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
//verify that your beast can use this command
|
|
obj_id bcd = beast_lib.getBeastBCD(beast);
|
|
string beastName = beast_lib.getBeastType(bcd);
|
|
dictionary beastDict = utils.dataTableGetRow(beast_lib.BEASTS_TABLE, beastName);
|
|
string specialAttackFamily = beastDict.getString("special_attack_family");
|
|
|
|
if(!specialAttackFamily.equals("predatory_cat"))
|
|
{
|
|
sendSystemMessage(player, new string_id("beast", "beast_wrong_type"));
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
//get start location
|
|
location startLocation = getLocation(beast);
|
|
float beastYaw = getYaw(beast);
|
|
float beastScale = getScale(beast);
|
|
|
|
//make holo pets
|
|
string template = getTemplateName(beast);
|
|
beastName = getName(beast);
|
|
|
|
//determine if we are going to use the default name or the name the player has given his droid
|
|
string[] splitName = split(beastName, '/');
|
|
if(splitName.length > 1)
|
|
beastName = "@" + beastName;
|
|
|
|
//use current location as default
|
|
location holoOneLocation = startLocation;
|
|
holoOneLocation.z = holoOneLocation.z + 2;
|
|
holoOneLocation = utils.rotatePointXZ(startLocation, holoOneLocation, beastYaw);
|
|
|
|
//create hologram 1
|
|
obj_id holo_01 = create.object(template, holoOneLocation, false);
|
|
//make invulnerable
|
|
setInvulnerable(holo_01, true);
|
|
//make it a hologram
|
|
setHologramType(holo_01, HOLOGRAM_TYPE1_QUALITY3);
|
|
//set the name
|
|
setName(holo_01, beastName);
|
|
setYaw(holo_01, beastYaw);
|
|
setScale(holo_01, beastScale);
|
|
|
|
//use current location as default
|
|
location holoTwoLocation = startLocation;
|
|
holoTwoLocation.z = holoTwoLocation.z - 2;
|
|
holoTwoLocation = utils.rotatePointXZ(startLocation, holoTwoLocation, beastYaw);
|
|
|
|
|
|
//create hologram 1
|
|
obj_id holo_02 = create.object(template, holoTwoLocation, false);
|
|
//make invulnerable
|
|
setInvulnerable(holo_02, true);
|
|
//make it a hologram
|
|
setHologramType(holo_02, HOLOGRAM_TYPE1_QUALITY3);
|
|
//set the name
|
|
setName(holo_02, beastName);
|
|
setYaw(holo_02, beastYaw);
|
|
setScale(holo_02, beastScale);
|
|
|
|
int beastTrickNum = rand(1, 2);
|
|
int holoTrickNum = 1;
|
|
if(beastTrickNum == 1)
|
|
holoTrickNum = 2;
|
|
|
|
doAnimationAction(beast, "trick_" + beastTrickNum);
|
|
doAnimationAction(holo_01, "trick_" + holoTrickNum);
|
|
doAnimationAction(holo_02, "trick_" + holoTrickNum);
|
|
|
|
|
|
dictionary dict = new dictionary();
|
|
dict.put("holo_01", holo_01);
|
|
dict.put("holo_02", holo_02);
|
|
messageTo(self, "destroyHoloPets", dict, 6, false);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
messageHandler destroyHoloPets()
|
|
{
|
|
if(params == null || params.isEmpty())
|
|
return SCRIPT_CONTINUE;
|
|
|
|
obj_id holo_01 = params.getObjId("holo_01");
|
|
obj_id holo_02 = params.getObjId("holo_02");
|
|
|
|
destroyObject(holo_01);
|
|
destroyObject(holo_02);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
commandHandler bm_dancing_pet_entertainer()
|
|
{
|
|
if(utils.isProfession(self, 9))
|
|
{
|
|
if(!buff.hasBuff(self, "bm_dancing_pet_entertainer"))
|
|
{
|
|
buff.applyBuff(self, "bm_dancing_pet_entertainer");
|
|
}
|
|
else
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
else
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
|
|
commandHandler bm_survey_bonus()
|
|
{
|
|
if(!buff.hasBuff(self, "bm_survey_bonus"))
|
|
{
|
|
buff.applyBuff(self, "bm_survey_bonus");
|
|
}
|
|
else
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnCustomizeFinished(obj_id object, string params)
|
|
{
|
|
if(!isIdValid(object) || !exists(object))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
if(!utils.hasScriptVar(object, "beast.tool_oid"))
|
|
{
|
|
beast_lib.initializeBeastColor(object);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id beastDye = utils.getObjIdScriptVar(object, "beast.tool_oid");
|
|
|
|
// debugSpeakMsg(self, "beastDye: " + beastDye + " !utils.isNestedWithin(beastDye, self): " + !utils.isNestedWithin(beastDye, self));
|
|
|
|
// If the player traded off the beastDye or if the params are blank the player hit cancel.
|
|
if(!isValidId(beastDye) || !exists(beastDye) || !utils.isNestedWithin(beastDye, self) || params == null || params.equals(""))
|
|
{
|
|
debugSpeakMsg(self, "cancelled hue. reinitializing color object: " + object);
|
|
|
|
beast_lib.initializeBeastColor(object);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// Set colors on the beast/bcd and destroy the beast dye tool
|
|
|
|
string [] colorArray = split(params, ' ');
|
|
|
|
// debugSpeakMsg(self, "colorArray.length: " + colorArray.length + " params: " + params + " colorArray[0]: " + colorArray[0]);
|
|
|
|
if(colorArray.length < 2)
|
|
{
|
|
beast_lib.initializeBeastColor(object);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
if(colorArray.length >= 2)
|
|
{
|
|
// utils.tlog("beast", "colorArray.length >= 2");
|
|
beast_lib.setBeastHuePrimary(object, colorArray[0], utils.stringToInt(colorArray[1]));
|
|
}
|
|
|
|
if(colorArray.length >= 4)
|
|
{
|
|
// utils.tlog("beast", "colorArray.length >= 4");
|
|
beast_lib.setBeastHueSecondary(object, colorArray[2], utils.stringToInt(colorArray[3]));
|
|
}
|
|
|
|
if(colorArray.length >= 6)
|
|
{
|
|
// utils.tlog("beast", "colorArray.length >= 6");
|
|
beast_lib.setBeastHueThird(object, colorArray[4], utils.stringToInt(colorArray[5]));
|
|
}
|
|
|
|
utils.removeScriptVar(object, "beast.tool_oid");
|
|
|
|
destroyObject(beastDye);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|