Skip to content

Commit 074683d

Browse files
committed
feat: extract kit bootstrappers
1 parent d85b242 commit 074683d

9 files changed

Lines changed: 194 additions & 1 deletion

File tree

rokit.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ asphalt = "jacktabscode/asphalt@1.2.0"
1212
blink = "1axen/blink@0.18.6"
1313
darklua = "seaofvoices/darklua@0.18.0"
1414
pesde = "pesde-pkg/pesde@0.7.3+registry.0.2.3"
15-
rojo = "rojo-rbx/rojo@7.6.1"
15+
rojo = "rojo-rbx/rojo@7.7.0-rc.1"

src/kit/client/.gitkeep

Whitespace-only changes.

src/kit/client/main.client.luau

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
local ReplicatedStorage = game:GetService("ReplicatedStorage")
2+
3+
local framework = require("@core/shared/framework")
4+
5+
framework.useModulesFromPath(ReplicatedStorage, "Core", "Client", "providers")
6+
framework.useModulesFromPath(ReplicatedStorage, "Core", "Shared", "providers")
7+
framework.useModulesFromPath(ReplicatedStorage, "Kit", "Client", "providers")
8+
framework.useModulesFromPath(ReplicatedStorage, "Kit", "Shared", "providers")
9+
10+
-- initialize net modules
11+
require("@core/client/generated/net")
12+
require("@kit/client/generated/net")
13+
14+
local root = framework.root:start()
15+
game.Close:Once(function()
16+
root:finish()
17+
end)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
local ReplicatedStorage = game:GetService("ReplicatedStorage")
2+
3+
local Level = require("@libs/Level")
4+
local Life = require("@libs/memory/Life")
5+
local Log = require("@libs/Log")
6+
local audios = require("@core/shared/generated/audios")
7+
local character = require("@libs/character")
8+
local net = require("@kit/client/generated/net")
9+
local prvd = require("@core/shared/prvdmwrong/prvdmwrong")
10+
local sounds = require("@libs/sounds")
11+
12+
local KitClientProvider = {}
13+
export type KitClientProvider = typeof(KitClientProvider)
14+
KitClientProvider.log = Log.new(KitClientProvider)
15+
16+
function KitClientProvider.constructor(self: KitClientProvider)
17+
self.life = Life.new()
18+
Level.baseScripts:tryInstances(ReplicatedStorage.Scripts.Core:GetDescendants())
19+
end
20+
21+
function KitClientProvider.onStart(self: KitClientProvider)
22+
if not game:IsLoaded() then
23+
self.log:trace("Waiting for game to finish loading")
24+
game.Loaded:Wait()
25+
end
26+
27+
sounds.useAssets(audios :: any)
28+
self.log:trace("Loaded audios from assets:", sounds.assetPaths)
29+
task.spawn(sounds.preloadAssets)
30+
31+
local tower = net.getTower.invoke():expect()
32+
33+
local existingMechanics = tower:FindFirstChild("Mechanic")
34+
if existingMechanics then
35+
self.log:trace("Removing existing mechanics")
36+
existingMechanics:Destroy()
37+
end
38+
39+
local mechanics = net.loadMechanics.invoke():expect()
40+
mechanics:Clone().Parent = tower
41+
mechanics:Destroy()
42+
43+
local levelResult = Level.new(self.life, tower.Name, tower)
44+
levelResult:match({
45+
Ok = function(level: Level.Level)
46+
self.log:trace("Starting kit...")
47+
character.getCharacter():PivotTo(level.instance.SpawnCharacter.CFrame)
48+
level:start()
49+
self.log:info("Kit has started!")
50+
end,
51+
Err = function(e)
52+
if e.id == "invalidInstance" then
53+
self.log:error("Invalid kit instance client-side:", e.cause:formatErr())
54+
end
55+
self.log:error("Unknown error while initializing kit:", e)
56+
end,
57+
} :: any)
58+
end
59+
60+
function KitClientProvider.onFinish(self: KitClientProvider)
61+
self.log:trace("Cleaning up!")
62+
self.life:destroy()
63+
end
64+
65+
return prvd(KitClientProvider)

src/kit/scripts/.gitkeep

Whitespace-only changes.

src/kit/server/.gitkeep

Whitespace-only changes.

