hello,im making a rpg game. i want the block to break if you get attacked from behind. just like on gpo and tsbg. in my combat system when you block, a tag named “blocking” gets added to your character. and in my hitbox system, if hitbox hits an enemy that haves blocking tag, the hitbox loop breaks. can you help me?
You can check if the person that is attacking the player is infront of the player using the CFrames of the two humanoidrootparts.
can you explain it a bit more please?
do ya know strongest battlegrounds? If you hit from behind, you won’t block it
so you get damaged, but in this case, he want to break the block instead of hit the player
Sure.
You want to check if the attacker is behind the person that is blocking.
This is the code snippet I linked:
local isInfront = false
local isNextTo = false
if Core then
local angle = math.acos(Core.CFrame.LookVector:Dot((Child.Position-Core.Position).Unit))
isInfront = angle < math.pi/2
isNextTo = angle < math.pi/1.65
end
In this code snippet, Core
is the main part, and Child
is the part you’re comparing it to.
The angle variable gets the angle from the Core
part’s orientation to the Child
part using the Dot product of the look vector of the Core
part (so its orientation) and the relative position of the Child
part to the Core
part.
By calculating that Dot product, we get the cosine of the angle. To get the actual angle, you need to use the inverse cosine function on it (math.acos()
).
Now, you have the angle between the two parts and can determine whether or not the Child
part is behind the Core
part by comparing the angle to an already specified threshold.
local isInfront = false
local isNextTo = false
if Core then
local angle = math.acos(Core.CFrame.LookVector:Dot((Child.Position-Core.Position).Unit))
isInfront = angle < math.pi/2
isNextTo = angle < math.pi/1.65
end
if not isInfront and not isNextTo then -- equivalent to isBehind
break
end
edit: Actually, I think this would only work for one side, so you’d have to use the absolute value of the angle.
isInfront = math.abs(angle) < math.pi/2
isNextTo = math.abs(angle) < math.pi/1.65
no no i want it to hit the player too. if i can achieve how to detect if someone is hitting behind, i can just stop block animation and remove the blocking tag.
ok now i understand, thank you for letting me know
the punch
[“R”] = function(plr)
local chr = plr.Character
if chr:HasTag("Stun") or chr:HasTag("Using") or chr:HasTag("HeavyCD") then
return
end
task.spawn(function()
task.wait(.34)
local st = os.time()
local hitplrs = {}
playRandomHitSound(game.ReplicatedStorage.Movesets.BoogieWoogie.Sounds.Swings,chr)
while os.time() - st < .05 do
local hitcast = hb.CreateBB(chr, Vector3.new(5, 5, 7), chr.HumanoidRootPart.CFrame * CFrame.new(0, 0, -4))
for i, v in pairs(hitcast) do
if not table.find(hitplrs, v.Name) then
table.insert(hitplrs, v.Name)
v.Humanoid:TakeDamage(15)
stunplr(v,1.2)
playRandomHitSound(game.ReplicatedStorage.Movesets.BoogieWoogie.Sounds.HeavyHits,v)
knockback(chr, v, .2, 60)
knockback(chr, chr, .1, 20)
playRandomHitAnimation(v.Humanoid)
end
end
task.wait()
end
end)
task.spawn(function()
chr:AddTag("Using")
chr.Humanoid:LoadAnimation(game.ReplicatedStorage.Movesets.BoogieWoogie.Anims.Heavy):Play()
task.wait(.25)
chr:RemoveTag("Using")
end)
task.spawn(function()
chr:AddTag("HeavyCD")
task.wait(5)
chr:RemoveTag("HeavyCD")
end)
end,
the hitbox module:
function module.Create(Attacker, Size, cFrame)
local Params = OverlapParams.new()
Params.FilterType = Enum.RaycastFilterType.Blacklist
Params.FilterDescendantsInstances = {Attacker}
--HitboxIndicator(Size, cFrame)
local Parts = workspace:GetPartBoundsInBox(cFrame, Size, Params)
local Victims = {}
for _, Parts in pairs(Parts) do
local Victim = Parts.Parent
if Victim:FindFirstChildWhichIsA("Humanoid") and Victim:FindFirstChild("HumanoidRootPart") then
if not Victims[Victim.Name] then
if Victim:HasTag("Dodge") then
-- movesets[Victim.AbilityValue.Value](Victim,Attacker)
break
elseif Victim:HasTag("IF") then
break
elseif Victim:HasTag("Blocking") then
break
else
Victims[Victim.Name] = Victim
print(Victim.Name.." damaged")
end
end
end
end
return Victims
end
where should i add that? sorry im a bit new to combat scripting.
I believe it would be:
elseif Victim:HasTag("Blocking") then
local HRP_V = Victim:FindFirstChild("HumanoidRootPart")
local HRP_A = Attacker:FindFirstChild("HumanoidRootPart") -- assuming Attacker is the character
local isInfront = false
local isNextTo = false
if HRP_V then
local angle = math.acos(HRP_V.CFrame.LookVector:Dot((HRP_A.Position-HRP_V.Position).Unit))
isInfront = angle < math.pi/2
isNextTo = angle < math.pi/1.65
end
if isInfront or isNextTo then
break
else -- is behind
-- break blocking loop, maybe just by removing blocking tag, idrk how it works in your system
end
else
thank you so much!! it workedd
This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.