Volleyball battler better version mod
Key Required

Volleyball battler better version mod

The Battle BricksCGJ_YTCGJ_YT 2K views 390 executesUpdated Jun 23, 2026
5.0/ 5(3 votes)
30100% Positive
Lua Script•371 lines (11431 chars)
if game.PlaceId ~= 10834586502 then  
	return  
end

getgenv().ProjectileAuraConfig = getgenv().ProjectileAuraConfig or {}  

local Config = getgenv().ProjectileAuraConfig  

Config.TargetMode = Config.TargetMode or 4  
-- What this thing does is change the way it targets enemies, 1 for Closest, 2 for Farthest, 3 for Weakest, 4 for strongest and 5 for random  
Config.IHATEYOUSOMUCH = Config.IHATEYOUSOMUCH or {  
    Enabled = true, -- I hate these enemies so much, but if you wanna aggro other enemies add them, or if you don't want to aggro any specific enemy at all set this to false  
    Betty = true,  
    Warhead = true  
}  

Config.Theseshouldntbetargettedimo = Config.Theseshouldntbetargettedimo or {  
    Enabled = true, -- i think that if you target bloodhorn but there is just Newell to attack the bloodhorn well its pretty much ggs, you can set this to false or add more enemies to ignore  
    Punishment = true,  
    Bloodhorn = true  
}  

if getgenv().ProjectileAuraLoaded then  
    return  
end  

getgenv().ProjectileAuraLoaded = true  

local Workspace = game:GetService("Workspace")  
local RunService = game:GetService("RunService")  
local Players = game:GetService("Players")  

local LocalPlayer = Players.LocalPlayer  

local NPCFolders = Workspace:WaitForChild("NPCFolders")  
local EnemyFolder = NPCFolders:WaitForChild("EnemyFolder")  
local ProjectileFolder = Workspace:WaitForChild("Projectile")  

local block  
local timerRemaining = 0  
local UNFREEZE_TIMER = 0.8  
local isActive = false  
local frozen = {}
local trackedProjectiles = {}

local function ShouldIgnoreEnemy(Enemy)  
    if not Config.Theseshouldntbetargettedimo.Enabled then  
        return false  
    end  
    return Config.Theseshouldntbetargettedimo[Enemy.Name]  
end  

local function GetCharacterRoot()  
    local Character = LocalPlayer.Character  
    if not Character then  
        return nil  
    end  
    return Character:FindFirstChild("HumanoidRootPart")  
end  

local function GetAllValidEnemies()  
    local ValidEnemies = {}  
    for _, Enemy in ipairs(EnemyFolder:GetChildren()) do  
        if not ShouldIgnoreEnemy(Enemy) then  
            local Humanoid = Enemy:FindFirstChild("Humanoid")  
            local RootPart = Enemy:FindFirstChild("HumanoidRootPart")  
            if Humanoid and Humanoid.Health > 0 and RootPart then  
                table.insert(ValidEnemies, Enemy)  
            end  
        end  
    end  
    return ValidEnemies  
end  

