diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/stellarium/ClientProxy.java b/src/main/java/stellarium/ClientProxy.java index 5c9c06a..29d9518 100644 --- a/src/main/java/stellarium/ClientProxy.java +++ b/src/main/java/stellarium/ClientProxy.java @@ -2,7 +2,9 @@ import java.io.IOException; import java.lang.reflect.Field; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import java.util.Set; import net.minecraft.client.Minecraft; @@ -16,13 +18,9 @@ import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.relauncher.ReflectionHelper; -import stellarapi.api.SAPICapabilities; import stellarapi.api.gui.overlay.OverlayRegistry; import stellarapi.api.lib.config.ConfigManager; import stellarapi.api.render.IAdaptiveRenderer; -import stellarapi.api.view.IAtmosphereEffect; -import stellarapi.api.view.ICCoordinates; -import stellarapi.api.world.ICelestialWorld; import stellarapi.api.world.worldset.WorldSet; import stellarium.api.StellarSkyAPI; import stellarium.client.ClientSettings; @@ -30,14 +28,19 @@ import stellarium.client.overlay.StellarSkyOverlays; import stellarium.client.overlay.clientcfg.OverlayClientSettingsType; import stellarium.client.overlay.clock.OverlayClockType; +import stellarium.display.DisplayRegistry; import stellarium.render.GenericSkyRenderer; import stellarium.render.SkyModel; import stellarium.render.SkyRenderer; +import stellarium.render.stellars.QualitySettings; +import stellarium.render.stellars.atmosphere.AtmosphereSettings; import stellarium.stellars.OpticsHelper; import stellarium.stellars.StellarManager; import stellarium.stellars.layer.CelestialManager; +import stellarium.stellars.layer.StellarLayerRegistry; import stellarium.view.ViewerInfo; import stellarium.world.StellarScene; +import stellarium.world.landscape.LandscapeClientSettings; public class ClientProxy extends CommonProxy implements IProxy { @@ -51,7 +54,7 @@ public class ClientProxy extends CommonProxy implements IProxy { private ConfigManager guiConfig; private CelestialManager celestialManager = new CelestialManager(true); - private SkyModel skyModel; + private Map skyModels = new HashMap<>(); public ClientSettings getClientSettings() { return this.clientSettings; @@ -75,8 +78,11 @@ public void preInit(FMLPreInitializationEvent event) { OverlayRegistry.registerOverlay("clock", new OverlayClockType(), this.guiConfig); OverlayRegistry.registerOverlay("clientconfig", new OverlayClientSettingsType(), this.guiConfig); - this.skyModel = new SkyModel(this.celestialManager); - skyModel.initializeSettings(this.clientSettings); + clientSettings.putSubConfig(QualitySettings.KEY, new QualitySettings()); + clientSettings.putSubConfig(AtmosphereSettings.KEY, new AtmosphereSettings()); + clientSettings.putSubConfig(LandscapeClientSettings.KEY, new LandscapeClientSettings()); + StellarLayerRegistry.getInstance().composeSettings(clientSettings); + DisplayRegistry.getInstance().composeSettings(clientSettings); } @Override @@ -111,25 +117,31 @@ public Entity getDefViewerEntity() { @Override public void setupStellarLoad(StellarManager manager) { + World world = manager.getWorld(); + SkyModel skyModel = new SkyModel(this.celestialManager, world); skyModel.stellarLoad(manager); + skyModels.put(world, skyModel); } @Override public void setupDimensionLoad(StellarScene dimManager) { - skyModel.dimensionLoad(dimManager); + skyModels.get(dimManager.getWorld()).dimensionLoad(dimManager); } public void onSettingsChanged(ClientSettings settings) { - skyModel.updateSettings(settings); + for(SkyModel skyModel : skyModels.values()) + skyModel.updateSettings(settings); + SkyRenderer.INSTANCE.initialize(settings); } @SuppressWarnings("deprecation") @Override public IAdaptiveRenderer setupSkyRenderer(World world, WorldSet worldSet, String option) { + SkyModel skyModel = skyModels.get(world); skyModel.updateSettings(this.clientSettings); SkyRenderer.INSTANCE.initialize(this.clientSettings); - IRenderHandler genericRenderer = new GenericSkyRenderer(this.skyModel); + IRenderHandler genericRenderer = new GenericSkyRenderer(skyModel); return StellarSkyAPI.getRendererFor(option, genericRenderer); } @@ -140,39 +152,46 @@ public float getScreenWidth() { @Override public void updateTick() { - if(clientSettings.checkDirty()) - this.onSettingsChanged(this.clientSettings); - - Minecraft mc = Minecraft.getMinecraft(); - World world = mc.world; - Entity viewer = mc.getRenderViewEntity(); - - // Placeholder fix for vanilla lighting glitch. - try { - @SuppressWarnings("unchecked") - Set lightUpdates = (Set) fieldLightUpdateSet.get(mc.renderGlobal); - Iterator ite = lightUpdates.iterator(); - while(ite.hasNext()) { - BlockPos pos = ite.next(); - ite.remove(); - int x = pos.getX(); - int y = pos.getY(); - int z = pos.getZ(); - mc.renderGlobal.markBlockRangeForRenderUpdate(x-1, y-1, z-1, x+1, y+1, z+1); + if(!skyModels.isEmpty()) { + Minecraft mc = Minecraft.getMinecraft(); + Entity viewer = mc.getRenderViewEntity(); + + if(clientSettings.checkDirty()) + this.onSettingsChanged(this.clientSettings); + + // Placeholder fix for vanilla lighting glitch. + try { + @SuppressWarnings("unchecked") + Set lightUpdates = (Set) fieldLightUpdateSet.get(mc.renderGlobal); + Iterator ite = lightUpdates.iterator(); + while(ite.hasNext()) { + BlockPos pos = ite.next(); + ite.remove(); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + mc.renderGlobal.markBlockRangeForRenderUpdate(x-1, y-1, z-1, x+1, y+1, z+1); + } + } catch(IllegalAccessException exception) { + throw new IllegalStateException("Illegal access to field " + fieldLightUpdateSet.getName() + ", Unexpected."); + } + + if(viewer != null) { + for (SkyModel skyModel : skyModels.values()) { + skyModel.onTick(viewer); + } } - } catch(IllegalAccessException exception) { - throw new IllegalStateException("Illegal access to field " + fieldLightUpdateSet.getName() + ", Unexpected."); } - - ICelestialWorld cWorld = world.getCapability(SAPICapabilities.CELESTIAL_CAPABILITY, null); - ICCoordinates coordinate = cWorld.getCoordinate(); - IAtmosphereEffect sky = cWorld.getSkyEffect(); - - skyModel.onTick(this.getDefWorld(), new ViewerInfo(coordinate, sky, viewer, 0.0f)); } @Override public void addScheduledTask(Runnable runnable) { Minecraft.getMinecraft().addScheduledTask(runnable); } + + @Override + public void removeSkyModel(World world) { + if(skyModels.containsKey(world)) + skyModels.remove(world); + } } diff --git a/src/main/java/stellarium/CommonProxy.java b/src/main/java/stellarium/CommonProxy.java index 1f82e87..199b979 100644 --- a/src/main/java/stellarium/CommonProxy.java +++ b/src/main/java/stellarium/CommonProxy.java @@ -93,4 +93,6 @@ public void setupStellarLoad(StellarManager manager) { } @Override public void setupDimensionLoad(StellarScene dimManager) { } + @Override + public void removeSkyModel(World world) { } } diff --git a/src/main/java/stellarium/IProxy.java b/src/main/java/stellarium/IProxy.java index 800624e..f7e1d57 100644 --- a/src/main/java/stellarium/IProxy.java +++ b/src/main/java/stellarium/IProxy.java @@ -45,4 +45,6 @@ public interface IProxy { public void setupStellarLoad(StellarManager manager); public void setupDimensionLoad(StellarScene dimManager); + + public void removeSkyModel(World world); } diff --git a/src/main/java/stellarium/StellarForgeEventHook.java b/src/main/java/stellarium/StellarForgeEventHook.java index 91ef2bf..fd3d7ab 100644 --- a/src/main/java/stellarium/StellarForgeEventHook.java +++ b/src/main/java/stellarium/StellarForgeEventHook.java @@ -2,9 +2,11 @@ import net.minecraft.world.World; import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.client.event.ConfigChangedEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import stellarapi.api.SAPICapabilities; import stellarium.stellars.StellarManager; import stellarium.stellars.layer.CelestialManager; @@ -15,14 +17,14 @@ public void preAttachCapabilities(AttachCapabilitiesEvent event) { // Check if it's initial if(!world.isRemote && world.provider.getDimension() != 0) return; - + // Now setup StellarManager here StellarManager manager = StellarManager.loadOrCreateManager(world); if(!world.isRemote) manager.setup(new CelestialManager(false)); // On client - load default before the packet arrives manager.handleServerWithoutMod(); - if(manager.getCelestialManager() == null) + if(manager.getCelestialManager() == null && world.hasCapability(SAPICapabilities.CELESTIAL_CAPABILITY, null)) manager.setup(StellarSky.PROXY.getClientCelestialManager().copyFromClient()); } @@ -31,4 +33,12 @@ public void onSyncConfig(ConfigChangedEvent.OnConfigChangedEvent event) { if(StellarSkyReferences.MODID.equals(event.getModID())) StellarSky.INSTANCE.getCelestialConfigManager().syncFromGUI(); } + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload event) { + World world = event.getWorld(); + + if(world.isRemote) + StellarSky.PROXY.removeSkyModel(world); + } } \ No newline at end of file diff --git a/src/main/java/stellarium/StellarTickHandler.java b/src/main/java/stellarium/StellarTickHandler.java index 1b7a956..5c64f8b 100644 --- a/src/main/java/stellarium/StellarTickHandler.java +++ b/src/main/java/stellarium/StellarTickHandler.java @@ -12,20 +12,8 @@ public class StellarTickHandler { @SubscribeEvent public void tickStart(TickEvent.ClientTickEvent e) { - if(e.phase == TickEvent.Phase.START){ - World world = StellarSky.PROXY.getDefWorld(); - - if(world != null) { - StellarManager manager = StellarManager.getManager(world); - if(manager.getCelestialManager() != null) { - manager.update(world.getWorldTime()); - StellarScene dimManager = StellarScene.getScene(world); - if(dimManager != null) { - dimManager.update(world, world.getWorldTime(), world.getTotalWorldTime()); - StellarSky.PROXY.updateTick(); - } - } - } + if(e.phase == TickEvent.Phase.START) { + StellarSky.PROXY.updateTick(); } } diff --git a/src/main/java/stellarium/display/DisplayModel.java b/src/main/java/stellarium/display/DisplayModel.java index 242333a..e29c67b 100644 --- a/src/main/java/stellarium/display/DisplayModel.java +++ b/src/main/java/stellarium/display/DisplayModel.java @@ -15,23 +15,16 @@ public class DisplayModel implements IDisplayInjectable { List displayList = Lists.newArrayList(); + public DisplayModel() { + DisplayRegistry.getInstance().setupDisplay(this); + } + @Override public > void injectDisplay( IDisplayElementType type, Cfg settings) { displayList.add(new Delegate(type, settings)); } - @Override - public SimpleHierarchicalConfig getSubSettings(ClientSettings settings) { - DisplayOverallSettings displaySettings = new DisplayOverallSettings(); - settings.putSubConfig("Display", displaySettings); - return displaySettings; - } - - public void initializeSettings(ClientSettings settings) { - DisplayRegistry.getInstance().setupDisplay(settings, this); - } - public void updateSettings(ClientSettings settings) { for(Delegate delegate : this.displayList) delegate.cache.initialize(settings, delegate.settings); diff --git a/src/main/java/stellarium/display/DisplayRegistry.java b/src/main/java/stellarium/display/DisplayRegistry.java index 15f4592..5020cf6 100644 --- a/src/main/java/stellarium/display/DisplayRegistry.java +++ b/src/main/java/stellarium/display/DisplayRegistry.java @@ -2,7 +2,6 @@ import com.google.common.collect.ImmutableList; -import stellarapi.api.lib.config.SimpleHierarchicalConfig; import stellarium.client.ClientSettings; import stellarium.display.ecgrid.EcGridType; import stellarium.display.eqgrid.EqGridType; @@ -30,23 +29,25 @@ void register(IDisplayElementType type) { builder.add(new RegistryDelegate(type)); } - public void setupDisplay(ClientSettings settings, IDisplayInjectable injectable) { - SimpleHierarchicalConfig displaySettings = injectable.getSubSettings(settings); + public void composeSettings(ClientSettings settings) { + DisplayOverallSettings displaySettings = new DisplayOverallSettings(); + settings.putSubConfig("Display", displaySettings); for(RegistryDelegate delegate : builder.build()) - delegate.inject(displaySettings, injectable); + displaySettings.putSubConfig(delegate.type.getName(), delegate.perDisplay); + } + + public void setupDisplay(IDisplayInjectable injectable) { + for(RegistryDelegate delegate : builder.build()) + injectable.injectDisplay(delegate.type, delegate.perDisplay); } private static class RegistryDelegate> { - private RegistryDelegate(IDisplayElementType input) { - this.type = input; - } - private IDisplayElementType type; + private Cfg perDisplay; - public void inject(SimpleHierarchicalConfig settings, IDisplayInjectable injectable) { - Cfg perDisplay = type.generateSettings(); - settings.putSubConfig(type.getName(), perDisplay); - injectable.injectDisplay(this.type, perDisplay); + private RegistryDelegate(IDisplayElementType type) { + this.type = type; + this.perDisplay = type.generateSettings(); } } } diff --git a/src/main/java/stellarium/display/IDisplayInjectable.java b/src/main/java/stellarium/display/IDisplayInjectable.java index 52ad9c7..5bd72b8 100644 --- a/src/main/java/stellarium/display/IDisplayInjectable.java +++ b/src/main/java/stellarium/display/IDisplayInjectable.java @@ -1,11 +1,6 @@ package stellarium.display; -import stellarapi.api.lib.config.SimpleHierarchicalConfig; -import stellarium.client.ClientSettings; - public interface IDisplayInjectable { public > void injectDisplay( IDisplayElementType type, Cfg settings); - - public SimpleHierarchicalConfig getSubSettings(ClientSettings settings); } diff --git a/src/main/java/stellarium/render/SkyModel.java b/src/main/java/stellarium/render/SkyModel.java index 1944145..773eb91 100644 --- a/src/main/java/stellarium/render/SkyModel.java +++ b/src/main/java/stellarium/render/SkyModel.java @@ -1,6 +1,11 @@ package stellarium.render; +import net.minecraft.entity.Entity; import net.minecraft.world.World; +import stellarapi.api.SAPICapabilities; +import stellarapi.api.view.IAtmosphereEffect; +import stellarapi.api.view.ICCoordinates; +import stellarapi.api.world.ICelestialWorld; import stellarium.client.ClientSettings; import stellarium.display.DisplayModel; import stellarium.render.stellars.StellarModel; @@ -16,20 +21,17 @@ public class SkyModel { final StellarModel stellarModel; final DisplayModel displayModel; final LandscapeModel landscapeModel; + final World world; + private StellarScene dimManager; - public SkyModel(CelestialManager clientCelestialManager) { + public SkyModel(CelestialManager clientCelestialManager, World world) { if(!OpenGlUtil.FRAMEBUFFER_SUPPORTED) System.err.println("FBO isn't supported, Stellar Sky can't operate in this case."); this.stellarModel = new StellarModel(clientCelestialManager); this.displayModel = new DisplayModel(); this.landscapeModel = new LandscapeModel(); - } - - public void initializeSettings(ClientSettings settings) { - stellarModel.initializeSettings(settings); - displayModel.initializeSettings(settings); - landscapeModel.initializeSettings(settings); + this.world = world; } public void updateSettings(ClientSettings settings) { @@ -52,14 +54,23 @@ public void stellarLoad(StellarManager manager) { * to initialize the state of render models. * */ public void dimensionLoad(StellarScene dimManager) { + this.dimManager = dimManager; stellarModel.dimensionLoad(dimManager); displayModel.dimensionLoad(dimManager); landscapeModel.dimensionLoad(dimManager); } - public void onTick(World world, ViewerInfo update) { - stellarModel.onTick(world, update); - displayModel.onTick(world, update); - landscapeModel.updateCache(); + public void onTick(Entity viewer) { + if(dimManager != null) { + ICelestialWorld cWorld = world.getCapability(SAPICapabilities.CELESTIAL_CAPABILITY, null); + ICCoordinates coordinate = cWorld.getCoordinate(); + IAtmosphereEffect sky = cWorld.getSkyEffect(); + ViewerInfo update = new ViewerInfo(coordinate, sky, viewer, 0.0f); + + dimManager.update(world, world.getWorldTime(), world.getTotalWorldTime()); + stellarModel.onTick(world, update); + displayModel.onTick(world, update); + landscapeModel.updateCache(); + } } } diff --git a/src/main/java/stellarium/render/stellars/StellarModel.java b/src/main/java/stellarium/render/stellars/StellarModel.java index 92d1025..15b98ec 100644 --- a/src/main/java/stellarium/render/stellars/StellarModel.java +++ b/src/main/java/stellarium/render/stellars/StellarModel.java @@ -18,12 +18,6 @@ public StellarModel(CelestialManager clientCelestialManager) { this.layersModel = new StellarRenderModel(clientCelestialManager, this.atmModel); } - public void initializeSettings(ClientSettings settings) { - settings.putSubConfig(QualitySettings.KEY, new QualitySettings()); - atmModel.initializeSettings(settings); - layersModel.initializeSettings(settings); - } - public void updateSettings(ClientSettings settings) { layersModel.updateSettings(settings); } diff --git a/src/main/java/stellarium/render/stellars/atmosphere/AtmosphereModel.java b/src/main/java/stellarium/render/stellars/atmosphere/AtmosphereModel.java index a57c11d..abbbec2 100644 --- a/src/main/java/stellarium/render/stellars/atmosphere/AtmosphereModel.java +++ b/src/main/java/stellarium/render/stellars/atmosphere/AtmosphereModel.java @@ -25,10 +25,6 @@ public class AtmosphereModel implements ICheckedAtmModel { private boolean azimuthCheckEnabled; private double leastAzimuthRendered; - public void initializeSettings(ClientSettings settings) { - settings.putSubConfig(AtmosphereSettings.KEY, new AtmosphereSettings()); - } - public void dimensionLoad(StellarScene dimManager) { this.azimuthCheckEnabled = dimManager.getSettings().hideObjectsUnderHorizon(); this.leastAzimuthRendered = -90.0f; diff --git a/src/main/java/stellarium/render/stellars/phased/StellarRenderModel.java b/src/main/java/stellarium/render/stellars/phased/StellarRenderModel.java index f03915a..01e31e3 100644 --- a/src/main/java/stellarium/render/stellars/phased/StellarRenderModel.java +++ b/src/main/java/stellarium/render/stellars/phased/StellarRenderModel.java @@ -29,10 +29,6 @@ public StellarRenderModel(CelestialManager celManager, ICheckedAtmModel atmModel } } - public void initializeSettings(ClientSettings settings) { - StellarLayerRegistry.getInstance().composeSettings(settings); - } - public void updateSettings(ClientSettings settings) { for(StellarLayerModel model : this.layerModels) model.updateSettings(settings); diff --git a/src/main/java/stellarium/stellars/StellarManager.java b/src/main/java/stellarium/stellars/StellarManager.java index 5429ed1..0ab5d49 100644 --- a/src/main/java/stellarium/stellars/StellarManager.java +++ b/src/main/java/stellarium/stellars/StellarManager.java @@ -17,9 +17,11 @@ public final class StellarManager extends WorldSavedData { private ServerSettings settings; private CelestialManager celestialManager; private boolean locked = false, setup = false; + private World world; - public StellarManager(String id) { + public StellarManager(String id, World world) { super(id); + this.world = world; } public static @Nonnull StellarManager loadOrCreateManager(World world) { @@ -27,7 +29,7 @@ public StellarManager(String id) { if(!(data instanceof StellarManager)) { - StellarManager manager = new StellarManager(ID); + StellarManager manager = new StellarManager(ID, world); world.getMapStorage().setData(ID, manager); manager.loadSettingsFromConfig(); @@ -87,7 +89,10 @@ public void setup(CelestialManager manager) { if(!this.setup) { StellarSky.INSTANCE.getLogger().info("Starting Common Initialization..."); this.celestialManager = manager; - StellarSky.PROXY.setupStellarLoad(this); + + if(world.isRemote) + StellarSky.PROXY.setupStellarLoad(this); + manager.initializeCommon(this, this.settings); StellarSky.INSTANCE.getLogger().info("Common Initialization Ended."); } @@ -136,4 +141,8 @@ public boolean hasSetup() { public static boolean hasSetup(World world) { return StellarManager.getManager(world).hasSetup(); } + + public World getWorld() { + return world; + } } diff --git a/src/main/java/stellarium/world/StellarScene.java b/src/main/java/stellarium/world/StellarScene.java index 6f8defa..a980e11 100644 --- a/src/main/java/stellarium/world/StellarScene.java +++ b/src/main/java/stellarium/world/StellarScene.java @@ -174,4 +174,8 @@ public ICelestialHelper createCelestialHelper() { public IAdaptiveRenderer createSkyRenderer() { return StellarSky.PROXY.setupSkyRenderer(this.world, this.worldSet, settings.getSkyRendererType()); } + + public World getWorld() { + return world; + } } diff --git a/src/main/java/stellarium/world/landscape/LandscapeModel.java b/src/main/java/stellarium/world/landscape/LandscapeModel.java index 7a0055f..99864bc 100644 --- a/src/main/java/stellarium/world/landscape/LandscapeModel.java +++ b/src/main/java/stellarium/world/landscape/LandscapeModel.java @@ -10,10 +10,6 @@ public class LandscapeModel { protected Vector3[][] displayvec = null; protected int latn, longn; protected boolean rendered; - - public void initializeSettings(ClientSettings settings) { - settings.putSubConfig(LandscapeClientSettings.KEY, new LandscapeClientSettings()); - } public void updateSettings(ClientSettings settings) { if(!this.rendered)