mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-31 00:15:54 -04:00
254 lines
6.8 KiB
Plaintext
254 lines
6.8 KiB
Plaintext
/**********************************************************************
|
|
* Copyright (c)2000-2002 Sony Online Entertainment Inc.
|
|
* All Rights Reserved
|
|
*
|
|
* Title: missions.scriptlib
|
|
* Description: missions script library
|
|
* @author $Author:$
|
|
* @version $Revision:$
|
|
**********************************************************************/
|
|
|
|
/***** INCLUDES ********************************************************/
|
|
|
|
include library.utils;
|
|
|
|
/***** CONSTANTS *******************************************************/
|
|
|
|
const int STATE_DYNAMIC_PICKUP = 1;
|
|
const int STATE_DYNAMIC_DROPOFF = 2; // these are used to parse our mission state.
|
|
const int STATE_DYNAMIC_START = 3;
|
|
const int STATE_DELIVER_PICKUP = 4; // delivery mission states
|
|
const int STATE_DELIVER_DROPOFF = 5;
|
|
const int STATE_DEAD = 6; // for tracking NPC status
|
|
const int STATE_MISSION_COMPLETE = 7; // completion state to disable respawn stuff
|
|
|
|
|
|
const int BH_STAT_MIN = -1;
|
|
const int WINS = 0;
|
|
const int LOSSES = 1;
|
|
const int ABORTS = 2;
|
|
const int TIMEOUTS = 3;
|
|
const int BH_STAT_MAX = 4;
|
|
|
|
|
|
const int BOUNTY_FLAG_NONE = 0;
|
|
const int BOUNTY_FLAG_SMUGGLER = 1;
|
|
|
|
const int DAILY_MISSION_XP_REWARD = 10;
|
|
const int DAILY_MISSION_CASH_REWARD = 15;
|
|
const int DAILY_MISSION_XP_SANITY = 5;
|
|
const int DAILY_MISSION_XP_LOW = 9;
|
|
const int DAILY_MISSION_XP_MEDIUM = 14;
|
|
const int DAILY_MISSION_XP_HIGH = 19;
|
|
const string DAILY_MISSION_OBJVAR ="missions.daily";
|
|
const string DAILY_MISSION_CLOCK_OBJVAR ="missions.dailyClock";
|
|
|
|
const string_id DAILY_REWARD_XP = new string_id("base_player","prose_mission_xp_amount");
|
|
|
|
|
|
/***** FUNCTIONS *******************************************************/
|
|
|
|
void sendBountyFail(obj_id hunter, obj_id target)
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("target", target);
|
|
|
|
setObjVar(hunter, "intState", STATE_MISSION_COMPLETE);
|
|
messageTo(hunter, "bountyFailure", params, 0, true); // spawner timer has started
|
|
}
|
|
|
|
// success wrapper function
|
|
void sendBountySuccess(obj_id hunter, obj_id target)
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("target", target);
|
|
|
|
setObjVar(hunter, "intState", STATE_MISSION_COMPLETE);
|
|
messageTo(hunter, "bountySuccess", params, 0, true); // spawner timer has started
|
|
}
|
|
|
|
// incomplete wrapper function
|
|
void sendBountyIncomplete(obj_id hunter, obj_id target)
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("target", target);
|
|
|
|
setObjVar(hunter, "intState", STATE_MISSION_COMPLETE);
|
|
messageTo(hunter, "bountyIncomplete", params, 0, true); // spawner timer has started
|
|
}
|
|
|
|
|
|
void increaseBountyJediKillTracking(obj_id objPlayer, int stat)
|
|
{
|
|
// validate stat is a valid index
|
|
if(stat <= missions.BH_STAT_MIN || stat >= missions.BH_STAT_MAX)
|
|
{
|
|
return;
|
|
}
|
|
//killdata[0] = wins
|
|
//killdata[1] = losses
|
|
//killdata[2] = aborts
|
|
//killdata[3] = timeouts
|
|
int [] killData = new int[missions.BH_STAT_MAX];
|
|
//if we have never done a bounty before
|
|
if (!hasObjVar(objPlayer, "bounty_hunter.jedi_kill_tracker"))
|
|
setObjVar(objPlayer, "bounty_hunter.jedi_kill_tracker", killData);
|
|
|
|
|
|
killData = getIntArrayObjVar(objPlayer, "bounty_hunter.jedi_kill_tracker");
|
|
//validate
|
|
if (killData.length != missions.BH_STAT_MAX)
|
|
return;
|
|
//increase counter by 1
|
|
killData[stat]++;
|
|
setObjVar(objPlayer, "bounty_hunter.jedi_kill_tracker", killData);
|
|
}
|
|
|
|
int getPlayerDailyCount(obj_id player)
|
|
{
|
|
if(!isIdValid(player))
|
|
return 0;
|
|
|
|
if(!hasObjVar(player, DAILY_MISSION_OBJVAR))
|
|
return 0;
|
|
|
|
return getIntObjVar(player, DAILY_MISSION_OBJVAR);
|
|
}
|
|
|
|
void incrementDaily(obj_id player)
|
|
{
|
|
int missionData = getPlayerDailyCount(player);
|
|
|
|
if (!hasObjVar(player, DAILY_MISSION_CLOCK_OBJVAR))
|
|
{
|
|
//use 8 as the hour paramater as this is 7pm GMT or 12 noon PDT
|
|
int currentTime = getCalendarTime();
|
|
int alarmTime = createDailyAlarmClock(player, "handleDailyMissionReset", null, 19, 0, 0);
|
|
|
|
int alarmTimeObjVar = currentTime + alarmTime;
|
|
|
|
setObjVar(player, DAILY_MISSION_CLOCK_OBJVAR, alarmTimeObjVar);
|
|
}
|
|
|
|
missionData ++;
|
|
|
|
setObjVar(player, DAILY_MISSION_OBJVAR, missionData);
|
|
}
|
|
|
|
boolean canEarnDailyMissionXp(obj_id player)
|
|
{
|
|
if(!isIdValid(player))
|
|
return false;
|
|
|
|
int dailyData = getPlayerDailyCount(player);
|
|
|
|
//garbage number, you Fail
|
|
if(dailyData < 0)
|
|
return false;
|
|
|
|
//no xp for ents or traders from missions
|
|
if(utils.isProfession(player, utils.TRADER) || utils.isProfession(player, utils.ENTERTAINER))
|
|
return false;
|
|
|
|
//less than constant, can earn xp
|
|
if(dailyData < DAILY_MISSION_XP_REWARD)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
//higher the divisor the less the mission pays
|
|
float alterMissionPayoutDivisor(obj_id player, float divisor, int missionLevel)
|
|
{
|
|
int playerLevel = getLevel(player);
|
|
//deltas should be positive
|
|
int levelDelta = Math.abs(missionLevel - playerLevel);
|
|
|
|
divisor = alterMissionPayoutDivisorDaily(player, divisor);
|
|
|
|
if(utils.isProfession(player, utils.ENTERTAINER))
|
|
divisor += 10.0f;
|
|
|
|
if(utils.isProfession(player, utils.TRADER))
|
|
divisor += 20.0f;
|
|
|
|
if(levelDelta >= 10)
|
|
divisor += (float)levelDelta / 2;
|
|
|
|
//LOG("NewMission", "alterMissionPayoutDivisor: " + divisor );
|
|
return divisor;
|
|
}
|
|
|
|
//increases payout divisor based on completion of a certian number of daily missions
|
|
float alterMissionPayoutDivisorDaily(obj_id player, float divisor)
|
|
{
|
|
int missionsCompleted = getPlayerDailyCount(player);
|
|
|
|
if(missionsCompleted > DAILY_MISSION_CASH_REWARD)
|
|
divisor += (float)missionsCompleted;
|
|
|
|
return divisor;
|
|
}
|
|
|
|
float alterMissionPayoutDivisorDaily(obj_id player)
|
|
{
|
|
return alterMissionPayoutDivisorDaily(player, 1.0f);
|
|
}
|
|
|
|
|
|
void initializeDailyOnLogin(obj_id player)
|
|
{
|
|
if (hasObjVar(player, DAILY_MISSION_CLOCK_OBJVAR))
|
|
{
|
|
//use 8 as the hour paramater as this is 8pm GMT or 12 noon CST
|
|
int currentTime = getCalendarTime();
|
|
int alarmTimeObjVar = getIntObjVar(player, missions.DAILY_MISSION_CLOCK_OBJVAR);
|
|
|
|
if(currentTime >= alarmTimeObjVar)
|
|
{
|
|
clearDailyObjVars(player);
|
|
}
|
|
else
|
|
{
|
|
int secondsUntil = alarmTimeObjVar - currentTime;
|
|
messageTo(player, "handleDailyMissionReset",null, secondsUntil , false);
|
|
}
|
|
}
|
|
else if(hasObjVar(player, DAILY_MISSION_OBJVAR))
|
|
{
|
|
//this is for messed up characters who somehow didn't have a clock objvar
|
|
int countObjVar = getIntObjVar(player, missions.DAILY_MISSION_OBJVAR);
|
|
|
|
if(countObjVar >0)
|
|
{
|
|
//use 8 as the hour paramater as this is 7pm GMT or 12 noon PDT
|
|
int currentTime = getCalendarTime();
|
|
int alarmTime = createDailyAlarmClock(player, "handleDailyMissionReset", null, 19, 0, 0);
|
|
|
|
int alarmTimeObjVar = currentTime + alarmTime;
|
|
|
|
setObjVar(player, DAILY_MISSION_CLOCK_OBJVAR, alarmTimeObjVar);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void clearDailyObjVars(obj_id player)
|
|
{
|
|
setObjVar(player, DAILY_MISSION_OBJVAR, 0);
|
|
removeObjVar(player, DAILY_MISSION_CLOCK_OBJVAR);
|
|
}
|
|
|
|
|
|
boolean isDestroyMission(obj_id objMissionData)
|
|
{
|
|
if(!isIdValid(objMissionData))
|
|
return false;
|
|
|
|
string strTest = getMissionType(objMissionData);
|
|
|
|
if(strTest == "destroy")
|
|
return true;
|
|
|
|
return false;
|
|
} |