Added unit tests for Java, JavaScript and JSON mods

This commit is contained in:
Anuken
2021-06-12 20:59:28 -04:00
parent d6016f1b04
commit 347b38ba26
20 changed files with 587 additions and 397 deletions

View File

@@ -16,7 +16,6 @@ import mindustry.world.blocks.defense.*;
import mindustry.world.blocks.defense.turrets.*;
import mindustry.world.blocks.distribution.*;
import mindustry.world.blocks.environment.*;
import mindustry.world.blocks.experimental.*;
import mindustry.world.blocks.legacy.*;
import mindustry.world.blocks.liquid.*;
import mindustry.world.blocks.logic.*;

View File

@@ -3,6 +3,7 @@ package mindustry.graphics;
import arc.*;
import arc.graphics.*;
import arc.graphics.gl.*;
import arc.util.*;
import static mindustry.Vars.*;
@@ -53,7 +54,7 @@ public class CacheLayer{
}
public static class ShaderLayer extends CacheLayer{
public Shader shader;
public @Nullable Shader shader;
public ShaderLayer(Shader shader){
//shader will be null on headless backend, but that's ok

View File

@@ -2,6 +2,7 @@ package mindustry.mod;
import arc.struct.*;
import mindustry.world.blocks.environment.*;
import mindustry.world.blocks.payloads.*;
/** Generated class. Maps simple class names to concrete classes. For use in JSON mods. */
@SuppressWarnings("deprecation")
@@ -183,10 +184,10 @@ public class ClassMap{
classes.put("TreeBlock", mindustry.world.blocks.environment.TreeBlock.class);
classes.put("WallOreBlock", mindustry.world.blocks.environment.WallOreBlock.class);
classes.put("WobbleProp", mindustry.world.blocks.environment.WobbleProp.class);
classes.put("BlockLoader", mindustry.world.blocks.experimental.BlockLoader.class);
classes.put("BlockLoaderBuild", mindustry.world.blocks.experimental.BlockLoader.BlockLoaderBuild.class);
classes.put("BlockUnloader", mindustry.world.blocks.experimental.BlockUnloader.class);
classes.put("BlockUnloaderBuild", mindustry.world.blocks.experimental.BlockUnloader.BlockUnloaderBuild.class);
classes.put("BlockLoader", BlockLoader.class);
classes.put("BlockLoaderBuild", BlockLoader.BlockLoaderBuild.class);
classes.put("BlockUnloader", BlockUnloader.class);
classes.put("BlockUnloaderBuild", BlockUnloader.BlockUnloaderBuild.class);
classes.put("LegacyBlock", mindustry.world.blocks.legacy.LegacyBlock.class);
classes.put("LegacyMechPad", mindustry.world.blocks.legacy.LegacyMechPad.class);
classes.put("LegacyMechPadBuild", mindustry.world.blocks.legacy.LegacyMechPad.LegacyMechPadBuild.class);
@@ -237,7 +238,7 @@ public class ClassMap{
classes.put("PayloadSource", mindustry.world.blocks.payloads.PayloadSource.class);
classes.put("PayloadSourceBuild", mindustry.world.blocks.payloads.PayloadSource.PayloadSourceBuild.class);
classes.put("PayloadVoid", mindustry.world.blocks.payloads.PayloadVoid.class);
classes.put("BlockLoaderBuild", mindustry.world.blocks.payloads.PayloadVoid.BlockLoaderBuild.class);
classes.put("BlockLoaderBuild", PayloadVoid.PayloadVoidBuild.class);
classes.put("UnitPayload", mindustry.world.blocks.payloads.UnitPayload.class);
classes.put("Battery", mindustry.world.blocks.power.Battery.class);
classes.put("BatteryBuild", mindustry.world.blocks.power.Battery.BatteryBuild.class);

View File

@@ -0,0 +1,14 @@
package mindustry.world.blocks.experimental;
@Deprecated
public class BlockForge extends mindustry.world.blocks.payloads.BlockForge{
public BlockForge(String name){
super(name);
}
@Deprecated
public class BlockForgeBuild extends mindustry.world.blocks.payloads.BlockForge.BlockForgeBuild{
}
}

View File

@@ -1,148 +1,14 @@
package mindustry.world.blocks.experimental;
import arc.*;
import arc.graphics.g2d.*;
import arc.util.*;
import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.blocks.payloads.*;
import static mindustry.Vars.*;
public class BlockLoader extends PayloadBlock{
public final int timerLoad = timers++;
public float loadTime = 2f;
public int itemsLoaded = 5;
public float liquidsLoaded = 5f;
public int maxBlockSize = 2;
@Deprecated
public class BlockLoader extends mindustry.world.blocks.payloads.BlockLoader{
public BlockLoader(String name){
super(name);
hasItems = true;
itemCapacity = 25;
//liquidCapacity = 25;
update = true;
outputsPayload = true;
size = 3;
rotate = true;
}
@Override
public TextureRegion[] icons(){
return new TextureRegion[]{region, inRegion, outRegion, topRegion};
}
@Deprecated
public class BlockLoaderBuild extends mindustry.world.blocks.payloads.BlockLoader.BlockLoaderBuild{
@Override
public boolean outputsItems(){
return false;
}
@Override
public void setBars(){
super.setBars();
bars.add("progress", (BlockLoaderBuild entity) -> new Bar(() -> Core.bundle.format("bar.items", entity.payload == null ? 0 : entity.payload.build.items.total()), () -> Pal.items, entity::fraction));
}
@Override
public void drawRequestRegion(BuildPlan req, Eachable<BuildPlan> list){
Draw.rect(region, req.drawx(), req.drawy());
Draw.rect(inRegion, req.drawx(), req.drawy(), req.rotation * 90);
Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90);
Draw.rect(topRegion, req.drawx(), req.drawy());
}
public class BlockLoaderBuild extends PayloadBlockBuild<BuildPayload>{
@Override
public boolean acceptPayload(Building source, Payload payload){
return super.acceptPayload(source, payload) &&
(payload instanceof BuildPayload build) &&
((build.build.block.hasItems && build.block().unloadable && build.block().itemCapacity >= 10 && build.block().size <= maxBlockSize)/* ||
((BlockPayload)payload).entity.block().hasLiquids && ((BlockPayload)payload).block().liquidCapacity >= 10f)*/);
}
@Override
public boolean acceptItem(Building source, Item item){
return items.total() < itemCapacity;
}
@Override
public void draw(){
Draw.rect(region, x, y);
//draw input
boolean fallback = true;
for(int i = 0; i < 4; i++){
if(blends(i) && i != rotation){
Draw.rect(inRegion, x, y, (i * 90) - 180);
fallback = false;
}
}
if(fallback) Draw.rect(inRegion, x, y, rotation * 90);
Draw.rect(outRegion, x, y, rotdeg());
Draw.z(Layer.blockOver);
drawPayload();
Draw.z(Layer.blockOver + 0.1f);
Draw.rect(topRegion, x, y);
}
@Override
public void updateTile(){
if(shouldExport()){
moveOutPayload();
}else if(moveInPayload()){
//load up items
if(payload.block().hasItems && items.any()){
if(efficiency() > 0.01f && timer(timerLoad, loadTime / efficiency())){
//load up items a set amount of times
for(int j = 0; j < itemsLoaded && items.any(); j++){
for(int i = 0; i < items.length(); i++){
if(items.get(i) > 0){
Item item = content.item(i);
if(payload.build.acceptItem(payload.build, item)){
payload.build.handleItem(payload.build, item);
items.remove(item, 1);
break;
}
}
}
}
}
}
//load up liquids (disabled)
/*
if(payload.block().hasLiquids && liquids.total() >= 0.001f){
Liquid liq = liquids.current();
float total = liquids.currentAmount();
float flow = Math.min(Math.min(liquidsLoaded * delta(), payload.block().liquidCapacity - payload.entity.liquids.get(liq) - 0.0001f), total);
if(payload.entity.acceptLiquid(payload.entity, liq, flow)){
payload.entity.liquids.add(liq, flow);
liquids.remove(liq, flow);
}
}*/
}
}
public float fraction(){
return payload == null ? 0f : payload.build.items.total() / (float)payload.build.block.itemCapacity;
}
public boolean shouldExport(){
return payload != null &&
((payload.block().hasLiquids && payload.build.liquids.total() >= payload.block().liquidCapacity - 0.001f) ||
(payload.block().hasItems && payload.build.items.total() >= payload.block().itemCapacity));
}
}
}

View File

@@ -1,67 +1,14 @@
package mindustry.world.blocks.experimental;
import mindustry.gen.*;
import mindustry.type.*;
import static mindustry.Vars.*;
public class BlockUnloader extends BlockLoader{
@Deprecated
public class BlockUnloader extends mindustry.world.blocks.payloads.BlockUnloader{
public BlockUnloader(String name){
super(name);
}
@Override
public boolean outputsItems(){
return true;
}
@Deprecated
public class BlockUnloaderBuild extends mindustry.world.blocks.payloads.BlockUnloader.BlockUnloaderBuild{
@Override
public boolean rotatedOutput(int x, int y){
return false;
}
public class BlockUnloaderBuild extends BlockLoaderBuild{
@Override
public boolean acceptItem(Building source, Item item){
return false;
}
@Override
public void updateTile(){
if(shouldExport()){
moveOutPayload();
}else if(moveInPayload()){
//load up items
if(payload.block().hasItems && !full()){
if(efficiency() > 0.01f && timer(timerLoad, loadTime / efficiency())){
//load up items a set amount of times
for(int j = 0; j < itemsLoaded && !full(); j++){
for(int i = 0; i < items.length(); i++){
if(payload.build.items.get(i) > 0){
Item item = content.item(i);
payload.build.items.remove(item, 1);
items.add(item, 1);
break;
}
}
}
}
}
}
dump();
}
public boolean full(){
return items.total() >= itemCapacity;
}
@Override
public boolean shouldExport(){
return payload != null && (payload.block().hasItems && payload.build.items.empty());
}
}
}

View File

@@ -0,0 +1,147 @@
package mindustry.world.blocks.payloads;
import arc.*;
import arc.graphics.g2d.*;
import arc.util.*;
import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.type.*;
import mindustry.ui.*;
import static mindustry.Vars.*;
public class BlockLoader extends PayloadBlock{
public final int timerLoad = timers++;
public float loadTime = 2f;
public int itemsLoaded = 5;
public float liquidsLoaded = 5f;
public int maxBlockSize = 2;
public BlockLoader(String name){
super(name);
hasItems = true;
itemCapacity = 25;
//liquidCapacity = 25;
update = true;
outputsPayload = true;
size = 3;
rotate = true;
}
@Override
public TextureRegion[] icons(){
return new TextureRegion[]{region, inRegion, outRegion, topRegion};
}
@Override
public boolean outputsItems(){
return false;
}
@Override
public void setBars(){
super.setBars();
bars.add("progress", (BlockLoaderBuild entity) -> new Bar(() -> Core.bundle.format("bar.items", entity.payload == null ? 0 : entity.payload.build.items.total()), () -> Pal.items, entity::fraction));
}
@Override
public void drawRequestRegion(BuildPlan req, Eachable<BuildPlan> list){
Draw.rect(region, req.drawx(), req.drawy());
Draw.rect(inRegion, req.drawx(), req.drawy(), req.rotation * 90);
Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90);
Draw.rect(topRegion, req.drawx(), req.drawy());
}
public class BlockLoaderBuild extends PayloadBlockBuild<BuildPayload>{
@Override
public boolean acceptPayload(Building source, Payload payload){
return super.acceptPayload(source, payload) &&
(payload instanceof BuildPayload build) &&
((build.build.block.hasItems && build.block().unloadable && build.block().itemCapacity >= 10 && build.block().size <= maxBlockSize)/* ||
((BlockPayload)payload).entity.block().hasLiquids && ((BlockPayload)payload).block().liquidCapacity >= 10f)*/);
}
@Override
public boolean acceptItem(Building source, Item item){
return items.total() < itemCapacity;
}
@Override
public void draw(){
Draw.rect(region, x, y);
//draw input
boolean fallback = true;
for(int i = 0; i < 4; i++){
if(blends(i) && i != rotation){
Draw.rect(inRegion, x, y, (i * 90) - 180);
fallback = false;
}
}
if(fallback) Draw.rect(inRegion, x, y, rotation * 90);
Draw.rect(outRegion, x, y, rotdeg());
Draw.z(Layer.blockOver);
drawPayload();
Draw.z(Layer.blockOver + 0.1f);
Draw.rect(topRegion, x, y);
}
@Override
public void updateTile(){
if(shouldExport()){
moveOutPayload();
}else if(moveInPayload()){
//load up items
if(payload.block().hasItems && items.any()){
if(efficiency() > 0.01f && timer(timerLoad, loadTime / efficiency())){
//load up items a set amount of times
for(int j = 0; j < itemsLoaded && items.any(); j++){
for(int i = 0; i < items.length(); i++){
if(items.get(i) > 0){
Item item = content.item(i);
if(payload.build.acceptItem(payload.build, item)){
payload.build.handleItem(payload.build, item);
items.remove(item, 1);
break;
}
}
}
}
}
}
//load up liquids (disabled)
/*
if(payload.block().hasLiquids && liquids.total() >= 0.001f){
Liquid liq = liquids.current();
float total = liquids.currentAmount();
float flow = Math.min(Math.min(liquidsLoaded * delta(), payload.block().liquidCapacity - payload.entity.liquids.get(liq) - 0.0001f), total);
if(payload.entity.acceptLiquid(payload.entity, liq, flow)){
payload.entity.liquids.add(liq, flow);
liquids.remove(liq, flow);
}
}*/
}
}
public float fraction(){
return payload == null ? 0f : payload.build.items.total() / (float)payload.build.block.itemCapacity;
}
public boolean shouldExport(){
return payload != null &&
((payload.block().hasLiquids && payload.build.liquids.total() >= payload.block().liquidCapacity - 0.001f) ||
(payload.block().hasItems && payload.build.items.total() >= payload.block().itemCapacity));
}
}
}

View File

@@ -0,0 +1,67 @@
package mindustry.world.blocks.payloads;
import mindustry.gen.*;
import mindustry.type.*;
import static mindustry.Vars.*;
public class BlockUnloader extends BlockLoader{
public BlockUnloader(String name){
super(name);
}
@Override
public boolean outputsItems(){
return true;
}
@Override
public boolean rotatedOutput(int x, int y){
return false;
}
public class BlockUnloaderBuild extends BlockLoaderBuild{
@Override
public boolean acceptItem(Building source, Item item){
return false;
}
@Override
public void updateTile(){
if(shouldExport()){
moveOutPayload();
}else if(moveInPayload()){
//load up items
if(payload.block().hasItems && !full()){
if(efficiency() > 0.01f && timer(timerLoad, loadTime / efficiency())){
//load up items a set amount of times
for(int j = 0; j < itemsLoaded && !full(); j++){
for(int i = 0; i < items.length(); i++){
if(payload.build.items.get(i) > 0){
Item item = content.item(i);
payload.build.items.remove(item, 1);
items.add(item, 1);
break;
}
}
}
}
}
}
dump();
}
public boolean full(){
return items.total() >= itemCapacity;
}
@Override
public boolean shouldExport(){
return payload != null && (payload.block().hasItems && payload.build.items.empty());
}
}
}

View File

@@ -29,7 +29,7 @@ public class PayloadVoid extends PayloadBlock{
return new TextureRegion[]{region, topRegion};
}
public class BlockLoaderBuild extends PayloadBlockBuild<Payload>{
public class PayloadVoidBuild extends PayloadBlockBuild<Payload>{
@Override
public void draw(){