2018-01-19 16:08:48 +02:00
local Thread = require " utils.Thread "
require " utils.event "
2017-07-23 14:51:20 +02:00
2017-09-02 14:31:01 +02:00
function player_print ( str )
if game.player then
game.player . print ( str )
else
log ( str )
end
end
2017-07-06 19:37:57 +02:00
function cant_run ( name )
2017-09-02 14:31:01 +02:00
player_print ( " Can't run command ( " .. name .. " ) - insufficient permission. " )
2017-07-06 19:37:57 +02:00
end
2017-09-03 12:29:19 +02:00
local function invoke ( cmd )
2017-09-02 14:31:01 +02:00
if not game.player or not ( game.player . admin or is_mod ( game.player . name ) ) then
2017-07-06 19:37:57 +02:00
cant_run ( cmd.name )
return
end
local target = cmd [ " parameter " ]
2017-07-08 20:58:45 +02:00
if target == nil or game.players [ target ] == nil then
2017-09-02 14:31:01 +02:00
player_print ( " Unknown player. " )
2017-07-08 20:58:45 +02:00
return
2017-07-06 19:37:57 +02:00
end
2017-10-26 10:55:02 +02:00
local pos = game.player . surface.find_non_colliding_position ( " player " , game.player . position , 0 , 1 )
2017-10-29 00:20:52 +02:00
game.players [ target ] . teleport ( { pos.x , pos.y } , game.player . surface )
2017-07-06 19:37:57 +02:00
game.print ( target .. " , get your ass over here! " )
end
2017-09-03 12:29:19 +02:00
local function teleport_player ( cmd )
2017-09-02 14:31:01 +02:00
if not game.player or not ( game.player . admin or is_mod ( game.player . name ) ) then
2017-07-06 19:37:57 +02:00
cant_run ( cmd.name )
return
end
local target = cmd [ " parameter " ]
2017-07-08 20:58:45 +02:00
if target == nil or game.players [ target ] == nil then
2017-09-02 14:31:01 +02:00
player_print ( " Unknown player. " )
2017-07-08 20:58:45 +02:00
return
2017-07-06 19:37:57 +02:00
end
2017-10-26 10:55:02 +02:00
local surface = game.players [ target ] . surface
2017-10-29 00:20:52 +02:00
local pos = surface.find_non_colliding_position ( " player " , game.players [ target ] . position , 0 , 1 )
2017-10-26 10:55:02 +02:00
game.player . teleport ( pos , surface )
2017-07-06 19:37:57 +02:00
game.print ( target .. " ! watcha doin'?! " )
end
2017-09-03 12:29:19 +02:00
local function teleport_location ( cmd )
2017-09-02 14:31:01 +02:00
if not game.player or not ( game.player . admin or is_mod ( game.player . name ) ) then
2017-07-06 19:37:57 +02:00
cant_run ( cmd.name )
return
end
if game.player . selected == nil then
2017-09-02 14:31:01 +02:00
player_print ( " Nothing selected. " )
2017-07-06 19:37:57 +02:00
return
end
2017-10-26 10:55:02 +02:00
local pos = game.player . surface.find_non_colliding_position ( " player " , game.player . selected.position , 0 , 1 )
game.player . teleport ( pos )
2017-07-06 19:37:57 +02:00
end
2017-09-03 12:29:19 +02:00
local function kill ( )
2017-12-26 00:09:40 +02:00
if game.player and game.player . character then
2017-09-02 14:31:01 +02:00
game.player . character.die ( )
end
2017-07-08 20:58:45 +02:00
end
2017-07-06 19:37:57 +02:00
2017-08-28 01:17:07 +02:00
global.walking = { }
2017-09-03 12:29:19 +02:00
local function walkabout ( cmd )
2017-09-02 14:31:01 +02:00
if not ( ( not game.player ) or game.player . admin or is_mod ( game.player . name ) ) then
2017-07-08 23:06:39 +02:00
cant_run ( cmd.name )
return
end
2017-07-09 01:14:59 +02:00
local params = { }
2017-07-08 23:06:39 +02:00
if cmd.parameter == nil then
2017-12-25 23:11:24 +02:00
player_print ( " Walkabout failed. " )
return
end
2017-10-05 23:19:53 +02:00
for param in string.gmatch ( cmd.parameter , " %S+ " ) do table.insert ( params , param ) end
2017-07-08 23:06:39 +02:00
local player_name = params [ 1 ]
2017-08-28 01:17:07 +02:00
local duration = 60
2017-12-25 23:11:24 +02:00
if # params > 2 then
player_print ( " Walkabout failed, check /help walkabout. " )
2017-07-08 23:06:39 +02:00
return
2017-12-25 23:11:24 +02:00
elseif # params == 2 and tonumber ( params [ 2 ] ) == nil then
player_print ( params [ 2 ] .. " is not a number. " )
return
elseif # params == 2 and tonumber ( params [ 2 ] ) then
duration = tonumber ( params [ 2 ] )
2017-07-08 23:06:39 +02:00
end
2017-12-25 23:11:24 +02:00
if duration < 15 then duration = 15 end
2017-07-08 23:06:39 +02:00
2017-07-23 14:51:20 +02:00
local player = game.players [ player_name ]
2017-08-28 01:17:07 +02:00
if player == nil or global.walking [ player_name : lower ( ) ] then
2017-09-02 14:31:01 +02:00
player_print ( player_name .. " could not go on a walkabout. " )
2017-07-23 14:51:20 +02:00
return
end
2017-12-25 23:11:24 +02:00
local chunks = { }
for chunk in player.surface . get_chunks ( ) do
table.insert ( chunks , chunk )
2017-07-23 14:51:20 +02:00
end
2017-12-25 23:11:24 +02:00
local chunk = chunks [ math.random ( # chunks ) ]
if not chunk then
return
2017-07-23 14:51:20 +02:00
end
2017-12-25 23:11:24 +02:00
local pos = { x = chunk.x * 32 , y = chunk.y * 32 }
local non_colliding_pos = player.surface . find_non_colliding_position ( " player " , pos , 100 , 1 )
if non_colliding_pos then
game.print ( player_name .. " went on a walkabout, to find himself. " )
Thread.set_timeout ( duration , return_player , { player = player , force = player.force , position = { x = player.position . x , y = player.position . y } } )
player.character = nil
player.create_character ( )
player.teleport ( non_colliding_pos )
player.force = " enemy "
global.walking [ player_name : lower ( ) ] = true
else
player_print ( " Walkabout failed: count find non colliding position " )
2017-07-08 23:06:39 +02:00
end
2017-07-23 14:51:20 +02:00
end
2017-09-03 12:29:19 +02:00
local function return_player ( args )
2017-08-28 01:17:07 +02:00
global.walking [ args.player . name : lower ( ) ] = false
args.player . character.destroy ( )
local character = args.player . surface.find_entity ( ' player ' , args.position )
if character ~= nil and character.valid then
args.player . character = character
else
args.player . create_character ( )
end
2017-07-23 14:51:20 +02:00
args.player . force = args.force
2017-08-28 01:17:07 +02:00
args.player . teleport ( args.position )
2017-07-23 14:51:20 +02:00
game.print ( args.player . name .. " came back from his walkabout. " )
2017-07-08 23:06:39 +02:00
end
2017-07-06 19:37:57 +02:00
2017-07-09 15:20:01 +02:00
local function regular ( cmd )
2017-09-02 14:31:01 +02:00
if not ( ( not game.player ) or game.player . admin or is_mod ( game.player . name ) ) then
2017-07-09 15:20:01 +02:00
cant_run ( cmd.name )
return
end
if cmd.parameter == nil then
2017-09-02 14:31:01 +02:00
player_print ( " Command failed. Usage: /regular <promote, demote>, <player> " )
2017-07-09 15:20:01 +02:00
return
end
local params = { }
2017-10-05 23:19:53 +02:00
for param in string.gmatch ( cmd.parameter , " %S+ " ) do table.insert ( params , param ) end
2017-07-09 15:20:01 +02:00
if params [ 2 ] == nil then
2017-09-02 14:31:01 +02:00
player_print ( " Command failed. Usage: /regular <promote, demote>, <player> " )
2017-07-09 15:20:01 +02:00
return
elseif ( params [ 1 ] == " promote " ) then
add_regular ( params [ 2 ] )
elseif ( params [ 1 ] == " demote " ) then
remove_regular ( params [ 2 ] )
else
2017-09-02 14:31:01 +02:00
player_print ( " Command failed. Usage: /regular <promote, demote>, <player> " )
2017-07-09 15:20:01 +02:00
end
end
local function mod ( cmd )
2017-09-02 14:31:01 +02:00
if game.player and not game.player . admin then
2017-07-09 15:20:01 +02:00
cant_run ( cmd.name )
return
end
if cmd.parameter == nil then
2017-09-02 14:31:01 +02:00
player_print ( " Command failed. Usage: /mod <promote, demote>, <player> " )
2017-07-09 15:20:01 +02:00
return
end
local params = { }
2017-10-05 23:19:53 +02:00
for param in string.gmatch ( cmd.parameter , " %S+ " ) do table.insert ( params , param ) end
2017-07-09 15:20:01 +02:00
if params [ 2 ] == nil then
2017-09-02 14:31:01 +02:00
player_print ( " Command failed. Usage: /mod <promote, demote>, <player> " )
2017-07-09 15:20:01 +02:00
return
elseif ( params [ 1 ] == " promote " ) then
add_mod ( params [ 2 ] )
elseif ( params [ 1 ] == " demote " ) then
remove_mod ( params [ 2 ] )
else
2017-09-02 14:31:01 +02:00
player_print ( " Command failed. Usage: /mod <promote, demote>, <player> " )
2017-07-09 15:20:01 +02:00
end
end
2017-07-18 22:53:53 +02:00
local function afk ( )
for _ , v in pairs ( game.players ) do
if v.afk_time > 300 then
local time = " "
if v.afk_time > 21600 then
2017-09-02 14:31:01 +02:00
time = time .. math.floor ( v.afk_time / 216000 ) .. " hours "
2017-07-18 22:53:53 +02:00
end
if v.afk_time > 3600 then
2017-07-18 23:24:09 +02:00
time = time .. math.floor ( v.afk_time / 3600 ) % 60 .. " minutes and "
2017-07-18 22:53:53 +02:00
end
2017-07-18 23:24:09 +02:00
time = time .. math.floor ( v.afk_time / 60 ) % 60 .. " seconds. "
2017-09-02 14:31:01 +02:00
player_print ( v.name .. " has been afk for " .. time )
2017-07-18 22:53:53 +02:00
end
end
end
2017-07-21 01:29:49 +02:00
local function tag ( cmd )
2017-09-02 14:31:01 +02:00
if game.player and not game.player . admin then
2017-07-21 01:29:49 +02:00
cant_run ( cmd.name )
return
end
2017-07-30 23:08:44 +02:00
if cmd.parameter ~= nil then
local params = { }
2017-10-05 23:19:53 +02:00
for param in string.gmatch ( cmd.parameter , " %S+ " ) do table.insert ( params , param ) end
2017-08-28 01:17:07 +02:00
if # params < 2 then
2017-09-02 14:31:01 +02:00
player_print ( " Usage: <player> <tag> Sets a players tag. " )
2017-07-30 23:08:44 +02:00
elseif game.players [ params [ 1 ] ] == nil then
2017-09-02 14:31:01 +02:00
player_print ( " Player does not exist. " )
2017-07-30 23:08:44 +02:00
else
2017-08-28 01:17:07 +02:00
local tag = string.sub ( cmd.parameter , params [ 1 ] : len ( ) + 2 )
game.players [ params [ 1 ] ] . tag = " [ " .. tag .. " ] "
game.print ( params [ 1 ] .. " joined [ " .. tag .. " ]. " )
2017-07-30 23:08:44 +02:00
end
2017-07-21 01:29:49 +02:00
else
2017-09-02 14:31:01 +02:00
player_print ( ' Usage: /tag <player> <tag> Sets a players tag. ' )
2017-07-21 01:29:49 +02:00
end
end
2017-07-25 01:20:59 +02:00
local function follow ( cmd )
2017-09-02 14:31:01 +02:00
if not game.player then
log ( " <Server can't do that. " )
return
end
2017-07-25 01:20:59 +02:00
if cmd.parameter ~= nil and game.players [ cmd.parameter ] ~= nil then
global.follows [ game.player . name ] = cmd.parameter
global.follows . n_entries = global.follows . n_entries + 1
2017-07-27 11:18:40 +02:00
else
2017-09-02 14:31:01 +02:00
player_print ( " Usage: /follow <player> makes you follow the player. Use /unfollow to stop following a player. " )
2017-07-25 01:20:59 +02:00
end
end
local function unfollow ( cmd )
2017-09-02 14:31:01 +02:00
if not game.player then
log ( " <Server can't do that. " )
return
end
2017-07-25 01:20:59 +02:00
if global.follows [ game.player . name ] ~= nil then
global.follows [ game.player . name ] = nil
global.follows . n_entries = global.follows . n_entries - 1
end
end
2017-07-21 01:29:49 +02:00
2017-08-19 07:41:58 +02:00
global.tp_players = { }
2017-08-18 03:04:29 +02:00
local function built_entity ( event )
2017-08-28 01:17:07 +02:00
local index = event.player_index
2017-08-18 03:04:29 +02:00
2017-08-19 07:41:58 +02:00
if global.tp_players [ index ] then
2017-08-18 03:04:29 +02:00
local entity = event.created_entity
if entity.type ~= " entity-ghost " then return end
2017-09-02 14:31:01 +02:00
2017-08-18 03:04:29 +02:00
game.players [ index ] . teleport ( entity.position )
entity.destroy ( )
end
end
2017-09-03 12:29:19 +02:00
Event.register ( defines.events . on_built_entity , built_entity )
2017-08-19 07:41:58 +02:00
2017-08-26 13:32:49 +02:00
local function toggle_tp_mode ( cmd )
2017-09-02 14:31:01 +02:00
if not game.player or not ( game.player . admin or is_mod ( game.player . name ) ) then
cant_run ( cmd.name )
return
2017-08-18 03:04:29 +02:00
end
local index = game.player . index
2017-08-19 07:41:58 +02:00
local toggled = global.tp_players [ index ]
2017-08-18 03:04:29 +02:00
if toggled then
2017-08-19 07:41:58 +02:00
global.tp_players [ index ] = nil
2017-09-02 14:31:01 +02:00
player_print ( " tp mode is now off " )
2017-08-18 03:04:29 +02:00
else
2017-08-19 07:41:58 +02:00
global.tp_players [ index ] = true
2017-09-02 14:31:01 +02:00
player_print ( " tp mode is now on - place a ghost entity to teleport there. " )
2017-08-18 03:04:29 +02:00
end
end
2017-09-24 21:09:25 +02:00
global.old_force = { }
2017-09-30 18:11:01 +02:00
global.force_toggle_init = true
2017-09-28 01:07:17 +02:00
local function forcetoggle ( cmd )
2017-11-20 18:17:21 +02:00
if not game.player or not ( game.player . admin or is_mod ( game.player . name ) ) then
cant_run ( cmd.name )
return
end
if global.force_toggle_init then
game.forces . enemy.research_all_technologies ( ) --avoids losing logstics slot configuration
global.force_toggle_init = false
end
-- save the logistics slots
local slots = { }
local slot_counts = game.player . character.request_slot_count
if game.player . character.request_slot_count > 0 then
for i = 1 , slot_counts do
slot = game.player . character.get_request_slot ( i )
if slot ~= nil then
table.insert ( slots , slot )
end
end
end
2017-10-05 23:19:53 +02:00
2017-11-20 18:17:21 +02:00
if game.player . force.name == " enemy " then
local old_force = global.old_force [ game.player . name ]
if not old_force then
game.player . force = " player "
game.player . print ( " You're are now on the player force. " )
2017-09-24 21:09:25 +02:00
else
2017-11-20 18:17:21 +02:00
if game.forces [ old_force ] then
game.player . force = old_force
else
game.player . force = " player "
end
2017-09-24 21:09:25 +02:00
end
2017-11-20 18:17:21 +02:00
else
2017-09-30 18:11:01 +02:00
--Put roboports into inventory
2017-11-20 18:17:21 +02:00
inv = game.player . get_inventory ( defines.inventory . player_armor )
if inv [ 1 ] . valid_for_read
2017-10-05 23:19:53 +02:00
then
2017-11-20 18:17:21 +02:00
local name = inv [ 1 ] . name
if name : match ( " power " ) or name : match ( " modular " ) then
local equips = inv [ 1 ] . grid.equipment
for _ , equip in pairs ( equips ) do
if equip.name == " personal-roboport-equipment "
or equip.name == " personal-roboport-mk2-equipment "
or equip.name == " personal-laser-defense-equipment " then
if game.player . insert { name = equip.name } == 0 then
game.player . surface.spill_item_stack ( game.player . position , { name = equip.name } )
end
inv [ 1 ] . grid.take ( equip )
end
2017-09-30 18:40:06 +02:00
end
2017-11-20 18:17:21 +02:00
end
2017-10-05 23:19:53 +02:00
end
2017-11-20 18:17:21 +02:00
global.old_force [ game.player . name ] = game.player . force.name
game.player . force = " enemy "
end
game.player . print ( " You are now on the " .. game.player . force.name .. " force. " )
-- Attempt to rebuild the request slots
slot_counts = game.player . character.request_slot_count
if game.player . character.request_slot_count > 0 then
for _ , slot in ipairs ( slots ) do
game.player . character.set_request_slot ( slot , _ )
end
end
2017-09-24 21:09:25 +02:00
end
2017-10-15 15:57:25 +02:00
local function get_group ( )
2017-10-06 00:43:30 +02:00
local group = game.permissions . get_group ( " Banned " )
2017-10-15 15:57:25 +02:00
if not group then
game.permissions . create_group ( " Banned " )
group = game.permissions . get_group ( " Banned " )
2017-10-21 23:55:07 +02:00
if group then
for i = 2 , 174 do
group.set_allows_action ( i , false )
end
2017-10-26 10:55:02 +02:00
else
2017-10-21 23:58:35 +02:00
game.print ( " This would have nearly crashed the server, please consult the next best scenario dev (valansch or TWLtriston). " )
2017-10-15 15:57:25 +02:00
end
2017-10-06 00:43:30 +02:00
end
2017-10-15 15:57:25 +02:00
return group
2017-10-06 00:43:30 +02:00
end
local function tempban ( cmd )
2017-10-22 13:25:51 +02:00
if ( not game.player ) or not ( game.player . admin or is_mod ( game.player . name ) ) then
2017-10-06 00:43:30 +02:00
cant_run ( cmd.name )
return
end
if cmd.parameter == nil then
2017-10-22 13:25:51 +02:00
player_print ( " Tempban failed. Usage: /tempban <player> <minutes> Temporarily bans a player. " )
2017-10-06 00:43:30 +02:00
return
end
local params = { }
for param in string.gmatch ( cmd.parameter , " %S+ " ) do table.insert ( params , param ) end
if # params < 2 or not tonumber ( params [ 2 ] ) then
2017-10-22 13:25:51 +02:00
player_print ( " Tempban failed. Usage: /tempban <player> <minutes> Temporarily bans a player. " )
2017-10-06 00:43:30 +02:00
return
end
if not game.players [ params [ 1 ] ] then
2017-10-22 13:25:51 +02:00
player_print ( " Player doesn't exist. " )
2017-10-06 00:43:30 +02:00
return
end
2017-10-15 15:57:25 +02:00
local group = get_group ( )
2017-10-06 00:43:30 +02:00
game.print ( get_actor ( ) .. " put " .. params [ 1 ] .. " in timeout for " .. params [ 2 ] .. " minutes. " )
2017-10-21 23:55:07 +02:00
if group then
group.add_player ( params [ 1 ] )
if not tonumber ( cmd.parameter ) then
Thread.set_timeout (
60 * tonumber ( params [ 2 ] ) ,
function ( param )
game.print ( param.name .. " is out of timeout. " )
game.permissions . get_group ( " Default " ) . add_player ( param.name )
end ,
{ name = params [ 1 ] }
)
end
2017-10-06 00:43:30 +02:00
end
end
2017-11-12 16:49:28 +02:00
function custom_commands_replace_ghosts ( param )
for _ , ghost in pairs ( param.ghosts ) do
local new_ghost = game.surfaces [ param.surface_index ] . create_entity { name = " entity-ghost " , position = ghost.position , inner_name = ghost.ghost_name , expires = false , force = " enemy " , direction = ghost.direction }
new_ghost.last_user = ghost.last_user
end
end
local function spyshot ( cmd )
2017-11-12 20:43:51 +02:00
if not cmd then return 0 end
2017-11-12 16:49:28 +02:00
local player_name = cmd.parameter
if player_name and game.players [ player_name ] then
for _ , spy in pairs ( global.spys ) do
if game.players [ spy ] and game.players [ spy ] . connected then
local pos = game.players [ player_name ] . position
pseudo_ghosts = { }
for _ , ghost in pairs ( game.players [ player_name ] . surface.find_entities_filtered { area = { { pos.x - 60 , pos.y - 35 } , { pos.x + 60 , pos.y + 35 } } , name = " entity-ghost " , force = enemy } ) do
local pseudo_ghost = { position = ghost.position , ghost_name = ghost.ghost_name , expires = false , force = " enemy " , direction = ghost.direction , last_user = ghost.last_user }
table.insert ( pseudo_ghosts , pseudo_ghost )
ghost.destroy ( )
end
2017-11-12 20:37:02 +02:00
game.take_screenshot { by_player = spy , position = pos , show_gui = false , show_entity_info = true , resolution = { 1920 , 1080 } , anti_alias = true , zoom = 0.5 , path = " spyshot.png " }
2017-11-12 16:49:28 +02:00
game.players [ spy ] . print ( " You just took a screenshot! " )
Thread.set_timeout ( 2 , custom_commands_replace_ghosts , { ghosts = pseudo_ghosts , surface_index = game.players [ player_name ] . surface.index } ) --delay replacements for the screenshot to render
return
end
end
player_print ( " No spy online! " )
end
end
2017-11-12 20:43:51 +02:00
local function zoom ( cmd )
if game.player and cmd and cmd.parameter and tonumber ( cmd.parameter ) then
game.player . zoom = tonumber ( cmd.parameter )
end
end
2017-07-08 20:58:45 +02:00
commands.add_command ( " kill " , " Will kill you. " , kill )
2017-07-09 15:20:01 +02:00
commands.add_command ( " tpplayer " , " <player> - Teleports you to the player. (Admins and moderators) " , teleport_player )
commands.add_command ( " invoke " , " <player> - Teleports the player to you. (Admins and moderators) " , invoke )
commands.add_command ( " tppos " , " Teleports you to a selected entity. (Admins only) " , teleport_location )
2017-07-23 14:51:20 +02:00
commands.add_command ( " walkabout " , ' <player> <"close", "far", "very far", number> <duration> - Send someone on a walk. (Admins and moderators) ' , walkabout )
2017-07-19 11:54:46 +02:00
commands.add_command ( " market " , ' Places a fish market near you. (Admins only) ' , spawn_market )
2017-07-09 15:20:01 +02:00
commands.add_command ( " regulars " , ' Prints a list of game regulars. ' , print_regulars )
commands.add_command ( " regular " , ' <promote, demote>, <player> Change regular status of a player. (Admins and moderators) ' , regular )
commands.add_command ( " mods " , ' Prints a list of game mods. ' , print_mods )
commands.add_command ( " mod " , ' <promote, demote>, <player> Changes moderator status of a player. (Admins only) ' , mod )
2017-09-02 14:31:01 +02:00
commands.add_command ( " afk " , ' Shows how long players have been afk. ' , afk )
2017-07-21 01:29:49 +02:00
commands.add_command ( " tag " , ' <player> <tag> Sets a players tag. (Admins only) ' , tag )
2017-07-27 11:10:29 +02:00
commands.add_command ( " follow " , ' <player> makes you follow the player. Use /unfollow to stop following a player. ' , follow )
2017-07-25 01:20:59 +02:00
commands.add_command ( " unfollow " , ' stops following a player. ' , unfollow )
2017-09-02 15:42:37 +02:00
commands.add_command ( " well " , ' <item> <items per second> Spawns an item well. (Admins only) ' , well_command )
2017-08-18 03:04:29 +02:00
commands.add_command ( " tpmode " , " Toggles tp mode. When on place a ghost entity to teleport there (Admins and moderators) " , toggle_tp_mode )
2017-09-24 21:09:25 +02:00
commands.add_command ( " forcetoggle " , " Toggles the players force between player and enemy (Admins and moderators) " , forcetoggle )
2017-10-06 00:43:30 +02:00
commands.add_command ( " tempban " , " <player> <minutes> Temporarily bans a player (Admins and moderators) " , tempban )
2017-11-12 20:43:51 +02:00
commands.add_command ( " spyshot " , " <player> Sends a screenshot of player to discord. (If a host is online. If no host is online, you can become one yourself. Ask on discord :)) " , spyshot )
commands.add_command ( " zoom " , " <number> Sets your zoom. " , zoom )