Ambience = Ambience or {} Ambience.ActiveSounds = Ambience.ActiveSounds or {} Ambience.Running = false Ambience.AmbientData = {} Ambience.StreetData = {} Ambience.StreetLexika = {} Ambience.ScreenVehicleData = {} Ambience.SoundData = { ["*"] = { "rustsurvival/ambient/a_interior_generic_loop.wav" } } Ambience.Music = { Wanted = { "music/hl2_song3.mp3", "music/hl2_song4.mp3", "music/hl2_song6.mp3", "music/hl2_song29.mp3", "music/hl2_song16.mp3", "music/hl1_song10.mp3", "music/hl2_song20_submix0.mp3", }, Normal = { "music/hl2_song31.mp3", "music/hl1_song11.mp3", "music/hl2_song14.mp3", "music/hl2_song12_long.mp3", "music/hl1_song25_remix3.mp3", "music/hl2_song31.mp3", "music/hl1_song17.mp3", "music/hl2_song8.mp3", }, Weird = { "music/hl2_song13.mp3", "music/hl2_song17.mp3", "music/hl2_song30.mp3", "music/hl1_song15.mp3", "music/hl2_song32.mp3", "music/hl2_song33.mp3", "music/hl2_song19.mp3", }, } Ambience.ActiveMusicTheme = 0 Ambience.Fresh = true Ambience.CurrentRegion = "" Ambience.CurrentZone = "" Ambience.RenderedStreetID = -1 Ambience.DownloadCount = 0 Ambience.CurrentStreetID = 0 Ambience.ClosestNodeData = nil Ambience.ClosestNode = Vector(0,0,0) Ambience.ClosestNodeDistance = 600000 Ambience.GraphData = {} Ambience.ScapeData = {} Ambience.WorldZ = 0 AMBIENCE_PACKET_AMBIENT = 0 AMBIENCE_PACKET_STREET = 1 AMBIENCE_PACKET_LEXIKA = 2 AMBIENCE_PACKET_SVDATA = 3 AMBIENCE_PACKET_SCAPE = 4 AMBIENCE_PACKET_GRAPH = 5 if SERVER then AddCSLuaFile() end if CLIENT then local PANEL = {} function PANEL:Init() self:SetSize( 24, 24 ) self:NoClipping( true ) self.imgPanel = vgui.Create( "DImage", self ); self.imgPanel:SetImage( "icon16/script.png" ); self.imgPanel:SetSize( 16, 16 ) self.imgPanel:SetPos( 4, 4 ) self.imgPanel:SetAlpha( 30 ) self.BoxW = 0 self.BoxH = 0 end function PANEL:SetUp( name ) local ext = string.GetExtensionFromFilename( name ); if ( ext == "data" ) then self.imgPanel:SetImage( "icon16/script.png" ); /*elseif ( ext == "vtf" ) then self.imgPanel:SetImage( "icon16/palette" ); elseif ( ext == "mdl" ) then self.imgPanel:SetImage( "icon16/brick_add" ); elseif ( ext == "wav" ) then self.imgPanel:SetImage( "icon16/sound" );*/ end self.imgPanel:AlphaTo( 255, 0.2, 0 ) end function PANEL:Update( f, status, name, size ) self.status = status self.f = f; self.size = size if ( self.name != name ) then self:SetUp( name ) self.name = name end end function PANEL:Think() if ( self.Bouncing ) then local ft = FrameTime() * 20 self.yvel = self.yvel + 2.0 * ft self.xvel = math.Approach( self.xvel, 0.0, ft * 0.01 ) self.xpos = self.xpos + self.xvel * ft * 3 self.ypos = self.ypos + self.yvel * ft * 3 if ( self.ypos > (ScrH() - 24) ) then self.ypos = (ScrH() - 24) self.yvel = self.yvel * -0.6 self.xvel = self.xvel * 0.8 end self:SetPos( self.xpos, self.ypos ) end end function PANEL:Paint() local r = 255 - 255 * self.f local g = 255 local b = 255 - 255 * self.f local a = self.imgPanel:GetAlpha() if ( self.f == 1.0 && !self.Bouncing ) then r = 255 g = 55 + math.Rand( 0, 200 ) b = 5 end if ( self.DownloadFailed ) then r = 255 g = 50 b = 50 end draw.RoundedBox( 4, 0, 0, self:GetWide(), self:GetTall(), Color( 20, 20, 20, a * 0.4 ) ) draw.RoundedBox( 4, 1, 1, self:GetWide()-2, self:GetTall()-2, Color( r, g, b, a * 0.7 ) ) // If the file is bigger than 3MB, give us some info. if ( self.f < 1.0 && self.size > (1024 * 1024 * 3) ) then self:DrawSizeBox( a ) end end function PANEL:DrawSizeBox( a ) local x = (self.BoxW - self:GetWide()) * -0.5 local txt = math.Round( self.f * 100, 2 ) .."% of ".. string.NiceSize( self.size ) self.BoxW, self.BoxH = draw.WordBox( 4, x, self.BoxH * -1.1, txt, "DefaultSmall", Color( 50, 55, 60, a * 0.8 ), Color( 255, 255, 255, a ) ) end function PANEL:Bounce() local x, y = self:LocalToScreen( 0, 0 ) self:SetParent( GetHUDPanel() ) self:SetPos( x, y ) self.Bouncing = true self.xvel = math.random( -12, 12 ) self.yvel = math.random( -20, -10 ) self.xpos = x self.ypos = y self.imgPanel:AlphaTo( 0, 1, 1 ) end function PANEL:Failed() self.DownloadFailed = true; end vgui.Register( "GM12_DContentDownload", PANEL, "DPanel" ) local PANEL = {} function PANEL:Init() self:SetSize( 256, 100 ) self:SetPos( 0, ScrH() + 10 ) self:SetZPos( 100 ) end function PANEL:Think() self:SetParent(GetHUDPanel()) if ( self.LastActivity && (SysTime() - self.LastActivity) > 2 ) then self:MoveTo( self.x, ScrH() + 5, 0.5, 0.5 ) self.LastActivity = nil; self.MaxFileCount = 0 end for k, v in pairs( Downloads ) do local x = (self:GetWide() * 0.5) + math.sin( SysTime() + k*-0.43 ) * self:GetWide() * 0.45 local y = (20) + math.cos( SysTime() + k*-0.43 ) * 20 * 0.5 v:SetPos( x-13, y ) v:SetZPos( y ) v.accel = accel; end end function PANEL:OnActivity( dlt ) if ( self.LastActivity == nil ) then self:MoveTo( self.x, ScrH() - self:GetTall() + 20, 0.1 ) end self.LastActivity = SysTime() end function PANEL:PerformLayout() self:CenterHorizontal() end function PANEL:Add( p ) local x, y = self:GetPos() local ypos = math.random( 20, 25 ) end vgui.Register( "GM12_DContentMain", PANEL, "Panel" ) if(Main) then Main:Remove() end Downloads = {} local Main = nil function UpdatePackageDownloadStatus( id, name, f, status, size ) if ( !Main ) then Main = vgui.Create("GM12_DContentMain") end local dl = Downloads[ id ] if ( dl == nil ) then dl = vgui.Create( "GM12_DContentDownload", Main ) dl.Velocity = Vector( 0, 0, 0 ); dl:SetAlpha(255) Downloads[ id ] = dl Main:Add( dl ) end dl:Update( f, status, name, size ); if ( status == "success" ) then dl:Bounce() Downloads[ id ] = nil surface.PlaySound( "hl1/fvox/fuzz.wav" ) timer.Simple( 2, function() dl:Remove() end ) end if ( status == "failed" ) then dl:Failed() Downloads[ id ] = nil surface.PlaySound( "hl1/fvox/buzz.wav" ) timer.Simple( 2, function() dl:Remove() end ) end Main:OnActivity( Downloads ) end /* Ende Toybox Download Boxen */ Ambience.CEnabled = CreateClientConVar( "soundmaster_enabled","1",true,false,"Should the Soundmaster be on?") cvars.AddChangeCallback("soundmaster_enabled",function(cvar,old,new) if old == "0" and new == "1" then Ambience.Fresh = true end if old == "1" and new == "0" then Ambience.Stop() end end) Ambience.CDebugEnabled = CreateClientConVar( "soundmaster_debug_enabled","0",true,false,"Debug Only for Developer Job") Ambience.splodesprite = Material("sprites/light_glow04") Ambience.DebugTexture = Material("dev/dev_materialmodify") function Ambience.ClosestLineIntersection(a,b,p) local AP = p - a local AB = b - a local magnitudeAB = AB:LengthSqr() local ABAPproduct = AP:Dot(AB) local distance = ABAPproduct / magnitudeAB if distance < 0 then return a, (distance*AB):LengthSqr() elseif distance > 1 then return b, (distance*AB):LengthSqr() else return a + AB * distance , (distance*AB):LengthSqr() end return Vector(0,0,0),23456789 end function Ambience.IsInRegion(regionRect) local lp = LocalPlayer():EyePos() local rs = regionRect.Start local re = regionRect.End if lp.x >= re.x and lp.x <= rs.x and lp.y >= re.y and lp.y <= rs.y and lp.z >= rs.z and lp.z <= re.z then return true end return false end function Ambience.GetMusic() if(Ambience.ActiveMusicTheme == 0) then return Ambience.Music.Normal[math.random(0,#Ambience.Music.Normal-1)] end if(Ambience.ActiveMusicTheme == 1) then return Ambience.Music.Weird[math.random(0,#Ambience.Music.Weird-1)] end if(Ambience.ActiveMusicTheme == 2) then return Ambience.Music.Wanted[math.random(0,#Ambience.Music.Wanted-1)] end end function Ambience.Think() if Ambience.Fresh == true then Ambience.Fresh = false if Ambience.CEnabled:GetBool() == true then local delayedStart = false /*if Ambience.ActiveMusic then Ambience.ActiveMusic:ChangeVolume(0,2) timer.Simple(2,function() Ambience.ActiveMusic:Stop() Ambience.ActiveMusic = nil end) end*/ if Ambience.ActiveSounds and table.Count(Ambience.ActiveSounds) > 0 then Ambience.Stop() delayedStart = true end local function timedStart() if LocalPlayer() and IsValid(LocalPlayer()) then Ambience.Init() end hook.Add("Initalize","Ambience.Init",Ambience.Init) net.Receive("MapData.Request",function(len) Ambience.Init() end) end if delayedStart then timer.Simple(2.3,timedStart) else timedStart() end end end if Ambience.Running == false then return end Ambience.ClosestNodeDistance = 600000 if Ambience.AmbientData then local MapData = Ambience.AmbientData Ambience.ScapeDatas = nil Ambience.CurrentRegion = "" Ambience.CurrentZone = -1 for _,regionName in pairs(MapData) do for __,regionRect in pairs(regionName) do local xc = (255 / table.Count(regionName)) * __ local c = Color(255*xc,255 - (255*xc),0,20) if Ambience.IsInRegion(regionRect) then Ambience.CurrentRegion = _ Ambience.CurrentZone = __ end end end if Ambience.AmbientData[Ambience.CurrentRegion] and Ambience.AmbientData[Ambience.CurrentRegion][Ambience.CurrentZone] then Ambience.ScapeDatas = Ambience.AmbientData[Ambience.CurrentRegion][Ambience.CurrentZone].Scape end for scapeName,snd in pairs(Ambience.ActiveSounds) do if not Ambience.CheckConditions(scapeName) or not Ambience.ScapeDatas or not Ambience.ScapeDatas[scapeName] then Ambience.FadeOut(scapeName) end end if Ambience.ScapeDatas then for _,scapeName in pairs(Ambience.ScapeDatas) do if Ambience.CheckConditions(scapeName) then Ambience.FadeIn(scapeName) end end end --Ambience.SetStatus("Region="..Ambience.CurrentRegion,1) --Ambience.SetStatus("Zone="..Ambience.CurrentZone,3) end if Ambience.StreetData and LocalPlayer():InVehicle() then local lpPos = LocalPlayer():GetPos() local traceRes = util.TraceLine({ start = lpPos, endpos = lpPos - Vector(0,0,2000), mask = MASK_SOLID_BRUSHONLY, filter = LocalPlayer() }) Ambience.WorldZ = traceRes.Hit and traceRes.HitPos.z or Ambience.WorldZ local StreetData = Ambience.StreetData local StreetLexika = Ambience.StreetLexika local lpp = Vector(lpPos.x,lpPos.y,0) for _,node in pairs(StreetData) do local z = LocalPlayer():GetPos().z local intersects, distance = Ambience.ClosestLineIntersection(node.Start,node.End,lpp) if Vector(node.Start.x,node.Start.y,0):Distance(lpp) > 512 and Vector(node.End.x,node.End.y,0):Distance(lpp) > 512 and intersects:Distance(lpp) > 512 then continue end local la1 = node.Start:Distance(lpp) < node.End:Distance(lpp) and node.Start or node.End local la2 = node.Start:Distance(lpp) > node.End:Distance(lpp) and node.Start or node.End la1 = LerpVector(0.5,la1,la2) local intersects, distance = Ambience.ClosestLineIntersection(la1,la2,lpp) local distA = Ambience.ClosestNode:Distance(intersects) local distB = intersects:Distance(lpp) --MsgN(_ .. "=DistA="..math.Round(distA).." DistB="..math.Round(distB)) if Ambience.ClosestNode and distA > distB and Ambience.CurrentStreetID != node.StreetID then --MsgN(distA.." < ".. distB .. " changing to ".. (Ambience.StreetLexika[node.StreetID] or "")) Ambience.ClosestNodeData = node Ambience.ClosestNode = intersects Ambience.ClosestNodeDistance = distance Ambience.CurrentStreetID = node.StreetID end end if Ambience.ClosestNodeData then --PrintTable(Ambience.ClosestNodeData.ConnectedWith or {}) end end if Ambience.ActiveSounds then local u = 0 for i,k in pairs(Ambience.ActiveSounds) do if k.fade then u=u+1 if k.targetFade > 0 then if not k.Sound then --MsgN("Creating "..i) Ambience.CreateSound(i,k) if Ambience.ActiveSounds[i] == nil then continue end end if k.Sound and k.Sound:IsPlaying() == false then k.Sound:ChangeVolume(0,0) k.Sound:Play() --MsgN("Playing "..i) end else if k.Sound and k.Sound:IsPlaying() == true then k.Sound:Stop() k.Sound = nil --MsgN("Destroying "..i) end end --Ambience.SetStatus("Vol["..math.Round(k.targetFade,2).."] = "..i,u) if k.Sound then k.Sound:ChangeVolume(k.targetFade*(k.volume or 1)*(LocalPlayer():InVehicle() and 0.5 or 1),0) end Ambience.ActiveSounds[i].targetFade = Lerp(0.002*FrameTime(),Ambience.ActiveSounds[i].fade,Ambience.ActiveSounds[i].targetFade) end end end /*if not Ambience.ActiveMusic then local pth = Ambience.GetMusic() MsgN("playing Music "..pth) Ambience.ActiveMusic = CreateSound(game.GetWorld(),pth) Ambience.ActiveMusic:SetSoundLevel(0) Ambience.ActiveMusic:ChangeVolume(0,0) Ambience.ActiveMusic:Play() Ambience.ActiveMusic:ChangeVolume(0.2,5) end if Ambience.ActiveMusic and Ambience.ActiveMusic:IsPlaying() == false then Ambience.ActiveMusic = nil end*/ end function Ambience.DebugDeep(status,scape) Ambience.ActiveSounds[scape].debug = status end function Ambience.CheckConditions(scapeName) if not Ambience.ActiveSounds[scapeName] then MsgN(scapeName.." doesnt exists, reutrning false") return false end if Ambience.ActiveSounds[scapeName].cond == true then return true end local weather = SW.GetCurrentWeather() and (SW.GetCurrentWeather().ID or "none") or "none" local catastrophicWeather = (weather == "rain" or weather == "storm" or weather == "blizzard") local rainyWeather = (weather == "rain" or weather == "storm") for i,k in pairs(Ambience.ActiveSounds[scapeName].cond) do if k == "SW.Day" and (SW.Time > 20.5 or SW.Time < 4) then Ambience.DebugDeep('SW.Day',scapeName) return false end if k == "SW.Night" and (SW.Time < 20 and SW.Time > 4.5) then Ambience.DebugDeep('SW.Night',scapeName) return false end if k == "SW.DryWeather" and catastrophicWeather then Ambience.DebugDeep('SW.DryWeather',scapeName) return false end if k == "SW.InVehicle" and not LocalPlayer():InVehicle() then Ambience.DebugDeep('SW.InVehicle',scapeName) return false end if k == "!SW.InVehicle" and LocalPlayer():InVehicle() then Ambience.DebugDeep('!SW.InVehicle',scapeName) return false end if k == "SW.RainWeather" and not rainyWeather then Ambience.DebugDeep('SW.RainWeather',scapeName) return false end if k == "SW.WindWeather" and not catastrophicWeather then Ambience.DebugDeep('SW.WindWeather',scapeName) return false end end Ambience.DebugDeep("True",scapeName) return true end function Ambience.Node(_,node,ps) if not LocalPlayer():InVehicle() then return end local lpPos = LocalPlayer():GetVehicle():GetPos() local rotPl = LocalPlayer():GetVehicle():GetAngles().yaw local rr = 90+45 local rot = Angle(0,EyeAngles().yaw-90,90) local pos = Vector(ps.x,ps.y,Ambience.WorldZ) rot:SnapTo("y",30) --if Ambience.RenderedStreetID[node.StreetID] then return false end --Ambience.RenderedStreetID[node.StreetID] = true local cc = Vector(ps.x,ps.y,0):Distance(Vector(lpPos.x,lpPos.y,0)) <= (512+256) --cam.Start3D2D(pos,rot,1) -- draw.SimpleText(Ambience.StreetLexika[node.StreetID].."[".._.."]","DermaLarge",0,-60,MF4Config.MainColor,0,1) --cam.End3D2D() end function Ambience.DrawGPSInt(w,h) surface.SetDrawColor(80,80,80) surface.DrawRect(0,0,w,h) surface.SetDrawColor(255,0,0) surface.DrawLine(0,20,50,80) if Ambience.StreetData then local txt = Ambience.StreetLexika[Ambience.CurrentStreetID] or "-" surface.SetFont("matf4_job") local tw,th = surface.GetTextSize(txt) draw.SimpleText(txt,"matf4_job",w/2,h-th*2,color_white,1,1) end end Ambience.GPSRenderTarget = nil Ambience.GPSRenderTargetMat = nil function Ambience.DrawGPS(w,h) Ambience.GPSRenderTarget = GetRenderTarget("gps",w,h,false) local Scrw,Scrh = ScrW(),ScrH() render.PushRenderTarget(Ambience.GPSRenderTarget) cam.Start2D() --render.OverrideAlphaWriteEnable(true, true) Ambience.DrawGPSInt(w,h) cam.End2D() render.PopRenderTarget() if not Ambience.GPSRenderTargetMat then Ambience.GPSRenderTargetMat = CreateMaterial("gpsrt","UnlitGeneric",{ ["$basetexture"] = Ambience.GPSRenderTarget }) end if Ambience.GPSRenderTargetMat then surface.SetDrawColor(255,255,255) surface.SetMaterial(Ambience.GPSRenderTargetMat) surface.DrawTexturedRect(0,0,w,h) else surface.SetDrawColor(255,0,0) surface.DrawRect(0,0,w,h) end end function Ambience.Debug(hud) if Ambience.Running == false then return end if LocalPlayer() and LocalPlayer():InVehicle() and Ambience.ScreenVehicleData and Ambience.ScreenVehicleData[LocalPlayer():GetVehicle():GetModel()] then local veh = LocalPlayer():GetVehicle() local data = Ambience.ScreenVehicleData[veh:GetModel()] --MsgN(veh:WorldToLocal(LocalPlayer():GetEyeTrace().HitPos)) --MsgN(veh:WorldToLocalAngles((LocalPlayer():EyePos() - LocalPlayer():GetEyeTrace().HitPos):Angle())) cam.Start3D2D(veh:LocalToWorld(data.lp),veh:LocalToWorldAngles(data.la),0.025) Ambience.DrawGPS(data.w,data.h) cam.End3D2D() --MsgN(LocalPlayer():GetVehicle():GetModel()) end if Ambience.StreetData and not hud and LocalPlayer():InVehicle() then --render.SetColorMaterial() local StreetData = Ambience.StreetData local StreetLexika = Ambience.StreetLexika local lpPos = LocalPlayer():GetPos() local z = LocalPlayer():GetPos().z local rotPl = LocalPlayer():GetAngles().yaw Ambience.RenderedStreetID = {} for _,node in pairs(StreetData) do if Vector(node.Start.x,node.Start.y,drawZS):Distance(LocalPlayer():GetPos()) > 4000 and Vector(node.End.x,node.End.y,drawZS):Distance(LocalPlayer():GetPos()) > 4000 then continue end if Vector(node.Start.x,node.Start.y,0):Distance(Vector(lpPos.x,lpPos.y,0)) <= 4000 then Ambience.Node(_,node,Ambience.ClosestLineIntersection(node.Start,node.End,Vector(lpPos.x,lpPos.y,0))) --render.DrawLine(Vector(node.Start.x,node.Start.y,Ambience.WorldZ),Vector(node.End.x,node.End.y,Ambience.WorldZ),Ambience.CurrentStreetID == node.StreetID and Color(200,0,0) or Color(0,255,255),false) end end end if (LocalPlayer():Team() == TEAM_DEV or GetHostName() == "Garry's Mod") and Ambience.CDebugEnabled:GetInt() > 0 then // or LocalPlayer():SteamID() == "STEAM_0:1:46594887" then if table.Count(Ambience.ActiveSounds) > 0 then surface.SetFont("TargetID") local _ignore,fontH = surface.GetTextSize("0") local extraLines = 1 + (Ambience.ScapeDatas and (1 + table.Count(Ambience.ScapeDatas)) or 0) local w,h,y = 420,fontH*table.Count(Ambience.ActiveSounds) + fontH*extraLines,0 local x = ScrW()-w surface.SetDrawColor(80,80,80,120) surface.DrawRect(x,y,w,h) surface.SetDrawColor(255,255,255,255) local function txt(x,y,str) surface.SetTextPos(x,y*fontH) surface.DrawText(type(str) == "string" and str or tostring(str)) end local yy = 1 surface.SetTextColor(255,255,255,255) txt(x+0,0,"Name:") txt(x+190,0,"F|T:") txt(x+220,0,"Cond:") txt(x+270,0,"DCond:") for scapeName,scapeData in pairs(Ambience.ActiveSounds) do if scapeData.Sound then surface.SetTextColor(0,255,0,255) else surface.SetTextColor(255,0,0,255) end txt(x,yy,scapeName) txt(x + 190,yy,scapeData.fade or 0) surface.SetTextColor(91,113,255,255) txt(x + 205,yy,scapeData.targetFade or 0) local condRes = Ambience.CheckConditions(scapeName) if condRes then surface.SetTextColor(0,255,0,255) else surface.SetTextColor(255,0,0,255) end txt(x + 220,yy,condRes and "True" or "False") if scapeData.debug then surface.SetTextColor(91,113,255,255) txt(x + 270,yy,tostring(scapeData.debug)) end yy = yy + 1 end txt(x+0,yy,"Current Scapes: ") yy = yy + 1 if Ambience.ScapeDatas then for _,NME in pairs(Ambience.ScapeDatas) do txt(x+0,yy,NME) yy = yy + 1 end end end if Ambience.AmbientData and 3 > 2 then if not hud then render.SetColorMaterial() render.OverrideDepthEnable(true,true) render.CullMode(MATERIAL_CULLMODE_CW) render.SetColorMaterial() render.SetLightingMode(2) render.SetBlend(1) end local MapData = Ambience.AmbientData for _,regionName in pairs(MapData) do for __,regionRect in pairs(regionName) do if not hud and Ambience.CDebugEnabled:GetInt() == 2 then local xc = (255 / table.Count(regionName)) * __ local c = Color(255*xc,255 - (255*xc),0,255) if not Ambience.IsInRegion(regionRect) then Ambience.CurrentRegion = _ Ambience.CurrentZone = __ render.DrawBox(regionRect.Start,Angle(0,0,0),Vector(0,0,0),Vector(regionRect.End.x - regionRect.Start.x,regionRect.End.y - regionRect.Start.y,regionRect.End.z - regionRect.Start.z),c) render.CullMode(MATERIAL_CULLMODE_CW) render.DrawBox(regionRect.Start,Angle(0,0,0),Vector(0,0,0),Vector(regionRect.End.x - regionRect.Start.x,regionRect.End.y - regionRect.Start.y,regionRect.End.z - regionRect.Start.z),c) render.DrawLine(regionRect.Start,Vector(regionRect.Start.x,regionRect.Start.y,regionRect.End.z),Color(255,255,0)) render.DrawLine(regionRect.End,Vector(regionRect.End.x,regionRect.End.y,regionRect.Start.z),Color(0,255,255)) end end if hud and Ambience.IsInRegion(regionRect) then draw.SimpleText("REGION=".._.."/"..__,"DermaLarge",ScrW()/2,ScrH()/2 + 80,color_white,1,1) break end end end if not hud then render.CullMode(MATERIAL_CULLMODE_CCW) render.OverrideDepthEnable(false,false) render.SetLightingMode(0) render.SetBlend(1) end end end end function Ambience.SetStatusLoading(txt) MsgN("[Clean Ambience]"..txt) notification.AddProgress("Ambience.SetStatusLoading","[Clean Ambience]"..txt) end function Ambience.SetStatus(txt,u) --MsgN("[Ambient]"..txt) notification.AddProgress("Ambience.SetStatusLoading"..tostring(u or ""),"[Clean Ambience]"..txt) --GAMEMODE:AddNotify(txt,NOTIFY_GENERIC,5) end function Ambience.Stop() Ambience.DownloadCount = 0 Ambience.Running = false Ambience.SetStatus("Gestoppt") for i,k in pairs(Ambience.ActiveSounds) do if IsValid(k.Sound) then k.Sound:Stop() end end //if IsValid(Ambience.ActiveMusic) then Ambience.ActiveMusic:Stop() end timer.Simple(10,function() if not Ambience.Running then notification.Kill("Ambience.SetStatusLoading") end end) end function Ambience.Init() Ambience.DownloadCount = 0 for i=0,10 do notification.Kill("Ambience.SetStatusLoading"..tostring(i)) end if Ambience.LastInit and Ambience.LastInit + 1 >= CurTime() then return end Ambience.LastInit = CurTime() Ambience.GraphData = {} Ambience.AmbientData = {} Ambience.StreetData = {} Ambience.StreetLexika = {} net.Receive("MapData.MapPacketHeader",function(len) Ambience.DownloadCount = net.ReadInt(32) for i=1,Ambience.DownloadCount do UpdatePackageDownloadStatus(i,"", 0,"",1) end end) net.Receive("MapData.MapPacket",function(len) local packetsRemain = net.ReadInt(32) UpdatePackageDownloadStatus(packetsRemain,"", 1,"success",1) Ambience.SetStatusLoading("Lade Daten ["..packetsRemain.." verbleibend]") local packetType = net.ReadInt(32) local packetData = net.ReadTable() if packetType == AMBIENCE_PACKET_AMBIENT then table.Merge(Ambience.AmbientData,packetData) end if packetType == AMBIENCE_PACKET_STREET then table.Merge(Ambience.StreetData,packetData) end if packetType == AMBIENCE_PACKET_LEXIKA then table.Merge(Ambience.StreetLexika,packetData) end if packetType == AMBIENCE_PACKET_SVDATA then table.Merge(Ambience.ScreenVehicleData,packetData) end if packetType == AMBIENCE_PACKET_SCAPE then table.Merge(Ambience.ScapeData,packetData) end if packetType == AMBIENCE_PACKET_GRAPH then table.Merge(Ambience.GraphData,packetData) end if packetsRemain == 0 then Ambience.SetStatus("Starte Client") notification.Kill("Ambience.SetStatusLoading") timer.Simple(1,function() Ambience.Start() notification.AddLegacy("[Clean Ambience]".."Aktiv",NOTIFY_HINT,2) end) end end) net.Start("MapData.Request") net.SendToServer() Ambience.SetStatus("Initialisiere") end function Ambience.GetSoundIndex(index) return index end function Ambience.FadeIn(id) Ambience.ActiveSounds[Ambience.GetSoundIndex(id)].fade = 1 end function Ambience.FadeOut(id) Ambience.ActiveSounds[Ambience.GetSoundIndex(id)].fade = 0 end function Ambience.CreateSound(index,data) local snd = CreateSound(game.GetWorld(),type(data.path) == "string" and data.path or table.Random(data.path)) MsgN("Spawning Sound "..index) snd:SetSoundLevel(0) snd:ChangeVolume(0,0) Ambience.ActiveSounds[Ambience.GetSoundIndex(index)] = {path=data.path,Sound=snd,fade=data.fade or 0,targetFade=data.targetFade or 0,volume=data.volume or 1,cond = data.cond or true} end function Ambience.Start() //Ambience.ActiveMusic = nil Ambience.Running = true RunConsoleCommand("play","garrysmod/save_load4.wav") notification.Kill("Ambience.SetStatusLoading") for i,k in pairs(Ambience.ScapeData) do Ambience.ActiveSounds[Ambience.GetSoundIndex(i)] = {path=k.path,Sound=nil,fade=0,targetFade=0,volume=k.volume or 1,cond = k.cond or true} end end hook.Add("Think","Ambience.Think",Ambience.Think) hook.Add("PostDrawOpaqueRenderables","Ambience.Debug",function() Ambience.Debug(false) end) hook.Add("HUDPaint","Ambience.Debug",function() Ambience.Debug(true) end) hook.Add("Initalize","Ambience.Debug",function() Ambience.Init() end) end