Improved stat system

This commit is contained in:
Anuken
2018-06-16 23:17:47 -04:00
parent eb99132b8c
commit 77856a3ff7
19 changed files with 195 additions and 93 deletions

View File

@ -22,11 +22,7 @@ import io.anuke.mindustry.input.CursorType;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.meta.BlockBars;
import io.anuke.mindustry.world.meta.BlockFlag;
import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.mindustry.world.meta.BlockStats;
import io.anuke.mindustry.world.meta.*;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Hue;
@ -101,11 +97,11 @@ public class Block extends BaseBlock implements UnlockableContent{
/**whether this block has instant transfer checking. used for calculations to prevent infinite loops.*/
public boolean instantTransfer = false;
/**The block group. Unless {@link #canReplace} is overriden, blocks in the same group can replace each other.*/
public io.anuke.mindustry.world.meta.BlockGroup group = io.anuke.mindustry.world.meta.BlockGroup.none;
public BlockGroup group = BlockGroup.none;
/**list of displayed block status bars. Defaults to health bar.*/
public io.anuke.mindustry.world.meta.BlockBars bars = new BlockBars();
public BlockBars bars = new BlockBars();
/**List of block stats.*/
public io.anuke.mindustry.world.meta.BlockStats stats = new BlockStats();
public BlockStats stats = new BlockStats();
/**List of block flags. Used for AI indexing.*/
public EnumSet<BlockFlag> flags;
/**Whether to automatically set the entity to 'sleeping' when created.*/
@ -218,12 +214,12 @@ public class Block extends BaseBlock implements UnlockableContent{
}
public void setStats(){
stats.add("size", size);
stats.add("health", health);
stats.add(BlockStat.size, "{0}x{0}", size);
stats.add(BlockStat.health, health);
if(hasPower) stats.add("powercapacity", powerCapacity);
if(hasLiquids) stats.add("liquidcapacity", liquidCapacity);
if(hasItems) stats.add("capacity", itemCapacity);
if(hasPower) stats.add(BlockStat.powerCapacity, powerCapacity);
if(hasLiquids) stats.add(BlockStat.liquidCapacity, liquidCapacity);
if(hasItems) stats.add(BlockStat.itemCapacity, itemCapacity);
}
//TODO make this easier to config.

View File

@ -12,8 +12,8 @@ import io.anuke.ucore.graphics.Hue;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
//TODO remove
public class RepairTurret extends PowerTurret {
protected float repairFrac = 1f / 135f;
@ -27,7 +27,7 @@ public class RepairTurret extends PowerTurret {
public void setStats(){
super.setStats();
stats.add("repairssecond", Strings.toFixed(60f/reload * repairFrac * 100, 1) + "%");
//stats.add("repairssecond", Strings.toFixed(60f/reload * repairFrac * 100, 1) + "%");
}
@Override

View File

@ -8,11 +8,11 @@ import io.anuke.mindustry.world.blocks.PowerBlock;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.impl.BulletEntity;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
import static io.anuke.mindustry.Vars.headless;
import static io.anuke.mindustry.Vars.renderer;
//TODO remove
public class ShieldBlock extends PowerBlock{
public float shieldRadius = 40f;
public float powerDrain = 0.005f;
@ -29,9 +29,9 @@ public class ShieldBlock extends PowerBlock{
@Override
public void setStats(){
super.setStats();
stats.add("powersecond", Strings.toFixed(powerDrain*60, 2));
stats.add("powerdraindamage", Strings.toFixed(powerPerDamage, 2));
stats.add("shieldradius", (int)shieldRadius);
//stats.add("powersecond", Strings.toFixed(powerDrain*60, 2));
//stats.add("powerdraindamage", Strings.toFixed(powerPerDamage, 2));
//stats.add("shieldradius", (int)shieldRadius);
}
@Override

View File

@ -6,11 +6,11 @@ import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.PowerBlock;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Strings;
import static io.anuke.mindustry.Vars.renderer;
import static io.anuke.mindustry.Vars.tilesize;
//TODO remove
public class ShieldedWallBlock extends PowerBlock{
static final float hitTime = 18f;
static final Color hitColor = Color.SKY.cpy().mul(1.2f);
@ -44,7 +44,7 @@ public class ShieldedWallBlock extends PowerBlock{
@Override
public void setStats(){
super.setStats();
stats.add("powerdraindamage", Strings.toFixed(powerPerDamage, 2));
//stats.add("powerdraindamage", Strings.toFixed(powerPerDamage, 2));
}
@Override

View File

@ -16,6 +16,7 @@ import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Graphics;
@ -81,11 +82,10 @@ public abstract class Turret extends Block{
if(ammo != null) stats.add("ammo", ammo);
if(ammo != null) stats.add("ammocapacity", maxAmmo);
if(ammo != null) stats.add("ammoitem", ammoMultiplier);*/
stats.add("range", (int)range);
stats.add("inaccuracy", (int)inaccuracy);
//stats.add("damageshot", bullet.damage);
stats.add("shotssecond", Strings.toFixed(60f/reload, 1));
stats.add("shots", shots);
stats.add(BlockStat.shootRange, (int)range);
stats.add(BlockStat.inaccuracy, (int)inaccuracy);
stats.add(BlockStat.reload, Strings.toFixed(60f/reload, 1));
stats.add(BlockStat.shots, shots);
}
@Override

View File

@ -3,7 +3,7 @@ package io.anuke.mindustry.world.blocks.defense.turrets;
import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.defense.Turret;
import io.anuke.ucore.util.Strings;
import io.anuke.mindustry.world.meta.BlockStat;
public abstract class PowerTurret extends Turret {
protected float powerUsed = 0.5f;
@ -17,7 +17,8 @@ public abstract class PowerTurret extends Turret {
@Override
public void setStats(){
super.setStats();
stats.add("powershot", Strings.toFixed(powerUsed, 1));
stats.add(BlockStat.powerShot, powerUsed);
}
@Override

View File

@ -7,8 +7,9 @@ import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.*;
@ -43,6 +44,7 @@ public class Conveyor extends Block{
group = BlockGroup.transportation;
hasItems = true;
autoSleep = true;
itemCapacity = Math.round(tilesize/ itemSpace);
}
@Override
@ -51,7 +53,7 @@ public class Conveyor extends Block{
@Override
public void setStats(){
super.setStats();
stats.add("itemspeedsecond", Strings.toFixed(speed * 60, 1));
stats.add(BlockStat.itemSpeed, speed * 60);
}
@Override

View File

@ -1,18 +1,17 @@
package io.anuke.mindustry.world.blocks.power;
import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@ -39,8 +38,9 @@ public class BurnerGenerator extends PowerGenerator {
@Override
public void setStats(){
super.setStats();
stats.add("powergenerationsecond", Strings.toFixed(powerOutput*60f, 2));
stats.add("generationsecondsitem", Strings.toFixed(itemDuration/60f, 2));
//TODO both of these depend on the item type, implement later
//stats.add("powergenerationsecond", Strings.toFixed(powerOutput*60f, 2));
//stats.add("generationsecondsitem", Strings.toFixed(itemDuration/60f, 2));
}
@Override

View File

@ -1,7 +1,7 @@
package io.anuke.mindustry.world.blocks.power;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.power.BurnerGenerator.BurnerEntity;
@ -10,8 +10,8 @@ import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
//TODO remove this class
public class LiquidBurnerGenerator extends PowerGenerator {
protected float minEfficiency = 0.2f;
protected float powerPerLiquid = 0.13f;
@ -29,8 +29,8 @@ public class LiquidBurnerGenerator extends PowerGenerator {
@Override
public void setStats(){
super.setStats();
stats.add("powerliquid", Strings.toFixed(powerPerLiquid, 2) + " power/liquid");
stats.add("maxliquidsecond", Strings.toFixed(maxLiquidGenerate*60f, 2) + " liquid/s");
//stats.add("powerliquid", Strings.toFixed(powerPerLiquid, 2) + " power/liquid");
//stats.add("maxliquidsecond", Strings.toFixed(maxLiquidGenerate*60f, 2) + " liquid/s");
}
@Override

View File

@ -2,20 +2,20 @@ package io.anuke.mindustry.world.blocks.power;
import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Damage;
import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.content.fx.ExplosionFx;
import io.anuke.mindustry.entities.Damage;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
import io.anuke.ucore.util.Translator;
import java.io.DataInputStream;
@ -60,11 +60,8 @@ public class NuclearReactor extends LiquidBurnerGenerator {
@Override
public void setStats(){
super.setStats();
stats.add("inputitem", generateItem);
stats.add("maxpowergenerationsecond", Strings.toFixed(powerMultiplier*60f, 2));
stats.remove("powerliquid");
stats.remove("maxliquidsecond");
stats.add(BlockStat.inputItem, generateItem.toString());
stats.add(BlockStat.maxPowerGeneration, powerMultiplier*60f);
}
@Override

View File

@ -13,6 +13,7 @@ import io.anuke.mindustry.net.In;
import io.anuke.mindustry.world.Edges;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.PowerBlock;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.core.Settings;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
@ -20,7 +21,6 @@ import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.graphics.Shapes;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
import io.anuke.ucore.util.Translator;
import java.io.DataInputStream;
@ -69,8 +69,8 @@ public class PowerDistributor extends PowerBlock{
public void setStats(){
super.setStats();
stats.add("lasertilerange", laserRange);
stats.add("maxpowertransfersecond", Strings.toFixed(powerSpeed * 60, 2));
stats.add(BlockStat.powerRange, laserRange);
stats.add(BlockStat.powerTransferSpeed, powerSpeed * 60);
}
@Override

View File

@ -4,21 +4,20 @@ import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.Liquids;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
public class Drill extends Block{
protected final static float hardnessDrillMultiplier = 50f;
@ -105,8 +104,7 @@ public class Drill extends Block{
@Override
public void setStats(){
super.setStats();
//TODO this is misleading, change it
stats.add("secondsitem", Strings.toFixed(drillTime/60, 1));
//TODO add drill speed stats
}
@Override

View File

@ -1,22 +1,22 @@
package io.anuke.mindustry.world.blocks.production;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@ -56,10 +56,11 @@ public class GenericCrafter extends Block{
@Override
public void setStats(){
super.setStats();
stats.add("maxitemssecond", Strings.toFixed(60f/craftTime, 1));
if(inputLiquid != null) stats.add("inputliquid", inputLiquid + " x " + (int)(liquidUse * craftTime));
if(inputItem != null) stats.add("inputitem", inputItem + " x " + inputItem.amount);
stats.add("output", output);
stats.add(BlockStat.craftSpeed, 60f/craftTime);
stats.add(BlockStat.outputItem, output.toString());
if(inputLiquid != null) stats.add(BlockStat.inputLiquid, "{0} x {1}", inputLiquid, (int)(liquidUse * craftTime));
if(inputItem != null) stats.add(BlockStat.inputItem, "{0} x {1}", inputItem, inputItem.amount);
}
@Override

View File

@ -1,25 +1,26 @@
package io.anuke.mindustry.world.blocks.production;
import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.PowerBlock;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Fill;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class PowerSmelter extends PowerBlock {
protected final int timerDump = timers++;
@ -63,12 +64,13 @@ public class PowerSmelter extends PowerBlock {
public void setStats(){
super.setStats();
//TODO input/outputs
// stats.add("input", Arrays.toString(inputs));
stats.add("powersecond", Strings.toFixed(powerUse *60f, 2));
//stats.add("output", result);
stats.add("maxoutputsecond", Strings.toFixed(60f/craftTime, 1));
stats.add("inputcapacity", capacity);
stats.add("outputcapacity", capacity);
stats.add(BlockStat.inputItems, Arrays.toString(inputs));
stats.add(BlockStat.powerUse, powerUse * 60f);
stats.add(BlockStat.outputItem, result.toString());
stats.add(BlockStat.craftSpeed, 60f/craftTime);
stats.add(BlockStat.inputItemCapacity, capacity);
stats.add(BlockStat.outputItemCapacity, capacity);
}
@Override

View File

@ -7,10 +7,10 @@ import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.LiquidBlock;
import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
public class Pump extends LiquidBlock{
protected final Array<Tile> drawTiles = new Array<>();
@ -34,7 +34,7 @@ public class Pump extends LiquidBlock{
@Override
public void setStats(){
super.setStats();
stats.add("liquidsecond", Strings.toFixed(60f*pumpAmount, 1));
stats.add(BlockStat.liquidOutput, 60f*pumpAmount);
}
@Override

View File

@ -1,20 +1,20 @@
package io.anuke.mindustry.world.blocks.production;
import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Fill;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
import java.util.Arrays;
@ -49,13 +49,14 @@ public class Smelter extends Block{
@Override
public void setStats(){
super.setStats();
stats.add("input", Arrays.toString(inputs));
stats.add("fuel", fuel);
stats.add("output", result);
stats.add("fuelduration", Strings.toFixed(burnDuration/60f, 1));
stats.add("maxoutputsecond", Strings.toFixed(60f/craftTime, 1));
stats.add("inputcapacity", capacity);
stats.add("outputcapacity", capacity);
stats.add(BlockStat.inputFuel, fuel.toString());
stats.add(BlockStat.fuelBurnTime, burnDuration/60f);
stats.add(BlockStat.inputItems, Arrays.toString(inputs));
stats.add(BlockStat.outputItem, result.toString());
stats.add(BlockStat.craftSpeed, 60f/craftTime);
stats.add(BlockStat.inputItemCapacity, capacity);
stats.add(BlockStat.outputItemCapacity, capacity);
}
@Override

View File

@ -0,0 +1,44 @@
package io.anuke.mindustry.world.meta;
/**Describes one type of stat for a block.*/
public enum BlockStat {
health(StatCategory.general),
size(StatCategory.general),
itemCapacity(StatCategory.items),
inputItemCapacity(StatCategory.items),
outputItemCapacity(StatCategory.items),
itemSpeed(StatCategory.items),
liquidCapacity(StatCategory.liquids),
liquidOutput(StatCategory.liquids),
powerCapacity(StatCategory.power),
powerUse(StatCategory.power),
powerRange(StatCategory.power),
powerTransferSpeed(StatCategory.power),
maxPowerGeneration(StatCategory.power),
inputLiquid(StatCategory.crafting),
inputItem(StatCategory.crafting),
inputItems(StatCategory.crafting),
inputFuel(StatCategory.crafting),
fuelBurnTime(StatCategory.crafting),
craftSpeed(StatCategory.crafting),
outputItem(StatCategory.crafting),
shootRange(StatCategory.shooting),
inaccuracy(StatCategory.shooting),
shots(StatCategory.shooting),
reload(StatCategory.shooting),
powerShot(StatCategory.shooting),
;
public final StatCategory category;
BlockStat(StatCategory category) {
this.category = category;
}
}

View File

@ -1,23 +1,72 @@
package io.anuke.mindustry.world.meta;
import com.badlogic.gdx.utils.ObjectMap.Entry;
import com.badlogic.gdx.utils.OrderedMap;
import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Log;
import io.anuke.ucore.util.Strings;
/**Hold and organizes a list of block stats.*/
public class BlockStats {
private OrderedMap<String, Object> map = new OrderedMap<>();
//TODO change back to true
private static final boolean errorWhenMissing = false;
public void add(String label, Object value){
if(!Bundles.has("text.blocks." + label)) throw new RuntimeException("No bundle entry for description label \"" + label + "\"!");
if(map.containsKey(label)) throw new RuntimeException("Duplicate label entry: \"" +label + "\"");
map.put(label, value);
private OrderedMap<StatCategory, OrderedMap<BlockStat, String>> map = new OrderedMap<>();
private boolean dirty;
/**Adds a single integer value with this stat.*/
public void add(BlockStat stat, int value){
add(stat, "" + value);
}
public void remove(String label){
Object o = map.remove(label);
if(o == null) throw new RuntimeException("No label entry found with name \"" + label + "\"!");
/**Adds a single float value with this stat, formatted to 2 decimal places.*/
public void add(BlockStat stat, float value){
add(stat, Strings.toFixed(value, 2));
}
public OrderedMap<String, Object> getMap() {
/**Adds a formatted string with this stat.*/
public void add(BlockStat stat, String format, Object... arguments){
if(!Bundles.has("text.blocks." + stat.name())){
if(!errorWhenMissing){
Log.err("Warning: No bundle entry for stat type \"" + stat + "\"!");
}else{
throw new RuntimeException("No bundle entry for stat type \"" + stat + "\"!");
}
}
if(map.containsKey(stat.category) && map.get(stat.category).containsKey(stat)){
throw new RuntimeException("Duplicate stat entry: \"" +stat + "\"");
}
if(!map.containsKey(stat.category)){
map.put(stat.category, new OrderedMap<>());
}
map.get(stat.category).put(stat, Strings.formatArgs(format, arguments));
dirty = true;
}
public void remove(BlockStat stat){
if(!map.containsKey(stat.category) || !map.get(stat.category).containsKey(stat)){
throw new RuntimeException("No stat entry found: \"" + stat + "\"!");
}
map.get(stat.category).remove(stat);
dirty = true;
}
public OrderedMap<StatCategory, OrderedMap<BlockStat, String>> toMap() {
//sort stats by index if they've been modified
if(dirty) {
map.orderedKeys().sort();
for (Entry<StatCategory, OrderedMap<BlockStat, String>> entry : map.entries()) {
entry.value.orderedKeys().sort();
}
dirty = false;
}
return map;
}
}

View File

@ -0,0 +1,11 @@
package io.anuke.mindustry.world.meta;
/**A specific category for a stat.*/
public enum StatCategory {
general,
power,
liquids,
items,
crafting,
shooting
}