Shoot remote (Da hood)
We will do this without any hooking to find it.
Now what does shooting could have in common? A gun that shoots the bullet. So we will try to find a gun script in the game.
Now what we can find is remotes like GunHandler, GunSoundPlay, GunClientShotgun Now the one that stand out is GunHandler and GunClientShotgun.
We find out that GunHandler is actually just the gun handler but! It has useful methods like shoot. Although the shoot function directly doesn't do anything serversided we can see the arguments being passed into the shoot function.
Now we will take a look at the GunClientShotgun and what do we see here? The GunHandler is being used with a remote event.
local var20 = var19.WorldPosition + (GunHandler_upvr.getAim(var19.WorldPosition) + Vector3.new(var20, -math.random() * 0.1, -math.random() * 0.05)) * Range_upvr.Value
local any_shoot_result1, any_shoot_result2, any_shoot_result3 = GunHandler_upvr.shoot({
Shooter = any_Wait_result1_upvr;
Handle = Handle_upvr;
AimPosition = var20;
BeamColor = Color3.new(1, 0.545098, 0.14902);
ForcedOrigin = var19.WorldPosition;
Range = Range_upvr.Value;
})
ReplicatedStorage_upvr.MainEvent:FireServer("ShootGun", Handle_upvr, var19.WorldPosition, any_shoot_result1, any_shoot_result2, any_shoot_result3, workspace:GetServerTimeNow())
From this we can see how da hood handles the "ShootGun" remote and now we can abuse it.
Since we see that the shooter isn't passed into the remote event arguments we can ignore the shooter variable and go straight to the handle. The hande is the just the handle of the gun you are holding so nothing special there. But now we get into the var19.WorldPosition.
var19 is a table where the WorldPosition is calculated like this
local var19 = {}
var19.WorldPosition = (Handle_upvr.CFrame * cframe_upvr).Position
cframe_upvr is just a predefined CFrame so we can keep it like that. We will not need it in the shoot function.
But Now we get into the juicy stuff
any_shoot_result1
any_shoot_result2
any_shoot_result3
Are all different variables we need to consider. any_shoot_result1 is the position where the bullet goes. So we can replace this with the HumanoidRootPart Position of the target character.
any_shoot_result2 is the hitpart so in this we will just take the target characters head as the hitpart
any_shoot_result3 is hitNormal and we can ignore that and just replace it with Vector3.new(0,0,-1)
So our script should look like this
local MainEvent = game:GetService("ReplicatedStorage").MainEvent
local LocalPlayer = game:GetService("Players").LocalPlayer
local function shoot(target: Model, gun: Tool)
local HumanoidRootPart = target:FindFirstChild("HumanoidRootPart")
if not HumanoidRootPart then return warn("Humanoidrootpart not found") end
local Handle = gun:FindFirstChild("Handle")
if not Handle then return warn("Handle not found in tool")
MainEvent:FireServer(
"ShootGun", -- since we know that is the argument being used
Handle, -- giving in the handle of the gun
LocalPlayer.Character:FindFirstChild("HumanoidRootPart").Position, -- starting position
HumanoidRootPart.Position, -- hit position
target:FindFirstChild("Head"), -- hit part
Vector3.new(0,0,-1) -- hit "offset"
)
end
And Boom there you made it. A shoot function which never misses
Last updated