Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Generated blocks' coordinate doesn't register/read correctly. What's the problem?

Asked by
SCP774 191
5 years ago

I'm currently working solo on a mining simulator game. Everything went smooth in the development at first until I encountered this problem. I was not able to solve this problem for over 3 days and it have been denying me to have any further development.

The issue that I'm having can be quite complicated. I'll try to provide as much information as possible and explain it as best as I can.

So, when a player mines a block. New blocks will be generated in all directions. Their coord will be logged so generated coordinates won't be regenerated. However, there is something wrong with the register process or the reading process. Allowing generated coordinates to be regenerated. I can't find anything wrong in my script.

Here's my script, (Only the related portions)

local mine = workspace:WaitForChild("Mine")
--Modules
local layerModule = require(rep.Modules:WaitForChild("LayerModule"))
local oreModule = require(rep.Modules:WaitForChild("OreModule"))
--Tables
local generatedBlocks = {Vector3.new(0, 0, 0), Vector3.new(0, 1, 0))
local mineOreEvent = rep.Remotes:WaitForChild("MineOreEvent")
local getPlayerZoneFunc = rep.Remotes:WaitForChild("GetPlayerZoneFunc")
local function checkOrePosAvailability(orePos) -- see if a position is already generated or not

local bool

for i,v in pairs(generatedBlocks) do

if orePos == v then

bool = false

break

else bool = true

end

end

print(bool)

if (orePos.X > 24 or orePos.X < 0 or orePos.Z > 24 or orePos.Z < 24) and orePos.Y == -25 then

bool = "bedrock"

end

return bool

end



local function getMaxBlock() -- for remote function

return maximumBlocks

end



local function generateBlockAtPos(orePos, oldOre, moveVector)

local blockLayer, layerInfo = layerModule.findLayer(orePos.Y)

local randomOreForLayer = oreModule.getRandomOreForLayer(blockLayer)

local clonedBlock = serverStorage.Blocks:FindFirstChild(randomOreForLayer):Clone()

local newOrePosValue = Instance.new("Vector3Value")

newOrePosValue.Name = "OrePos"

newOrePosValue.Value = orePos + moveVector

newOrePosValue.Parent = clonedBlock

local newOreTypeValue = Instance.new("StringValue")

newOreTypeValue.Name = "OreType"

newOreTypeValue.Value = clonedBlock.Name

newOreTypeValue.Parent = clonedBlock

clonedBlock.Position = oldOre.Position + (moveVector * oldOre.Size.X)

clonedBlock.Color = layerInfo.color

table.insert(generatedBlocks, #generatedBlocks + 1, newOrePosValue.Value)

clonedBlock.Parent = mine

end



local function generateBedrockAtPos(orePos, oldOre, moveVector)

local clonedBlock = serverStorage.Blocks:FindFirstChild("Bedrock"):Clone()

local newOrePosValue = Instance.new("Vector3Value")

newOrePosValue.Name = "OrePos"

newOrePosValue.Value = orePos + moveVector

newOrePosValue.Parent = clonedBlock

local newOreTypeValue = Instance.new("StringValue")

newOreTypeValue.Name = "OreType"

newOreTypeValue.Value = clonedBlock.Name

newOreTypeValue.Parent = clonedBlock

clonedBlock.Position = oldOre.Position + (moveVector * oldOre.Size.X)

table.insert(generatedBlocks, #generatedBlocks + 1, newOrePosValue.Value)

clonedBlock.Parent = mine

end



--Events

mineOreEvent.OnServerEvent:Connect(function(plr, ore)

local oreType = ore:FindFirstChild("OreType").Value

local orePos = ore:FindFirstChild("OrePos").Value

local newPos = orePos


-- generate +X block

newPos = orePos + Vector3.new(1, 0, 0)

local PXAvailability = checkOrePosAvailability(newPos)

print(PXAvailability, newPos)

if PXAvailability == true then

generateBlockAtPos(newPos, ore, Vector3.new(1, 0, 0))

elseif PXAvailability == "bedrock" then

generateBedrockAtPos(newPos, ore, Vector3.new(1, 0, 0))

end

-- generate -X block

newPos = orePos - Vector3.new(1, 0, 0)

local MXAvailability = checkOrePosAvailability(newPos)

print(MXAvailability, newPos)

if MXAvailability == true then

generateBlockAtPos(newPos, ore, Vector3.new(-1, 0, 0))

elseif MXAvailability == "bedrock" then

generateBedrockAtPos(newPos, ore, Vector3.new(-1, 0, 0))

end

-- generate +Y block

newPos = orePos + Vector3.new(0, 1, 0)

local PYAvailability = checkOrePosAvailability(newPos)

print(PYAvailability, newPos)

if PYAvailability == true then

generateBlockAtPos(newPos, ore, Vector3.new(0, 1, 0))

elseif PYAvailability == "bedrock" then

generateBedrockAtPos(newPos, ore, Vector3.new(0, 1, 0))

end

-- generate -Y block

newPos = orePos - Vector3.new(0, 1, 0)

local MYAvailability = checkOrePosAvailability(newPos)

print(MYAvailability, newPos)

if MYAvailability == true then

generateBlockAtPos(newPos, ore, Vector3.new(0, -1, 0))

elseif MYAvailability == "bedrock" then

generateBedrockAtPos(newPos, ore, Vector3.new(0, -1, 0))

end

-- generate +Z block

newPos = orePos + Vector3.new(0, 0, 1)

local PZAvailability = checkOrePosAvailability(newPos)

print(PZAvailability, newPos)

if PZAvailability == true then

generateBlockAtPos(newPos, ore, Vector3.new(0, 0, 1))

elseif PZAvailability == "bedrock" then

generateBedrockAtPos(newPos, ore, Vector3.new(0, 0, 1))

end

-- generate -Z block

newPos = orePos - Vector3.new(0, 0, 1)

local MZAvailability = checkOrePosAvailability(newPos)

print(MZAvailability, newPos)

if MZAvailability == true then

generateBlockAtPos(newPos, ore, Vector3.new(0, 0, -1))

elseif MZAvailability == "bedrock" then

generateBedrockAtPos(newPos, ore, Vector3.new(0, 0, -1))

end

ore:Destroy()

end)

The script is organized and formatted in the real script but because I copied and pasted it, it's not formatted.

Here's the problem I'm facing in a video: Click me to view the video

I'm 100% sure that there is nothing wrong with the pickaxe. I've debugged it and checked everything and confirmed that the pickaxe has nothing to do with this issue.

If you can solve my problem, a million thanks.

Sincerely, TheRobloxPlayer2509

Answer this question