From e289dc7d5b78a4995e18dac0ce9ebf49a5c3d04e Mon Sep 17 00:00:00 2001 From: Sen Date: Thu, 17 Jul 2025 15:37:39 +0200 Subject: [PATCH] universe cleanup --- client/src/main/java/client/Client.java | 10 +- .../java/client/network/ClientPlayer.java | 7 +- .../java/client/renderer/EntityRenderer.java | 154 ++++----- .../client/renderer/RegionRenderCache.java | 2 +- .../java/client/renderer/RenderGlobal.java | 12 +- .../main/java/client/world/ChunkClient.java | 2 +- .../main/java/client/world/WorldClient.java | 58 +--- .../resources/textures/blocks/plasma_flow.png | Bin 0 -> 58849 bytes .../textures/blocks/plasma_still.png | Bin 0 -> 21395 bytes .../java/common/ai/EntityAIMoveIndoors.java | 2 +- .../block/tech/BlockDaylightDetector.java | 4 +- .../src/main/java/common/dimension/Area.java | 8 + .../main/java/common/dimension/DimType.java | 25 +- .../main/java/common/dimension/Dimension.java | 45 ++- .../main/java/common/dimension/Domain.java | 11 +- .../main/java/common/dimension/Galaxy.java | 11 +- .../src/main/java/common/dimension/Moon.java | 8 + .../main/java/common/dimension/Planet.java | 24 ++ .../dimension/{Nameable.java => Section.java} | 4 +- .../main/java/common/dimension/Sector.java | 11 +- .../src/main/java/common/dimension/Semi.java | 8 + .../src/main/java/common/dimension/Space.java | 130 +------- .../src/main/java/common/dimension/Star.java | 4 + .../src/main/java/common/entity/Entity.java | 3 +- .../java/common/entity/npc/EntitySlime.java | 2 +- .../java/common/init/UniverseRegistry.java | 303 +++++++++--------- .../common/item/tool/ItemSpaceNavigator.java | 4 +- .../common/item/tool/ItemWeatherToken.java | 2 +- .../java/common/packet/SPacketRespawn.java | 12 +- common/src/main/java/common/world/Chunk.java | 22 +- common/src/main/java/common/world/World.java | 42 +-- server/src/main/java/server/Server.java | 79 ++--- .../server/command/commands/CommandTime.java | 2 +- .../command/commands/CommandWeather.java | 2 +- .../src/main/java/server/network/Player.java | 4 +- .../main/java/server/world/ChunkServer.java | 2 +- server/src/main/java/server/world/Region.java | 4 +- .../main/java/server/world/WorldServer.java | 10 +- .../worldgen/foliage/FeatureDoublePlant.java | 2 +- .../worldgen/foliage/WorldGenFlowers.java | 2 +- .../worldgen/foliage/WorldGenMushroom.java | 2 +- 41 files changed, 440 insertions(+), 599 deletions(-) create mode 100755 client/src/main/resources/textures/blocks/plasma_flow.png create mode 100755 client/src/main/resources/textures/blocks/plasma_still.png rename common/src/main/java/common/dimension/{Nameable.java => Section.java} (81%) diff --git a/client/src/main/java/client/Client.java b/client/src/main/java/client/Client.java index 60578606..630f89e9 100755 --- a/client/src/main/java/client/Client.java +++ b/client/src/main/java/client/Client.java @@ -486,6 +486,10 @@ public class Client implements IThreadListener { public int downfallRange = 4; @Variable(name = "draw_rain_particle_range", category = CVarCategory.RENDER, min = 0, max = 25, display = "Regen-Partikel-Radius") public int rainParticleRange = 10; + @Variable(name = "draw_void_particles", category = CVarCategory.RENDER, display = "Partikel in der Tiefe") + public boolean voidParticles = true; + @Variable(name = "draw_void_fog", category = CVarCategory.RENDER, display = "Nebel in der Tiefe") + public boolean voidFog = true; @Variable(name = "crosshair_size", category = CVarCategory.GUI, min = 0, max = 32, display = "Größe des Fadenkreuzes") private int crosshairSize = 6; @Variable(name = "crosshair_color_notarget", type = IntType.COLOR, category = CVarCategory.GUI, display = "Fadenkreuz-Farbe (ohne Ziel)") @@ -1733,7 +1737,7 @@ public class Client implements IThreadListener { lline = "Licht: " + chunk.getLightSub(blockpos, 0) + " (" + chunk.getLight(LightType.SKY, blockpos) + " Himmel, " + chunk.getLight(LightType.BLOCK, blockpos) + " Blöcke, " + String.format( "%.1f", this.world.getSunBrightness(1.0f) * 15.0f) + " Welt), A: " - + String.format("%.3f", this.world.getCelestialAngle(1.0f)); + + String.format("%.3f °", this.world.getCelestialAngle(1.0f)); } else { bline = "Biom: , D: " + @@ -1741,7 +1745,7 @@ public class Client implements IThreadListener { " (" + (this.dimensionName == null ? UniverseRegistry.getName(this.world.dimension) : this.dimensionName) + ")"; lline = "Licht: " + String.format( "%.1f", this.world.getSunBrightness(1.0f) * 15.0f) + " Welt, A: " - + String.format("%.3f", this.world.getCelestialAngle(1.0f)); + + String.format("%.3f °", this.world.getCelestialAngle(1.0f)); } float temp = Math.max(this.world.getTempOffset() + (biome != null ? biome.getTemperature(blockpos) : 0.0f), 0.0f); @@ -1778,7 +1782,7 @@ public class Client implements IThreadListener { this.world.dimension.getOrbitalPeriod() ) + "\n" + String.format("Laub: %s%s, T: %.2f K / %.2f °C, %s (R %.1f, %.1f)", - !this.world.dimension.getType().days ? "*" : "", + !this.world.dimension.hasSeasons() ? "*" : "", this.world.getLeavesGen(blockpos).getDisplayName(), temp, World.ABSOLUTE_ZERO + temp, this.world.getWeather().getDisplay(), this.world.getRainStrength(), diff --git a/client/src/main/java/client/network/ClientPlayer.java b/client/src/main/java/client/network/ClientPlayer.java index ec7bf381..ebdd80c6 100755 --- a/client/src/main/java/client/network/ClientPlayer.java +++ b/client/src/main/java/client/network/ClientPlayer.java @@ -31,6 +31,7 @@ import common.block.tech.BlockChest; import common.block.tech.BlockDispenser; import common.block.tech.BlockFurnace; import common.block.tech.BlockWorkbench; +import common.dimension.DimType; import common.dimension.Dimension; import common.dimension.Space; import common.effect.StatusEffect; @@ -761,7 +762,7 @@ public class ClientPlayer implements IClientPlayer chunk.setData(packetIn.getExtractedDataBytes(), packetIn.getExtractedExtend(), packetIn.hasBiomes()); this.world.markBlockRangeForRenderUpdate(packetIn.getChunkX() << 4, -World.MAX_SIZE_Y, packetIn.getChunkZ() << 4, (packetIn.getChunkX() << 4) + 15, World.MAX_SIZE_Y, (packetIn.getChunkZ() << 4) + 15); - if (!packetIn.hasBiomes() || this.world.dimension.hasNoLight()) // TODO: check + if (!packetIn.hasBiomes() || !this.world.dimension.hasSkyLight()) // TODO: check { chunk.resetRelight(); } @@ -1401,7 +1402,7 @@ public class ClientPlayer implements IClientPlayer chunk.setData(packetIn.getChunkBytes(i), packetIn.getChunkExtend(i), true); this.world.markBlockRangeForRenderUpdate(j << 4, -World.MAX_SIZE_Y, k << 4, (j << 4) + 15, World.MAX_SIZE_Y, (k << 4) + 15); - if (this.world.dimension.hasNoLight()) // TODO: check + if (!this.world.dimension.hasSkyLight()) // TODO: check { chunk.resetRelight(); } @@ -1900,7 +1901,7 @@ public class ClientPlayer implements IClientPlayer public void handleCelestials(SPacketCelestials packet) { NetHandler.checkThread(packet, this, this.gm, this.world); this.world.setExterminated(packet.getExterminated()); - if(this.world.dimension.getType().celestials) { + if(this.world.dimension.getType() == DimType.PLANET || this.world.dimension.getType() == DimType.MOON) { this.world.dimension.setSunColor(packet.getSunColor()); this.world.dimension.setMoonColors(packet.getMoonColors()); } diff --git a/client/src/main/java/client/renderer/EntityRenderer.java b/client/src/main/java/client/renderer/EntityRenderer.java index 2301eabc..38a3c592 100755 --- a/client/src/main/java/client/renderer/EntityRenderer.java +++ b/client/src/main/java/client/renderer/EntityRenderer.java @@ -764,7 +764,7 @@ public class EntityRenderer { if (world.dimension.getLightColor() != 0xffffffff) { Vec3 lightColor = new Vec3(world.dimension.getLightColor()); - float light = world.dimension.hasNoLight() ? 1.0f : sky; + float light = world.dimension.hasSkyLight() ? sky : 1.0f; sred = (float)lightColor.xCoord * light; sgreen = (float)lightColor.yCoord * light; sblue = (float)lightColor.zCoord * light; @@ -780,7 +780,7 @@ public class EntityRenderer { float intens = (float)world.getLastLightning() - partialTicks; if(intens > 1.0F) intens = 1.0F; - float light = world.dimension.hasNoLight() ? 1.0f : rsky; + float light = world.dimension.hasSkyLight() ? rsky : 1.0f; sred = sred * (1.0F - intens) + (float)lightColor.xCoord * light * intens; sgreen = sgreen * (1.0F - intens) + (float)lightColor.yCoord * light * intens; sblue = sblue * (1.0F - intens) + (float)lightColor.zCoord * light * intens; @@ -1089,7 +1089,7 @@ public class EntityRenderer { this.setupFog(0, partialTicks); // renderGlobalIn.renderClouds(partialTicks); float alpha = 0.8F * (1.0f - this.gm.world.getSpaceFactor()); - if(this.gm.world.dimension.getType().clouds && alpha > 0.5f) + if(this.gm.world.dimension.hasWeather() && alpha > 0.5f) renderGlobalIn.renderClouds(alpha, partialTicks); GlState.disableFog(); GL11.glPopMatrix(); @@ -1334,32 +1334,40 @@ public class EntityRenderer { { WorldClient world = this.gm.world; Entity entity = this.gm.getRenderViewEntity(); - float dist = 0.25F + 0.75F * (float)this.gm.renderDistance / 32.0F; - dist = 1.0F - (float)Math.pow((double)dist, 0.25D); - Vec3 sky = world.getSkyColor(this.gm.getRenderViewEntity(), partial); - float sr = (float)sky.xCoord; - float sg = (float)sky.yCoord; - float sb = (float)sky.zCoord; - Vec3 fog = world.getFogColor(this.gm.getRenderViewEntity(), partial); + + Vec3 fog = new Vec3(world.dimension.getFogColor()); this.fogColorRed = (float)fog.xCoord; this.fogColorGreen = (float)fog.yCoord; this.fogColorBlue = (float)fog.zCoord; + + if(world.dimension.isExterminated()) { + this.fogColorRed = 0.188f; + this.fogColorGreen = 0.188f; + this.fogColorBlue = 0.188f; + } + + if(world.dimension.hasDaylight()) { + float sun = ExtMath.clampf(ExtMath.cos(world.getDayPhase(partial)) * 2.0F + 0.5F, 0.0F, 1.0F); + this.fogColorRed = this.fogColorRed * (sun * 0.94F + 0.06F); + this.fogColorGreen = this.fogColorGreen * (sun * 0.94F + 0.06F); + this.fogColorBlue = this.fogColorBlue * (sun * 0.91F + 0.09F); + } - if (this.gm.renderDistance >= 4) + float space = world.getSpaceFactor(); + if(space > 0.0f) { + this.fogColorRed = this.fogColorRed * (1.0F - space); + this.fogColorGreen = this.fogColorGreen * (1.0F - space); + this.fogColorBlue = this.fogColorBlue * (1.0F - space); + } + + if (this.gm.renderDistance >= 4 && world.dimension.hasDaylight() && !world.dimension.isBaseDestroyed()) { double neg = -1.0D; - Vec3 pos = ExtMath.sin(world.getCelestialAngleRadians(partial)) > 0.0F ? new Vec3(neg, 0.0D, 0.0D) : new Vec3(1.0D, 0.0D, 0.0D); + Vec3 pos = ExtMath.sin(world.getDayPhase(partial)) > 0.0F ? new Vec3(neg, 0.0D, 0.0D) : new Vec3(1.0D, 0.0D, 0.0D); float shift = (float)entity.getLook(partial).dotProduct(pos); - - if (shift < 0.0F) - { - shift = 0.0F; - } - if (shift > 0.0F) { - float[] sun = world.dimension.getType().days && !world.dimension.isBaseDestroyed() ? - RenderGlobal.calcSunriseSunsetColors(world.getCelestialAngleRadians(partial), partial) : null; + float[] sun = RenderGlobal.calcSunriseSunsetColors(world.getDayPhase(partial), partial); if (sun != null) { shift = shift * sun[3]; @@ -1370,11 +1378,14 @@ public class EntityRenderer { } } - this.fogColorRed += (sr - this.fogColorRed) * dist; - this.fogColorGreen += (sg - this.fogColorGreen) * dist; - this.fogColorBlue += (sb - this.fogColorBlue) * dist; + float dist = 0.25F + 0.75F * (float)this.gm.renderDistance / 32.0F; + dist = 1.0F - (float)Math.pow((double)dist, 0.25D); + Vec3 sky = world.getSkyColor(this.gm.getRenderViewEntity(), partial); + this.fogColorRed += ((float)sky.xCoord - this.fogColorRed) * dist; + this.fogColorGreen += ((float)sky.yCoord - this.fogColorGreen) * dist; + this.fogColorBlue += ((float)sky.zCoord - this.fogColorBlue) * dist; + float rain = world.getRainStrength(); - if (rain > 0.0F) { float rg = 1.0F - rain * 0.5F; @@ -1385,7 +1396,6 @@ public class EntityRenderer { } float dark = world.getDarkness(); - if (dark > 0.0F) { float mul = 1.0F - dark * 0.5F; @@ -1395,27 +1405,11 @@ public class EntityRenderer { } Block block = MatrixState.getLookedBlock(this.gm.world, entity, partial); - -// if (this.cloudFog) -// { -// Vec3 cloud = world.getCloudColour(this.gm.getRenderViewEntity(), partial); -// this.fogColorRed = (float)cloud.xCoord; -// this.fogColorGreen = (float)cloud.yCoord; -// this.fogColorBlue = (float)cloud.zCoord; -// } -// else if (block.getMaterial().isColdLiquid()) { - float cn = 0.4f; // (float)EnchantmentHelper.getRespiration(entity) * 0.2F; - -// if (entity instanceof EntityLivingBase && ((EntityLivingBase)entity).hasEffect(Potion.waterBreathing)) -// { -// f12 = f12 * 0.3F + 0.6F; -// } - - this.fogColorRed = 0.02F + cn; - this.fogColorGreen = 0.02F + cn; - this.fogColorBlue = 0.2F + cn; + this.fogColorRed = 0.42F; + this.fogColorGreen = 0.42F; + this.fogColorBlue = 0.6F; } else if (block.getMaterial().isHotLiquid()) { @@ -1428,73 +1422,45 @@ public class EntityRenderer { this.fogColorRed *= mult; this.fogColorGreen *= mult; this.fogColorBlue *= mult; - double vfog = (entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * (double)partial); // * world.dimension.getVoidFogYFactor(); - - if (entity instanceof EntityLiving && ((EntityLiving)entity).hasEffect(Effect.BLINDNESS)) + + double vision = 1.0; + if(world.dimension.hasVoidFog() && this.gm.voidFog) { + double y = (entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * (double)partial); + if(y < 0.0) + vision += y / 64.0; + } + if (entity instanceof EntityLiving living && living.hasEffect(Effect.BLINDNESS)) { - int blind = ((EntityLiving)entity).getEffect(Effect.BLINDNESS).getRemaining(); + int blind = living.getEffect(Effect.BLINDNESS).getRemaining(); if (blind < 20) - { - vfog *= (double)(1.0F - (float)blind / 20.0F); - } + vision *= (double)(1.0F - (float)blind / 20.0F); else - { - vfog = 0.0D; - } + vision = 0.0D; + } + if (vision < 1.0D) + { + if (vision < 0.0D) + vision = 0.0D; + vision = vision * vision; + this.fogColorRed = (float)((double)this.fogColorRed * vision); + this.fogColorGreen = (float)((double)this.fogColorGreen * vision); + this.fogColorBlue = (float)((double)this.fogColorBlue * vision); } - if (vfog < 1.0D) + if (entity instanceof EntityLiving living && living.hasEffect(Effect.NIGHT_VISION)) { - if (vfog < 0.0D) - { - vfog = 0.0D; - } - - vfog = vfog * vfog; - this.fogColorRed = (float)((double)this.fogColorRed * vfog); - this.fogColorGreen = (float)((double)this.fogColorGreen * vfog); - this.fogColorBlue = (float)((double)this.fogColorBlue * vfog); - } - -// if (this.bossColorModifier > 0.0F) -// { -// float shift = this.bossColorModifierPrev + (this.bossColorModifier - this.bossColorModifierPrev) * partial; -// this.fogColorRed = this.fogColorRed * (1.0F - shift) + this.fogColorRed * 0.7F * shift; -// this.fogColorGreen = this.fogColorGreen * (1.0F - shift) + this.fogColorGreen * 0.6F * shift; -// this.fogColorBlue = this.fogColorBlue * (1.0F - shift) + this.fogColorBlue * 0.6F * shift; -// } - - if (entity instanceof EntityLiving && ((EntityLiving)entity).hasEffect(Effect.NIGHT_VISION)) - { - float vis = this.getNightVisionBrightness((EntityLiving)entity, partial); + float vis = this.getNightVisionBrightness(living, partial); float mul = 1.0F / this.fogColorRed; - if (mul > 1.0F / this.fogColorGreen) - { mul = 1.0F / this.fogColorGreen; - } - if (mul > 1.0F / this.fogColorBlue) - { mul = 1.0F / this.fogColorBlue; - } - this.fogColorRed = this.fogColorRed * (1.0F - vis) + this.fogColorRed * mul * vis; this.fogColorGreen = this.fogColorGreen * (1.0F - vis) + this.fogColorGreen * mul * vis; this.fogColorBlue = this.fogColorBlue * (1.0F - vis) + this.fogColorBlue * mul * vis; } -// if (this.gm.anaglyph) -// { -// float f16 = (this.fogColorRed * 30.0F + this.fogColorGreen * 59.0F + this.fogColorBlue * 11.0F) / 100.0F; -// float f17 = (this.fogColorRed * 30.0F + this.fogColorGreen * 70.0F) / 100.0F; -// float f7 = (this.fogColorRed * 30.0F + this.fogColorBlue * 70.0F) / 100.0F; -// this.fogColorRed = f16; -// this.fogColorGreen = f17; -// this.fogColorBlue = f7; -// } - GlState.clearColor(this.fogColorRed, this.fogColorGreen, this.fogColorBlue, 0.0F); } diff --git a/client/src/main/java/client/renderer/RegionRenderCache.java b/client/src/main/java/client/renderer/RegionRenderCache.java index e8741451..b29b7f08 100755 --- a/client/src/main/java/client/renderer/RegionRenderCache.java +++ b/client/src/main/java/client/renderer/RegionRenderCache.java @@ -146,7 +146,7 @@ public class RegionRenderCache implements IWorldAccess private int getLightForExt(LightType p_175629_1_, BlockPos pos) { - if (p_175629_1_ == LightType.SKY && this.world.dimension.hasNoLight()) + if (p_175629_1_ == LightType.SKY && !this.world.dimension.hasSkyLight()) { return 0; } diff --git a/client/src/main/java/client/renderer/RenderGlobal.java b/client/src/main/java/client/renderer/RenderGlobal.java index d3f0c5d5..d4ece181 100755 --- a/client/src/main/java/client/renderer/RenderGlobal.java +++ b/client/src/main/java/client/renderer/RenderGlobal.java @@ -1137,7 +1137,7 @@ public class RenderGlobal { this.renderSkyBox(this.gm.world.dimension.getSkyBoxTexture()); } - else if (this.gm.world.dimension.getType().sky) + else if (this.gm.world.dimension.hasSky()) { GlState.disableTexture2D(); Vec3 vec3 = this.theWorld.getSkyColor(this.gm.getRenderViewEntity(), partialTicks); @@ -1183,15 +1183,15 @@ public class RenderGlobal GlState.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); ItemRenderer.disableStandardItemLighting(); - float[] afloat = this.theWorld.dimension.getType().days && !this.theWorld.dimension.isBaseDestroyed() ? - RenderGlobal.calcSunriseSunsetColors(this.theWorld.getCelestialAngleRadians(partialTicks), partialTicks) : null; + float[] afloat = this.theWorld.dimension.hasDaylight() && !this.theWorld.dimension.isBaseDestroyed() ? + RenderGlobal.calcSunriseSunsetColors(this.theWorld.getDayPhase(partialTicks), partialTicks) : null; if (afloat != null) { GlState.disableTexture2D(); GlState.shadeModel(GL11.GL_SMOOTH); GL11.glPushMatrix(); GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(ExtMath.sin(this.theWorld.getCelestialAngleRadians(partialTicks)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(ExtMath.sin(this.theWorld.getDayPhase(partialTicks)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); float f6 = afloat[0]; float f7 = afloat[1]; @@ -1229,8 +1229,8 @@ public class RenderGlobal GL11.glPushMatrix(); float f16 = 1.0F - Math.max(this.theWorld.getRainStrength(), this.theWorld.getFogStrength()); GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(this.theWorld.getCelestialAngle(partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F); - if(this.gm.world.dimension.getType().celestials) { + GL11.glRotatef(this.theWorld.getCelestialAngle(partialTicks), 1.0F, 0.0F, 0.0F); + if(this.gm.world.dimension.getType() == DimType.PLANET || this.gm.world.dimension.getType() == DimType.MOON) { float size = 30.0F; int color = this.gm.world.dimension.getSunColor(); if(color != 0xffffffff) { diff --git a/client/src/main/java/client/world/ChunkClient.java b/client/src/main/java/client/world/ChunkClient.java index 3d0a34d5..8a7bb6c2 100644 --- a/client/src/main/java/client/world/ChunkClient.java +++ b/client/src/main/java/client/world/ChunkClient.java @@ -64,7 +64,7 @@ public class ChunkClient extends Chunk { public void setData(byte[] data, int[] extend, boolean biomes) { int pos = 0; - boolean sky = !this.world.dimension.hasNoLight(); + boolean sky = this.world.dimension.hasSkyLight(); if(biomes) { this.clearArrays(); diff --git a/client/src/main/java/client/world/WorldClient.java b/client/src/main/java/client/world/WorldClient.java index 34a43954..14d278fd 100755 --- a/client/src/main/java/client/world/WorldClient.java +++ b/client/src/main/java/client/world/WorldClient.java @@ -314,14 +314,15 @@ public class WorldClient extends AWorldClient State state = this.getState(pos); state.getBlock().randomDisplayTick(this, pos, state, rand); } -// if(this.canShowVoidParticles()) { - for(int n = 0; n < 1000; n++) { - float x = ((float)posX) + (rand.floatv() - rand.floatv() - 0.5f) * 32.0f; - float y = -64.0f + rand.floatv() * 65.0f; // * 68.0f; - float z = ((float)posZ) + (rand.floatv() - rand.floatv() - 0.5f) * 32.0f; - this.spawnParticle(ParticleType.DEPTH, (double)x, (double)y, (double)z); + if(this.dimension.hasVoidFog() && this.gm.voidParticles && posY < 32) { + for(int n = 0; n < 1000; n++) { + float x = ((float)posX) + (rand.floatv() - rand.floatv() - 0.5f) * 32.0f; + float y = (posY < -32 ? (float)posY - 32.0f : -64.0f) + rand.floatv() * 65.0f; + float z = ((float)posZ) + (rand.floatv() - rand.floatv() - 0.5f) * 32.0f; + if(y < -64.0f || rand.floatv() >= (64.0f + y) / 64.0f) + this.spawnParticle(ParticleType.DEPTH, (double)x, (double)y, (double)z); + } } -// } } public void removeAllEntities() @@ -695,7 +696,7 @@ public class WorldClient extends AWorldClient } public float getSunBrightness(float p_72971_1_) { - float f = this.getCelestialAngleRadians(p_72971_1_); + float f = this.getDayPhase(p_72971_1_); float f1 = 1.0F - (ExtMath.cos(f) * 2.0F + 0.2F); f1 = ExtMath.clampf(f1, 0.0F, 1.0F); f1 = 1.0F - f1; @@ -772,8 +773,8 @@ public class WorldClient extends AWorldClient vec = new Vec3(0x101010); else vec = new Vec3(this.dimension.getSkyColor()); - if(this.dimension.getType().days) { - float mult = ExtMath.clampf(ExtMath.cos(this.getCelestialAngleRadians(partial)) * 2.0F + 0.5F, + if(this.dimension.hasDaylight()) { + float mult = ExtMath.clampf(ExtMath.cos(this.getDayPhase(partial)) * 2.0F + 0.5F, 0.0F, 1.0F); if(this.dimension.getSkyColor() == 0xffffffff) { float temp = ExtMath.clampf(((biome.getTemperature(pos) + 14.0f) / 40.0f + 0.15f) / 3.0F, @@ -829,8 +830,6 @@ public class WorldClient extends AWorldClient public Vec3 getCloudColour(Entity entity, float partialTicks) { Vec3 color = new Vec3(this.dimension.getCloudColor()); - Biome biome = this.getBiomeGenForCoords(new BlockPos(ExtMath.floord(entity.posX), ExtMath.floord(entity.posY), - ExtMath.floord(entity.posZ))); if(this.dimension.isExterminated()) color = new Vec3(0x000000); float r = (float)color.xCoord; @@ -846,8 +845,8 @@ public class WorldClient extends AWorldClient b = b * shift + mul * (1.0F - shift); } - if(this.dimension.getType().days) { - float sun = ExtMath.clampf(ExtMath.cos(this.getCelestialAngleRadians(partialTicks)) * 2.0F + 0.5F, + if(this.dimension.hasDaylight()) { + float sun = ExtMath.clampf(ExtMath.cos(this.getDayPhase(partialTicks)) * 2.0F + 0.5F, 0.0F, 1.0F); r = r * (sun * 0.9F + 0.1F); g = g * (sun * 0.9F + 0.1F); @@ -873,42 +872,15 @@ public class WorldClient extends AWorldClient return new Vec3((double)r, (double)g, (double)b); } - public Vec3 getFogColor(Entity entity, float partialTicks) { - Vec3 color = new Vec3(this.dimension.getFogColor()); - Biome biome = this.getBiomeGenForCoords(new BlockPos(ExtMath.floord(entity.posX), ExtMath.floord(entity.posY), - ExtMath.floord(entity.posZ))); - if(this.dimension.isExterminated()) - color = new Vec3(0x303030); - if(!this.dimension.getType().days) - return color; - float sun = ExtMath.clampf(ExtMath.cos(this.getCelestialAngleRadians(partialTicks)) * 2.0F + 0.5F, - 0.0F, 1.0F); - float r = (float)color.xCoord; - float g = (float)color.yCoord; - float b = (float)color.zCoord; - r = r * (sun * 0.94F + 0.06F); - g = g * (sun * 0.94F + 0.06F); - b = b * (sun * 0.91F + 0.09F); - - float space = this.getSpaceFactor(); - if(space > 0.0f) { - r = r * (1.0F - space); - g = g * (1.0F - space); - b = b * (1.0F - space); - } - - return new Vec3((double)r, (double)g, (double)b); - } - public float getStarBrightness(float partialTicks) { - float f = this.getCelestialAngleRadians(partialTicks); + float f = this.getDayPhase(partialTicks); float f1 = 1.0F - (ExtMath.cos(f) * 2.0F + 0.25F); f1 = ExtMath.clampf(f1, 0.0F, 1.0F); return Math.max(f1 * f1 * this.dimension.getStarBrightness(), this.getSpaceFactor()); } public float getDeepStarBrightness(float partialTicks) { - float f = this.getCelestialAngleRadians(partialTicks); + float f = this.getDayPhase(partialTicks); float f1 = 1.0F - (ExtMath.cos(f) * 2.0F + 0.25F); f1 = ExtMath.clampf(f1, 0.0F, 1.0F); return Math.max(f1 * f1 * this.dimension.getDeepStarBrightness(), this.getSpaceFactor()); diff --git a/client/src/main/resources/textures/blocks/plasma_flow.png b/client/src/main/resources/textures/blocks/plasma_flow.png new file mode 100755 index 0000000000000000000000000000000000000000..c4cbea337e47134fcf19603642f2a5493295c9e5 GIT binary patch literal 58849 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%0A7~rh&T|%|I@+-G1 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

5WerfF=D~U0}DFB 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 P00000NkvXXu0mjfeHk23 literal 0 HcmV?d00001 diff --git a/client/src/main/resources/textures/blocks/plasma_still.png b/client/src/main/resources/textures/blocks/plasma_still.png new file mode 100755 index 0000000000000000000000000000000000000000..fc260d5d388f6827802c2f3ca0194f77023be032 GIT binary patch literal 21395 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 iw%=J3ghJ|1@c#kQ*>z4C_x{HK0000 LOOKUP = Maps.newHashMap(); private final String name; - public final boolean celestial; - public final boolean days; - public final boolean weather; - public final boolean celestials; - public final boolean clouds; - public final boolean sky; - private DimType(String name, boolean time, boolean days, boolean weather, boolean celestials, boolean clouds, boolean sky) { + private DimType(String name) { this.name = name; - this.celestial = time; - this.days = days; - this.weather = weather; - this.celestials = celestials; - this.clouds = clouds; - this.sky = sky; } public String getName() { diff --git a/common/src/main/java/common/dimension/Dimension.java b/common/src/main/java/common/dimension/Dimension.java index 0f20299f..1ffd79d7 100755 --- a/common/src/main/java/common/dimension/Dimension.java +++ b/common/src/main/java/common/dimension/Dimension.java @@ -20,7 +20,7 @@ import common.world.State; import common.world.Weather; import common.world.World; -public abstract class Dimension extends Nameable { +public abstract class Dimension extends Section { public class GeneratorSettings { public float coordinateScale = 684.412F; public float heightScale = 684.412F; @@ -779,6 +779,35 @@ public abstract class Dimension extends Nameable { public boolean isBaseDestroyed() { return false; } + + public boolean hasVoidFog() { + return false; + } + + public boolean hasSeasons() { + return false; + } + + public boolean hasDaylight() { + return false; + } + + public boolean hasSkyLight() { + return false; + } + + public boolean isCelestial() { + return false; + } + + public boolean hasWeather() { + return false; + } + + public boolean hasSky() { + return true; + } + public final int getSunColor() { return this.sunColor != 0xffffffff ? this.sunColor : this.calcSunColor(); @@ -857,10 +886,6 @@ public abstract class Dimension extends Nameable { return this.populated; } - - public final boolean hasNoLight() { - return !this.getType().days; - } public final void setBaseNames(String[] names) { this.baseNames = names; @@ -869,6 +894,8 @@ public abstract class Dimension extends Nameable { public final String[] getBaseNames() { if(this.baseNames != null) return this.baseNames; + if(this == Space.INSTANCE) + return new String[0]; String planet = null; String star = null; Dimension dim = this; @@ -898,7 +925,7 @@ public abstract class Dimension extends Nameable { public static Dimension create(DimType type) { - if(type == null || type == DimType.SPACE) + if(type == null) return null; switch(type) { case STAR: @@ -916,6 +943,8 @@ public abstract class Dimension extends Nameable { } public final Dimension makeCustomCopy() { + if(this == Space.INSTANCE) + return null; Dimension dim = create(this.getType()); TagObject tag = new TagObject(); this.toTags(tag); @@ -938,7 +967,7 @@ public abstract class Dimension extends Nameable { tag.setBool("Exterminated", this.exterminated); if(this.isCustom()) this.toTags(tag); - if(!this.exterminated && this.getType().weather) + if(!this.exterminated && this.hasWeather()) tag.setString("Weather", this.weather.getName()); return tag; } @@ -962,7 +991,7 @@ public abstract class Dimension extends Nameable { if(this.exterminated) { this.weather = Weather.CLEAR; } - else if(this.getType().weather) { + else if(this.hasWeather()) { this.weather = Weather.getByName(tag.getString("Weather")); if(this.weather == null) this.weather = this.defaultWeather; diff --git a/common/src/main/java/common/dimension/Domain.java b/common/src/main/java/common/dimension/Domain.java index c4ca8bdd..471afb11 100755 --- a/common/src/main/java/common/dimension/Domain.java +++ b/common/src/main/java/common/dimension/Domain.java @@ -1,14 +1,7 @@ package common.dimension; -public final class Domain extends Nameable implements Comparable { - public final String id; - - public Domain(String id, boolean custom) { +public final class Domain extends Section { + public Domain(boolean custom) { super(custom); - this.id = id; - } - - public int compareTo(Domain other) { - return other == null ? -1 : this.id.compareTo(other.id); } } diff --git a/common/src/main/java/common/dimension/Galaxy.java b/common/src/main/java/common/dimension/Galaxy.java index 812e9e13..69ee9dc8 100755 --- a/common/src/main/java/common/dimension/Galaxy.java +++ b/common/src/main/java/common/dimension/Galaxy.java @@ -1,14 +1,7 @@ package common.dimension; -public final class Galaxy extends Nameable implements Comparable { - public final String id; - - public Galaxy(String id, boolean custom) { +public final class Galaxy extends Section { + public Galaxy(boolean custom) { super(custom); - this.id = id; - } - - public int compareTo(Galaxy other) { - return other == null ? -1 : this.id.compareTo(other.id); } } diff --git a/common/src/main/java/common/dimension/Moon.java b/common/src/main/java/common/dimension/Moon.java index 3f1d5d0d..a7918e81 100755 --- a/common/src/main/java/common/dimension/Moon.java +++ b/common/src/main/java/common/dimension/Moon.java @@ -51,4 +51,12 @@ public final class Moon extends Dimension { public boolean isBaseDestroyed() { return (this.getSunColor() & 0xff000000) != 0; } + + public boolean hasVoidFog() { + return true; + } + + public boolean isCelestial() { + return true; + } } diff --git a/common/src/main/java/common/dimension/Planet.java b/common/src/main/java/common/dimension/Planet.java index dd584d6a..aa763c29 100755 --- a/common/src/main/java/common/dimension/Planet.java +++ b/common/src/main/java/common/dimension/Planet.java @@ -64,4 +64,28 @@ public final class Planet extends Dimension { public boolean isBaseDestroyed() { return (this.getSunColor() & 0xff000000) != 0; } + + public boolean hasVoidFog() { + return true; + } + + public boolean hasSeasons() { + return this.getOrbitOffset() != 0.0f; + } + + public boolean hasDaylight() { + return true; + } + + public boolean hasSkyLight() { + return true; + } + + public boolean isCelestial() { + return true; + } + + public boolean hasWeather() { + return true; + } } diff --git a/common/src/main/java/common/dimension/Nameable.java b/common/src/main/java/common/dimension/Section.java similarity index 81% rename from common/src/main/java/common/dimension/Nameable.java rename to common/src/main/java/common/dimension/Section.java index e1893f60..25b4f32f 100755 --- a/common/src/main/java/common/dimension/Nameable.java +++ b/common/src/main/java/common/dimension/Section.java @@ -1,11 +1,11 @@ package common.dimension; -public abstract class Nameable { +public abstract class Section { private final boolean custom; private String display = null; - protected Nameable(boolean custom) { + protected Section(boolean custom) { this.custom = custom; } diff --git a/common/src/main/java/common/dimension/Sector.java b/common/src/main/java/common/dimension/Sector.java index 045edde4..ceca69cc 100755 --- a/common/src/main/java/common/dimension/Sector.java +++ b/common/src/main/java/common/dimension/Sector.java @@ -1,14 +1,7 @@ package common.dimension; -public final class Sector extends Nameable implements Comparable { - public final String id; - - public Sector(String id, boolean custom) { +public final class Sector extends Section { + public Sector(boolean custom) { super(custom); - this.id = id; - } - - public int compareTo(Sector other) { - return other == null ? -1 : this.id.compareTo(other.id); } } diff --git a/common/src/main/java/common/dimension/Semi.java b/common/src/main/java/common/dimension/Semi.java index 9d91441f..b1595078 100755 --- a/common/src/main/java/common/dimension/Semi.java +++ b/common/src/main/java/common/dimension/Semi.java @@ -19,4 +19,12 @@ public final class Semi extends Dimension { public final DimType getType() { return DimType.SEMI; } + + public boolean hasVoidFog() { + return true; + } + + public boolean hasWeather() { + return true; + } } diff --git a/common/src/main/java/common/dimension/Space.java b/common/src/main/java/common/dimension/Space.java index 819bd030..9656d671 100755 --- a/common/src/main/java/common/dimension/Space.java +++ b/common/src/main/java/common/dimension/Space.java @@ -13,134 +13,6 @@ public final class Space extends Dimension { } public final DimType getType() { - return DimType.SPACE; + return null; } - -// public String getDimensionName() { -// return "space"; -// } -// -// public int getDimensionId() { -// return Constants.SPACE_WORLD; -// } - -// public Biome getBiome() { -// return Biome.space; -// } -// -// public final float getGravity() { -// return 0.0f; -// } -// -// public IBlockState getCaveFiller() { -// return Blocks.air.getDefaultState(); -// } -// -// public IBlockState getFiller() { -// return Blocks.air.getDefaultState(); -// } -// -// public IBlockState getTop() { -// return Blocks.air.getDefaultState(); -// } -// -// public IBlockState getSurface() { -// return Blocks.air.getDefaultState(); -// } -// -// public IBlockState getAltFiller() { -// return Blocks.air.getDefaultState(); -// } -// -// public IBlockState getLavaFiller() { -// return null; -// } -// -// public boolean hasRavines() { -// return false; -// } - -// public ChunkGenerator createChunkGenerator(Random rand) { -// return new GeneratorFlat(new IBlockState[0]); -// } -// -// public BlockReplacer createBlockReplacer(Random rand) { -// return null; -// } - -// public int getBrightness() { -// return 15; -// } -// -// public final int getSkyColor() { -// return 0x000000; -// } -// -// public IBlockState getWorldFloor() { -// return null; -// } -// -// public final boolean hasSnow() { -// return false; -// } -// -// public final boolean hasCaves() { -// return false; -// } - -// public final float getCloudHeight(float height) { -// return height; -// } - -// public float getStarBrightness() { -// return 1.0f; -// } -// -// public float getDeepStarBrightness() { -// return 1.0f; -// } -// -// public float getLavaChance() { -// return 0.0f; -// } -// -// public float getWaterChance() { -// return 0.0f; -// } -// -// public boolean hasDungeons() { -// return false; -// } -// -// public IBlockState getSurfaceLiquid() { -// return Blocks.air.getDefaultState(); -// } -// -// public int getSeaLevel() { -// return 0; -// } -// -// public final int getTimeQualifier() { -// return 8; -// } -// -// public final long getOrbitalPeriod() { -// return 1L; -// } -// -// public final long getRotationalPeriod() { -// return 1L; -// } -// -// public final float getOrbitOffset() { -// return 0.0f; -// } -// -// public final int getLevelBelow() { -// return this.getDimensionId(); -// } -// -// public float getTemperature() { -// return 2.7f; -// } } diff --git a/common/src/main/java/common/dimension/Star.java b/common/src/main/java/common/dimension/Star.java index 2eda0035..b788dc82 100755 --- a/common/src/main/java/common/dimension/Star.java +++ b/common/src/main/java/common/dimension/Star.java @@ -22,4 +22,8 @@ public final class Star extends Dimension { public final DimType getType() { return DimType.STAR; } + + public boolean isCelestial() { + return true; + } } diff --git a/common/src/main/java/common/entity/Entity.java b/common/src/main/java/common/entity/Entity.java index 0c78c2c8..c062bcb4 100755 --- a/common/src/main/java/common/entity/Entity.java +++ b/common/src/main/java/common/entity/Entity.java @@ -12,6 +12,7 @@ import common.block.liquid.BlockLiquid; import common.color.TextColor; import common.dimension.DimType; import common.dimension.Dimension; +import common.dimension.Space; import common.enchantment.Enchantment; import common.enchantment.EnchantmentHelper; import common.entity.effect.EntityLightning; @@ -356,7 +357,7 @@ public abstract class Entity } protected void onVoidUpdate() { - if(!this.worldObj.client && this.worldObj.dimension.getType() != DimType.SPACE) { + if(!this.worldObj.client && this.worldObj.dimension != Space.INSTANCE) { // this.worldObj.profiler.start("descent"); Dimension current = this.worldObj.dimension; Dimension dim = Vars.voidPortal ? ((AWorldServer)this.worldObj).getPortalDest(PortalType.VOID) : current; diff --git a/common/src/main/java/common/entity/npc/EntitySlime.java b/common/src/main/java/common/entity/npc/EntitySlime.java index 5c3c997e..9fead9ce 100755 --- a/common/src/main/java/common/entity/npc/EntitySlime.java +++ b/common/src/main/java/common/entity/npc/EntitySlime.java @@ -385,7 +385,7 @@ public class EntitySlime extends EntityNPC // { Biome biomegenbase = this.worldObj.getBiomeGenForCoords(blockpos); - if (biomegenbase == Biome.SWAMPLAND && this.posY > 50.0D && this.posY < 70.0D && this.rand.floatv() < 0.5F && this.rand.floatv() < this.worldObj.getCurrentMoonPhaseFactor() && this.worldObj.getLightFromNeighbors(new BlockPos(this)) <= this.rand.zrange(8)) + if (biomegenbase == Biome.SWAMPLAND && this.posY > 50.0D && this.posY < 70.0D && this.rand.floatv() < 0.5F && this.rand.floatv() < this.worldObj.getMoonPhase() && this.worldObj.getLightFromNeighbors(new BlockPos(this)) <= this.rand.zrange(8)) { return super.getCanSpawnHere(); } diff --git a/common/src/main/java/common/init/UniverseRegistry.java b/common/src/main/java/common/init/UniverseRegistry.java index 22e0f5b0..226474cf 100755 --- a/common/src/main/java/common/init/UniverseRegistry.java +++ b/common/src/main/java/common/init/UniverseRegistry.java @@ -15,94 +15,114 @@ import common.dimension.Dimension; import common.dimension.Domain; import common.dimension.Galaxy; import common.dimension.Moon; +import common.dimension.Section; import common.dimension.Planet; import common.dimension.Sector; import common.dimension.Semi; import common.dimension.Space; import common.dimension.Star; import common.world.Weather; -import common.world.World; - import java.util.Set; public abstract class UniverseRegistry { + private static final List

SECTIONS = Lists.newArrayList(); private static final List DIMENSIONS = Lists.newArrayList(); private static final Map ID_MAP = Maps.newTreeMap(); private static final Map IDS = new IdentityHashMap(); - private static final Map NAME_MAP = Maps.newTreeMap(); - private static final Map NAMES = new IdentityHashMap(); + private static final Map NAME_MAP = Maps.newTreeMap(); + private static final Map NAMES = new IdentityHashMap(); private static final Set NAME_LIST = Sets.newTreeSet(); - private static final Map SECTORS = Maps.newHashMap(); - private static final Map GALAXIES = Maps.newHashMap(); - private static final Map DOMAINS = Maps.newHashMap(); - - private static final Map MOON_MAP = Maps.newHashMap(); - private static final Map> MOONS_MAP = Maps.newHashMap(); - private static final Map PLANET_MAP = Maps.newHashMap(); - private static final Map> PLANETS_MAP = Maps.newHashMap(); - private static final Map STAR_MAP = Maps.newHashMap(); - private static final Map> STARS_MAP = Maps.newHashMap(); - private static final Map SECTOR_MAP = Maps.newHashMap(); - private static final Map> SECTORS_MAP = Maps.newHashMap(); - private static final Map AREA_MAP = Maps.newHashMap(); - private static final Map> AREAS_MAP = Maps.newHashMap(); - private static final Set SEMI_SET = Sets.newHashSet(); + private static final Map MOON_PLANET = Maps.newHashMap(); + private static final Map> PLANET_MOONS = Maps.newHashMap(); + private static final Map PLANET_STAR = Maps.newHashMap(); + private static final Map> STAR_PLANETS = Maps.newHashMap(); + private static final Map STAR_SECTOR = Maps.newHashMap(); + private static final Map> SECTOR_STARS = Maps.newHashMap(); + private static final Map SECTOR_GALAXY = Maps.newHashMap(); + private static final Map> GALAXY_SECTORS = Maps.newHashMap(); + private static final Map AREA_DOMAIN = Maps.newHashMap(); + private static final Map> DOMAIN_AREAS = Maps.newHashMap(); + private static final Set SEMI = Sets.newHashSet(); public static List getDimensions() { return DIMENSIONS; } + public static List
getSections() { + return SECTIONS; + } + public static Collection getGalaxies() { - return GALAXIES.values(); + return GALAXY_SECTORS.keySet(); } public static Collection getSectors() { - return SECTORS.values(); + return SECTOR_GALAXY.keySet(); } public static Collection getDomains() { - return DOMAINS.values(); + return DOMAIN_AREAS.keySet(); } public static Collection getStars() { - return STAR_MAP.keySet(); + return STAR_SECTOR.keySet(); } public static Collection getPlanets() { - return PLANET_MAP.keySet(); + return PLANET_STAR.keySet(); } public static Collection getMoons() { - return MOON_MAP.keySet(); + return MOON_PLANET.keySet(); } public static Collection getAreas() { - return AREA_MAP.keySet(); + return AREA_DOMAIN.keySet(); } public static Collection getSemis() { - return SEMI_SET; + return SEMI; } public static List getSectors(Galaxy galaxy) { - return SECTORS_MAP.get(galaxy); + return GALAXY_SECTORS.get(galaxy); } public static List getStars(Sector sector) { - return STARS_MAP.get(sector); + return SECTOR_STARS.get(sector); } public static List getPlanets(Star star) { - return PLANETS_MAP.get(star); + return STAR_PLANETS.get(star); } public static List getMoons(Planet planet) { - return MOONS_MAP.get(planet); + return PLANET_MOONS.get(planet); } public static List getAreas(Domain domain) { - return AREAS_MAP.get(domain); + return DOMAIN_AREAS.get(domain); + } + + public static Star getStar(Planet planet) { + return PLANET_STAR.get(planet); + } + + public static Planet getPlanet(Moon moon) { + return MOON_PLANET.get(moon); + } + + public static Sector getSector(Star star) { + return STAR_SECTOR.get(star); + } + + public static Galaxy getGalaxy(Sector sector) { + return SECTOR_GALAXY.get(sector); + } + + public static Domain getDomain(Area area) { + return AREA_DOMAIN.get(area); } public static Dimension getDimension(int dim) { @@ -116,31 +136,15 @@ public abstract class UniverseRegistry { return id == null ? -1 : id; } - public static String getName(Dimension dim) { + public static String getName(Section dim) { return dim == null ? null : NAMES.get(dim); } - public static Star getStar(Planet planet) { - return PLANET_MAP.get(planet); - } - - public static Planet getPlanet(Moon moon) { - return MOON_MAP.get(moon); - } - - public static Sector getSector(Star star) { - return STAR_MAP.get(star); - } - - public static Galaxy getGalaxy(Sector sector) { - return SECTOR_MAP.get(sector); - } - - public static Domain getDomain(Area area) { - return AREA_MAP.get(area); - } - public static Dimension getDimension(String name) { + return NAME_MAP.get(name) instanceof Dimension dim ? dim : null; + } + + public static Section getSection(String name) { return NAME_MAP.get(name); } @@ -149,50 +153,71 @@ public abstract class UniverseRegistry { } public static boolean isRegistered(String name) { - return GALAXIES.containsKey(name) || SECTORS.containsKey(name) || DOMAINS.containsKey(name) || NAME_MAP.containsKey(name); + return NAME_MAP.containsKey(name); } public static boolean isType(String name, DimType type) { - return NAME_MAP.containsKey(name) && NAME_MAP.get(name).getType() == type; + return NAME_MAP.containsKey(name) && NAME_MAP.get(name) instanceof Dimension dim && dim.getType() == type; } public static Galaxy registerCustomGalaxy(String name, String display) { - return registerGalaxyInt(name, display, true); + Galaxy galaxy = new Galaxy(true); + registerGalaxyInt(name, display, galaxy); + return galaxy; } public static Sector registerCustomSector(String name, String display, String galaxy) { - return registerSectorInt(name, display, galaxy, true); + Section base = NAME_MAP.get(galaxy); + if(!(base instanceof Galaxy baseGalaxy)) + throw new IllegalArgumentException("Galaxie " + galaxy + " existiert nicht"); + Sector sector = new Sector(true); + registerSectorInt(name, display, sector, baseGalaxy); + return sector; } public static Domain registerCustomDomain(String name, String display) { - return registerDomainInt(name, display, true); + Domain domain = new Domain(true); + registerDomainInt(name, display, domain); + return domain; } public static Star registerCustomStar(String name, String display, Star dim, String sector) { + Section base = NAME_MAP.get(sector); + if(!(base instanceof Sector baseSector)) + throw new IllegalArgumentException("Sektor " + sector + " existiert nicht"); if(!dim.isCustom()) dim = (Star)dim.makeCustomCopy(); - registerStarInt(name, display, dim, sector); + registerStarInt(name, display, dim, baseSector); return dim; } public static Planet registerCustomPlanet(String name, String display, Planet dim, String star) { + Section base = NAME_MAP.get(star); + if(!(base instanceof Star baseStar)) + throw new IllegalArgumentException("Stern " + star + " existiert nicht"); if(!dim.isCustom()) dim = (Planet)dim.makeCustomCopy(); - registerPlanetInt(name, display, dim, star); + registerPlanetInt(name, display, dim, baseStar); return dim; } public static Moon registerCustomMoon(String name, String display, Moon dim, String planet) { + Section base = NAME_MAP.get(planet); + if(!(base instanceof Planet basePlanet)) + throw new IllegalArgumentException("Planet " + planet + " existiert nicht"); if(!dim.isCustom()) dim = (Moon)dim.makeCustomCopy(); - registerMoonInt(name, display, dim, planet); + registerMoonInt(name, display, dim, basePlanet); return dim; } public static Area registerCustomArea(String name, String display, Area dim, String domain) { + Section base = NAME_MAP.get(domain); + if(!(base instanceof Domain baseDomain)) + throw new IllegalArgumentException("Bereich " + domain + " existiert nicht"); if(!dim.isCustom()) dim = (Area)dim.makeCustomCopy(); - registerAreaInt(name, display, dim, domain); + registerAreaInt(name, display, dim, baseDomain); return dim; } @@ -202,158 +227,126 @@ public abstract class UniverseRegistry { registerSemiInt(name, display, dim); return dim; } - - private static void checkRegistered(String name) { - if(isRegistered(name)) + + + private static void register(String name, String display, Section obj) { + if(NAME_MAP.containsKey(name)) throw new IllegalArgumentException("Objekt " + name + " ist bereits registriert"); - } - - private static Galaxy registerGalaxyInt(String name, String display, boolean custom) { - checkRegistered(name); - Galaxy galaxy = new Galaxy(name, custom); - galaxy.setDisplay(display); - GALAXIES.put(name, galaxy); - SECTORS_MAP.put(galaxy, Lists.newArrayList()); - return galaxy; + obj.setDisplay(display); + NAME_MAP.put(name, obj); + NAMES.put(obj, name); + SECTIONS.add(obj); + if(obj instanceof Dimension dim) { + NAME_LIST.add(name); + ID_MAP.put(DIMENSIONS.size(), dim); + IDS.put(dim, DIMENSIONS.size()); + DIMENSIONS.add(dim); + } } - private static Sector registerSectorInt(String name, String display, String galaxy, boolean custom) { - checkRegistered(name); - Galaxy base = GALAXIES.get(galaxy); - if(base == null) - throw new IllegalArgumentException("Galaxie " + galaxy + " existiert nicht"); - Sector sector = new Sector(name, custom); - sector.setDisplay(display); - SECTORS.put(name, sector); - SECTOR_MAP.put(sector, base); - STARS_MAP.put(sector, Lists.newArrayList()); - SECTORS_MAP.get(base).add(sector); - return sector; + private static void registerGalaxyInt(String name, String display, Galaxy galaxy) { + register(name, display, galaxy); + GALAXY_SECTORS.put(galaxy, Lists.newArrayList()); } - private static Domain registerDomainInt(String name, String display, boolean custom) { - checkRegistered(name); - Domain domain = new Domain(name, custom); - domain.setDisplay(display); - DOMAINS.put(name, domain); - AREAS_MAP.put(domain, Lists.newArrayList()); - return domain; + private static void registerSectorInt(String name, String display, Sector sector, Galaxy galaxy) { + register(name, display, sector); + SECTOR_GALAXY.put(sector, galaxy); + SECTOR_STARS.put(sector, Lists.newArrayList()); + GALAXY_SECTORS.get(galaxy).add(sector); } - private static void registerDimension(String name, String display, Dimension dim) { - checkRegistered(name); - dim.setDisplay(display); - NAME_MAP.put(name, dim); - NAMES.put(dim, name); - NAME_LIST.add(name); - ID_MAP.put(DIMENSIONS.size(), dim); - IDS.put(dim, DIMENSIONS.size()); - DIMENSIONS.add(dim); + private static void registerDomainInt(String name, String display, Domain domain) { + register(name, display, domain); + DOMAIN_AREAS.put(domain, Lists.newArrayList()); } - private static void registerStarInt(String name, String display, Dimension dim, String sector) { - Sector base = SECTORS.get(sector); - if(base == null) - throw new IllegalArgumentException("Sektor " + sector + " existiert nicht"); - registerDimension(name, display, dim); - STAR_MAP.put((Star)dim, base); - PLANETS_MAP.put((Star)dim, Lists.newArrayList()); - STARS_MAP.get(base).add((Star)dim); + private static void registerStarInt(String name, String display, Star star, Sector sector) { + register(name, display, star); + STAR_SECTOR.put(star, sector); + STAR_PLANETS.put(star, Lists.newArrayList()); + SECTOR_STARS.get(sector).add(star); } - private static void registerPlanetInt(String name, String display, Dimension dim, String star) { - Dimension base = NAME_MAP.get(star); - if(base == null || base.getType() != DimType.STAR) - throw new IllegalArgumentException("Stern " + star + " existiert nicht"); - registerDimension(name, display, dim); - PLANET_MAP.put((Planet)dim, ((Star)base)); - MOONS_MAP.put((Planet)dim, Lists.newArrayList()); - PLANETS_MAP.get((Star)base).add((Planet)dim); + private static void registerPlanetInt(String name, String display, Planet planet, Star star) { + register(name, display, planet); + PLANET_STAR.put(planet, star); + PLANET_MOONS.put(planet, Lists.newArrayList()); + STAR_PLANETS.get(star).add(planet); } - private static void registerMoonInt(String name, String display, Dimension dim, String planet) { - Dimension base = NAME_MAP.get(planet); - if(base == null || base.getType() != DimType.PLANET) - throw new IllegalArgumentException("Planet " + planet + " existiert nicht"); - registerDimension(name, display, dim); - MOON_MAP.put((Moon)dim, ((Planet)base)); - MOONS_MAP.get((Planet)base).add((Moon)dim); + private static void registerMoonInt(String name, String display, Moon moon, Planet planet) { + register(name, display, moon); + MOON_PLANET.put(moon, planet); + PLANET_MOONS.get(planet).add(moon); } - private static void registerAreaInt(String name, String display, Dimension dim, String domain) { - Domain base = DOMAINS.get(domain); - if(base == null) - throw new IllegalArgumentException("Bereich " + domain + " existiert nicht"); - registerDimension(name, display, dim); - AREA_MAP.put((Area)dim, base); - AREAS_MAP.get(base).add((Area)dim); + private static void registerAreaInt(String name, String display, Area area, Domain domain) { + register(name, display, area); + AREA_DOMAIN.put(area, domain); + DOMAIN_AREAS.get(domain).add(area); } - private static void registerSemiInt(String name, String display, Dimension dim) { - registerDimension(name, display, dim); - SEMI_SET.add((Semi)dim); + private static void registerSemiInt(String name, String display, Semi semi) { + register(name, display, semi); + SEMI.add(semi); } - private static String lastGalaxy; - private static String lastSector; - private static String lastDomain; - private static String lastStar; - private static String lastPlanet; + private static Galaxy lastGalaxy; + private static Sector lastSector; + private static Domain lastDomain; + private static Star lastStar; + private static Planet lastPlanet; private static String fromDisplay(String display) { return display.toLowerCase().replace("'", "").replace(' ', '_'); } private static void registerGalaxy(String name, String display, Runnable sub) { - registerGalaxyInt(name, display, false); - lastGalaxy = name; + registerGalaxyInt(name, display, lastGalaxy = new Galaxy(false)); sub.run(); lastGalaxy = null; } private static void registerSector(String name, String display, Runnable sub) { - registerSectorInt(name, display, lastGalaxy, false); - lastSector = name; + registerSectorInt(name, display, lastSector = new Sector(false), lastGalaxy); sub.run(); lastSector = null; } private static void registerDomain(String name, String display, Runnable sub) { - registerDomainInt(name, display, false); - lastDomain = name; + registerDomainInt(name, display, lastDomain = new Domain(false)); sub.run(); lastDomain = null; } private static void registerStar(String name, String display, Dimension dim, Runnable sub) { - registerStarInt(name, display, dim, lastSector); - lastStar = name; + registerStarInt(name, display, lastStar = (Star)dim, lastSector); sub.run(); lastStar = null; } private static void registerPlanet(String name, String display, Dimension dim) { - registerPlanetInt(name, display, dim, lastStar); + registerPlanetInt(name, display, (Planet)dim, lastStar); } private static void registerPlanet(String name, String display, Dimension dim, Runnable sub) { - registerPlanet(name, display, dim); - lastPlanet = name; + registerPlanetInt(name, display, lastPlanet = (Planet)dim, lastStar); sub.run(); lastPlanet = null; } private static void registerMoon(String name, String display, Dimension dim) { - registerMoonInt(name, display, dim, lastPlanet); + registerMoonInt(name, display, (Moon)dim, lastPlanet); } private static void registerArea(String name, String display, Dimension dim) { - registerAreaInt(name, display, dim, lastDomain); + registerAreaInt(name, display, (Area)dim, lastDomain); } private static void registerSemi(String name, String display, Dimension dim) { - registerSemiInt(name, display, dim); + registerSemiInt(name, display, (Semi)dim); } private static void registerGalaxy(String display, Runnable sub) { @@ -405,7 +398,7 @@ public abstract class UniverseRegistry { } public static void register() { - registerDimension("space", "Der Weltraum", Space.INSTANCE); + register("space", "Der Weltraum", Space.INSTANCE); registerGalaxy("milkyway", "Galaxie Milchstraße", () -> { registerSector("Solar", () -> { diff --git a/common/src/main/java/common/item/tool/ItemSpaceNavigator.java b/common/src/main/java/common/item/tool/ItemSpaceNavigator.java index 6f657879..cc74ea6f 100755 --- a/common/src/main/java/common/item/tool/ItemSpaceNavigator.java +++ b/common/src/main/java/common/item/tool/ItemSpaceNavigator.java @@ -16,13 +16,13 @@ public class ItemSpaceNavigator extends ItemMagnetic { public String getHotbarText(EntityNPC player, ItemStack stack) { BlockPos pos = player.getPosition(); - return TextColor.ORANGE + player.worldObj.formatImperialTime(player, false) + " / " + + return TextColor.ORANGE + player.worldObj.formatTime(player, false) + " / " + String.format("%s bei %d, %d, %d", player.worldObj.dimension.getDisplay() + TextColor.ORANGE, pos.getX(), pos.getY(), pos.getZ()); } public void addInformation(ItemStack stack, EntityNPC player, List tooltip) { - tooltip.add(TextColor.ORANGE + player.worldObj.formatImperialTime(player, true)); + tooltip.add(TextColor.ORANGE + player.worldObj.formatTime(player, true)); String[] dims = player.worldObj.dimension.getBaseNames(); for(int z = dims.length - 1; z >= 0; z--) { tooltip.add(TextColor.ORANGE + dims[z]); diff --git a/common/src/main/java/common/item/tool/ItemWeatherToken.java b/common/src/main/java/common/item/tool/ItemWeatherToken.java index ed145aeb..beefc9cc 100755 --- a/common/src/main/java/common/item/tool/ItemWeatherToken.java +++ b/common/src/main/java/common/item/tool/ItemWeatherToken.java @@ -21,7 +21,7 @@ public class ItemWeatherToken extends ItemMagnetic { public ItemStack onItemRightClick(ItemStack itemStackIn, World worldIn, EntityNPC playerIn) { - if(worldIn.dimension.getType().weather) { + if(worldIn.dimension.hasWeather()) { // if (!playerIn.creative) itemStackIn.decrSize(); worldIn.playSoundAtEntity(playerIn, SoundEvent.SPELL, 0.5F); diff --git a/common/src/main/java/common/packet/SPacketRespawn.java b/common/src/main/java/common/packet/SPacketRespawn.java index 950496c4..94ec72dc 100755 --- a/common/src/main/java/common/packet/SPacketRespawn.java +++ b/common/src/main/java/common/packet/SPacketRespawn.java @@ -32,7 +32,7 @@ public class SPacketRespawn implements Packet { else { this.dimType = dim.getType(); this.dimData = dim.writeData(); - if(this.dimType.celestials) { + if(this.dimType == DimType.PLANET || this.dimType == DimType.MOON) { this.sunColor = dim.getSunColor(); this.moonColors = dim.getMoonColors(); } @@ -57,9 +57,9 @@ public class SPacketRespawn implements Packet { public void readPacketData(PacketBuffer buf) throws IOException { this.dimId = buf.readVarInt(); if(this.dimId >= -1) { - this.dimType = buf.readEnumValue(DimType.class); + this.dimType = buf.readEnumOrNull(DimType.class); this.dimData = buf.readTag(); - if(this.dimType.celestials) { + if(this.dimType == DimType.PLANET || this.dimType == DimType.MOON) { this.sunColor = buf.readInt(); this.moonColors = new int[buf.readVarInt()]; for(int z = 0; z < this.moonColors.length; z++) { @@ -82,9 +82,9 @@ public class SPacketRespawn implements Packet { public void writePacketData(PacketBuffer buf) throws IOException { buf.writeVarInt(this.dimId); if(this.dimId >= -1) { - buf.writeEnumValue(this.dimType); + buf.writeEnumOrNull(this.dimType); buf.writeTag(this.dimData); - if(this.dimType.celestials) { + if(this.dimType == DimType.PLANET || this.dimType == DimType.MOON) { buf.writeInt(this.sunColor); buf.writeVarInt(this.moonColors.length); for(int z = 0; z < this.moonColors.length; z++) { @@ -109,7 +109,7 @@ public class SPacketRespawn implements Packet { return null; Dimension dim = this.dimId >= 0 ? UniverseRegistry.getDimension(this.dimId) : Dimension.create(this.dimType); dim.readData(this.dimData); - if(this.dimType.celestials) { + if(this.dimType == DimType.PLANET || this.dimType == DimType.MOON) { dim.setSunColor(this.sunColor); dim.setMoonColors(this.moonColors); } diff --git a/common/src/main/java/common/world/Chunk.java b/common/src/main/java/common/world/Chunk.java index 153de731..f17fbc74 100755 --- a/common/src/main/java/common/world/Chunk.java +++ b/common/src/main/java/common/world/Chunk.java @@ -103,7 +103,7 @@ public abstract class Chunk { } } - if(!this.world.dimension.hasNoLight() && top != Integer.MIN_VALUE) { + if(this.world.dimension.hasSkyLight() && top != Integer.MIN_VALUE) { int l = 15; int y = top + 16 - 1; @@ -216,7 +216,7 @@ public abstract class Chunk { int cx = this.xPos * 16 + x; int cz = this.zPos * 16 + z; - if(!this.world.dimension.hasNoLight()) { + if(this.world.dimension.hasSkyLight()) { if(cy < h) { for(int n = cy; n < h; ++n) { BlockArray stor = this.getArray(n >> 4); @@ -275,7 +275,7 @@ public abstract class Chunk { this.minHeight = sh; } - if(!this.world.dimension.hasNoLight()) { + if(this.world.dimension.hasSkyLight()) { for(Facing face : Facing.Plane.HORIZONTAL) { this.updateNeighbor(cx + face.getFrontOffsetX(), cz + face.getFrontOffsetZ(), sy, ey); } @@ -336,7 +336,7 @@ public abstract class Chunk { return null; } - stor = new BlockArray(y >> 4 << 4, !this.world.dimension.hasNoLight(), y < 0 ? this.filler : null); + stor = new BlockArray(y >> 4 << 4, this.world.dimension.hasSkyLight(), y < 0 ? this.filler : null); this.setArray(stor); up = y >= h; } @@ -414,7 +414,7 @@ public abstract class Chunk { int z = pos.getZ() & 15; BlockArray stor = this.getArray(y >> 4); if(type == LightType.SKY) { - int l = stor == null ? (this.canSeeSky(pos) ? type.defValue : 0) : (this.world.dimension.hasNoLight() ? 0 : stor.getSky(x, y & 15, z)); + int l = stor == null ? (this.canSeeSky(pos) ? type.defValue : 0) : (this.world.dimension.hasSkyLight() ? stor.getSky(x, y & 15, z) : 0); if(y < 0) { int max = y < -64 ? 0 : (y + 64) / 4; l = l > max ? max : l; @@ -433,7 +433,7 @@ public abstract class Chunk { BlockArray stor = this.getArray(y >> 4); if(stor == null) { - stor = new BlockArray(y >> 4 << 4, !this.world.dimension.hasNoLight(), y < 0 ? this.filler : null); + stor = new BlockArray(y >> 4 << 4, this.world.dimension.hasSkyLight(), y < 0 ? this.filler : null); this.setArray(stor); this.genSkyLight(); } @@ -441,7 +441,7 @@ public abstract class Chunk { this.modified = true; if(type == LightType.SKY) { - if(!this.world.dimension.hasNoLight()) { + if(this.world.dimension.hasSkyLight()) { stor.setSky(x, y & 15, z, value); } } @@ -455,13 +455,13 @@ public abstract class Chunk { int y = pos.getY(); int z = pos.getZ() & 15; BlockArray stor = this.getArray(y >> 4); - int l = stor == null ? LightType.SKY.defValue : (this.world.dimension.hasNoLight() ? 0 : stor.getSky(x, y & 15, z)); + int l = stor == null ? LightType.SKY.defValue : (this.world.dimension.hasSkyLight() ? stor.getSky(x, y & 15, z) : 0); if(y < 0) { int max = y < -64 ? 0 : (y + 64) / 4; l = l > max ? max : l; } if(stor == null) - return !this.world.dimension.hasNoLight() && amount < l ? l - amount : 0; + return this.world.dimension.hasSkyLight() && amount < l ? l - amount : 0; l = l - amount; int b = stor.getLight(x, y & 15, z); return b > l ? b : l; @@ -658,7 +658,7 @@ public abstract class Chunk { } public void update(boolean noGaps) { - if(this.gapUpdate && !this.world.dimension.hasNoLight() && !noGaps) { + if(this.gapUpdate && this.world.dimension.hasSkyLight() && !noGaps) { this.recheckGaps(this.world.client); } @@ -735,7 +735,7 @@ public abstract class Chunk { this.lightInit = true; BlockPos pos = new BlockPos(this.xPos << 4, 0, this.zPos << 4); - if(!this.world.dimension.hasNoLight()) { + if(this.world.dimension.hasSkyLight()) { if(this.world.isAreaLoaded(pos.add(-1, 0, -1), pos.add(16, this.world.getSeaLevel(), 16))) { label92: diff --git a/common/src/main/java/common/world/World.java b/common/src/main/java/common/world/World.java index f85e1fba..542065fc 100755 --- a/common/src/main/java/common/world/World.java +++ b/common/src/main/java/common/world/World.java @@ -166,15 +166,15 @@ public abstract class World implements IWorldAccess { return 6; } - public String formatImperialTime(Dimension home, boolean days) { + public String formatTime(Dimension home, boolean days) { String qualifier = home != null ? (home.getType() == DimType.PLANET ? this.getTimeQualifier((Planet)home) + "." : "?.") : ""; long time = this.daytime; String gtime; - if((home == null || !home.getType().celestial) && !this.dimension.getType().celestial) { + if((home == null || !home.isCelestial()) && !this.dimension.isCelestial()) { gtime = "???.???.M?"; } else { - long yearTime = (home != null && home.getType().celestial ? home : this.dimension).getOrbitalPeriod(); + long yearTime = (home != null && home.isCelestial() ? home : this.dimension).getOrbitalPeriod(); long year = time / yearTime; long frac = (time * 1000L / yearTime) % 1000L; gtime = String.format("%03d.%03d.M%d", frac, year % 1000L, year / 1000L + 1L); @@ -182,7 +182,7 @@ public abstract class World implements IWorldAccess { if(!days) return qualifier + gtime; String ltime; - if(!this.dimension.getType().celestial) { + if(!this.dimension.isCelestial()) { ltime = " T???.??? D???.???.G?"; } else { @@ -194,8 +194,8 @@ public abstract class World implements IWorldAccess { return qualifier + gtime + ltime; } - public String formatImperialTime(EntityNPC player, boolean days) { - return this.formatImperialTime(player == null ? null : player.getOrigin().getDimension(), days); + public String formatTime(EntityNPC player, boolean days) { + return this.formatTime(player == null ? null : player.getOrigin().getDimension(), days); } public abstract Biome getBiomeGenForCoords(BlockPos pos); @@ -328,7 +328,7 @@ public abstract class World implements IWorldAccess { x2 = i; } - if(!this.dimension.hasNoLight()) { + if(this.dimension.hasSkyLight()) { for(int j = x2; j <= z2; ++j) { this.checkLightFor(LightType.SKY, new BlockPos(x1, j, z1)); } @@ -483,7 +483,7 @@ public abstract class World implements IWorldAccess { } public int getLightFromNeighborsFor(LightType type, BlockPos pos) { - if(this.dimension.hasNoLight() && type == LightType.SKY) { + if(!this.dimension.hasSkyLight() && type == LightType.SKY) { return 0; } else { @@ -934,9 +934,9 @@ public abstract class World implements IWorldAccess { return list; } - private float calculateCelestialAngle(long worldTime, float partialTicks) { + private float calcRotationPhase(long worldTime, float partial) { int i = (int)(worldTime % this.dimension.getRotationalPeriod()); - float f = ((float)i + partialTicks) / (float)this.dimension.getRotationalPeriod() - 0.5F; + float f = ((float)i + partial) / (float)this.dimension.getRotationalPeriod() - 0.5F; if(f < 0.0F) { ++f; @@ -951,8 +951,8 @@ public abstract class World implements IWorldAccess { return f; } - public int calculateSkylightSubtracted(boolean current) { - float f = !this.dimension.getType().days || (current && this.dimension.isBaseDestroyed()) ? 0.5f : this.calculateCelestialAngle(current ? this.daytime : + public int calcSkylightSubtracted(boolean current) { + float f = !this.dimension.hasDaylight() || (current && this.dimension.isBaseDestroyed()) ? 0.5f : this.calcRotationPhase(current ? this.daytime : (this.dimension.getRotationalPeriod() / 4L), 1.0f); float f1 = 1.0F - (ExtMath.cos(f * (float)Math.PI * 2.0F) * 2.0F + 0.5F); f1 = ExtMath.clampf(f1, 0.0F, 1.0F); @@ -963,8 +963,8 @@ public abstract class World implements IWorldAccess { return (int)(f1 * 11.0F); } - public float getCelestialAngle(float partialTicks) { - return !this.dimension.getType().days ? 0.5f : this.calculateCelestialAngle(this.daytime, Vars.dayCycle ? partialTicks : 0.0f); + public float getCelestialAngle(float partial) { + return !this.dimension.isCelestial() ? 180.0f : (this.calcRotationPhase(this.daytime, Vars.dayCycle ? partial : 0.0f) * 360.0F); } public int getMoonPhase(int moon) { @@ -972,12 +972,12 @@ public abstract class World implements IWorldAccess { return (int)(this.daytime / this.dimension.getRotationalPeriod() % 8L + 8L + this.rand.zrange(8)) % 8; } - public float getCurrentMoonPhaseFactor() { + public float getMoonPhase() { return MOON_PHASES[this.getMoonPhase(0)]; } - public float getCelestialAngleRadians(float partialTicks) { - return (this.dimension.isBaseDestroyed() ? 0.5f : this.getCelestialAngle(partialTicks)) * (float)Math.PI * 2.0F; + public float getDayPhase(float partial) { + return !this.dimension.hasDaylight() || this.dimension.isBaseDestroyed() ? (float)Math.PI : (this.calcRotationPhase(this.daytime, Vars.dayCycle ? partial : 0.0f) * (float)Math.PI * 2.0F); } public BlockPos getPrecipitationHeight(BlockPos pos) { @@ -1545,7 +1545,7 @@ public abstract class World implements IWorldAccess { } protected void calculateInitialSkylight() { - int light = this.calculateSkylightSubtracted(false); + int light = this.calcSkylightSubtracted(false); if(light != this.subtract) this.subtract = light; } @@ -1601,7 +1601,7 @@ public abstract class World implements IWorldAccess { } public LeavesType getLeavesGen(BlockPos pos) { - return this.canFreezeAt(pos) ? LeavesType.SNOWY : ((!this.dimension.getType().days || this.dimension.getOrbitOffset() == 0.0f) ? + return this.canFreezeAt(pos) ? LeavesType.SNOWY : (!this.dimension.hasSeasons() ? this.dimension.getLeavesType() : LeavesType.values()[(int)((this.daytime % this.dimension.getOrbitalPeriod()) * (long)LeavesType.values().length / this.dimension.getOrbitalPeriod())]); } @@ -1654,7 +1654,7 @@ public abstract class World implements IWorldAccess { public boolean checkLight(BlockPos pos) { boolean flag = false; - if(!this.dimension.hasNoLight()) { + if(this.dimension.hasSkyLight()) { flag |= this.checkLightFor(LightType.SKY, pos); } @@ -2017,7 +2017,7 @@ public abstract class World implements IWorldAccess { public double getSpaceFactor(double x, double y, double z) { if(this.dimension.getType() == DimType.SEMI) return ExtMath.clampd((y - (double)World.MAX_SIZE_Y) / 16384.0, 0.0, 1.0); - else if(!this.dimension.getType().celestial) + else if(!this.dimension.isCelestial()) return 0.0; double r = (double)this.dimension.getSize(); double xm = (Math.abs(x) - r) / 16384.0; diff --git a/server/src/main/java/server/Server.java b/server/src/main/java/server/Server.java index 81352b69..01de8f26 100755 --- a/server/src/main/java/server/Server.java +++ b/server/src/main/java/server/Server.java @@ -33,6 +33,7 @@ import common.dimension.Dimension; import common.dimension.Domain; import common.dimension.Galaxy; import common.dimension.Moon; +import common.dimension.Section; import common.dimension.Planet; import common.dimension.Sector; import common.dimension.Semi; @@ -302,57 +303,41 @@ public final class Server implements IThreadListener, Executor { private static void writeDimensions(TagObject tag) { List list = Lists.newArrayList(); - for(Dimension dim : UniverseRegistry.getDimensions()) { - if(dim.isCustom()) { + for(Section obj : UniverseRegistry.getSections()) { + if(obj.isCustom()) { TagObject data = new TagObject(); - data.setString("Type", dim.getType().getName()); - data.setString("Name", UniverseRegistry.getName(dim)); - data.setString("CustomName", dim.getDisplay()); - switch(dim.getType()) { - case AREA: - data.setString("Domain", UniverseRegistry.getDomain((Area)dim).id); - break; - case MOON: - data.setString("Planet", UniverseRegistry.getName(UniverseRegistry.getPlanet((Moon)dim))); - break; - case PLANET: - data.setString("Star", UniverseRegistry.getName(UniverseRegistry.getStar((Planet)dim))); - break; - case STAR: - data.setString("Sector", UniverseRegistry.getSector((Star)dim).id); - break; - } + data.setString("Name", UniverseRegistry.getName(obj)); + data.setString("CustomName", obj.getDisplay()); + if(obj instanceof Dimension dim) { + data.setString("Type", dim.getType().getName()); + switch(dim.getType()) { + case AREA: + data.setString("Domain", UniverseRegistry.getName(UniverseRegistry.getDomain((Area)obj))); + break; + case MOON: + data.setString("Planet", UniverseRegistry.getName(UniverseRegistry.getPlanet((Moon)obj))); + break; + case PLANET: + data.setString("Star", UniverseRegistry.getName(UniverseRegistry.getStar((Planet)obj))); + break; + case STAR: + data.setString("Sector", UniverseRegistry.getName(UniverseRegistry.getSector((Star)obj))); + break; + } + } + else if(obj instanceof Sector sector) { + data.setString("Type", "sector"); + data.setString("Galaxy", UniverseRegistry.getName(UniverseRegistry.getGalaxy(sector))); + } + else if(obj instanceof Galaxy galaxy) { + data.setString("Type", "galaxy"); + } + else if(obj instanceof Domain domain) { + data.setString("Type", "domain"); + } list.add(data); } } - for(Sector sector : UniverseRegistry.getSectors()) { - if(sector.isCustom()) { - TagObject data = new TagObject(); - data.setString("Type", "sector"); - data.setString("Name", sector.id); - data.setString("CustomName", sector.getDisplay()); - data.setString("Galaxy", UniverseRegistry.getGalaxy(sector).id); - list.add(data); - } - } - for(Galaxy galaxy : UniverseRegistry.getGalaxies()) { - if(galaxy.isCustom()) { - TagObject data = new TagObject(); - data.setString("Type", "galaxy"); - data.setString("Name", galaxy.id); - data.setString("CustomName", galaxy.getDisplay()); - list.add(data); - } - } - for(Domain domain : UniverseRegistry.getDomains()) { - if(domain.isCustom()) { - TagObject data = new TagObject(); - data.setString("Type", "domain"); - data.setString("Name", domain.id); - data.setString("CustomName", domain.getDisplay()); - list.add(data); - } - } if(!list.isEmpty()) tag.setList("Dimensions", list); } diff --git a/server/src/main/java/server/command/commands/CommandTime.java b/server/src/main/java/server/command/commands/CommandTime.java index e112ea7a..93ca9cd1 100644 --- a/server/src/main/java/server/command/commands/CommandTime.java +++ b/server/src/main/java/server/command/commands/CommandTime.java @@ -90,7 +90,7 @@ public class CommandTime extends Command { dim.setDayTime(time); dim.resetWeather(); } - exec.log("Zeit auf %s gesetzt", world.formatImperialTime(exec.isPlayer() ? ((Player)exec).getPresentEntity() : null, false)); + exec.log("Zeit auf %s gesetzt", world.formatTime(exec.isPlayer() ? ((Player)exec).getPresentEntity() : null, false)); return time; } } diff --git a/server/src/main/java/server/command/commands/CommandWeather.java b/server/src/main/java/server/command/commands/CommandWeather.java index 7a6ad08b..6bba687c 100644 --- a/server/src/main/java/server/command/commands/CommandWeather.java +++ b/server/src/main/java/server/command/commands/CommandWeather.java @@ -19,7 +19,7 @@ public class CommandWeather extends Command { } public void exec(CommandEnvironment env, Executor exec, Weather weather, WorldServer world, boolean transition) { - if(!world.dimension.getType().weather) + if(!world.dimension.hasWeather()) throw new RunException("Welt %s hat kein Wetter", world.dimension.getDisplay()); else if(world.isExterminated()) throw new RunException("Welt %s ist zerstört", world.dimension.getDisplay()); diff --git a/server/src/main/java/server/network/Player.java b/server/src/main/java/server/network/Player.java index f16bee36..f431a540 100755 --- a/server/src/main/java/server/network/Player.java +++ b/server/src/main/java/server/network/Player.java @@ -992,11 +992,11 @@ public class Player extends User implements Executor, IPlayer { if (list.size() == 1) { - this.sendPacket(getPacket(list.get(0), true, null, !this.entity.worldObj.dimension.hasNoLight())); + this.sendPacket(getPacket(list.get(0), true, null, this.entity.worldObj.dimension.hasSkyLight())); } else { - this.sendPacket(getPacket(list, !this.entity.worldObj.dimension.hasNoLight())); + this.sendPacket(getPacket(list, this.entity.worldObj.dimension.hasSkyLight())); } for (TileEntity tileentity : list1) diff --git a/server/src/main/java/server/world/ChunkServer.java b/server/src/main/java/server/world/ChunkServer.java index 80172a9e..7f7e46e7 100644 --- a/server/src/main/java/server/world/ChunkServer.java +++ b/server/src/main/java/server/world/ChunkServer.java @@ -27,7 +27,7 @@ public class ChunkServer extends Chunk { public ChunkServer(World world, char[] data, int height, boolean base, boolean ceil, Random rand, Biome[] biomes, int x, int z) { this(world, x, z); - boolean sky = !world.dimension.hasNoLight(); + boolean sky = world.dimension.hasSkyLight(); for(int bx = 0; bx < 16; ++bx) { for(int bz = 0; bz < 16; ++bz) { for(int by = 0; by < height; ++by) { diff --git a/server/src/main/java/server/world/Region.java b/server/src/main/java/server/world/Region.java index 2de88353..63d47e2c 100755 --- a/server/src/main/java/server/world/Region.java +++ b/server/src/main/java/server/world/Region.java @@ -561,7 +561,7 @@ public class Region { chunk.setInhabited(tag.getLong("InhabitedTime")); List sects = tag.getList("Sections"); BlockArray[] sections = new BlockArray[sects.size()]; - boolean light = !world.dimension.hasNoLight(); + boolean light = world.dimension.hasSkyLight(); for(int n = 0; n < sects.size(); ++n) { TagObject sect = sects.get(n); @@ -685,7 +685,7 @@ public class Region { tag.setLong("InhabitedTime", chunk.getInhabited()); Set sections = chunk.getStorage(); List sects = Lists.newArrayList(); - boolean light = !world.dimension.hasNoLight(); + boolean light = world.dimension.hasSkyLight(); for(BlockArray storage : sections) { if(storage != null) { diff --git a/server/src/main/java/server/world/WorldServer.java b/server/src/main/java/server/world/WorldServer.java index 156ae78e..6bd70050 100755 --- a/server/src/main/java/server/world/WorldServer.java +++ b/server/src/main/java/server/world/WorldServer.java @@ -365,7 +365,7 @@ public final class WorldServer extends AWorldServer { this.dropped.remove(v); } } - int light = this.calculateSkylightSubtracted(true); + int light = this.calcSkylightSubtracted(true); if(light != this.getSkylightSubtracted()) this.setSkylightSubtracted(light); // if(this.primary) @@ -1008,7 +1008,7 @@ public final class WorldServer extends AWorldServer { // } // } - if((this.dimension.getType().weather && !this.dimension.isExterminated()) || force) { + if((this.dimension.hasWeather() && !this.dimension.isExterminated()) || force) { float prevDarkness = this.darkness; float prevRain = this.rain; float prevFog = this.fog; @@ -1070,7 +1070,7 @@ public final class WorldServer extends AWorldServer { } } - if((this.dimension.getType().days || (this.dimension.getType().weather && !this.dimension.isExterminated())) || force) { + if((this.dimension.hasWeather() && !this.dimension.isExterminated()) || force) { float prevTemp = this.temp; float temp = this.getBaseTemperature() + this.weather.getTemperature(); @@ -2633,7 +2633,7 @@ public final class WorldServer extends AWorldServer { ChunkServer chunk = WorldServer.this.getChunk(this.position.x, this.position.z); if(chunk.isPopulated()) { - player.connection.sendPacket(Player.getPacket(chunk, true, new int[0], !WorldServer.this.dimension.hasNoLight())); + player.connection.sendPacket(Player.getPacket(chunk, true, new int[0], WorldServer.this.dimension.hasSkyLight())); } this.watching.remove(player); @@ -2725,7 +2725,7 @@ public final class WorldServer extends AWorldServer { } } this.sendToAllPlayersWatchingChunk(Player.getPacket(WorldServer.this.getChunk(this.position.x, this.position.z), - this.biomes, extend, !WorldServer.this.dimension.hasNoLight())); + this.biomes, extend, WorldServer.this.dimension.hasSkyLight())); if(this.biomes) { List list = WorldServer.this.getTileEntitiesIn(x, Integer.MIN_VALUE, z, x + 16, Integer.MAX_VALUE, z + 16); diff --git a/server/src/main/java/server/worldgen/foliage/FeatureDoublePlant.java b/server/src/main/java/server/worldgen/foliage/FeatureDoublePlant.java index 5c3243e4..82279503 100755 --- a/server/src/main/java/server/worldgen/foliage/FeatureDoublePlant.java +++ b/server/src/main/java/server/worldgen/foliage/FeatureDoublePlant.java @@ -22,7 +22,7 @@ public class FeatureDoublePlant { BlockPos blockpos = position.add(rand.zrange(8) - rand.zrange(8), rand.zrange(4) - rand.zrange(4), rand.zrange(8) - rand.zrange(8)); - if (worldIn.isAirBlock(blockpos) && (!worldIn.dimension.hasNoLight() || blockpos.getY() < 254) && this.type.canPlaceBlockAt(worldIn, blockpos)) + if (worldIn.isAirBlock(blockpos) && (worldIn.dimension.hasSkyLight() || blockpos.getY() < 254) && this.type.canPlaceBlockAt(worldIn, blockpos)) { this.type.placeAt(worldIn, blockpos, 2); flag = true; diff --git a/server/src/main/java/server/worldgen/foliage/WorldGenFlowers.java b/server/src/main/java/server/worldgen/foliage/WorldGenFlowers.java index d3990ecd..398318d0 100755 --- a/server/src/main/java/server/worldgen/foliage/WorldGenFlowers.java +++ b/server/src/main/java/server/worldgen/foliage/WorldGenFlowers.java @@ -29,7 +29,7 @@ public class WorldGenFlowers extends FeatureGenerator { BlockPos blockpos = position.add(rand.zrange(8) - rand.zrange(8), rand.zrange(4) - rand.zrange(4), rand.zrange(8) - rand.zrange(8)); - if (worldIn.isAirBlock(blockpos) && (!worldIn.dimension.hasNoLight() || blockpos.getY() < 511) && this.flower.canBlockStay(worldIn, blockpos, this.state)) + if (worldIn.isAirBlock(blockpos) && (worldIn.dimension.hasSkyLight() || blockpos.getY() < 511) && this.flower.canBlockStay(worldIn, blockpos, this.state)) { worldIn.setState(blockpos, this.state, 2); } diff --git a/server/src/main/java/server/worldgen/foliage/WorldGenMushroom.java b/server/src/main/java/server/worldgen/foliage/WorldGenMushroom.java index 07b999b7..7ea6decb 100755 --- a/server/src/main/java/server/worldgen/foliage/WorldGenMushroom.java +++ b/server/src/main/java/server/worldgen/foliage/WorldGenMushroom.java @@ -21,7 +21,7 @@ public class WorldGenMushroom extends FeatureGenerator { BlockPos blockpos = position.add(rand.zrange(8) - rand.zrange(8), rand.zrange(4) - rand.zrange(4), rand.zrange(8) - rand.zrange(8)); - if (worldIn.isAirBlock(blockpos) && (!worldIn.dimension.hasNoLight() || blockpos.getY() < 511) && this.field_175908_a.canBlockStay(worldIn, blockpos, this.field_175908_a.getState())) + if (worldIn.isAirBlock(blockpos) && (worldIn.dimension.hasSkyLight() || blockpos.getY() < 511) && this.field_175908_a.canBlockStay(worldIn, blockpos, this.field_175908_a.getState())) { worldIn.setState(blockpos, this.field_175908_a.getState(), 2); }