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