diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java index 93b07ace1a..a9fe41a701 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java @@ -2,6 +2,7 @@ package mindustry.annotations.entity; import arc.files.*; import arc.struct.*; +import arc.util.*; import arc.util.serialization.*; import com.squareup.javapoet.*; import mindustry.annotations.Annotations.*; @@ -45,8 +46,8 @@ public class EntityIO{ Array fields = Array.with(type.fieldSpecs).select(spec -> !spec.hasModifier(Modifier.TRANSIENT) && !spec.hasModifier(Modifier.STATIC) && - !spec.hasModifier(Modifier.FINAL) && - (spec.type.isPrimitive() || serializer.has(spec.type.toString()))); + !spec.hasModifier(Modifier.FINAL)/* && + (spec.type.isPrimitive() || serializer.has(spec.type.toString()))*/); //sort to keep order fields.sortComparing(f -> f.name); @@ -116,6 +117,55 @@ public class EntityIO{ st("$L(write, $L)", serializer.writers.get(type), field); }else if(serializer.readers.containsKey(type) && !write){ st("$L$L(read)", field, serializer.readers.get(type)); + }else if(type.endsWith("[]")){ //it's a 1D array + String rawType = type.substring(0, type.length() - 2); + + if(write){ + s("i", field + ".length"); + cont("for(int INDEX = 0; INDEX < $L.length; INDEX ++)", field); + io(rawType, field + "[INDEX]"); + }else{ + String fieldName = field.replace(" = ", "").replace("this.", ""); + String lenf = fieldName + "_LENGTH"; + s("i", "int " + lenf + " = "); + if(!field.isEmpty()){ + st("$Lnew $L[$L]", field, type.replace("[]", ""), lenf); + } + cont("for(int INDEX = 0; INDEX < $L; INDEX ++)", lenf); + io(rawType, field.replace(" = ", "[INDEX] = ")); + } + + econt(); + }else if(type.startsWith("arc.struct") && type.contains("<")){ //it's some type of data structure + String struct = type.substring(0, type.indexOf("<")); + String generic = type.substring(type.indexOf("<") + 1, type.indexOf(">")); + + if(struct.equals("arc.struct.Queue") || struct.equals("arc.struct.Array")){ + if(write){ + s("i", field + ".size"); + cont("for(int INDEX = 0; INDEX < $L.size; INDEX ++)", field); + io(generic, field + ".get(INDEX)"); + }else{ + String fieldName = field.replace(" = ", "").replace("this.", ""); + String lenf = fieldName + "_LENGTH"; + s("i", "int " + lenf + " = "); + if(!field.isEmpty()){ + st("$L.clear()", field.replace(" = ", "")); + } + cont("for(int INDEX = 0; INDEX < $L; INDEX ++)", lenf); + io(generic, field.replace(" = ", "_ITEM = ").replace("this.", generic + " ")); + if(!field.isEmpty()){ + String temp = field.replace(" = ", "_ITEM").replace("this.", ""); + st("if($L != null) $L.add($L)", temp, field.replace(" = ", ""), temp); + } + } + + econt(); + }else{ + Log.warn("Missing serialization code for collection '@' in '@'", type, name); + } + }else{ + Log.warn("Missing serialization code for type '@' in '@'", type, name); } } diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index 19e72439a2..1219236d3d 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -4,6 +4,7 @@ import arc.*; import arc.files.*; import arc.func.*; import arc.struct.*; +import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import arc.util.pooling.Pool.*; @@ -262,7 +263,7 @@ public class EntityProcess extends BaseProcessor{ .addModifiers(Modifier.PUBLIC) .addStatement("return $S + $L", name + "#", "id").build()); - EntityIO io = new EntityIO(type.name(), builder, serializer, rootDirectory.child("annotations/src/main/resources/revisions").child(name)); + EntityIO io = ann.serialize() ? new EntityIO(type.name(), builder, serializer, rootDirectory.child("annotations/src/main/resources/revisions").child(name)) : null; //add all methods from components for(ObjectMap.Entry> entry : methods){ @@ -323,7 +324,7 @@ public class EntityProcess extends BaseProcessor{ //SPECIAL CASE: I/O code //note that serialization is generated even for non-serializing entities for manual usage - if((first.name().equals("read") || first.name().equals("write")) && ann.genio()){ + if((first.name().equals("read") || first.name().equals("write")) && ann.genio() && ann.serialize()){ io.write(mbuilder, first.name().equals("write")); } @@ -620,7 +621,17 @@ public class EntityProcess extends BaseProcessor{ Array allComponents(Selement type){ if(!defComponents.containsKey(type)){ //get base defs - Array components = types(type.annotation(EntityDef.class), EntityDef::value).map(this::interfaceToComp); + Array interfaces = types(type.annotation(EntityDef.class), EntityDef::value); + Array components = new Array<>(); + for(Stype i : interfaces){ + Stype comp = interfaceToComp(i); + if(comp != null){ + components.add(comp); + }else{ + throw new IllegalArgumentException("Type '" + i + "' is not a component interface!"); + } + } + ObjectSet out = new ObjectSet<>(); for(Stype comp : components){ //get dependencies for each def, add them @@ -665,7 +676,7 @@ public class EntityProcess extends BaseProcessor{ return interfaceToComp(type) != null; } - Stype interfaceToComp(Stype type){ + @Nullable Stype interfaceToComp(Stype type){ String name = type.name().substring(0, type.name().length() - 1) + "Comp"; return componentNames.get(name); } diff --git a/annotations/src/main/resources/classids.properties b/annotations/src/main/resources/classids.properties index d751acaa74..80aaeb7ed5 100644 --- a/annotations/src/main/resources/classids.properties +++ b/annotations/src/main/resources/classids.properties @@ -1,17 +1,16 @@ #Maps entity names to IDs. Autogenerated. -dagger=0 -draug=1 -mindustry.entities.def.BulletComp=2 -mindustry.entities.def.DecalComp=3 -mindustry.entities.def.EffectComp=4 -mindustry.entities.def.FireComp=5 -mindustry.entities.def.PlayerComp=6 -mindustry.entities.def.PuddleComp=7 -mindustry.entities.def.TileComp=8 -mindustry.type.Weather.WeatherComp=9 +draug=0 +mindustry.entities.def.BulletComp=1 +mindustry.entities.def.DecalComp=2 +mindustry.entities.def.EffectComp=3 +mindustry.entities.def.FireComp=4 +mindustry.entities.def.PlayerComp=5 +mindustry.entities.def.PuddleComp=6 +mindustry.entities.def.TileComp=7 +mindustry.type.Weather.WeatherComp=8 +mindustry.world.blocks.storage.LaunchPad.LaunchPayloadComp=9 phantom=10 -reaper=14 -titan=13 -vanguard=11 -wraith=12 \ No newline at end of file +titan=11 +vanguard=12 +wraith=13 \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderUnitEntity/0.json b/annotations/src/main/resources/revisions/BuilderUnitEntity/0.json index 010ca755c5..2b9663c159 100644 --- a/annotations/src/main/resources/revisions/BuilderUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/BuilderUnitEntity/0.json @@ -1 +1 @@ -{fields:[{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file +{fields:[{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:requests,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Array,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:vel,type:arc.math.geom.Vec2,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BulletEntity/0.json b/annotations/src/main/resources/revisions/BulletEntity/0.json deleted file mode 100644 index 576dffb934..0000000000 --- a/annotations/src/main/resources/revisions/BulletEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:damage,type:float,size:4},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/CommanderUnitWaterMoveEntity/0.json b/annotations/src/main/resources/revisions/CommanderUnitWaterMoveEntity/0.json index 010ca755c5..25aa74f6fe 100644 --- a/annotations/src/main/resources/revisions/CommanderUnitWaterMoveEntity/0.json +++ b/annotations/src/main/resources/revisions/CommanderUnitWaterMoveEntity/0.json @@ -1 +1 @@ -{fields:[{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file +{fields:[{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Array,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:vel,type:arc.math.geom.Vec2,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/DecalEntity/0.json b/annotations/src/main/resources/revisions/DecalEntity/0.json deleted file mode 100644 index b8d564d18c..0000000000 --- a/annotations/src/main/resources/revisions/DecalEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:color,type:arc.graphics.Color,size:-1},{name:lifetime,type:float,size:4},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/EffectEntity/0.json b/annotations/src/main/resources/revisions/EffectEntity/0.json deleted file mode 100644 index 4e23d76400..0000000000 --- a/annotations/src/main/resources/revisions/EffectEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:color,type:arc.graphics.Color,size:-1},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/LaunchPayloadEntity/0.json b/annotations/src/main/resources/revisions/LaunchPayloadEntity/0.json new file mode 100644 index 0000000000..793c0f9572 --- /dev/null +++ b/annotations/src/main/resources/revisions/LaunchPayloadEntity/0.json @@ -0,0 +1 @@ +{fields:[{name:height,type:float,size:4},{name:stacks,type:arc.struct.Array,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/LegsUnitEntity/0.json b/annotations/src/main/resources/revisions/LegsUnitEntity/0.json index 40c3cdbcdf..1351f965a9 100644 --- a/annotations/src/main/resources/revisions/LegsUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/LegsUnitEntity/0.json @@ -1 +1 @@ -{fields:[{name:baseRotation,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file +{fields:[{name:baseRotation,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Array,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:vel,type:arc.math.geom.Vec2,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/MinerUnitEntity/0.json b/annotations/src/main/resources/revisions/MinerUnitEntity/0.json index 0f5535c862..d9c2fbd34f 100644 --- a/annotations/src/main/resources/revisions/MinerUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/MinerUnitEntity/0.json @@ -1 +1 @@ -{fields:[{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file +{fields:[{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Array,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:vel,type:arc.math.geom.Vec2,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/PlayerEntity/0.json b/annotations/src/main/resources/revisions/PlayerEntity/0.json deleted file mode 100644 index ec8b6dc412..0000000000 --- a/annotations/src/main/resources/revisions/PlayerEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:admin,type:boolean,size:1},{name:color,type:arc.graphics.Color,size:-1},{name:deathTimer,type:float,size:4},{name:lastText,type:java.lang.String,size:-1},{name:mouseX,type:float,size:4},{name:mouseY,type:float,size:4},{name:name,type:java.lang.String,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:textFadeTime,type:float,size:4},{name:typing,type:boolean,size:1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/TileEntity/0.json b/annotations/src/main/resources/revisions/TileEntity/0.json deleted file mode 100644 index 2e02b6b8d2..0000000000 --- a/annotations/src/main/resources/revisions/TileEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:health,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/UnitEntity/0.json b/annotations/src/main/resources/revisions/UnitEntity/0.json index 010ca755c5..25aa74f6fe 100644 --- a/annotations/src/main/resources/revisions/UnitEntity/0.json +++ b/annotations/src/main/resources/revisions/UnitEntity/0.json @@ -1 +1 @@ -{fields:[{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file +{fields:[{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Array,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:vel,type:arc.math.geom.Vec2,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/core/src/mindustry/entities/def/BulletComp.java b/core/src/mindustry/entities/def/BulletComp.java index 2dc1e61d75..be06eb186f 100644 --- a/core/src/mindustry/entities/def/BulletComp.java +++ b/core/src/mindustry/entities/def/BulletComp.java @@ -58,7 +58,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw remove(); } - @Override + @Replace public float clipSize(){ return type.drawSize; } diff --git a/core/src/mindustry/entities/def/DecalComp.java b/core/src/mindustry/entities/def/DecalComp.java index 814e451e49..1b60bc5905 100644 --- a/core/src/mindustry/entities/def/DecalComp.java +++ b/core/src/mindustry/entities/def/DecalComp.java @@ -25,7 +25,7 @@ abstract class DecalComp implements Drawc, Timedc, Rotc, Posc{ Draw.color(); } - @Override + @Replace public float clipSize(){ return region.getWidth()*2; } diff --git a/core/src/mindustry/entities/def/DrawComp.java b/core/src/mindustry/entities/def/DrawComp.java index fa5e06285b..6970c933c7 100644 --- a/core/src/mindustry/entities/def/DrawComp.java +++ b/core/src/mindustry/entities/def/DrawComp.java @@ -6,7 +6,9 @@ import mindustry.gen.*; @Component abstract class DrawComp implements Posc{ - abstract float clipSize(); + float clipSize(){ + return Float.MAX_VALUE; + } void draw(){ diff --git a/core/src/mindustry/entities/def/EffectComp.java b/core/src/mindustry/entities/def/EffectComp.java index e322e856b6..df35658b1a 100644 --- a/core/src/mindustry/entities/def/EffectComp.java +++ b/core/src/mindustry/entities/def/EffectComp.java @@ -17,7 +17,7 @@ abstract class EffectComp implements Posc, Drawc, Timedc, Rotc, Childc{ effect.render(id(), color, time(), rotation(), x(), y(), data); } - @Override + @Replace public float clipSize(){ return effect.size; } diff --git a/core/src/mindustry/entities/def/PlayerComp.java b/core/src/mindustry/entities/def/PlayerComp.java index f3bbb2fd3f..fa2ec06dec 100644 --- a/core/src/mindustry/entities/def/PlayerComp.java +++ b/core/src/mindustry/entities/def/PlayerComp.java @@ -62,7 +62,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra } } - @Override + @Replace public float clipSize(){ return 20; } diff --git a/core/src/mindustry/entities/def/PuddleComp.java b/core/src/mindustry/entities/def/PuddleComp.java index d7cd3e417d..3d40e68671 100644 --- a/core/src/mindustry/entities/def/PuddleComp.java +++ b/core/src/mindustry/entities/def/PuddleComp.java @@ -114,7 +114,7 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ } } - @Override + @Replace public float clipSize(){ return 20; } diff --git a/core/src/mindustry/entities/def/StatusComp.java b/core/src/mindustry/entities/def/StatusComp.java index 5fd937469b..da14ceb039 100644 --- a/core/src/mindustry/entities/def/StatusComp.java +++ b/core/src/mindustry/entities/def/StatusComp.java @@ -20,7 +20,7 @@ import static mindustry.Vars.content; @Component abstract class StatusComp implements Posc, Flyingc{ private Array statuses = new Array<>(); - private Bits applied = new Bits(content.getBy(ContentType.status).size); + private transient Bits applied = new Bits(content.getBy(ContentType.status).size); @ReadOnly transient float speedMultiplier, damageMultiplier, armorMultiplier; @@ -145,31 +145,4 @@ abstract class StatusComp implements Posc, Flyingc{ boolean hasEffect(StatusEffect effect){ return applied.get(effect.id); } - - //TODO autogen io code - - void writeSave(DataOutput stream) throws IOException{ - stream.writeByte(statuses.size); - for(StatusEntry entry : statuses){ - stream.writeByte(entry.effect.id); - stream.writeFloat(entry.time); - } - } - - void readSave(DataInput stream, byte version) throws IOException{ - for(StatusEntry effect : statuses){ - Pools.free(effect); - } - - statuses.clear(); - - byte amount = stream.readByte(); - for(int i = 0; i < amount; i++){ - byte id = stream.readByte(); - float time = stream.readFloat(); - StatusEntry entry = Pools.obtain(StatusEntry.class, StatusEntry::new); - entry.set(content.getByID(ContentType.status, id), time); - statuses.add(entry); - } - } } diff --git a/core/src/mindustry/entities/def/SyncComp.java b/core/src/mindustry/entities/def/SyncComp.java index 33d72ec63a..cc88886d06 100644 --- a/core/src/mindustry/entities/def/SyncComp.java +++ b/core/src/mindustry/entities/def/SyncComp.java @@ -9,7 +9,7 @@ import mindustry.net.*; abstract class SyncComp implements Posc{ @Import float x, y; - Interpolator interpolator = new Interpolator(); + transient Interpolator interpolator = new Interpolator(); void setNet(float x, float y){ set(x, y); diff --git a/core/src/mindustry/entities/def/UnitComp.java b/core/src/mindustry/entities/def/UnitComp.java index 9979360736..45e607455a 100644 --- a/core/src/mindustry/entities/def/UnitComp.java +++ b/core/src/mindustry/entities/def/UnitComp.java @@ -22,7 +22,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Import float x, y, rotation, elevation, maxHealth; - private UnitController controller; + private transient UnitController controller; private UnitType type; public void moveAt(Vec2 vector){ @@ -43,7 +43,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I return type.hasWeapons(); } - @Override + @Replace public float clipSize(){ return type.region.getWidth() * 2f; } diff --git a/core/src/mindustry/entities/def/WeaponsComp.java b/core/src/mindustry/entities/def/WeaponsComp.java index ecf49c1348..3393c9d96e 100644 --- a/core/src/mindustry/entities/def/WeaponsComp.java +++ b/core/src/mindustry/entities/def/WeaponsComp.java @@ -20,7 +20,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc{ static int sequenceNum = 0; /** weapon mount array, never null */ - @ReadOnly WeaponMount[] mounts = {}; + @ReadOnly transient WeaponMount[] mounts = {}; @ReadOnly transient float range, aimX, aimY; @ReadOnly transient boolean isRotate, isShooting; diff --git a/core/src/mindustry/game/Stats.java b/core/src/mindustry/game/Stats.java index bd0ae219c1..fdfa510b40 100644 --- a/core/src/mindustry/game/Stats.java +++ b/core/src/mindustry/game/Stats.java @@ -5,6 +5,8 @@ import arc.struct.*; import mindustry.annotations.Annotations.*; import mindustry.type.*; +import static mindustry.Vars.content; + @Serialize public class Stats{ /** Items delivered to global resoure counter. Zones only. */ @@ -22,6 +24,9 @@ public class Stats{ /** Friendly buildings destroyed. */ public int buildingsDestroyed; + /** Item production means. */ + private transient WindowedMean[] itemProduction = new WindowedMean[content.items().size]; + public RankResult calculateRank(Sector zone, boolean launched){ float score = 0; diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index 0357735dee..43db19626e 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -4,6 +4,7 @@ import arc.graphics.*; import arc.math.geom.*; import arc.struct.*; import arc.util.io.*; +import arc.util.pooling.*; import mindustry.annotations.Annotations.*; import mindustry.ctype.*; import mindustry.entities.bullet.*; @@ -118,22 +119,51 @@ public class TypeIO{ return content.block(read.s()); } + public static void writeRequest(Writes write, BuildRequest request){ + write.b(request.breaking ? (byte)1 : 0); + write.i(Point2.pack(request.x, request.y)); + if(!request.breaking){ + write.s(request.block.id); + write.b((byte)request.rotation); + write.b(request.hasConfig ? (byte)1 : 0); + writeObject(write, request.config); + } + } + + public static BuildRequest readRequest(Reads read){ + BuildRequest currentRequest; + + byte type = read.b(); + int position = read.i(); + + if(world.tile(position) == null){ + return null; + } + + if(type == 1){ //remove + currentRequest = new BuildRequest(Point2.x(position), Point2.y(position)); + }else{ //place + short block = read.s(); + byte rotation = read.b(); + boolean hasConfig = read.b() == 1; + Object config = readObject(read); + currentRequest = new BuildRequest(Point2.x(position), Point2.y(position), rotation, content.block(block)); + if(hasConfig){ + currentRequest.configure(config); + } + } + + return currentRequest; + } + public static void writeRequests(Writes write, BuildRequest[] requests){ if(requests == null){ write.s(-1); return; } - write.s((short)requests.length); for(BuildRequest request : requests){ - write.b(request.breaking ? (byte)1 : 0); - write.i(Point2.pack(request.x, request.y)); - if(!request.breaking){ - write.s(request.block.id); - write.b((byte)request.rotation); - write.b(request.hasConfig ? (byte)1 : 0); - writeObject(write, request.config); - } + writeRequest(write, request); } } @@ -145,28 +175,10 @@ public class TypeIO{ BuildRequest[] reqs = new BuildRequest[reqamount]; for(int i = 0; i < reqamount; i++){ - byte type = read.b(); - int position = read.i(); - BuildRequest currentRequest; - - if(world.tile(position) == null){ - continue; + BuildRequest request = readRequest(read); + if(request != null){ + reqs[i] = request; } - - if(type == 1){ //remove - currentRequest = new BuildRequest(Point2.x(position), Point2.y(position)); - }else{ //place - short block = read.s(); - byte rotation = read.b(); - boolean hasConfig = read.b() == 1; - Object config = readObject(read); - currentRequest = new BuildRequest(Point2.x(position), Point2.y(position), rotation, content.block(block)); - if(hasConfig){ - currentRequest.configure(config); - } - } - - reqs[i] = (currentRequest); } return reqs; @@ -193,6 +205,38 @@ public class TypeIO{ return JsonIO.read(Rules.class, string); } + public static void writeVec2(Writes write, Vec2 v){ + if(v == null){ + write.f(0); + write.f(0); + }else{ + write.f(v.x); + write.f(v.y); + } + } + + public static Vec2 readVec2(Reads read){ + return new Vec2(read.f(), read.f()); + } + + public static void writeStatuse(Writes write, StatusEntry entry){ + write.s(entry.effect.id); + write.f(entry.time); + } + + public static StatusEntry readStatuse(Reads read){ + return Pools.obtain(StatusEntry.class, StatusEntry::new).set(content.getByID(ContentType.status, read.s()), read.f()); + } + + public static void writeItems(Writes write, ItemStack stack){ + writeItem(write, stack.item); + write.i(stack.amount); + } + + public static ItemStack readItems(Reads read){ + return new ItemStack(readItem(read), read.i()); + } + public static void writeTeam(Writes write, Team reason){ write.b(reason.id); } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 02ffc02d65..90e984e5cf 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -23,7 +23,7 @@ import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; public class UnitType extends UnlockableContent{ - static final float shadowTX = -12, shadowTY = -13, shadowColor = Color.toFloatBits(0, 0, 0, 0.22f); + public static final float shadowTX = -12, shadowTY = -13, shadowColor = Color.toFloatBits(0, 0, 0, 0.22f); public boolean flying; public @NonNull Prov constructor; diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index cdcaad0733..d541a75029 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -150,10 +150,5 @@ public abstract class Weather extends MappableContent{ }); } } - - @Override - public float clipSize(){ - return Float.MAX_VALUE; - } } } diff --git a/core/src/mindustry/world/blocks/storage/LaunchPad.java b/core/src/mindustry/world/blocks/storage/LaunchPad.java index c646c77cb7..2f8b17d42e 100644 --- a/core/src/mindustry/world/blocks/storage/LaunchPad.java +++ b/core/src/mindustry/world/blocks/storage/LaunchPad.java @@ -1,19 +1,25 @@ package mindustry.world.blocks.storage; +import arc.graphics.g2d.*; +import arc.struct.*; +import arc.util.*; +import mindustry.annotations.Annotations.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.type.*; +import mindustry.world.*; import mindustry.world.meta.*; -public class LaunchPad extends StorageBlock{ +public class LaunchPad extends Block{ public final int timerLaunch = timers++; /** Time inbetween launches. */ public float launchTime; public LaunchPad(String name){ super(name); - update = true; hasItems = true; solid = true; + update = true; } @Override @@ -23,7 +29,7 @@ public class LaunchPad extends StorageBlock{ stats.add(BlockStat.launchTime, launchTime / 60f, StatUnit.seconds); } - public class LaunchPadEntity extends StorageBlockEntity{ + public class LaunchPadEntity extends TileEntity{ @Override public void draw(){ super.draw(); @@ -54,12 +60,16 @@ public class LaunchPad extends StorageBlock{ @Override public boolean acceptItem(Tilec source, Item item){ - return item.type == ItemType.material && super.acceptItem(source, item); + return items.total() < itemCapacity; } @Override public void updateTile(){ - //TODO + + //launch when full + if(items.total() >= itemCapacity){ + + } /* if(state.isCampaign() && consValid() && items.total() >= itemCapacity && timer(timerLaunch, launchTime / timeScale())){ @@ -74,4 +84,36 @@ public class LaunchPad extends StorageBlock{ }*/ } } + + @EntityDef(LaunchPayloadc.class) + @Component + static abstract class LaunchPayloadComp implements Drawc{ + static final float speed = 1f; + + @Import float x,y; + + float height; + transient TextureRegion region; + + Array stacks = new Array<>(); + + @Override + public void draw(){ + Draw.z(Layer.weather - 1); + Draw.rect(region, x, y); + + Tmp.v1.trns(225f, height); + + Draw.z(Layer.flyingUnit + 1); + Draw.color(UnitType.shadowColor); + Draw.rect(region, x + Tmp.v1.x, y + Tmp.v1.y); + + Draw.reset(); + } + + @Override + public void update(){ + height += Time.delta() * speed; + } + } }