From 4a216056d02ba76dbd6c90cbf2310445739bbd08 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 11 Feb 2022 11:33:06 -0500 Subject: [PATCH] I waste several hours --- .../blocks/turrets/disperse/disperse.png | Bin 2024 -> 2028 bytes core/assets/shaders/fog.frag | 12 ++ core/src/mindustry/core/Renderer.java | 2 + core/src/mindustry/game/Rules.java | 2 + core/src/mindustry/graphics/FogRenderer.java | 173 ++++++++++++++++++ core/src/mindustry/graphics/Layer.java | 3 + .../mindustry/graphics/MinimapRenderer.java | 18 ++ core/src/mindustry/graphics/Shaders.java | 8 + core/src/mindustry/io/SaveFileReader.java | 63 +++++-- core/src/mindustry/io/SaveIO.java | 2 +- core/src/mindustry/io/SaveVersion.java | 42 ++++- core/src/mindustry/io/versions/Save6.java | 21 +++ core/src/mindustry/io/versions/Save7.java | 10 + gradle.properties | 2 +- 14 files changed, 334 insertions(+), 24 deletions(-) create mode 100644 core/assets/shaders/fog.frag create mode 100644 core/src/mindustry/graphics/FogRenderer.java create mode 100644 core/src/mindustry/io/versions/Save7.java diff --git a/core/assets-raw/sprites/blocks/turrets/disperse/disperse.png b/core/assets-raw/sprites/blocks/turrets/disperse/disperse.png index bf7bbc092ccdeabd745b310f7abc3a9c9ac50c75..b474041e8ff01dc81adb3cb10fc170e8827171fc 100644 GIT binary patch delta 1975 zcmaFC|Av2pVf`{s7srr_IdA9s`^mZs9P8F-|G=1#p4Xsb>1{3jVs# z4<;B$@US%>OxSzl0$)S--@}tNzkPnb{P^_$_4|H@OnJZiyL?<<{nnjZW&h6J|Ig;- zqB8po_5+Syf9{>rY^-L^;JVn%86$n5i9sxB!Gl{2-e=bTpLKkL&vv#4BJ0wHOEMWa z4_28vma|O|S>-NVlHS1BC%=`M;m1Eet8aeVxsM_e@A+`8F`KGmGWm)-!~4q`Tw+Dx zvWzNR8-D36j@ur*HbL(jzkj{j*@+IhEE^uwX=hw>`YU8`;piO3sySJ#I?vKhG2CI@ zbc1VK8j~^GhM0`g8v_j!8TeVh2_*BX@fchJ`uKB)FW8U1mdtaQd|NTRZug`C?p{{AklG$FSJ7gJ?V&=$~7xqmnNp6^SsQybz zlOE3kMGt*7gLH;BUp#_2-t1iK^Y_^dqXzYl*~uF~mVeNwJFuD4N8-TdAB^kO3@)-i zc=F)Il$bm1vrqrnxWCRY(~e8cjX^KSS1SK`MrWsBL$YMJcOqY(-)gs}i<}}(k7IA1 z_IPlQVV2XE1g5E1SL|%JT=}qmpMJuuW%Zm2dJgXrFTCIXFJ#Jl`TGCDz4~7bG-CM7 z%*^8Yzi8N9->F-|9LoD3vSyvc7T*PSOjnW||1>O(*kEGlkmVK9eYC0g_>tJn zB9H3VK8R5=)qQY*dBX`4-^+W%CoI~c`sdx>cF$kMf-de1dE(Jx_6KAafALT-V@hD& zZ(-l|-TwciKed^Ox;A|CmSvuLT2xrq^Ge#Ik3~t@q4$SOMU_m?*~l!F1apV;kBaA? zZsLsKZFrkdDKh`}oEuUF<(xNpHuya%o*#XgMThM}y;9vtfiBs!y|Wu~81x^p7cpIr zOSYZekiwAvh>rtnA9@|>|C@U@D9>L_pjzyJrd{jVwYgJ% zH158gZT$L&YIeP55`*?5<_mc?y0&H0R%z~L%wnFJ@uGl3BeCgLjH*vUlIw)fkE(s5 z8#b+Uxyx|v=yaQ9timg#4s`#Rbo`oG<19vkZhu{E7}334HS}~( z5pR3=`ujECH@D9|ebn;nrAZqmSysN>Z5*2O>h<#{)0W=78>cV#xc=u$!>a55-(S~1 zdHqU`-dZU}19h*p>t|ms+Ba9b=5%?Y=Q-7_+*jV|tlP&jWzL1kKW6NI*mRm@O77F7 z?+kYyW#=zE)X+J#TIGOJ62r>!eeA+lj;zRJDq}vvbob`n=J56R_x$lzjrnxp*d|V| zB=4scg>`>?dy~u?gwzD)vmF!itgmh1Zip8SIKtj>eaTU0(?I4YLN89T2t8t7;_F~^ z;Pd5Vqo0!wR2wud`Oz4nTl`hOHI*fTm+A4X7)GyI_OsM9EX(!Ug+4N`Hhp?(_FEwV zrd5)gl3F=F7p_)2&>{a?H{l3>%dMhkr>poKICJ7ATy2Upc06lcKQFlV$Bg3S45NBp zou_YJ+1>1nHad9jo!rU|OXtMi)$c1>8NuJ@=V`cWCfhZ(S=AR9C+NM25%3f~(?8ef z;H1FmMLrLg35pzGi;0?Xl_~i*&(v(SSzz5IzKxr#XO2`Ro)h`IOrqus_4T8Y6~1R4W8Zgj1)eQ$h77Mb>=_$Wc(R#R zKPsM+Ja0DZM@FgI;up`ZeM>rY-oJl^|ECN^vsZWI?~Cm%%VZB(aCP})liSiKW(t&M zi%px9TzIc!+n)@nEsPqw11y9d|Ee{%{Z*wFZWqHkzzBW>y zams-u`<1T?O^MlgKjY1J22;jqVn+^Z1WP5?_j0Oy65q*rgr!TjB~>^f`S26HsoQTR z=}nAc-hbs}^sdg;wR=;OpA}g1ZV4&y-k4A*{X=M@exuIZLr2{jq2a%8!0kPibyaVoY8Z}xXIL7*@+P*X!Bm2g>Bij6^YY&qtZ|*x7$m%= m`$zM^1XXBt38i9x@NZ7&xwwe;+hYa>1_n=8KbLh*2~7ZmSCQ}l delta 1971 zcmaFE|AK#lVf`Xc7srr_IdA7W`pLQrv~_E=e_%{V&uh@J^q$OHl=tAxgq}z>=`(6N z@f}C>?l5%oR!FLJOFxj6QP@61XOY|E=kMmNTeoW6s=B|P({vvAhF|@^f8NV^?<5-z zCKyQYur(h{*bteM$$sGIZ+`jZH_p$Olb`qh|Ics1f&22m-M5pk&#q24|7BkP_vgm$ zTYneGGO(*Yx<1LuZIy5S4)ca3KfI5>I>@q)_kz=(rO8$1joHjcCJ5|5x^e4^a}3Nf zhZ&^L860T)yts_v&YJ$)E1$o;V&kAc!{ETLsU<#JE_upmpHZL8^g3;m!OSIfTp#Ru z79}W_hcZWKG??8o4KQ}-KB8K`yvg#SN#id~hc2<;gSH9h7{c~%4ST#O=@f$)_mSSM zGG`?YL?x6ZVH#U%WhVUCRK z{7K!_^|gZb->&PcopnFx!hgUuYtpf3X&^Zd9-{rCQT^_FG&1=`L zeg63PH&%ux{>)OpS!R7_Fnx6V1gE0s8eSj&38w=eZz~FBt`N7sJ}q3>#F%0F4?~-K zJe!i3zIHqGKPujun`jnrm0{k|=UtAsSzg&X=!zZTkLY6c7G_@3=CUR0WXrI2@()%mR8@3mbHSf0R z%xJjEa6?k3|55Sw&b5r+brfeant9f|+h*!}Ac;Z$(e#pq^*8da?dCke_CcvmLA~Iu z<+aV69&8`f>Jq#bNCq$1%DIZSA+zHBgAFTx?3}sn_UzTG?oT~)uW**aR##iLqb#9p z2fEI)E<0d&u!!mTKeo-Yrhi_vrIqsn+XscZ1ihHf9~<|tjXd@CBumnFCX1uXH|*Wq zEo5I%U7VUGyFW$Ol_$ZqzJ}pe>++?y&jp#Lnmgn!5E8bMVe*=>z$~0oct(U^N@z`I zGV7Wgtw8gJ(vPbBnFm=`v3*e5_hjQ%-vwz5+>hjC=P!Ev;w+06+l8{fRXo=oWqMvU zT70MFaQF1}`+nd2`}OFf8C98{5hrKt`Eq-vmf6?O#YLwt<>jvv>;L%Whrr(YSO34i zp8g~~%WQhsSB4pFL9bsw+aiXcHL?%=OBLBL)imuV8? zJURJEC#SRAYvxor%D*IQ=IVM)9oqv{0utAsaRnItT%6f7XOB$)^JAb(%89w-w(GHxAY49-Zfs3dLt{7cE4V0mQq;v&#Eq=kK4=39{z2= zdvyD>WeWMc+J$uP)`sn#JhGRue<`Wtge|yE>8KpFRNh`Z$RJF8)*k?9| z4cScZA2C}PGBnr=~dd4iKHM$+F!dH&f2Tb1VvQJ68afZXn_eZXpFmBEDc^6c< zs=j%L#@&@$N)|@^s^s3w&%Um$(Q;2*OXg)?rPoK|m?EuwdcHCRtQ~Z researched = new ObjectSet<>(); /** Block containing these items as requirements are hidden. */ public ObjectSet hiddenBuildItems = new ObjectSet<>(); + /** HIGHLY UNSTABLE/EXPERIMENTAL. DO NOT USE THIS. */ + public boolean fog = false; /** Whether ambient lighting is enabled. */ public boolean lighting = false; /** Whether enemy lighting is visible. diff --git a/core/src/mindustry/graphics/FogRenderer.java b/core/src/mindustry/graphics/FogRenderer.java new file mode 100644 index 0000000000..582fb99b8a --- /dev/null +++ b/core/src/mindustry/graphics/FogRenderer.java @@ -0,0 +1,173 @@ +package mindustry.graphics; + +import arc.*; +import arc.graphics.*; +import arc.graphics.Texture.*; +import arc.graphics.g2d.*; +import arc.graphics.gl.*; +import arc.math.geom.*; +import arc.struct.*; +import arc.util.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.io.*; +import mindustry.io.SaveFileReader.*; + +import java.io.*; +import java.nio.*; + +import static mindustry.Vars.*; + +/** Highly experimental fog-of-war renderer. */ +public class FogRenderer implements CustomChunk{ + private static final float fogSpeed = 1f; + private FrameBuffer buffer = new FrameBuffer(); + private Seq events = new Seq<>(); + private boolean read = false; + private Rect rect = new Rect(); + + public FogRenderer(){ + SaveVersion.addCustomChunk("fog", this); + + Events.on(WorldLoadEvent.class, event -> { + if(state.rules.fog){ + buffer.resize(world.width(), world.height()); + + events.clear(); + Groups.build.copy(events); + + //clear + if(!read){ + buffer.begin(Color.black); + buffer.end(); + } + + read = false; + } + }); + + //draw fog when tile is placed. + Events.on(TileChangeEvent.class, event -> { + if(state.rules.fog && event.tile.build != null && event.tile.isCenter()){ + events.add(event.tile.build); + } + }); + } + + public Texture getTexture(){ + return buffer.getTexture(); + } + + public void drawFog(){ + //resize if world size changes + buffer.resize(world.width(), world.height()); + + //set projection to whole map + Draw.proj(0, 0, buffer.getWidth() * tilesize, buffer.getHeight() * tilesize); + buffer.begin(); + Gl.blendEquationSeparate(Gl.max, Gl.max); + ScissorStack.push(rect.set(1, 1, buffer.getWidth() - 2, buffer.getHeight() - 2)); + + Draw.color(Color.white); + + for(var build : events){ + if(build.team == player.team()){ + Fill.circle(build.x, build.y, 40f); + } + } + events.clear(); + + Draw.alpha(fogSpeed * Math.max(Time.delta, 1f)); + + //TODO slow and terrible + Groups.unit.each(u -> { + if(u.team == player.team()){ + Fill.circle(u.x, u.y, u.type.lightRadius); + } + }); + + buffer.end(); + buffer.getTexture().setFilter(TextureFilter.linear); + Gl.blendEquationSeparate(Gl.funcAdd, Gl.funcAdd); + ScissorStack.pop(); + + Draw.proj(Core.camera); + + Draw.shader(Shaders.fog); + Draw.fbo(buffer.getTexture(), world.width(), world.height(), tilesize); + Draw.shader(); + } + + @Override + public void write(DataOutput stream) throws IOException{ + ByteBuffer bytes = Buffers.newUnsafeByteBuffer(buffer.getWidth() * buffer.getHeight() * 4); + try{ + bytes.position(0); + buffer.begin(); + Gl.readPixels(0, 0, buffer.getWidth(), buffer.getHeight(), Gl.rgba, Gl.unsignedByte, bytes); + buffer.end(); + bytes.position(0); + stream.writeShort(buffer.getWidth()); + stream.writeShort(buffer.getHeight()); + + //TODO flip? + + int pos = 0, size = bytes.capacity() / 4; + while(pos < size){ + int consecutives = 0; + boolean cur = bytes.get(pos * 4) != 0; + while(consecutives < 127 && pos < size){ + boolean next = bytes.get(pos * 4) != 0; + if(cur != next){ + break; + } + + consecutives ++; + pos ++; + } + int mask = (cur ? 0b1000_0000 : 0); + stream.write(mask | (consecutives)); + } + }finally{ + Buffers.disposeUnsafeByteBuffer(bytes); + } + } + + @Override + public void read(DataInput stream) throws IOException{ + short w = stream.readShort(), h = stream.readShort(); + int pos = 0; + int len = w * h; + buffer.resize(w, h); + buffer.begin(Color.black); + Draw.proj(0, 0, buffer.getWidth(), buffer.getHeight()); + Draw.color(); + + while(pos < len){ + int data = stream.readByte() & 0xff; + boolean sign = (data & 0b1000_0000) != 0; + int consec = data & 0b0111_1111; + + if(sign){ + for(int i = 0; i < consec; i++){ + int x = pos % w, y = pos / w; + //TODO this is slow + Fill.rect(x + 0.5f, y + 0.5f, 1f, 1f); + + pos ++; + } + }else{ + pos += consec; + } + } + + buffer.end(); + Draw.proj(Core.camera); + read = true; + } + + @Override + public boolean shouldWrite(){ + return state.rules.fog && buffer.getTexture() != null && buffer.getWidth() > 0; + } +} diff --git a/core/src/mindustry/graphics/Layer.java b/core/src/mindustry/graphics/Layer.java index 109bc2799d..d87ef9f185 100644 --- a/core/src/mindustry/graphics/Layer.java +++ b/core/src/mindustry/graphics/Layer.java @@ -92,6 +92,9 @@ public class Layer{ //names of players in the game playerName = 150, + //fog of war effect, if applicable + fogOfWar = 155, + //space effects, currently only the land and launch effects space = 160, diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index 165baab656..bebc9ef035 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -2,6 +2,7 @@ package mindustry.graphics; import arc.*; import arc.graphics.*; +import arc.graphics.Texture.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; @@ -134,6 +135,23 @@ public class MinimapRenderer{ Draw.reset(); + if(state.rules.fog){ + if(withLabels){ + float z = zoom; + //max zoom out fixes everything, somehow? + setZoom(99999f); + getRegion(); + zoom = z; + } + Draw.shader(Shaders.fog); + renderer.fog.getTexture().setFilter(TextureFilter.nearest); + //crisp pixels + Tmp.tr1.set(renderer.fog.getTexture()); + Tmp.tr1.set(region.u, 1f - region.v, region.u2, 1f - region.v2); + Draw.rect(Tmp.tr1, x + w/2f, y + h/2f, w, h); + Draw.shader(); + } + //TODO might be useful in the standard minimap too if(withLabels){ drawSpawns(x, y, w, h, scaling); diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index b74c70fdaf..e9b316977c 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -21,6 +21,7 @@ public class Shaders{ public static UnitBuildShader build; public static UnitArmorShader armor; public static DarknessShader darkness; + public static FogShader fog; public static LightShader light; public static SurfaceShader water, mud, tar, slag, cryofluid, space, caustics, arkycite; public static PlanetShader planet; @@ -41,6 +42,7 @@ public class Shaders{ shield = null; t.printStackTrace(); } + fog = new FogShader(); buildBeam = new BuildBeamShader(); build = new UnitBuildShader(); armor = new UnitArmorShader(); @@ -178,6 +180,12 @@ public class Shaders{ } } + public static class FogShader extends LoadShader{ + public FogShader(){ + super("fog", "default"); + } + } + /** @deprecated transition class for mods; use UnitBuildShader instead. */ @Deprecated public static class UnitBuild extends UnitBuildShader{} diff --git a/core/src/mindustry/io/SaveFileReader.java b/core/src/mindustry/io/SaveFileReader.java index a39142caca..1cde38be1b 100644 --- a/core/src/mindustry/io/SaveFileReader.java +++ b/core/src/mindustry/io/SaveFileReader.java @@ -72,10 +72,11 @@ public abstract class SaveFileReader{ "slag", "molten-slag" ); - protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream(); - protected final DataOutputStream dataBytes = new DataOutputStream(byteOutput); + protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream(), byteOutput2 = new ReusableByteOutStream(); + protected final DataOutputStream dataBytes = new DataOutputStream(byteOutput), dataBytes2 = new DataOutputStream(byteOutput2); protected final ReusableByteOutStream byteOutputSmall = new ReusableByteOutStream(); protected final DataOutputStream dataBytesSmall = new DataOutputStream(byteOutputSmall); + protected boolean chunkNested = false; protected int lastRegionLength; protected @Nullable CounterInputStream currCounter; @@ -112,23 +113,41 @@ public abstract class SaveFileReader{ } /** Write a chunk of input to the stream. An integer of some length is written first, followed by the data. */ - public void writeChunk(DataOutput output, boolean isByte, IORunner runner) throws IOException{ - ReusableByteOutStream dout = isByte ? byteOutputSmall : byteOutput; - //reset output position - dout.reset(); - //write the needed info - runner.accept(isByte ? dataBytesSmall : dataBytes); - int length = dout.size(); - //write length (either int or byte) followed by the output bytes - if(!isByte){ - output.writeInt(length); - }else{ - if(length > 65535){ - throw new IOException("Byte write length exceeded: " + length + " > 65535"); + public void writeChunk(DataOutput output, boolean isShort, IORunner runner) throws IOException{ + + //TODO awful + boolean wasNested = chunkNested; + if(!isShort){ + chunkNested = true; + } + ReusableByteOutStream dout = + isShort ? byteOutputSmall : + wasNested ? byteOutput2 : + byteOutput; + try{ + //reset output position + dout.reset(); + //write the needed info + runner.accept( + isShort ? dataBytesSmall : + wasNested ? dataBytes2 : + dataBytes + ); + + int length = dout.size(); + //write length (either int or byte) followed by the output bytes + if(!isShort){ + output.writeInt(length); + }else{ + if(length > 65535){ + throw new IOException("Byte write length exceeded: " + length + " > 65535"); + } + output.writeShort(length); } - output.writeShort(length); + output.write(dout.getBytes(), 0, length); + }finally{ + chunkNested = wasNested; } - output.write(dout.getBytes(), 0, length); } public int readChunk(DataInput input, IORunner runner) throws IOException{ @@ -148,8 +167,8 @@ public abstract class SaveFileReader{ } /** Skip a chunk completely, discarding the bytes. */ - public void skipChunk(DataInput input, boolean isByte) throws IOException{ - int length = readChunk(input, isByte, t -> {}); + public void skipChunk(DataInput input, boolean isShort) throws IOException{ + int length = readChunk(input, isShort, t -> {}); int skipped = input.skipBytes(length); if(length != skipped){ throw new IOException("Could not skip bytes. Expected length: " + length + "; Actual length: " + skipped); @@ -180,4 +199,10 @@ public abstract class SaveFileReader{ public interface IORunner{ void accept(T stream) throws IOException; } + + public interface CustomChunk{ + void write(DataOutput stream) throws IOException; + void read(DataInput stream) throws IOException; + boolean shouldWrite(); + } } diff --git a/core/src/mindustry/io/SaveIO.java b/core/src/mindustry/io/SaveIO.java index c62abfe30b..d23f360c37 100644 --- a/core/src/mindustry/io/SaveIO.java +++ b/core/src/mindustry/io/SaveIO.java @@ -20,7 +20,7 @@ public class SaveIO{ /** Save format header. */ public static final byte[] header = {'M', 'S', 'A', 'V'}; public static final IntMap versions = new IntMap<>(); - public static final Seq versionArray = Seq.with(new Save1(), new Save2(), new Save3(), new Save4(), new Save5(), new Save6()); + public static final Seq versionArray = Seq.with(new Save1(), new Save2(), new Save3(), new Save4(), new Save5(), new Save6(), new Save7()); static{ for(SaveVersion version : versionArray){ diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index 14f41fff7d..38fe61ef33 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -23,7 +23,9 @@ import java.util.*; import static mindustry.Vars.*; public abstract class SaveVersion extends SaveFileReader{ - public int version; + protected static OrderedMap customChunks = new OrderedMap<>(); + + public final int version; //HACK stores the last read build of the save file, valid after read meta call protected int lastReadBuild; @@ -31,6 +33,14 @@ public abstract class SaveVersion extends SaveFileReader{ //if null, fall back to EntityMapping's values protected @Nullable Prov[] entityMapping; + /** + * Registers a custom save chunk reader/writer by name. This is mostly used for mods that need to save extra data. + * @param name a mod-specific, unique name for identifying this chunk. Prefixing is recommended. + * */ + public static void addCustomChunk(String name, CustomChunk chunk){ + customChunks.put(name, chunk); + } + public SaveVersion(int version){ this.version = version; } @@ -56,23 +66,49 @@ public abstract class SaveVersion extends SaveFileReader{ } @Override - public final void read(DataInputStream stream, CounterInputStream counter, WorldContext context) throws IOException{ + public void read(DataInputStream stream, CounterInputStream counter, WorldContext context) throws IOException{ region("meta", stream, counter, this::readMeta); region("content", stream, counter, this::readContentHeader); try{ region("map", stream, counter, in -> readMap(in, context)); region("entities", stream, counter, this::readEntities); + region("custom", stream, counter, this::readCustomChunks); }finally{ content.setTemporaryMapper(null); } } - public final void write(DataOutputStream stream, StringMap extraTags) throws IOException{ + public void write(DataOutputStream stream, StringMap extraTags) throws IOException{ region("meta", stream, out -> writeMeta(out, extraTags)); region("content", stream, this::writeContentHeader); region("map", stream, this::writeMap); region("entities", stream, this::writeEntities); + region("custom", stream, this::writeCustomChunks); + } + + public void writeCustomChunks(DataOutput stream) throws IOException{ + var chunks = customChunks.orderedKeys().select(s -> customChunks.get(s).shouldWrite()); + stream.writeInt(chunks.size); + for(var chunkName : chunks){ + var chunk = customChunks.get(chunkName); + stream.writeUTF(chunkName); + + writeChunk(stream, false, chunk::write); + } + } + + public void readCustomChunks(DataInput stream) throws IOException{ + int amount = stream.readInt(); + for(int i = 0; i < amount; i++){ + String name = stream.readUTF(); + var chunk = customChunks.get(name); + if(chunk != null){ + readChunk(stream, false, chunk::read); + }else{ + skipChunk(stream); + } + } } public void writeMeta(DataOutput stream, StringMap tags) throws IOException{ diff --git a/core/src/mindustry/io/versions/Save6.java b/core/src/mindustry/io/versions/Save6.java index 7e0a5aff77..8e9af9fd23 100644 --- a/core/src/mindustry/io/versions/Save6.java +++ b/core/src/mindustry/io/versions/Save6.java @@ -1,10 +1,31 @@ package mindustry.io.versions; +import arc.util.io.*; import mindustry.io.*; +import mindustry.world.*; +import java.io.*; + +import static mindustry.Vars.*; + +/** This version does not read custom chunk data. */ public class Save6 extends SaveVersion{ public Save6(){ super(6); } + + @Override + public void read(DataInputStream stream, CounterInputStream counter, WorldContext context) throws IOException{ + region("meta", stream, counter, this::readMeta); + region("content", stream, counter, this::readContentHeader); + + try{ + region("map", stream, counter, in -> readMap(in, context)); + region("entities", stream, counter, this::readEntities); + }finally{ + content.setTemporaryMapper(null); + + } + } } diff --git a/core/src/mindustry/io/versions/Save7.java b/core/src/mindustry/io/versions/Save7.java new file mode 100644 index 0000000000..dde5dc8b8c --- /dev/null +++ b/core/src/mindustry/io/versions/Save7.java @@ -0,0 +1,10 @@ +package mindustry.io.versions; + +import mindustry.io.*; + +public class Save7 extends SaveVersion{ + + public Save7(){ + super(7); + } +} diff --git a/gradle.properties b/gradle.properties index 522dec1f29..120d869fe2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,4 +24,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 -archash=243eb136dc +archash=502eb9934e