local function GetMainTarget()  
    if Config.IHATEYOUSOMUCH.Enabled then  
        for _, Enemy in ipairs(EnemyFolder:GetChildren()) do  
            if Config.IHATEYOUSOMUCH[Enemy.Name] then  
                local Humanoid = Enemy:FindFirstChild("Humanoid")  
                if Humanoid and Humanoid.Health > 0 then  
                    return Enemy  
                end  
            end  
        end  
    end  

    local ValidEnemies = GetAllValidEnemies()  

    if #ValidEnemies <= 0 then  
        return nil  
    end  

    local CharacterRoot = GetCharacterRoot()  

    if Config.TargetMode == 1 and CharacterRoot then  
        local ClosestEnemy = nil  
        local ClosestDistance = math.huge  
        for _, Enemy in ipairs(ValidEnemies) do  
            local RootPart = Enemy:FindFirstChild("HumanoidRootPart")  
            if RootPart then  
                local Distance = (CharacterRoot.Position - RootPart.Position).Magnitude  
                if Distance < ClosestDistance then  
                    ClosestDistance = Distance  
                    ClosestEnemy = Enemy  
                end  
            end  
        end  
        return ClosestEnemy  
    end  

    if Config.TargetMode == 2 and CharacterRoot then  
        local FarthestEnemy = nil  
        local FarthestDistance = -math.huge  
        for _, Enemy in ipairs(ValidEnemies) do  
            local RootPart = Enemy:FindFirstChild("HumanoidRootPart")  
            if RootPart then  
                local Distance = (CharacterRoot.Position - RootPart.Position).Magnitude  
                if Distance > FarthestDistance then  
                    FarthestDistance = Distance  
                    FarthestEnemy = Enemy  
                end  
            end  
        end  
        return FarthestEnemy  
    end  

    if Config.TargetMode == 3 then  
        local WeakestEnemy = nil  
        local LowestHealth = math.huge  
        for _, Enemy in ipairs(ValidEnemies) do  
            local Humanoid = Enemy:FindFirstChild("Humanoid")  
            if Humanoid and Humanoid.Health < LowestHealth then  
                LowestHealth = Humanoid.Health  
                WeakestEnemy = Enemy  
            end  
        end  
        return WeakestEnemy  
    end  

    if Config.TargetMode == 4 then  
        local StrongestEnemy = nil  
        local HighestHealth = -math.huge  
        for _, Enemy in ipairs(ValidEnemies) do  
            local Humanoid = Enemy:FindFirstChild("Humanoid")  
            if Humanoid and Humanoid.Health > HighestHealth then  
                HighestHealth = Humanoid.Health  
                StrongestEnemy = Enemy  
            end  
        end  
        return StrongestEnemy  
    end  

    if Config.TargetMode == 5 then  
        return ValidEnemies[math.random(1, #ValidEnemies)]  
    end  

    return ValidEnemies[1]  
end  

local function createBlock()  
	if block and block.Parent then return block end  
	block = Instance.new("Part")  
	block.Name = "Block of Doom"  
	block.Anchored = true  
	block.CanCollide = false  
	block.CanTouch = false  
	block.CanQuery = false  
	block.Transparency = 1  
	block.Size = Vector3.new(6, 6, 6)  
	block.CFrame = CFrame.new(0, -0.250244379, 1.2336266)  
	block.Parent = Workspace  
	return block  
end  

local function getOffset(index)  
	local perLayer = 5  
	local layer = math.floor((index - 1) / perLayer)  
	local pos = (index - 1) % perLayer  
	local angle = (pos / perLayer) * math.pi * 2  
	local horizontalRadius = 0.22  
	local x = math.cos(angle) * horizontalRadius  
	local z = math.sin(angle) * horizontalRadius  
	local y = layer * 2.5  
	return Vector3.new(x, y, z)  
end  

local function teleportAllFists()  
	if not block or not block.Parent then return end  
	for _, v in ipairs(ProjectileFolder:GetChildren()) do  
		if v:IsA("BasePart") and (v.Name == "StoneFist" or v.Name == "Teapot" or v.Name == "FireTeapot") then  
			v.CFrame = block.CFrame  
			v.AssemblyLinearVelocity = Vector3.zero  
			v.AssemblyAngularVelocity = Vector3.zero  
		end  
	end  
end  

local function gatherEnemies()  
	if not block or not block.Parent then return end  

	local enemies = {}  
	for _, npc in ipairs(EnemyFolder:GetChildren()) do  
		local root = npc:FindFirstChild("HumanoidRootPart")  
		local hum = npc:FindFirstChildOfClass("Humanoid")  
		if root and hum and hum.Health > 0 and not ShouldIgnoreEnemy(npc) then  
			table.insert(enemies, npc)  
		end  
	end  

	for i, npc in ipairs(enemies) do  
		local root = npc:FindFirstChild("HumanoidRootPart")  
		if not root then continue end  
		if not frozen[npc] then  
			frozen[npc] = root.CFrame  
		end  
		root.CFrame = block.CFrame * CFrame.new(getOffset(i))  
		root.AssemblyLinearVelocity = Vector3.zero  
		root.AssemblyAngularVelocity = Vector3.zero  
	end  
end  

local function keepIgnoredEnemiesAway()  
	if not block or not block.Parent then return end  
	
	for _, npc in ipairs(EnemyFolder:GetChildren()) do  
		if ShouldIgnoreEnemy(npc) then  
			local root = npc:FindFirstChild("HumanoidRootPart")  
			local hum = npc:FindFirstChild("Humanoid")  
			if root and hum and hum.Health > 0 then  
				local distToBlock = (root.Position - block.Position).Magnitude  
				if distToBlock < 15 then  
					local direction = (root.Position - block.Position).Unit  
					root.CFrame = CFrame.new(block.Position + direction * 20) * CFrame.fromMatrix(Vector3.new(), root.CFrame.RightVector, root.CFrame.UpVector)  
				end  
			end  
		end  
	end  
end  

local function releaseEnemies()  
	for npc, originalCFrame in pairs(frozen) do  
		if npc and npc.Parent then  
			local root = npc:FindFirstChild("HumanoidRootPart")  
			if root then  
				root.CFrame = originalCFrame  
				root.AssemblyLinearVelocity = Vector3.zero  
				root.AssemblyAngularVelocity = Vector3.zero  
			end  
		end  
	end  
	table.clear(frozen)  
end  

local function activate()  
	createBlock()  
	timerRemaining = UNFREEZE_TIMER  
	isActive = true  
end  

local function SetupProjectile(Projectile)  
    Projectile.CanCollide = false  
    Projectile.CanTouch = true  
    Projectile.Massless = true  
    Projectile.Transparency = 1  
    Projectile.AssemblyLinearVelocity = Vector3.zero  
    Projectile.AssemblyAngularVelocity = Vector3.zero  
end  

local function TeleportProjectile(Projectile, TargetRoot)  
    Projectile.CFrame = TargetRoot.CFrame  
    Projectile.AssemblyLinearVelocity = Vector3.zero  
    Projectile.AssemblyAngularVelocity = Vector3.zero  
end  

local function IsEnemyFreezeProjectile(Projectile)  
    return Projectile.Name == "StoneFist"  
    or Projectile.Name == "Teapot"  
    or Projectile.Name == "FireTeapot"  
end  

local function IsTargetOnlyProjectile(Projectile)  
    return Projectile.Name == "Superball"  
    or Projectile.Name == "Pellet"  
    or Projectile.Name == "Soccerball"  
end  

local function IsValidProjectile(Projectile)  
    return IsEnemyFreezeProjectile(Projectile) or IsTargetOnlyProjectile(Projectile)  
end  

local function resize(obj)  
	if obj:IsA("BasePart") then  
		obj.Size = Vector3.new(0.000001, 0.000001, 0.000001)  
	elseif obj:IsA("Model") then  
		for _, d in ipairs(obj:GetDescendants()) do  
			if d:IsA("BasePart") then  
				d.Size = Vector3.new(0.000001, 0.000001, 0.000001)  
			end  
		end  
	end  
end  

for _, v in ipairs(ProjectileFolder:GetChildren()) do  
	if v:IsA("BasePart") then  
		if IsEnemyFreezeProjectile(v) then  
			activate()  
		end  
		if IsValidProjectile(v) then  
			SetupProjectile(v)  
			if IsTargetOnlyProjectile(v) then  
				resize(v)  
				trackedProjectiles[v] = true  
			end  
		end  
	end  
end  

ProjectileFolder.ChildAdded:Connect(function(child)  
	if child:IsA("BasePart") then  
		if IsEnemyFreezeProjectile(child) then  
			activate()  
		end  
		if IsValidProjectile(child) then  
			SetupProjectile(child)  
			if IsTargetOnlyProjectile(child) then  
				resize(child)  
				task.wait()  
				trackedProjectiles[child] = true  
			end  
		end  
	end  
end)  

RunService.Heartbeat:Connect(function(dt)  
	if isActive then  
		timerRemaining -= dt  
		teleportAllFists()  
		gatherEnemies()  
		keepIgnoredEnemiesAway()  
		
		if timerRemaining <= 0 then  
			releaseEnemies()  
			isActive = false  
			timerRemaining = 0  
		end  
	end  

	local TargetEnemy = GetMainTarget()  

	if TargetEnemy then  
		local TargetRoot = TargetEnemy:FindFirstChild("HumanoidRootPart")  
		
		if TargetRoot then  
			for obj in pairs(trackedProjectiles) do  
				if not obj or not obj.Parent then  
					trackedProjectiles[obj] = nil  
				elseif obj:IsA("BasePart") then  
					TeleportProjectile(obj, TargetRoot)  
				end  
			end  
		end  
	end  
end)  

script.AncestryChanged:Connect(function(_, parent)  
	if parent == nil then  
		releaseEnemies()  
		if block and block.Parent then block:Destroy() end  
		table.clear(trackedProjectiles)  
	end  
end)

Features & Information

A free open source mod for volleyball battler who deals good dps and easily replaces the basketball battler and yes this also supports basketball battler because why not?
#opensource#thebattlebricks#volleyball battler mod

Community Comments (7)

Foxxy_Foxxy_Jul 7, 2026

Holy OP

vivitaxi3vivitaxi3Jul 11, 2026

does this still works?

CGJ_YTCGJ_YTAug 7, 2026

It still works and there's going to be more new but I have to fix some bugs due to battle bricks having updates

Replying to @CGJ_YT
GubleyyyGubleyyyAug 10, 2026

@JkgYT make kill all script or inf bricks

Replying to @Gubleyyy
CGJ_YTCGJ_YTAug 13, 2026

@Gubleyyy that's patched, and INF bricks would only be client

janieadams123janieadams123Aug 9, 2026

What does this do I don’t wanna risk an data wipe

Replying to @janieadams123
CGJ_YTCGJ_YTAug 13, 2026

@janieadams123 it teleports the Projectiles to the strongest enemys and when it detects a enemy projectiles it teleports them underground -100Y until it des*s

More Scripts for The Battle Bricks