7+ years of scripting perfection
I script good Gameplay, Assure Quality, make sure devs can sell their games, and bring chances to people that deserve it. thx for reading
A collection of my best work — gameplay showcases, system demos, and project highlights.
Studios and groups I've contributed to over the years.
Scripted and maintained various systems for the German Tax team (unfortunatly because of Non-Disclosure Agreements I can't share more info...). Collaborated with a team of 8 developers.
Visit GroupDeveloped reusable module libraries for UI animation, data management, and event handling. Mentored junior scripters and reviewed PRs to maintain code standards.
Visit GroupScripted procedural dungeon generation and boss AI for a horror-adventure title that peaked at 50k concurrent players. Focused on server performance and memory optimization.
Visit GroupWorking on MMORPG (in development) and got fairly compensated. Nice team 👍
Visit GroupCrafted various small projects each being a learning oppertunity and scaling my knowledge.
Visit ProfileSamples of my Luau scripting style — clean, documented, and performance-focused.
-- CombatHandler | mopy | Clean melee framework -- Handles attack registration, cooldowns, and combo tracking local ReplicatedStorage = game:GetService("ReplicatedStorage") local RunService = game:GetService("RunService") local Players = game:GetService("Players") local CombatConfig = { COMBO_RESET_TIME = 1.2, ATTACK_COOLDOWN = 0.35, MAX_COMBO = 4, HITBOX_SIZE = Vector3.new(5, 5, 6), BASE_DAMAGE = 15, } local playerData = {} local function getPlayerData(player) if not playerData[player] then playerData[player] = { combo = 0, lastAttack = 0, lastSwing = 0, } end return playerData[player] end local function doMeleeHitbox(character, damage) local hrp = character:FindFirstChild("HumanoidRootPart") if not hrp then return end local cf = hrp.CFrame * CFrame.new(0, 0, -3) local hits = game.Workspace:GetPartBoundsInBox(cf, CombatConfig.HITBOX_SIZE) local hit = {} for _, part in hits do local model = part:FindFirstAncestorOfClass("Model") if model and model ~= character and not hit[model] then local hum = model:FindFirstChildOfClass("Humanoid") if hum and hum.Health > 0 then hum:TakeDamage(damage) hit[model] = true end end end end -- Main attack handler (called from RemoteEvent) local function onAttack(player) local now = tick() local data = getPlayerData(player) if now - data.lastSwing < CombatConfig.ATTACK_COOLDOWN then return end if now - data.lastAttack > CombatConfig.COMBO_RESET_TIME then data.combo = 0 end data.combo = (data.combo % CombatConfig.MAX_COMBO) + 1 data.lastSwing = now data.lastAttack = now local dmg = CombatConfig.BASE_DAMAGE * (data.combo == CombatConfig.MAX_COMBO and 2 or 1) doMeleeHitbox(player.Character, dmg) end
GetPartBoundsInBox.-- DataManager | mopy | ProfileService wrapper with retry local DataStoreService = game:GetService("DataStoreService") local Players = game:GetService("Players") local STORE = DataStoreService:GetDataStore("PlayerData_v3") local MAX_RETRY = 5 local RETRY_WAIT = 2 local DEFAULT_DATA = { level = 1, xp = 0, coins = 0, gems = 0, wins = 0, deaths = 0, } local function safeCall(fn, ...) for i = 1, MAX_RETRY do local ok, result = pcall(fn, ...) if ok then return result end warn("[DataManager] Attempt", i, "failed:", result) task.wait(RETRY_WAIT ^ i) end end local DataManager = {} function DataManager.Load(player) local raw = safeCall(STORE.GetAsync, STORE, tostring(player.UserId)) local data = table.clone(DEFAULT_DATA) if raw then for k, v in raw do if DEFAULT_DATA[k] ~= nil then data[k] = v end end end return data end function DataManager.Save(player, data) safeCall(STORE.SetAsync, STORE, tostring(player.UserId), data) end return DataManager
-- UIAnimator | mopy | Spring-based UI tweening utility local TweenService = game:GetService("TweenService") local UIAnimator = {} local EASING = Enum.EasingStyle.Back local OUT = Enum.EasingDirection.Out function UIAnimator.PopIn(frame, duration) duration = duration or 0.4 frame.GroupTransparency = 1 frame.Size = UDim2.fromScale(0.01, 0.01) frame.Visible = true local tween = TweenService:Create(frame, TweenInfo.new(duration, EASING, OUT), { GroupTransparency = 0, Size = UDim2.fromScale(1, 1), }) tween:Play() return tween end function UIAnimator.FadeOut(frame, duration, callback) duration = duration or 0.25 local tween = TweenService:Create(frame, TweenInfo.new(duration, Enum.EasingStyle.Sine, OUT), {GroupTransparency = 1}) tween.Completed:Once(function() frame.Visible = false if callback then callback() end end) tween:Play() end function UIAnimator.Slide(frame, from, to, duration) frame.Position = from return TweenService:Create(frame, TweenInfo.new(duration or 0.3, Enum.EasingStyle.Quint, OUT), {Position = to}) end return UIAnimator
-- HitboxVisualizer | mopy | Debug-mode hitbox renderer -- Set DEBUG = false in production! local DEBUG = true local RunService = game:GetService("RunService") local pool = {} local function getBox() for _, p in pool do if not p.Parent then p.Parent = game.Workspace return p end end local p = Instance.new("Part") p.Anchored = true p.CanCollide = false p.Material = Enum.Material.Neon p.Color = Color3.fromHex("#00ff88") p.Transparency = 0.7 p.Parent = game.Workspace table.insert(pool, p) return p end local function drawHitbox(cf, size, duration) if not DEBUG then return end local box = getBox() box.CFrame, box.Size = cf, size task.delay(duration or 0.1, function() box.Parent = nil end) end return { Draw = drawHitbox }
Hey! I'm mopy — a passionate Roblox developer with over 7 years of hands-on scripting experience. I specialize in building polished, performant game systems using Luau.
I've worked across combat systems, data management, procedural generation, UI animation, and full game architecture. Whether it's a solo indie project or a large studio — I bring clean, documented, scalable code.
Outside of scripting, I'm deeply interested in neurosurgery, nature and pushing Roblox to its technical limits.
Available for freelance projects, studio partnerships, and commissions. I typically respond within 24 hours.