I’ve made the exact same replica as him so feel free to use it
MUST ADD THIS ON TOP OF THE FUCTION!
local function getCorners(CFrames, Size)
Size *= 0.5
local Offset = {
Vector3.new( Size.X, Size.Y, Size.Z),
Vector3.new(-Size.X, Size.Y, Size.Z),
Vector3.new( Size.X, -Size.Y, Size.Z),
Vector3.new(-Size.X, -Size.Y, Size.Z),
Vector3.new( Size.X, Size.Y, -Size.Z),
Vector3.new(-Size.X, Size.Y, -Size.Z),
Vector3.new( Size.X, -Size.Y, -Size.Z),
Vector3.new(-Size.X, -Size.Y, -Size.Z),
}
for Edge = 1, #Offset do
Offset[Edge] = (CFrames * CFrame.new(Offset[Edge])).Position
end
return Offset
end
local function MergeKey(Table, KeyName)
local Merged = {}
local Result = {}
for _, Entry in ipairs(Table) do
local Key = Entry[KeyName]
if not Merged[Key] then
Merged[Key] = true
table.insert(Result, Entry)
end
end
return Result
end
GetPartHitPoint
local function GetPartHitPoint(Part, Ignore)
Part.Size += Vector3.one * 0.001
local Corners = getCorners(Part.CFrame, Part.Size)
local HitsData = {}
local overlapParams = OverlapParams.new()
overlapParams.FilterType = Enum.RaycastFilterType.Exclude
overlapParams.FilterDescendantsInstances = {Ignore}
local Touched = workspace:GetPartsInPart(Part, overlapParams)
local EdgePairs = {
{1,2},{1,3},{1,5},
{2,4},{2,6},
{3,4},{3,7},
{4,8},
{5,6},{5,7},
{6,8},{7,8},
}
local ExludeParams = RaycastParams.new()
ExludeParams.FilterType = Enum.RaycastFilterType.Exclude
ExludeParams.FilterDescendantsInstances = {Part, Ignore}
for _, Pair in EdgePairs do
local A, B = Corners[Pair[1]], Corners[Pair[2]]
local Direction = B - A
local ResultPositive = workspace:Raycast(A, Direction + Direction.Unit * 0.001, ExludeParams)
local ResultNegative = workspace:Raycast(B, -Direction -Direction.Unit * 0.001, ExludeParams)
if ResultPositive then
table.insert(HitsData, {
EdgeFrom = A,
EdgeTo = B,
HitPosition = ResultPositive.Position,
Instance = ResultPositive.Instance,
Normal = ResultPositive.Normal
})
end
if ResultNegative then
table.insert(HitsData, {
EdgeFrom = B,
EdgeTo = A,
HitPosition = ResultNegative.Position,
Instance = ResultNegative.Instance,
Normal = ResultNegative.Normal
})
end
end
local IncludeParams = RaycastParams.new()
IncludeParams.FilterType = Enum.RaycastFilterType.Include
IncludeParams.FilterDescendantsInstances = {Part}
for _, Part in Touched do
local Partcorners = getCorners(Part.CFrame, Part.Size)
for _, Pair in EdgePairs do
local A, B = Partcorners[Pair[1]], Partcorners[Pair[2]]
local Direction = B - A
local ResultPositive = workspace:Raycast(A, Direction + Direction.Unit * 0.001, IncludeParams)
local ResultNegative = workspace:Raycast(B, -Direction -Direction.Unit * 0.001, IncludeParams)
if ResultPositive then
table.insert(HitsData, {
EdgeFrom = A,
EdgeTo = B,
HitPosition = ResultPositive.Position,
})
end
if ResultNegative then
table.insert(HitsData, {
EdgeFrom = B,
EdgeTo = A,
HitPosition = ResultNegative.Position,
})
end
end
end
Part.Size -= Vector3.one * 0.001
return MergeKey(HitsData, "HitPosition")
end
GetBoundingBoxHitPoint
local function GetBoundingBoxHitPoint(CFrames, Size, Ignore)
local Part = Instance.new("Part")
Part.CFrame = CFrames
Part.Size = Size + Vector3.one * 0.001
Part.Parent = workspace
local Corners = getCorners(Part.CFrame, Part.Size)
local HitsData = {}
local overlapParams = OverlapParams.new()
overlapParams.FilterType = Enum.RaycastFilterType.Exclude
overlapParams.FilterDescendantsInstances = {Ignore}
local Touched = workspace:GetPartsInPart(Part, overlapParams)
local EdgePairs = {
{1,2},{1,3},{1,5},
{2,4},{2,6},
{3,4},{3,7},
{4,8},
{5,6},{5,7},
{6,8},{7,8},
}
local ExludeParams = RaycastParams.new()
ExludeParams.FilterType = Enum.RaycastFilterType.Exclude
ExludeParams.FilterDescendantsInstances = {Part, Ignore}
for _, Pair in EdgePairs do
local A, B = Corners[Pair[1]], Corners[Pair[2]]
local Direction = B - A
local ResultPositive = workspace:Raycast(A, Direction + Direction.Unit * 0.001, ExludeParams)
local ResultNegative = workspace:Raycast(B, -Direction -Direction.Unit * 0.001, ExludeParams)
if ResultPositive then
table.insert(HitsData, {
EdgeFrom = A,
EdgeTo = B,
HitPosition = ResultPositive.Position,
Instance = ResultPositive.Instance,
Normal = ResultPositive.Normal
})
end
if ResultNegative then
table.insert(HitsData, {
EdgeFrom = B,
EdgeTo = A,
HitPosition = ResultNegative.Position,
Instance = ResultNegative.Instance,
Normal = ResultNegative.Normal
})
end
end
local IncludeParams = RaycastParams.new()
IncludeParams.FilterType = Enum.RaycastFilterType.Include
IncludeParams.FilterDescendantsInstances = {Part}
for _, Part in Touched do
local Partcorners = getCorners(Part.CFrame, Part.Size)
for _, Pair in EdgePairs do
local A, B = Partcorners[Pair[1]], Partcorners[Pair[2]]
local Direction = B - A
local ResultPositive = workspace:Raycast(A, Direction + Direction.Unit * 0.001, IncludeParams)
local ResultNegative = workspace:Raycast(B, -Direction -Direction.Unit * 0.001, IncludeParams)
if ResultPositive then
table.insert(HitsData, {
EdgeFrom = A,
EdgeTo = B,
HitPosition = ResultPositive.Position,
})
end
if ResultNegative then
table.insert(HitsData, {
EdgeFrom = B,
EdgeTo = A,
HitPosition = ResultNegative.Position,
})
end
end
end
Part:Destroy()
return MergeKey(HitsData, "HitPosition")
end