Java tutorial
/* * This file is part of Matter Overdrive * Copyright (c) 2015., Simeon Radivoev, All rights reserved. * * Matter Overdrive is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Matter Overdrive is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>. */ package matteroverdrive.starmap.data; import io.netty.buffer.ByteBuf; import matteroverdrive.starmap.GalaxyGenerator; import matteroverdrive.starmap.gen.ISpaceBodyGen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.Vec3; import net.minecraft.world.World; import java.io.File; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * Created by Simeon on 6/13/2015. */ public class Star extends SpaceBody { //region Private Vars private Quadrant quadrant; private HashMap<Integer, Planet> planetHashMap; private float x, y, z, size, mass; private byte type; private int temperature, color, seed; private boolean generated; private boolean isDirty; //endregion //region Constructors public Star() { super(); init(); } public Star(String name, int id) { super(name, id); init(); } //endregion public void generateMissing(NBTTagCompound tagCompound, GalaxyGenerator galaxyGenerator) { if (galaxyGenerator != null) { for (ISpaceBodyGen<Star> starGen : galaxyGenerator.getStarGen().getGens()) { galaxyGenerator.getStarRandom().setSeed(seed); if (starGen.generateMissing(tagCompound, this, galaxyGenerator.getStarRandom())) { break; } } for (Planet planet : getPlanets()) { planet.generateMissing(tagCompound, galaxyGenerator); } } } //region Updates public void update(World world) { for (Planet planet : getPlanets()) { planet.update(world); } } //endregion //region Events public void onSave(File file, World world) { isDirty = false; for (Planet planet : getPlanets()) { planet.onSave(file, world); } } //endregion //region Read - Write @Override public void writeToNBT(NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); tagCompound.setFloat("X", x); tagCompound.setFloat("Y", y); tagCompound.setFloat("Z", z); tagCompound.setFloat("Size", size); tagCompound.setFloat("Mass", mass); tagCompound.setByte("Type", type); tagCompound.setInteger("Temperature", temperature); tagCompound.setInteger("Color", color); tagCompound.setInteger("Seed", seed); tagCompound.setBoolean("Generated", generated); NBTTagList planetList = new NBTTagList(); for (Planet planet : getPlanets()) { NBTTagCompound quadrantNBT = new NBTTagCompound(); planet.writeToNBT(quadrantNBT); planetList.appendTag(quadrantNBT); } tagCompound.setTag("Planets", planetList); } @Override public void writeToBuffer(ByteBuf byteBuf) { super.writeToBuffer(byteBuf); byteBuf.writeFloat(x); byteBuf.writeFloat(y); byteBuf.writeFloat(z); byteBuf.writeFloat(size); byteBuf.writeFloat(mass); byteBuf.writeByte(type); byteBuf.writeInt(temperature); byteBuf.writeInt(color); /*int planetCount = getPlanets().size(); byteBuf.writeInt(planetCount); for (Planet planet : getPlanets()) { planet.writeToBuffer(byteBuf); }*/ } @Override public void readFromNBT(NBTTagCompound tagCompound, GalaxyGenerator generator) { super.readFromNBT(tagCompound, generator); x = tagCompound.getFloat("X"); y = tagCompound.getFloat("Y"); z = tagCompound.getFloat("Z"); size = tagCompound.getFloat("Size"); mass = tagCompound.getFloat("Mass"); type = tagCompound.getByte("Type"); temperature = tagCompound.getInteger("Temperature"); color = tagCompound.getInteger("Color"); seed = tagCompound.getInteger("Seed"); generated = tagCompound.getBoolean("Generated"); NBTTagList planetList = tagCompound.getTagList("Planets", 10); for (int i = 0; i < planetList.tagCount(); i++) { Planet planet = new Planet(); planet.readFromNBT(planetList.getCompoundTagAt(i), generator); addPlanet(planet); planet.setStar(this); } generateMissing(tagCompound, generator); } @Override public void readFromBuffer(ByteBuf byteBuf) { super.readFromBuffer(byteBuf); x = byteBuf.readFloat(); y = byteBuf.readFloat(); z = byteBuf.readFloat(); size = byteBuf.readFloat(); mass = byteBuf.readFloat(); type = byteBuf.readByte(); temperature = byteBuf.readInt(); color = byteBuf.readInt(); /*int planetCount = byteBuf.readInt(); for (int i = 0;i < planetCount;i++) { Planet planet = new Planet(); planet.readFromBuffer(byteBuf); addPlanet(planet); planet.setStar(this); }*/ } //endregion //region Getters and Setters @Override public SpaceBody getParent() { return quadrant; } public Planet planet(int at) { return planetHashMap.get(at); } public boolean hasPlanet(int id) { return planetHashMap.containsKey(id); } private void init() { planetHashMap = new HashMap<Integer, Planet>(); } public Collection<Planet> getPlanets() { return planetHashMap.values(); } public Map<Integer, Planet> getPlanetMap() { return planetHashMap; } public void addPlanet(Planet planet) { getPlanetMap().put(planet.getId(), planet); } public void setPosition(float x, float y, float z) { this.x = x; this.y = y; this.z = z; } public Vec3 getPosition() { return getPosition(1); } public Vec3 getPosition(double multipy) { return Vec3.createVectorHelper(x * multipy, y * multipy, z * multipy); } public float getX() { return x; } public float getY() { return y; } public float getZ() { return z; } public void setQuadrant(Quadrant quadrant) { this.quadrant = quadrant; } public Quadrant getQuadrant() { return quadrant; } public void setSize(float size) { this.size = size; } public float getSize() { return size; } public void setType(byte type) { this.type = type; } public byte getType() { return this.type; } public void setTemperature(int temperature) { this.temperature = temperature; } public int getTemperature() { return temperature; } public int getColor() { return color; } public void setColor(int color) { this.color = color; } public void clearPlanets() { planetHashMap.clear(); } public int getSeed() { return seed; } public void setSeed(int seed) { this.seed = seed; } public boolean isGenerated() { return generated; } public void setGenerated(boolean generated) { this.generated = generated; } public void setMass(float mass) { this.mass = mass; } public float getMass() { return mass; } public int isClaimed(EntityPlayer player) { int ownType = 0; for (Planet planet : getPlanets()) { if (planet.hasOwner()) { if (planet.getOwnerUUID().equals(EntityPlayer.func_146094_a(player.getGameProfile()))) { if (planet.isHomeworld()) if (ownType < 3) { ownType = 3; } else if (ownType < 2) { ownType = 2; } } if (ownType < 1) { ownType = 1; } } } return ownType; } public boolean isClaimed() { for (Planet planet : getPlanets()) { if (planet.hasOwner()) { return true; } } return false; } public boolean isDirty() { if (isDirty) { return true; } else { for (Planet planet : getPlanets()) { if (planet.isDirty()) { return true; } } } return false; } public void markDirty() { this.isDirty = true; } //endregion }