// automatically generated by the FlatBuffers compiler, do not modify

package MyGame;

import com.google.flatbuffers.BaseVector;
import com.google.flatbuffers.BooleanVector;
import com.google.flatbuffers.ByteVector;
import com.google.flatbuffers.Constants;
import com.google.flatbuffers.DoubleVector;
import com.google.flatbuffers.FlatBufferBuilder;
import com.google.flatbuffers.FloatVector;
import com.google.flatbuffers.IntVector;
import com.google.flatbuffers.LongVector;
import com.google.flatbuffers.ShortVector;
import com.google.flatbuffers.StringVector;
import com.google.flatbuffers.Struct;
import com.google.flatbuffers.Table;
import com.google.flatbuffers.UnionVector;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class MonsterExtraT {
  private double d0;
  private double d1;
  private double d2;
  private double d3;
  private float f0;
  private float f1;
  private float f2;
  private float f3;
  private double[] dvec;
  private float[] fvec;

  public double getD0() { return d0; }

  public void setD0(double d0) { this.d0 = d0; }

  public double getD1() { return d1; }

  public void setD1(double d1) { this.d1 = d1; }

  public double getD2() { return d2; }

  public void setD2(double d2) { this.d2 = d2; }

  public double getD3() { return d3; }

  public void setD3(double d3) { this.d3 = d3; }

  public float getF0() { return f0; }

  public void setF0(float f0) { this.f0 = f0; }

  public float getF1() { return f1; }

  public void setF1(float f1) { this.f1 = f1; }

  public float getF2() { return f2; }

  public void setF2(float f2) { this.f2 = f2; }

  public float getF3() { return f3; }

  public void setF3(float f3) { this.f3 = f3; }

  public double[] getDvec() { return dvec; }

  public void setDvec(double[] dvec) { this.dvec = dvec; }

  public float[] getFvec() { return fvec; }

  public void setFvec(float[] fvec) { this.fvec = fvec; }


  public MonsterExtraT() {
    this.d0 = Double.NaN;
    this.d1 = Double.NaN;
    this.d2 = Double.POSITIVE_INFINITY;
    this.d3 = Double.NEGATIVE_INFINITY;
    this.f0 = Float.NaN;
    this.f1 = Float.NaN;
    this.f2 = Float.POSITIVE_INFINITY;
    this.f3 = Float.NEGATIVE_INFINITY;
    this.dvec = null;
    this.fvec = null;
  }
  public static MonsterExtraT deserializeFromBinary(byte[] fbBuffer) {
    return MonsterExtra.getRootAsMonsterExtra(ByteBuffer.wrap(fbBuffer)).unpack();
  }
  public byte[] serializeToBinary() {
    FlatBufferBuilder fbb = new FlatBufferBuilder();
    MonsterExtra.finishMonsterExtraBuffer(fbb, MonsterExtra.pack(fbb, this));
    return fbb.sizedByteArray();
  }
}

