landsandboat/scripts/commands/mission.lua
2025-03-07 20:50:20 -06:00

134 lines
5 KiB
Lua

-----------------------------------
-- func: mission <logid> <missionid> optional <player-name>, logid and mission ids work by numbers or string.format
-- desc: mission command built with menu control, can add/delete/complete missions, see status,
-- see vars in the IF format of 'Prog', 'Option', 'Stage', 'Wait', 'Timer', etc.
-- Can clear vars in the IF format
-----------------------------------
local logIdHelpers = require('scripts/globals/log_ids')
-----------------------------------
---@type TCommand
local commandObj = {}
commandObj.cmdprops =
{
permission = 1,
parameters = 'sss'
}
local function error(player, msg)
player:printToPlayer(msg)
player:printToPlayer('!quest <logId> <missionId> {player}', xi.msg.channel.NS_LINKSHELL3)
end
commandObj.onTrigger = function(player, logId, missionId, target)
-- validate logId
local missionLog = logIdHelpers.getMissionLogInfo(logId)
if missionLog == nil then
error(player, 'Invalid logID.')
return
end
local logName = missionLog.full_name
logId = missionLog.mission_log
-- validate missionId
local areaMissionIds = xi.mission.id[xi.mission.area[logId]]
if missionId ~= nil then
missionId = tonumber(missionId) or areaMissionIds[string.upper(missionId)] or _G[string.upper(missionId)]
end
if missionId == nil or missionId < 0 then
error(player, 'Invalid missionID.')
return
end
-- validate target
local targ
if target == nil then
targ = player:getCursorTarget()
if targ == nil or not targ:isPC() then
targ = player
end
else
targ = GetPlayerByName(target)
if targ == nil then
error(player, string.format('Player named %s not found!', target, xi.msg.channel.NS_LINKSHELL3))
return
end
end
local currentMission = targ:getCurrentMission(logId)
local completed = targ:hasCompletedMission(logId, missionId)
local missionStatus = targ:getMissionStatus(logId)
local menu =
{
title = 'Quest Menu',
onStart = function(playerArg)
if completed then
playerArg:printToPlayer(string.format('Player %s has completed requested mission %s, %i', targ:getName(), logName, missionId), xi.msg.channel.NS_LINKSHELL3)
elseif currentMission == 65535 then
playerArg:printToPlayer(string.format('Player %s has no MissionID set for %s', targ:getName(), logName), xi.msg.channel.NS_LINKSHELL3)
return
end
playerArg:printToPlayer(string.format('Player %s current missionID is %i for log %s with status of %i', targ:getName(), missionId, logName, missionStatus), xi.msg.channel.NS_LINKSHELL3)
playerArg:printToPlayer(string.format('Player %s variables for %s mission is %i:', targ:getName(), logName, missionId), xi.msg.channel.NS_LINKSHELL3)
local vars = targ:getCharVarsWithPrefix(xi.mission.getVarPrefix(logId, missionId))
local count = 0
for k, v in pairs(vars) do
playerArg:printToPlayer(string.format('%s = %s', k, v), xi.msg.channel.NS_LINKSHELL3)
count = count + 1
end
if count == 0 then
playerArg:printToPlayer('No variables found.', xi.msg.channel.NS_LINKSHELL3)
end
end,
options =
{
{
'Add Mission',
function(playerArg)
targ:addMission(logId, missionId)
playerArg:printToPlayer(string.format('Added %s mission %i to %s.', logName, missionId, targ:getName()), xi.msg.channel.NS_LINKSHELL3)
end,
},
{
'Complete Mission',
function(playerArg)
targ:completeMission(logId, missionId)
playerArg:printToPlayer(string.format('Completed %s mission with ID %u for %s', logName, missionId, targ:getName()), xi.msg.channel.NS_LINKSHELL3)
end,
},
{
'Delete Mission',
function(playerArg)
targ:delMission(logId, missionId)
playerArg:printToPlayer(string.format('Deleted %s mission %i from %s.', logName, missionId, targ:getName()), xi.msg.channel.NS_LINKSHELL3)
end,
},
{
'Clear Vars',
function(playerArg)
targ:clearVarsWithPrefix(xi.mission.getVarPrefix(logId, missionId))
playerArg:printToPlayer(string.format('Player %s variables for %s mission %i are cleared', targ:getName(), logName, missionId), xi.msg.channel.NS_LINKSHELL3)
end,
},
},
onCancelled = function(playerArg)
playerArg:printToPlayer('Menu Cancelled', xi.msg.channel.NS_LINKSHELL3)
end,
onEnd = function(playerArg)
end,
}
player:customMenu(menu)
end
return commandObj