Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local ReplicatedStorage = game:GetService("ReplicatedStorage")
- local UserInputService = game:GetService("UserInputService")
- local Matter = require(ReplicatedStorage.Shared.Libs.Matter)
- local Components = require(ReplicatedStorage.Shared.Components)
- local Constants = require(ReplicatedStorage.Shared.Constants)
- local GetEntityGlobalScale = require(ReplicatedStorage.Shared.Utils.GetEntityGlobalScale)
- local GetEntityGlobalPosition = require(ReplicatedStorage.Shared.Utils.GetEntityGlobalPosition)
- local GetEntityDescendants = require(ReplicatedStorage.Shared.Utils.GetEntityDescendants)
- local function FireRaycast(origin, direction, entities, world)
- if type(entities) == "number" then
- entities = GetEntityDescendants(entities, world)
- end
- local closestHitDistance = math.huge
- local closestHitNormal = nil
- local closestHitPosition = nil
- local closestHit = nil
- for _, id in entities do
- local transform = world:get(id, Components.Transform)
- if not transform then
- continue
- end
- local collider = world:get(id, Components.Collider)
- if not collider then
- continue
- end
- local globalSize = GetEntityGlobalScale(id, world) * collider.Size
- local globalPosition = GetEntityGlobalPosition(id, world)
- local tp = globalPosition - globalSize / 2
- local br = globalPosition + globalSize / 2
- local t1 = (tp - origin) / direction
- local t2 = (br - origin) / direction
- local entryTimeX = math.max(math.min(t1.X, t2.X), 0)
- local exitTimeX = math.min(math.max(t1.X, t2.X), 1)
- local entryTimeY = math.max(math.min(t1.Y, t2.Y), 0)
- local exitTimeY = math.min(math.max(t1.Y, t2.Y), 1)
- if entryTimeX > exitTimeY or entryTimeY > exitTimeX then
- continue
- end
- local hitDistance = math.max(entryTimeX, entryTimeY)
- if hitDistance >= closestHitDistance then
- continue
- end
- closestHitPosition = origin + direction * hitDistance
- closestHitDistance = hitDistance
- closestHit = id
- if entryTimeX > entryTimeY then
- if t1.X < t2.X then
- closestHitNormal = Vector2.new(-1, 0)
- else
- closestHitNormal = Vector2.new(1, 0)
- end
- else
- if t1.Y < t2.Y then
- closestHitNormal = Vector2.new(0, -1)
- else
- closestHitNormal = Vector2.new(0, 1)
- end
- end
- end
- if closestHitNormal then
- return {
- Position = closestHitPosition,
- Normal = closestHitNormal,
- Hit = closestHit,
- }
- end
- return false
- end
- return FireRaycast
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement