# Conflicts:

#	core/src/mindustry/mod/ClassMap.java
This commit is contained in:
Anuken
2021-06-15 19:29:12 -04:00
parent ac111677c0
commit eed91eaaa0
72 changed files with 820 additions and 704 deletions

View File

@@ -83,7 +83,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
Fonts.loadDefaultFont();
//load fallback atlas if max texture size is below 4096
assets.load(new AssetDescriptor<>(maxTextureSize >= 4096 ? "sprites/sprites.aatls" : "sprites/fallback/sprites.aatls", TextureAtlas.class)).loaded = t -> atlas = (TextureAtlas)t;
assets.load(new AssetDescriptor<>(maxTextureSize >= 4096 ? "sprites/sprites.aatls" : "sprites/fallback/sprites.aatls", TextureAtlas.class)).loaded = t -> atlas = (TextureAtlas)t;
assets.loadRun("maps", Map.class, () -> maps.loadPreviews());
Musics.load();

View File

@@ -289,7 +289,7 @@ public class BaseAI{
}
Tile o = world.tile(tile.x + p.x, tile.y + p.y);
if(o != null && (o.block() instanceof PayloadBlock || o.block() instanceof PayloadConveyor)){
if(o != null && (o.block() instanceof PayloadBlock || o.block() instanceof PayloadConveyor || o.block() instanceof ShockMine)){
continue outer;
}

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

@@ -612,9 +612,9 @@ public class UnitTypes implements ContentList{
bullet = new LiquidBulletType(Liquids.slag){{
damage = 11;
speed = 2.4f;
drag = 0.01f;
drag = 0.009f;
shootEffect = Fx.shootSmall;
lifetime = 56f;
lifetime = 57f;
collidesAir = false;
}};
}});

View File

