I'm ModuleXC — a Roblox developer with 6 years of hands-on experience building complex systems from scratch. Started in 2019 with no English, no mentor — just raw curiosity and a lot of broken code. Like finding a signal out here in the dark and following it.
My focus is architecture and systems engineering — how code is structured, how it communicates, how it holds up under pressure. I build modular server/client frameworks, custom network layers, and security systems that actually work.
Beyond Roblox, I'm growing into general software development — studying reverse engineering, executors, and low-level security. Building toward running my own dev operation. The station doesn't sleep.
RemoteFunction router. Everything flows through it.Heartbeat:Wait() beats task.wait(0.1).task.wait(0.1). The actual interval drifted with frame load — sometimes 80ms, sometimes 130ms. Interpolation between waypoints assumed a constant tick. It was not constant. The lie was visible.task.wait in the movement hot path. Rebound to RunService.Heartbeat. Used the dt argument to advance progress, instead of guessing.while enemy.Alive do task.wait(0.1) -- "roughly" 100ms — never actually 100ms progress += 0.1 * enemy.Speed enemy.Model:SetPrimaryPartCFrame(path:GetCFrameAt(progress)) end
local conn conn = RunService.Heartbeat:Connect(function(dt) if not enemy.Alive then conn:Disconnect() return end progress += dt * enemy.Speed enemy.Model:SetPrimaryPartCFrame(path:GetCFrameAt(progress)) end)
AnimationUtil (generic tween/playback helpers) and Animator per tower type, listening for server signals like fire and idle. Friendly-fire gate moved server-side as part of the same pass.state table on the tower itself — every modifier now lives in one place. Animator reads from that state and scales playback speed proportionally to the active cooldown. animationSpeed = baseDuration / currentCooldown. One source of truth, two consumers.