I have an enemy using roblox pathfinding, the enemy gets to the player super easy. But the problem is that as long as the player is running, the enemy keeps going to where the player was 1 frame earlier and just will never reach the player.
Increasing the speed can work, but only if its so incredible high that its like 4x the players speed and that messes with the point of the game.
Is there a way around this such as ways for it to calculate where the player is going to be, or other methods to help the enemy reach the player whilst the player is running
#Pathfinding not catching player
1 messages · Page 1 of 1 (latest)
how would the npc find what player is closest if its on client side?
server sends data to client
** You are now Level 2! **
client move npc
Alright ill give this a go
so should i be using an event using :FireAllClients for this? And if so then how accurate will it show the enemy for the clients?
set the networkownership of that npc's humanoidrootpart to the player you want to be chased, and then fire the remoteevent to that player
I want the npc to be in the same spot for all clients, and only target 1 player a time. The reason i put it on the server was so it appears for all players at the same time, is that still possible on the client?
yes, thats why you set the networkownership to that player
Im confused, what does networkownership do?
it basically gives the client permission to replicate it to other clients
okay, so how do i set the networkownership to the player, and should i be doing that through the server?
HumanoidRootPart:SetNetworkOwner(player)
do it on the server
and dont forget to check HumanoidRootPart:CanSetNetworkOwnership()
okay so i set the network owner of the root part every time it finds a player on my RunService.Heartbeat
if it finds a player then it will do its calculations and then send an event with :FireAllClients that will move the npc?
And with the CanSetNetworkOwnership, does this have to be done through scripts as i cant find it in the properties?
CanSetNetworkOwnership just returns a boolean
do the calculations and executions on client
So how do i make sure that i can set the network ownership?
wait
i think i understand
you check first then do
yea
cuz
it will fail if you cant setnetworkownership
like if the rootpart is anchored
so you check with that
ahh i see okay, so let me just move everything over to the client, and then if i find any problems ill come back
thank you so much so far btw
Okay got a question, so you said that the network ownership replicates the script from the network owners script. How do i make it do that, or does it do that automatically?
it does it automatically, the server will check where your rig position on the client is and replicates it to other clients
and this replicates on :FireAllClients, or where does this occur?
you dont have to do anything to replicate it, the server will do it for you
** You are now Level 3! **
and after firing client, it will just update all other clients
yep
thats actually really helpful and cool, i never knew this
this will definitely help me in future too hah
so basically
server > your client > server > other clients
got it
keep in mind exploiters (cheaters) can manipulate the server and move the rig somewhere else, but we dont talk about that
Im aware of this, but from what iv learnt so far, i find it best to ignore the cheating factor until iv mastered more skills in scripting
yea i find it hard to deal with them without messing up your game with a bunch of checks
it makes my coding so messy all the time, i mean seriously, why would i want to mess up my beautiful structuring
look at it
So neatly layed out
networkownership is the reason why exploiters go to natural disaster survival
haha thats fair
theyre doing everything they can with the debris 😭
making it orbit into them and things
what is it?
When im firing the client, i need the player on the other side, would i do it like usual with network owner, so Players.LocalPlayer or would i find the network owner and that be the player
or do i send it twice the the event
like this
thats what i thought, but i thought that might interrupt the other players when it replicates the script
when i said "does it automatically", i meant the server does it physically, not with fireallclients or smth, lemme show u
because right here im setting the nearestPlayer to Player.LocalPlayer and if the script is replicated, surely that would make the enemy move to the each player instead of the network owner
it doesnt matter, it replicates with physics meaning everytime the rig moves on your client, it will send that position to the server automatically and updates it if the client has a networkownership on that part
okay, so in the script that i sent, using Players.LocalPlayer for nearestPlayer wont interfere with the idea of the enemy moving to 1 specific player?
nope
because
you basically send a message to the client "hey you're the one being chased, move the enemy to your character!"
and because that client has a networkownership on the humanoidrootpart, it will automatically appear on other players
okay thats good, im getting alot of errors, so im gonna try to get these out the way and then ill see if i run into another issue
okay, so when firing the event it needs the player, i currently have the character but when i use :GetPlayerFromCharacter() it doesnt seem to work, it just says its not a valid member of model
okay so now im confused
not by what you sent
but im using a function rn to get the nearest player
yes
the function returns the player.Character which is fine
yep
then when it gets down to firing the event i want to get the player so i use nearestPlayer:GetPlayerFromCharacter()
okay, to what?
make it return the player instead of character
i tried that, but then i get weirder messages in errors
what is the error
yeah
ignore "player argument must be a Player object"
wait
thats because i have "player" in there
whats line 35
nearestPlayer doesnt exist
ah
if not nearestPlayer then return end
what is it now
alr
no errors now
okay lemme test with the enemy
wellll it works better
but even with a really fast enemy, the enemy is closer but still like 1 stud behind the player
just out of range
i guess best fix is to make the enemy hitbox slightly bigger
yes
** You are now Level 20! **
dude what
** You are now Level 4! **
he got summoned or smth
what is it
Escape Scotland
huh
its actually so cursed im not joking
i made it bigger its good now
you wanna test the game
its really good
the audio is the best part
you can test out the creation you helped me make
whats your rblx user
miko100karakter
i meannn
can you send game links here?
you can
this is great
yeaa
your added btw you can join
hol on
i need honest review tho, if i finished this game do you think it would be front page?
wait wait
whatsup
but
why you not respawning
also, why does he stand still for like 5 seconds after killing someone?
wait im gonna kill you
ok yeah safe to say this game is realistic
you cant respawn
js do
game.Players.miko100karakter:LoadCharacterAsync()
okay
phew
he takes too long to change targets
also, i need to add a check to see if the player is reachable, how do i do that?
like if there is pathing to them
oh
if theres no pathing to nearestPlayer them ignore them
i remember something about pathfinding yeah
idk though
hold on
so basically
if the path doesnt exist, ignore nearestPlayer?
theres a code sample
``local Workspace = game:GetService("Workspace")
local PathfindingService = game:GetService("PathfindingService")
-- This model contains a start, end and three paths between the player can walk on: Snow, Metal and LeafyGrass
local PathOptionsModel = script.Parent.PathOptions
local startPosition = PathOptionsModel.Start.Position
local finishPosition = PathOptionsModel.End.Position
-- Create a path that avoids Snow and Metal materials
-- This will ensure the path created avoids the Snow and Metal paths and guides
-- the user towards the LeafyGrass path
local path = PathfindingService:CreatePath({
AgentRadius = 3,
AgentHeight = 6,
AgentCanJump = false,
Costs = {
Snow = math.huge,
Metal = math.huge,
},
})
-- Compute the path
local success, errorMessage = pcall(function()
path:ComputeAsync(startPosition, finishPosition)
end)
-- Confirm the computation was successful
if success and path.Status == Enum.PathStatus.Success then
-- For each waypoint, create a part to visualize the path
for _, waypoint in path:GetWaypoints() do
local part = Instance.new("Part")
part.Position = waypoint.Position
part.Size = Vector3.new(0.5, 0.5, 0.5)
part.Color = Color3.new(1, 0, 1)
part.Anchored = true
part.CanCollide = false
part.Parent = Workspace
end
else
print(Path unable to be computed, error: {errorMessage})
end``
is it this?
-- Compute the path
local success, errorMessage = pcall(function()
path:ComputeAsync(startPosition, finishPosition)
end)
yes
i think there should also be one on the server
how do i do that?
okay this is too complicated now, im just gonna send both scripts to make this easier
alr
-- CLIENT
--// Services
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
--// Variables
local enemy = workspace:WaitForChild("Section1").Enemy
local humanoid = enemy:WaitForChild("Humanoid")
local rootPart = enemy:WaitForChild("HumanoidRootPart")
--// Move Enemy
local function MoveTo(targetPos)
local path = PathfindingService:CreatePath({
AgentRadius = 8,
})
path:ComputeAsync(rootPart.Position, targetPos)
if path.Status == Enum.PathStatus.Success then
for _, waypoint in pairs(path:GetWaypoints()) do
humanoid:MoveTo(waypoint.Position)
humanoid.MoveToFinished:Wait()
end
else
end
end
--// Calculate Move
local function CalculateMove()
local nearestPlayer = Players.LocalPlayer.Character
local targetRootPart = nearestPlayer:WaitForChild("HumanoidRootPart")
local targetHumanoid = nearestPlayer:WaitForChild("Humanoid")
if targetHumanoid == nil then return end
local distance = (targetRootPart.Position - rootPart.Position).Magnitude
MoveTo(targetRootPart.Position)
end
--// Connections
ReplicatedStorage.RemoteEvents.MoveEnemy.OnClientEvent:Connect(CalculateMove)
-- SERVER
--// Services
local Players = game:GetService("Players")
local PathfindingService = game:GetService("PathfindingService")
local RunService = game:GetService("RunService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
--// Variables
local enemy = workspace.Section1.Enemy
local humanoid = enemy:WaitForChild("Humanoid")
local rootPart = enemy:WaitForChild("HumanoidRootPart")
--// Find Player
local function DetectPlayer()
local nearestPlayer = nil
local shortestDistance = math.huge
for _, player in pairs(Players:GetPlayers()) do
if player.Character and player.Character:FindFirstChild("HumanoidRootPart") then
local distance = (player.Character.HumanoidRootPart.Position - rootPart.Position).Magnitude
if distance < shortestDistance then
shortestDistance = distance
nearestPlayer = player
end
end
end
return nearestPlayer
end
--// Main Loop
RunService.Heartbeat:Connect(function()
if humanoid.Health <= 0 then return end
local nearestPlayer = DetectPlayer()
if nearestPlayer == nil then return end
if nearestPlayer.Character == nil then return end
if nearestPlayer.Character.Humanoid.Health <= 0 then return end
rootPart:SetNetworkOwner(nearestPlayer)
ReplicatedStorage.RemoteEvents.MoveEnemy:FireClient(nearestPlayer)
end)
--// Kill Player
rootPart.Touched:Connect(function(hit)
local character = hit.Parent
local humanoid = character:FindFirstChild("Humanoid")
if humanoid and humanoid.Health > 0 then
humanoid.Health = 0
rootPart.AttackSound:Play()
end
end)
alr ill send u the script again
** You are now Level 5! **
hol up
sorry for letting you take over, its 3am for me so now im less enticed to learn and more enticed to get it done so i can sleep 😭
lmao its alr 10am for me
wait uh
make a remotefunction
ReplicatedStorage.RemoteFunctions.MoveEnemy
ok, also you should change remoteevent to unreliableremoteevent for performance reasons
im confused
its exactly the same, so you dont need to change anything codewise
unreliable is just basically a light version of remoteevent, it drops an event if it fails to fire instead of waiting
okay got it
bcuz youre using HeartBeat its gonna kill the performance using a normal remoteevent yk
okay understood
buddy
stop skidding
with ai
use ur own mental capacity
if u have some
I dont use ai...?
dont lie son
why would i lie
i literally dont use ai
infact i do, i used it on my last game to solve some math i didnt want to do, thats about it really
lmao, i remember someone calling me using ai when helping someone in hiddendev too
I can see why people say its ai, i write too neat
ye u do
i have OCD so im hella organised with my code and love to simplify so much
ive seen so many ai skidded code snippets
that i can detect whenever someone is skidding with ai
legit every time they try hiding it when its CLEARLY so obvious
from the unusual comments to the variable names to the logic
SO obviously ai skidde
d
Im mostly against AI because of environmental reasons, but i like it for insperation and generating ideas
@broken crow do you have any updates
ykw
--// Services
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
--// Variables
local enemy = workspace.Section1.Enemy
local humanoid = enemy:WaitForChild("Humanoid")
local rootPart = enemy:WaitForChild("HumanoidRootPart")
--// Find Player
local function DetectPlayer()
local nearestPlayer = nil
local shortestDistance = math.huge
for _, player in pairs(Players:GetPlayers()) do
if player.Character and player.Character:FindFirstChild("HumanoidRootPart") then
local check = ReplicatedStorage.RemoteFunctions.MoveEnemy:InvokeClient(player, rootPart.Position)
if check ~= true then continue end
local distance = (player.Character.HumanoidRootPart.Position - rootPart.Position).Magnitude
if distance < shortestDistance then
shortestDistance = distance
nearestPlayer = player
end
end
end
return nearestPlayer
end
--// Main Loop
RunService.Heartbeat:Connect(function()
if humanoid.Health <= 0 then return end
local nearestPlayer = DetectPlayer()
if nearestPlayer == nil then return end
if nearestPlayer.Character == nil then return end
if nearestPlayer.Character.Humanoid.Health <= 0 then return end
rootPart:SetNetworkOwner(nearestPlayer)
ReplicatedStorage.RemoteEvents.MoveEnemy:FireClient(nearestPlayer)
end)
--// Kill Player
rootPart.Touched:Connect(function(hit)
local character = hit.Parent
local humanoid = character:FindFirstChild("Humanoid")
if humanoid and humanoid.Health > 0 then
humanoid.Health = 0
rootPart.AttackSound:Play()
end
end)```
--// Services
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
--// Variables
local enemy = workspace:WaitForChild("Section1").Enemy
local humanoid = enemy:WaitForChild("Humanoid")
local rootPart = enemy:WaitForChild("HumanoidRootPart")
--// Move Enemy
local function MoveTo(targetPos)
local path = PathfindingService:CreatePath({
AgentRadius = 8,
})
path:ComputeAsync(rootPart.Position, targetPos)
if path.Status == Enum.PathStatus.Success then
for _, waypoint in pairs(path:GetWaypoints()) do
humanoid:MoveTo(waypoint.Position)
humanoid.MoveToFinished:Wait()
end
else
end
end
--// Calculate Move
local function CalculateMove()
local nearestPlayer = Players.LocalPlayer.Character
local targetRootPart = nearestPlayer:WaitForChild("HumanoidRootPart")
local targetHumanoid = nearestPlayer:WaitForChild("Humanoid")
if targetHumanoid == nil then return end
local distance = (targetRootPart.Position - rootPart.Position).Magnitude
MoveTo(targetRootPart.Position)
end
--// Check
local function Check(targetPos)
local path = PathfindingService:CreatePath({
AgentRadius = 8,
})
path:ComputeAsync(rootPart.Position, targetPos)
return path.Status == Enum.PathStatus.Success and true or false
end
--// Connections
ReplicatedStorage.RemoteEvents.MoveEnemy.OnClientEvent:Connect(CalculateMove)
ReplicatedStorage.RemoteFunctions.MoveEnemy.OnClientInvoke = Check```
what did you change, i dont like copy pasting
LOLL
okie dokie
this is on the client
--// Check
local function Check(targetPos)
local path = PathfindingService:CreatePath({
AgentRadius = 8,
})
path:ComputeAsync(rootPart.Position, targetPos)
return path.Status == Enum.PathStatus.Success and true or false
end
ReplicatedStorage.RemoteFunctions.MoveEnemy.OnClientInvoke = Check
bro iv already told you its not...
Because its perfect and pretty its all of a sudden AI
its code
I like organisation, if all your gonna do is critisize people on there code you can fuck off else where
hi hemmy
idk man, ai wouldve complete these agent thingies and put comments everywhere they can
3rdzs happens to think my code is AI generated because i love organisation
no this isn't AI
I know AI code
there would be comments
that are way more detailed
?
You can delete comments
???
my code is simple, i love relying on fundamentals
we have something called "delete"
You have very descriptive variable names
do u not see the variable names
why are we here anyway
and the logics
u can use velocity prediction to go to where the player is walking towards

dang
totally it's easy
holy how many people are there
am I looking at the wrong code
i was told to open this thread to see what op was saying

yes it's banned where i live for telling someone to do something bad to themself
and i was disappointed
lets go back to scripting drastic
it's not fun here
real
😠
where
idk
@worldly granite
do u not see this?!?
Ok but come on nobody types out humanoid and all the service names and shortest distance etc the variable names scream ai
fr
how r u not referencing the player
This would have been useful sooner but we have solved that issue now, we are currently trying to workout how to get the npc to ignore the nearest player if they arnt able to get to them
i do
Can we see your ide
pairs and ipaits
you can check if the pathasync thing fails probably
If it’s luau lsp I understand the variable names ig
in what place would ai be banned just for simply being ai 😭
even without variable names
the logic
talking about this?
mental capacity
@broken crow was it only this you added on server?
local check = ReplicatedStorage.RemoteFunctions.MoveEnemy:InvokeClient(player, rootPart.Position)
if check ~= true then continue end
yes
I do
okay ill test rq
but not straight up
I make it do all the mundane tasks for me
copying and pasting
so I can focus on the important things
then saying that U coded it
infact, can you join the game again to test, i just republished
alr
AI -> useful learning tool and useful for mundane shi

this is highkey fact it just get's to a point where if you let it code your entire game then I'd say that's a horrible idea but when it come's down to using it for simple thing's like debugging and small thing's inside your code you don't feel like doing or don't know how to do then it's fine.
yes 😂
Yeah its good for learning but to me its like a thing that cuts us 70/30 with less getting a net positive in terms of critical thinking bc I use it to learn sometimes but I also hate using it it’s depressing
why am i being accused of using AI? Do i really have to show you my AI chatlogs from 3 months ago when i was figuring out bezier curves for my TD game
yes
i agree
Show us your ide
whats ide?
Like the Roblox code window
@sick owl check dev console
I use it to mass produce slop because I love money
its clear
sameeee
ok vro
i just said allat shit to look smart i don't know shit about coding fr
** You are now Level 3! **
clear log
Integrated development environment
we can tell
ye but like
it's roblox
it aint allat
Notepad is an ide ppl love to say that don’t they
hey that's so nice of you to say!
who the sun
lol no

making slop -> makes me money
why are we talking about ai now
@broken crow I got something!
hey ik everyone here make's like 100k robux easily so can one of you highkey slide me a slight million
welcome to pro league
no thats bcuz u left during it
check MoveEnemy:InvokeClient
thank god
make sure to make some games with actual effort
woah nice to be apart of that sounds cool now how do i get cool red role like you
u stupid skids

Watch a video on how to use a debugger it is a very good investment
by learning how to code
don't make me skid check u
Why was I pulled here from scripting
Oh what if i know how to code
i use prints alot, never figured out debuggers. But ill definitely look into it
then apply for a skill rating
Bro is about to get fried
Tru
almost 500 msgs js from the ai allegations 😭
@broken crow okay so, its returning false every now and again, but thats about it
Pyro gonna burn him
literally just because im organised i get accused of using AI, like whats wrong with people
Idk I use ai to format my scripts idc what ppl say 😂
I use AI for math and curves, thats about it
It might not be ai it might be based on tutorials
game.Work = yes work please or imma cry = yes
guys would this work?
game:Destroy() = pleasework
@sick owl might be better off invoking the client to move the npc, and then you check from there?
@broken crow so if i remove the if check ~= true then continue end, it works but the enemy tweaks out
If not a debugger then debug by hand
Step thru the code in your mind and write out and change the variable values as you go?
returns false, but like once every 10 tries
@sick owl you should make a new thread about this, the previous issue is fixed
well it still doesnt work, but i removed the "and true or false" on the end of return path.Status
was more consistent with its responses
game me constant false
that one returns true if path.Status is success, and returns false if path.Status isnt success
what did it say
it gives me nil for a while, then a spam list of my user, then goes back to nil for ages, even though im outside and waiting for it
lots of nil
you know what
i think its to do with the invoke
just check if the player is inside that safezone instead of checking with pathfindingservice, i think its too inconsistent
How do i check that?
make a big box with cancollide checked off, massless checked on, and anchored checked on covering your safezone
can i use player.IsTouching?
wdym?
im confused
with what
could i do part:GetTouchingParts() and then check if anything touching.Parent has a humanoid
yeah but you need to do that every frame
wherevver you like
** You are now Level 6! **
hol on
safezone.Touched:Connect(function(hit)
if game.Players:GetPlayerFromCharacter(hit.Parent) then
game.Players:GetPlayerFromCharacter(hit.Parent):AddTag("Safezone")
end
end)
safezone.TouchEnded:Connect(function(hit)
if game.Players:GetPlayerFromCharacter(hit.Parent) then
game.Players:GetPlayerFromCharacter(hit.Parent):RemoveTag("Safezone")
end
end)```
ahh i se
keep in mind that these are inconsistent as theyre relying on physics, but i think its worth the performance you get
then just put if player:HasTag("Safezone") then continue end on your detectplayer function
yes
you still invokeclient
on the server
wait no
thats a remoteenvet
you deleted the remoteevent connection on the client 😭
no i didnt
this might be because you made me change my remoteEvent for an unreliable one
no, thats not a specific error for unreliableremoteevent
that might happen because the event fired before client gets to connect it
yeah do whatever works
why does the unreliable one not work//
maybe thats also why the check you added didnt work
maybe it did, but the unreliable event sucks
join my game so we can see if it works with proximity
k
ill bait it to the front door and stand close, you go out the other door and keep a far distance
if he goes for you, then it works
well
yes
** You are now Level 16! **
he doesnt work now
i did 😭
bru
return means it will ignore every other player too 😭
do i just do "then end" ?
so if they have safezone tag then continue?????
yes
why???
ohhhh
yes
published
yeaaa
perfect
can we check the 5 second wait it does after kill
lemme die
just stand outside
oaky
huh
so i know the problem
what is it
the player still exists when they are dead
oh yeah
just need another check to see if their health is 0
maybe 1000
600 because of the "ITS AI" skids
yeah
if player.Character.Humanoid.Health <= 0 then continue end
go outside when i go out
now
where are you
i think you need to fix the respawn problem 😭 😭
not my fault
maybe
didnt change any respawn settings 😭
put the rootpart.Touched event on the client
also they set the default of BreakJointsOnDeath to false
thats crazy
should it be true
doesnt matter
its the reason deaths look realistic now
like
your joints dont break
factsss
its gonna be a puzzle game
so you have to solve puzzes to escape from scotland
😭
bro
come outside?
well
OH
it doesnt update because yk
how do i fix that
we ignored
maybe update the networkownership for every possible player being chased? idrk
since i have 300 ping, its gonna look choppy on you
it does
and vice versa
wait
so how do i change the network ownershi
rn its doing it for every frame so idk
if rootPart:CanSetNetworkOwnership() then rootPart:SetNetworkOwner(nearestPlayer) end
more i think
yea
would that make a difference?
maybe? did you check the console
thats just to prevent error
there was nothing in console
rootPart:GetNetworkOwner()
i see
but he doesnt continue to chase me when im in the safezone
thats because of the tag
OH
no
you need to
set networkownership to nil
so that the server owns it
before continue
okay
do it on health too
if player.Character.Humanoid.Health <= 0 then rootPart:SetNetworkOwner(nil) continue end
yea
republished
try now
try
its not nil
but itdoesnt move?
oh...
i think its "continue"
continue js means it will move onto the next player in Players:GetPlayers()
lemme try fundamental stuff
instead of js straight up giving up
yeah see
server or client
server
yea
and then
put stuff that make it so npc can chase you
like
player.Character.Humanoid.Heatlh > 0
and player:HasTag("Safezone")
** You are now Level 7! **
no
put distance inside if canChase then
and then put
else
rootPart:SetNetworkOwner(nil)
end
put everything else below distnace too
return player.Character.Humanoid.Health > 0 and
not player:HasTag("Safezone")
end
local canChase = Check(player)
if canChase then
local distance = (player.Character.HumanoidRootPart.Position - rootPart.Position).Magnitude
if distance < shortestDistance then
shortestDistance = distance
nearestPlayer = player
end
else
rootPart:SetNetworkOwner(nil)
end```
yes
sooo
i found an issue
for some reason i dont have the tag
i printed the tag for myself and there is none
nvm
huh
yeah its not on the character
so if you want to add anything in the future that makes it so you cant get chased, add in on the check function
no
i just rejoined
huhhh
k
am i still the owner
oh
it should be nil in zone right?
i moved network owner to here
im owner rn
if your closer its you
the zone does nothing
didnt it do something like 30 minutes ago
am i tripping
it does
you just need to be closer
i think its because of the shortestDistance???
same thing
if this results in nothing, you should just be focusing on the gameplay
whys that
well it does, just not that great
if youre still going to try and fix this problem, you will be demotivated by the time you make the game works
okay so
what print did you add
current prints are like this
which is bad
so the problem is with the tag check
what if instead of a tag, we use an attribute?
why
idk, why not
yea true or false
huh
earlier on
i said to kill the player on client, not set the tag
after made it, you said along side some other things: "Move that over to the client"
i cant be bothered to go back and prove it, so just believe me on that
solved
k
lmao
how
because of the safezone
😭
yea ill just have it at jump height
not too high
safe to say
this might be front page
oh yeah
my gf has been nagging me for 3 hours
dam
wym dam
nothing
also found something funny
if you walk into the wall when your outside it gives you the tag so he stops moving
ill just make that smalelr and then sleep
ight im gonna go sleep, thanks so much for all yhe help bro
your a legend