I can’t figure this out. It doesnt have to be finding the specific key, it just would need to be able to find a key under this part. Here is the script here:
while wait(0.1) do
if #list < 25 then
if math.random(1,10) == 1 then
local newbug = fly:Clone()
table.insert(bugslist,newbug)
end
end
if #list ~= 0 then
for _, v in pairs(bugslist) do
if not v['destination'] then
v['destination'] = Vector3.new
end
end
end
end
This line means, “iterate over all the key- value pairs in table bugslist”. So this’ll result in
K1=V1
K2=V2
…
For however many items you have. _ is the key, v is the value. You’re trying to index ‘destination’ on the value, whereas I assume you either want to check if the value is destination, or check if bugslist has a key destination.
--[[
bugslist[key] = value
does key 'destination' exist? Or is there a key, which holds value 'destination?'
Let's check:
]]
for _, v in pairs(bugslist) do
if v == 'destination' then
return v
end
end
if bugslist['destination'] then
-- This checks if there is a key destination in bugslist, if so continue.
end
--[[You don't need a loop to check for a key, you could look at it as being depth 0.
We can instantly check for a key, but to check for a specific value we need to loop through all keys.
table,
| -> key1,
| -> value1,
| -> key2,
| -> value2,
]]
Ok thank you! I simplified this script so it would be an easier flow for you to read. So i still need to use the loop. However I still need to look for a key under the specific value in the table.
for each value i have under the main list i need its position and future position, do you know if theres another way i could do this because i dont think its going to work.
while wait(0.1) do
if #bugslist < 25 then
if math.random(1,10) == 1 then
local newbug = fly:Clone()
newbug.Parent = part
newbug.Position = Vector3.new(A lot of boring math that works)
table.insert(bugslist,newbug)
end
end
if #bugslist ~= 0 then
for _, v in pairs(bugslist) do ---[this is where the problem is]
if #v == 0 then
v['destination'] = Vector3.new(Same boring math)
end
end
end
end
Newbug is a clone of fly, which is a BasePart, not a table I assume (because you’re setting it’s position). Then, you’re adding it to bugslist. When you then run the loop, you’re essentially trying to check #BasePart (which doesn’t work; # is for tables). Then, you’re trying to index ‘destination’ to basepart (which again doesn’t work, as it’s for tables). Fly may be a table, but if it’s a part, you’ll need to make it a table. The way I solve this problem (a table which has a part in it) is
local Fly = {
part=Instance.new("Part"),
destination=Vector3.new(0,0,0),
otherProperty=1,
}
This takes you into the territory of table cloning, which relies on you discerning between shallow and deep copies.
In essence, v is newBug, and newBug is a copy of fly. If fly isn’t a table, #v makes no sense, and v[‘destination’] also doesn’t because fly[‘destination’] doesn’t exist as a property of BasePart.
#bugslist does make sense, because bugslist is a numbered list of fly clones. That means we can fetch the amount of items inside of it. _,v then returns _ (the number of the item it’s at, so always an integer), and v (the returned item, can be many different datatypes).
I was wondering if creating an index under the part itself would be an issue. I will for sure try running the loop this way, I’ll check back and tell you if it works.
That could work, yes, but when cloning fly, it won’t be parented to workspace (even if fly is), so you’ll need to set it to workspace. Also, position/rotation won’t translate to specpart by default.
Ok so i have no errors and this still will not work.
local runservice = game:GetService('RunService')
local fly = workspace.Fly
local part = script.Parent
local partpos = part.Position
local partsiz = part.Size
local bugslist = {}
local studdist = 4
local function rngrot()
return math.random(0,360)
end
local function movetopos(part,X,Y,Z,X1,Y1,Z1)
print('does this work bucko')
if X==X1 then
return error
elseif X<X1 then
part.Position.X += 0.25
else
part.Position.X -= 0.25
end
if Y==Y1 then
return error
elseif Y<Y1 then
part.Position.Y += 0.25
else
part.Position.Y -= 0.25
end
if Z==Z1 then
return error
elseif Z<Z1 then
part.Position.Z += 0.25
else
part.Position.Z -= 0.25
end
end
while wait(5,25) do
if #bugslist < 25 then
local newfly = {
specpart = fly:Clone(),
}
table.insert(bugslist,newfly)
newfly.specpart.Parent = part
newfly.specpart.Position = Vector3.new((math.random(partpos.X-partsiz.X,partpos.X+partsiz.X))/2,(math.random(partpos.Y-partsiz.Y,partpos.Y+partsiz.Y))/2,(math.random(partpos.Z-partsiz.Z,partpos.Z+partsiz.Z)/2))
newfly.specpart.Rotation = Vector3.new(rngrot(),rngrot(),rngrot())
end
if #bugslist ~= 0 then
for _, v in pairs(bugslist) do
local g = v.specpart -- code wouldve been too long and "G" is for geometry instead of "V" as in value
if v['destination'] == nil then
v['destination'] = Vector3.new(math.random(g.Position.X-studdist,g.Position.X+studdist),math.random(g.Position.Y-studdist,g.Position.Y+studdist),math.random(g.Position.Z-studdist,g.Position.Z+studdist))
else
movetopos(g,g.Position.X,g.Position.Y,g.Position.Z,v['destination'].X,v['destination'].Y,v['destination'].Z)
end
end
end
end
Im so done im sending the whole script at this point
I don’t understand what you’re trying to make, but here’s your code refactored a bit to make it readable.
local runservice = game:GetService('RunService')
local fly = workspace.Fly
local part = script.Parent
local partpos = part.Position
local partsiz = part.Size
local bugslist = {}
local studdist = 4
local function rngrot()
return math.random(0,360)
end
local function updatePosition(position, target)
if position == target then
return error
elseif position < target then
return position + 0.25
else
return position - 0.25
end
end
local function movetopos(part, target)
part.Position = Vector3.new(
updatePosition(part.Position.X, target.X),
updatePosition(part.Position.Y, target.Y),
updatePosition(part.Position.Z, target.Z)
)
end
local function randomPosition(center, size)
return Vector3.new(
math.random(center.X - size.X, center.X + size.X) / 2,
math.random(center.Y - size.Y, center.Y + size.Y) / 2,
math.random(center.Z - size.Z, center.Z + size.Z) / 2
)
end
while wait(5) do
if #bugslist < 25 then
local newfly = {
specpart = fly:Clone(),
}
newfly.specpart.Parent = part
newfly.specpart.Position = randomPosition(partpos, partsiz)
newfly.specpart.Rotation = Vector3.new(rngrot(),rngrot(),rngrot())
table.insert(bugslist,newfly)
end
for _, bug in pairs(bugslist) do
local g = bug.specpart
bug.destination = bug.destination or randomPosition(g.Position, Vector3.new(studdist, studdist, studdist))
movetopos(g, bug.destination)
end
end
For here I have sufficiently found and tested if I have the destination. For each fly i have in the script, it should be moving to its random destination within a certain area. I have everything ready and it should be working fine, however it has no errors and fails to work. For a clearer read look at the post by @ExercitusMortem, if you could help that would be very helpful.
as shown here this function should be working. Sorry I somehow missed the simplified version had this part missing.
The problem I have right now is that the part will not move with this function:
local function movetopos(part,X,Y,Z,X1,Y1,Z1)
print('does this work bucko')
if X==X1 then
return error
elseif X<X1 then
part.Position.X += 0.25
else
part.Position.X -= 0.25
end
if Y==Y1 then
return error
elseif Y<Y1 then
part.Position.Y += 0.25
else
part.Position.Y -= 0.25
end
if Z==Z1 then
return error
elseif Z<Z1 then
part.Position.Z += 0.25
else
part.Position.Z -= 0.25
end
end
With the current script i have nowwww. The bug does move around but its destination is staying the same for a few seconds and is stuck in a loop which is weird.
local runservice = game:GetService('RunService')
local fly = workspace.Fly
local part = script.Parent
local partpos = part.Position
local partsiz = part.Size
local bugslist = {}
dv = 5
local function studdist()
if math.random(1,2) == 2 then
return "-"..dv
else
return dv
end
end
local function rngrot()
return math.random(0,360)
end
local function updatePosition(position, target)
if position == target then
return error
elseif position < target then
return position + 0.25
else
return position - 0.25
end
end
local function movetopos(part, target)
part.Position = Vector3.new(
updatePosition(part.Position.X, target.X),
updatePosition(part.Position.Y, target.Y),
updatePosition(part.Position.Z, target.Z)
)
end
local function randomPosition(center, size)
return Vector3.new(
math.random(center.X - size.X, center.X + size.X) / 2,
math.random(center.Y - size.Y, center.Y + size.Y) / 2,
math.random(center.Z - size.Z, center.Z + size.Z) / 2
)
end
while true do
local counter = 0
local finalcount = math.random(5,20)
repeat wait(0.05)
if counter == 0 and #bugslist < 25 then
local newfly = {
specpart = fly:Clone(),
}
newfly.specpart.Parent = part
newfly.specpart.Position = randomPosition(partpos, partsiz)
newfly.specpart.Rotation = Vector3.new(rngrot(),rngrot(),rngrot())
table.insert(bugslist,newfly)
end
if #bugslist ~= 0 then
for _, bug in pairs(bugslist) do
local g = bug.specpart
if bug.destination == bug.specpart.Position then
bug.destination = bug.destination or Vector3.new(
g.Position.X + studdist(),
g.Position.Y + studdist(),
g.Position.Z + studdist()
)
end
bug.destination = bug.destination or Vector3.new( -- I suspect something is wrong here
g.Position.X + studdist(),
g.Position.Y + studdist(),
g.Position.Z + studdist()
)
movetopos(g, bug.destination)
end
end
counter += 0.05
until counter == finalcount
end