I have been scripting in Roblox for over 5 years. The games I worked on have more than 560M combined visits. I take on projects of any size, from a single system to a full game built from scratch.
Пишу скрипты в Roblox больше 5 лет. Игры, над которыми я работал, набрали суммарно более 560 млн визитов. Берусь за проекты любого размера — от отдельной системы до игры с нуля.
Discord:TheCatAndIRoblox:ThePetAndIAvailable for commissionsОткрыт для заказов
Horror game. I was the only programmer on the project and wrote the entire codebase in Luau — gameplay systems, interface and data handling — and kept fixing bugs and optimizing performance across updates.
Хоррор-игра. Я был единственным программистом проекта и написал весь код на Luau — игровые системы, интерфейс и работу с данными, — а также исправлял баги и оптимизировал производительность в каждом обновлении.
After the game was acquired by new owners, I stayed on as the only scripter and handled the codebase on my own for a long period — new features, updates and fixes on a live game with a large active audience.
После того как игру выкупили новые владельцы, я остался единственным скриптером и долгое время вёл весь код в одиночку — новые механики, обновления и правки на живой игре с большой активной аудиторией.
Co-op puzzle obby. I was solely responsible for all scripting and core systems development, and I also handled building and the full UI/UX design and implementation — everything except icons and game thumbnails.
Кооперативная обби с головоломками. Я полностью отвечал за весь код и разработку основных игровых систем, а также занимался строительством и полным циклом UI/UX — дизайном и реализацией, кроме иконок и превью игры.
Meme-themed fighting game. I was the only scripter on the project through development and release, and stayed the only one on the code up until the game was acquired.
Файтинг по мемам. Я был единственным скриптером проекта на всём пути разработки и до релиза, и оставался единственным на коде вплоть до выкупа игры.
Three pieces of real code from my projects. Switch tabs to see each one.
Три куска настоящего кода из моих проектов. Переключай вкладки.
From the game I am building right now: a player facility class — a grid, structure placement with occupancy checks, rotation, model spawning and cleanup after itself.Из игры, которую я делаю прямо сейчас: класс площадки игрока — сетка, размещение построек с проверкой занятости, поворот, спавн модели и уборка за собой.
Classic Games: rewarded-ad service. Checks that the reward really is an ad one, shows the video and pays out only on a full view.Classic Games: сервис рекламы за награду. Проверяет, что награда действительно рекламная, показывает ролик и выдаёт её только при полном просмотре.
And this one is a joke. There is a sane branch at the very end.А это шутка. Нормальная ветка в конце всё-таки есть.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Grid2 = require(ReplicatedStorage.Shared.Classes.Grid2)
local Grid2Path = require(ReplicatedStorage.Shared.Classes.Grid2Path)
local StructureConfig = require(ReplicatedStorage.Shared.Configs.StructureConfig)
local Facility = {}
Facility.__index = Facility
export type Placed = {
Name: string,
Position: Vector2,
Rotation: number,
Size: Vector2,
Walkable: boolean,
Sittable: boolean,
Model: Model?,
}
export type Facility = typeof(setmetatable(
{} :: {
Owner: Player,
Grid2: Grid2.Grid2,
Grid2Path: Grid2Path.Grid2Path,
Structures: { Placed },
Container: Folder,
},
Facility
))
local GRID_SIZE = Vector2.new(10, 10)
local CELL_SIZE = 4
local function rotatedSize(size: Vector2, rotation: number): Vector2
if rotation == 2 or rotation == 4 then
return Vector2.new(size.Y, size.X)
end
return size
end
function Facility.new(owner: Player, origin: CFrame?): Facility
local self = setmetatable({}, Facility)
self.Owner = owner
self.Grid2 = Grid2.new(GRID_SIZE, CELL_SIZE, origin)
self.Grid2Path = Grid2Path.new(self.Grid2, {
Diagonal = true,
IsWalkable = function(_cell, occupant)
return occupant == nil or occupant.Walkable == true
end,
})
self.Structures = {}
local container = Instance.new("Folder")
container.Name = owner.Name
container.Parent = workspace:FindFirstChild("Facilities") or workspace
self.Container = container
return self
end
function Facility.CanPlaceStructure(self: Facility, structureName: string, position: Vector2, rotation: number): boolean
local config = StructureConfig.List[structureName]
if not config then
return false
end
if rotation ~= math.floor(rotation) or rotation < 1 or rotation > 4 then
return false
end
return self.Grid2:IsAreaFree(position, rotatedSize(config.Size, rotation))
end
function Facility.GetAreaCenter(self: Facility, position: Vector2, size: Vector2): Vector3
local near = self.Grid2:CellToWorld(position)
local far = self.Grid2:CellToWorld(position + size - Vector2.one)
return (near + far) / 2
end
function Facility.PlaceStructure(self: Facility, structureName: string, position: Vector2, rotation: number): Placed?
if not self:CanPlaceStructure(structureName, position, rotation) then
return nil
end
local config = StructureConfig.List[structureName]
local size = rotatedSize(config.Size, rotation)
local placed: Placed = {
Name = structureName,
Position = position,
Rotation = rotation,
Size = size,
Walkable = config.Walkable,
Sittable = config.Sittable,
Model = nil,
}
self.Grid2:Occupy(position, size, placed)
table.insert(self.Structures, placed)
local assets = ReplicatedStorage:FindFirstChild("Assets")
local structures = assets and assets:FindFirstChild("Structures")
local template = structures and structures:FindFirstChild(structureName)
if template and template:IsA("Model") then
local model = template:Clone()
local yaw = math.rad((rotation - 1) * 90)
model:PivotTo(
CFrame.new(self:GetAreaCenter(position, size))
* self.Grid2.Origin.Rotation
* CFrame.Angles(0, yaw, 0)
)
model.Parent = self.Container
placed.Model = model
else
warn(`Facility: нет модели "{structureName}" в ReplicatedStorage.Assets.Structures`)
end
return placed
end
function Facility.RemoveStructure(self: Facility, position: Vector2): boolean
local placed = self.Grid2:GetOccupant(position)
if not placed then
return false
end
self.Grid2:ClearArea(placed.Position, placed.Size)
local index = table.find(self.Structures, placed)
if index then
table.remove(self.Structures, index)
end
if placed.Model then
placed.Model:Destroy()
end
return true
end
function Facility.Destroy(self: Facility)
self.Grid2:ClearAll()
table.clear(self.Structures)
self.Container:Destroy()
end
return Facility
local Core = require(game:GetService("ReplicatedStorage").Core)
local DonationConfig = Core:GetConfig("DonationConfig")
local Network = Core:GetModule("Network")
local Signal = Core:GetModule("Signal")
local AdService = game:GetService("AdService")
local module = {}
function module:CoreInit()
self.Watched = Signal.new() -- DonationName, plr
end
function module:CoreStart()
Network:ListenServer("Ad_Watch", function(plr, DonationName)
local DonationInfo = DonationConfig.InfoByName[DonationName]
if not DonationInfo then return end
if not table.find(DonationInfo.Tags, "Ad") then return end
local suc, res = pcall(function()
local reward = AdService:CreateAdRewardFromDevProductId(DonationInfo.Id)
return AdService:ShowRewardedVideoAdAsync(plr, reward)
end)
if suc and res == Enum.ShowAdResult.ShowCompleted then
self.Watched:Fire(DonationName, plr)
Network:FireClient(plr, "Ad_Watched", DonationName)
end
end)
end
return module
local function IsEven(num: number): boolean
if math.abs(num) == 0 then
return true
elseif math.abs(num) == 1 then
return false
elseif math.abs(num) == 2 then
return true
elseif math.abs(num) == 3 then
return false
elseif math.abs(num) == 4 then
return true
elseif math.abs(num) == 5 then
return false
elseif math.abs(num) == 6 then
return true
elseif math.abs(num) == 7 then
return false
elseif math.abs(num) == 8 then
return true
elseif math.abs(num) == 9 then
return false
elseif math.abs(num) == 10 then
return true
elseif math.abs(num) == 11 then
return false
elseif math.abs(num) == 12 then
return true
elseif math.abs(num) == 13 then
return false
elseif math.abs(num) == 14 then
return true
elseif math.abs(num) == 15 then
return false
elseif math.abs(num) == 16 then
return true
elseif math.abs(num) == 17 then
return false
elseif math.abs(num) == 18 then
return true
elseif math.abs(num) == 19 then
return false
elseif math.abs(num) == 20 then
return true
elseif math.abs(num) == 21 then
return false
elseif math.abs(num) == 22 then
return true
elseif math.abs(num) == 23 then
return false
elseif math.abs(num) == 24 then
return true
elseif math.abs(num) == 25 then
return false
elseif math.abs(num) == 26 then
return true
elseif math.abs(num) == 27 then
return false
elseif math.abs(num) == 28 then
return true
elseif math.abs(num) == 29 then
return false
elseif math.abs(num) == 30 then
return true
elseif math.abs(num) == 31 then
return false
elseif math.abs(num) == 32 then
return true
elseif math.abs(num) == 33 then
return false
elseif math.abs(num) == 34 then
return true
elseif math.abs(num) == 35 then
return false
elseif math.abs(num) == 36 then
return true
elseif math.abs(num) == 37 then
return false
elseif math.abs(num) == 38 then
return true
elseif math.abs(num) == 39 then
return false
elseif math.abs(num) == 40 then
return true
elseif math.abs(num) == 41 then
return false
elseif math.abs(num) == 42 then
return true
elseif math.abs(num) == 43 then
return false
elseif math.abs(num) == 44 then
return true
else
return num % 2 == 0
end
end
print("hire me pls")
What I do
Что я делаю
Full game development from scratch
Разработка игр с нуля
Game optimization & performance improvements
Оптимизация и повышение производительности
Clean and scalable OOP code
Чистый и масштабируемый ООП-код
ECS architecture (Entity Component System)
ECS-архитектура (Entity Component System)
Roblox core systems & popular frameworks
Системы Roblox и популярные фреймворки
External workflow via Rojo
Работа через Rojo — внешний редактор и синхронизация со Studio
Reviewing and fixing existing codebases
Разбор и исправление чужого кода
Frameworks & tools
Фреймворки и инструменты
Rojo
Knit
ProfileStore
ReplicaService
Comm
Trove / Maid / Janitor
Signal
Promise
jecs + planck
Matter — know the API, no production useMatter — знаю API, полноценно не использовал
Cmdr
TopbarPlus
Other popular modules
Другие популярные модули
Genres I've worked with
Жанры, с которыми работал
SimulatorsСимуляторыBuilding / ConstructionСтроительствоMorph systemsСистемы морфовObby (incl. teamwork mechanics)Обби (в т.ч. кооперативные механики)HorrorХоррорFightingФайтинг