export function getTemplatesForPlatform(platform: PlatformId): ScriptTemplate[] { return templates.filter(t => t.platform === platform); } export function getTemplatesForPlatform(platform: PlatformId): ScriptTemplate[] { return templates.filter(t => t.platform === platform); } import { PlatformId } from './platforms'; import { uefnTemplates } from './templates-uefn'; import { spatialTemplates } from './templates-spatial'; export interface ScriptTemplate { id: string; name: string; description: string; code: string; category: 'beginner' | 'gameplay' | 'ui' | 'tools' | 'advanced'; platform: PlatformId; } export function getTemplatesForPlatform(platform: PlatformId): ScriptTemplate[] { return templates.filter(t => t.platform === platform); } const robloxTemplates: ScriptTemplate[] = [ { id: 'hello-world', name: 'Hello World', description: 'Basic print statement to test scripts', category: 'beginner', platform: 'roblox', code: `-- Hello World Script print("Hello from Roblox!") local message = "Welcome to scripting!" print(message)`, }, { id: 'player-join', name: 'Player Join Handler', description: 'Detect when players join and leave the game', category: 'beginner', platform: 'roblox', code: `local Players = game:GetService("Players") Players.PlayerAdded:Connect(function(player) print(player.Name .. " joined the game!") -- Create leaderstats folder local leaderstats = Instance.new("Folder") leaderstats.Name = "leaderstats" leaderstats.Parent = player -- Add coins value local coins = Instance.new("IntValue") coins.Name = "Coins" coins.Value = 0 coins.Parent = leaderstats end) Players.PlayerRemoving:Connect(function(player) print(player.Name .. " left the game!") end)`, }, { id: 'part-touch', name: 'Part Touch Detector', description: 'Detect when a player touches a part', category: 'gameplay', platform: 'roblox', code: `local part = script.Parent part.Touched:Connect(function(hit) local humanoid = hit.Parent:FindFirstChild("Humanoid") if humanoid then local player = game.Players:GetPlayerFromCharacter(hit.Parent) if player then print(player.Name .. " touched the part!") -- Do something here end end end)`, }, { id: 'teleport-part', name: 'Teleport Part', description: 'Teleport players when they touch a part', category: 'gameplay', platform: 'roblox', code: `local part = script.Parent local destination = Vector3.new(0, 10, 0) -- Change this to your destination part.Touched:Connect(function(hit) local humanoid = hit.Parent:FindFirstChild("Humanoid") if humanoid then local rootPart = hit.Parent:FindFirstChild("HumanoidRootPart") if rootPart then rootPart.CFrame = CFrame.new(destination) print("Teleported " .. hit.Parent.Name) end end end)`, }, { id: 'gui-button', name: 'GUI Button Click', description: 'Handle button clicks in a GUI', category: 'ui', platform: 'roblox', code: `local button = script.Parent button.MouseButton1Click:Connect(function() print("Button clicked!") -- Add button feedback button.BackgroundColor3 = Color3.fromRGB(0, 255, 0) wait(0.1) button.BackgroundColor3 = Color3.fromRGB(255, 255, 255) end)`, }, { id: 'give-tool', name: 'Give Tool to Player', description: 'Give a tool to players when they join', category: 'tools', platform: 'roblox', code: `local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local toolName = "YourToolName" -- Change this to your tool name Players.PlayerAdded:Connect(function(player) player.CharacterAdded:Connect(function(character) wait(1) -- Wait for character to load local tool = ReplicatedStorage:FindFirstChild(toolName) if tool then local toolClone = tool:Clone() toolClone.Parent = player.Backpack print("Gave " .. toolName .. " to " .. player.Name) end end) end)`, }, { id: 'tween-part', name: 'Tween Part Animation', description: 'Smoothly animate a part using TweenService', category: 'gameplay', platform: 'roblox', code: `local TweenService = game:GetService("TweenService") local part = script.Parent local tweenInfo = TweenInfo.new( 2, -- Duration Enum.EasingStyle.Quad, Enum.EasingDirection.InOut, -1, -- Repeat count (-1 = infinite) true, -- Reverse 0 -- Delay ) local goal = { Position = part.Position + Vector3.new(0, 5, 0) } local tween = TweenService:Create(part, tweenInfo, goal) tween:Play()`, }, { id: 'datastore', name: 'DataStore Save/Load', description: 'Save and load player data using DataStore', category: 'gameplay', platform: 'roblox', code: `local DataStoreService = game:GetService("DataStoreService") local Players = game:GetService("Players") local playerDataStore = DataStoreService:GetDataStore("PlayerData") Players.PlayerAdded:Connect(function(player) local userId = "Player_" .. player.UserId local data local success, errorMsg = pcall(function() data = playerDataStore:GetAsync(userId) end) if success then if data then print("Loaded data for " .. player.Name) -- Use the data here else print("New player: " .. player.Name) end else warn("Error loading data: " .. errorMsg) end end) Players.PlayerRemoving:Connect(function(player) local userId = "Player_" .. player.UserId local data = { coins = 100, -- Replace with actual data level = 5 } local success, errorMsg = pcall(function() playerDataStore:SetAsync(userId, data) end) if success then print("Saved data for " .. player.Name) else warn("Error saving data: " .. errorMsg) end end)`, }, { id: 'proximity-prompt', name: 'Proximity Prompt Interaction', description: 'Interactive prompt that appears when player is near', category: 'ui', platform: 'roblox', code: `local part = script.Parent local ProximityPromptService = game:GetService("ProximityPromptService") -- Create proximity prompt local prompt = Instance.new("ProximityPrompt") prompt.ObjectText = "Treasure Chest" prompt.ActionText = "Open" prompt.MaxActivationDistance = 10 prompt.Parent = part prompt.Triggered:Connect(function(player) print(player.Name .. " opened the chest!") -- Add your interaction logic here part.BrickColor = BrickColor.new("Bright green") -- Disable for a cooldown prompt.Enabled = false wait(5) prompt.Enabled = true part.BrickColor = BrickColor.new("Bright yellow") end)`, }, { id: 'round-system', name: 'Round System', description: 'Complete round-based game loop system', category: 'advanced', platform: 'roblox', code: `local ReplicatedStorage = game:GetService("ReplicatedStorage") local Players = game:GetService("Players") local roundLength = 60 local intermissionLength = 10 local minimumPlayers = 2 local status = ReplicatedStorage:WaitForChild("Status") while true do -- Intermission repeat status.Value = "Waiting for " .. minimumPlayers .. " players..." wait(1) until #Players:GetPlayers() >= minimumPlayers status.Value = "Intermission" wait(intermissionLength) -- Round start status.Value = "Game starting..." wait(2) -- Game round for i = roundLength, 0, -1 do status.Value = "Round: " .. i .. " seconds remaining" wait(1) end status.Value = "Round ended!" wait(3) end`, }, { id: 'leaderstats-advanced', name: 'Advanced Leaderstats with XP', description: 'Complete leaderstats system with coins, XP, and level', category: 'gameplay', platform: 'roblox', code: `local Players = game:GetService("Players") local function calculateLevel(xp) return math.floor(xp / 100) + 1 end Players.PlayerAdded:Connect(function(player) local leaderstats = Instance.new("Folder") leaderstats.Name = "leaderstats" leaderstats.Parent = player local coins = Instance.new("IntValue") coins.Name = "Coins" coins.Value = 0 coins.Parent = leaderstats local level = Instance.new("IntValue") level.Name = "Level" level.Value = 1 level.Parent = leaderstats local xp = Instance.new("IntValue") xp.Name = "XP" xp.Value = 0 xp.Parent = player -- Update level when XP changes xp.Changed:Connect(function(newXP) level.Value = calculateLevel(newXP) end) -- Example: Award XP every 10 seconds spawn(function() while player.Parent do wait(10) xp.Value = xp.Value + 10 coins.Value = coins.Value + 5 end end) end)`, }, { id: 'shop-system', name: 'Shop System', description: 'Basic shop system with purchase handling', category: 'gameplay', platform: 'roblox', code: `local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") -- Shop items configuration local shopItems = { SpeedBoost = { price = 100, name = "Speed Boost", duration = 30 }, DoubleJump = { price = 250, name = "Double Jump Power", duration = 60 } } -- Purchase handler (put in ServerScriptService) local function purchaseItem(player, itemName) local item = shopItems[itemName] if not item then return false, "Item not found" end local leaderstats = player:FindFirstChild("leaderstats") local coins = leaderstats and leaderstats:FindFirstChild("Coins") if not coins then return false, "Player data not loaded" end if coins.Value < item.price then return false, "Not enough coins" end -- Deduct coins coins.Value = coins.Value - item.price -- Grant item effect if itemName == "SpeedBoost" then local character = player.Character if character then local humanoid = character:FindFirstChild("Humanoid") if humanoid then humanoid.WalkSpeed = humanoid.WalkSpeed * 2 task.wait(item.duration) humanoid.WalkSpeed = humanoid.WalkSpeed / 2 end end end return true, "Purchased " .. item.name end -- Example usage: -- local success, message = purchaseItem(player, "SpeedBoost")`, }, { id: 'camera-manipulation', name: 'Camera Manipulation', description: 'Custom camera angles and cinematic views', category: 'advanced', platform: 'roblox', code: `local Players = game:GetService("Players") local RunService = game:GetService("RunService") local player = Players.LocalPlayer local camera = workspace.CurrentCamera -- Set camera mode camera.CameraType = Enum.CameraType.Scriptable -- Example 1: Fixed camera position local function setFixedCamera(position, lookAt) camera.CFrame = CFrame.new(position, lookAt) end -- Example 2: Follow a part local targetPart = workspace:WaitForChild("CameraTarget") RunService.RenderStepped:Connect(function() if targetPart then local offset = Vector3.new(0, 10, 20) camera.CFrame = CFrame.new(targetPart.Position + offset, targetPart.Position) end end) -- Example 3: Cinematic orbit local angle = 0 local radius = 30 local center = Vector3.new(0, 10, 0) RunService.RenderStepped:Connect(function(delta) angle = angle + delta * 0.5 local x = math.cos(angle) * radius local z = math.sin(angle) * radius local position = center + Vector3.new(x, 15, z) camera.CFrame = CFrame.new(position, center) end)`, }, { id: 'combat-system', name: 'Basic Combat System', description: 'Simple damage and health system', category: 'gameplay', platform: 'roblox', code: `local tool = script.Parent local damage = 10 local cooldown = 1 local canAttack = true tool.Activated:Connect(function() if not canAttack then return end canAttack = false local player = tool.Parent.Parent local character = player.Character or player.CharacterAdded:Wait() local humanoid = character:FindFirstChild("Humanoid") if humanoid then -- Play attack animation local animation = Instance.new("Animation") animation.AnimationId = "rbxassetid://YOUR_ANIMATION_ID" local animTrack = humanoid:LoadAnimation(animation) animTrack:Play() -- Detect hit local handle = tool:FindFirstChild("Handle") if handle then local hitPart = nil local connection connection = handle.Touched:Connect(function(hit) if hit.Parent ~= character then local enemyHumanoid = hit.Parent:FindFirstChild("Humanoid") if enemyHumanoid then enemyHumanoid:TakeDamage(damage) print("Dealt " .. damage .. " damage!") connection:Disconnect() end end end) wait(0.5) -- Attack window connection:Disconnect() end end wait(cooldown) canAttack = true end)`, }, { id: 'admin-commands', name: 'Basic Admin Commands', description: 'Simple admin command system with permissions', category: 'tools', platform: 'roblox', code: `local Players = game:GetService("Players") local admins = { 123456789, -- Replace with actual UserIds 987654321, } local commands = { ["kill"] = function(admin, targetName) local target = Players:FindFirstChild(targetName) if target and target.Character then target.Character.Humanoid.Health = 0 return true, "Killed " .. targetName end return false, "Player not found" end, ["tp"] = function(admin, targetName) local target = Players:FindFirstChild(targetName) if target and target.Character and admin.Character then admin.Character.HumanoidRootPart.CFrame = target.Character.HumanoidRootPart.CFrame return true, "Teleported to " .. targetName end return false, "Cannot teleport" end, ["heal"] = function(admin, targetName) local target = Players:FindFirstChild(targetName) if target and target.Character then target.Character.Humanoid.Health = target.Character.Humanoid.MaxHealth return true, "Healed " .. targetName end return false, "Player not found" end, } local function isAdmin(player) return table.find(admins, player.UserId) ~= nil end Players.PlayerAdded:Connect(function(player) if isAdmin(player) then print(player.Name .. " is an admin!") player.Chatted:Connect(function(message) local args = string.split(message, " ") local cmd = string.lower(args[1]) if commands[cmd] then local success, result = commands[cmd](player, args[2]) print(result) end end) end end)`, }, { id: 'badge-award', name: 'Badge Award System', description: 'Award badges to players for achievements', category: 'gameplay', platform: 'roblox', code: `local BadgeService = game:GetService("BadgeService") local Players = game:GetService("Players") local badgeIds = { FirstJoin = 0, -- Replace with your badge ID KillMonster = 0, ReachLevel10 = 0, } local function awardBadge(player, badgeId) local success, hasBadge = pcall(function() return BadgeService:UserHasBadgeAsync(player.UserId, badgeId) end) if success and not hasBadge then local awarded, errorMsg = pcall(function() BadgeService:AwardBadge(player.UserId, badgeId) end) if awarded then print("Awarded badge " .. badgeId .. " to " .. player.Name) return true else warn("Error awarding badge: " .. tostring(errorMsg)) end end return false end -- Example: Award badge on first join Players.PlayerAdded:Connect(function(player) wait(2) -- Wait for player to fully load awardBadge(player, badgeIds.FirstJoin) end) -- Export function for use in other scripts return { awardBadge = awardBadge, badgeIds = badgeIds }`, }, { id: 'inventory-system', name: 'Inventory System', description: 'Complete player inventory with items and storage', category: 'advanced', platform: 'roblox', code: `local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local inventoryData = {} local function createInventory(player) inventoryData[player.UserId] = { items = {}, maxSlots = 20 } end local function addItem(player, itemName, quantity) local inventory = inventoryData[player.UserId] if not inventory then warn("Player inventory not found") return false end -- Check if item already exists if inventory.items[itemName] then inventory.items[itemName] = inventory.items[itemName] + quantity else -- Check if inventory is full local itemCount = 0 for _ in pairs(inventory.items) do itemCount = itemCount + 1 end if itemCount >= inventory.maxSlots then return false, "Inventory full" end inventory.items[itemName] = quantity end print("Added " .. quantity .. "x " .. itemName .. " to " .. player.Name) return true end local function removeItem(player, itemName, quantity) local inventory = inventoryData[player.UserId] if not inventory or not inventory.items[itemName] then return false, "Item not found" end if inventory.items[itemName] < quantity then return false, "Not enough items" end inventory.items[itemName] = inventory.items[itemName] - quantity if inventory.items[itemName] <= 0 then inventory.items[itemName] = nil end return true end local function getInventory(player) return inventoryData[player.UserId] end Players.PlayerAdded:Connect(createInventory) Players.PlayerRemoving:Connect(function(player) inventoryData[player.UserId] = nil end) -- Export functions return { addItem = addItem, removeItem = removeItem, getInventory = getInventory }`, }, { id: 'countdown-timer', name: 'Countdown Timer UI', description: 'Visual countdown timer with events', category: 'ui', platform: 'roblox', code: `local Players = game:GetService("Players") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") -- Create ScreenGui local screenGui = Instance.new("ScreenGui") screenGui.Name = "TimerGui" screenGui.Parent = playerGui -- Create timer label local timerLabel = Instance.new("TextLabel") timerLabel.Size = UDim2.new(0, 200, 0, 50) timerLabel.Position = UDim2.new(0.5, -100, 0, 20) timerLabel.BackgroundColor3 = Color3.fromRGB(0, 0, 0) timerLabel.BackgroundTransparency = 0.5 timerLabel.TextColor3 = Color3.fromRGB(255, 255, 255) timerLabel.Font = Enum.Font.GothamBold timerLabel.TextSize = 24 timerLabel.Text = "60" timerLabel.Parent = screenGui local function startCountdown(duration, onComplete) for i = duration, 0, -1 do timerLabel.Text = tostring(i) -- Change color as timer runs out if i <= 10 then timerLabel.TextColor3 = Color3.fromRGB(255, 0, 0) elseif i <= 30 then timerLabel.TextColor3 = Color3.fromRGB(255, 255, 0) else timerLabel.TextColor3 = Color3.fromRGB(255, 255, 255) end task.wait(1) end timerLabel.Text = "TIME'S UP!" if onComplete then onComplete() end task.wait(2) timerLabel.Text = "0" end -- Example usage startCountdown(60, function() print("Timer completed!") end)`, }, { id: 'sound-manager', name: 'Sound/Music Manager', description: 'Manage background music and sound effects', category: 'tools', platform: 'roblox', code: `local SoundService = game:GetService("SoundService") local SoundManager = {} SoundManager.sounds = {} SoundManager.music = nil -- Add sound to manager function SoundManager:addSound(name, soundId, volume) local sound = Instance.new("Sound") sound.Name = name sound.SoundId = "rbxassetid://" .. soundId sound.Volume = volume or 0.5 sound.Parent = SoundService self.sounds[name] = sound return sound end -- Play sound effect function SoundManager:playSound(name) local sound = self.sounds[name] if sound then sound:Play() else warn("Sound not found: " .. name) end end -- Set background music function SoundManager:setMusic(soundId, volume) if self.music then self.music:Stop() self.music:Destroy() end self.music = Instance.new("Sound") self.music.Name = "BackgroundMusic" self.music.SoundId = "rbxassetid://" .. soundId self.music.Volume = volume or 0.3 self.music.Looped = true self.music.Parent = SoundService self.music:Play() end -- Stop music function SoundManager:stopMusic() if self.music then self.music:Stop() end end -- Fade in/out function SoundManager:fade(sound, targetVolume, duration) local startVolume = sound.Volume local steps = duration * 30 -- 30 FPS local increment = (targetVolume - startVolume) / steps for i = 1, steps do sound.Volume = sound.Volume + increment task.wait(1/30) end sound.Volume = targetVolume end -- Example usage: -- SoundManager:addSound("Jump", 123456, 0.5) -- SoundManager:playSound("Jump") -- SoundManager:setMusic(789012, 0.3) return SoundManager`, }, { id: 'pathfinding-npc', name: 'Pathfinding NPC', description: 'NPC that follows player using PathfindingService', category: 'advanced', platform: 'roblox', code: `local PathfindingService = game:GetService("PathfindingService") local RunService = game:GetService("RunService") local npc = script.Parent local humanoid = npc:WaitForChild("Humanoid") local rootPart = npc:WaitForChild("HumanoidRootPart") local target = workspace:WaitForChild("TargetPart") -- Change to your target local updateRate = 0.5 local maxDistance = 50 local path = PathfindingService:CreatePath({ AgentRadius = 2, AgentHeight = 5, AgentCanJump = true, WaypointSpacing = 4, }) local function getNextWaypoint(targetPosition) local success, errorMsg = pcall(function() path:ComputeAsync(rootPart.Position, targetPosition) end) if success and path.Status == Enum.PathStatus.Success then local waypoints = path:GetWaypoints() if #waypoints > 1 then return waypoints[2] -- Return next waypoint end else warn("Path computation failed: " .. tostring(errorMsg)) end return nil end local function followPath() while true do if target and (rootPart.Position - target.Position).Magnitude <= maxDistance then local waypoint = getNextWaypoint(target.Position) if waypoint then if waypoint.Action == Enum.PathWaypointAction.Jump then humanoid.Jump = true end humanoid:MoveTo(waypoint.Position) humanoid.MoveToFinished:Wait() end else humanoid:MoveTo(rootPart.Position) -- Stop moving end task.wait(updateRate) end end -- Start following spawn(followPath)`, }, { id: 'checkpoint-system', name: 'Checkpoint System', description: 'Save player checkpoints and respawn at last checkpoint', category: 'gameplay', platform: 'roblox', code: `local Players = game:GetService("Players") local checkpoints = workspace:WaitForChild("Checkpoints"):GetChildren() local playerCheckpoints = {} -- Sort checkpoints by name (Checkpoint1, Checkpoint2, etc.) table.sort(checkpoints, function(a, b) return tonumber(a.Name:match("%d+")) < tonumber(b.Name:match("%d+")) end) local function setupCheckpoints() for i, checkpoint in pairs(checkpoints) do checkpoint.Touched:Connect(function(hit) local humanoid = hit.Parent:FindFirstChild("Humanoid") if humanoid then local player = Players:GetPlayerFromCharacter(hit.Parent) if player then local currentCheckpoint = playerCheckpoints[player.UserId] or 0 if i > currentCheckpoint then playerCheckpoints[player.UserId] = i checkpoint.BrickColor = BrickColor.new("Bright green") -- Visual feedback local originalSize = checkpoint.Size checkpoint.Size = originalSize * 1.2 task.wait(0.2) checkpoint.Size = originalSize print(player.Name .. " reached checkpoint " .. i) end end end end) end end Players.PlayerAdded:Connect(function(player) playerCheckpoints[player.UserId] = 0 player.CharacterAdded:Connect(function(character) task.wait(0.1) -- Wait for character to load local checkpointIndex = playerCheckpoints[player.UserId] if checkpointIndex > 0 then local checkpoint = checkpoints[checkpointIndex] if checkpoint then character:MoveTo(checkpoint.Position + Vector3.new(0, 3, 0)) end end end) end) setupCheckpoints()`, }, { id: 'team-system', name: 'Team System', description: 'Auto-assign players to balanced teams', category: 'gameplay', platform: 'roblox', code: `local Teams = game:GetService("Teams") local Players = game:GetService("Players") -- Create teams if they don't exist local function createTeam(name, color) local team = Teams:FindFirstChild(name) if not team then team = Instance.new("Team") team.Name = name team.TeamColor = color team.AutoAssignable = false team.Parent = Teams end return team end local redTeam = createTeam("Red", BrickColor.new("Bright red")) local blueTeam = createTeam("Blue", BrickColor.new("Bright blue")) local function getTeamPlayerCount(team) local count = 0 for _, player in pairs(Players:GetPlayers()) do if player.Team == team then count = count + 1 end end return count end local function assignToSmallestTeam(player) local redCount = getTeamPlayerCount(redTeam) local blueCount = getTeamPlayerCount(blueTeam) if redCount <= blueCount then player.Team = redTeam else player.Team = blueTeam end print(player.Name .. " assigned to " .. player.Team.Name .. " team") end Players.PlayerAdded:Connect(function(player) assignToSmallestTeam(player) player.CharacterAdded:Connect(function(character) task.wait(0.1) -- Give team color to character local bodyColors = character:FindFirstChild("Body Colors") if bodyColors then bodyColors.HeadColor = player.Team.TeamColor bodyColors.TorsoColor = player.Team.TeamColor bodyColors.LeftArmColor = player.Team.TeamColor bodyColors.RightArmColor = player.Team.TeamColor bodyColors.LeftLegColor = player.Team.TeamColor bodyColors.RightLegColor = player.Team.TeamColor end end) end)`, }, { id: 'chat-commands', name: 'Custom Chat Commands', description: 'Player chat commands for emotes and actions', category: 'tools', platform: 'roblox', code: `local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local commands = { ["/dance"] = function(player) local character = player.Character if character then local humanoid = character:FindFirstChild("Humanoid") if humanoid then -- Play dance emote local danceAnimation = Instance.new("Animation") danceAnimation.AnimationId = "rbxassetid://507770239" local track = humanoid:LoadAnimation(danceAnimation) track:Play() return true, "Dancing!" end end return false, "Cannot dance" end, ["/sit"] = function(player) local character = player.Character if character then local humanoid = character:FindFirstChild("Humanoid") if humanoid then humanoid.Sit = true return true, "Sitting down" end end return false, "Cannot sit" end, ["/jump"] = function(player) local character = player.Character if character then local humanoid = character:FindFirstChild("Humanoid") if humanoid then humanoid.Jump = true return true, "Jumping!" end end return false, "Cannot jump" end, ["/reset"] = function(player) if player.Character then player.Character:BreakJoints() return true, "Resetting character" end return false, "Cannot reset" end, } Players.PlayerAdded:Connect(function(player) player.Chatted:Connect(function(message) local lowerMessage = string.lower(message) for command, func in pairs(commands) do if string.sub(lowerMessage, 1, #command) == command then local success, result = func(player) if success then print(player.Name .. ": " .. result) else warn(player.Name .. ": " .. result) end break end end end) end)`, }, { id: 'morph-system', name: 'Character Morphing', description: 'Change player appearance/morph into different models', category: 'gameplay', platform: 'roblox', code: `local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") -- Store morphs in ReplicatedStorage local morphsFolder = ReplicatedStorage:WaitForChild("Morphs") local function applyMorph(player, morphName) local character = player.Character if not character then return false, "Character not found" end local morph = morphsFolder:FindFirstChild(morphName) if not morph then return false, "Morph not found" end local humanoid = character:FindFirstChild("Humanoid") if not humanoid then return false, "Humanoid not found" end -- Store original values local originalWalkSpeed = humanoid.WalkSpeed local originalJumpPower = humanoid.JumpPower -- Clear existing accessories for _, accessory in pairs(character:GetChildren()) do if accessory:IsA("Accessory") or accessory:IsA("Hat") then accessory:Destroy() end end -- Apply morph appearance local morphClone = morph:Clone() for _, part in pairs(morphClone:GetChildren()) do if part:IsA("Accessory") or part:IsA("Hat") then part.Parent = character elseif part:IsA("BodyColors") then local bodyColors = character:FindFirstChild("Body Colors") if bodyColors then bodyColors.HeadColor = part.HeadColor bodyColors.TorsoColor = part.TorsoColor bodyColors.LeftArmColor = part.LeftArmColor bodyColors.RightArmColor = part.RightArmColor bodyColors.LeftLegColor = part.LeftLegColor bodyColors.RightLegColor = part.RightLegColor end end end -- Optionally modify stats if morphClone:FindFirstChild("WalkSpeed") then humanoid.WalkSpeed = morphClone.WalkSpeed.Value end if morphClone:FindFirstChild("JumpPower") then humanoid.JumpPower = morphClone.JumpPower.Value end morphClone:Destroy() return true, "Morphed into " .. morphName end -- Example: Touch pad to morph local morphPad = workspace:WaitForChild("MorphPad") morphPad.Touched:Connect(function(hit) local humanoid = hit.Parent:FindFirstChild("Humanoid") if humanoid then local player = Players:GetPlayerFromCharacter(hit.Parent) if player then local success, message = applyMorph(player, "Ninja") print(message) end end end)`, }, { id: 'kill-brick', name: 'Kill Brick', description: 'Instantly kill player on touch (lava, void, etc.)', category: 'beginner', platform: 'roblox', code: `local killBrick = script.Parent -- Make it look dangerous killBrick.BrickColor = BrickColor.new("Really red") killBrick.Material = Enum.Material.Neon -- Optional: Add particle effects local particleEmitter = Instance.new("ParticleEmitter") particleEmitter.Texture = "rbxasset://textures/particles/smoke_main.dds" particleEmitter.Color = ColorSequence.new(Color3.fromRGB(255, 0, 0)) particleEmitter.Size = NumberSequence.new(2) particleEmitter.Lifetime = NumberRange.new(1, 2) particleEmitter.Rate = 50 particleEmitter.Parent = killBrick -- Debounce to prevent multiple deaths local debounce = {} killBrick.Touched:Connect(function(hit) local humanoid = hit.Parent:FindFirstChild("Humanoid") if humanoid then local player = game.Players:GetPlayerFromCharacter(hit.Parent) -- Debounce check if player and not debounce[player.UserId] then debounce[player.UserId] = true -- Kill the player humanoid.Health = 0 print(player.Name .. " touched the kill brick!") -- Reset debounce after respawn task.wait(2) debounce[player.UserId] = nil elseif not player then -- Kill NPCs or other humanoids humanoid.Health = 0 end end end)`, }, ]; // Combine all platform templates export const templates: ScriptTemplate[] = [ ...robloxTemplates, ...uefnTemplates, ...spatialTemplates, ];