So I've made a script that goes through all of the parts and adds those parts to specific tables based on names. I'm doing this to build a table of parts and positions for the server to send to client for a minimap. To reduce on lag of the constant calling and waiting to get those parts. Yet, it has come to my attention that it seems to miss one part in each name category. I'm unaware of if it's in the table creation or the drawing that is causing this, and I've tried my best to find it. So I'm asking for help.
I do apologize ahead of time for the length of the scripts, but I figure the entire thing is needed.
Script
--======================--
--// Global Functions \\--
--======================--
local tableFunc = game.ReplicatedStorage.CrossConnections.Shared.TableFunction
local walls, floors, paths = {}, {}, {}
function getChildren(parent)
for i, v in pairs(parent:GetChildren()) do
if v:IsA("Part") then
if string.lower(v.Name) == "wall" then
table.insert(walls, #walls, {posX = v.Position.X, posZ = v.Position.Z, sizeX = v.Size.X, sizeZ = v.Size.Z, rotation = v.Rotation.Y})
end
if string.lower(v.Name) == "floor" then
table.insert(floors, #floors, {posX = v.Position.X, posZ = v.Position.Z, sizeX = v.Size.X, sizeZ = v.Size.Z, rotation = v.Rotation.Y})
end
if string.lower(v.Name) == "path" then
table.insert(paths, #paths, {posX = v.Position.X, posZ = v.Position.Z, sizeX = v.Size.X, sizeZ = v.Size.Z, rotation = v.Rotation.Y})
end
elseif v:IsA("Model") then
getChildren(v)
end
end
end
function updateTables()
getChildren(game.Workspace)
end
updateTables()
function tableFunc.OnServerInvoke(player, tableType)
print(player.Name, tableType)
if tableType == "walls" then
for i = 1, #walls do
for a, b in pairs(walls[i]) do
tableFunc:InvokeClient(player, a, b, "wall")
end
end
elseif tableType == "floors" then
for i = 1, #floors do
for a, b in pairs(floors[i]) do
tableFunc:InvokeClient(player, a, b, "floor")
end
end
elseif tableType == "paths" then
for i = 1, #paths do
for a, b in pairs(paths[i]) do
tableFunc:InvokeClient(player, a, b, "path")
end
end
end
end
--===================--
--// Map Functions \\--
--===================--
local getItems = game.ReplicatedStorage.CrossConnections.Map.GetItems
function getItems.OnServerInvoke(player, itemType)
if itemType == "walls" then
return walls
elseif itemType == "floors" then
return floors
elseif itemType == "paths" then
return paths
elseif itemType == "self" then
return game.Workspace:WaitForChild(player.Name).Torso.Position.X.. "::" ..game.Workspace:WaitForChild(player.Name).Torso.Position.Z
end
end
LocalScript:
--==========================--
--// Predefined Variables \\--
--==========================--
local Players = game.Players
local Player = game.Players.LocalPlayer
local map = script.Parent.holder
local pX, pZ = 0,0
local dist = 65 --How far away items will be drawn
local unit0 = Vector3.new(0,0,1) --Look vector for north
local up = Vector3.new(0,1,0) --Look Vector for up
local degree = 57.2958 --Degree of 1 Radian
--=======================--
--// Predefined Clones \\--
--=======================--
local blip = script.Parent.Center:Clone()
blip.BackgroundColor3 = Color3.new(math.random(1, 255)/255, math.random(1, 255)/255, math.random(1, 255)/255)
blip.ZIndex = 2
blip.Visible = true
local name = script.Parent.You:Clone()
name.ZIndex = 2
name.Visible = true
--======================--
--// Remote Functions \\--
--======================--
local getItems = game.ReplicatedStorage.CrossConnections.Map.GetItems
local tableFunc = game.ReplicatedStorage.CrossConnections.Shared.TableFunction
local walls, floors, paths = {}, {}, {}
local wallCount = 0;
local floorCount = 0;
local pathCount = 0;
function tableFunc.OnClientInvoke(name, value, type)
if name == "rotation" then
if type == "wall" then
wallCount = wallCount + 1
table.insert(walls, wallCount, {})
elseif type == "floor" then
floorCount = floorCount + 1
table.insert(floors, floorCount, {})
elseif type == "path" then
pathCount = pathCount + 1
table.insert(paths, pathCount, {})
end
end
if type == "wall" then
walls[wallCount][name] = value
elseif type == "path" then
paths[pathCount][name] = value
elseif type == "floor" then
floors[floorCount][name] = value
end
end
--======================--
--// Rotation Methods \\--
--======================--
function setRadarRotation(lv)
local cp = lv*Vector3.new(1,0,1)
local cr = up:Cross(unit0)
local ang = math.acos(cp.unit:Dot(unit0))
ang = (cp.unit:Dot(cr) < 0) and 2*math.pi - ang or ang
script.Parent.holder.Rotation = ang*degree
for i, blip in pairs(script.Parent.holder:GetChildren()) do
blip.Rotation = 360-script.Parent.holder.Rotation
end
end
function getRotationOfPart(rotY)
if rotY == 90 or rotY == -90 then
return 90
else
return 0
end
end
--==================--
--// Draw Methods \\--
--==================--
function fixPos(blip, x, z)
if x == 1 then
blip.Position = blip.Position - UDim2.new(0,0,0,z/2)
elseif z == 1 then
blip.Position = blip.Position - UDim2.new(0,x/2,0,0)
elseif z == 1 and x == 1 then
else
blip.Position = blip.Position - UDim2.new(0,x/2,0,z/2)
end
end
function drawItem(itemName, posX, posZ, sizeX, sizeZ, rotY)
if posX >= pX - dist and posX <= pX + dist and posZ >= pZ - dist and posZ <= pZ + dist then
local newBlip = blip:Clone()
newBlip.Position = blip.Position + UDim2.new(0, pX - posX, 0, pZ - posZ)
newBlip.Parent = map
newBlip.Rotation = getRotationOfPart(rotY)
newBlip.Name = itemName
newBlip.Size = UDim2.new(0, sizeX, 0, sizeZ)
fixPos(newBlip, sizeX, sizeZ)
if itemName == "wall" then
newBlip.ZIndex = 2
elseif itemName == "path" or itemName == "floor" then
newBlip.ZIndex = 1
end
end
end
--============--
--// Tables \\--
--============--
wait(1) --Giving the server time to populate the tables if player is first in game
tableFunc:InvokeServer("walls")
tableFunc:InvokeServer("floors")
tableFunc:InvokeServer("paths")
--===================--
--// Render Method \\--
--===================--
function updateMap()
map:ClearAllChildren()
local youBlip = blip:Clone()
youBlip.Visible = true
youBlip.Parent = map
local youName = name:Clone()
youName.Parent = map
youName.Visible = true
setRadarRotation(game.Workspace.CurrentCamera.CoordinateFrame.lookVector)
for i, wall in pairs(walls) do
drawItem("wall", wall["posX"], wall["posZ"], wall["sizeX"], wall["sizeZ"], wall["rotation"])
end
for i, Floor in pairs(floors) do
drawItem("floor", Floor["posX"], Floor["posZ"], Floor["sizeX"], Floor["sizeZ"], Floor["rotation"])
end
for i, path in pairs(paths) do
drawItem("path", path["posX"], path["posZ"], path["sizeX"], path["sizeZ"], path["rotation"])
end
end
while wait() do
local selfPos = getItems:InvokeServer("self")
pX, pZ = tonumber(string.sub(selfPos, 0, string.find(selfPos, "::")-1)), tonumber(string.sub(selfPos, string.find(selfPos, "::")+2, string.len(selfPos)))
updateMap()
end