@@ -323,13 +323,14 @@ public class Control implements ApplicationListener, Loadable{
if(slot != null && !clearSectors){
try{
boolean hadNoCore = !sector.info.hasCore;
reloader.begin();
slot.load();
slot.setAutosave(true);
state.rules.sector = sector;
//if there is no base, simulate a new game and place the right loadout at the spawn position
if(state.rules.defaultTeam.cores().isEmpty()){
if(state.rules.defaultTeam.cores().isEmpty() || hadNoCore){
//no spawn set -> delete the sector save
if(sector.info.spawnPosition == 0){

View File

@@ -79,15 +79,6 @@ public interface Platform{
}
default Context getScriptContext(){
ContextFactory.getGlobalSetter().setContextFactoryGlobal(new ContextFactory(){
@Override
protected Context makeContext(){
Context ctx = super.makeContext();
ctx.setClassShutter(Scripts::allowClass);
return ctx;
}
});
Context c = Context.enter();
c.setOptimizationLevel(9);
return c;

View File

@@ -164,7 +164,7 @@ public class MapGenerateDialog extends BaseDialog{
for(int x = 0; x < editor.width(); x++){
for(int y = 0; y < editor.height(); y++){
Tile tile = editor.tile(x, y);
input.apply(x, y, tile.block(), tile.floor(), tile.overlay());
input.set(x, y, tile.block(), tile.floor(), tile.overlay());
filter.apply(input);
writeTiles[x + y*world.width()] = PackTile.get(input.block.id, input.floor.id, input.overlay.id);
}
@@ -340,6 +340,7 @@ public class MapGenerateDialog extends BaseDialog{
if(filter.isPost() && applied) continue;
p.button((icon == '\0' ? "" : icon + " ") + filter.name(), Styles.cleart, () -> {
filter.randomize();
filters.add(filter);
rebuildFilters();
update();
@@ -419,7 +420,7 @@ public class MapGenerateDialog extends BaseDialog{
pixmap.each((px, py) -> {
int x = px * scaling, y = py * scaling;
long tile = buffer1[px + py * w];
input.apply(x, y, content.block(PackTile.block(tile)), content.block(PackTile.floor(tile)), content.block(PackTile.overlay(tile)));
input.set(x, y, content.block(PackTile.block(tile)), content.block(PackTile.floor(tile)), content.block(PackTile.overlay(tile)));
filter.apply(input);
buffer2[px + py * w] = PackTile.get(input.block.id, input.floor.id, input.overlay.id);
});

View File

@@ -3,6 +3,7 @@ package mindustry.editor;
import arc.*;
import arc.scene.ui.*;
import arc.struct.*;
import arc.util.*;
import mindustry.*;
import mindustry.game.*;
import mindustry.io.*;
@@ -73,8 +74,12 @@ public class MapInfoDialog extends BaseDialog{
t.row();
t.add("@editor.generation").padRight(8).left();
t.button("@edit", () -> {
generate.show(Vars.maps.readFilters(editor.tags.get("genfilters", "")),
filters -> editor.tags.put("genfilters", JsonIO.write(filters)));
generate.show(maps.readFilters(editor.tags.get("genfilters", "")),
filters -> {
//reset seed to 0 so it is not written
filters.each(f -> f.seed = 0);
editor.tags.put("genfilters", JsonIO.write(filters));
});
hide();
}).left().width(200f);

View File

@@ -59,12 +59,12 @@ public class ParticleEffect extends Effect{
Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> {
Lines.lineAngle(ox + x, oy + y, Mathf.angle(x, y), len);
Drawf.light(ox + x, oy + y, len * lightScl, lightColor, lightOpacity);
Drawf.light(ox + x, oy + y, len * lightScl, lightColor, lightOpacity* Draw.getColor().a);
});
}else{
Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> {
Draw.rect(tex, ox + x, oy + y, rad, rad, e.rotation + offset + e.time * spin);
Drawf.light(ox + x, oy + y, rad * lightScl, lightColor, lightOpacity);
Drawf.light(ox + x, oy + y, rad * lightScl, lightColor, lightOpacity * Draw.getColor().a);
});
}
}

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

@@ -44,9 +44,7 @@ public class MenuRenderer implements Disposable{
Seq<Block> ores = content.blocks().select(b -> b instanceof OreBlock && !(b instanceof WallOreBlock));
shadows = new FrameBuffer(width, height);
int offset = Mathf.random(100000);
Simplex s1 = new Simplex(offset);
Simplex s2 = new Simplex(offset + 1);
Simplex s3 = new Simplex(offset + 2);
int s1 = offset, s2 = offset + 1, s3 = offset + 2;
Block[] selected = Structs.select(
new Block[]{Blocks.sand, Blocks.sandWall},
new Block[]{Blocks.shale, Blocks.shaleWall},
@@ -85,27 +83,27 @@ public class MenuRenderer implements Disposable{
Block ore = Blocks.air;
Block wall = Blocks.air;
if(s1.octaveNoise2D(3, 0.5, 1/20.0, x, y) > 0.5){
if(Simplex.noise2d(s1, 3, 0.5, 1/20.0, x, y) > 0.5){
wall = walld;
}
if(s3.octaveNoise2D(3, 0.5, 1/20.0, x, y) > 0.5){
if(Simplex.noise2d(s3, 3, 0.5, 1/20.0, x, y) > 0.5){
floor = floord2;
if(wall != Blocks.air){
wall = walld2;
}
}
if(s2.octaveNoise2D(3, 0.3, 1/30.0, x, y) > tr1){
if(Simplex.noise2d(s2, 3, 0.3, 1/30.0, x, y) > tr1){
ore = ore1;
}
if(s2.octaveNoise2D(2, 0.2, 1/15.0, x, y+99999) > tr2){
if(Simplex.noise2d(s2, 2, 0.2, 1/15.0, x, y+99999) > tr2){
ore = ore2;
}
if(doheat){
double heat = s3.octaveNoise2D(4, 0.6, 1 / 50.0, x, y + 9999);
double heat = Simplex.noise2d(s3, 4, 0.6, 1 / 50.0, x, y + 9999);
double base = 0.65;
if(heat > base){
@@ -126,7 +124,7 @@ public class MenuRenderer implements Disposable{
if(tech){
int mx = x % secSize, my = y % secSize;
int sclx = x / secSize, scly = y / secSize;
if(s1.octaveNoise2D(2, 1f / 10f, 0.5f, sclx, scly) > 0.4f && (mx == 0 || my == 0 || mx == secSize - 1 || my == secSize - 1)){
if(Simplex.noise2d(s1, 2, 1f / 10f, 0.5f, sclx, scly) > 0.4f && (mx == 0 || my == 0 || mx == secSize - 1 || my == secSize - 1)){
floor = Blocks.darkPanel3;
if(Mathf.dst(mx, my, secSize/2, secSize/2) > secSize/2f + 1){
floor = Blocks.darkPanel4;
@@ -140,7 +138,7 @@ public class MenuRenderer implements Disposable{
}
if(tendrils){
if(RidgedPerlin.noise2d(1 + offset, x, y, 1f / 17f) > 0f){
if(Ridged.noise2d(1 + offset, x, y, 1f / 17f) > 0f){
floor = Mathf.chance(0.2) ? Blocks.sporeMoss : Blocks.moss;
if(wall != Blocks.air){

View File

@@ -12,7 +12,6 @@ public class SunMesh extends HexMesh{
public SunMesh(Planet planet, int divisions, double octaves, double persistence, double scl, double pow, double mag, float colorScale, Color... colors){
super(planet, new HexMesher(){
Simplex sim = new Simplex();
@Override
public float getHeight(Vec3 position){
@@ -21,7 +20,7 @@ public class SunMesh extends HexMesh{
@Override
public Color getColor(Vec3 position){
double height = Math.pow(sim.octaveNoise3D(octaves, persistence, scl, position.x, position.y, position.z), pow) * mag;
double height = Math.pow(Simplex.noise3d(0, octaves, persistence, scl, position.x, position.y, position.z), pow) * mag;
return Tmp.c1.set(colors[Mathf.clamp((int)(height * colors.length), 0, colors.length - 1)]).mul(colorScale);
}
}, divisions, Shaders.unlit);

View File

@@ -28,9 +28,6 @@ import static mindustry.Vars.*;
public class LExecutor{
public static final int maxInstructions = 1000;
//for noise operations
public static final Simplex noise = new Simplex();
//special variables
public static final int
varCounter = 0,

View File

@@ -2,6 +2,7 @@ package mindustry.logic;
import arc.math.*;
import arc.util.*;
import arc.util.noise.*;
public enum LogicOp{
add("+", (a, b) -> a + b),
@@ -32,7 +33,7 @@ public enum LogicOp{
min("min", true, Math::min),
angle("angle", true, (x, y) -> Angles.angle((float)x, (float)y)),
len("len", true, (x, y) -> Mathf.dst((float)x, (float)y)),
noise("noise", true, LExecutor.noise::rawNoise2D),
noise("noise", true, (x, y) -> Simplex.raw2d(0, x, y)),
abs("abs", a -> Math.abs(a)),
log("log", Math::log),
log10("log10", Math::log10),

View File

@@ -1,6 +1,5 @@
package mindustry.maps.filters;
import arc.util.*;
import mindustry.content.*;
import mindustry.gen.*;
import mindustry.world.*;
@@ -13,12 +12,12 @@ public class BlendFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("radius", () -> radius, f -> radius = f, 1f, 10f),
new BlockOption("block", () -> block, b -> block = b, anyOptional),
new BlockOption("floor", () -> floor, b -> floor = b, anyOptional),
new BlockOption("ignore", () -> ignore, b -> ignore = b, floorsOptional)
);
return new FilterOption[]{
new SliderOption("radius", () -> radius, f -> radius = f, 1f, 10f),
new BlockOption("block", () -> block, b -> block = b, anyOptional),
new BlockOption("floor", () -> floor, b -> floor = b, anyOptional),
new BlockOption("ignore", () -> ignore, b -> ignore = b, floorsOptional)
};
}
@Override
@@ -32,7 +31,7 @@ public class BlendFilter extends GenerateFilter{
}
@Override
public void apply(){
public void apply(GenerateInput in){
if(in.floor == block || block == Blocks.air || in.floor == ignore || (!floor.isFloor() && (in.block == block || in.block == ignore))) return;
int rad = (int)radius;

View File

@@ -1,6 +1,5 @@
package mindustry.maps.filters;
import arc.util.*;
import mindustry.content.*;
import mindustry.gen.*;
import mindustry.world.*;
@@ -12,7 +11,9 @@ public class ClearFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(new BlockOption("block", () -> block, b -> block = b, b -> oresOnly.get(b) || wallsOnly.get(b)));
return new BlockOption[]{
new BlockOption("block", () -> block, b -> block = b, b -> oresOnly.get(b) || wallsOnly.get(b))
};
}
@Override
@@ -21,7 +22,7 @@ public class ClearFilter extends GenerateFilter{
}
@Override
public void apply(){
public void apply(GenerateInput in){
if(in.block == block){
in.block = Blocks.air;

View File

@@ -1,7 +1,6 @@
package mindustry.maps.filters;
import arc.struct.*;
import arc.util.*;
import mindustry.gen.*;
import mindustry.world.*;
import mindustry.world.blocks.storage.*;
@@ -14,10 +13,9 @@ public class CoreSpawnFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
//disabled until necessary
// SliderOption("amount", () -> amount, f -> amount = (int)f, 1, 10).display()
);
return new FilterOption[]{};
}
@Override

View File

@@ -1,6 +1,5 @@
package mindustry.maps.filters;
import arc.util.*;
import mindustry.gen.*;
import mindustry.maps.filters.FilterOption.*;
import mindustry.world.*;
@@ -10,10 +9,10 @@ public class DistortFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 200f),
new SliderOption("mag", () -> mag, f -> mag = f, 0.5f, 100f)
);
return new SliderOption[]{
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 200f),
new SliderOption("mag", () -> mag, f -> mag = f, 0.5f, 100f)
};
}
@Override
@@ -27,8 +26,8 @@ public class DistortFilter extends GenerateFilter{
}
@Override
public void apply(){
Tile tile = in.tile(in.x + noise(in.x, in.y, scl, mag) - mag / 2f, in.y + noise(in.x, in.y + o, scl, mag) - mag / 2f);
public void apply(GenerateInput in){
Tile tile = in.tile(in.x + noise(in, scl, mag) - mag / 2f, in.y + noise(in, scl, mag) - mag / 2f);
in.floor = tile.floor();
if(!tile.block().synthetic() && !in.block.synthetic()) in.block = tile.block();

View File

@@ -1,7 +1,6 @@
package mindustry.maps.filters;
import arc.struct.*;
import arc.util.*;
import mindustry.content.*;
import mindustry.gen.*;
import mindustry.maps.filters.FilterOption.*;
@@ -13,9 +12,9 @@ public class EnemySpawnFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("amount", () -> amount, f -> amount = (int)f, 1, 10).display()
);
return new SliderOption[]{
new SliderOption("amount", () -> amount, f -> amount = (int)f, 1, 10).display()
};
}
@Override

View File

@@ -12,12 +12,9 @@ import mindustry.gen.*;
import mindustry.world.*;
public abstract class GenerateFilter{
protected transient float o = (float)(Math.random() * 10000000.0);
protected transient int seed;
protected transient GenerateInput in;
public int seed = 0;
public void apply(Tiles tiles, GenerateInput in){
this.in = in;
if(isBuffered()){
//buffer of tiles used, each tile packed into a long struct
@@ -26,8 +23,8 @@ public abstract class GenerateFilter{
for(int i = 0; i < tiles.width * tiles.height; i++){
Tile tile = tiles.geti(i);
in.apply(tile.x, tile.y, tile.block(), tile.floor(), tile.overlay());
apply();
in.set(tile.x, tile.y, tile.block(), tile.floor(), tile.overlay());
apply(in);
buffer[i] = PackTile.get(in.block.id, in.floor.id, in.overlay.id);
}
@@ -48,8 +45,8 @@ public abstract class GenerateFilter{
}
}else{
for(Tile tile : tiles){
in.apply(tile.x, tile.y, tile.block(), tile.floor(), tile.overlay());
apply();
in.set(tile.x, tile.y, tile.block(), tile.floor(), tile.overlay());
apply(in);
tile.setFloor(in.floor.asFloor());
tile.setOverlay(!in.floor.asFloor().hasSurface() && in.overlay.asFloor().needsSurface ? Blocks.air : in.overlay);
@@ -61,16 +58,11 @@ public abstract class GenerateFilter{
}
}
public final void apply(GenerateInput in){
this.in = in;
apply();
}
/** @return a new array of options for configuring this filter */
public abstract FilterOption[] options();
/** apply the actual filter on the input */
protected void apply(){}
public void apply(GenerateInput in){}
/** draw any additional guides */
public void draw(Image image){}
@@ -93,7 +85,7 @@ public abstract class GenerateFilter{
/** set the seed to a random number */
public void randomize(){
seed = Mathf.random(99999999);
seed = Mathf.random(999999999);
}
/** @return whether this filter needs a read/write buffer (e.g. not a 1:1 tile mapping). */
@@ -108,24 +100,26 @@ public abstract class GenerateFilter{
//utility generation functions
protected float noise(float x, float y, float scl, float mag){
return (float)in.noise.octaveNoise2D(1f, 0f, 1f / scl, x + o, y + o) * mag;
//TODO would be nice if these functions used the seed and ditched "in" completely; simplex should be stateless
protected float noise(GenerateInput in, float scl, float mag){
return (float)Simplex.noise2d(seed, 1f, 0f, 1f / scl, in.x, in.y) * mag;
}
protected float noise(float x, float y, float scl, float mag, float octaves, float persistence){
return (float)in.noise.octaveNoise2D(octaves, persistence, 1f / scl, x + o, y + o) * mag;
protected float noise(GenerateInput in, float scl, float mag, float octaves, float persistence){
return (float)Simplex.noise2d(seed, octaves, persistence, 1f / scl, in.x, in.y) * mag;
}
protected float rnoise(float x, float y, float scl, float mag){
return RidgedPerlin.noise2d(seed + 1, (int)(x + o), (int)(y + o), 1f / scl) * mag;
return Ridged.noise2d(seed + 1, (int)(x), (int)(y), 1f / scl) * mag;
}
protected float rnoise(float x, float y, int octaves, float scl, float falloff, float mag){
return RidgedPerlin.noise2d(seed + 1, (int)(x + o), (int)(y + o), octaves, falloff, 1f / scl) * mag;
return Ridged.noise2d(seed + 1, (int)(x), (int)(y), octaves, falloff, 1f / scl) * mag;
}
protected float chance(){
return Mathf.randomSeed(Pack.longInt(in.x, in.y + seed));
protected float chance(int x, int y){
return Mathf.randomSeed(Pack.longInt(x, y + seed));
}
/** an input for generating at a certain coordinate. should only be instantiated once. */
@@ -137,10 +131,9 @@ public abstract class GenerateFilter{
/** output parameters */
public Block floor, block, overlay;
Simplex noise = new Simplex();
TileProvider buffer;
public void apply(int x, int y, Block block, Block floor, Block overlay){
public void set(int x, int y, Block block, Block floor, Block overlay){
this.floor = floor;
this.block = block;
this.overlay = overlay;
@@ -152,7 +145,6 @@ public abstract class GenerateFilter{
this.buffer = buffer;
this.width = width;
this.height = height;
noise.setSeed(filter.seed);
}
Tile tile(float x, float y){

View File

@@ -2,7 +2,6 @@ package mindustry.maps.filters;
import arc.math.*;
import arc.struct.*;
import arc.util.*;
import mindustry.gen.*;
import mindustry.maps.filters.FilterOption.*;
import mindustry.world.*;
@@ -17,10 +16,10 @@ public class MedianFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("radius", () -> radius, f -> radius = f, 1f, 10f),
new SliderOption("percentile", () -> percentile, f -> percentile = f, 0f, 1f)
);
return new SliderOption[]{
new SliderOption("radius", () -> radius, f -> radius = f, 1f, 10f),
new SliderOption("percentile", () -> percentile, f -> percentile = f, 0f, 1f)
};
}
@Override
@@ -34,7 +33,7 @@ public class MedianFilter extends GenerateFilter{
}
@Override
public void apply(){
public void apply(GenerateInput in){
int rad = (int)radius;
blocks.clear();
floors.clear();

View File

@@ -12,17 +12,17 @@ import mindustry.maps.filters.FilterOption.*;
import mindustry.world.*;
public class MirrorFilter extends GenerateFilter{
private final Vec2 v1 = new Vec2(), v2 = new Vec2(), v3 = new Vec2();
private static final Vec2 v1 = new Vec2(), v2 = new Vec2(), v3 = new Vec2();
int angle = 45;
boolean rotate = false;
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("angle", () -> angle, f -> angle = (int)f, 0, 360, 45),
new ToggleOption("rotate", () -> rotate, f -> rotate = f)
);
return new FilterOption[]{
new SliderOption("angle", () -> angle, f -> angle = (int)f, 0, 360, 45),
new ToggleOption("rotate", () -> rotate, f -> rotate = f)
};
}
@Override
@@ -31,7 +31,7 @@ public class MirrorFilter extends GenerateFilter{
}
@Override
protected void apply(){
public void apply(GenerateInput in){
v1.trnsExact(angle - 90, 1f);
v2.set(v1).scl(-1f);
@@ -41,7 +41,7 @@ public class MirrorFilter extends GenerateFilter{
v3.set(in.x, in.y);
if(!left(v1, v2, v3)){
mirror(v3, v1.x, v1.y, v2.x, v2.y);
mirror(in.width, in.height, v3, v1.x, v1.y, v2.x, v2.y);
Tile tile = in.tile(v3.x, v3.y);
in.floor = tile.floor();
if(!tile.block().synthetic()){
@@ -73,11 +73,11 @@ public class MirrorFilter extends GenerateFilter{
Draw.reset();
}
void mirror(Vec2 p, float x0, float y0, float x1, float y1){
void mirror(int width, int height, Vec2 p, float x0, float y0, float x1, float y1){
//special case: uneven map mirrored at 45 degree angle (or someone might just want rotational symmetry)
if((in.width != in.height && angle % 90 != 0) || rotate){
p.x = in.width - p.x - 1;
p.y = in.height - p.y - 1;
if((width != height && angle % 90 != 0) || rotate){
p.x = width - p.x - 1;
p.y = height - p.y - 1;
}else{
float dx = x1 - x0;
float dy = y1 - y0;

View File

@@ -1,6 +1,5 @@
package mindustry.maps.filters;
import arc.util.*;
import mindustry.content.*;
import mindustry.gen.*;
import mindustry.world.*;
@@ -13,15 +12,15 @@ public class NoiseFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("target", () -> target, b -> target = b, anyOptional),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOptional),
new BlockOption("wall", () -> block, b -> block = b, wallsOptional)
);
return new FilterOption[]{
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("target", () -> target, b -> target = b, anyOptional),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOptional),
new BlockOption("wall", () -> block, b -> block = b, wallsOptional)
};
}
@Override
@@ -30,8 +29,8 @@ public class NoiseFilter extends GenerateFilter{
}
@Override
public void apply(){
float noise = noise(in.x, in.y, scl, 1f, octaves, falloff);
public void apply(GenerateInput in){
float noise = noise(in, scl, 1f, octaves, falloff);
if(noise > threshold && (target == Blocks.air || in.floor == target || in.block == target)){
if(floor != Blocks.air) in.floor = floor;

View File

@@ -1,6 +1,5 @@
package mindustry.maps.filters;
import arc.util.*;
import mindustry.content.*;
import mindustry.gen.*;
import mindustry.world.*;
@@ -13,14 +12,14 @@ public class OreFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("ore", () -> ore, b -> ore = b, oresOnly),
new BlockOption("target", () -> target, b -> target = b, oresFloorsOptional)
);
return new FilterOption[]{
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("ore", () -> ore, b -> ore = b, oresOnly),
new BlockOption("target", () -> target, b -> target = b, oresFloorsOptional)
};
}
@Override
@@ -29,8 +28,8 @@ public class OreFilter extends GenerateFilter{
}
@Override
public void apply(){
float noise = noise(in.x, in.y, scl, 1f, octaves, falloff);
public void apply(GenerateInput in){
float noise = noise(in, scl, 1f, octaves, falloff);
if(noise > threshold && in.overlay != Blocks.spawn && (target == Blocks.air || in.floor == target || in.overlay == target) && in.floor.asFloor().hasSurface()){
in.overlay = ore;

View File

@@ -2,7 +2,6 @@ package mindustry.maps.filters;
import arc.math.*;
import arc.struct.*;
import arc.util.*;
import mindustry.*;
import mindustry.content.*;
import mindustry.gen.*;
@@ -17,10 +16,10 @@ public class OreMedianFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("radius", () -> radius, f -> radius = f, 1f, 12f),
new SliderOption("percentile", () -> percentile, f -> percentile = f, 0f, 1f)
);
return new SliderOption[]{
new SliderOption("radius", () -> radius, f -> radius = f, 1f, 12f),
new SliderOption("percentile", () -> percentile, f -> percentile = f, 0f, 1f)
};
}
@Override
@@ -34,7 +33,7 @@ public class OreMedianFilter extends GenerateFilter{
}
@Override
public void apply(){
public void apply(GenerateInput in){
if(in.overlay == Blocks.spawn) return;
int cx = (in.x / 2) * 2;

View File

@@ -1,6 +1,5 @@
package mindustry.maps.filters;
import arc.util.*;
import mindustry.content.*;
import mindustry.gen.*;
import mindustry.world.*;
@@ -13,16 +12,16 @@ public class RiverNoiseFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, -1f, 1f),
new SliderOption("threshold2", () -> threshold2, f -> threshold2 = f, -1f, 1f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("block", () -> block, b -> block = b, wallsOnly),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly),
new BlockOption("floor2", () -> floor2, b -> floor2 = b, floorsOnly)
);
return new FilterOption[]{
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, -1f, 1f),
new SliderOption("threshold2", () -> threshold2, f -> threshold2 = f, -1f, 1f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("block", () -> block, b -> block = b, wallsOnly),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly),
new BlockOption("floor2", () -> floor2, b -> floor2 = b, floorsOnly)
};
}
@Override
@@ -31,7 +30,7 @@ public class RiverNoiseFilter extends GenerateFilter{
}
@Override
public void apply(){
public void apply(GenerateInput in){
float noise = rnoise(in.x, in.y, (int)octaves, scl, falloff, 1f);
if(noise >= threshold){

View File

@@ -1,6 +1,5 @@
package mindustry.maps.filters;
import arc.util.*;
import mindustry.content.*;
import mindustry.gen.*;
import mindustry.world.*;
@@ -13,12 +12,12 @@ public class ScatterFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("chance", () -> chance, f -> chance = f, 0f, 1f),
new BlockOption("flooronto", () -> flooronto, b -> flooronto = b, floorsOptional),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOptional),
new BlockOption("block", () -> block, b -> block = b, wallsOresOptional)
);
return new FilterOption[]{
new SliderOption("chance", () -> chance, f -> chance = f, 0f, 1f),
new BlockOption("flooronto", () -> flooronto, b -> flooronto = b, floorsOptional),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOptional),
new BlockOption("block", () -> block, b -> block = b, wallsOresOptional)
};
}
@Override
@@ -27,9 +26,9 @@ public class ScatterFilter extends GenerateFilter{
}
@Override
public void apply(){
public void apply(GenerateInput in){
if(block != Blocks.air && (in.floor == flooronto || flooronto == Blocks.air) && in.block == Blocks.air && chance() <= chance){
if(block != Blocks.air && (in.floor == flooronto || flooronto == Blocks.air) && in.block == Blocks.air && chance(in.x, in.y) <= chance){
if(!block.isOverlay()){
in.block = block;
}else{
@@ -37,7 +36,7 @@ public class ScatterFilter extends GenerateFilter{
}
}
if(floor != Blocks.air && (in.floor == flooronto || flooronto == Blocks.air) && chance() <= chance){
if(floor != Blocks.air && (in.floor == flooronto || flooronto == Blocks.air) && chance(in.x, in.y) <= chance){
in.floor = floor;
}
}

View File

@@ -19,9 +19,9 @@ public class SpawnPathFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("radius", () -> radius, f -> radius = (int)f, 1, 20).display()
);
return new SliderOption[]{
new SliderOption("radius", () -> radius, f -> radius = (int)f, 1, 20).display()
};
}
@Override

View File

@@ -1,7 +1,6 @@
package mindustry.maps.filters;
import arc.math.*;
import arc.util.*;
import mindustry.content.*;
import mindustry.gen.*;
import mindustry.world.*;
@@ -14,16 +13,16 @@ public class TerrainFilter extends GenerateFilter{
@Override
public FilterOption[] options(){
return Structs.arr(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("mag", () -> magnitude, f -> magnitude = f, 0f, 2f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f),
new SliderOption("circle-scale", () -> circleScl, f -> circleScl = f, 0f, 3f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOptional),
new BlockOption("wall", () -> block, b -> block = b, wallsOnly)
);
return new FilterOption[]{
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("mag", () -> magnitude, f -> magnitude = f, 0f, 2f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f),
new SliderOption("circle-scale", () -> circleScl, f -> circleScl = f, 0f, 3f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOptional),
new BlockOption("wall", () -> block, b -> block = b, wallsOnly)
};
}
@Override
@@ -32,8 +31,8 @@ public class TerrainFilter extends GenerateFilter{
}
@Override
public void apply(){
float noise = noise(in.x, in.y, scl, magnitude, octaves, falloff) + Mathf.dst((float)in.x / in.width, (float)in.y / in.height, 0.5f, 0.5f) * circleScl;
public void apply(GenerateInput in){
float noise = noise(in, scl, magnitude, octaves, falloff) + Mathf.dst((float)in.x / in.width, (float)in.y / in.height, 0.5f, 0.5f) * circleScl;
if(floor != Blocks.air){
in.floor = floor;

View File

@@ -18,7 +18,6 @@ import static mindustry.Vars.*;
public abstract class PlanetGenerator extends BasicGenerator implements HexMesher{
protected IntSeq ints = new IntSeq();
protected Sector sector;
protected Simplex noise = new Simplex();
/** Should generate sector bases for a planet. */
public void generateSector(Sector sector){
@@ -116,7 +115,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe
@Override
protected float noise(float x, float y, double octaves, double falloff, double scl, double mag){
Vec3 v = sector.rect.project(x, y);
return (float)noise.octaveNoise3D(octaves, falloff, 1f / scl, v.x, v.y, v.z) * (float)mag;
return (float)Simplex.noise3d(0, octaves, falloff, 1f / scl, v.x, v.y, v.z) * (float)mag;
}
/** @return the scaling factor for sector rects. */

View File

@@ -18,6 +18,8 @@ import mindustry.world.*;
import static mindustry.Vars.*;
public class SerpuloPlanetGenerator extends PlanetGenerator{
static final int seed = 0;
BaseGenerator basegen = new BaseGenerator();
float scl = 5f;
float waterOffset = 0.07f;
@@ -55,7 +57,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
float rawHeight(Vec3 position){
position = Tmp.v33.set(position).scl(scl);
return (Mathf.pow((float)noise.octaveNoise3D(7, 0.5f, 1f/3f, position.x, position.y, position.z), 2.3f) + waterOffset) / (1f + waterOffset);
return (Mathf.pow((float)Simplex.noise3d(seed, 7, 0.5f, 1f/3f, position.x, position.y, position.z), 2.3f) + waterOffset) / (1f + waterOffset);
}
@Override
@@ -114,7 +116,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
tile.floor = getBlock(position);
tile.block = tile.floor.asFloor().wall;
if(RidgedPerlin.noise3d(1, position.x, position.y, position.z, 2, 22) > 0.31){
if(Ridged.noise3d(1, position.x, position.y, position.z, 2, 22) > 0.31){
tile.block = Blocks.air;
}
}
@@ -125,12 +127,12 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
position = Tmp.v33.set(position).scl(scl);
float rad = scl;
float temp = Mathf.clamp(Math.abs(position.y * 2f) / (rad));
float tnoise = (float)noise.octaveNoise3D(7, 0.56, 1f/3f, position.x, position.y + 999f, position.z);
float tnoise = (float)Simplex.noise3d(seed, 7, 0.56, 1f/3f, position.x, position.y + 999f, position.z);
temp = Mathf.lerp(temp, tnoise, 0.5f);
height *= 1.2f;
height = Mathf.clamp(height);
float tar = (float)noise.octaveNoise3D(4, 0.55f, 1f/2f, position.x, position.y + 999f, position.z) * 0.3f + Tmp.v31.dst(0, 0, 1f) * 0.2f;
float tar = (float)Simplex.noise3d(seed, 4, 0.55f, 1f/2f, position.x, position.y + 999f, position.z) * 0.3f + Tmp.v31.dst(0, 0, 1f) * 0.2f;
Block res = arr[Mathf.clamp((int)(temp * arr.length), 0, arr[0].length - 1)][Mathf.clamp((int)(height * arr[0].length), 0, arr[0].length - 1)];
if(tar > 0.5f){
@@ -143,7 +145,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
@Override
protected float noise(float x, float y, double octaves, double falloff, double scl, double mag){
Vec3 v = sector.rect.project(x, y).scl(5f);
return (float)noise.octaveNoise3D(octaves, falloff, 1f / scl, v.x, v.y, v.z) * (float)mag;
return (float)Simplex.noise3d(seed, octaves, falloff, 1f / scl, v.x, v.y, v.z) * (float)mag;
}
@Override
@@ -250,15 +252,15 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
float scl = 1f;
float addscl = 1.3f;
if(noise.octaveNoise3D(2, 0.5, scl, sector.tile.v.x, sector.tile.v.y, sector.tile.v.z)*nmag + poles > 0.25f*addscl){
if(Simplex.noise3d(seed, 2, 0.5, scl, sector.tile.v.x, sector.tile.v.y, sector.tile.v.z)*nmag + poles > 0.25f*addscl){
ores.add(Blocks.oreCoal);
}
if(noise.octaveNoise3D(2, 0.5, scl, sector.tile.v.x + 1, sector.tile.v.y, sector.tile.v.z)*nmag + poles > 0.5f*addscl){
if(Simplex.noise3d(seed, 2, 0.5, scl, sector.tile.v.x + 1, sector.tile.v.y, sector.tile.v.z)*nmag + poles > 0.5f*addscl){
ores.add(Blocks.oreTitanium);
}
if(noise.octaveNoise3D(2, 0.5, scl, sector.tile.v.x + 2, sector.tile.v.y, sector.tile.v.z)*nmag + poles > 0.7f*addscl){
if(Simplex.noise3d(seed, 2, 0.5, scl, sector.tile.v.x + 2, sector.tile.v.y, sector.tile.v.z)*nmag + poles > 0.7f*addscl){
ores.add(Blocks.oreThorium);
}

View File

@@ -1,6 +1,9 @@
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")
public class ClassMap{
@@ -171,20 +174,20 @@ public class ClassMap{
classes.put("OreBlock", mindustry.world.blocks.environment.OreBlock.class);
classes.put("OverlayFloor", mindustry.world.blocks.environment.OverlayFloor.class);
classes.put("Prop", mindustry.world.blocks.environment.Prop.class);
classes.put("SeaBush", mindustry.world.blocks.environment.SeaBush.class);
classes.put("Seaweed", mindustry.world.blocks.environment.Seaweed.class);
classes.put("Bush", Bush.class);
classes.put("WavingProp", WavingProp.class);
classes.put("ShallowLiquid", mindustry.world.blocks.environment.ShallowLiquid.class);
classes.put("SpawnBlock", mindustry.world.blocks.environment.SpawnBlock.class);
classes.put("StaticCoralWall", mindustry.world.blocks.environment.StaticCoralWall.class);
classes.put("StaticClusterWall", StaticClusterWall.class);
classes.put("StaticTree", mindustry.world.blocks.environment.StaticTree.class);
classes.put("StaticWall", mindustry.world.blocks.environment.StaticWall.class);
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);
@@ -235,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

@@ -752,8 +752,8 @@ public class ContentParser{
var out = ClassMap.classes.get(!base.isEmpty() && Character.isLowerCase(base.charAt(0)) ? Strings.capitalize(base) : base);
if(out != null) return (Class<T>)out;
//try to resolve it as a raw class name if it's allowed
if(base.indexOf('.') != -1 && Scripts.allowClass(base)){
//try to resolve it as a raw class name
if(base.indexOf('.') != -1){
try{
return (Class<T>)Class.forName(base);
}catch(Exception ignored){

View File

@@ -22,22 +22,12 @@ import java.util.*;
import java.util.regex.*;
public class Scripts implements Disposable{
private static final Seq<String> blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk",
"runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system",
".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org.", "mod.classmap");
private static final Seq<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "jdk.proxy", "mindustry.gen.",
"mindustry.logic.", "mindustry.async.", "saveio", "systemcursor", "filetreeinitevent", "asyncexecutor");
private final Context context;
private final Scriptable scope;
private boolean errored;
LoadedMod currentMod = null;
public static boolean allowClass(String type){
return !blacklist.contains(t -> type.toLowerCase(Locale.ROOT).contains(t)) || whitelist.contains(t -> type.toLowerCase(Locale.ROOT).contains(t));
}
public Scripts(){
Time.mark();

View File

@@ -174,21 +174,12 @@ public class ModsDialog extends BaseDialog{
dialog.hide();
platform.showMultiFileChooser(file -> {
Runnable go = () -> {
try{
mods.importMod(file);
setup();
}catch(IOException e){
ui.showException(e);
e.printStackTrace();
}
};
//show unsafe jar file warning
if(file.extEquals("jar")){
ui.showConfirm("@warning", "@mod.jarwarn", go);
}else{
go.run();
try{
mods.importMod(file);
setup();
}catch(IOException e){
ui.showException(e);
Log.err(e);
}
}, "zip", "jar");
}).margin(12f);
@@ -529,10 +520,7 @@ public class ModsDialog extends BaseDialog{
private void githubImportMod(String repo, boolean isJava){
if(isJava){
ui.showConfirm("@warning", "@mod.jarwarn", () -> {
ui.loadfrag.show();
githubImportJavaMod(repo);
});
githubImportJavaMod(repo);
}else{
ui.loadfrag.show();
Core.net.httpGet(ghApi + "/repos/" + repo, res -> {

View File

@@ -92,6 +92,8 @@ public class ConstructBlock extends Block{
Fx.placeBlock.at(tile.drawx(), tile.drawy(), block.size);
if(shouldPlay()) Sounds.place.at(tile, calcPitch(true));
Events.fire(new BlockBuildEndEvent(tile, builder, team, false, config));
}
static boolean shouldPlay(){
@@ -123,8 +125,6 @@ public class ConstructBlock extends Block{
if(tile.build != null){
tile.build.placed();
}
Events.fire(new BlockBuildEndEvent(tile, builder, team, false, config));
}
@Override
@@ -259,7 +259,9 @@ public class ConstructBlock extends Block{
if(progress >= 1f || state.rules.infiniteResources){
if(lastBuilder == null) lastBuilder = builder;
constructed(tile, current, lastBuilder, (byte)rotation, builder.team, config);
if(!net.client()){
constructed(tile, current, lastBuilder, (byte)rotation, builder.team, config);
}
}
}

View File

@@ -324,7 +324,7 @@ public class MassDriver extends Block{
}
protected boolean shooterValid(Building other){
return other instanceof MassDriverBuild entity && other.consValid() && entity.block == block && entity.link == pos() && within(other, range);
return other instanceof MassDriverBuild entity && other.isValid() && other.consValid() && entity.block == block && entity.link == pos() && within(other, range);
}
protected boolean linkValid(){

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

@@ -184,6 +184,7 @@ public class PayloadMassDriver extends PayloadBlock{
if(current != null &&
!(
current instanceof PayloadDriverBuild entity &&
current.isValid() &&
entity.consValid() && entity.block == block &&
entity.link == pos() && within(current, range)
)){

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(){

View File

@@ -61,6 +61,8 @@ public class ItemLiquidGenerator extends PowerGenerator{
@Override
public void init(){
emitLight = true;
lightRadius = 65f * size;
if(!defaults){
setDefaults();
}