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

package MyGame.Example;

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 MonsterT {
  private MyGame.Example.Vec3T pos;
  private short mana;
  private short hp;
  private String name;
  private int[] inventory;
  private int color;
  private MyGame.Example.AnyUnion test;
  private MyGame.Example.TestT[] test4;
  private String[] testarrayofstring;
  private MyGame.Example.MonsterT[] testarrayoftables;
  private MyGame.Example.MonsterT enemy;
  private int[] testnestedflatbuffer;
  private MyGame.Example.StatT testempty;
  private boolean testbool;
  private int testhashs32Fnv1;
  private long testhashu32Fnv1;
  private long testhashs64Fnv1;
  private long testhashu64Fnv1;
  private int testhashs32Fnv1a;
  private long testhashu32Fnv1a;
  private long testhashs64Fnv1a;
  private long testhashu64Fnv1a;
  private boolean[] testarrayofbools;
  private float testf;
  private float testf2;
  private float testf3;
  private String[] testarrayofstring2;
  private MyGame.Example.AbilityT[] testarrayofsortedstruct;
  private int[] flex;
  private MyGame.Example.TestT[] test5;
  private long[] vectorOfLongs;
  private double[] vectorOfDoubles;
  private MyGame.InParentNamespaceT parentNamespaceTest;
  private MyGame.Example.ReferrableT[] vectorOfReferrables;
  private long singleWeakReference;
  private long[] vectorOfWeakReferences;
  private MyGame.Example.ReferrableT[] vectorOfStrongReferrables;
  private long coOwningReference;
  private long[] vectorOfCoOwningReferences;
  private long nonOwningReference;
  private long[] vectorOfNonOwningReferences;
  private MyGame.Example.AnyUniqueAliasesUnion anyUnique;
  private MyGame.Example.AnyAmbiguousAliasesUnion anyAmbiguous;
  private int[] vectorOfEnums;
  private byte signedEnum;
  private int[] testrequirednestedflatbuffer;
  private MyGame.Example.StatT[] scalarKeySortedTables;
  private MyGame.Example.TestT nativeInline;
  private long longEnumNonEnumDefault;
  private long longEnumNormalDefault;
  private float nanDefault;
  private float infDefault;
  private float positiveInfDefault;
  private float infinityDefault;
  private float positiveInfinityDefault;
  private float negativeInfDefault;
  private float negativeInfinityDefault;
  private double doubleInfDefault;

  public MyGame.Example.Vec3T getPos() { return pos; }

  public void setPos(MyGame.Example.Vec3T pos) { this.pos = pos; }

  public short getMana() { return mana; }

  public void setMana(short mana) { this.mana = mana; }

  public short getHp() { return hp; }

  public void setHp(short hp) { this.hp = hp; }

  public String getName() { return name; }

  public void setName(String name) { this.name = name; }

  public int[] getInventory() { return inventory; }

  public void setInventory(int[] inventory) { this.inventory = inventory; }

  public int getColor() { return color; }

  public void setColor(int color) { this.color = color; }

  public MyGame.Example.AnyUnion getTest() { return test; }

  public void setTest(MyGame.Example.AnyUnion test) { this.test = test; }

  public MyGame.Example.TestT[] getTest4() { return test4; }

  public void setTest4(MyGame.Example.TestT[] test4) { this.test4 = test4; }

  public String[] getTestarrayofstring() { return testarrayofstring; }

  public void setTestarrayofstring(String[] testarrayofstring) { this.testarrayofstring = testarrayofstring; }

  public MyGame.Example.MonsterT[] getTestarrayoftables() { return testarrayoftables; }

  public void setTestarrayoftables(MyGame.Example.MonsterT[] testarrayoftables) { this.testarrayoftables = testarrayoftables; }

  public MyGame.Example.MonsterT getEnemy() { return enemy; }

  public void setEnemy(MyGame.Example.MonsterT enemy) { this.enemy = enemy; }

  public int[] getTestnestedflatbuffer() { return testnestedflatbuffer; }

  public void setTestnestedflatbuffer(int[] testnestedflatbuffer) { this.testnestedflatbuffer = testnestedflatbuffer; }

  public MyGame.Example.StatT getTestempty() { return testempty; }

  public void setTestempty(MyGame.Example.StatT testempty) { this.testempty = testempty; }

  public boolean getTestbool() { return testbool; }

  public void setTestbool(boolean testbool) { this.testbool = testbool; }

  public int getTesthashs32Fnv1() { return testhashs32Fnv1; }

  public void setTesthashs32Fnv1(int testhashs32Fnv1) { this.testhashs32Fnv1 = testhashs32Fnv1; }

  public long getTesthashu32Fnv1() { return testhashu32Fnv1; }

  public void setTesthashu32Fnv1(long testhashu32Fnv1) { this.testhashu32Fnv1 = testhashu32Fnv1; }

  public long getTesthashs64Fnv1() { return testhashs64Fnv1; }

  public void setTesthashs64Fnv1(long testhashs64Fnv1) { this.testhashs64Fnv1 = testhashs64Fnv1; }

  public long getTesthashu64Fnv1() { return testhashu64Fnv1; }

  public void setTesthashu64Fnv1(long testhashu64Fnv1) { this.testhashu64Fnv1 = testhashu64Fnv1; }

  public int getTesthashs32Fnv1a() { return testhashs32Fnv1a; }

  public void setTesthashs32Fnv1a(int testhashs32Fnv1a) { this.testhashs32Fnv1a = testhashs32Fnv1a; }

  public long getTesthashu32Fnv1a() { return testhashu32Fnv1a; }

  public void setTesthashu32Fnv1a(long testhashu32Fnv1a) { this.testhashu32Fnv1a = testhashu32Fnv1a; }

  public long getTesthashs64Fnv1a() { return testhashs64Fnv1a; }

  public void setTesthashs64Fnv1a(long testhashs64Fnv1a) { this.testhashs64Fnv1a = testhashs64Fnv1a; }

  public long getTesthashu64Fnv1a() { return testhashu64Fnv1a; }

  public void setTesthashu64Fnv1a(long testhashu64Fnv1a) { this.testhashu64Fnv1a = testhashu64Fnv1a; }

  public boolean[] getTestarrayofbools() { return testarrayofbools; }

  public void setTestarrayofbools(boolean[] testarrayofbools) { this.testarrayofbools = testarrayofbools; }

  public float getTestf() { return testf; }

  public void setTestf(float testf) { this.testf = testf; }

  public float getTestf2() { return testf2; }

  public void setTestf2(float testf2) { this.testf2 = testf2; }

  public float getTestf3() { return testf3; }

  public void setTestf3(float testf3) { this.testf3 = testf3; }

  public String[] getTestarrayofstring2() { return testarrayofstring2; }

  public void setTestarrayofstring2(String[] testarrayofstring2) { this.testarrayofstring2 = testarrayofstring2; }

  public MyGame.Example.AbilityT[] getTestarrayofsortedstruct() { return testarrayofsortedstruct; }

  public void setTestarrayofsortedstruct(MyGame.Example.AbilityT[] testarrayofsortedstruct) { this.testarrayofsortedstruct = testarrayofsortedstruct; }

  public int[] getFlex() { return flex; }

  public void setFlex(int[] flex) { this.flex = flex; }

  public MyGame.Example.TestT[] getTest5() { return test5; }

  public void setTest5(MyGame.Example.TestT[] test5) { this.test5 = test5; }

  public long[] getVectorOfLongs() { return vectorOfLongs; }

  public void setVectorOfLongs(long[] vectorOfLongs) { this.vectorOfLongs = vectorOfLongs; }

  public double[] getVectorOfDoubles() { return vectorOfDoubles; }

  public void setVectorOfDoubles(double[] vectorOfDoubles) { this.vectorOfDoubles = vectorOfDoubles; }

  public MyGame.InParentNamespaceT getParentNamespaceTest() { return parentNamespaceTest; }

  public void setParentNamespaceTest(MyGame.InParentNamespaceT parentNamespaceTest) { this.parentNamespaceTest = parentNamespaceTest; }

  public MyGame.Example.ReferrableT[] getVectorOfReferrables() { return vectorOfReferrables; }

  public void setVectorOfReferrables(MyGame.Example.ReferrableT[] vectorOfReferrables) { this.vectorOfReferrables = vectorOfReferrables; }

  public long getSingleWeakReference() { return singleWeakReference; }

  public void setSingleWeakReference(long singleWeakReference) { this.singleWeakReference = singleWeakReference; }

  public long[] getVectorOfWeakReferences() { return vectorOfWeakReferences; }

  public void setVectorOfWeakReferences(long[] vectorOfWeakReferences) { this.vectorOfWeakReferences = vectorOfWeakReferences; }

  public MyGame.Example.ReferrableT[] getVectorOfStrongReferrables() { return vectorOfStrongReferrables; }

  public void setVectorOfStrongReferrables(MyGame.Example.ReferrableT[] vectorOfStrongReferrables) { this.vectorOfStrongReferrables = vectorOfStrongReferrables; }

  public long getCoOwningReference() { return coOwningReference; }

  public void setCoOwningReference(long coOwningReference) { this.coOwningReference = coOwningReference; }

  public long[] getVectorOfCoOwningReferences() { return vectorOfCoOwningReferences; }

  public void setVectorOfCoOwningReferences(long[] vectorOfCoOwningReferences) { this.vectorOfCoOwningReferences = vectorOfCoOwningReferences; }

  public long getNonOwningReference() { return nonOwningReference; }

  public void setNonOwningReference(long nonOwningReference) { this.nonOwningReference = nonOwningReference; }

  public long[] getVectorOfNonOwningReferences() { return vectorOfNonOwningReferences; }

  public void setVectorOfNonOwningReferences(long[] vectorOfNonOwningReferences) { this.vectorOfNonOwningReferences = vectorOfNonOwningReferences; }

  public MyGame.Example.AnyUniqueAliasesUnion getAnyUnique() { return anyUnique; }

  public void setAnyUnique(MyGame.Example.AnyUniqueAliasesUnion anyUnique) { this.anyUnique = anyUnique; }

  public MyGame.Example.AnyAmbiguousAliasesUnion getAnyAmbiguous() { return anyAmbiguous; }

  public void setAnyAmbiguous(MyGame.Example.AnyAmbiguousAliasesUnion anyAmbiguous) { this.anyAmbiguous = anyAmbiguous; }

  public int[] getVectorOfEnums() { return vectorOfEnums; }

  public void setVectorOfEnums(int[] vectorOfEnums) { this.vectorOfEnums = vectorOfEnums; }

  public byte getSignedEnum() { return signedEnum; }

  public void setSignedEnum(byte signedEnum) { this.signedEnum = signedEnum; }

  public int[] getTestrequirednestedflatbuffer() { return testrequirednestedflatbuffer; }

  public void setTestrequirednestedflatbuffer(int[] testrequirednestedflatbuffer) { this.testrequirednestedflatbuffer = testrequirednestedflatbuffer; }

  public MyGame.Example.StatT[] getScalarKeySortedTables() { return scalarKeySortedTables; }

  public void setScalarKeySortedTables(MyGame.Example.StatT[] scalarKeySortedTables) { this.scalarKeySortedTables = scalarKeySortedTables; }

  public MyGame.Example.TestT getNativeInline() { return nativeInline; }

  public void setNativeInline(MyGame.Example.TestT nativeInline) { this.nativeInline = nativeInline; }

  public long getLongEnumNonEnumDefault() { return longEnumNonEnumDefault; }

  public void setLongEnumNonEnumDefault(long longEnumNonEnumDefault) { this.longEnumNonEnumDefault = longEnumNonEnumDefault; }

  public long getLongEnumNormalDefault() { return longEnumNormalDefault; }

  public void setLongEnumNormalDefault(long longEnumNormalDefault) { this.longEnumNormalDefault = longEnumNormalDefault; }

  public float getNanDefault() { return nanDefault; }

  public void setNanDefault(float nanDefault) { this.nanDefault = nanDefault; }

  public float getInfDefault() { return infDefault; }

  public void setInfDefault(float infDefault) { this.infDefault = infDefault; }

  public float getPositiveInfDefault() { return positiveInfDefault; }

  public void setPositiveInfDefault(float positiveInfDefault) { this.positiveInfDefault = positiveInfDefault; }

  public float getInfinityDefault() { return infinityDefault; }

  public void setInfinityDefault(float infinityDefault) { this.infinityDefault = infinityDefault; }

  public float getPositiveInfinityDefault() { return positiveInfinityDefault; }

  public void setPositiveInfinityDefault(float positiveInfinityDefault) { this.positiveInfinityDefault = positiveInfinityDefault; }

  public float getNegativeInfDefault() { return negativeInfDefault; }

  public void setNegativeInfDefault(float negativeInfDefault) { this.negativeInfDefault = negativeInfDefault; }

  public float getNegativeInfinityDefault() { return negativeInfinityDefault; }

  public void setNegativeInfinityDefault(float negativeInfinityDefault) { this.negativeInfinityDefault = negativeInfinityDefault; }

  public double getDoubleInfDefault() { return doubleInfDefault; }

  public void setDoubleInfDefault(double doubleInfDefault) { this.doubleInfDefault = doubleInfDefault; }


  public MonsterT() {
    this.pos = new MyGame.Example.Vec3T();
    this.mana = 150;
    this.hp = 100;
    this.name = null;
    this.inventory = null;
    this.color = 8;
    this.test = null;
    this.test4 = null;
    this.testarrayofstring = null;
    this.testarrayoftables = null;
    this.enemy = null;
    this.testnestedflatbuffer = null;
    this.testempty = null;
    this.testbool = false;
    this.testhashs32Fnv1 = 0;
    this.testhashu32Fnv1 = 0L;
    this.testhashs64Fnv1 = 0L;
    this.testhashu64Fnv1 = 0L;
    this.testhashs32Fnv1a = 0;
    this.testhashu32Fnv1a = 0L;
    this.testhashs64Fnv1a = 0L;
    this.testhashu64Fnv1a = 0L;
    this.testarrayofbools = null;
    this.testf = 3.14159f;
    this.testf2 = 3.0f;
    this.testf3 = 0.0f;
    this.testarrayofstring2 = null;
    this.testarrayofsortedstruct = null;
    this.flex = null;
    this.test5 = null;
    this.vectorOfLongs = null;
    this.vectorOfDoubles = null;
    this.parentNamespaceTest = null;
    this.vectorOfReferrables = null;
    this.singleWeakReference = 0L;
    this.vectorOfWeakReferences = null;
    this.vectorOfStrongReferrables = null;
    this.coOwningReference = 0L;
    this.vectorOfCoOwningReferences = null;
    this.nonOwningReference = 0L;
    this.vectorOfNonOwningReferences = null;
    this.anyUnique = null;
    this.anyAmbiguous = null;
    this.vectorOfEnums = null;
    this.signedEnum = -1;
    this.testrequirednestedflatbuffer = null;
    this.scalarKeySortedTables = null;
    this.nativeInline = new MyGame.Example.TestT();
    this.longEnumNonEnumDefault = 0L;
    this.longEnumNormalDefault = 2L;
    this.nanDefault = Float.NaN;
    this.infDefault = Float.POSITIVE_INFINITY;
    this.positiveInfDefault = Float.POSITIVE_INFINITY;
    this.infinityDefault = Float.POSITIVE_INFINITY;
    this.positiveInfinityDefault = Float.POSITIVE_INFINITY;
    this.negativeInfDefault = Float.NEGATIVE_INFINITY;
    this.negativeInfinityDefault = Float.NEGATIVE_INFINITY;
    this.doubleInfDefault = Double.POSITIVE_INFINITY;
  }
  public static MonsterT deserializeFromBinary(byte[] fbBuffer) {
    return Monster.getRootAsMonster(ByteBuffer.wrap(fbBuffer)).unpack();
  }
  public byte[] serializeToBinary() {
    FlatBufferBuilder fbb = new FlatBufferBuilder();
    Monster.finishMonsterBuffer(fbb, Monster.pack(fbb, this));
    return fbb.sizedByteArray();
  }
}

