mirror of
https://github.com/JonnyBro/beatrun.git
synced 2024-12-29 21:33:02 +05:00
Remove unused files, rename some files, clean up code, Course_IDs in F4
This commit is contained in:
parent
8fb094a25c
commit
9998d9b7dd
20 changed files with 113 additions and 1706 deletions
|
@ -119,7 +119,7 @@ function AEUI:RemovePanel(panel)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function AEUI:AddText(panel, str, font, x, y, centered, color)
|
function AEUI:Text(panel, str, font, x, y, centered, color)
|
||||||
font = font or "AEUIDefault"
|
font = font or "AEUIDefault"
|
||||||
x = x or 0
|
x = x or 0
|
||||||
y = y or 0
|
y = y or 0
|
|
@ -63,7 +63,7 @@ local function infostring()
|
||||||
return str
|
return str
|
||||||
end
|
end
|
||||||
|
|
||||||
AEUI:AddText(bminfo, infostring, "AEUIDefault", bminfo.w / 2, bminfo.h / 2 - 20, true)
|
AEUI:Text(bminfo, infostring, "AEUIDefault", bminfo.w / 2, bminfo.h / 2 - 20, true)
|
||||||
|
|
||||||
local function BuildModeHUDButton(e)
|
local function BuildModeHUDButton(e)
|
||||||
buildmodeinputs[e.key](true)
|
buildmodeinputs[e.key](true)
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
if not util.IsBinaryModuleInstalled("gdiscord") then return end
|
|
||||||
require("gdiscord")
|
|
||||||
|
|
||||||
local image = "default"
|
|
||||||
local discord_id = "1109438051496775682"
|
|
||||||
local refresh_time = 60
|
|
||||||
local discord_start = discord_start or -1
|
|
||||||
|
|
||||||
function DiscordUpdate()
|
|
||||||
local ply = LocalPlayer()
|
|
||||||
if not ply.GetLevel then return end
|
|
||||||
|
|
||||||
local rpc_data = {}
|
|
||||||
|
|
||||||
if game.SinglePlayer() then
|
|
||||||
rpc_data["state"] = "Singleplayer"
|
|
||||||
else
|
|
||||||
local ip = game.GetIPAddress()
|
|
||||||
|
|
||||||
if ip == "loopback" then
|
|
||||||
if GetConVar("p2p_enabled"):GetBool() then
|
|
||||||
rpc_data["state"] = "Peer 2 Peer"
|
|
||||||
else
|
|
||||||
rpc_data["state"] = "Local Server"
|
|
||||||
end
|
|
||||||
else
|
|
||||||
rpc_data["state"] = "Dedicated Server"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
rpc_data["partySize"] = player.GetCount()
|
|
||||||
rpc_data["partyMax"] = game.MaxPlayers()
|
|
||||||
|
|
||||||
if game.SinglePlayer() then
|
|
||||||
rpc_data["partyMax"] = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
local level = ply:GetLevel()
|
|
||||||
local customname = hook.Run("BeatrunHUDCourse")
|
|
||||||
local course = customname and customname or Course_Name ~= "" and Course_Name or "Freeplay"
|
|
||||||
rpc_data["details"] = "Level: " .. level .. " | Map: " .. game.GetMap()
|
|
||||||
rpc_data["startTimestamp"] = discord_start
|
|
||||||
rpc_data["largeImageKey"] = image
|
|
||||||
rpc_data["largeImageText"] = course
|
|
||||||
DiscordUpdateRPC(rpc_data)
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Add("Initialize", "UpdateDiscordStatus", function()
|
|
||||||
timer.Simple(10, function()
|
|
||||||
discord_start = os.time()
|
|
||||||
|
|
||||||
DiscordRPCInitialize(discord_id)
|
|
||||||
DiscordUpdate()
|
|
||||||
|
|
||||||
if timer.Exists("DiscordRPCTimer") then timer.Remove("DiscordRPCTimer") end
|
|
||||||
|
|
||||||
timer.Create("DiscordRPCTimer", refresh_time, 0, DiscordUpdate)
|
|
||||||
end)
|
|
||||||
end)
|
|
|
@ -25,7 +25,7 @@ local function buildmodebutton()
|
||||||
LocalPlayer():ConCommand("buildmode")
|
LocalPlayer():ConCommand("buildmode")
|
||||||
end
|
end
|
||||||
|
|
||||||
AEUI:AddText(coursepanel, language.GetPhrase("beatrun.coursemenu.trials"):format(game.GetMap()), "AEUIVeryLarge", 20, 30)
|
AEUI:Text(coursepanel, language.GetPhrase("beatrun.coursemenu.trials"):format(game.GetMap()), "AEUIVeryLarge", 20, 30)
|
||||||
|
|
||||||
local buildmodebutton = AEUI:AddButton(coursepanel, "#beatrun.coursemenu.buildmode", buildmodebutton, "AEUILarge", coursepanel.w - 400, coursepanel.h - 50)
|
local buildmodebutton = AEUI:AddButton(coursepanel, "#beatrun.coursemenu.buildmode", buildmodebutton, "AEUILarge", coursepanel.w - 400, coursepanel.h - 50)
|
||||||
buildmodebutton.greyed = sacheck
|
buildmodebutton.greyed = sacheck
|
||||||
|
@ -67,13 +67,14 @@ function OpenCourseMenu()
|
||||||
local course = util.Decompress(data) or data
|
local course = util.Decompress(data) or data
|
||||||
|
|
||||||
if course then
|
if course then
|
||||||
course = util.JSONToTable(course)
|
local coursetable = util.JSONToTable(course)
|
||||||
local courseentry = AEUI:AddText(courselist, course[5] or "ERROR", "AEUILarge", 10, 40 * #courselist.elements)
|
local filename = v:Split(".txt")[1]
|
||||||
local courseid = v:Split(".txt")[1]
|
local courseid = util.CRC(course)
|
||||||
|
local courseentry = AEUI:Text(courselist, coursetable[5] and coursetable[5] .. " (" .. courseid .. ")" or "ERROR", "AEUILarge", 10, 40 * #courselist.elements)
|
||||||
|
|
||||||
function courseentry:onclick()
|
function courseentry:onclick()
|
||||||
LocalPlayer():EmitSound("buttonclick.wav")
|
LocalPlayer():EmitSound("buttonclick.wav")
|
||||||
LoadCourse(courseid)
|
LoadCourse(filename)
|
||||||
end
|
end
|
||||||
|
|
||||||
courseentry.greyed = sacheck
|
courseentry.greyed = sacheck
|
||||||
|
|
97
beatrun/gamemodes/beatrun/gamemode/cl/RichPresence.lua
Normal file
97
beatrun/gamemodes/beatrun/gamemode/cl/RichPresence.lua
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
function StartDiscordPresence(arguments)
|
||||||
|
if not util.IsBinaryModuleInstalled("gdiscord") then return end
|
||||||
|
require("gdiscord")
|
||||||
|
|
||||||
|
local image = "default"
|
||||||
|
local discord_id = "1109438051496775682"
|
||||||
|
local refresh_time = 60
|
||||||
|
local discord_start = discord_start or -1
|
||||||
|
|
||||||
|
function DiscordUpdate()
|
||||||
|
local ply = LocalPlayer()
|
||||||
|
if not ply.GetLevel then return end
|
||||||
|
|
||||||
|
local rpc_data = {}
|
||||||
|
|
||||||
|
if game.SinglePlayer() then
|
||||||
|
rpc_data["state"] = "Singleplayer"
|
||||||
|
else
|
||||||
|
local ip = game.GetIPAddress()
|
||||||
|
|
||||||
|
if ip == "loopback" then
|
||||||
|
if GetConVar("p2p_enabled"):GetBool() then
|
||||||
|
rpc_data["state"] = "Peer 2 Peer"
|
||||||
|
else
|
||||||
|
rpc_data["state"] = "Local Server"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
rpc_data["state"] = "Dedicated Server"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
rpc_data["partySize"] = player.GetCount()
|
||||||
|
rpc_data["partyMax"] = game.MaxPlayers()
|
||||||
|
|
||||||
|
if game.SinglePlayer() then
|
||||||
|
rpc_data["partyMax"] = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local level = ply:GetLevel()
|
||||||
|
local customname = hook.Run("BeatrunHUDCourse")
|
||||||
|
local course = customname and customname or Course_Name ~= "" and Course_Name or "Freeplay"
|
||||||
|
rpc_data["details"] = "Level: " .. level .. " | Map: " .. game.GetMap()
|
||||||
|
rpc_data["startTimestamp"] = discord_start
|
||||||
|
rpc_data["largeImageKey"] = image
|
||||||
|
rpc_data["largeImageText"] = course
|
||||||
|
|
||||||
|
DiscordUpdateRPC(rpc_data)
|
||||||
|
end
|
||||||
|
|
||||||
|
timer.Simple(5, function()
|
||||||
|
discord_start = os.time()
|
||||||
|
|
||||||
|
DiscordRPCInitialize(discord_id)
|
||||||
|
DiscordUpdate()
|
||||||
|
|
||||||
|
if timer.Exists("UpdateDiscordRichPresence") then timer.Remove("UpdateDiscordRichPresence") end
|
||||||
|
|
||||||
|
timer.Create("UpdateDiscordRichPresence", refresh_time, 0, DiscordUpdate)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function StartSteamPresence(arguments)
|
||||||
|
if not util.IsBinaryModuleInstalled("steamrichpresencer") then return end
|
||||||
|
require("steamrichpresencer")
|
||||||
|
|
||||||
|
local richtext = ""
|
||||||
|
local refresh_time = 60
|
||||||
|
|
||||||
|
local function SteamUpdate()
|
||||||
|
local ply = LocalPlayer()
|
||||||
|
if not ply.GetLevel then return end
|
||||||
|
|
||||||
|
local map = game.GetMap()
|
||||||
|
local level = ply:GetLevel()
|
||||||
|
local customname = hook.Run("BeatrunHUDCourse")
|
||||||
|
local course = customname and customname or Course_Name ~= "" and Course_Name or "Freeplay"
|
||||||
|
local updatedtext = "Beatrun Lv. " .. level .. " (" .. map .. ") | " .. course
|
||||||
|
|
||||||
|
if richtext ~= updatedtext then
|
||||||
|
richtext = updatedtext
|
||||||
|
steamworks.SetRichPresence("generic", richtext)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
timer.Simple(5, function()
|
||||||
|
SteamUpdate()
|
||||||
|
|
||||||
|
if timer.Exists("UpdateSteamRichPresence") then timer.Remove("UpdateSteamRichPresence") end
|
||||||
|
|
||||||
|
timer.Create("UpdateSteamRichPresence", refresh_time, 0, SteamUpdate)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
hook.Add("OnGamemodeLoaded", "UpdateDiscordStatus", function()
|
||||||
|
StartDiscordPresence()
|
||||||
|
StartSteamPresence()
|
||||||
|
end)
|
|
@ -1,26 +0,0 @@
|
||||||
if not util.IsBinaryModuleInstalled("steamrichpresencer") then return end
|
|
||||||
require("steamrichpresencer")
|
|
||||||
|
|
||||||
local richtext = ""
|
|
||||||
local refresh_time = 60
|
|
||||||
|
|
||||||
local function UpdateRichPresence()
|
|
||||||
local ply = LocalPlayer()
|
|
||||||
if not ply.GetLevel then return end
|
|
||||||
|
|
||||||
local map = game.GetMap()
|
|
||||||
local level = ply:GetLevel()
|
|
||||||
local customname = hook.Run("BeatrunHUDCourse")
|
|
||||||
local course = customname and customname or Course_Name ~= "" and Course_Name or "Freeplay"
|
|
||||||
local updatedtext = "Beatrun Lv. " .. level .. " (" .. map .. ") | " .. course
|
|
||||||
|
|
||||||
if richtext ~= updatedtext then
|
|
||||||
richtext = updatedtext
|
|
||||||
steamworks.SetRichPresence("generic", richtext)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Add("OnGamemodeLoaded", "LoadDLL", function()
|
|
||||||
UpdateRichPresence()
|
|
||||||
timer.Create("UpdateSteamRichPresence", refresh_time, 0, UpdateRichPresence)
|
|
||||||
end)
|
|
|
@ -1,209 +0,0 @@
|
||||||
local rx = 0
|
|
||||||
local gx = 0
|
|
||||||
local bx = 0
|
|
||||||
local ry = 0
|
|
||||||
local gy = 0
|
|
||||||
local by = 0
|
|
||||||
local black = Material("vgui/black")
|
|
||||||
|
|
||||||
local ca_r = CreateMaterial("ca_r", "UnlitGeneric", {
|
|
||||||
["$ignorez"] = 1,
|
|
||||||
["$basetexture"] = "vgui/black",
|
|
||||||
["$additive"] = 1,
|
|
||||||
["$color2"] = "[1 0 0]"
|
|
||||||
})
|
|
||||||
|
|
||||||
local ca_g = CreateMaterial("ca_g", "UnlitGeneric", {
|
|
||||||
["$ignorez"] = 1,
|
|
||||||
["$basetexture"] = "vgui/black",
|
|
||||||
["$additive"] = 1,
|
|
||||||
["$color2"] = "[0 1 0]"
|
|
||||||
})
|
|
||||||
|
|
||||||
local ca_b = CreateMaterial("ca_b", "UnlitGeneric", {
|
|
||||||
["$ignorez"] = 1,
|
|
||||||
["$basetexture"] = "vgui/black",
|
|
||||||
["$additive"] = 1,
|
|
||||||
["$color2"] = "[0 0 1]"
|
|
||||||
})
|
|
||||||
-- local zoom = Material("vgui/zoom.vtf")
|
|
||||||
|
|
||||||
local function CA(rx, gx, bx, ry, gy, by)
|
|
||||||
render.UpdateScreenEffectTexture()
|
|
||||||
|
|
||||||
local screentx = render.GetScreenEffectTexture()
|
|
||||||
|
|
||||||
ca_r:SetTexture("$basetexture", screentx)
|
|
||||||
ca_g:SetTexture("$basetexture", screentx)
|
|
||||||
ca_b:SetTexture("$basetexture", screentx)
|
|
||||||
|
|
||||||
render.SetMaterial(black)
|
|
||||||
render.DrawScreenQuad()
|
|
||||||
render.SetMaterial(ca_r)
|
|
||||||
render.DrawScreenQuadEx(-rx / 2, -ry / 2, ScrW() + rx, ScrH() + ry)
|
|
||||||
render.SetMaterial(ca_g)
|
|
||||||
render.DrawScreenQuadEx(-gx / 2, -gy / 2, ScrW() + gx, ScrH() + gy)
|
|
||||||
render.SetMaterial(ca_b)
|
|
||||||
render.DrawScreenQuadEx(-bx / 2, -by / 2, ScrW() + bx, ScrH() + by)
|
|
||||||
end
|
|
||||||
|
|
||||||
function RenderCA()
|
|
||||||
rx = 10
|
|
||||||
ry = 10
|
|
||||||
gx = 10 * (GlitchIntensity * 5 or 1)
|
|
||||||
gy = 10 * (GlitchIntensity * 5 or 1)
|
|
||||||
bx = 2 * (GlitchIntensity * 5 or 1)
|
|
||||||
by = 2 * (GlitchIntensity * 5 or 1)
|
|
||||||
|
|
||||||
CA(rx, gx, bx, ry, gy, by)
|
|
||||||
|
|
||||||
local gi = math.max(1, GlitchIntensity * 4)
|
|
||||||
|
|
||||||
DrawMotionBlur(0.25, 0.75 * GlitchIntensity, 0.005)
|
|
||||||
DrawBloom(0, 0.5, 0.1 * gi, 0.1 * gi, 1, 1, 1, 1, 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
surface.CreateFont("DaisyHUDSmall", {
|
|
||||||
shadow = true,
|
|
||||||
blursize = 0,
|
|
||||||
underline = false,
|
|
||||||
rotary = false,
|
|
||||||
strikeout = false,
|
|
||||||
additive = false,
|
|
||||||
antialias = false,
|
|
||||||
extended = false,
|
|
||||||
scanlines = 2,
|
|
||||||
font = "x14y24pxHeadUpDaisy",
|
|
||||||
italic = false,
|
|
||||||
outline = false,
|
|
||||||
symbol = false,
|
|
||||||
weight = 500,
|
|
||||||
size = ScreenScale(6)
|
|
||||||
})
|
|
||||||
|
|
||||||
local deletiontable = {}
|
|
||||||
-- local deletiontime = 0
|
|
||||||
local deletiontypetime = 0
|
|
||||||
local deletiontype = 0
|
|
||||||
deletionentry = 0
|
|
||||||
local garble = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&()*+,-./:;<=>?@[]^_`{|}~"
|
|
||||||
local garblelen = #garble
|
|
||||||
local deletionrare = false
|
|
||||||
local deletionraretbl = {
|
|
||||||
"...",
|
|
||||||
"Kc7bUS7z",
|
|
||||||
"817"
|
|
||||||
}
|
|
||||||
local deletioncredits = {
|
|
||||||
"Beatrun",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
"Programming",
|
|
||||||
"| datae",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
"Various assets & concepts",
|
|
||||||
"| Mirror's Edge (EA)",
|
|
||||||
"| Tetris Effect (Resonair)",
|
|
||||||
"| Dying Light (Techland)",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
"Credits music",
|
|
||||||
"| \"Sunrise\" from OneShot",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
"Special thanks to",
|
|
||||||
"",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
"Get the fuck out of the credits this part of the mod isnt finished"
|
|
||||||
}
|
|
||||||
incredits = false
|
|
||||||
local deletionstring = ""
|
|
||||||
local deletionlen = 0
|
|
||||||
|
|
||||||
function DrawDeletionText()
|
|
||||||
surface.SetFont("DaisyHUDSmall")
|
|
||||||
local oldgi = GlitchIntensity
|
|
||||||
|
|
||||||
if incredits then
|
|
||||||
GlitchIntensity = math.max(0.15, GlitchIntensity)
|
|
||||||
end
|
|
||||||
|
|
||||||
local deletionstringc = deletionstring:Left(deletiontype)
|
|
||||||
|
|
||||||
if deletiontypetime < CurTime() then
|
|
||||||
deletiontype = deletiontype + 1
|
|
||||||
deletiontypetime = CurTime() + ((deletionrare or incredits) and 0.125 or 0.025)
|
|
||||||
end
|
|
||||||
|
|
||||||
if deletionlen < deletiontype then
|
|
||||||
deletionrare = math.random() <= 0.01
|
|
||||||
|
|
||||||
if incredits then
|
|
||||||
deletioncredits[19] = LocalPlayer():SteamID() or "Someone..?"
|
|
||||||
|
|
||||||
if deletionentry + 1 > #deletioncredits then
|
|
||||||
blindpopulatespeed = 150
|
|
||||||
blindfakepopulate = true
|
|
||||||
vanishlimit = 100
|
|
||||||
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
deletionstring = deletioncredits[deletionentry + 1]
|
|
||||||
else
|
|
||||||
deletionstring = not deletionrare and "Deleting /usr/fragments/mem" .. deletionentry .. ".dat" or deletionraretbl[math.random(#deletionraretbl)]
|
|
||||||
end
|
|
||||||
|
|
||||||
deletionlen = #deletionstring
|
|
||||||
deletionrare = deletionrare
|
|
||||||
deletiontype = 0
|
|
||||||
deletionentry = deletionentry + 1
|
|
||||||
table.insert(deletiontable, deletionstringc)
|
|
||||||
|
|
||||||
if #deletiontable >= 6 then
|
|
||||||
table.remove(deletiontable, 1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local _, th = surface.GetTextSize(deletionstringc)
|
|
||||||
cam.Start2D()
|
|
||||||
local num = 0
|
|
||||||
local ply = LocalPlayer()
|
|
||||||
local vp = ply:GetViewPunchAngles()
|
|
||||||
local vpcl = ply.ViewPunchAngle or angle_zero
|
|
||||||
|
|
||||||
vp:Add(vpcl)
|
|
||||||
|
|
||||||
local GlitchIntensity = incredits and 2 or GlitchIntensity
|
|
||||||
surface.SetTextColor(255, 255, 255, 2.5 * (num + 1) * GlitchIntensity)
|
|
||||||
|
|
||||||
for k, v in ipairs(deletiontable) do
|
|
||||||
surface.SetTextColor(255, 255, 255, 2.5 * k * GlitchIntensity)
|
|
||||||
local text = v
|
|
||||||
|
|
||||||
for i = 1, 4 do
|
|
||||||
local index = math.random(1, #text)
|
|
||||||
|
|
||||||
if text[index] ~= " " then
|
|
||||||
text = text:SetChar(index, garble[math.random(1, garblelen)])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
surface.SetTextPos(ScrW() * 0.01 + vp.x, ScrH() * 0.05 + (k - 1) * th + vp.y)
|
|
||||||
surface.DrawText(text)
|
|
||||||
num = k
|
|
||||||
end
|
|
||||||
|
|
||||||
if deletiontype > 0 then
|
|
||||||
surface.SetTextPos(ScrW() * 0.01 + vp.x, ScrH() * 0.05 + num * th + vp.y)
|
|
||||||
surface.DrawText(deletionstringc)
|
|
||||||
end
|
|
||||||
cam.End2D()
|
|
||||||
|
|
||||||
GlitchIntensity = oldgi
|
|
||||||
end
|
|
|
@ -1,288 +0,0 @@
|
||||||
Synesthesia = Synesthesia or {}
|
|
||||||
local syn = Synesthesia
|
|
||||||
|
|
||||||
function syn:Reset()
|
|
||||||
if IsValid(self.channel) then
|
|
||||||
if self.channel.Stop then
|
|
||||||
self.channel:Stop()
|
|
||||||
end
|
|
||||||
|
|
||||||
self.channel = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
self.events = nil
|
|
||||||
self.curevent = 1
|
|
||||||
self.length = 0
|
|
||||||
self.lasttime = 0
|
|
||||||
self.finished = false
|
|
||||||
|
|
||||||
hook.Remove("PreRender", "Synesthesia")
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:Looped()
|
|
||||||
self.curevent = 1
|
|
||||||
self.lasttime = 0
|
|
||||||
self.finished = false
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:Finished()
|
|
||||||
self.finished = true
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:Play(file, events)
|
|
||||||
self:Reset()
|
|
||||||
|
|
||||||
sound.PlayFile(file, "noblock", function(a)
|
|
||||||
if IsValid(a) then
|
|
||||||
timer.Simple(0, function()
|
|
||||||
a:EnableLooping(true)
|
|
||||||
end)
|
|
||||||
|
|
||||||
self.length = a:GetLength()
|
|
||||||
self.channel = a
|
|
||||||
self.events = events
|
|
||||||
|
|
||||||
hook.Add("PreRender", "Synesthesia", self.Think)
|
|
||||||
else
|
|
||||||
ErrorNoHaltWithStack("Failed to play ", file)
|
|
||||||
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:Stop()
|
|
||||||
self:Reset()
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:GetEvents()
|
|
||||||
return self.events
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:CurEvent()
|
|
||||||
return self.curevent
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:UpEvent()
|
|
||||||
self.curevent = self.curevent + 1
|
|
||||||
|
|
||||||
return self.curevent
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:GetLength()
|
|
||||||
return self.length
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:GetTime()
|
|
||||||
return self.channel:GetTime()
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:GetFinished()
|
|
||||||
return self.finished
|
|
||||||
end
|
|
||||||
|
|
||||||
function syn:Think()
|
|
||||||
local self = syn
|
|
||||||
local curtime = self:GetTime()
|
|
||||||
local curevent = self:GetEvents()[self:CurEvent()]
|
|
||||||
|
|
||||||
if not self:GetFinished() and curevent[1] <= curtime then
|
|
||||||
curevent[2]()
|
|
||||||
|
|
||||||
local nextevent = self:UpEvent()
|
|
||||||
|
|
||||||
if not self:GetEvents()[nextevent] then
|
|
||||||
self:Finished()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if curtime < self.lasttime then
|
|
||||||
self:Looped()
|
|
||||||
end
|
|
||||||
|
|
||||||
self.lasttime = self:GetTime()
|
|
||||||
end
|
|
||||||
|
|
||||||
local testbuildup = false
|
|
||||||
local testfovconvar = GetConVar("Beatrun_FOV", 100)
|
|
||||||
local testfov = 100
|
|
||||||
local colbeatr = 250
|
|
||||||
local colbeatg = 120
|
|
||||||
local colbeatb = 40
|
|
||||||
local colr = 250
|
|
||||||
local colg = 120
|
|
||||||
local colb = 40
|
|
||||||
local testcurcolor = 1
|
|
||||||
local testcolor = Color(151, 166, 182)
|
|
||||||
|
|
||||||
local function test_beat()
|
|
||||||
testfov = testfovconvar:GetFloat()
|
|
||||||
|
|
||||||
BlindGetColor().r = colbeatr
|
|
||||||
BlindGetColor().g = colbeatg
|
|
||||||
BlindGetColor().b = colbeatb
|
|
||||||
|
|
||||||
if not testbuildup then
|
|
||||||
blindrandx = 2
|
|
||||||
blindrandy = 2
|
|
||||||
blindrandz = 2
|
|
||||||
end
|
|
||||||
|
|
||||||
vanishrandx = 0
|
|
||||||
vanishrandy = 0
|
|
||||||
vanishrandz = 4
|
|
||||||
vanishusenormal = false
|
|
||||||
|
|
||||||
LocalPlayer():SetFOV(testfov - 1)
|
|
||||||
LocalPlayer():SetFOV(testfov, 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function test_beathard()
|
|
||||||
BlindGetColor().r = colbeatr
|
|
||||||
BlindGetColor().g = colbeatg
|
|
||||||
BlindGetColor().b = colbeatb
|
|
||||||
|
|
||||||
if not testbuildup then
|
|
||||||
blindrandx = 2
|
|
||||||
blindrandy = 2
|
|
||||||
blindrandz = 2
|
|
||||||
end
|
|
||||||
|
|
||||||
vanishrandx = 0
|
|
||||||
vanishrandy = 0
|
|
||||||
vanishrandz = 4
|
|
||||||
vanishusenormal = false
|
|
||||||
|
|
||||||
LocalPlayer():SetFOV(testfov + 2)
|
|
||||||
LocalPlayer():SetFOV(testfov, 2)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function test_color1()
|
|
||||||
colbeatb = 200
|
|
||||||
colbeatg = 200
|
|
||||||
colbeatr = 240
|
|
||||||
colb = 185
|
|
||||||
colg = 160
|
|
||||||
colr = 150
|
|
||||||
testcurcolor = 1
|
|
||||||
end
|
|
||||||
|
|
||||||
local function test_color2()
|
|
||||||
colbeatb = 5
|
|
||||||
colbeatg = 75
|
|
||||||
colbeatr = 250
|
|
||||||
colb = 40
|
|
||||||
colg = 120
|
|
||||||
colr = 250
|
|
||||||
testcurcolor = 2
|
|
||||||
end
|
|
||||||
|
|
||||||
local function test_pullback()
|
|
||||||
eyedot = 0.52
|
|
||||||
end
|
|
||||||
|
|
||||||
local function test_startbuildup()
|
|
||||||
blindrandx = 0.5
|
|
||||||
blindrandy = 0.5
|
|
||||||
blindrandz = 0.5
|
|
||||||
testbuildup = true
|
|
||||||
end
|
|
||||||
|
|
||||||
local function test_endbuildup()
|
|
||||||
testbuildup = false
|
|
||||||
end
|
|
||||||
|
|
||||||
local function test_think()
|
|
||||||
BlindGetColor().r = math.Approach(BlindGetColor().r, colr, FrameTime() * 100)
|
|
||||||
BlindGetColor().g = math.Approach(BlindGetColor().g, colg, FrameTime() * 100)
|
|
||||||
BlindGetColor().b = math.Approach(BlindGetColor().b, colb, FrameTime() * 100)
|
|
||||||
|
|
||||||
vanishrandx = math.Approach(vanishrandx, 0.5, FrameTime() * 50)
|
|
||||||
vanishrandy = math.Approach(vanishrandy, 0.5, FrameTime() * 50)
|
|
||||||
vanishrandz = math.Approach(vanishrandz, 0.5, FrameTime() * 50)
|
|
||||||
vanishusenormal = vanishrandx == 0.5
|
|
||||||
|
|
||||||
if testcurcolor == 1 then
|
|
||||||
eyedot = math.Approach(eyedot, 0.6, FrameTime() * 0.15)
|
|
||||||
else
|
|
||||||
eyedot = 0.4
|
|
||||||
end
|
|
||||||
|
|
||||||
if testbuildup then
|
|
||||||
GlitchIntensity = math.Approach(GlitchIntensity, 0.65, FrameTime() * 0.1)
|
|
||||||
|
|
||||||
blindrandx = math.Approach(blindrandx, 1.5, FrameTime() * 0.1)
|
|
||||||
blindrandy = math.Approach(blindrandy, 1.5, FrameTime() * 0.1)
|
|
||||||
blindrandz = math.Approach(blindrandz, 1.5, FrameTime() * 0.1)
|
|
||||||
else
|
|
||||||
GlitchIntensity = math.Approach(GlitchIntensity, 0.1, FrameTime() * 4)
|
|
||||||
|
|
||||||
blindrandx = math.Approach(blindrandx, 0.5, FrameTime() * 10)
|
|
||||||
blindrandy = math.Approach(blindrandy, 0.5, FrameTime() * 10)
|
|
||||||
blindrandz = math.Approach(blindrandz, 0.5, FrameTime() * 10)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local testevents = {
|
|
||||||
{0, test_color1},
|
|
||||||
{0, test_endbuildup},
|
|
||||||
{0, test_beat},
|
|
||||||
{0.75, test_pullback},
|
|
||||||
{1.1, test_pullback},
|
|
||||||
{1.9, test_pullback},
|
|
||||||
{3.25, test_beat},
|
|
||||||
{6.75, test_beat},
|
|
||||||
{7.6, test_pullback},
|
|
||||||
{8, test_pullback},
|
|
||||||
{8.85, test_pullback},
|
|
||||||
{9, test_pullback},
|
|
||||||
{9.02, test_pullback},
|
|
||||||
{10.25, test_beat},
|
|
||||||
{13.675, test_beat},
|
|
||||||
{14.5, test_pullback},
|
|
||||||
{15, test_pullback},
|
|
||||||
{15, test_startbuildup},
|
|
||||||
{15.8, test_pullback},
|
|
||||||
{15.9, test_pullback},
|
|
||||||
{16, test_pullback},
|
|
||||||
{17.065, test_beat},
|
|
||||||
{20.5, test_beat},
|
|
||||||
{21.3, test_pullback},
|
|
||||||
{21.7, test_pullback},
|
|
||||||
{22.5, test_pullback},
|
|
||||||
{22.8, test_pullback},
|
|
||||||
{22.82, test_pullback},
|
|
||||||
{24, test_beat},
|
|
||||||
{27.375, test_beathard},
|
|
||||||
{27.375, test_color2},
|
|
||||||
{30.75, test_beat},
|
|
||||||
{34.25, test_beathard},
|
|
||||||
{37.65, test_beat},
|
|
||||||
{41, test_endbuildup},
|
|
||||||
{41.1, test_beat},
|
|
||||||
{44, test_startbuildup},
|
|
||||||
{44.5, test_beat},
|
|
||||||
{48, test_beathard},
|
|
||||||
{51.4, test_beat},
|
|
||||||
{54.8, test_beat},
|
|
||||||
{54.8, test_endbuildup},
|
|
||||||
{58.25, test_beat},
|
|
||||||
{59, test_startbuildup},
|
|
||||||
{61.65, test_beathard},
|
|
||||||
{65, test_beat}
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_syn(a)
|
|
||||||
if a then
|
|
||||||
customglitch = true
|
|
||||||
|
|
||||||
BlindSetColor(testcolor)
|
|
||||||
Synesthesia:Play("sound/music/shard/puzzle_012.ogg", testevents)
|
|
||||||
hook.Add("PreRender", "test_think", test_think)
|
|
||||||
else
|
|
||||||
Synesthesia:Stop()
|
|
||||||
hook.Remove("PreRender", "test_think")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Add("Blind", "syntest", test_syn)
|
|
|
@ -1,714 +0,0 @@
|
||||||
local function push_right(self, x)
|
|
||||||
assert(x ~= nil)
|
|
||||||
|
|
||||||
self.tail = self.tail + 1
|
|
||||||
self[self.tail] = x
|
|
||||||
end
|
|
||||||
|
|
||||||
local function push_left(self, x)
|
|
||||||
assert(x ~= nil)
|
|
||||||
|
|
||||||
self[self.head] = x
|
|
||||||
self.head = self.head - 1
|
|
||||||
end
|
|
||||||
|
|
||||||
local function pop_right(self)
|
|
||||||
if self:is_empty() then return nil end
|
|
||||||
|
|
||||||
local r = self[self.tail]
|
|
||||||
self[self.tail] = nil
|
|
||||||
self.tail = self.tail - 1
|
|
||||||
|
|
||||||
return r
|
|
||||||
end
|
|
||||||
|
|
||||||
local function pop_left(self)
|
|
||||||
if self:is_empty() then return nil end
|
|
||||||
|
|
||||||
local r = self[self.head + 1]
|
|
||||||
self.head = self.head + 1
|
|
||||||
|
|
||||||
local r = self[self.head]
|
|
||||||
self[self.head] = nil
|
|
||||||
|
|
||||||
return r
|
|
||||||
end
|
|
||||||
|
|
||||||
local function length(self)
|
|
||||||
return self.tail - self.head
|
|
||||||
end
|
|
||||||
|
|
||||||
local function is_empty(self)
|
|
||||||
return self:length() == 0
|
|
||||||
end
|
|
||||||
|
|
||||||
local function iter_left(self)
|
|
||||||
local i = self.head
|
|
||||||
|
|
||||||
return function()
|
|
||||||
if i < self.tail then
|
|
||||||
i = i + 1
|
|
||||||
|
|
||||||
return self[i]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function iter_right(self)
|
|
||||||
local i = self.tail + 1
|
|
||||||
|
|
||||||
return function()
|
|
||||||
if i > self.head + 1 then
|
|
||||||
i = i - 1
|
|
||||||
|
|
||||||
return self[i]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function contents(self)
|
|
||||||
local r = {}
|
|
||||||
|
|
||||||
for i = self.head + 1, self.tail do
|
|
||||||
r[i - self.head] = self[i]
|
|
||||||
end
|
|
||||||
|
|
||||||
return r
|
|
||||||
end
|
|
||||||
|
|
||||||
local methods = {
|
|
||||||
push_right = push_right,
|
|
||||||
push_left = push_left,
|
|
||||||
peek_right = peek_right,
|
|
||||||
peek_left = peek_left,
|
|
||||||
pop_right = pop_right,
|
|
||||||
pop_left = pop_left,
|
|
||||||
rotate_right = rotate_right,
|
|
||||||
rotate_left = rotate_left,
|
|
||||||
remove_right = remove_right,
|
|
||||||
remove_left = remove_left,
|
|
||||||
iter_right = iter_right,
|
|
||||||
iter_left = iter_left,
|
|
||||||
length = length,
|
|
||||||
is_empty = is_empty,
|
|
||||||
contents = contents
|
|
||||||
}
|
|
||||||
|
|
||||||
local function new()
|
|
||||||
local r = {
|
|
||||||
head = 0,
|
|
||||||
tail = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
return setmetatable(r, {
|
|
||||||
__index = methods
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
local vecmeta = FindMetaTable("Vector")
|
|
||||||
|
|
||||||
function vecmeta:LerpTemp(t, start, endpos)
|
|
||||||
local xs, ys, zs = start:Unpack()
|
|
||||||
local xe, ye, ze = endpos:Unpack()
|
|
||||||
|
|
||||||
self:SetUnpacked(LerpL(t, xs, xe), LerpL(t, ys, ye), LerpL(t, zs, ze))
|
|
||||||
end
|
|
||||||
|
|
||||||
hitpoints = new()
|
|
||||||
hitcolor = new()
|
|
||||||
hitnormal = new()
|
|
||||||
soundpoints = new()
|
|
||||||
GlitchIntensity = 0
|
|
||||||
local tr = {}
|
|
||||||
local tr_result = {}
|
|
||||||
local randvector = Vector()
|
|
||||||
-- local box_mins = Vector(-0.5, -0.5, -0.5)
|
|
||||||
-- local box_maxs = Vector(0.5, 0.5, 0.5)
|
|
||||||
local awareness = CreateClientConVar("blindness_awareness", 10000, true, false, "Awareness in hu")
|
|
||||||
local quality = CreateClientConVar("blindness_highquality", 1, true, false, "Draws quads instead of lines", 0, 1)
|
|
||||||
-- local boxang = Angle()
|
|
||||||
-- local vanishvec = Vector()
|
|
||||||
-- local vanishvecrand = Vector()
|
|
||||||
vanishrandx = 0.5
|
|
||||||
vanishrandy = 0.5
|
|
||||||
vanishrandz = 0.5
|
|
||||||
blindrandx = 0.5
|
|
||||||
blindrandy = 0.5
|
|
||||||
blindrandz = 0.5
|
|
||||||
blindrandobeyglitch = true
|
|
||||||
vanishlimit = 50
|
|
||||||
vanishusenormal = true
|
|
||||||
eyedot = 0.4
|
|
||||||
local red = Color(255, 0, 0)
|
|
||||||
local blue = Color(0, 0, 255)
|
|
||||||
local white = Color(210, 159, 110, 255)
|
|
||||||
local green = Color(0, 255, 0)
|
|
||||||
local circle = Material("circle.png", "nocull")
|
|
||||||
whiteg = white
|
|
||||||
|
|
||||||
customcolors = {
|
|
||||||
Color(210, 159, 110, 255),
|
|
||||||
Color(203, 145, 65, 255),
|
|
||||||
Color(205, 205, 220, 255),
|
|
||||||
Color(150, 50, 150, 255),
|
|
||||||
Color(250, 20, 80, 255),
|
|
||||||
Color(250, 120, 40, 255),
|
|
||||||
Color(250, 20, 40, 255),
|
|
||||||
Color(10, 255, 20, 255)
|
|
||||||
}
|
|
||||||
|
|
||||||
local forcelines = false
|
|
||||||
|
|
||||||
function BlindSetColor(newcol)
|
|
||||||
white = newcol
|
|
||||||
end
|
|
||||||
|
|
||||||
function BlindGetColor()
|
|
||||||
return white
|
|
||||||
end
|
|
||||||
|
|
||||||
local grass = Color(20, 150, 10)
|
|
||||||
local sand = Color(76, 70, 50)
|
|
||||||
local glass = Color(10, 20, 150)
|
|
||||||
local limit = 5400
|
|
||||||
-- local pinged = false
|
|
||||||
local camvector = Vector()
|
|
||||||
local camang = Angle()
|
|
||||||
local camlerp = 0
|
|
||||||
local lerp, sound, bgm = nil
|
|
||||||
|
|
||||||
blindcolor = {0, 0, 0}
|
|
||||||
|
|
||||||
local colors = {
|
|
||||||
[MAT_DEFAULT] = blue,
|
|
||||||
[MAT_GLASS] = glass,
|
|
||||||
[MAT_SAND] = sand,
|
|
||||||
[MAT_DIRT] = sand,
|
|
||||||
[MAT_GRASS] = grass,
|
|
||||||
[MAT_FLESH] = red
|
|
||||||
}
|
|
||||||
|
|
||||||
local colorslist = {green, grass, sand, glass}
|
|
||||||
|
|
||||||
blindrandrendermin = 0.9
|
|
||||||
blindinverted = false
|
|
||||||
blindpopulate = false
|
|
||||||
blindpopulatespeed = 1000
|
|
||||||
blindfakepopulate = false
|
|
||||||
customglitch = false
|
|
||||||
blindcustomlerp = 0
|
|
||||||
|
|
||||||
blindcustompoints = {Vector()}
|
|
||||||
|
|
||||||
local blindcustompoints = blindcustompoints
|
|
||||||
|
|
||||||
-- local sizemult = 1
|
|
||||||
function InvertColors()
|
|
||||||
for k, v in ipairs(colorslist) do
|
|
||||||
v.r = 255 - v.r
|
|
||||||
v.g = 255 - v.g
|
|
||||||
v.b = 255 - v.b
|
|
||||||
end
|
|
||||||
|
|
||||||
blindinverted = not blindinverted
|
|
||||||
|
|
||||||
if blindinverted then
|
|
||||||
white.r = 0
|
|
||||||
white.g = 0
|
|
||||||
white.b = 0
|
|
||||||
sizemult = 4
|
|
||||||
blindcolor[1] = 61
|
|
||||||
blindcolor[2] = 61
|
|
||||||
blindcolor[3] = 61
|
|
||||||
blindrandrendermin = 1
|
|
||||||
else
|
|
||||||
white.r = 210
|
|
||||||
white.g = 159
|
|
||||||
white.b = 110
|
|
||||||
blindcolor[1] = 0
|
|
||||||
blindcolor[2] = 0
|
|
||||||
blindcolor[3] = 0
|
|
||||||
blindrandrendermin = 0.9
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function TogglePopulate()
|
|
||||||
blindfakepopulate = not blindfakepopulate
|
|
||||||
end
|
|
||||||
|
|
||||||
local colorsclass = {
|
|
||||||
prop_door_rotating = green,
|
|
||||||
func_door_rotating = green,
|
|
||||||
func_door = green
|
|
||||||
}
|
|
||||||
|
|
||||||
local blindedsounds = {
|
|
||||||
["bad.wav"] = true,
|
|
||||||
["music/locloop_unk.wav"] = true,
|
|
||||||
["lidar/burst1.wav"] = true,
|
|
||||||
["glitch.wav"] = true,
|
|
||||||
["A_TT_CD_02.wav"] = true,
|
|
||||||
["good.wav"] = true,
|
|
||||||
["reset.wav"] = true,
|
|
||||||
["ping.wav"] = true,
|
|
||||||
["music/locloop.wav"] = true,
|
|
||||||
["lidar/burst2.wav"] = true,
|
|
||||||
["reset2.wav"] = true,
|
|
||||||
["A_TT_CD_01.wav"] = true,
|
|
||||||
["lidar/scan.wav"] = true,
|
|
||||||
["lidar/burst4.wav"] = true,
|
|
||||||
["lidar/burst3.wav"] = true,
|
|
||||||
["lidar/scanstop.wav"] = true
|
|
||||||
}
|
|
||||||
|
|
||||||
local trw = {
|
|
||||||
collisiongroup = COLLISION_GROUP_WORLD
|
|
||||||
}
|
|
||||||
|
|
||||||
local trwr = {}
|
|
||||||
|
|
||||||
local function IsInWorld(pos)
|
|
||||||
trw.start = pos
|
|
||||||
trw.endpos = pos
|
|
||||||
trw.output = trwr
|
|
||||||
|
|
||||||
util.TraceLine(trw)
|
|
||||||
|
|
||||||
return trwr.HitWorld
|
|
||||||
end
|
|
||||||
|
|
||||||
local function RandomizeCam(eyepos, eyeang)
|
|
||||||
local ctsin = 1 / (LocalPlayer():GetEyeTrace().Fraction * 200)
|
|
||||||
|
|
||||||
if IsInWorld(eyepos) then
|
|
||||||
ctsin = 100
|
|
||||||
end
|
|
||||||
|
|
||||||
lerp = Lerp(25 * FrameTime(), camlerp, ctsin)
|
|
||||||
camvector.x = eyepos.x + lerp
|
|
||||||
camvector.y = eyepos.y + lerp
|
|
||||||
camvector.z = eyepos.z + lerp
|
|
||||||
camang.p = eyeang.p
|
|
||||||
camang.y = eyeang.y
|
|
||||||
camang.r = eyeang.r
|
|
||||||
end
|
|
||||||
|
|
||||||
local function populatetrace(eyepos)
|
|
||||||
local af = awareness:GetFloat() or 1000
|
|
||||||
randvector.x = eyepos.x + math.random(-af, af)
|
|
||||||
randvector.y = eyepos.y + math.random(-af, af)
|
|
||||||
randvector.z = eyepos.z + math.random(-af * 0.5, af)
|
|
||||||
tr.start = eyepos
|
|
||||||
tr.endpos = randvector
|
|
||||||
tr.output = tr_result
|
|
||||||
|
|
||||||
if not IsValid(tr.filter) then
|
|
||||||
tr.filter = LocalPlayer()
|
|
||||||
end
|
|
||||||
|
|
||||||
util.TraceLine(tr)
|
|
||||||
|
|
||||||
return tr_result
|
|
||||||
end
|
|
||||||
|
|
||||||
local function Echo(t)
|
|
||||||
table.insert(soundpoints, t.Pos)
|
|
||||||
|
|
||||||
if not blindedsounds[t.SoundName] and t.SoundName:Left(3) ~= "te/" then return false end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function PopThatMotherfucker()
|
|
||||||
hitpoints:pop_left()
|
|
||||||
hitcolor:pop_left()
|
|
||||||
hitnormal:pop_left()
|
|
||||||
end
|
|
||||||
|
|
||||||
local blindcolor = blindcolor
|
|
||||||
local fakepopulatevec = Vector(1, 2, 3)
|
|
||||||
LOCEntities = LOCEntities or {}
|
|
||||||
meshtbl = meshtbl or new()
|
|
||||||
local meshtbl = meshtbl
|
|
||||||
pausescan = false
|
|
||||||
|
|
||||||
--[[
|
|
||||||
local function OptimizeMeshes()
|
|
||||||
local i = 0
|
|
||||||
-- local vertexcount = 0
|
|
||||||
|
|
||||||
for v in meshtbl:iter_left() do
|
|
||||||
if i >= 90 then break end
|
|
||||||
|
|
||||||
v:Destroy()
|
|
||||||
i = i + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
]]
|
|
||||||
|
|
||||||
glob_blindangles = Angle()
|
|
||||||
glob_blindorigin = Vector()
|
|
||||||
curmesh = Mesh()
|
|
||||||
local lastpointcount = 0
|
|
||||||
local nextcachecheck = 0
|
|
||||||
|
|
||||||
local function Blindness(origin, angles)
|
|
||||||
local ply = LocalPlayer()
|
|
||||||
local eyepos = origin
|
|
||||||
local eyeang = angles
|
|
||||||
local FT = FrameTime()
|
|
||||||
local quality = quality:GetBool()
|
|
||||||
|
|
||||||
glob_blindorigin:Set(origin)
|
|
||||||
glob_blindangles:Set(angles)
|
|
||||||
|
|
||||||
local hitpointscount = nil
|
|
||||||
-- local vel_l = ply:GetVelocity():Length()
|
|
||||||
-- local vel = 2.5
|
|
||||||
cang = math.pi * 2 / 16 + (ply.offset or 0)
|
|
||||||
cpos = Vector(0, math.cos(cang) * 75, math.sin(cang) * 250)
|
|
||||||
ply.offset = (ply.offset or 0) + FrameTime()
|
|
||||||
|
|
||||||
if ply.offset >= 180 then
|
|
||||||
ply.offset = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
local randrender = math.Rand(blindrandrendermin, 1)
|
|
||||||
|
|
||||||
render.Clear(blindcolor[1] * randrender, blindcolor[2] * randrender, blindcolor[3] * randrender, 0)
|
|
||||||
render.ClearDepth()
|
|
||||||
render.ClearStencil()
|
|
||||||
|
|
||||||
if blindpopulate then
|
|
||||||
for i = 0, FT * blindpopulatespeed do
|
|
||||||
if not blindfakepopulate then
|
|
||||||
local trace = populatetrace(blindorigin or eyepos)
|
|
||||||
|
|
||||||
if trace.Hit then
|
|
||||||
hitpoints:push_right(trace.HitPos)
|
|
||||||
|
|
||||||
local invert = math.random()
|
|
||||||
|
|
||||||
if invert < 0.05 then
|
|
||||||
trace.HitNormal:Mul(-1)
|
|
||||||
end
|
|
||||||
|
|
||||||
hitnormal:push_right(trace.HitNormal)
|
|
||||||
|
|
||||||
local hcol = colors[trace.MatType]
|
|
||||||
local hcolclass = colorsclass[trace.Entity:GetClass()]
|
|
||||||
|
|
||||||
hitcolor:push_right(hcol or hcolclass or white)
|
|
||||||
|
|
||||||
if limit < hitpoints:length() then
|
|
||||||
PopThatMotherfucker()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
hitpoints:push_right(fakepopulatevec)
|
|
||||||
hitnormal:push_right(fakepopulatevec)
|
|
||||||
hitcolor:push_right(white)
|
|
||||||
|
|
||||||
if limit < hitpoints:length() then
|
|
||||||
PopThatMotherfucker()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
hitpointscount = soundpoints:length()
|
|
||||||
|
|
||||||
while limit < hitpointscount do
|
|
||||||
soundpoints:pop_left()
|
|
||||||
hitpointscount = soundpoints:length()
|
|
||||||
end
|
|
||||||
|
|
||||||
RandomizeCam(eyepos, eyeang)
|
|
||||||
|
|
||||||
if sound then
|
|
||||||
sound:ChangeVolume((lerp - 0.1) * 0.25)
|
|
||||||
end
|
|
||||||
|
|
||||||
cam.Start3D(camvector, camang)
|
|
||||||
|
|
||||||
for k, v in pairs(LOCEntities) do
|
|
||||||
if not IsValid(k) then
|
|
||||||
LOCEntities[k] = nil
|
|
||||||
else
|
|
||||||
k:DrawLOC()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local f = eyeang:Forward()
|
|
||||||
local eyediff = Vector()
|
|
||||||
local k = limit
|
|
||||||
local k2 = 0
|
|
||||||
-- local lastpos = hitpoints[hitpoints.tail]
|
|
||||||
-- local vanishlimit = vanishlimit
|
|
||||||
-- local vanishrandx = vanishrandx
|
|
||||||
-- local vanishrandy = vanishrandy
|
|
||||||
-- local vanishrandz = vanishrandz
|
|
||||||
-- local blindrandx = blindrandx
|
|
||||||
-- local blindrandy = blindrandy
|
|
||||||
-- local blindrandz = blindrandz
|
|
||||||
-- local blindrandobeyglitch = blindrandobeyglitch
|
|
||||||
render.SetMaterial(circle)
|
|
||||||
|
|
||||||
if not customglitch then
|
|
||||||
GlitchIntensity = lerp
|
|
||||||
end
|
|
||||||
|
|
||||||
LocalPlayer().offset = (LocalPlayer().offset or 0) + FrameTime() * 2
|
|
||||||
|
|
||||||
if LocalPlayer().offset >= 180 then
|
|
||||||
LocalPlayer().offset = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
local ed = eyedot
|
|
||||||
local anggg = ply:EyeAngles()
|
|
||||||
anggg.x = 0
|
|
||||||
|
|
||||||
local eyep = ply:EyePos() + anggg:Forward() * 200
|
|
||||||
local hitindex = 1
|
|
||||||
local drawcount = #blindcustompoints
|
|
||||||
local drawiters = 0
|
|
||||||
local lerpt = blindcustomlerp
|
|
||||||
|
|
||||||
if not pausescan then
|
|
||||||
if not curmesh:IsValid() or CurTime() < nextcachecheck then
|
|
||||||
-- local dynmesh = nil
|
|
||||||
|
|
||||||
if CurTime() < nextcachecheck then
|
|
||||||
if curmesh:IsValid() then
|
|
||||||
curmesh:Destroy()
|
|
||||||
end
|
|
||||||
|
|
||||||
dynmesh = mesh.Begin(MATERIAL_QUADS, limit)
|
|
||||||
else
|
|
||||||
curmesh = Mesh()
|
|
||||||
dynmesh = mesh.Begin(curmesh, MATERIAL_QUADS, limit)
|
|
||||||
end
|
|
||||||
|
|
||||||
for v in hitpoints:iter_right() do
|
|
||||||
local col = hitcolor[hitcolor.tail - k2] or BlindGetColor()
|
|
||||||
eyediff:Set(v)
|
|
||||||
local drawindex = hitindex % drawcount + 1
|
|
||||||
|
|
||||||
if drawindex == 1 then
|
|
||||||
drawiters = drawiters + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
eyep = blindcustompoints[drawindex] + Vector(math.random() * 2, math.random() * 2, math.random() * 2)
|
|
||||||
|
|
||||||
if drawiters < 2 then
|
|
||||||
eyediff:LerpTemp(lerpt, eyediff, eyep)
|
|
||||||
end
|
|
||||||
|
|
||||||
eyediff:Sub(eyepos)
|
|
||||||
|
|
||||||
if ed < f:Dot(eyediff) / eyediff:Length() then
|
|
||||||
eyediff:Set(v)
|
|
||||||
|
|
||||||
if v ~= fakepopulatevec then
|
|
||||||
if quality and not forcelines then
|
|
||||||
mesh.QuadEasy(eyediff, hitnormal[hitnormal.tail - k2], 2, 2, col)
|
|
||||||
else
|
|
||||||
render.DrawLine(eyediff, v, col)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
lastpos = v
|
|
||||||
end
|
|
||||||
|
|
||||||
k = k - 1
|
|
||||||
k2 = k2 + 1
|
|
||||||
hitindex = hitindex + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
mesh.End()
|
|
||||||
|
|
||||||
if curmesh:IsValid() then
|
|
||||||
curmesh:Draw()
|
|
||||||
end
|
|
||||||
else
|
|
||||||
curmesh:Draw()
|
|
||||||
end
|
|
||||||
|
|
||||||
if lastpointcount ~= hitpoints:length() then
|
|
||||||
nextcachecheck = CurTime() + 0.1
|
|
||||||
end
|
|
||||||
|
|
||||||
lastpointcount = hitpoints:length()
|
|
||||||
end
|
|
||||||
|
|
||||||
for v in meshtbl:iter_left() do
|
|
||||||
v:Draw()
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Run("Blind3D", origin, angles)
|
|
||||||
cam.End3D()
|
|
||||||
hook.Run("Blind3DPost", origin, angles)
|
|
||||||
|
|
||||||
-- local ctsin = math.sin(CurTime())
|
|
||||||
local col = white
|
|
||||||
col.a = alpha
|
|
||||||
|
|
||||||
hook.Run("RenderScreenspaceEffects")
|
|
||||||
|
|
||||||
local AEUIDraw = hook.GetTable().HUDPaint.AEUIDraw
|
|
||||||
|
|
||||||
if AEUIDraw then
|
|
||||||
cam.Start2D()
|
|
||||||
AEUIDraw()
|
|
||||||
cam.End2D()
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
blinded = false
|
|
||||||
|
|
||||||
local function BlindnessPreUI()
|
|
||||||
if blinded then
|
|
||||||
cam.Start3D()
|
|
||||||
render.Clear(10, 10, 10, 0)
|
|
||||||
|
|
||||||
cam.End3D()
|
|
||||||
|
|
||||||
draw.NoTexture()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--[[
|
|
||||||
local te = "te/metamorphosis/"
|
|
||||||
|
|
||||||
local jingles = {
|
|
||||||
land = te .. "3-linedrop",
|
|
||||||
jump = te .. "1-linemove",
|
|
||||||
jumpwallrun = te .. "3-spin",
|
|
||||||
wallrunh = te .. "3-spin",
|
|
||||||
wallrunv = te .. "3-spin",
|
|
||||||
coil = te .. "3-spin"
|
|
||||||
}
|
|
||||||
local jinglescount = {
|
|
||||||
jump = 6,
|
|
||||||
wallrunh = 6,
|
|
||||||
jumpwallrun = 6,
|
|
||||||
wallrunv = 6,
|
|
||||||
land = 11,
|
|
||||||
coil = 6
|
|
||||||
}
|
|
||||||
|
|
||||||
local function BlindnessJingles(event)
|
|
||||||
if jingles[event] then
|
|
||||||
LocalPlayer():EmitSound(jingles[event] .. math.random(1, jinglescount[event]) .. ".wav")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
]]
|
|
||||||
|
|
||||||
function ToggleBlindness(toggle)
|
|
||||||
blinded = toggle
|
|
||||||
|
|
||||||
if blinded then
|
|
||||||
local ply = LocalPlayer()
|
|
||||||
local activewep = ply:GetActiveWeapon()
|
|
||||||
|
|
||||||
if ply:UsingRH() and activewep.RunWind1 then
|
|
||||||
activewep.RunWind1:Stop()
|
|
||||||
activewep.RunWind2:Stop()
|
|
||||||
end
|
|
||||||
|
|
||||||
gui.HideGameUI()
|
|
||||||
hook.Add("EntityEmitSound", "Echo", Echo)
|
|
||||||
hook.Add("RenderScene", "Blindness", Blindness)
|
|
||||||
hook.Add("PreDrawHUD", "Blindness", BlindnessPreUI)
|
|
||||||
hook.Add("RenderScreenspaceEffects", "CA", RenderCA)
|
|
||||||
|
|
||||||
local milestone = ply:GetLevel() >= 100
|
|
||||||
local bgmstring = milestone and "music/locloop.wav" or "music/locloop_unk.wav"
|
|
||||||
|
|
||||||
forcelines = not milestone
|
|
||||||
|
|
||||||
BlindSetColor(milestone and customcolors[1] or customcolors[3])
|
|
||||||
|
|
||||||
if not sound then
|
|
||||||
sound = CreateSound(LocalPlayer(), "glitch.wav")
|
|
||||||
end
|
|
||||||
|
|
||||||
if not bgm then
|
|
||||||
bgm = CreateSound(LocalPlayer(), bgmstring)
|
|
||||||
end
|
|
||||||
|
|
||||||
sound:PlayEx(0, 100)
|
|
||||||
|
|
||||||
if incredits then
|
|
||||||
EmitSound("music/Sunrise.mp3", vector_origin, -2, 0, 1, 75, SND_SHOULDPAUSE)
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Run("Blind", true)
|
|
||||||
else
|
|
||||||
hook.Remove("EntityEmitSound", "Echo")
|
|
||||||
hook.Remove("RenderScene", "Blindness")
|
|
||||||
hook.Remove("PreDrawHUD", "Blindness")
|
|
||||||
hook.Remove("RenderScreenspaceEffects", "CA")
|
|
||||||
surface.SetAlphaMultiplier(1)
|
|
||||||
|
|
||||||
if sound then
|
|
||||||
sound:Stop()
|
|
||||||
end
|
|
||||||
|
|
||||||
if bgm then
|
|
||||||
bgm:Stop()
|
|
||||||
bgm = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Run("Blind", false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function cool()
|
|
||||||
local k = limit
|
|
||||||
local k2 = 0
|
|
||||||
a = Mesh(circle)
|
|
||||||
mesh.Begin(a, MATERIAL_QUADS, limit)
|
|
||||||
|
|
||||||
-- local ed = Vector()
|
|
||||||
-- local meshlen = meshtbl:length()
|
|
||||||
|
|
||||||
for v in hitpoints:iter_right() do
|
|
||||||
mesh.QuadEasy(v, hitnormal[hitnormal.tail - k2], 2, 2, hitcolor[hitcolor.tail - k2] or white)
|
|
||||||
|
|
||||||
k = k - 1
|
|
||||||
k2 = k2 + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
mesh.End()
|
|
||||||
meshtbl:push_right(a)
|
|
||||||
|
|
||||||
if meshtbl:length() > 160 then
|
|
||||||
meshtbl:pop_left():Destroy()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
net.Receive("BlindPlayers", function()
|
|
||||||
ToggleBlindness(net.ReadBool())
|
|
||||||
end)
|
|
||||||
|
|
||||||
net.Receive("BlindNPCKilled", function()
|
|
||||||
LocalPlayer():EmitSound("bad.wav", 50, 100 + math.random(-5, 2))
|
|
||||||
end)
|
|
||||||
|
|
||||||
hook.Add("OnEntityCreated", "BlindnessEntities", function(ent)
|
|
||||||
timer.Simple(0.5, function()
|
|
||||||
if IsValid(ent) and ent.DrawLOC then
|
|
||||||
LOCEntities[ent] = true
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
hook.Add("InitPostEntity", "Beatrun_LOC", function()
|
|
||||||
if GetGlobalBool("LOC") then
|
|
||||||
ToggleBlindness(true)
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Remove("EntityEmitSound", "zzz_TFA_EntityEmitSound")
|
|
||||||
hook.Remove("InitPostEntity", "Beatrun_LOC")
|
|
||||||
end)
|
|
|
@ -593,7 +593,7 @@ if SERVER then
|
||||||
game.CleanUpMap()
|
game.CleanUpMap()
|
||||||
|
|
||||||
local a = util.Decompress(data) or data
|
local a = util.Decompress(data) or data
|
||||||
local crc = util.CRC(a)
|
local id = util.CRC(a)
|
||||||
local data = util.JSONToTable(a)
|
local data = util.JSONToTable(a)
|
||||||
|
|
||||||
local props = data[1]
|
local props = data[1]
|
||||||
|
@ -664,7 +664,7 @@ if SERVER then
|
||||||
|
|
||||||
Course_StartAng = ang
|
Course_StartAng = ang
|
||||||
Course_Name = name
|
Course_Name = name
|
||||||
Course_ID = crc
|
Course_ID = id
|
||||||
|
|
||||||
Course_Sync()
|
Course_Sync()
|
||||||
|
|
||||||
|
@ -942,7 +942,7 @@ if CLIENT then
|
||||||
function SaveCourse(name, compress)
|
function SaveCourse(name, compress)
|
||||||
local save = CourseData(name)
|
local save = CourseData(name)
|
||||||
local jsonsave = util.TableToJSON(save)
|
local jsonsave = util.TableToJSON(save)
|
||||||
local crc = util.CRC(jsonsave)
|
local id = util.CRC(jsonsave)
|
||||||
local dir = "beatrun/courses/" .. game.GetMap() .. "/"
|
local dir = "beatrun/courses/" .. game.GetMap() .. "/"
|
||||||
|
|
||||||
if compress == nil then compress = true end
|
if compress == nil then compress = true end
|
||||||
|
@ -950,12 +950,12 @@ if CLIENT then
|
||||||
file.CreateDir(dir)
|
file.CreateDir(dir)
|
||||||
|
|
||||||
if compress then
|
if compress then
|
||||||
file.Write(dir .. crc .. ".txt", util.Compress(jsonsave))
|
file.Write(dir .. id .. ".txt", util.Compress(jsonsave))
|
||||||
else
|
else
|
||||||
file.Write(dir .. crc .. ".txt", jsonsave)
|
file.Write(dir .. id .. ".txt", jsonsave)
|
||||||
end
|
end
|
||||||
|
|
||||||
print("Save created: " .. crc .. ".txt")
|
print("Save created: " .. id .. ".txt")
|
||||||
end
|
end
|
||||||
|
|
||||||
concommand.Add("Beatrun_SaveCourse", function(ply, cmd, args, argstr)
|
concommand.Add("Beatrun_SaveCourse", function(ply, cmd, args, argstr)
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
--[[
|
|
||||||
local prefabs = {
|
|
||||||
basic_floor = {
|
|
||||||
{Vector(), Vector(300, 300, 50), 0, 0, 0}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]]
|
|
||||||
|
|
||||||
function SpawnPrefab(pos, data)
|
|
||||||
for k, v in ipairs(data) do
|
|
||||||
-- local mins = v[1]
|
|
||||||
-- local maxs = v[2]
|
|
||||||
local offsetx = v[3] or 0
|
|
||||||
local offsety = v[4] or 0
|
|
||||||
local offsetz = v[5] or 0
|
|
||||||
local offsetvec = Vector(offsetx, offsety, offsetz)
|
|
||||||
|
|
||||||
offsetvec:Add(pos)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,231 +0,0 @@
|
||||||
if SERVER then
|
|
||||||
util.AddNetworkString("ReplaySendToClient")
|
|
||||||
end
|
|
||||||
|
|
||||||
function ReplayCmd(ply, cmd)
|
|
||||||
if not ply.ReplayRecording then return end
|
|
||||||
if cmd:TickCount() == 0 then return end
|
|
||||||
|
|
||||||
if not ply.ReplayFirstTick and cmd:TickCount() ~= 0 then
|
|
||||||
ply.ReplayFirstTick = cmd:TickCount()
|
|
||||||
end
|
|
||||||
|
|
||||||
local ang = cmd:GetViewAngles()
|
|
||||||
|
|
||||||
if ply.ReplayLastAng == ang then
|
|
||||||
ang = 0
|
|
||||||
else
|
|
||||||
ply.ReplayLastAng = ang
|
|
||||||
end
|
|
||||||
|
|
||||||
local curtick = cmd:TickCount() - ply.ReplayFirstTick + 1
|
|
||||||
|
|
||||||
if ang == 0 then
|
|
||||||
ply.ReplayTicks[curtick] = {cmd:GetButtons(), cmd:GetForwardMove(), cmd:GetSideMove()}
|
|
||||||
else
|
|
||||||
ply.ReplayTicks[curtick] = {cmd:GetButtons(), ang.x, ang.y, cmd:GetForwardMove(), cmd:GetSideMove()}
|
|
||||||
end
|
|
||||||
|
|
||||||
if curtick > 23760 then
|
|
||||||
print("Replay recording stopped - too long")
|
|
||||||
|
|
||||||
ply.ReplayRecording = false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Add("StartCommand", "ReplayStart", ReplayCmd)
|
|
||||||
|
|
||||||
function ReplayStart(ply)
|
|
||||||
if not game.SinglePlayer() then return end
|
|
||||||
if ply.InReplay then return end
|
|
||||||
|
|
||||||
print("Starting Replay")
|
|
||||||
|
|
||||||
ply.ReplayRecording = true
|
|
||||||
ply.ReplayTicks = {}
|
|
||||||
ply.ReplayFirstTick = false
|
|
||||||
ply.ReplayStartPos = ply:GetPos()
|
|
||||||
ply.ReplayLastAng = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
function ReplayStop(ply, debugdump)
|
|
||||||
if not game.SinglePlayer() then return end
|
|
||||||
if not ply.ReplayTicks then return end
|
|
||||||
if ply.InReplay then return end
|
|
||||||
|
|
||||||
print("Ending Replay (" .. #ply.ReplayTicks .. "ticks)")
|
|
||||||
|
|
||||||
ply.InReplay = false
|
|
||||||
ply.ReplayRecording = false
|
|
||||||
|
|
||||||
local debugdata = {ply.ReplayStartPos, ply.ReplayTicks}
|
|
||||||
|
|
||||||
local replay = util.Compress(util.TableToJSON(debugdata))
|
|
||||||
local dir = "beatrun/replays/" .. game.GetMap() .. "/"
|
|
||||||
|
|
||||||
file.CreateDir(dir)
|
|
||||||
file.Write(dir .. "replaydump.txt", replay)
|
|
||||||
end
|
|
||||||
|
|
||||||
local RFF = true
|
|
||||||
|
|
||||||
function ReplayPlayback(ply, cmd)
|
|
||||||
if not ply.InReplay or not ply.ReplayTicks then return end
|
|
||||||
|
|
||||||
local cmdtc = cmd:TickCount()
|
|
||||||
|
|
||||||
if cmdtc == 0 then return end
|
|
||||||
|
|
||||||
if not ply.ReplayFirstTick then
|
|
||||||
ply.ReplayFirstTick = cmdtc
|
|
||||||
|
|
||||||
if SERVER then
|
|
||||||
ply:SetNWInt("ReplayFirstTick", cmdtc)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local firsttick = ply:GetNWInt("ReplayFirstTick")
|
|
||||||
|
|
||||||
if ply.ReplayTicks[cmdtc - firsttick + 1] then
|
|
||||||
tickcount = cmdtc - firsttick + 1
|
|
||||||
|
|
||||||
if ply.ReplayEndAtTick and ply.ReplayEndAtTick <= tickcount then
|
|
||||||
ply.ReplayTicks = {}
|
|
||||||
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local tickdata = ply.ReplayTicks[tickcount]
|
|
||||||
local shortdata = #tickdata == 3
|
|
||||||
local ang = shortdata and 0 or Angle(tickdata[2], tickdata[3], cmd:GetViewAngles().z)
|
|
||||||
|
|
||||||
if not shortdata then
|
|
||||||
ply.ReplayLastAng = ang
|
|
||||||
end
|
|
||||||
|
|
||||||
cmd:SetButtons(tickdata[1])
|
|
||||||
cmd:SetViewAngles(ply.ReplayLastAng)
|
|
||||||
|
|
||||||
if shortdata then
|
|
||||||
cmd:SetForwardMove(tickdata[2])
|
|
||||||
cmd:SetSideMove(tickdata[3])
|
|
||||||
else
|
|
||||||
cmd:SetForwardMove(tickdata[4])
|
|
||||||
cmd:SetSideMove(tickdata[5])
|
|
||||||
end
|
|
||||||
|
|
||||||
cmd:RemoveKey(IN_RELOAD)
|
|
||||||
elseif SERVER and cmdtc - firsttick + 1 > 0 or CLIENT and not ply:GetNWBool("InReplay") and RFF < CurTime() then
|
|
||||||
print("Replay cancelled: nil tick at " .. cmdtc - firsttick + 1, firsttick)
|
|
||||||
|
|
||||||
if SERVER then
|
|
||||||
ply:SetNWBool("InReplay", false)
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Remove("StartCommand", "ReplayPlay")
|
|
||||||
hook.Remove("RenderScreenspaceEffects", "BeatrunReplayVision")
|
|
||||||
hook.Remove("HUDPaint", "BeatrunReplayHUD")
|
|
||||||
|
|
||||||
ply.InReplay = false
|
|
||||||
ply.ReplayFirstTick = false
|
|
||||||
|
|
||||||
if TUTORIALMODE then
|
|
||||||
net.Start("ReplayTutorialPos")
|
|
||||||
net.WriteVector(ply.ReplayStartPos)
|
|
||||||
net.SendToServer()
|
|
||||||
|
|
||||||
TutorialClearEvents()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function ReplaySendToClient(ply)
|
|
||||||
if not game.SinglePlayer() then return end
|
|
||||||
|
|
||||||
local replaydata = util.JSONToTable(util.Decompress(file.Read("beatrun/replays/" .. game.GetMap() .. "/replaydump.txt", "DATA")))
|
|
||||||
|
|
||||||
ply.ReplayFirstTick = false
|
|
||||||
ply.ReplayStartPos = replaydata[1]
|
|
||||||
ply.ReplayTicks = replaydata[2]
|
|
||||||
ply:SetNWBool("InReplay", true)
|
|
||||||
|
|
||||||
net.Start("ReplaySendToClient")
|
|
||||||
net.Send(ply)
|
|
||||||
|
|
||||||
ply.InReplay = true
|
|
||||||
ply:SetPos(ply.ReplayStartPos)
|
|
||||||
ply:SetVelocity(vector_origin)
|
|
||||||
|
|
||||||
hook.Add("StartCommand", "ReplayPlay", ReplayPlayback)
|
|
||||||
end
|
|
||||||
|
|
||||||
if CLIENT then
|
|
||||||
local tab = {
|
|
||||||
["$pp_colour_contrast"] = 0.9,
|
|
||||||
["$pp_colour_addg"] = 0.5799,
|
|
||||||
["$pp_colour_addb"] = 1.12,
|
|
||||||
["$pp_colour_addr"] = 0,
|
|
||||||
["$pp_colour_colour"] = 0.14,
|
|
||||||
["$pp_colour_brightness"] = -0.57,
|
|
||||||
["$pp_colour_mulg"] = 0,
|
|
||||||
["$pp_colour_mulb"] = 0,
|
|
||||||
["$pp_colour_mulr"] = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
local function BeatrunReplayVision()
|
|
||||||
if LocalPlayer().ReplayFirstTick then
|
|
||||||
DrawColorModify(tab)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local rcol = Color(200, 200, 200)
|
|
||||||
|
|
||||||
local function BeatrunReplayHUD()
|
|
||||||
if LocalPlayer().ReplayTicks and not LocalPlayer().ReplayTicks.reliable then
|
|
||||||
surface.SetFont("BeatrunHUD")
|
|
||||||
surface.SetTextColor(rcol)
|
|
||||||
surface.SetTextPos(5, ScrH() * 0.975)
|
|
||||||
|
|
||||||
local text = TUTORIALMODE and "" or "*Clientside replay: may not be accurate "
|
|
||||||
surface.DrawText(text .. tickcount .. "/" .. #LocalPlayer().ReplayTicks)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function ReplayBegin()
|
|
||||||
LocalPlayer().InReplay = true
|
|
||||||
|
|
||||||
RFF = CurTime() + 1
|
|
||||||
|
|
||||||
hook.Add("StartCommand", "ReplayPlay", ReplayPlayback)
|
|
||||||
hook.Add("RenderScreenspaceEffects", "BeatrunReplayVision", BeatrunReplayVision)
|
|
||||||
hook.Add("HUDPaint", "BeatrunReplayHUD", BeatrunReplayHUD)
|
|
||||||
|
|
||||||
surface.PlaySound("friends/friend_join.wav")
|
|
||||||
end
|
|
||||||
|
|
||||||
net.Receive("ReplayRequest", ReplayBegin)
|
|
||||||
|
|
||||||
net.Receive("ReplaySendToClient", function(length)
|
|
||||||
if length < 100 then
|
|
||||||
LocalPlayer().ReplayTicks = util.JSONToTable(util.Decompress(file.Read("beatrun/replays/" .. game.GetMap() .. "/replaydump.txt", "DATA")))[2]
|
|
||||||
else
|
|
||||||
LocalPlayer().ReplayTicks = util.JSONToTable(util.Decompress(net.ReadData(length)))
|
|
||||||
end
|
|
||||||
|
|
||||||
LocalPlayer().ReplayFirstTick = false
|
|
||||||
ReplayBegin()
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
function ReplayCancel(ply)
|
|
||||||
hook.Remove("StartCommand", "ReplayPlay")
|
|
||||||
hook.Remove("RenderScreenspaceEffects", "BeatrunReplayVision")
|
|
||||||
hook.Remove("HUDPaint", "BeatrunReplayHUD")
|
|
||||||
|
|
||||||
ply.InReplay = false
|
|
||||||
ply.ReplayFirstTick = false
|
|
||||||
|
|
||||||
net.Start("ReplayRequest")
|
|
||||||
net.WriteBool(true)
|
|
||||||
net.SendToServer()
|
|
||||||
end
|
|
|
@ -4,10 +4,9 @@ hook.Add("EntityTakeDamage", "MEHitSounds", function(ply, dmginfo)
|
||||||
if not ply:IsPlayer() then return end
|
if not ply:IsPlayer() then return end
|
||||||
|
|
||||||
if dmginfo:IsBulletDamage() then
|
if dmginfo:IsBulletDamage() then
|
||||||
-- Block damage if they're going very fast
|
if ply:GetVelocity():Length() > 400 then return true end -- Block damage if they're going very fast
|
||||||
if ply:GetVelocity():Length() > 400 then return true end
|
|
||||||
|
|
||||||
ply:EmitSound("mirrorsedge/Flesh_0" .. tostring(math.random(1, 9)) .. ".wav")
|
ply:EmitSound("mirrorsedgse/Flesh_0" .. tostring(math.random(1, 9)) .. ".wav")
|
||||||
ply:ViewPunch(Angle(math.Rand(-10, -5), 0, math.Rand(0, 5)))
|
ply:ViewPunch(Angle(math.Rand(-10, -5), 0, math.Rand(0, 5)))
|
||||||
elseif not ply:HasGodMode() and (dmginfo:IsFallDamage() and ply:Health() - dmginfo:GetDamage() <= 0) then
|
elseif not ply:HasGodMode() and (dmginfo:IsFallDamage() and ply:Health() - dmginfo:GetDamage() <= 0) then
|
||||||
net.Start("DeathStopSound")
|
net.Start("DeathStopSound")
|
|
@ -1,42 +0,0 @@
|
||||||
util.AddNetworkString("ReplayRequest")
|
|
||||||
util.AddNetworkString("ReplayTutorialPos")
|
|
||||||
|
|
||||||
net.Receive("ReplayRequest", function(len, ply)
|
|
||||||
local stopped = net.ReadBool()
|
|
||||||
|
|
||||||
if not stopped and not ply.InReplay and ((Course_Name ~= "") or TUTORIALMODE) then
|
|
||||||
ply.InReplay = true
|
|
||||||
|
|
||||||
ply:ResetParkourState()
|
|
||||||
ply:Spawn()
|
|
||||||
ply:SetNW2Int("CPNum", -1)
|
|
||||||
ply:SetLocalVelocity(vector_origin)
|
|
||||||
ply:SetLaggedMovementValue(0)
|
|
||||||
|
|
||||||
timer.Simple(0.1, function()
|
|
||||||
ply:SetLaggedMovementValue(1)
|
|
||||||
end)
|
|
||||||
|
|
||||||
if not TUTORIALMODE then
|
|
||||||
ply:SetPos(Course_StartPos)
|
|
||||||
else
|
|
||||||
ply:SetPos(net.ReadVector())
|
|
||||||
end
|
|
||||||
|
|
||||||
net.Start("ReplayRequest")
|
|
||||||
net.Send(ply)
|
|
||||||
elseif stopped then
|
|
||||||
ply.InReplay = false
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Run("PostReplayRequest", ply, stopped)
|
|
||||||
end)
|
|
||||||
|
|
||||||
net.Receive("ReplayTutorialPos", function(len, ply)
|
|
||||||
if not TUTORIALMODE then return end
|
|
||||||
|
|
||||||
local pos = net.ReadVector()
|
|
||||||
|
|
||||||
ply:SetPos(pos or ply:GetPos())
|
|
||||||
ply:SetLocalVelocity(vector_origin)
|
|
||||||
end)
|
|
|
@ -1,89 +0,0 @@
|
||||||
util.AddNetworkString("BlindPlayers")
|
|
||||||
util.AddNetworkString("BlindNPCKilled")
|
|
||||||
|
|
||||||
local function Echo()
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
blinded = false
|
|
||||||
|
|
||||||
concommand.Add("toggleblindness", function(ply)
|
|
||||||
if IsValid(ply) and not ply:IsSuperAdmin() then return end
|
|
||||||
|
|
||||||
blinded = not blinded
|
|
||||||
|
|
||||||
net.Start("BlindPlayers")
|
|
||||||
net.WriteBool(blinded)
|
|
||||||
net.Broadcast()
|
|
||||||
|
|
||||||
if blinded then
|
|
||||||
for k, v in pairs(ents.FindByClass("env_soundscape")) do
|
|
||||||
v:Remove()
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Add("EntityEmitSound", "Echo", Echo)
|
|
||||||
else
|
|
||||||
hook.Remove("EntityEmitSound", "Echo")
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
local red = Color(255, 90, 90)
|
|
||||||
local green = Color(90, 255, 90)
|
|
||||||
|
|
||||||
concommand.Add("blindplayer", function(ply, cmd, args)
|
|
||||||
if IsValid(ply) and not ply:IsSuperAdmin() then return end
|
|
||||||
|
|
||||||
local blinded = tobool(args[2])
|
|
||||||
local blindedstr = (blinded and "is now blind.\n") or "is no longer blind.\n"
|
|
||||||
local blindedcol = (blinded and red) or green
|
|
||||||
local plysearch = args[1]
|
|
||||||
|
|
||||||
if not plysearch then
|
|
||||||
MsgC(red, "syntax: blindplayer (player name) (0/1)\n")
|
|
||||||
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local mply = nil
|
|
||||||
local mname = ""
|
|
||||||
local mcount = 0
|
|
||||||
|
|
||||||
for _, v in ipairs(player.GetAll()) do
|
|
||||||
local name = v:Nick()
|
|
||||||
local smatch = string.match(name, plysearch)
|
|
||||||
|
|
||||||
if smatch then
|
|
||||||
local slen = smatch:len()
|
|
||||||
|
|
||||||
if slen > mcount then
|
|
||||||
mply = v
|
|
||||||
mname = name
|
|
||||||
mcount = slen
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if IsValid(mply) then
|
|
||||||
MsgC(blindedcol, mname, " ", blindedstr)
|
|
||||||
else
|
|
||||||
MsgC(red, "Player not found: ", plysearch)
|
|
||||||
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
net.Start("BlindPlayers")
|
|
||||||
net.WriteBool(blinded)
|
|
||||||
net.Send(mply)
|
|
||||||
end)
|
|
||||||
|
|
||||||
hook.Add("OnNPCKilled", "BlindNPCKilled", function(npc, attacker, inflictor)
|
|
||||||
if blinded and attacker:IsPlayer() then
|
|
||||||
net.Start("BlindNPCKilled")
|
|
||||||
net.Send(attacker)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
hook.Add("InitPostEntity", "WtfTFA", function()
|
|
||||||
hook.Remove("EntityEmitSound", "zzz_TFA_EntityEmitSound")
|
|
||||||
hook.Remove("InitPostEntity", "WtfTFA")
|
|
||||||
end)
|
|
|
@ -1,12 +0,0 @@
|
||||||
function SpawnDebugLadder()
|
|
||||||
local p = Entity(1):GetEyeTrace()
|
|
||||||
a = ents.Create("br_ladder")
|
|
||||||
|
|
||||||
a:SetAngles(p.HitNormal:Angle())
|
|
||||||
a:SetPos(p.HitPos + p.HitNormal * 10)
|
|
||||||
a:Spawn()
|
|
||||||
|
|
||||||
sk = util.QuickTrace(p.HitPos, Vector(0, 0, 100000)).HitPos - p.HitNormal * 10
|
|
||||||
|
|
||||||
a:LadderHeightExact(util.QuickTrace(sk, Vector(0, 0, -100000)).HitPos:Distance(a:GetPos()) - 62)
|
|
||||||
end
|
|
Loading…
Reference in a new issue