mirror of
https://github.com/Refactorio/RedMew.git
synced 2025-03-27 21:48:52 +02:00
Minor changes to player_create
Allowing cutscenes to run before welcoming players via info gui and console messages. Also includes a search limit for walls and rock to prevent the cutscene from running too far away from {0, 0}
This commit is contained in:
parent
003cd6c801
commit
85fc38fd3a
@ -170,6 +170,7 @@ global.config = {
|
||||
'Welcome to this map created by the RedMew team. You can join our discord at: redmew.com/discord',
|
||||
'Click the question mark in the top left corner for server information and map details.'
|
||||
},
|
||||
cutscene = false,
|
||||
-- format is a table: {{message, weight}, {message, weight}}, where a higher weight has more chance to be shown
|
||||
random_join_message_set = require 'resources.join_messages',
|
||||
-- applied when cheat_mode is set to true
|
||||
|
@ -35,37 +35,47 @@ local function assert_type(expected_type, given, variable_reference_message)
|
||||
end
|
||||
end
|
||||
|
||||
function Public.register_cutscene_function(identifier, waypoints, func)
|
||||
function Public.register_cutscene_function(identifier, waypoints, func, terminate_func)
|
||||
assert_type('string', identifier, 'identifier of function cutscene_controller.register_cutscene_function')
|
||||
assert_type('number', func, 'func of function cutscene_controller.register_cutscene_function')
|
||||
assert_type('table', waypoints, 'waypoints of function cutscene_controller.register_cutscene_function')
|
||||
|
||||
cutscene_functions[identifier] = {func = func, waypoints = waypoints, update = false}
|
||||
cutscene_functions[identifier] = {func = func, waypoints = waypoints, update = false, terminate_func = terminate_func}
|
||||
end
|
||||
|
||||
function Public.register_running_cutscene(player_index, identifier, final_transition_time)
|
||||
assert_type('number', player_index, 'player_index of function cutscene_controller.register_running_cutscene')
|
||||
assert_type('string', identifier, 'identifier of function cutscene_controller.register_running_cutscene')
|
||||
|
||||
running_cutscenes[player_index] = cutscene_functions[identifier]
|
||||
local player = game.get_player(player_index)
|
||||
if not valid(player) then
|
||||
return
|
||||
end
|
||||
if player.controller_type == defines.controllers.cutscene then
|
||||
player.exit_cutscene()
|
||||
end
|
||||
running_cutscenes[player_index].character = player.character
|
||||
player.set_controller {type = defines.controllers.ghost}
|
||||
|
||||
local cutscene_function = cutscene_functions[identifier]
|
||||
if not cutscene_function then
|
||||
return
|
||||
end
|
||||
|
||||
local waypoints = cutscene_function.waypoints
|
||||
if not waypoints then
|
||||
return
|
||||
end
|
||||
|
||||
running_cutscenes[player_index] = {
|
||||
func = cutscene_function.func,
|
||||
waypoints = waypoints,
|
||||
update = cutscene_function.update,
|
||||
final_transition_time = final_transition_time,
|
||||
character = player.character,
|
||||
terminate_func = cutscene_function.terminate_func,
|
||||
rendering = {}
|
||||
}
|
||||
if player.controller_type == defines.controllers.cutscene then
|
||||
player.exit_cutscene()
|
||||
end
|
||||
player.set_controller {type = defines.controllers.ghost}
|
||||
|
||||
final_transition_time = final_transition_time >= 0 and final_transition_time or 60
|
||||
running_cutscenes[player_index].final_transition_time = final_transition_time
|
||||
running_cutscenes[player_index].identifier = identifier
|
||||
@ -101,7 +111,9 @@ local function restart_cutscene(player_index, waypoints, start_index)
|
||||
waypoints = waypoints,
|
||||
update = false,
|
||||
final_transition_time = final_transition_time,
|
||||
character = character
|
||||
character = character,
|
||||
terminate_func = current_running.terminate_func,
|
||||
rendering = current_running.rendering
|
||||
}
|
||||
|
||||
local player = game.get_player(player_index)
|
||||
@ -165,11 +177,25 @@ local callback_function =
|
||||
local reconnect_character =
|
||||
Token.register(
|
||||
function(params)
|
||||
local player = game.get_player(params.player_index)
|
||||
local player_index = params.player_index
|
||||
local player = game.get_player(player_index)
|
||||
local character = params.character
|
||||
local func = params.func
|
||||
if valid(player) and valid(character) then
|
||||
player.exit_cutscene()
|
||||
player.set_controller {type = defines.controllers.character, character = character}
|
||||
if func then
|
||||
Token.get(func)(player_index)
|
||||
end
|
||||
--game.print(serpent.block(params.rendering))
|
||||
for _, v in pairs(params.rendering) do
|
||||
--game.print('before valid: ' .. v)
|
||||
if rendering.is_valid(v) then
|
||||
--game.print('after valid: ' .. v)
|
||||
rendering.destroy(v)
|
||||
end
|
||||
end
|
||||
running_cutscenes[player_index] = nil
|
||||
end
|
||||
end
|
||||
)
|
||||
@ -187,11 +213,32 @@ function Public.terminate_cutscene(player_index, ticks)
|
||||
reconnect_character,
|
||||
{
|
||||
player_index = player_index,
|
||||
character = running_cutscene.character
|
||||
character = running_cutscene.character,
|
||||
func = running_cutscene.terminate_func,
|
||||
rendering = running_cutscene.rendering
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
function Public.register_rendering_id(player_index, render_id)
|
||||
if type(render_id) ~= 'table' then
|
||||
render_id = {render_id}
|
||||
end
|
||||
local running_cutscene = running_cutscenes[player_index]
|
||||
for _, id in pairs(render_id) do
|
||||
--game.print('before valid: ' .. id)
|
||||
if rendering.is_valid(id) then
|
||||
--game.print('after valid: ' .. id)
|
||||
if not running_cutscene then
|
||||
--game.print('Error adding rendering id! ' .. id)
|
||||
rendering.destroy(id)
|
||||
else
|
||||
table.insert(running_cutscenes[player_index].rendering, id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
handler = function(event)
|
||||
local player_index = event.player_index
|
||||
local waypoint_index = event.waypoint_index
|
||||
|
@ -71,7 +71,7 @@ function Public.draw_text(original_resolution, original_zoom, player_zoom, offse
|
||||
local oiam = params.only_in_alt_mode
|
||||
oiam = oiam or false
|
||||
|
||||
rendering.draw_text {
|
||||
return rendering.draw_text {
|
||||
text = {'', text},
|
||||
color = color,
|
||||
target = target,
|
||||
@ -91,6 +91,7 @@ function Public.draw_text(original_resolution, original_zoom, player_zoom, offse
|
||||
end
|
||||
|
||||
function Public.draw_multi_line_text(original_resolution, original_zoom, player_zoom, offset, texts, scale, player, params, draw_background)
|
||||
local ids = {}
|
||||
local height_scalar = player.display_resolution.height / original_resolution.height
|
||||
local size = (0.0065 * player.display_resolution.height * scale) / (player_zoom * 32)
|
||||
local tile_scalar = (original_zoom * 32) / (player_zoom * 32)
|
||||
@ -100,14 +101,15 @@ function Public.draw_multi_line_text(original_resolution, original_zoom, player_
|
||||
local right_bottom = {x = 40, y = ((size * 1.5) / tile_scalar / height_scalar) * #texts}
|
||||
local background_params = params.background
|
||||
background_params = background_params or params
|
||||
Public.draw_rectangle(original_resolution, original_zoom, player_zoom, offset, left_top, right_bottom, player, background_params)
|
||||
table.insert(ids, Public.draw_rectangle(original_resolution, original_zoom, player_zoom, offset, left_top, right_bottom, player, background_params))
|
||||
draw_background = false
|
||||
end
|
||||
|
||||
for i = 1, #texts do
|
||||
Public.draw_text(original_resolution, original_zoom, player_zoom, offset, texts[i], scale, player, params, draw_background)
|
||||
table.insert(ids, Public.draw_text(original_resolution, original_zoom, player_zoom, offset, texts[i], scale, player, params, draw_background))
|
||||
offset.y = offset.y + (size * 1.5) / tile_scalar / height_scalar
|
||||
end
|
||||
return ids
|
||||
end
|
||||
|
||||
function Public.draw_rectangle(original_resolution, original_zoom, player_zoom, offset, left_top, right_bottom, player, params)
|
||||
@ -163,7 +165,7 @@ function Public.draw_rectangle(original_resolution, original_zoom, player_zoom,
|
||||
local oiam = params.only_in_alt_mode
|
||||
oiam = oiam or false
|
||||
|
||||
rendering.draw_rectangle {
|
||||
return rendering.draw_rectangle {
|
||||
color = color,
|
||||
width = width,
|
||||
filled = filled,
|
||||
@ -182,7 +184,7 @@ end
|
||||
function Public.blackout(player, zoom, ttl, color)
|
||||
local left_top = {x = -40, y = -22.5}
|
||||
local right_bottom = {x = 40, y = 22.5}
|
||||
Public.draw_rectangle({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 0}, left_top, right_bottom, player, {color = color, time_to_live = ttl})
|
||||
return Public.draw_rectangle({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 0}, left_top, right_bottom, player, {color = color, time_to_live = ttl})
|
||||
end
|
||||
|
||||
return Public
|
||||
|
@ -6,25 +6,10 @@ local pairs = pairs
|
||||
|
||||
local get_random_weighted = table.get_random_weighted
|
||||
|
||||
local function player_created(event)
|
||||
local Public = {}
|
||||
|
||||
function Public.show_start_up(player)
|
||||
local config = global.config.player_create
|
||||
local player = game.get_player(event.player_index)
|
||||
|
||||
if not player or not player.valid then
|
||||
return
|
||||
end
|
||||
|
||||
-- ensure the top menu is correctly styled
|
||||
local gui = player.gui
|
||||
gui.top.style = 'slot_table_spacing_horizontal_flow'
|
||||
gui.left.style = 'slot_table_spacing_vertical_flow'
|
||||
|
||||
local player_insert = player.insert
|
||||
|
||||
for _, item in pairs(config.starting_items) do
|
||||
player_insert(item)
|
||||
end
|
||||
|
||||
local p = player.print
|
||||
for _, message in pairs(config.join_messages) do
|
||||
p(message)
|
||||
@ -48,12 +33,29 @@ local function player_created(event)
|
||||
elseif not _DEBUG and not game.is_multiplayer() then
|
||||
player.print('To change your name in single-player, open chat and type the following /c game.player.name = "your_name"')
|
||||
end
|
||||
end
|
||||
|
||||
-- Remove 2019-03-04
|
||||
if player.admin then
|
||||
player.print('## - Regular commands have changed. /regular <player_name> to promote /regular-remove <player_name> to demote.')
|
||||
local function player_created(event)
|
||||
local config = global.config.player_create
|
||||
local player = game.get_player(event.player_index)
|
||||
|
||||
if not player or not player.valid then
|
||||
return
|
||||
end
|
||||
|
||||
-- ensure the top menu is correctly styled
|
||||
local gui = player.gui
|
||||
gui.top.style = 'slot_table_spacing_horizontal_flow'
|
||||
gui.left.style = 'slot_table_spacing_vertical_flow'
|
||||
|
||||
local player_insert = player.insert
|
||||
|
||||
for _, item in pairs(config.starting_items) do
|
||||
player_insert(item)
|
||||
end
|
||||
if not config.cutscene then
|
||||
Public.show_start_up(player)
|
||||
end
|
||||
--End remove
|
||||
end
|
||||
|
||||
Event.add(defines.events.on_player_created, player_created)
|
||||
@ -125,3 +127,5 @@ if _CHEATS then
|
||||
|
||||
Event.add(defines.events.on_player_created, player_created_cheat_mode)
|
||||
end
|
||||
|
||||
return Public
|
||||
|
@ -18,10 +18,6 @@ local Config = {
|
||||
night_time = {
|
||||
enabled = true -- true = No Daylight, false = Day/night circle (Solar panels work)
|
||||
},
|
||||
-- controls the introduction cutscene
|
||||
cutscene = {
|
||||
enabled = true
|
||||
},
|
||||
-- controls setting up the players
|
||||
setup_player = {
|
||||
enabled = true,
|
||||
@ -53,6 +49,10 @@ local Config = {
|
||||
starting_items = {}
|
||||
}
|
||||
},
|
||||
-- controls the introduction cutscene
|
||||
cutscene = {
|
||||
enabled = true
|
||||
},
|
||||
-- core feature
|
||||
diggy_hole = {
|
||||
enabled = true,
|
||||
|
@ -5,28 +5,63 @@ local Cutscene = require 'features.cutscene.cutscene_controller'
|
||||
local Rendering = require 'features.cutscene.renderings'
|
||||
local RS = require 'map_gen.shared.redmew_surface'
|
||||
local Color = require 'resources.color_presets'
|
||||
local PC = require 'features.player_create'
|
||||
local Command = require 'utils.command'
|
||||
|
||||
local DiggyCutscene = {}
|
||||
|
||||
local play_sound_delayed =
|
||||
Token.register(
|
||||
function(params)
|
||||
params.player.play_sound {path = params.path}
|
||||
end
|
||||
)
|
||||
|
||||
local function play_sound(player, path, times, delay, initial_delay)
|
||||
if not game.is_valid_sound_path(path) then
|
||||
return
|
||||
end
|
||||
times = times or 1
|
||||
if times == 1 and not delay and initial_delay then
|
||||
delay = initial_delay
|
||||
end
|
||||
if times > 1 or delay then
|
||||
delay = delay or 20
|
||||
initial_delay = initial_delay or 0
|
||||
for i = 1, times, 1 do
|
||||
Task.set_timeout_in_ticks(initial_delay + delay * i, play_sound_delayed, {player = player, path = path})
|
||||
end
|
||||
else
|
||||
player.play_sound {path = path}
|
||||
end
|
||||
end
|
||||
|
||||
local function cutscene_function(player_index, waypoint_index, params)
|
||||
local cases = {}
|
||||
local player = game.players[player_index]
|
||||
local ttw = params.time_to_wait
|
||||
local zoom = params.zoom
|
||||
--game.print('index: ' .. waypoint_index .. ' | position:' .. serpent.block(params.position) .. ' | trans_time: ' .. params.transition_time .. ' | ttw: ' .. ttw .. ' | zoom: ' .. zoom)
|
||||
|
||||
if waypoint_index ~= -1 or waypoint_index ~= 6 then
|
||||
play_sound(player, 'utility/list_box_click', 1)
|
||||
--play_sound(player, 'utility/inventory_move', 1, 10)
|
||||
end
|
||||
cases[-1] = function()
|
||||
player.clear_console()
|
||||
player.gui.center.clear()
|
||||
Rendering.blackout(player, zoom, ttw + 1)
|
||||
Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = -16}, 'Diggy', 10, player, {time_to_live = ttw, color = Color.yellow}, false)
|
||||
play_sound(player, 'utility/game_won')
|
||||
play_sound(player, 'ambient/first-light', 1, 400)
|
||||
Cutscene.register_rendering_id(player_index, Rendering.blackout(player, zoom, ttw + 1))
|
||||
Cutscene.register_rendering_id(player_index, Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = -16}, 'Diggy', 10, player, {time_to_live = ttw, color = Color.yellow}, false))
|
||||
local multi_params = {time_to_live = ttw}
|
||||
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = -5}, {'Welcome to Diggy', '---------------------', 'This is a custom scenario developed by Redmew', 'Join us at www.redmew.com/discord'}, 5, player, multi_params, multi_params, false)
|
||||
Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 10}, 'The following introduction will help you get started!', 3, player, {time_to_live = ttw}, false)
|
||||
Cutscene.register_rendering_id(
|
||||
player_index,
|
||||
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = -5}, {'Welcome to Diggy', '---------------------', 'This is a custom scenario developed by Redmew', 'Join us at www.redmew.com/discord'}, 5, player, multi_params, multi_params, false)
|
||||
)
|
||||
Cutscene.register_rendering_id(player_index, Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 10}, 'The following introduction will help you get started!', 3, player, {time_to_live = ttw}, false))
|
||||
Cutscene.register_rendering_id(player_index, Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 13}, {'Use the /skip command if you wish to skip this introduction', 'You can always replay this introduction by using the /replay command'}, 1.5, player, {time_to_live = ttw}, {time_to_live = ttw}, false))
|
||||
end
|
||||
cases[0] = function()
|
||||
Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, 'This is the starting area', 2.5, player, {time_to_live = ttw}, true)
|
||||
local entity = RS.get_surface().find_entities_filtered {name = 'stone-wall', limit = 1}
|
||||
Cutscene.register_rendering_id(player_index, Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, 'This is the starting area', 2.5, player, {time_to_live = ttw}, true))
|
||||
local entity = RS.get_surface().find_entities_filtered {position = {0,0}, radius = 20, name = 'stone-wall', limit = 1}
|
||||
if entity[1] then
|
||||
--game.print('Found wall')
|
||||
local position = entity[1].position
|
||||
@ -41,31 +76,53 @@ local function cutscene_function(player_index, waypoint_index, params)
|
||||
end
|
||||
end
|
||||
cases[1] = function()
|
||||
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'Expanding the mine is dangerous!', '', 'Walls are used to keep the cave roof from crushing us'}, 2.5, player, {time_to_live = ttw}, true)
|
||||
play_sound(player, 'utility/build_small')
|
||||
Cutscene.register_rendering_id(player_index, Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'Expanding the mine is dangerous!', '', 'Walls are used to keep the cave roof from crushing us'}, 2.5, player, {time_to_live = ttw}, true))
|
||||
end
|
||||
cases[2] = function()
|
||||
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'The market provides extra supplies', '', 'You unlock new items when you level up'}, 2.5, player, {time_to_live = ttw}, true)
|
||||
Cutscene.register_rendering_id(player_index, Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'The market provides extra supplies', '', 'You unlock new items when you level up'}, 2.5, player, {time_to_live = ttw}, true))
|
||||
end
|
||||
cases[3] = function()
|
||||
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {"Cave ins happens frequently when you don't add supports", '', 'Different types of brick and concrete can reinforce our support pillars!'}, 2.5, player, {time_to_live = ttw}, true)
|
||||
local position = RS.get_surface().find_entities_filtered {name = 'rock-big', limit = 1}[1].position
|
||||
Cutscene.register_rendering_id(
|
||||
player_index,
|
||||
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {"Cave ins happens frequently when you don't add supports", '', 'Different types of brick and concrete can reinforce our support pillars!'}, 2.5, player, {time_to_live = ttw}, true)
|
||||
)
|
||||
local radius = 25
|
||||
local entity
|
||||
repeat
|
||||
entity = RS.get_surface().find_entities_filtered {position = {0,0}, radius = radius, name = 'rock-big', limit = 1}
|
||||
radius = radius + 25
|
||||
until entity[1] or radius >= 200
|
||||
local position = {0, 3.5}
|
||||
local way_zoom = 0.4
|
||||
if entity[1] then
|
||||
position = entity[1].position
|
||||
way_zoom = 5
|
||||
end
|
||||
local waypoint = {
|
||||
-- case 4
|
||||
position = position,
|
||||
transition_time = 120,
|
||||
time_to_wait = 300,
|
||||
zoom = 5
|
||||
zoom = way_zoom
|
||||
}
|
||||
Cutscene.inject_waypoint(player_index, waypoint, 6)
|
||||
end
|
||||
cases[4] = function()
|
||||
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'This world contains brittle rocks', '', 'Our tools are too powerful to preserve any resources from destroying them'}, 2.5, player, {time_to_live = ttw}, true)
|
||||
play_sound(player, 'utility/axe_mining_ore', 3, 35)
|
||||
Cutscene.register_rendering_id(
|
||||
player_index,
|
||||
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'This world contains brittle rocks', '', 'Our tools are too powerful to preserve any resources from destroying them'}, 2.5, player, {time_to_live = ttw}, true)
|
||||
)
|
||||
end
|
||||
cases[5] = function()
|
||||
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'The native population is lurking in the dark', '', 'Be wary when digging, always bring along some defences'}, 2.5, player, {time_to_live = ttw}, true)
|
||||
play_sound(player, 'utility/axe_fighting', 4, 25, 10)
|
||||
play_sound(player, 'worm-sends-biters', 1, 60)
|
||||
Cutscene.register_rendering_id(player_index, Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'The native population is lurking in the dark', '', 'Be wary when digging, always bring along some defences'}, 2.5, player, {time_to_live = ttw}, true))
|
||||
end
|
||||
cases[6] = function()
|
||||
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'This concludes the introduction', '', 'Have fun and keep digging!'}, 2.5, player, {time_to_live = ttw}, true)
|
||||
Cutscene.register_rendering_id(player_index, Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'This concludes the introduction', '', 'Have fun and keep digging!'}, 2.5, player, {time_to_live = ttw}, true))
|
||||
play_sound(player, 'utility/tutorial_notice', 1)
|
||||
end
|
||||
local case = cases[waypoint_index]
|
||||
if case then
|
||||
@ -78,7 +135,7 @@ local waypoints = {
|
||||
-- case -1
|
||||
position = {x = 0, y = 0},
|
||||
transition_time = 60,
|
||||
time_to_wait = 600,
|
||||
time_to_wait = 400,
|
||||
zoom = 0.5
|
||||
},
|
||||
{
|
||||
@ -126,7 +183,11 @@ local waypoints = {
|
||||
}
|
||||
}
|
||||
|
||||
Cutscene.register_cutscene_function('Diggy_Welcome', waypoints, Token.register(cutscene_function))
|
||||
local function terminate_function(player_index)
|
||||
PC.show_start_up(game.get_player(player_index))
|
||||
end
|
||||
|
||||
Cutscene.register_cutscene_function('Diggy_Welcome', waypoints, Token.register(cutscene_function), Token.register(terminate_function))
|
||||
|
||||
local start_cutscene =
|
||||
Token.register(
|
||||
@ -136,6 +197,8 @@ local start_cutscene =
|
||||
)
|
||||
|
||||
function DiggyCutscene.register()
|
||||
global.config.player_create.cutscene = true
|
||||
|
||||
Event.add(
|
||||
defines.events.on_player_created,
|
||||
function(event)
|
||||
@ -144,4 +207,19 @@ function DiggyCutscene.register()
|
||||
)
|
||||
end
|
||||
|
||||
local function replay_handler(_, player)
|
||||
Token.get(start_cutscene)({event = {player_index = player.index}})
|
||||
end
|
||||
|
||||
Command.add(
|
||||
'replay',
|
||||
{
|
||||
description = 'Replays the introduction cutscene',
|
||||
capture_excess_arguments = false,
|
||||
allowed_by_server = false
|
||||
},
|
||||
replay_handler
|
||||
)
|
||||
|
||||
|
||||
return DiggyCutscene
|
||||
|
Loading…
x
Reference in New Issue
Block a user