From 2beed69bcf087fe40df3b56beb4ef1c539dc28ab Mon Sep 17 00:00:00 2001 From: Vigers Ray <60344369+VigersRay@users.noreply.github.com> Date: Wed, 7 Jan 2026 06:40:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B5=D1=82=D0=B5=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D0=BE=D0=B2,=20=D0=B0=D0=BD=D0=B8=D0=BC=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B9=20=D0=B8=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=D0=BA=D1=81=D0=BE=D0=B2.=20(#3646)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Client/Entry/EntryPoint.cs | 4 + Content.Client/IoC/ClientContentIoC.cs | 4 +- Content.Client/Lobby/LobbyState.cs | 335 +++++++++++++++++- Content.Client/Options/UI/Tabs/ExtraTab.xaml | 1 + .../Options/UI/Tabs/ExtraTab.xaml.cs | 1 + .../Data/ImageParallaxTextureSource.cs | 102 +++++- Content.Client/Parallax/ParallaxControl.cs | 68 +--- Content.Client/_Sunrise/NetTexturesManager.cs | 239 +++++++++++++ Content.Packaging/ClientPackaging.cs | 2 +- Content.Packaging/SharedPackaging.cs | 7 + Content.Server/Entry/EntryPoint.cs | 3 + Content.Server/IoC/ServerContentIoC.cs | 2 + Content.Server/_Sunrise/NetTexturesManager.cs | 192 ++++++++++ .../RequestNetworkResourceMessage.cs | 35 ++ .../_Sunrise/SunriseCCVars/SunriseCCVars.cs | 6 + .../_sunrise/escape-menu/ui/options-menu.ftl | 1 + .../Lobby/Animations/bar.rsi/animation.png | Bin .../Lobby/Animations/bar.rsi/meta.json | 0 .../Lobby/Animations/billy.rsi/animation.png | Bin .../Lobby/Animations/billy.rsi/meta.json | 0 .../Animations/black_hole.rsi/animation.png | Bin .../Lobby/Animations/black_hole.rsi/meta.json | 0 .../Animations/black_hole2.rsi/animation.png | Bin .../Animations/black_hole2.rsi/meta.json | 0 .../black_hole_island.rsi/animation.png | Bin .../black_hole_island.rsi/meta.json | 0 .../Animations/blade_runner.rsi/animation.png | Bin .../Animations/blade_runner.rsi/meta.json | 0 .../Lobby/Animations/boats.rsi/animation.png | Bin .../Lobby/Animations/boats.rsi/meta.json | 0 .../Lobby/Animations/earth.rsi/animation.png | Bin .../Lobby/Animations/earth.rsi/meta.json | 0 .../Animations/eclipse.rsi/animation.png | Bin .../Lobby/Animations/eclipse.rsi/meta.json | 0 .../evangelion_elevator.rsi/animation.png | Bin .../evangelion_elevator.rsi/meta.json | 0 .../evening_bridge.rsi/animation.png | Bin .../Animations/evening_bridge.rsi/meta.json | 0 .../Animations/evening_sun.rsi/animation.png | Bin .../Animations/evening_sun.rsi/meta.json | 0 .../Animations/evening_sun2.rsi/animation.png | Bin .../Animations/evening_sun2.rsi/meta.json | 0 .../Animations/evening_sun3.rsi/animation.png | Bin .../Animations/evening_sun3.rsi/meta.json | 0 .../Animations/evening_sun4.rsi/animation.png | Bin .../Animations/evening_sun4.rsi/meta.json | 0 .../Animations/evening_sun5.rsi/animation.png | Bin .../Animations/evening_sun5.rsi/meta.json | 0 .../Animations/evening_sun6.rsi/animation.png | Bin .../Animations/evening_sun6.rsi/meta.json | 0 .../Animations/evening_sun7.rsi/animation.png | Bin .../Animations/evening_sun7.rsi/meta.json | 0 .../Animations/evening_sun8.rsi/animation.png | Bin .../Animations/evening_sun8.rsi/meta.json | 0 .../evening_window.rsi/animation.png | Bin .../Animations/evening_window.rsi/meta.json | 0 .../Animations/frieren.rsi/animation.png | Bin .../Lobby/Animations/frieren.rsi/meta.json | 0 .../Animations/graveyard.rsi/animation.png | Bin .../Lobby/Animations/graveyard.rsi/meta.json | 0 .../guts_vs_griffit.rsi/animation.png | Bin .../Animations/guts_vs_griffit.rsi/meta.json | 0 .../homer_starfall.rsi/animation.png | Bin .../Animations/homer_starfall.rsi/meta.json | 0 .../island_evening.rsi/animation.png | Bin .../Animations/island_evening.rsi/meta.json | 0 .../Lobby/Animations/jungle.rsi/animation.png | Bin .../Lobby/Animations/jungle.rsi/meta.json | 0 .../Lobby/Animations/kvazar.rsi/animation.png | Bin .../Lobby/Animations/kvazar.rsi/meta.json | 0 .../Lobby/Animations/lain.rsi/animation.png | Bin .../Lobby/Animations/lain.rsi/meta.json | 0 .../Animations/monolith.rsi/animation.png | Bin .../Lobby/Animations/monolith.rsi/meta.json | 0 .../Lobby/Animations/nebula.rsi/animation.png | Bin .../Lobby/Animations/nebula.rsi/meta.json | 0 .../Animations/neon_sity.rsi/animation.png | Bin .../Lobby/Animations/neon_sity.rsi/meta.json | 0 .../Animations/night_moon.rsi/animation.png | Bin .../Lobby/Animations/night_moon.rsi/meta.json | 0 .../Animations/red_skull.rsi/animation.png | Bin .../Lobby/Animations/red_skull.rsi/meta.json | 0 .../Lobby/Animations/sky.rsi/animation.png | Bin .../Lobby/Animations/sky.rsi/meta.json | 0 .../Animations/space_desert.rsi/animation.png | Bin .../Animations/space_desert.rsi/meta.json | 0 .../Animations/space_girl.rsi/animation.png | Bin .../Lobby/Animations/space_girl.rsi/meta.json | 0 .../Animations/space_starts.rsi/animation.png | Bin .../Animations/space_starts.rsi/meta.json | 0 .../Animations/sunny_PTL.rsi/animation.png | Bin .../Lobby/Animations/sunny_PTL.rsi/meta.json | 0 .../Animations/sunny_PTL2.rsi/animation.png | Bin .../Lobby/Animations/sunny_PTL2.rsi/meta.json | 0 .../Animations/sunny_city.rsi/animation.png | Bin .../Lobby/Animations/sunny_city.rsi/meta.json | 0 .../Lobby/Arts/arnold-intelligence.webp | Bin .../Lobby/Arts/arnold-intelligence.webp.yml | 0 .../Lobby/Arts/attributions.yml | 0 .../Lobby/Arts/bar-life.webp | Bin .../Lobby/Arts/bar-life.webp.yml | 0 .../Lobby/Arts/beerslime.webp | Bin .../Lobby/Arts/beerslime.webp.yml | 0 .../Lobby/Arts/clownspider.webp | Bin .../Lobby/Arts/clownspider.webp.yml | 0 .../Lobby/Arts/dead-in-space.webp | Bin .../Lobby/Arts/dead-in-space.webp.yml | 0 .../Lobby/Arts/deadsquad.webp | Bin .../Lobby/Arts/deadsquad.webp.yml | 0 .../Lobby/Arts/deathnettle.webp | Bin .../Lobby/Arts/deathnettle.webp.yml | 0 .../Lobby/Arts/engineer.webp | Bin .../Lobby/Arts/engineer.yml | 0 .../Lobby/Arts/engineers-chill.webp | Bin .../Lobby/Arts/engineers-chill.webp.yml | 0 .../Lobby/Arts/engineers-vs-zombies.webp | Bin .../Lobby/Arts/engineers-vs-zombies.webp.yml | 0 .../Lobby/Arts/fleshanom.webp | Bin .../Lobby/Arts/fleshanom.webp.yml | 0 .../Lobby/Arts/gray-tide.webp | Bin .../Lobby/Arts/gray-tide.webp.yml | 0 .../Lobby/Arts/guts-guts.webp | Bin .../Lobby/Arts/guts-guts.webp.yml | 0 .../Lobby/Arts/into-space.webp | Bin .../Lobby/Arts/into-space.webp.yml | 0 .../Lobby/Arts/jailbreak.webp | Bin .../Lobby/Arts/jailbreak.webp.yml | 0 .../Lobby/Arts/kosmologistika.webp | Bin .../Lobby/Arts/kosmologistika.webp.yml | 0 .../Lobby/Arts/lizard-bar.webp | Bin .../Lobby/Arts/lizard-bar.webp.yml | 0 .../Lobby/Arts/lofi.webp | Bin .../Lobby/Arts/lofi.webp.yml | 0 .../Lobby/Arts/maintenance-clown.webp | Bin .../Lobby/Arts/maintenance-clown.webp.yml | 0 .../Lobby/Arts/men-at-work.webp | Bin .../Lobby/Arts/men-at-work.webp.yml | 0 .../Lobby/Arts/mimes-in-techs.webp | Bin .../Lobby/Arts/mimes-in-techs.webp.yml | 0 .../Lobby/Arts/new-year-bar.webp | Bin .../Lobby/Arts/new-year-bar.webp.yml | 0 .../Lobby/Arts/new-year-comfort.webp | Bin .../Lobby/Arts/new-year-comfort.webp.yml | 0 .../Lobby/Arts/new-year-explosion.webp | Bin .../Lobby/Arts/new-year-explosion.webp.yml | 0 .../Lobby/Arts/new-year-nuke.webp | Bin .../Lobby/Arts/new-year-nuke.webp.yml | 0 .../Lobby/Arts/new-year-party.webp | Bin .../Lobby/Arts/new-year-party.webp.yml | 0 .../Lobby/Arts/new-year-penguins.webp | Bin .../Lobby/Arts/new-year-penguins.webp.yml | 0 .../Lobby/Arts/new-year-pine.webp | Bin .../Lobby/Arts/new-year-pine.webp.yml | 0 .../Lobby/Arts/new-year-save.webp | Bin .../Lobby/Arts/new-year-save.webp.yml | 0 .../Lobby/Arts/new-year-sec.webp | Bin .../Lobby/Arts/new-year-sec.webp.yml | 0 .../Lobby/Arts/nukie-dudes.webp | Bin .../Lobby/Arts/nukie-dudes.webp.yml | 0 .../Lobby/Arts/nukie-war.webp | Bin .../Lobby/Arts/nukie-war.webp.yml | 0 .../Lobby/Arts/nukies-here.webp | Bin .../Lobby/Arts/nukies-here.webp.yml | 0 .../Lobby/Arts/prostchitalsanogde.webp | Bin .../Lobby/Arts/prostchitalsanogde.webp.yml | 0 .../Lobby/Arts/red-alert-med.webp | Bin .../Lobby/Arts/red-alert-med.webp.yml | 0 .../Lobby/Arts/regular-shift.webp | Bin .../Lobby/Arts/regular-shift.webp.yml | 0 .../Lobby/Arts/reunion.webp | Bin .../Lobby/Arts/reunion.webp.yml | 0 .../Lobby/Arts/revenant.webp | Bin .../Lobby/Arts/revenant.webp.yml | 0 .../Lobby/Arts/singulord-cage.webp | Bin .../Lobby/Arts/singulord-cage.webp.yml | 0 .../Lobby/Arts/singulord.webp | Bin .../Lobby/Arts/singulord.webp.yml | 0 .../Lobby/Arts/space-mudaki.webp | Bin .../Lobby/Arts/space-mudaki.webp.yml | 0 .../Lobby/Arts/space-nuke.webp | Bin .../Lobby/Arts/space-nuke.webp.yml | 0 .../Lobby/Arts/starbow14.webp | Bin .../Lobby/Arts/starbow14.webp.yml | 0 .../Lobby/Arts/tesla-loose.webp | Bin .../Lobby/Arts/tesla-loose.webp.yml | 0 .../Lobby/Arts/teslaloose.webp | Bin .../Lobby/Arts/teslaloose.webp.yml | 0 .../Lobby/Arts/traitor.webp | Bin .../Lobby/Arts/traitor.webp.yml | 0 .../Lobby/Arts/xeno.webp | Bin .../Lobby/Arts/xeno.webp.yml | 0 .../Lobby/Arts/xenosattack.webp | Bin .../Lobby/Arts/xenosattack.webp.yml | 0 .../Parallaxes/Angle.png | Bin .../Parallaxes/AspidParallaxBG.png | Bin .../Parallaxes/AspidParallaxNeb.png | Bin .../Parallaxes}/Asteroids.png | Bin .../Parallaxes/AvriteParallaxBG.png | Bin .../Parallaxes/AvriteParallaxNeb.png | Bin .../Parallaxes}/BlueParallax.png | Bin .../Parallaxes/BoxParallax.png | Bin .../Parallaxes/BoxParallaxBlackHole.png | Bin .../Parallaxes/DeltaParallaxBG.png | Bin .../Parallaxes/DeltaParallaxNeb.png | Bin .../Parallaxes}/GreenParallax.png | Bin .../Parallaxes/KettleParallaxBG.png | Bin .../Parallaxes/KettleParallaxNeb.png | Bin .../Parallaxes/Lighthouse.png | Bin .../Parallaxes}/MirStationParallaxBG.png | Bin .../Parallaxes}/OrbitEarth.png | Bin .../Parallaxes/Pebble.png | Bin .../Parallaxes/PilgrimAiurWaterTile.png | Bin .../Parallaxes}/PixelGreenParallax.png | Bin .../Parallaxes}/PixelPurpleParallax.png | Bin .../Parallaxes}/PurpleParallax.png | Bin .../Parallaxes/SillyOcean.png | Bin .../Parallaxes/SillyOcean_Overlay.png | Bin .../Parallaxes/SillyOcean_Overlay2.png | Bin .../Parallaxes/Tortuga.png | Bin .../Parallaxes/Vaitarna.png | Bin .../Parallaxes/XenoParallaxNeb.png | Bin .../Parallaxes/core_planet.png | Bin .../Parallaxes/debris_large.png | Bin .../Parallaxes/debris_small.png | Bin .../Parallaxes/gas_giant.png | Bin .../Parallaxes/land.png | Bin .../Parallaxes/layer2.png | Bin .../Parallaxes/layer3.png | Bin .../Parallaxes/licences.txt | 0 .../Parallaxes/noise.png | Bin .../Parallaxes/oldspace.png | Bin .../Parallaxes/planet.png | Bin .../Parallaxes}/planet2.png | Bin .../Parallaxes}/planet3.png | Bin .../Parallaxes}/planet4.png | Bin .../Parallaxes/purple_nebula.png | Bin .../Parallaxes/space_map2.png | Bin .../Parallaxes/space_map3.png | Bin Resources/Prototypes/Parallaxes/amber.yml | 10 +- Resources/Prototypes/Parallaxes/aspid.yml | 4 +- Resources/Prototypes/Parallaxes/bagel.yml | 4 +- Resources/Prototypes/Parallaxes/core.yml | 4 +- Resources/Prototypes/Parallaxes/exo.yml | 4 +- Resources/Prototypes/Parallaxes/kettle.yml | 4 +- Resources/Prototypes/Parallaxes/origin.yml | 4 +- Resources/Prototypes/Parallaxes/planet.yml | 4 +- Resources/Prototypes/Parallaxes/plasma.yml | 8 +- Resources/Prototypes/Parallaxes/relic.yml | 2 +- Resources/Prototypes/Parallaxes/train.yml | 8 +- Resources/Prototypes/Parallaxes/wizard.yml | 4 +- .../Prototypes/_Sunrise/Lobby/animations.yml | 80 ++--- Resources/Prototypes/_Sunrise/Lobby/arts.yml | 124 +++---- .../Prototypes/_Sunrise/Lobby/parallaxes.yml | 1 - .../Prototypes/_Sunrise/Parallaxes/angle.yml | 2 +- .../Parallaxes/{NES => }/asteroids.yml | 4 +- .../Prototypes/_Sunrise/Parallaxes/avrite.yml | 4 +- .../Prototypes/_Sunrise/Parallaxes/box.yml | 4 +- .../Prototypes/_Sunrise/Parallaxes/delta.yml | 4 +- .../_Sunrise/Parallaxes/{NES => }/earth.yml | 4 +- .../_Sunrise/Parallaxes/lighthouse.yml | 2 +- .../Parallaxes/{NES => }/mirstation.yml | 4 +- .../_Sunrise/Parallaxes/outpost.yml | 8 +- .../Prototypes/_Sunrise/Parallaxes/pebble.yml | 2 +- .../_Sunrise/Parallaxes/pilgrim_aiur.yml | 6 +- .../_Sunrise/Parallaxes/{NES => }/purple.yml | 4 +- .../_Sunrise/Parallaxes/shipwrecked.yml | 2 +- .../_Sunrise/Parallaxes/silly_island.yml | 6 +- .../_Sunrise/Parallaxes/tortuga.yml | 2 +- Resources/Prototypes/lobbyscreens.yml | 158 ++++----- .../LobbyScreens/PutLobbyScreensHere.txt | 3 - .../Textures/LobbyScreens/attributions.yml | 54 --- Resources/Textures/LobbyScreens/behonker.webp | Bin 550852 -> 0 bytes .../Textures/LobbyScreens/behonker.webp.yml | 2 - .../Textures/LobbyScreens/blueprint.png.yml | 2 - .../Textures/LobbyScreens/blueprint.webp | Bin 587506 -> 0 bytes Resources/Textures/LobbyScreens/doomed.webp | Bin 494016 -> 0 bytes .../Textures/LobbyScreens/doomed.webp.yml | 2 - .../Textures/LobbyScreens/janishootout.webp | Bin 201216 -> 0 bytes .../LobbyScreens/janishootout.webp.yml | 2 - .../Textures/LobbyScreens/justaweekaway.webp | Bin 309680 -> 0 bytes .../Textures/LobbyScreens/justaweekaway.yml | 2 - Resources/Textures/LobbyScreens/pharmacy.webp | Bin 543558 -> 0 bytes .../Textures/LobbyScreens/pharmacy.webp.yml | 2 - .../Textures/LobbyScreens/reclaimer-nuke.webp | Bin 991910 -> 0 bytes .../LobbyScreens/reclaimer-nuke.webp.yml | 2 - Resources/Textures/LobbyScreens/robotics.webp | Bin 146138 -> 0 bytes .../Textures/LobbyScreens/robotics.webp.yml | 2 - .../Textures/LobbyScreens/skellyvstherev.webp | Bin 485444 -> 0 bytes .../LobbyScreens/skellyvstherev.webp.yml | 2 - Resources/Textures/LobbyScreens/ssxiv.webp | Bin 346008 -> 0 bytes .../Textures/LobbyScreens/ssxiv.webp.yml | 2 - .../Textures/LobbyScreens/supermatter.webp | Bin 265800 -> 0 bytes .../LobbyScreens/supermatter.webp.yml | 2 - .../Textures/LobbyScreens/susstation.webp | Bin 192590 -> 0 bytes .../Textures/LobbyScreens/susstation.webp.yml | 2 - .../LobbyScreens/terminalstation.webp | Bin 357770 -> 0 bytes .../LobbyScreens/terminalstation.webp.yml | 2 - Resources/Textures/LobbyScreens/warden.webp | Bin 152078 -> 0 bytes .../Textures/LobbyScreens/warden.webp.yml | 2 - Resources/Textures/Parallaxes/Asteroids.png | Bin 20218 -> 0 bytes .../_Sunrise/Abductor/Parallaxes/Abyss.png | Bin 546110 -> 0 bytes .../Abductor/Parallaxes/attributions.yml | 24 -- .../_Sunrise/Abductor/Parallaxes/meta.json | 14 - .../Parallaxes/{NES => }/Asteroids.png.yml | 0 .../Parallaxes/{NES => }/BlueParallax.png.yml | 0 .../{NES => }/GreenParallax.png.yml | 0 .../{NES => }/MirStationParallaxBG.png.yml | 0 .../Parallaxes/{NES => }/OrbitEarth.png.yml | 0 .../{NES => }/PixelGreenParallax.png.yml | 0 .../{NES => }/PixelPurpleParallax.png.yml | 0 .../{NES => }/PurpleParallax.png.yml | 0 .../Parallaxes/{NES => }/planet2.png.yml | 0 .../Parallaxes/{NES => }/planet3.png.yml | 0 .../Parallaxes/{NES => }/planet4.png.yml | 0 314 files changed, 1167 insertions(+), 439 deletions(-) create mode 100644 Content.Client/_Sunrise/NetTexturesManager.cs create mode 100644 Content.Server/_Sunrise/NetTexturesManager.cs create mode 100644 Content.Shared/_Sunrise/NetTextures/RequestNetworkResourceMessage.cs rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/bar.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/bar.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/billy.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/billy.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/black_hole.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/black_hole.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/black_hole2.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/black_hole2.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/black_hole_island.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/black_hole_island.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/blade_runner.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/blade_runner.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/boats.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/boats.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/earth.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/earth.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/eclipse.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/eclipse.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evangelion_elevator.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evangelion_elevator.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_bridge.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_bridge.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun2.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun2.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun3.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun3.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun4.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun4.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun5.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun5.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun6.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun6.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun7.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun7.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun8.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_sun8.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_window.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/evening_window.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/frieren.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/frieren.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/graveyard.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/graveyard.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/guts_vs_griffit.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/guts_vs_griffit.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/homer_starfall.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/homer_starfall.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/island_evening.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/island_evening.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/jungle.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/jungle.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/kvazar.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/kvazar.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/lain.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/lain.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/monolith.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/monolith.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/nebula.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/nebula.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/neon_sity.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/neon_sity.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/night_moon.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/night_moon.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/red_skull.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/red_skull.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/sky.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/sky.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/space_desert.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/space_desert.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/space_girl.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/space_girl.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/space_starts.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/space_starts.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/sunny_PTL.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/sunny_PTL.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/sunny_PTL2.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/sunny_PTL2.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/sunny_city.rsi/animation.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Animations/sunny_city.rsi/meta.json (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/arnold-intelligence.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/arnold-intelligence.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/attributions.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/bar-life.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/bar-life.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/beerslime.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/beerslime.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/clownspider.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/clownspider.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/dead-in-space.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/dead-in-space.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/deadsquad.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/deadsquad.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/deathnettle.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/deathnettle.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/engineer.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/engineer.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/engineers-chill.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/engineers-chill.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/engineers-vs-zombies.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/engineers-vs-zombies.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/fleshanom.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/fleshanom.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/gray-tide.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/gray-tide.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/guts-guts.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/guts-guts.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/into-space.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/into-space.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/jailbreak.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/jailbreak.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/kosmologistika.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/kosmologistika.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/lizard-bar.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/lizard-bar.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/lofi.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/lofi.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/maintenance-clown.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/maintenance-clown.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/men-at-work.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/men-at-work.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/mimes-in-techs.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/mimes-in-techs.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-bar.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-bar.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-comfort.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-comfort.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-explosion.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-explosion.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-nuke.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-nuke.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-party.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-party.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-penguins.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-penguins.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-pine.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-pine.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-save.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-save.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-sec.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/new-year-sec.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/nukie-dudes.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/nukie-dudes.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/nukie-war.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/nukie-war.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/nukies-here.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/nukies-here.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/prostchitalsanogde.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/prostchitalsanogde.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/red-alert-med.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/red-alert-med.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/regular-shift.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/regular-shift.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/reunion.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/reunion.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/revenant.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/revenant.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/singulord-cage.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/singulord-cage.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/singulord.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/singulord.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/space-mudaki.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/space-mudaki.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/space-nuke.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/space-nuke.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/starbow14.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/starbow14.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/tesla-loose.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/tesla-loose.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/teslaloose.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/teslaloose.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/traitor.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/traitor.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/xeno.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/xeno.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/xenosattack.webp (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Lobby/Arts/xenosattack.webp.yml (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/Angle.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/AspidParallaxBG.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/AspidParallaxNeb.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/Asteroids.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/AvriteParallaxBG.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/AvriteParallaxNeb.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/BlueParallax.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/BoxParallax.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/BoxParallaxBlackHole.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/DeltaParallaxBG.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/DeltaParallaxNeb.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/GreenParallax.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/KettleParallaxBG.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/KettleParallaxNeb.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/Lighthouse.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/MirStationParallaxBG.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/OrbitEarth.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/Pebble.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/PilgrimAiurWaterTile.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/PixelGreenParallax.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/PixelPurpleParallax.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/PurpleParallax.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/SillyOcean.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/SillyOcean_Overlay.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/SillyOcean_Overlay2.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/Tortuga.png (100%) rename Resources/{Textures/_Sunrise => NetTextures}/Parallaxes/Vaitarna.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/XenoParallaxNeb.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/core_planet.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/debris_large.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/debris_small.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/gas_giant.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/land.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/layer2.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/layer3.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/licences.txt (100%) rename Resources/{Textures => NetTextures}/Parallaxes/noise.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/oldspace.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/planet.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/planet2.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/planet3.png (100%) rename Resources/{Textures/_Sunrise/Parallaxes/NES => NetTextures/Parallaxes}/planet4.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/purple_nebula.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/space_map2.png (100%) rename Resources/{Textures => NetTextures}/Parallaxes/space_map3.png (100%) rename Resources/Prototypes/_Sunrise/Parallaxes/{NES => }/asteroids.yml (90%) rename Resources/Prototypes/_Sunrise/Parallaxes/{NES => }/earth.yml (90%) rename Resources/Prototypes/_Sunrise/Parallaxes/{NES => }/mirstation.yml (90%) rename Resources/Prototypes/_Sunrise/Parallaxes/{NES => }/purple.yml (90%) delete mode 100644 Resources/Textures/LobbyScreens/PutLobbyScreensHere.txt delete mode 100644 Resources/Textures/LobbyScreens/attributions.yml delete mode 100644 Resources/Textures/LobbyScreens/behonker.webp delete mode 100644 Resources/Textures/LobbyScreens/behonker.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/blueprint.png.yml delete mode 100644 Resources/Textures/LobbyScreens/blueprint.webp delete mode 100644 Resources/Textures/LobbyScreens/doomed.webp delete mode 100644 Resources/Textures/LobbyScreens/doomed.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/janishootout.webp delete mode 100644 Resources/Textures/LobbyScreens/janishootout.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/justaweekaway.webp delete mode 100644 Resources/Textures/LobbyScreens/justaweekaway.yml delete mode 100644 Resources/Textures/LobbyScreens/pharmacy.webp delete mode 100644 Resources/Textures/LobbyScreens/pharmacy.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/reclaimer-nuke.webp delete mode 100644 Resources/Textures/LobbyScreens/reclaimer-nuke.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/robotics.webp delete mode 100644 Resources/Textures/LobbyScreens/robotics.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/skellyvstherev.webp delete mode 100644 Resources/Textures/LobbyScreens/skellyvstherev.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/ssxiv.webp delete mode 100644 Resources/Textures/LobbyScreens/ssxiv.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/supermatter.webp delete mode 100644 Resources/Textures/LobbyScreens/supermatter.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/susstation.webp delete mode 100644 Resources/Textures/LobbyScreens/susstation.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/terminalstation.webp delete mode 100644 Resources/Textures/LobbyScreens/terminalstation.webp.yml delete mode 100644 Resources/Textures/LobbyScreens/warden.webp delete mode 100644 Resources/Textures/LobbyScreens/warden.webp.yml delete mode 100644 Resources/Textures/Parallaxes/Asteroids.png delete mode 100644 Resources/Textures/_Sunrise/Abductor/Parallaxes/Abyss.png delete mode 100644 Resources/Textures/_Sunrise/Abductor/Parallaxes/attributions.yml delete mode 100644 Resources/Textures/_Sunrise/Abductor/Parallaxes/meta.json rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/Asteroids.png.yml (100%) rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/BlueParallax.png.yml (100%) rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/GreenParallax.png.yml (100%) rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/MirStationParallaxBG.png.yml (100%) rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/OrbitEarth.png.yml (100%) rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/PixelGreenParallax.png.yml (100%) rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/PixelPurpleParallax.png.yml (100%) rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/PurpleParallax.png.yml (100%) rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/planet2.png.yml (100%) rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/planet3.png.yml (100%) rename Resources/Textures/_Sunrise/Parallaxes/{NES => }/planet4.png.yml (100%) diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs index 71f6ea2fe7..9a23ea946b 100644 --- a/Content.Client/Entry/EntryPoint.cs +++ b/Content.Client/Entry/EntryPoint.cs @@ -1,5 +1,6 @@ using Content.Client._RMC14.Explosion; using Content.Client._RMC14.Xenonids.Screech; +using Content.Client._Sunrise; using Content.Client._Sunrise.Contributors; using Content.Client._Sunrise.Entry; using Content.Client._Sunrise.PlayerCache; @@ -88,6 +89,7 @@ namespace Content.Client.Entry [Dependency] private readonly ServersHubManager _serversHubManager = default!; // Sunrise-Hub [Dependency] private readonly ContributorsManager _contributorsManager = default!; // Sunrise-Edit [Dependency] private readonly PlayerCacheManager _playerCacheManager = default!; // Sunrise-Edit + [Dependency] private readonly NetTexturesManager _netTexturesManager = default!; // Sunrise-Edit public override void PreInit() { @@ -162,6 +164,7 @@ namespace Content.Client.Entry _serversHubManager.Initialize(); // Sunrise-Hub _contributorsManager.Initialize(); // Sunrise-Edit _playerCacheManager.Initialize(); // Sunrise-Edit + _netTexturesManager.Initialize(); // Sunrise-Edit // Sunrise-Sponsors-Start SunriseClientEntry.Init(); @@ -262,6 +265,7 @@ namespace Content.Client.Entry if (level == ModUpdateLevel.FramePreEngine) { _debugMonitorManager.FrameUpdate(); + _netTexturesManager.Update(frameEventArgs.DeltaSeconds); // Sunrise-Edit } if (level == ModUpdateLevel.PreEngine) diff --git a/Content.Client/IoC/ClientContentIoC.cs b/Content.Client/IoC/ClientContentIoC.cs index 5e89e0b6a2..917af78037 100644 --- a/Content.Client/IoC/ClientContentIoC.cs +++ b/Content.Client/IoC/ClientContentIoC.cs @@ -1,4 +1,5 @@ -using Content.Client._Sunrise.Contributors; +using Content.Client._Sunrise; +using Content.Client._Sunrise.Contributors; using Content.Client._Sunrise.InteractionsPanel.Models; using Content.Client._Sunrise.IoC; using Content.Client._Sunrise.PlayerCache; @@ -72,6 +73,7 @@ namespace Content.Client.IoC collection.Register(); collection.Register(); collection.Register(); + collection.Register(); SunriseClientContentIoC.Register(); collection.Register(true); // Sunrise-End diff --git a/Content.Client/Lobby/LobbyState.cs b/Content.Client/Lobby/LobbyState.cs index 47cf93bb77..15b946d1e7 100644 --- a/Content.Client/Lobby/LobbyState.cs +++ b/Content.Client/Lobby/LobbyState.cs @@ -1,4 +1,5 @@ using System.Linq; +using Content.Client._Sunrise; using Content.Client._Sunrise.Contributors; using Content.Client._Sunrise.Latejoin; using Content.Client._Sunrise.ServersHub; @@ -14,9 +15,11 @@ using Content.Shared._Sunrise.Contributors; using Robust.Client; using Robust.Client.Console; using Robust.Client.ResourceManagement; +using Robust.Client.Upload; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Shared.Configuration; +using Robust.Shared.Log; using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -52,15 +55,24 @@ namespace Content.Client.Lobby [Dependency] private readonly ContributorsManager _contributorsManager = default!; [Dependency] private readonly ChangelogManager _changelogManager = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly NetTexturesManager _netTexturesManager = default!; + [Dependency] private readonly ILogManager _logManager = default!; private ClientGameTicker _gameTicker = default!; private ContentAudioSystem _contentAudioSystem = default!; + private ISawmill _sawmill = default!; + + // Track loaded resources for unloading + private ResPath? _currentAnimationPath; + private ResPath? _currentArtPath; protected override Type? LinkedScreenType { get; } = typeof(LobbyGui); public LobbyGui? Lobby; protected override void Startup() { + _sawmill = _logManager.GetSawmill("lobby"); + if (_userInterfaceManager.ActiveScreen == null) { return; @@ -115,6 +127,9 @@ namespace Content.Client.Lobby _cfg.OnValueChanged(SunriseCCVars.LobbyArt, OnLobbyArtChanged, true); _cfg.OnValueChanged(SunriseCCVars.LobbyAnimation, OnLobbyAnimationChanged, true); _cfg.OnValueChanged(SunriseCCVars.LobbyParallax, OnLobbyParallaxChanged, true); + + // Subscribe to resource loaded events + _netTexturesManager.ResourceLoaded += OnNetworkResourceLoaded; // Sunrise-end Lobby.CharacterPreview.CharacterSetupButton.OnPressed += OnSetupPressed; @@ -146,10 +161,28 @@ namespace Content.Client.Lobby Lobby!.ReadyButton.OnPressed -= OnReadyPressed; Lobby!.ReadyButton.OnToggled -= OnReadyToggled; + // Unload lobby resources if CVar is enabled + if (_cfg.GetCVar(SunriseCCVars.LobbyUnloadResources)) + { + if (_currentAnimationPath.HasValue) + { + UnloadResource(_currentAnimationPath.Value); + _currentAnimationPath = null; + } + if (_currentArtPath.HasValue) + { + UnloadResource(_currentArtPath.Value); + _currentArtPath = null; + } + } + Lobby = null; _serversHubManager.ServersDataListChanged -= RefreshServersHubHeader; _contributorsManager.ContributorsDataListChanged -= RefreshContributorsHeader; + + // Unsubscribe from resource loaded events + _netTexturesManager.ResourceLoaded -= OnNetworkResourceLoaded; } private void RefreshServersHubHeader(List servers) @@ -237,9 +270,30 @@ namespace Content.Client.Lobby { // Sunrise-Start UpdateLobbyType(); - UpdateLobbyParallax(); - UpdateLobbyAnimation(); - UpdateLobbyArt(); + // Only update the selected background type, not all of them + var backgroundType = _cfg.GetCVar(SunriseCCVars.LobbyBackgroundType); + if (backgroundType == "Random" && _gameTicker.LobbyType != null) + { + backgroundType = _gameTicker.LobbyType; + } + + if (!Enum.TryParse(backgroundType, out LobbyBackgroundType lobbyBackgroundType)) + { + lobbyBackgroundType = LobbyBackgroundType.Parallax; // Default + } + + switch (lobbyBackgroundType) + { + case LobbyBackgroundType.Parallax: + UpdateLobbyParallax(); + break; + case LobbyBackgroundType.Art: + UpdateLobbyArt(); + break; + case LobbyBackgroundType.Animation: + UpdateLobbyAnimation(); + break; + } // Sunrise-End UpdateLobbyUi(); } @@ -346,7 +400,7 @@ namespace Content.Client.Lobby if (Lobby == null) { - Logger.Error("Error in SetLobbyBackgroundType. Lobby is null"); + _sawmill.Error("Error in SetLobbyBackgroundType. Lobby is null"); return; } @@ -402,41 +456,197 @@ namespace Content.Client.Lobby private void SetLobbyAnimation(string lobbyAnimation) { + // Check if animation background type is currently selected + var backgroundType = _cfg.GetCVar(SunriseCCVars.LobbyBackgroundType); + if (backgroundType == "Random" && _gameTicker.LobbyType != null) + { + backgroundType = _gameTicker.LobbyType; + } + + if (!Enum.TryParse(backgroundType, out LobbyBackgroundType lobbyBackgroundType) || + lobbyBackgroundType != LobbyBackgroundType.Animation) + { + // Animation is not the selected background type, don't load it + return; + } + if (!_protoMan.TryIndex(lobbyAnimation, out var lobbyAnimationPrototype)) return; if (Lobby == null) { - Logger.Error("Error in SetLobbyAnimation. Lobby is null"); + _sawmill.Error("Error in SetLobbyAnimation. Lobby is null"); return; } + + // Unload previous animation if CVar is enabled + if (_cfg.GetCVar(SunriseCCVars.LobbyUnloadResources) && _currentAnimationPath.HasValue) + { + UnloadResource(_currentAnimationPath.Value); + } - Lobby!.LobbyAnimation.SetFromSpriteSpecifier(new SpriteSpecifier.Rsi(new ResPath(lobbyAnimationPrototype.Animation), lobbyAnimationPrototype.State)); - Lobby!.LobbyAnimation.DisplayRect.TextureScale = lobbyAnimationPrototype.Scale; + var rsiPath = lobbyAnimationPrototype.Animation; + + // Check if resource is available, request if not + var isAvailable = _netTexturesManager.EnsureResource(rsiPath); + + ResPath targetPath; + if (isAvailable) + { + // Resource is available, use uploaded path + targetPath = _netTexturesManager.GetUploadedPath(rsiPath); + } + else + { + // Resource is being requested, try to use uploaded path first + var uploadedPath = _netTexturesManager.GetUploadedPath(rsiPath); + var metaPath = (uploadedPath / "meta.json").ToRootedPath(); + + // Check if uploaded resource exists + if (_resource.ContentFileExists(metaPath)) + { + targetPath = uploadedPath; + } + else + { + // Resource not available yet, don't try to load it (will cause error) + // The resource will be loaded when it arrives via NetworkResourceUploadMessage + return; + } + } + + // Try to set the animation, handle errors gracefully + try + { + // Check if the file actually exists before trying to load it + if (!_resource.ContentFileExists(targetPath)) + { + var metaPath = (targetPath / "meta.json").ToRootedPath(); + if (!_resource.ContentFileExists(metaPath)) + { + return; + } + } + + // Try to get the resource - this will load it if not cached + if (_resourceCache.TryGetResource(targetPath, out var rsiResource)) + { + Lobby!.LobbyAnimation.SetFromSpriteSpecifier(new SpriteSpecifier.Rsi(targetPath, lobbyAnimationPrototype.State)); + Lobby!.LobbyAnimation.DisplayRect.TextureScale = lobbyAnimationPrototype.Scale; + _currentAnimationPath = targetPath; + } + else + { + _sawmill.Warning($"Failed to load lobby animation RSI: {targetPath}. Resource not found in cache."); + } + } + catch (Exception ex) + { + _sawmill.Warning($"Exception while setting lobby animation {lobbyAnimation}: {ex.Message}"); + } } private void SetLobbyArt(string lobbyArt) { + // Check if art background type is currently selected + var backgroundType = _cfg.GetCVar(SunriseCCVars.LobbyBackgroundType); + if (backgroundType == "Random" && _gameTicker.LobbyType != null) + { + backgroundType = _gameTicker.LobbyType; + } + + if (!Enum.TryParse(backgroundType, out LobbyBackgroundType lobbyBackgroundType) || + lobbyBackgroundType != LobbyBackgroundType.Art) + { + // Art is not the selected background type, don't load it + return; + } + if (!_protoMan.TryIndex(lobbyArt, out var lobbyArtPrototype)) return; if (Lobby == null) { - Logger.Error("Error in SetLobbyArt. Lobby is null"); + _sawmill.Error("Error in SetLobbyArt. Lobby is null"); return; } + + // Unload previous art if CVar is enabled + if (_cfg.GetCVar(SunriseCCVars.LobbyUnloadResources) && _currentArtPath.HasValue) + { + UnloadResource(_currentArtPath.Value); + } - Lobby!.LobbyArt.Texture = _resourceCache.GetResource(lobbyArtPrototype.Background); + var imagePath = lobbyArtPrototype.Background.ToString(); + + // Check if resource is available, request if not + var isAvailable = _netTexturesManager.EnsureResource(imagePath); + + ResPath targetPath; + if (isAvailable) + { + // Resource is available, use uploaded path + targetPath = _netTexturesManager.GetUploadedPath(imagePath); + } + else + { + // Resource is being requested, try to use uploaded path first + var uploadedPath = _netTexturesManager.GetUploadedPath(imagePath); + + // Check if uploaded resource exists + if (_resource.ContentFileExists(uploadedPath)) + { + targetPath = uploadedPath; + } + else + { + // Resource not available yet, don't try to load it (will cause error) + // The resource will be loaded when it arrives via NetworkResourceUploadMessage + return; + } + } + + // Try to set the art, handle errors gracefully + try + { + if (_resourceCache.TryGetResource(targetPath, out var textureResource)) + { + Lobby!.LobbyArt.Texture = textureResource.Texture; + _currentArtPath = targetPath; + } + else + { + _sawmill.Warning($"Failed to load lobby art texture: {targetPath}"); + } + } + catch (Exception ex) + { + _sawmill.Warning($"Exception while setting lobby art {lobbyArt}: {ex.Message}"); + } } private void SetLobbyParallax(string lobbyParallax) { + // Check if parallax background type is currently selected + var backgroundType = _cfg.GetCVar(SunriseCCVars.LobbyBackgroundType); + if (backgroundType == "Random" && _gameTicker.LobbyType != null) + { + backgroundType = _gameTicker.LobbyType; + } + + if (!Enum.TryParse(backgroundType, out LobbyBackgroundType lobbyBackgroundType) || + lobbyBackgroundType != LobbyBackgroundType.Parallax) + { + // Parallax is not the selected background type, don't load it + return; + } + if (!_protoMan.TryIndex(lobbyParallax, out var lobbyParallaxPrototype)) return; if (Lobby == null) { - Logger.Error("Error in SetLobbyParallax. Lobby is null"); + _sawmill.Error("Error in SetLobbyParallax. Lobby is null"); return; } @@ -476,6 +686,111 @@ namespace Content.Client.Lobby SetLobbyParallax(_gameTicker.LobbyParallax!); } + private void OnNetworkResourceLoaded(string resourcePath) + { + // Only update the resource that matches the current background type + var backgroundType = _cfg.GetCVar(SunriseCCVars.LobbyBackgroundType); + if (backgroundType == "Random" && _gameTicker.LobbyType != null) + { + backgroundType = _gameTicker.LobbyType; + } + + if (!Enum.TryParse(backgroundType, out LobbyBackgroundType lobbyBackgroundType)) + { + lobbyBackgroundType = LobbyBackgroundType.Parallax; // Default + } + + // Only load the resource for the currently selected background type + switch (lobbyBackgroundType) + { + case LobbyBackgroundType.Animation: + var currentAnimation = _cfg.GetCVar(SunriseCCVars.LobbyAnimation); + if (currentAnimation != null) + { + if (currentAnimation == "Random") + { + // For Random, use the game ticker's selected animation + if (_gameTicker.LobbyAnimation != null) + { + SetLobbyAnimation(_gameTicker.LobbyAnimation); + } + } + else + { + // For specific animation, always try to set it + SetLobbyAnimation(currentAnimation); + } + } + break; + + case LobbyBackgroundType.Art: + var currentArt = _cfg.GetCVar(SunriseCCVars.LobbyArt); + if (currentArt != null) + { + var artToSet = currentArt == "Random" ? _gameTicker.LobbyArt : currentArt; + if (artToSet != null) + { + SetLobbyArt(artToSet); + } + } + break; + + case LobbyBackgroundType.Parallax: + // Parallax doesn't need network resources, it uses local resources + // But we can update it if needed + var currentParallax = _cfg.GetCVar(SunriseCCVars.LobbyParallax); + if (currentParallax != null) + { + var parallaxToSet = currentParallax == "Random" ? _gameTicker.LobbyParallax : currentParallax; + if (parallaxToSet != null) + { + SetLobbyParallax(parallaxToSet); + } + } + break; + } + } + + /// + /// Unloads a resource from video memory by disposing it. + /// TODO: Full resource unloading from cache is not currently possible due to sandbox restrictions. + /// The ResourceCache does not expose a public API to remove resources from its internal cache. + /// Reflection cannot be used in the client sandbox environment. + /// This method currently only disposes the resource, but it remains in the cache. + /// When the engine provides a proper API for resource cache management, this should be updated. + /// + private void UnloadResource(ResPath resourcePath) + { + try + { + bool unloaded = false; + + // Try to unload RSI resource + if (_resourceCache.TryGetResource(resourcePath, out var rsiResource)) + { + rsiResource.Dispose(); + unloaded = true; + _sawmill.Debug($"Disposed RSI resource: {resourcePath} (still in cache due to sandbox limitations)"); + } + // Try to unload texture resource + else if (_resourceCache.TryGetResource(resourcePath, out var textureResource)) + { + textureResource.Dispose(); + unloaded = true; + _sawmill.Debug($"Disposed texture resource: {resourcePath} (still in cache due to sandbox limitations)"); + } + + if (!unloaded) + { + _sawmill.Debug($"Resource not found in cache: {resourcePath}"); + } + } + catch (Exception ex) + { + _sawmill.Warning($"Failed to unload resource {resourcePath}: {ex.Message}"); + } + } + // Sunrise-end private void SetReady(bool newReady) diff --git a/Content.Client/Options/UI/Tabs/ExtraTab.xaml b/Content.Client/Options/UI/Tabs/ExtraTab.xaml index b5e2807794..a349a8382f 100644 --- a/Content.Client/Options/UI/Tabs/ExtraTab.xaml +++ b/Content.Client/Options/UI/Tabs/ExtraTab.xaml @@ -13,6 +13,7 @@ +