141 lines
4.2 KiB
Lua
141 lines
4.2 KiB
Lua
-----------------------------------
|
|
-- func: jail
|
|
-- desc: Sends the target player to jail. (Mordion Gaol)
|
|
-- note: Only works if the target is on the same map process (cluster) as the GM or the target is offline
|
|
-----------------------------------
|
|
---@type TCommand
|
|
local commandObj = {}
|
|
|
|
commandObj.cmdprops =
|
|
{
|
|
permission = 1,
|
|
parameters = 'sis'
|
|
}
|
|
|
|
commandObj.onTrigger = function(player, target, cellId, reason)
|
|
local jailCells =
|
|
{
|
|
-- Floor 1 (Bottom)
|
|
{ -620, 11, 660 },
|
|
{ -180, 11, 660 },
|
|
{ 260, 11, 660 },
|
|
{ 700, 11, 660 },
|
|
{ -620, 11, 220 },
|
|
{ -180, 11, 220 },
|
|
{ 260, 11, 220 },
|
|
{ 700, 11, 220 },
|
|
{ -620, 11, -220 },
|
|
{ -180, 11, -220 },
|
|
{ 260, 11, -220 },
|
|
{ 700, 11, -220 },
|
|
{ -620, 11, -620 },
|
|
{ -180, 11, -620 },
|
|
{ 260, 11, -620 },
|
|
{ 700, 11, -620 },
|
|
|
|
-- Floor 2 (Top)
|
|
{ -620, -400, 660 },
|
|
{ -180, -400, 660 },
|
|
{ 260, -400, 660 },
|
|
{ 700, -400, 660 },
|
|
{ -620, -400, 220 },
|
|
{ -180, -400, 220 },
|
|
{ 260, -400, 220 },
|
|
{ 700, -400, 220 },
|
|
{ -620, -400, -220 },
|
|
{ -180, -400, -220 },
|
|
{ 260, -400, -220 },
|
|
{ 700, -400, -220 },
|
|
{ -620, -400, -620 },
|
|
{ -180, -400, -620 },
|
|
{ 260, -400, -620 },
|
|
{ 700, -400, -620 },
|
|
}
|
|
|
|
-- defaults
|
|
local targetIsOnline = false
|
|
local targetID = 0
|
|
local targetObj = GetPlayerByName(target)
|
|
|
|
-- Did not find the target (Invalid target name, offline target or online target in a different map process)
|
|
if targetObj == nil then
|
|
-- check if the target name is in the database
|
|
targetID = GetPlayerIDByName(target)
|
|
|
|
-- If name in the database then will have valid ID > 0
|
|
if
|
|
targetID ~= nil and
|
|
targetID > 0 and
|
|
targetID < 0xFFFFFFFF
|
|
then
|
|
-- next check if the target has a valid session (and thus online in a different map process (cluster))
|
|
if PlayerHasValidSession(targetID) then
|
|
-- Target online in different map process (cluster) than GM so inform the GM and exit
|
|
player:printToPlayer(string.format("Player '%s' is online but in a different zone group (cluster). Go to that zone group to use !jail", target))
|
|
return
|
|
end
|
|
|
|
-- No such target name in the database so inform the GM and exit
|
|
else
|
|
player:printToPlayer(string.format("Invalid player '%s' given.", target))
|
|
return
|
|
end
|
|
|
|
-- Found the target online in this map process. Get their ID.
|
|
else
|
|
targetIsOnline = true
|
|
targetID = targetObj:getID()
|
|
end
|
|
|
|
-- Target safety check.
|
|
if
|
|
targetID == nil or
|
|
targetID <= 0 or
|
|
targetID >= 0xFFFFFFFF
|
|
then
|
|
player:printToPlayer('Something went wrong.')
|
|
return
|
|
end
|
|
|
|
-----------------------------------
|
|
-- Validate parameter 2 (Cell id) (Optional)
|
|
-----------------------------------
|
|
local chosenCell = 1
|
|
|
|
if
|
|
cellId ~= nil and
|
|
cellId > 0 and
|
|
cellId <= 32
|
|
then
|
|
chosenCell = cellId
|
|
end
|
|
|
|
-----------------------------------
|
|
-- Validate parameter 3 (Reason) (Optional)
|
|
-----------------------------------
|
|
if reason == nil then
|
|
reason = 'Unspecified'
|
|
end
|
|
|
|
-----------------------------------
|
|
-- Perform the jailing
|
|
-----------------------------------
|
|
-- Send message to GM and console.
|
|
local targetStatus = (targetIsOnline and 'Online') or 'Offline'
|
|
local message = string.format('%s jailed %s (ID: %d, status: %s) into cell %d. Reason: %s', player:getName(), target, targetID, targetStatus, chosenCell, reason)
|
|
|
|
player:printToPlayer(message)
|
|
printf(message)
|
|
|
|
-- Send player to jail using either the online or offline method
|
|
local dest = jailCells[chosenCell]
|
|
|
|
if targetObj and targetIsOnline then
|
|
targetObj:setCharVar('inJail', chosenCell)
|
|
targetObj:setPos(dest[1], dest[2], dest[3], 0, 131)
|
|
else
|
|
SendToJailOffline(targetID, chosenCell, dest[1], dest[2], dest[3], 0)
|
|
end
|
|
end
|
|
|
|
return commandObj
|