I have been trying to figure out how I could create a plate placing system similar to plates of fate, but I could only get so far until I came across a few issues. I am having trouble with placing the plates in rows and columns, and actually doing the math to place the plate. Here’s what I tried doing to get it working. (it’s not complete because I couldn’t find the right formula for the positioning of the plates to locate them.)
local PlateAdder = {}
function PlacePlate(player)
local plate = Instance.new("Part")
plate.Name = player.Name.."'s_Plate"
plate.Size = Vector3.new(20,1,20)
plate.Material = Enum.Material.Grass
plate.Color = Color3.fromRGB(124, 156, 107)
local platePadding = 8
spawn(function()
for i,plr in pairs(game:GetService("Players"):GetPlayers()) do
if plr then
local newPlate = plate:Clone()
newPlate.Parent = workspace.Plates
newPlate.Position = Vector3.new((-42/(i*3)), 0.5, -183.25)
end
end
end)
end
return PlateAdder
I hate to be that guy who just links posts without any explanation but here I go anyway.
In the rbxl file above, you can find a script for tile generation used for A* pathfinding.
I modified the code so that it works for tile generation like in your case.
Server script
local TileX, TileY = 10, 10 -- number of tiles along both the x and y axis
local Rows, Cols = TileX, TileY
local HexMap = {}
local function StartGenerate()
for x=1, Rows do -- number of rows we'll create
HexMap[x] = {}
for y = 1, Cols do
local End = false -- End can be eitheir the start or final tile
if x == 1 and y == 1 then -- Starting tile
End = true
end
if x == Rows and y == Cols then -- End tile
End = true
end
HexMap[x][y] = NodeModule.new(x,y,End) -- Generate a new tile object
end
end
for x=1, Rows do
for y = 1, Cols do
HexMap[x][y]:Create() -- set its CFrame
end
if x%5 == 0 then -- modulus, Im not good enough at maths to know what it actually does
wait(.1)
end
end
end
StartGenerate()
Module script
-- Length and width of one tile
local tileWidth = 4
local tileHeight = 4
local Node = {}
Node.__index = Node
local RandomClass = Random.new() -- Create a random seed
function Node.new(x, y, End)
local self = setmetatable({},Node)
self.x = x
self.y = y
return self
end
function Node:Create()
if not self.Instance then -- Check that there is no existing hex
local Part = workspace.Folder:WaitForChild("Tile"):Clone()
Part:SetPrimaryPartCFrame(CFrame.new(self.x*tileWidth, 1, self.y*tileHeight))
Part.Parent = workspace:WaitForChild("Map")
self.Instance = Part
end
end
return Node
To add padding between plates, you could change the CFrame you set the tile at. E.g, self.x*tileWidth*2, 1, self.y*tileHeight*2 to create a gap the size of one tile between each tile.
A few stuff in the code I posted need to be filled out by yourself.
E.g:
create and define the node module
Define the plate which you will clone to the game here:
And create a folder named “Map” to store the plates in.
The last two are completely optional and you can do it whichever way you want.
There might be some other stuff I’ve missed out which you’ll need to modify for your own game.