Roblox Scripter & Developer

mopy

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

View Scripting Videos Contact
7+
Years Exp.
17+
Projects
11M+
Visits
5+
Studios
SCROLL

Video Showcase

A collection of my best work — gameplay showcases, system demos, and project highlights.

Spinning Wheel System

Monetization

Rebirth System Showcase

UI/UX / Progression

Running Part With Catch System Showcase

System / engagement / OOP

Sonic Morphing System

System / Morphing / Character

Dash System

Movement / System / Combat

Round Quest Infinite system

Round System/ Quest System

Previous Workplaces

Studios and groups I've contributed to over the years.

German Tax

Scripter

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 Group
2025 – Present

Momentum Games Official

Lead Scripter

Developed reusable module libraries for UI animation, data management, and event handling. Mentored junior scripters and reviewed PRs to maintain code standards.

Visit Group
2022 – 2023

CrystalForge Studio

Systems Scripter

Scripted 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 Group
2021 – 2026

Passion Project Producers

Gameplay Engineer / System Scripter

Working on MMORPG (in development) and got fairly compensated. Nice team 👍

Visit Group
2026 – Present

Lotus Arts

Quality Assurance Board

Regularly Testing Games like CAC and SBF6AM

Visit Group
2026 – Present

Personal Projects

Everything haha

Crafted various small projects each being a learning oppertunity and scaling my knowledge.

Visit Profile
2019 – Present

Code Snippets

Samples of my Luau scripting style — clean, documented, and performance-focused.

CombatHandler.lua
-- 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
Multi-hit server-side melee with combo system and performance-safe hitbox using GetPartBoundsInBox.
DataManager.lua
-- 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
Robust DataStore wrapper with exponential backoff retry and schema validation on load.
UIAnimator.lua
-- 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
Reusable UI animation module — pop-in, fade-out, and slide with easing presets and callbacks.
HitboxVisualizer.lua
-- 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 }
Object-pooled hitbox visualizer for dev testing. Neon green boxes, auto-cleaned via task.delay.
M
mopy
@mopy.dev
Luau Roblox Studio Game Design UI/UX

The person behind the code.

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.

Luau / Scripting97%
UI Design & Tweening88%
Game Architecture90%
Networking & Security85%

Let's work together.

Available for freelance projects, studio partnerships, and commissions. I typically respond within 24 hours.

✓ Message sent! I'll be in touch soon.