I am trying to make an infinite trail similar to the ones in paper io that disappear once you enter your territory and reappear when you leave your territory, however the code effects both player’s trails.
The code works perfectly fine when the game is played by one player, however whenever I test it with 2 or more players, when the ‘OnEnterEvent’ or ‘onLeaveEvent’ functions run, the other player’s trail will also reset or destroy. I have tried addressing the local Markers = {} at the start of the script and removing the Markers = {} inside of the onEnterEvent function, but that just makes the script even buggier. I have tried using ‘clickedPlayer’ so that it only effects the player who originally fires the events but nothing seems to be working.
I’m not sure how I could do this but I think connecting the player who fires the event with their own Markers table could make it so it only effects them. If you have any suggestions or potential fixes please post replying to this so I can try them out.
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local event = game.ReplicatedStorage.Play
local event2 = game.ReplicatedStorage.PlayAfterStart
local leaveEvent = game.ReplicatedStorage.LeaveArea
local enterEvent = game.ReplicatedStorage.EnterArea
local REFRESH_RATE = 0 -- how often does it check the character's position
local RESOLUTION_DISTANCE = 1 -- how far does the character need to be from its last position to make a new point
Players.PlayerAdded:Connect(function(Player)
local function DegreeBetweenVectors(a, b)
return math.deg(math.acos(math.clamp(a.Unit:Dot(b.Unit), -1, 1)))
end
local function MakeMarker(Position, Markers, eventerPlayer)
local Marker = Instance.new("Part")
Marker.CanCollide = false
Marker.CanQuery = false
Marker.CanTouch = false
Marker.Size = Vector3.new(0.1, 0.1, 0.1)
Marker.Transparency = 1
Marker.Anchored = true
Marker.Position = Position / 2
Marker.Parent = workspace:WaitForChild(eventerPlayer.Name .. "Trails") -- Replace 'Player' with 'Player.Name'
local Attachment = Instance.new("Attachment")
if #Markers > 1 then
local previousMaker = Markers[#Markers]
Attachment.CFrame = CFrame.lookAt(Marker.Position, previousMaker.Position)
Attachment.Orientation = Attachment.Orientation + Vector3.new(0, 0, 90)
end
Attachment.Parent = Marker
local LastAngle = 0
if #Markers ~= 0 then
local Beam = Instance.new("Beam")
Beam.Attachment0 = Attachment
Beam.Attachment1 = Markers[#Markers]:FindFirstChildOfClass("Attachment")
Beam.Transparency = NumberSequence.new(0)
Beam.Width0 = 1.3
Beam.Width1 = 1.3
Beam.Parent = Marker
Beam.FaceCamera = false
Beam.Color = ColorSequence.new(Color3.new(0.109804, 0.733333, 1))
Beam.LightEmission = 0.01
Beam.LightInfluence = 1
end
table.insert(Markers, Marker)
end
local function onLeaveEvent(clickedPlayer)
local Character = clickedPlayer.Character or clickedPlayer.CharacterAdded:Wait()
local Teams = game:GetService("Teams")
local defaultColour = Color3.new(clickedPlayer.Team)
local ColourMarkerColour = (clickedPlayer.Team and clickedPlayer.Team.TeamColor or defaultColour)
local physicalPlayer = workspace:WaitForChild(clickedPlayer.Name)
local cube = physicalPlayer:WaitForChild("Cube")
cube.BrickColor = ColourMarkerColour
local part = cube:WaitForChild("Part")
local Markers = {}
local LastAngle = 0
local TrailActive = true
local CharacterRemoving = false
local function onEnterEvent()
local markerToDestroy = workspace:WaitForChild(clickedPlayer.Name .. "Trails"):GetChildren()
TrailActive = false
for _, markerDes in ipairs(markerToDestroy) do
print("removing trail")
markerDes:Destroy()
cube:WaitForChild("Trail").Lifetime = 0
end
Markers = {}
end
local function onReEnterEvent(leaveEventPlayer)
TrailActive = true
local workspaceleaveEventPlayer = game.Workspace:WaitForChild(leaveEventPlayer.Name)
workspaceleaveEventPlayer.Cube:WaitForChild("Trail").Lifetime = 0.5
local PreviousTime = os.time()
local heartBeatConnection;
heartBeatConnection = game:GetService("RunService").Heartbeat:Connect(function()
if CharacterRemoving or not TrailActive then
heartBeatConnection:Disconnect()
end
if PreviousTime + REFRESH_RATE < os.time() and TrailActive then
if Character then
local ConsideredPosition = part.Position
if #Markers == 0 or (ConsideredPosition - Markers[#Markers].Position).Magnitude >= RESOLUTION_DISTANCE then
local PreviousMarker = Markers[#Markers]
if #Markers >= 2 then
local DegreesBetween = DegreeBetweenVectors(ConsideredPosition - PreviousMarker.Position, PreviousMarker.Position - Markers[#Markers - 1].Position)
if DegreesBetween < 3 and LastAngle < 3 then
LastAngle = LastAngle + DegreesBetween
return
end
end
MakeMarker(ConsideredPosition, Markers, workspaceleaveEventPlayer)
end
end
end
end)
end
enterEvent.Event:Connect(function(enterEventPlayer)
onEnterEvent(enterEventPlayer)
end)
leaveEvent.Event:Connect(function(leaveEventPlayer)
onReEnterEvent(leaveEventPlayer)
end)
Player.CharacterRemoving:Connect(function()
CharacterRemoving = true
onEnterEvent()
end)
end
event.Event:Connect(function(clickedPlayer)
onLeaveEvent(clickedPlayer)
end)
event2.OnServerEvent:Connect(function(clickedPlayer)
onLeaveEvent(clickedPlayer)
end)
end)