-- Define OneBlock plugin local OneBlock = {} OneBlock.BLOCKS = {3, 17, 1, 16, 15, 56} -- Block IDs: Dirt, Log, Stone, Coal Ore, Iron Ore, Diamond Ore OneBlock.PLAYER_DATA = {} -- Tracks player-specific block progression -- Initialize the plugin function Initialize() print("[OneBlock] Starting plugin initialization...") -- Register hooks cPluginManager:AddHook(cPluginManager.HOOK_PLAYER_BROKEN_BLOCK, OnBlockBroken) print("[OneBlock] Hook registered: HOOK_PLAYER_BROKEN_BLOCK") cPluginManager:AddHook(cPluginManager.HOOK_PLAYER_SPAWNED, OnPlayerSpawned) print("[OneBlock] Hook registered: HOOK_PLAYER_SPAWNED") print("[OneBlock] Plugin initialized successfully!") return true -- Required to indicate successful initialization end -- Handle block breaking function OnBlockBroken(Player, BlockX, BlockY, BlockZ, BlockFace, BlockType) local uuid = Player:GetUUID() local playerData = OneBlock.PLAYER_DATA[uuid] -- Check if the player is breaking their One Block if playerData and BlockX == playerData.BlockX and BlockY == playerData.BlockY and BlockZ == playerData.BlockZ then -- Determine the next block type local nextBlockIndex = (playerData.BlockIndex % #OneBlock.BLOCKS) + 1 local nextBlockType = OneBlock.BLOCKS[nextBlockIndex] -- Update the player's block progression playerData.BlockIndex = nextBlockIndex -- Regenerate the block local world = Player:GetWorld() local position = Vector3i(BlockX, BlockY, BlockZ) -- Calculate chunk coordinates local ChunkX = math.floor(BlockX / 16) local ChunkZ = math.floor(BlockZ / 16) -- Ensure the chunk is loaded before setting the block world:ChunkStay( {{ChunkX, ChunkZ}}, nil, -- No need for a chunk-loading callback function() -- Called after the chunk is loaded world:SetBlock(position, nextBlockType, 0) print("[OneBlock] Block regenerated successfully at " .. BlockX .. ", " .. BlockY .. ", " .. BlockZ) end ) -- Notify the player Player:SendMessage("§aYou mined the One Block! Next block: " .. cBlockInfo[nextBlockType].Name) end end -- Handle player spawning function OnPlayerSpawned(Player) local uuid = Player:GetUUID() -- Initialize player data if not already set if not OneBlock.PLAYER_DATA[uuid] then local world = Player:GetWorld() local spawnX, spawnY, spawnZ = world:GetSpawnX(), world:GetSpawnY(), world:GetSpawnZ() -- Set initial One Block position and type OneBlock.PLAYER_DATA[uuid] = { BlockX = spawnX, BlockY = spawnY, BlockZ = spawnZ, BlockIndex = 1 } -- Place the initial One Block local initialBlockType = OneBlock.BLOCKS[1] local position = Vector3i(spawnX, spawnY, spawnZ) -- Calculate chunk coordinates local ChunkX = math.floor(spawnX / 16) local ChunkZ = math.floor(spawnZ / 16) world:ChunkStay( {{ChunkX, ChunkZ}}, nil, function() world:SetBlock(position, initialBlockType, 0) Player:SendMessage("§bWelcome to One Block! Break the block to start.") end ) else -- Respawn player on their One Block local playerData = OneBlock.PLAYER_DATA[uuid] Player:TeleportToCoords(playerData.BlockX + 0.5, playerData.BlockY + 1, playerData.BlockZ + 0.5) Player:SendMessage("§bYou respawned at your One Block!") end end