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

package MyGame;

import java.nio.*;
import java.lang.*;
import java.util.*;
import com.google.flatbuffers.*;

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

