mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-08-01 01:15:59 -04:00
576 lines
17 KiB
Plaintext
576 lines
17 KiB
Plaintext
/***** INCLUDES ********************************************************/
|
|
|
|
include library.create;
|
|
include library.utils;
|
|
include library.player_structure;
|
|
include library.sui;
|
|
include library.static_item;
|
|
include library.buff;
|
|
include library.chat;
|
|
include library.ai_lib;
|
|
include library.space_utils;
|
|
include library.space_transition;
|
|
include library.event_perk;
|
|
|
|
/***** CONSTS **********************************************************/
|
|
const string HALLOWEEN = new string("event/halloween");
|
|
//Menu option strings
|
|
const string_id TRICK_OPTION_1_ID = new string_id(HALLOWEEN, "halloween_trick_1");
|
|
const string_id TRICK_OPTION_2_ID = new string_id(HALLOWEEN, "halloween_trick_2");
|
|
const string_id TRICK_OPTION_3_ID = new string_id(HALLOWEEN, "halloween_trick_3");
|
|
const string_id TRICK_OPTION_4_ID = new string_id(HALLOWEEN, "halloween_trick_4");
|
|
const string_id TRICK_OPTION_5_ID = new string_id(HALLOWEEN, "halloween_trick_5");
|
|
//Trick particle effects
|
|
const string TRICK_1 = new string("appearance/pt_spider_flock_trick_device.prt");
|
|
const string TRICK_2 = new string("appearance/pt_moon_skulls.prt");
|
|
const string TRICK_3 = new string("appearance/pt_moon_ghost_s05.prt");
|
|
const string TRICK_4 = new string("appearance/pt_fire_face.prt");
|
|
const string TRICK_5 = new string("appearance/pt_moon_vortex.prt");
|
|
//Misc
|
|
const string_id FAULTY_DEVICE = new string_id(HALLOWEEN, "halloween_faulty_device");
|
|
const string_id IN_COMBAT = new string_id(HALLOWEEN, "halloween_in_combat");
|
|
const string_id SID_TURN_ON = new string_id(HALLOWEEN, "fog_machine_on");
|
|
const string_id SID_TURN_OFF = new string_id(HALLOWEEN, "fog_machine_off");
|
|
const string_id CANT_USE = new string_id(HALLOWEEN, "cant_use_device");
|
|
const string_id TEN_COINS = new string_id(HALLOWEEN, "ten_coins");
|
|
const string_id FIVE_COINS = new string_id(HALLOWEEN, "five_coins");
|
|
const string_id OUT_OF_RANGE = new string_id(HALLOWEEN, "trick_device_oor");
|
|
|
|
/***** FUNCTIONS ********************************************************/
|
|
|
|
trigger OnInitialize()
|
|
{
|
|
int projectorTier = getIntObjVar(self, "item.projector");
|
|
|
|
if (projectorTier > 2)
|
|
{
|
|
if (inHouse(self))
|
|
{
|
|
if (hasObjVar(self, "fogOn"))
|
|
{
|
|
createTriggerVolume ("fogTrigger", 80f, true);
|
|
startFog(self);
|
|
}
|
|
|
|
createTriggerVolume("trickAura", 5, true);
|
|
}
|
|
else
|
|
removeTriggerVolume("trickAura");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnAboutToBeTransferred(obj_id destContainer, obj_id transferer)
|
|
{
|
|
if (hasObjVar(self, "fogOn"))
|
|
{
|
|
removeObjVar(self, "fogOn");
|
|
removeObjVar(self, "unmoveable");
|
|
stopFog(self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnTransferred(obj_id sourceContainer, obj_id destContainer, obj_id transferer)
|
|
{
|
|
obj_id house = getTopMostContainer(self);
|
|
int projectorTier = getIntObjVar(self, "item.projector");
|
|
obj_id ship = space_transition.getContainingShip(destContainer);
|
|
string templateName ="";
|
|
|
|
if(isIdValid(ship))
|
|
{
|
|
templateName = getTemplateName(ship);
|
|
}
|
|
|
|
if (projectorTier > 2)
|
|
{
|
|
if (utils.isInHouseCellSpace(self) || space_utils.isPobType(templateName))
|
|
{
|
|
createTriggerVolume("trickAura", 5, true);
|
|
}
|
|
else
|
|
removeTriggerVolume("trickAura");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//If I'm a permanent trick or treat device and placed in a house, we'll play a random trick on anyone breaching our trigger volume.
|
|
trigger OnTriggerVolumeEntered(string volumeName, obj_id breacher)
|
|
{
|
|
if (volumeName == "trickAura")
|
|
{
|
|
if (!buff.hasBuff(breacher, "event_halloween_no_trick"))
|
|
{
|
|
int idx = rand(0,4);
|
|
switch(idx)
|
|
{
|
|
case 0: // trick1
|
|
playClientEffectObj(self, TRICK_1, breacher, "");
|
|
buff.applyBuff(breacher, "event_halloween_no_trick");
|
|
break;
|
|
case 1: // trick2
|
|
playClientEffectObj(self, TRICK_2, breacher, "");
|
|
buff.applyBuff(breacher, "event_halloween_no_trick");
|
|
break;
|
|
case 2: // trick3
|
|
playClientEffectObj(self, TRICK_3, breacher, "");
|
|
buff.applyBuff(breacher, "event_halloween_no_trick");
|
|
break;
|
|
case 3: // trick4
|
|
playClientEffectObj(self, TRICK_4, breacher, "");
|
|
buff.applyBuff(breacher, "event_halloween_no_trick");
|
|
break;
|
|
case 4: // trick5
|
|
playClientEffectObj(self, TRICK_5, breacher, "");
|
|
buff.applyBuff(breacher, "event_halloween_no_trick");
|
|
break;
|
|
|
|
default:
|
|
}
|
|
}
|
|
}
|
|
|
|
if (volumeName == "fogTrigger")
|
|
startFog(self);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
trigger OnObjectMenuRequest(obj_id player, menu_info mi)
|
|
{
|
|
menu_info_data data = mi.getMenuItemByType (menu_info_types.ITEM_USE);
|
|
mi.addRootMenu (menu_info_types.ITEM_USE, new string_id("",""));
|
|
|
|
if (inHouse(self))
|
|
{
|
|
if(hasObjVar(self, "fogOn"))
|
|
int fogOnOff = mi.addRootMenu(menu_info_types.ITEM_USE, SID_TURN_OFF);
|
|
else
|
|
int fogOnOff = mi.addRootMenu(menu_info_types.ITEM_USE, SID_TURN_ON);
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
trigger OnObjectMenuSelect(obj_id player, int item)
|
|
{
|
|
if(inHouse(self))
|
|
{
|
|
if(item == menu_info_types.ITEM_USE && !hasObjVar(self, "fogOn"))
|
|
{
|
|
//turn on the machine (in-house)
|
|
startFog(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if(item == menu_info_types.ITEM_USE && hasObjVar(self, "fogOn"))
|
|
{
|
|
//turn off the machine (in-house)
|
|
stopFog(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
|
|
else if (canUse(player, self) == true)
|
|
{
|
|
if ( item == menu_info_types.ITEM_USE )
|
|
{
|
|
startDevice(player);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (item == menu_info_types.ITEM_USE)
|
|
sendSystemMessage(player, CANT_USE);
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
boolean canUse(obj_id player, obj_id device)
|
|
{
|
|
if(!inHouse(device))
|
|
{
|
|
//Checking if the player has received his daily max amount of halloween coins.
|
|
if (event_perk.timeStampCheck(player) == false)
|
|
return false;
|
|
|
|
obj_id target = getIntendedTarget(player);
|
|
obj_id correctPlayer = utils.getObjIdScriptVar(target, "readyForTrickFromPlayer."+player);
|
|
//Making sure that the target is ready to be tricked by the player using the device before we add menus to perform the trick.
|
|
if (correctPlayer == player)
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void startDevice(obj_id player)
|
|
{
|
|
string TRICK_OPTION_1 = utils.packStringId(TRICK_OPTION_1_ID);
|
|
string TRICK_OPTION_2 = utils.packStringId(TRICK_OPTION_2_ID);
|
|
string TRICK_OPTION_3 = utils.packStringId(TRICK_OPTION_3_ID);
|
|
string TRICK_OPTION_4 = utils.packStringId(TRICK_OPTION_4_ID);
|
|
string TRICK_OPTION_5 = utils.packStringId(TRICK_OPTION_5_ID);
|
|
//List menus
|
|
const string[] TRICK_OPTIONS_1 = { TRICK_OPTION_1,
|
|
TRICK_OPTION_2,
|
|
TRICK_OPTION_3
|
|
};
|
|
const string[] TRICK_OPTIONS_2 = { TRICK_OPTION_1,
|
|
TRICK_OPTION_2,
|
|
TRICK_OPTION_3,
|
|
TRICK_OPTION_4
|
|
};
|
|
const string[] TRICK_OPTIONS_3 = { TRICK_OPTION_1,
|
|
TRICK_OPTION_2,
|
|
TRICK_OPTION_3,
|
|
TRICK_OPTION_4,
|
|
TRICK_OPTION_5
|
|
};
|
|
|
|
obj_id self = getSelf();
|
|
|
|
string prompt = "Select the desired trick";
|
|
string title = "Trick or Treat Projector";
|
|
|
|
closeOldWindow(player);
|
|
|
|
//Adding different tricks to the device menu depending on which of the three devices the player is using.
|
|
if (getIntObjVar(self, "item.projector") > 2)
|
|
{
|
|
int pid = sui.listbox(self, player, prompt, sui.OK_CANCEL, title, TRICK_OPTIONS_3, "handleOptionSelect", true, false);
|
|
setWindowPid(player, pid);
|
|
}
|
|
else if (getIntObjVar(self, "item.projector") > 1)
|
|
{
|
|
int pid = sui.listbox(self, player, prompt, sui.OK_CANCEL, title, TRICK_OPTIONS_2, "handleOptionSelect", true, false);
|
|
setWindowPid(player, pid);
|
|
}
|
|
else if (getIntObjVar(self, "item.projector") > 0)
|
|
{
|
|
int pid = sui.listbox(self, player, prompt, sui.OK_CANCEL, title, TRICK_OPTIONS_1, "handleOptionSelect", true, false);
|
|
setWindowPid(player, pid);
|
|
}
|
|
}
|
|
|
|
messageHandler handleOptionSelect()
|
|
{
|
|
if ( (params == null) || (params.isEmpty()) )
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
obj_id player = sui.getPlayerId(params);
|
|
int btn = sui.getIntButtonPressed(params);
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
|
|
if ( btn == sui.BP_CANCEL )
|
|
{
|
|
cleanScriptVars(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
if ( idx == -1)
|
|
{
|
|
cleanScriptVars(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id target = getIntendedTarget(player);
|
|
|
|
if (isIdValid(target) && exists(target))
|
|
{
|
|
location selfLoc = getLocation(player);
|
|
location targetLoc = getLocation(target);
|
|
float fltDistance = getDistance(selfLoc, targetLoc);
|
|
|
|
if (fltDistance > 30.0f)
|
|
{
|
|
sendSystemMessage(player, OUT_OF_RANGE);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
|
|
if (utils.hasScriptVar(target, "readyForTrickFromPlayer."+player))
|
|
{
|
|
obj_id correctPlayer = utils.getObjIdScriptVar(target, "readyForTrickFromPlayer."+player);
|
|
switch(idx)
|
|
{
|
|
case 0: // trick1
|
|
//Making sure that the target is ready to be tricked by the player using the device before we allow tricks to be performed.
|
|
if (correctPlayer == player)
|
|
{
|
|
utils.removeScriptVar(target, "readyForTrickFromPlayer."+player);
|
|
playTrick(self, player, target, 1);
|
|
}
|
|
break;
|
|
case 1: // trick2
|
|
if (correctPlayer == player)
|
|
{
|
|
utils.removeScriptVar(target, "readyForTrickFromPlayer."+player);
|
|
playTrick(self, player, target, 2);
|
|
}
|
|
break;
|
|
case 2: // trick3
|
|
if (correctPlayer == player)
|
|
{
|
|
utils.removeScriptVar(target, "readyForTrickFromPlayer."+player);
|
|
playTrick(self, player, target, 3);
|
|
}
|
|
break;
|
|
case 3: // trick4
|
|
if (correctPlayer == player)
|
|
{
|
|
utils.removeScriptVar(target, "readyForTrickFromPlayer."+player);
|
|
playTrick(self, player, target, 4);
|
|
}
|
|
break;
|
|
case 4: // trick5
|
|
if (correctPlayer == player)
|
|
{
|
|
utils.removeScriptVar(target, "readyForTrickFromPlayer."+player);
|
|
playTrick(self, player, target, 5);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
cleanScriptVars(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
void playTrick(obj_id self, obj_id player, obj_id target, int trick)
|
|
{
|
|
//Making sure player or NPC is not in combat.
|
|
if (!ai_lib.isInCombat(player) || !ai_lib.isInCombat(target))
|
|
{
|
|
int deviceQuality = getIntObjVar(self, "item.projector");
|
|
//Random roll to decide which trick will get the NPC super scared.
|
|
int scariestChance = rand(1, 5);
|
|
//Random roll to decide if the NPC get a little scared. Bigger chance the better the device.
|
|
int scareChance = 0;
|
|
if (deviceQuality == 3)
|
|
scareChance = rand(1, 70);
|
|
if (deviceQuality == 2)
|
|
scareChance = rand(1, 80);
|
|
if (deviceQuality == 1)
|
|
scareChance = rand(1, 100);
|
|
//If the obj var is zero or lower, something's gone wrong. The device is faulty.
|
|
if (deviceQuality < 1)
|
|
{
|
|
sendSystemMessage(player, FAULTY_DEVICE);
|
|
return;
|
|
}
|
|
//The NPC can say different things in response to the trick.
|
|
int scareDialogue = rand(1, 5);
|
|
|
|
switch (trick)
|
|
{
|
|
|
|
case 1:
|
|
playClientEffectObj(player, TRICK_1, target, "");
|
|
if (scariestChance == 1)
|
|
{
|
|
chat.chat(target, player, chat.CHAT_SCREAM, new string_id(HALLOWEEN, "super_scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
event_perk.giveTreat(player, 2);
|
|
doAnimationAction(target, "cover_eyes");
|
|
}
|
|
else if (scareChance < 51)
|
|
{
|
|
doAnimationAction(target, "scared");
|
|
chat.chat(target, player, chat.CHAT_STUTTER, new string_id(HALLOWEEN, "scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
event_perk.giveTreat(player, 1);
|
|
}
|
|
else
|
|
{
|
|
doAnimationAction(target, "dismiss");
|
|
chat.chat(target, player, chat.CHAT_SAY, new string_id(HALLOWEEN, "not_scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
playClientEffectObj(player, TRICK_2, target, "");
|
|
if (scariestChance == 2)
|
|
{
|
|
chat.chat(target, player, chat.CHAT_SCREAM, new string_id(HALLOWEEN, "super_scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
event_perk.giveTreat(player, 2);
|
|
doAnimationAction(target, "cover_eyes");
|
|
}
|
|
else if (scareChance < 51)
|
|
{
|
|
doAnimationAction(target, "scared");
|
|
chat.chat(target, player, chat.CHAT_STUTTER, new string_id(HALLOWEEN, "scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
event_perk.giveTreat(player, 1);
|
|
}
|
|
else
|
|
{
|
|
doAnimationAction(target, "dismiss");
|
|
chat.chat(target, player, chat.CHAT_SAY, new string_id(HALLOWEEN, "not_scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
playClientEffectObj(player, TRICK_3, target, "");
|
|
if (scariestChance == 3)
|
|
{
|
|
chat.chat(target, player, chat.CHAT_SCREAM, new string_id(HALLOWEEN, "super_scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
event_perk.giveTreat(player, 2);
|
|
doAnimationAction(target, "cover_eyes");
|
|
}
|
|
else if (scareChance < 51)
|
|
{
|
|
doAnimationAction(target, "scared");
|
|
chat.chat(target, player, chat.CHAT_STUTTER, new string_id(HALLOWEEN, "scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
event_perk.giveTreat(player, 1);
|
|
}
|
|
else
|
|
{
|
|
doAnimationAction(target, "dismiss");
|
|
chat.chat(target, player, chat.CHAT_SAY, new string_id(HALLOWEEN, "not_scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
playClientEffectObj(player, TRICK_4, target, "");
|
|
if (scariestChance == 4)
|
|
{
|
|
chat.chat(target, player, chat.CHAT_SCREAM, new string_id(HALLOWEEN, "super_scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
event_perk.giveTreat(player, 2);
|
|
doAnimationAction(target, "cover_eyes");
|
|
}
|
|
else if (scareChance < 51)
|
|
{
|
|
doAnimationAction(target, "scared");
|
|
chat.chat(target, player, chat.CHAT_STUTTER, new string_id(HALLOWEEN, "scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
event_perk.giveTreat(player, 1);
|
|
}
|
|
else
|
|
{
|
|
doAnimationAction(target, "dismiss");
|
|
chat.chat(target, player, chat.CHAT_SAY, new string_id(HALLOWEEN, "not_scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
}
|
|
break;
|
|
|
|
case 5:
|
|
playClientEffectObj(player, TRICK_5, target, "");
|
|
if (scariestChance == 5)
|
|
{
|
|
chat.chat(target, player, chat.CHAT_SCREAM, new string_id(HALLOWEEN, "super_scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
event_perk.giveTreat(player, 2);
|
|
doAnimationAction(target, "cover_eyes");
|
|
}
|
|
else if (scareChance < 51)
|
|
{
|
|
doAnimationAction(target, "scared");
|
|
chat.chat(target, player, chat.CHAT_STUTTER, new string_id(HALLOWEEN, "scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
event_perk.giveTreat(player, 1);
|
|
}
|
|
else
|
|
{
|
|
doAnimationAction(target, "dismiss");
|
|
chat.chat(target, player, chat.CHAT_SAY, new string_id(HALLOWEEN, "not_scared_" + scareDialogue), chat.ChatFlag_targetOnly);
|
|
}
|
|
break;
|
|
default:
|
|
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
sendSystemMessage(player, IN_COMBAT);
|
|
}
|
|
|
|
void cleanScriptVars(obj_id player)
|
|
{
|
|
obj_id self = getSelf();
|
|
|
|
utils.removeScriptVarTree(player, "trick_or_treat_device");
|
|
utils.removeScriptVarTree(self, "trick_or_treat_device");
|
|
|
|
setObjVar(player, "trick_or_treat_device", true);
|
|
}
|
|
|
|
void closeOldWindow(obj_id player)
|
|
{
|
|
string playerPath = "trick_or_treat_device.";
|
|
if ( utils.hasScriptVar(player, "trick_or_treat_device.pid"))
|
|
{
|
|
int oldpid = utils.getIntScriptVar(player, "trick_or_treat_device.pid");
|
|
forceCloseSUIPage (oldpid);
|
|
utils.removeScriptVar(player, "trick_or_treat_device.pid");
|
|
}
|
|
}
|
|
|
|
void setWindowPid(obj_id player, int pid)
|
|
{
|
|
if (pid > -1) utils.setScriptVar(player, "trick_or_treat_device.pid", pid);
|
|
}
|
|
|
|
//House or POB ship check.
|
|
boolean inHouse(obj_id device)
|
|
{
|
|
obj_id selfContainer = getContainedBy(device);
|
|
obj_id ship = space_transition.getContainingShip(selfContainer);
|
|
string templateName ="";
|
|
|
|
if(isIdValid(ship))
|
|
{
|
|
templateName = getTemplateName(ship);
|
|
}
|
|
|
|
if ((utils.isInHouseCellSpace(device) || space_utils.isPobType(templateName)) && !utils.isNestedWithinAPlayer(device))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
void startFog(obj_id device)
|
|
{
|
|
stopClientEffectObjByLabel(device, "halloweenFog");
|
|
|
|
if (!hasObjVar(device, "fogOn"))
|
|
setObjVar(device, "fogOn", 1);
|
|
|
|
setObjVar(device, "unmoveable", 1);
|
|
playClientEffectObj(device, "clienteffect/halloween_fog_machine.cef", device, "", null, "halloweenFog");
|
|
messageTo(device, "continueFog", null, 18.0f, false);
|
|
}
|
|
|
|
void stopFog(obj_id device)
|
|
{
|
|
stopClientEffectObjByLabel(device, "halloweenFog");
|
|
|
|
if (hasObjVar(device, "fogOn"))
|
|
removeObjVar(device, "fogOn");
|
|
if (hasObjVar(device, "unmoveable"))
|
|
removeObjVar(device, "unmoveable");
|
|
}
|
|
|
|
messageHandler continueFog()
|
|
{
|
|
if(hasObjVar(self, "fogOn"))
|
|
{
|
|
playClientEffectObj(self, "clienteffect/halloween_fog_machine.cef", self, "", null, "halloweenFog");
|
|
messageTo(self, "continueFog", null, 18.0f, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//If destroying trick or treat projector III, we modify the collection slot value of the invisible collection that blocks players from having more than one.
|
|
trigger OnDestroy()
|
|
{
|
|
|
|
if (getIntObjVar(self, "item.projector") > 2)
|
|
{
|
|
if (hasObjVar(self, "deviceOwner"))
|
|
{
|
|
obj_id player = getObjIdObjVar(self, "deviceOwner");
|
|
|
|
if (getCollectionSlotValue(player, "received_halloween_reward") > 0)
|
|
modifyCollectionSlotValue(player, "received_halloween_reward", -1);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|