src/kit/server/main.server.luau

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
local ReplicatedStorage = game:GetService("ReplicatedStorage")
2+
3+
local framework = require("@core/shared/framework")
4+
5+
framework.useModulesFromPath(ReplicatedStorage, "Core", "Client", "providers")
6+
framework.useModulesFromPath(ReplicatedStorage, "Core", "Shared", "providers")
7+
framework.useModulesFromPath(ReplicatedStorage, "Kit", "Client", "providers")
8+
framework.useModulesFromPath(ReplicatedStorage, "Kit", "Shared", "providers")
9+
10+
-- initialize net modules
11+
require("@core/server/generated/net")
12+
require("@kit/server/generated/net")
13+
14+
local root = framework.root:start()
15+
game.Close:Once(function()
16+
root:finish()
17+
end)
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
local CollectionService = game:GetService("CollectionService")
2+
local ServerStorage = game:GetService("ServerStorage")
3+
local StarterGui = game:GetService("StarterGui")
4+
local StarterPlayer = game:GetService("StarterPlayer")
5+
local TeleportService = game:GetService("TeleportService")
6+
local Workspace = game:GetService("Workspace")
7+
8+
local Level = require("@libs/Level")
9+
local Log = require("@libs/Log")
10+
local PlayerInstanceLoader = require("@core/server/PlayerInstanceLoader")
11+
local net = require("@core/server/generated/net")
12+
local prvd = require("@core/shared/prvdmwrong/prvdmwrong")
13+
14+
local TOWER_FALLBACK_TAG = "Welcome To Hell Kit Tower"
15+
16+
local NO_TOWER_ERROR = `\
17+
No tower found, make sure you have a "Kit" tower under \
18+
the Workspace, or tag your tower with the "{TOWER_FALLBACK_TAG}" tag.\
19+
`
20+
21+
local DEFAULTS: { [Instance]: { [string]: unknown } } = {
22+
[StarterGui] = { ScreenOrientation = Enum.ScreenOrientation.LandscapeSensor },
23+
[StarterPlayer] = { AutoJumpEnabled = false, CharacterUseJumpPower = true },
24+
}
25+
26+
local KitServerProvider = {}
27+
export type KitServerProvider = typeof(KitServerProvider)
28+
KitServerProvider.log = Log.new(KitServerProvider)
29+
KitServerProvider.decorationsLoader = PlayerInstanceLoader.new(15)
30+
KitServerProvider.mechanicLoader = PlayerInstanceLoader.new(15)
31+
32+
local function getTower(): Instance?
33+
return Workspace:FindFirstChild("Kit") or CollectionService:GetTagged(TOWER_FALLBACK_TAG)[1]
34+
end
35+
36+
local function storeOrDefault(fromParent: Instance, childName: string): Instance
37+
local child = fromParent:FindFirstChild(childName) :: Instance
38+
if not child then
39+
child = Instance.new("Folder")
40+
child.Name = childName
41+
end
42+
child.Parent = ServerStorage
43+
return child
44+
end
45+
46+
function KitServerProvider.bootstrapTower(self: KitServerProvider, tower: Level.LevelInstance)
47+
local mechanics, decorations = storeOrDefault(tower, "Mechanics"), storeOrDefault(tower, "Decorations")
48+
49+
net.getTower.on(function(): Instance
50+
return tower
51+
end)
52+
53+
net.loadMechanics.on(function(player: Player): Instance
54+
return self.mechanicLoader:cloneToPlayer(player, mechanics)
55+
end)
56+
57+
net.loadDecorations.on(function(player: Player): Instance
58+
return self.decorationsLoader:cloneToPlayer(player, decorations)
59+
end)
60+
61+
net.rejoin.on(function(player)
62+
TeleportService:TeleportToPlaceInstance(game.PlaceId, game.JobId, player)
63+
end)
64+
end
65+
66+
function KitServerProvider.onStart(self: KitServerProvider)
67+
for instance, defaults in DEFAULTS do
68+
for property, expectedValue in defaults do
69+
local realValue = (instance :: any)[property]
70+
if realValue ~= expectedValue then
71+
self.log:warn(`To align with Welcome To Hell, {instance}.{property} has been set to {realValue}.`);
72+
(instance :: any)[property] = expectedValue
73+
end
74+
end
75+
end
76+
77+
local tower = getTower()
78+
79+
if tower then
80+
local isValid, invalidCause = Level.LevelInstance:matches(tower)
81+
82+
if isValid then
83+
self:bootstrapTower(tower :: Level.LevelInstance)
84+
return
85+
end
86+
87+
self.log:error("Got invalid tower", tower:GetFullName(), "because:", invalidCause:formatErr())
88+
return
89+
end
90+
91+
self.log:error(NO_TOWER_ERROR)
92+
end
93+
94+
return prvd(KitServerProvider)

0 commit comments

Comments
 (0)