I programmed this project for someone, a game called Galactic, but it is now discontinued. I was never given credit for my work, and the owner of the game micromanaged the development. The repository is now public for reference and learning.
Repository: https://github.com/Ecliptorhizes/Galactic-Hub
Galactic-Hub is a Roblox multi-place game framework built with Knit, Rojo, and Wally. It features a central Hub where players choose destinations (Coruscant, ILUM) via Quick Play or Select Server, with place-specific loading screens and modular scripts that load only for the current place.
src/
├── client/ # Client-side (StarterPlayerScripts)
│ ├── Client.client.luau # Entry point, loading screen, place-based controller loading
│ └── controllers/
│ ├── HubController.luau # Main menu, Quick Play, Select Server, hover effects
│ ├── IlumController.luau # ILUM place-specific logic (placeholder)
│ ├── CoruscantController.luau # Coruscant place-specific logic (placeholder)
│ └── CombatController.luau # Lightsaber equip/ignite (keybinds 1, Q)
├── server/ # Server-side (ServerScriptService)
│ ├── Server.server.luau # Entry point, place-based service loading
│ └── services/
│ ├── Hub/HubService.luau # Quick Play teleport to Coruscant/ILUM
│ ├── Ilum/IlumService.luau # ILUM place-specific (placeholder)
│ ├── Coruscant/CoruscantService.luau # Coruscant place-specific (placeholder)
│ └── Combat/CombatService.luau # Lightsaber equip/ignite state
└── shared/
└── modules/
├── Hub/Config.luau # GameId, PlaceIds, HubPlaceIds, IlumEnabled, PlaceDisplayNames
└── Combat/Config.luau # Keybinds (1, Q), Animation IDs
The client entry point. Runs on every place (Hub, ILUM, Coruscant).
- Loading screen: Shows
LoadingScreen, hidesMainUi(if present). AnimatesloadingBarfrom 0.001 to 1.003 scale and updatesLoadingNumbertext ("Loading (0/100)" → "Loading (100/100)"). - UI path resolution: Finds
loadingBarandLoadingNumberunderBackground.Dark.HolderorBackground.Dark(supports both Hub and ILUM GUI layouts). - Place detection: Uses
game.PlaceIdandHubConfigto determine if the player is in Hub, ILUM, or Coruscant. - Controller loading: Loads only the controller for the current place:
- Hub → HubController
- ILUM → IlumController (or CombatController fallback)
- Coruscant → CoruscantController (or CombatController fallback)
- Knit.Start(): Starts Knit after controllers are required. Waits for character, then hides loading screen and shows MainUi (if it exists).
Runs only in the Hub place. Handles the main menu.
- Quick Play: Finds map cards (Coruscant, ILUM) and wires up Quick Play buttons. On click, fires
HubService.RequestQuickPlay:Fire(placeKey)to teleport the player. - Hover effects: Uses TweenService to animate
BackgroundTransparencyandTextColor3on mouse enter/leave for Quick Play and Select Server buttons. - Button lookup: Supports
ButtonQuickPlay,Button,ILUM-QUICKPLAY, or first TextButton/ImageButton in the QuickPlay container. - Top bar hiding: Optionally hides UI elements containing "PLANET:", "PLAYERS:", "SELECT SERVER" when
HideTopBarInHubis true in config. - IlumEnabled: Hides the ILUM map card and blocks Quick Play if
HubConfig.IlumEnabledis false.
Runs only in the Hub place. Handles teleportation.
- RequestQuickPlay: Listens for client
RequestQuickPlay:Fire(placeKey). ValidatesplaceKey("Coruscant" or "Ilum"), checksIlumEnabledfor ILUM, then callsTeleportService:TeleportAsync(placeId, { player }). - TeleportFailed: Fires to the client if teleport fails (e.g. Studio, invalid place, config error).
Runs in ILUM and Coruscant (combat places). Handles lightsaber input.
- Keybinds:
1= equip saber,Q= ignite saber (from Combat Config). - Server requests: Fires
CombatService.Server.EquipRequest:Fire()andIgniteRequest:Fire(). - Listeners: Subscribes to
EquipChangedandIgniteChangedto update visuals (animations, blade visibility). Stub implementations forPlayEquipAnimationandUpdateSaberVisual.
Runs in ILUM and Coruscant. Manages lightsaber state.
- Player state: Tracks
{ equipped, ignited }per player. - EquipRequest: Sets
equipped = true, resetsignitedon unequip, broadcastsEquipChangedto all clients. - IgniteRequest: Sets
ignited = true/falseonly if equipped, broadcastsIgniteChangedto all clients.
Placeholder modules for ILUM-specific logic (e.g. crystal gathering). Loaded only when the player is in the ILUM place.
Placeholder modules for Coruscant-specific logic (e.g. Jedi Temple). Loaded only when the player is in the Coruscant place.
Central configuration:
- GameId: 6808056680
- HubPlaceIds: [6808056680, 98619119037493] (main Hub and Studio variant)
- PlaceIds: Hub, Coruscant (94260201585792), Ilum (81500806921573)
- PlaceDisplayNames: Display names for loading screen Location label
- IlumEnabled: Toggles ILUM Quick Play availability
- HideTopBarInHub: Toggles top bar hiding in the Hub
- Keybinds: EquipSaber = One, IgniteSaber = Q
- Animations: Placeholder IDs for equip, unequip, idle holding
The server entry point. Loads services based on place:
- Hub → Hub services
- ILUM → Ilum services (or Combat fallback)
- Coruscant → Coruscant services (or Combat fallback)
- Rojo: Sync this project to Roblox Studio via Rojo.
- Wally: Run
wally installto fetch Knit, Promise, Janitor, Trove. - StarterGui: Each place needs a
LoadingScreenScreenGui withBackground.Dark.Holder.barHolder.loadingBarandLoadingNumber(under Holder or Dark). The Hub also needsMainUiwith map cards and Quick Play/Select Server buttons.
This project is discontinued. Use at your own discretion.