Better save validation
This commit is contained in:
@@ -875,6 +875,7 @@ public class UnitTypes implements ContentList{
|
|||||||
health = 75;
|
health = 75;
|
||||||
engineOffset = 5.5f;
|
engineOffset = 5.5f;
|
||||||
range = 140f;
|
range = 140f;
|
||||||
|
targetAir = false;
|
||||||
|
|
||||||
weapons.add(new Weapon(){{
|
weapons.add(new Weapon(){{
|
||||||
y = 0f;
|
y = 0f;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public class DrawOperation{
|
|||||||
private MapEditor editor;
|
private MapEditor editor;
|
||||||
private LongSeq array = new LongSeq();
|
private LongSeq array = new LongSeq();
|
||||||
|
|
||||||
public DrawOperation(MapEditor editor) {
|
public DrawOperation(MapEditor editor){
|
||||||
this.editor = editor;
|
this.editor = editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ public class DrawOperation{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateTile(int i) {
|
private void updateTile(int i){
|
||||||
long l = array.get(i);
|
long l = array.get(i);
|
||||||
array.set(i, TileOp.get(TileOp.x(l), TileOp.y(l), TileOp.type(l), getTile(editor.tile(TileOp.x(l), TileOp.y(l)), TileOp.type(l))));
|
array.set(i, TileOp.get(TileOp.x(l), TileOp.y(l), TileOp.type(l), getTile(editor.tile(TileOp.x(l), TileOp.y(l)), TileOp.type(l))));
|
||||||
setTile(editor.tile(TileOp.x(l), TileOp.y(l)), TileOp.type(l), TileOp.value(l));
|
setTile(editor.tile(TileOp.x(l), TileOp.y(l)), TileOp.type(l), TileOp.value(l));
|
||||||
|
|||||||
@@ -79,8 +79,10 @@ public abstract class BulletType extends Content{
|
|||||||
public boolean backMove = true;
|
public boolean backMove = true;
|
||||||
/** Bullet range override. */
|
/** Bullet range override. */
|
||||||
public float range = -1f;
|
public float range = -1f;
|
||||||
/** Heal Bullet Percent **/
|
/** % of block health healed **/
|
||||||
public float healPercent = 0f;
|
public float healPercent = 0f;
|
||||||
|
/** whether to make fire on impact */
|
||||||
|
public boolean makeFire = false;
|
||||||
|
|
||||||
//additional effects
|
//additional effects
|
||||||
|
|
||||||
@@ -158,7 +160,7 @@ public abstract class BulletType extends Content{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void hitTile(Bullet b, Building tile, float initialHealth){
|
public void hitTile(Bullet b, Building tile, float initialHealth){
|
||||||
if(status == StatusEffects.burning) {
|
if(makeFire) {
|
||||||
Fires.create(tile.tile);
|
Fires.create(tile.tile);
|
||||||
}
|
}
|
||||||
hit(b);
|
hit(b);
|
||||||
@@ -209,14 +211,14 @@ public abstract class BulletType extends Content{
|
|||||||
Damage.status(b.team, x, y, splashDamageRadius, status, statusDuration, collidesAir, collidesGround);
|
Damage.status(b.team, x, y, splashDamageRadius, status, statusDuration, collidesAir, collidesGround);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(healPercent > 0f) {
|
if(healPercent > 0f){
|
||||||
indexer.eachBlock(b.team, x, y, splashDamageRadius, other -> other.damaged(), other -> {
|
indexer.eachBlock(b.team, x, y, splashDamageRadius, other -> other.damaged(), other -> {
|
||||||
Fx.healBlockFull.at(other.x, other.y, other.block.size, Pal.heal);
|
Fx.healBlockFull.at(other.x, other.y, other.block.size, Pal.heal);
|
||||||
other.heal(healPercent / 100f * other.maxHealth());
|
other.heal(healPercent / 100f * other.maxHealth());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(status == StatusEffects.burning) {
|
if(makeFire){
|
||||||
indexer.eachBlock(null, x, y, splashDamageRadius, other -> other.team != b.team, other -> {
|
indexer.eachBlock(null, x, y, splashDamageRadius, other -> other.team != b.team, other -> {
|
||||||
Fires.create(other.tile);
|
Fires.create(other.tile);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package mindustry.io;
|
|||||||
|
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.struct.ObjectMap.*;
|
import arc.struct.ObjectMap.*;
|
||||||
|
import arc.util.*;
|
||||||
import arc.util.io.*;
|
import arc.util.io.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
|
|
||||||
@@ -60,9 +61,11 @@ public abstract class SaveFileReader{
|
|||||||
protected final DataOutputStream dataBytesSmall = new DataOutputStream(byteOutputSmall);
|
protected final DataOutputStream dataBytesSmall = new DataOutputStream(byteOutputSmall);
|
||||||
|
|
||||||
protected int lastRegionLength;
|
protected int lastRegionLength;
|
||||||
|
protected @Nullable CounterInputStream currCounter;
|
||||||
|
|
||||||
protected void region(String name, DataInput stream, CounterInputStream counter, IORunner<DataInput> cons) throws IOException{
|
protected void region(String name, DataInput stream, CounterInputStream counter, IORunner<DataInput> cons) throws IOException{
|
||||||
counter.resetCount();
|
counter.resetCount();
|
||||||
|
this.currCounter = counter;
|
||||||
int length;
|
int length;
|
||||||
try{
|
try{
|
||||||
length = readChunk(stream, cons);
|
length = readChunk(stream, cons);
|
||||||
@@ -70,8 +73,8 @@ public abstract class SaveFileReader{
|
|||||||
throw new IOException("Error reading region \"" + name + "\".", e);
|
throw new IOException("Error reading region \"" + name + "\".", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(length != counter.count() - 4){
|
if(length != counter.count - 4){
|
||||||
throw new IOException("Error reading region \"" + name + "\": read length mismatch. Expected: " + length + "; Actual: " + (counter.count() - 4));
|
throw new IOException("Error reading region \"" + name + "\": read length mismatch. Expected: " + length + "; Actual: " + (counter.count - 4));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,8 +117,11 @@ public abstract class SaveFileReader{
|
|||||||
/** Reads a chunk of some length. Use the runner for reading to catch more descriptive errors. */
|
/** Reads a chunk of some length. Use the runner for reading to catch more descriptive errors. */
|
||||||
public int readChunk(DataInput input, boolean isShort, IORunner<DataInput> runner) throws IOException{
|
public int readChunk(DataInput input, boolean isShort, IORunner<DataInput> runner) throws IOException{
|
||||||
int length = isShort ? input.readUnsignedShort() : input.readInt();
|
int length = isShort ? input.readUnsignedShort() : input.readInt();
|
||||||
|
int pos = currCounter.count;
|
||||||
lastRegionLength = length;
|
lastRegionLength = length;
|
||||||
runner.accept(input);
|
runner.accept(input);
|
||||||
|
|
||||||
|
if(pos + length != currCounter.count) throw new IOException("Read length mismatch. Expected: " + length + ", Actual: " + (currCounter.count - pos));
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user