[ad_1]
Created by integerisqt
Features:
local runService = game:GetService("RunService")
local replicatedStorage = game:GetService("ReplicatedStorage")
local players = game:GetService("Players")
local localPlayer = players.LocalPlayer
local camera = workspace.CurrentCamera
local screenSize = camera.ViewportSize
local cameraFrustumHeightScale = math.tan(math.deg(camera.FieldOfView / 2))
local cameraFrustumWidthScale = cameraFrustumHeightScale * screenSize.x/screenSize.y
camera.Changed:Connect(function()
task.wait()
screenSize = camera.ViewportSize
cameraFrustumHeightScale = math.tan(math.rad(camera.FieldOfView / 2))
cameraFrustumWidthScale = cameraFrustumHeightScale * screenSize.x/screenSize.y
end)
local drawingPool = {}
local maxNadePerPlayer = 3
local char, netFuncs
local newgrenadeFunc, newgrenadeIdx
local Maid = loadstring(game:HttpGet("https://raw.githubusercontent.com/Quenty/NevermoreEngine/version2/Modules/Shared/Events/Maid.lua"))()
local imageUrl = game:HttpGet("https://i.imgur.com/3HGuyVa.png") --thanks bbot
for i,v in next, getgc(true) do
local t = type(v)
if t == "table" then
if rawget(v, "jump") then
char = v
end
elseif t == "function" then
local info = debug.getinfo(v)
if info.name == "call" and info.source:find("network") then
netFuncs = debug.getupvalue(v, 1)
for i2,v2 in next, netFuncs do
local const = debug.getconstants(v2)
if table.find(const, "Indicator") and table.find(const, "Ticking") then
newgrenadeFunc, newgrenadeIdx = v2, i2
end
end
end
end
end
local function translateToScreenSpace(worldPos)
local relativePos = camera.CFrame:PointToObjectSpace(worldPos)
local depth = -relativePos.z
local rX, rY = relativePos.x, relativePos.y
local pX, pY = 0.5 + 0.5*rX/(cameraFrustumWidthScale*depth), 0.5 - 0.5*rY/(cameraFrustumHeightScale*depth)
return Vector3.new(screenSize.x*pX, screenSize.y*pY, depth), depth > 0 and pX >= 0 and pX <= 1 and pY >= 0 and pY <= 1
end
local function lerp(a, b, t)
if t < 0.5 then
return a + (b - a) * t
else
return b - (b - a) * (1 - t)
end
end
local function map(x, a, b, c, d)
return lerp(c, d, (x - a)/(b - a))
end
local function newDrawing(type, prop)
local obj = Drawing.new(type)
if prop then
for i,v in next, prop do
obj[i] = v
end
end
return obj
end
for i = 1, maxNadePerPlayer*players.MaxPlayers do
drawingPool[i] = {
maid = Maid.new(),
used = false,
objects = {
mainSquareOutline = newDrawing("Square", {
Color = Color3.fromRGB(30, 30, 30),
Transparency = 1,
Filled = true,
Thickness = 1,
Visible = false
}),
upperBorder = newDrawing("Square", {
Color = Color3.fromRGB(255, 255, 255),
Transparency = 1,
Filled = true,
Thickness = 1,
Visible = false
}),
nadeLogo = newDrawing("Image", {
Data = imageUrl,
Rounding = 0,
Size = Vector2.new(30, 35),
Visible = false
}),
nadeTypeText = newDrawing("Text", {
Font = 2,
Size = 13,
Text = "HE",
Outline = true,
Color = Color3.fromRGB(255, 255, 255),
Center = false,
Visible = false
}),
damageText = newDrawing("Text", {
Font = 2,
Size = 13,
Text = "LETHAL",
Outline = true,
Color = Color3.fromRGB(255, 255, 255),
Center = false,
Visible = false
}),
secondsRemainingText = newDrawing("Text", {
Font = 2,
Size = 13,
Text = "5.0s",
Outline = true,
Color = Color3.fromRGB(255, 255, 255),
Center = false,
Visible = false
}),
timerOutline = newDrawing("Square", {
Color = Color3.fromRGB(0, 0, 0),
Transparency = 1,
Filled = true,
Visible = false,
Thickness = 1
}),
timerSquare = newDrawing("Square", {
Color = Color3.fromRGB(0, 255, 0),
Transparency = 1,
Filled = true,
Visible = false,
Thickness = 1
})
}
}
end
netFuncs[newgrenadeIdx] = function(plr, fragName, data)
newgrenadeFunc(plr, fragName, data)
local nadeData = require(replicatedStorage.GunModules:FindFirstChild(fragName))
local d0, d1, r0, r1 = nadeData.damage0, nadeData.damage1, nadeData.range0, nadeData.range1
local blastRadius = nadeData.blastradius
local startTick = data.time
local lastFrame = data.frames[#data.frames]
local endPos = lastFrame.p0 + lastFrame.offset
local drawing
for i,v in next, drawingPool do
if not v.used then
v.used = true
drawing = v
break
end
end
if not drawing then
drawing = {
maid = Maid.new(),
used = true,
objects = {
mainSquareOutline = newDrawing("Square", {
Color = Color3.fromRGB(30, 30, 30),
Transparency = 1,
Filled = true,
Thickness = 1,
Visible = false
}),
upperBorder = newDrawing("Square", {
Color = Color3.fromRGB(255, 255, 255),
Transparency = 1,
Filled = true,
Thickness = 1,
Visible = false
}),
nadeLogo = newDrawing("Image", {
Data = imageUrl,
Rounding = 0,
Size = Vector2.new(30, 35),
Visible = false
}),
nadeTypeText = newDrawing("Text", {
Font = 2,
Size = 13,
Text = "HE",
Outline = true,
Color = Color3.fromRGB(255, 255, 255),
Center = false,
Visible = false
}),
damageText = newDrawing("Text", {
Font = 2,
Size = 13,
Text = "LETHAL",
Outline = true,
Color = Color3.fromRGB(255, 255, 255),
Center = false,
Visible = false
}),
secondsRemainingText = newDrawing("Text", {
Font = 2,
Size = 13,
Text = "5.0s",
Outline = true,
Color = Color3.fromRGB(255, 255, 255),
Center = false,
Visible = false
}),
timerOutline = newDrawing("Square", {
Color = Color3.fromRGB(0, 0, 0),
Transparency = 1,
Filled = true,
Visible = false,
Thickness = 1
}),
timerSquare = newDrawing("Square", {
Color = Color3.fromRGB(0, 255, 0),
Transparency = 1,
Filled = true,
Visible = false,
Thickness = 1
})
}
}
table.insert(drawingPool, drawing)
print("THIS SHOULD NEVER HAPPEN, HOLY FUCK, CONTACT int#2996 IF IT DOES")
end
drawing.maid:GiveTask(runService.RenderStepped:Connect(function(deltaTime)
local percentage = (tick() - startTick)/data.blowuptime
if percentage >= 1 then
return drawing.maid:DoCleaning()
end
if char.rootpart then
local nadeTrans = 1
local direction = endPos - char.rootpart.Position
local distance = direction.Magnitude
if distance > blastRadius then
nadeTrans = 1 - map(distance, blastRadius, blastRadius + 40, 0, 1)
end
local objects = drawing.objects
local mainSquareOutline = objects.mainSquareOutline
local upperBorder = objects.upperBorder
local nadeLogo = objects.nadeLogo
local nadeTypeText = objects.nadeTypeText
local damageText = objects.damageText
local secondsRemainingText = objects.secondsRemainingText
local timerOutline = objects.timerOutline
local timerSquare = objects.timerSquare
local pos, onScreen = translateToScreenSpace(endPos)
local secondsRemaining = math.floor((1 - percentage)*data.blowuptime*10)/10
local nadeDamage = "Safe"
if not workspace:FindPartOnRayWithWhitelist(Ray.new(char.rootpart.Position, direction), {workspace.Map}, true) then
if distance < r1 then
nadeDamage = distance < r0 and d0 or (distance < r1 and (d1 - d0) / (r1 - r0) * (distance - r0) + d0 or d1)
if nadeDamage >= char.gethealth() then
nadeDamage = "LETHAL!"
else
nadeDamage = "-" .. tostring(math.floor(nadeDamage)) .. "HP"
end
end
end
nadeTypeText.Text = fragName
damageText.Text = nadeDamage
secondsRemainingText.Text = tostring(secondsRemaining)
timerSquare.Size = Vector2.new(40 * (1 - percentage), 2)
timerSquare.Color = Color3.fromRGB(0, 255, 0):Lerp(Color3.fromRGB(255, 0, 0), percentage)
local size = Vector2.new(nadeTypeText.TextBounds.x + damageText.TextBounds.x + secondsRemainingText.TextBounds.x, nadeTypeText.TextBounds.y + damageText.TextBounds.y + secondsRemainingText.TextBounds.y - 4)
local ultimateSize = size + Vector2.new(nadeLogo.Size.x, 11)
if not onScreen or math.floor(pos.x) >= ((screenSize.x - 10) - ultimateSize.x) or math.floor(pos.y) >= ((screenSize.y - 10) - ultimateSize.y) then
local rX = cameraFrustumWidthScale * ((2*pos.x)/screenSize.x - 1) * pos.z
local rY = cameraFrustumHeightScale * (1 - (2*pos.y)/(screenSize.y)) * pos.z
--t0ny math begin
local widthEdge, heightEdge = rX < 0 and 10 or ((screenSize.x - 10) - ultimateSize.x), -rY < 0 and 10 or ((screenSize.y - 10) - ultimateSize.y)
local m = 0.5*(rY*screenSize.x + rX*screenSize.y)
local newY = (m - rY*widthEdge)/rX
if newY > 0 and newY < ((screenSize.y - 10) - ultimateSize.y) then
pos = Vector2.new(widthEdge, newY)
else
pos = Vector2.new((m - rX*heightEdge)/rY, heightEdge)
end
--t0ny math end
end
pos = Vector2.new(math.floor(pos.x), math.floor(pos.y))
mainSquareOutline.Position = pos
upperBorder.Position = mainSquareOutline.Position + Vector2.new(1, 1)
mainSquareOutline.Size = ultimateSize
upperBorder.Size = Vector2.new(mainSquareOutline.Size.x - 2, 2)
nadeLogo.Position = mainSquareOutline.Position + Vector2.new(0, 4)
local startingPos = nadeLogo.Position + Vector2.new(nadeLogo.Size.x + 1, 0)
nadeTypeText.Position = startingPos
damageText.Position = nadeTypeText.Position + Vector2.new(0, nadeTypeText.TextBounds.y - 2)
secondsRemainingText.Position = damageText.Position + Vector2.new(0, damageText.TextBounds.y - 2)
timerOutline.Position = secondsRemainingText.Position + Vector2.new(0, secondsRemainingText.TextBounds.y)
timerSquare.Position = timerOutline.Position + Vector2.new(1, 1)
timerOutline.Size = Vector2.new(42, 4)
nadeLogo.Position = Vector2.new(startingPos.x - nadeLogo.Size.x, startingPos.y + math.floor((size.y - nadeLogo.Size.y + timerOutline.Size.y)/2))
for i,v in next, objects do
v.Visible = true
v.Transparency = nadeTrans
end
else
for i,v in next, drawing.objects do
v.Visible = false
end
end
end))
drawing.maid:GiveTask(function()
drawing.used = false
for i,v in next, drawing.objects do
v.Visible = false
end
end)
end
ENJOY!
Warning: DO NOT DOWNLOAD anything from this page, you’re only here to copy the script!
[ad_2]