Entity IO fixes

This commit is contained in:
Anuken
2020-05-14 17:40:49 -04:00
parent 12f4d5a9a4
commit 6d23963e98
29 changed files with 226 additions and 109 deletions

View File

@@ -58,7 +58,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
remove();
}
@Override
@Replace
public float clipSize(){
return type.drawSize;
}

View File

@@ -25,7 +25,7 @@ abstract class DecalComp implements Drawc, Timedc, Rotc, Posc{
Draw.color();
}
@Override
@Replace
public float clipSize(){
return region.getWidth()*2;
}

View File

@@ -6,7 +6,9 @@ import mindustry.gen.*;
@Component
abstract class DrawComp implements Posc{
abstract float clipSize();
float clipSize(){
return Float.MAX_VALUE;
}
void draw(){

View File

@@ -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;
}

View File

@@ -62,7 +62,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
}
}
@Override
@Replace
public float clipSize(){
return 20;
}

View File

@@ -114,7 +114,7 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{
}
}
@Override
@Replace
public float clipSize(){
return 20;
}

View File

@@ -20,7 +20,7 @@ import static mindustry.Vars.content;
@Component
abstract class StatusComp implements Posc, Flyingc{
private Array<StatusEntry> 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);
}
}
}

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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<? extends Unitc> constructor;

View File

@@ -150,10 +150,5 @@ public abstract class Weather extends MappableContent{
});
}
}
@Override
public float clipSize(){
return Float.MAX_VALUE;
}
}
}

View File

@@ -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<ItemStack> 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;
}
}
}