// 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.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();
  }
}

