Merge branch 'master' of https://github.com/Anuken/Mindustry into 7.0-features

 Conflicts:
	gradle.properties
This commit is contained in:
Anuken
2021-07-08 09:29:36 -04:00
47 changed files with 178 additions and 211 deletions
@@ -87,18 +87,18 @@ public class AssetsProcess extends BaseProcessor{
filename = filename.substring(0, filename.indexOf(".")); filename = filename.substring(0, filename.indexOf("."));
String sfilen = filename; String sfilen = filename;
String dtype = p.name().endsWith(".9.png") ? "arc.scene.style.NinePatchDrawable" : "arc.scene.style.TextureRegionDrawable"; String dtype = "arc.scene.style.Drawable";
String varname = capitalize(sfilen); String varname = capitalize(sfilen);
if(SourceVersion.isKeyword(varname)) varname += "s"; if(SourceVersion.isKeyword(varname)) varname += "s";
type.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC); type.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC);
load.addStatement(varname + " = (" + dtype + ")arc.Core.atlas.drawable($S)", sfilen); load.addStatement(varname + " = arc.Core.atlas.drawable($S)", sfilen);
}); });
for(Element elem : elements){ for(Element elem : elements){
Seq.with(((TypeElement)elem).getEnclosedElements()).each(e -> e.getKind() == ElementKind.FIELD, field -> { Seq.with(elem.getEnclosedElements()).each(e -> e.getKind() == ElementKind.FIELD, field -> {
String fname = field.getSimpleName().toString(); String fname = field.getSimpleName().toString();
if(fname.startsWith("default")){ if(fname.startsWith("default")){
loadStyles.addStatement("arc.Core.scene.addStyle(" + field.asType().toString() + ".class, mindustry.ui.Styles." + fname + ")"); loadStyles.addStatement("arc.Core.scene.addStyle(" + field.asType().toString() + ".class, mindustry.ui.Styles." + fname + ")");
@@ -124,7 +124,7 @@ public class AssetsProcess extends BaseProcessor{
String name = p.nameWithoutExtension(); String name = p.nameWithoutExtension();
if(names.contains(name)){ if(names.contains(name)){
BaseProcessor.err("Duplicate file name: " + p.toString() + "!"); BaseProcessor.err("Duplicate file name: " + p + "!");
}else{ }else{
names.add(name); names.add(name);
} }
@@ -0,0 +1 @@
{version:2,fields:[{name:collided,type:arc.struct.IntSeq},{name:damage,type:float},{name:data,type:java.lang.Object},{name:fdata,type:float},{name:lifetime,type:float},{name:owner,type:mindustry.gen.Entityc},{name:rotation,type:float},{name:team,type:mindustry.game.Team},{name:time,type:float},{name:type,type:mindustry.entities.bullet.BulletType},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:2,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:2,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:2,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:6,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:6,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:6,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:2,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:6,fields:[{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:4,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq<mindustry.world.blocks.payloads.Payload>},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:5,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:4,fields:[{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:4,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq<mindustry.world.blocks.payloads.Payload>},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:4,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:2,fields:[{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:5,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq<mindustry.world.blocks.payloads.Payload>},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:2,fields:[{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:6,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:5,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
@@ -0,0 +1 @@
{version:2,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 KiB

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 147 KiB

+2 -2
View File
@@ -20,9 +20,9 @@ void main(){
vec4 color = texture2D(u_texture, c); vec4 color = texture2D(u_texture, c);
if(noise > 0.54 && noise < 0.68){ if(noise > 0.54 && noise < 0.68){
color.rgb *= 1.4; color.rgb *= vec3(1.4);
}else if(!(noise > 0.40 && noise < 0.54)){ }else if(!(noise > 0.40 && noise < 0.54)){
color.rgb *= 1.2; color.rgb *= vec3(1.2);
} }
gl_FragColor = color; gl_FragColor = color;
+2 -2
View File
@@ -801,12 +801,12 @@ public class Blocks implements ContentList{
}}; }};
disassembler = new Separator("disassembler"){{ disassembler = new Separator("disassembler"){{
requirements(Category.crafting, with(Items.graphite, 140, Items.titanium, 100, Items.silicon, 150, Items.surgeAlloy, 70)); requirements(Category.crafting, with(Items.plastanium, 40, Items.titanium, 100, Items.silicon, 150, Items.thorium, 80));
results = with( results = with(
Items.sand, 4, Items.sand, 4,
Items.graphite, 2, Items.graphite, 2,
Items.titanium, 2, Items.titanium, 2,
Items.thorium, 1 Items.thorium, 2
); );
hasPower = true; hasPower = true;
craftTime = 15f; craftTime = 15f;
+5 -4
View File
@@ -120,7 +120,7 @@ public class UnitTypes implements ContentList{
hitSize = 13f; hitSize = 13f;
rotateSpeed = 3f; rotateSpeed = 3f;
targetAir = false; targetAir = false;
health = 820; health = 900;
armor = 9f; armor = 9f;
mechFrontSway = 0.55f; mechFrontSway = 0.55f;
@@ -133,15 +133,15 @@ public class UnitTypes implements ContentList{
shake = 2f; shake = 2f;
ejectEffect = Fx.casing2; ejectEffect = Fx.casing2;
shootSound = Sounds.artillery; shootSound = Sounds.artillery;
bullet = new ArtilleryBulletType(2f, 8, "shell"){{ bullet = new ArtilleryBulletType(2f, 20, "shell"){{
hitEffect = Fx.blastExplosion; hitEffect = Fx.blastExplosion;
knockback = 0.8f; knockback = 0.8f;
lifetime = 120f; lifetime = 120f;
width = height = 14f; width = height = 14f;
collides = true; collides = true;
collidesTiles = true; collidesTiles = true;
splashDamageRadius = 30f; splashDamageRadius = 35f;
splashDamage = 60f; splashDamage = 80f;
backColor = Pal.bulletYellowBack; backColor = Pal.bulletYellowBack;
frontColor = Pal.bulletYellow; frontColor = Pal.bulletYellow;
}}; }};
@@ -2155,6 +2155,7 @@ public class UnitTypes implements ContentList{
bullet = new EmpBulletType(){{ bullet = new EmpBulletType(){{
float rad = 100f; float rad = 100f;
scaleVelocity = true;
lightOpacity = 0.7f; lightOpacity = 0.7f;
unitDamageScl = 0.8f; unitDamageScl = 0.8f;
healPercent = 20f; healPercent = 20f;
@@ -93,7 +93,7 @@ public class BulletType extends Content implements Cloneable{
public boolean collides = true; public boolean collides = true;
/** Whether velocity is inherited from the shooter. */ /** Whether velocity is inherited from the shooter. */
public boolean keepVelocity = true; public boolean keepVelocity = true;
/** Whether to scale velocity to disappear at the target position. Used for artillery. */ /** Whether to scale lifetime (not actually velocity!) to disappear at the target position. Used for artillery. */
public boolean scaleVelocity; public boolean scaleVelocity;
/** Whether this bullet can be hit by point defense. */ /** Whether this bullet can be hit by point defense. */
public boolean hittable = true; public boolean hittable = true;
@@ -44,6 +44,13 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
} }
} }
//bullets always considered local
@Override
@Replace
public boolean isLocal(){
return true;
}
@Override @Override
public void add(){ public void add(){
type.init(self()); type.init(self());
@@ -16,8 +16,8 @@ abstract class ShieldComp implements Healthc, Posc{
/** Absorbs health damage. */ /** Absorbs health damage. */
float shield; float shield;
/** Subtracts an amount from damage. */ /** Subtracts an amount from damage. No need to save. */
float armor; transient float armor;
/** Shield opacity. */ /** Shield opacity. */
transient float shieldAlpha = 0f; transient float shieldAlpha = 0f;
+11 -7
View File
@@ -13,20 +13,24 @@ import static mindustry.Vars.*;
abstract class VelComp implements Posc{ abstract class VelComp implements Posc{
@Import float x, y; @Import float x, y;
//TODO @SyncLocal this? does it even need to be sent? @SyncLocal Vec2 vel = new Vec2();
transient final Vec2 vel = new Vec2();
transient float drag = 0f; transient float drag = 0f;
//velocity needs to be called first, as it affects delta and lastPosition //velocity needs to be called first, as it affects delta and lastPosition
@MethodPriority(-1) @MethodPriority(-1)
@Override @Override
public void update(){ public void update(){
float px = x, py = y; //do not update velocity on the client at all, unless it's non-interpolated
move(vel.x * Time.delta, vel.y * Time.delta); //velocity conflicts with interpolation.
if(Mathf.equal(px, x)) vel.x = 0; if(!net.client() || isLocal()){
if(Mathf.equal(py, y)) vel.y = 0; float px = x, py = y;
move(vel.x * Time.delta, vel.y * Time.delta);
if(Mathf.equal(px, x)) vel.x = 0;
if(Mathf.equal(py, y)) vel.y = 0;
vel.scl(Math.max(1f - drag * Time.delta, 0)); vel.scl(Math.max(1f - drag * Time.delta, 0));
}
} }
/** @return function to use for check solid state. if null, no checking is done. */ /** @return function to use for check solid state. if null, no checking is done. */
+1 -1
View File
@@ -181,7 +181,7 @@ public class LCanvas extends Table{
float dst = Math.min(y - this.y, Core.graphics.getHeight() - y); float dst = Math.min(y - this.y, Core.graphics.getHeight() - y);
if(dst < Scl.scl(100f)){ //scroll margin if(dst < Scl.scl(100f)){ //scroll margin
int sign = Mathf.sign(Core.graphics.getHeight()/2f - y); int sign = Mathf.sign(Core.graphics.getHeight()/2f - y);
pane.setScrollY(pane.getScrollY() + sign * Scl.scl(15f)); pane.setScrollY(pane.getScrollY() + sign * Scl.scl(15f) * Time.delta);
} }
} }
} }
+16 -19
View File
@@ -1,7 +1,6 @@
package mindustry.net; package mindustry.net;
import arc.*; import arc.*;
import arc.Net.*;
import arc.files.*; import arc.files.*;
import arc.func.*; import arc.func.*;
import arc.util.*; import arc.util.*;
@@ -62,27 +61,25 @@ public class BeControl{
/** asynchronously checks for updates. */ /** asynchronously checks for updates. */
public void checkUpdate(Boolc done){ public void checkUpdate(Boolc done){
Core.net.httpGet("https://api.github.com/repos/Anuken/MindustryBuilds/releases/latest", res -> { Http.get("https://api.github.com/repos/Anuken/MindustryBuilds/releases/latest")
if(res.getStatus() == HttpStatus.OK){ .error(e -> {}) //ignore errors
Jval val = Jval.read(res.getResultAsString()); .submit(res -> {
int newBuild = Strings.parseInt(val.getString("tag_name", "0")); Jval val = Jval.read(res.getResultAsString());
if(newBuild > Version.build){ int newBuild = Strings.parseInt(val.getString("tag_name", "0"));
Jval asset = val.get("assets").asArray().find(v -> v.getString("name", "").startsWith(headless ? "Mindustry-BE-Server" : "Mindustry-BE-Desktop")); if(newBuild > Version.build){
String url = asset.getString("browser_download_url", ""); Jval asset = val.get("assets").asArray().find(v -> v.getString("name", "").startsWith(headless ? "Mindustry-BE-Server" : "Mindustry-BE-Desktop"));
updateAvailable = true; String url = asset.getString("browser_download_url", "");
updateBuild = newBuild; updateAvailable = true;
updateUrl = url; updateBuild = newBuild;
Core.app.post(() -> { updateUrl = url;
showUpdateDialog(); Core.app.post(() -> {
done.get(true); showUpdateDialog();
}); done.get(true);
}else{ });
Core.app.post(() -> done.get(false));
}
}else{ }else{
Core.app.post(() -> done.get(false)); Core.app.post(() -> done.get(false));
} }
}, error -> {}); //ignore errors });
} }
/** @return whether a new update is available */ /** @return whether a new update is available */
+4 -5
View File
@@ -1,7 +1,6 @@
package mindustry.net; package mindustry.net;
import arc.*; import arc.*;
import arc.Net.*;
import arc.files.*; import arc.files.*;
import arc.func.*; import arc.func.*;
import arc.struct.*; import arc.struct.*;
@@ -150,12 +149,12 @@ public class CrashSender{
Log.info("Sending crash report."); Log.info("Sending crash report.");
//post to crash report URL, exit code indicates send success //post to crash report URL, exit code indicates send success
new arc.Net().http(new HttpRequest().block(true).method(HttpMethod.POST).content(value.toJson(OutputType.json)).url(Vars.crashReportURL), r -> { Http.post(Vars.crashReportURL, value.toJson(OutputType.json)).error(t -> {
Log.info("Crash sent successfully.");
System.exit(1);
}, t -> {
Log.info("Crash report not sent."); Log.info("Crash report not sent.");
System.exit(-1); System.exit(-1);
}).block(r -> {
Log.info("Crash sent successfully.");
System.exit(1);
}); });
ret(); ret();
+2
View File
@@ -39,6 +39,8 @@ public class Styles{
public static TreeStyle defaultTree; public static TreeStyle defaultTree;
public static void load(){ public static void load(){
var whiteui = (TextureRegionDrawable)Tex.whiteui;
black = whiteui.tint(0f, 0f, 0f, 1f); black = whiteui.tint(0f, 0f, 0f, 1f);
black9 = whiteui.tint(0f, 0f, 0f, 0.9f); black9 = whiteui.tint(0f, 0f, 0f, 0.9f);
black8 = whiteui.tint(0f, 0f, 0f, 0.8f); black8 = whiteui.tint(0f, 0f, 0f, 0.8f);
+20 -32
View File
@@ -1,7 +1,6 @@
package mindustry.ui.dialogs; package mindustry.ui.dialogs;
import arc.*; import arc.*;
import arc.Net.*;
import arc.graphics.*; import arc.graphics.*;
import arc.input.*; import arc.input.*;
import arc.math.*; import arc.math.*;
@@ -533,38 +532,27 @@ public class JoinDialog extends BaseDialog{
Log.info("Fetching community servers at @", url); Log.info("Fetching community servers at @", url);
//get servers //get servers
Core.net.httpGet(url, result -> { Http.get(url)
try{ .error(t -> Log.err("Failed to fetch community servers", t))
if(result.getStatus() != HttpStatus.OK){ .submit(result -> {
Log.warn("Failed to fetch community servers: @", result.getStatus()); Jval val = Jval.read(result.getResultAsString());
return; Seq<ServerGroup> servers = new Seq<>();
val.asArray().each(child -> {
String name = child.getString("name", "");
String[] addresses;
if(child.has("addresses") || (child.has("address") && child.get("address").isArray())){
addresses = (child.has("addresses") ? child.get("addresses") : child.get("address")).asArray().map(Jval::asString).toArray(String.class);
}else{
addresses = new String[]{child.getString("address", "<invalid>")};
} }
servers.add(new ServerGroup(name, addresses));
Jval val = Jval.read(result.getResultAsString()); });
Core.app.post(() -> { //modify default servers on main thread
try{ Core.app.post(() -> {
defaultServers.clear(); defaultServers.addAll(servers);
val.asArray().each(child -> { Log.info("Fetched @ community servers.", defaultServers.size);
String name = child.getString("name", ""); });
String[] addresses; });
if(child.has("addresses") || (child.has("address") && child.get("address").isArray())){
addresses = (child.has("addresses") ? child.get("addresses") : child.get("address")).asArray().map(Jval::asString).toArray(String.class);
}else{
addresses = new String[]{child.getString("address", "<invalid>")};
}
defaultServers.add(new ServerGroup(name, addresses));
});
Log.info("Fetched @ community servers.", defaultServers.size);
}catch(Throwable e){
Log.err("Failed to parse community servers.");
Log.err(e);
}
});
}catch(Throwable e){
Log.err("Failed to fetch community servers.");
Log.err(e);
}
}, Log::err);
} }
private void saveServers(){ private void saveServers(){
+62 -99
View File
@@ -1,7 +1,7 @@
package mindustry.ui.dialogs; package mindustry.ui.dialogs;
import arc.*; import arc.*;
import arc.Net.*; import arc.util.Http.*;
import arc.files.*; import arc.files.*;
import arc.func.*; import arc.func.*;
import arc.graphics.*; import arc.graphics.*;
@@ -104,6 +104,8 @@ public class ModsDialog extends BaseDialog{
if(Strings.getCauses(error).contains(t -> t.getMessage() != null && (t.getMessage().contains("trust anchor") || t.getMessage().contains("SSL") || t.getMessage().contains("protocol")))){ if(Strings.getCauses(error).contains(t -> t.getMessage() != null && (t.getMessage().contains("trust anchor") || t.getMessage().contains("SSL") || t.getMessage().contains("protocol")))){
ui.showErrorMessage("@feature.unsupported"); ui.showErrorMessage("@feature.unsupported");
}else if(error instanceof HttpStatusException st){
ui.showErrorMessage(Core.bundle.format("connectfail", Strings.capitalize(st.status.toString().toLowerCase())));
}else{ }else{
ui.showException(error); ui.showException(error);
} }
@@ -111,33 +113,27 @@ public class ModsDialog extends BaseDialog{
void getModList(Cons<Seq<ModListing>> listener){ void getModList(Cons<Seq<ModListing>> listener){
if(modList == null){ if(modList == null){
Core.net.httpGet("https://raw.githubusercontent.com/Anuken/MindustryMods/master/mods.json", response -> { Http.get("https://raw.githubusercontent.com/Anuken/MindustryMods/master/mods.json", response -> {
String strResult = response.getResultAsString(); String strResult = response.getResultAsString();
var status = response.getStatus();
Core.app.post(() -> { Core.app.post(() -> {
if(status != HttpStatus.OK){ try{
ui.showErrorMessage(Core.bundle.format("connectfail", status)); modList = JsonIO.json.fromJson(Seq.class, ModListing.class, strResult);
}else{
try{
modList = JsonIO.json.fromJson(Seq.class, ModListing.class, strResult);
var d = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); var d = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Func<String, Date> parser = text -> { Func<String, Date> parser = text -> {
try{ try{
return d.parse(text); return d.parse(text);
}catch(Exception e){ }catch(Exception e){
return new Date(); return new Date();
} }
}; };
modList.sortComparing(m -> parser.get(m.lastUpdated)).reverse();
listener.get(modList);
}catch(Exception e){
e.printStackTrace();
ui.showException(e);
}
modList.sortComparing(m -> parser.get(m.lastUpdated)).reverse();
listener.get(modList);
}catch(Exception e){
e.printStackTrace();
ui.showException(e);
} }
}); });
}, error -> Core.app.post(() -> modError(error))); }, error -> Core.app.post(() -> modError(error)));
@@ -423,21 +419,19 @@ public class ModsDialog extends BaseDialog{
//textures are only requested when the rendering happens; this assists with culling //textures are only requested when the rendering happens; this assists with culling
if(!textureCache.containsKey(repo)){ if(!textureCache.containsKey(repo)){
textureCache.put(repo, last = Tex.nomap.getRegion()); textureCache.put(repo, last = Core.atlas.find("nomap"));
Core.net.httpGet("https://raw.githubusercontent.com/Anuken/MindustryMods/master/icons/" + repo.replace("/", "_"), res -> { Http.get("https://raw.githubusercontent.com/Anuken/MindustryMods/master/icons/" + repo.replace("/", "_"), res -> {
if(res.getStatus() == HttpStatus.OK){ Pixmap pix = new Pixmap(res.getResult());
Pixmap pix = new Pixmap(res.getResult()); Core.app.post(() -> {
Core.app.post(() -> { try{
try{ var tex = new Texture(pix);
var tex = new Texture(pix); tex.setFilter(TextureFilter.linear);
tex.setFilter(TextureFilter.linear); textureCache.put(repo, new TextureRegion(tex));
textureCache.put(repo, new TextureRegion(tex)); pix.dispose();
pix.dispose(); }catch(Exception e){
}catch(Exception e){ Log.err(e);
Log.err(e); }
} });
});
}
}, err -> {}); }, err -> {});
} }
@@ -522,19 +516,17 @@ public class ModsDialog extends BaseDialog{
githubImportJavaMod(repo); githubImportJavaMod(repo);
}else{ }else{
ui.loadfrag.show(); ui.loadfrag.show();
Core.net.httpGet(ghApi + "/repos/" + repo, res -> { Http.get(ghApi + "/repos/" + repo, res -> {
if(checkError(res)){ var json = Jval.read(res.getResultAsString());
var json = Jval.read(res.getResultAsString()); String mainBranch = json.getString("default_branch");
String mainBranch = json.getString("default_branch"); String language = json.getString("language", "<none>");
String language = json.getString("language", "<none>");
//this is a crude heuristic for class mods; only required for direct github import //this is a crude heuristic for class mods; only required for direct github import
//TODO make a more reliable way to distinguish java mod repos //TODO make a more reliable way to distinguish java mod repos
if(language.equals("Java") || language.equals("Kotlin")){ if(language.equals("Java") || language.equals("Kotlin")){
githubImportJavaMod(repo); githubImportJavaMod(repo);
}else{ }else{
githubImportBranch(mainBranch, repo, this::showStatus); githubImportBranch(mainBranch, repo);
}
} }
}, this::importFail); }, this::importFail);
} }
@@ -542,62 +534,33 @@ public class ModsDialog extends BaseDialog{
private void githubImportJavaMod(String repo){ private void githubImportJavaMod(String repo){
//grab latest release //grab latest release
Core.net.httpGet(ghApi + "/repos/" + repo + "/releases/latest", res -> { Http.get(ghApi + "/repos/" + repo + "/releases/latest", res -> {
if(checkError(res)){ var json = Jval.read(res.getResultAsString());
var json = Jval.read(res.getResultAsString()); var assets = json.get("assets").asArray();
var assets = json.get("assets").asArray();
//prioritize dexed jar, as that's what Sonnicon's mod template outputs //prioritize dexed jar, as that's what Sonnicon's mod template outputs
var dexedAsset = assets.find(j -> j.getString("name").startsWith("dexed") && j.getString("name").endsWith(".jar")); var dexedAsset = assets.find(j -> j.getString("name").startsWith("dexed") && j.getString("name").endsWith(".jar"));
var asset = dexedAsset == null ? assets.find(j -> j.getString("name").endsWith(".jar")) : dexedAsset; var asset = dexedAsset == null ? assets.find(j -> j.getString("name").endsWith(".jar")) : dexedAsset;
if(asset != null){ if(asset != null){
//grab actual file //grab actual file
var url = asset.getString("browser_download_url"); var url = asset.getString("browser_download_url");
Core.net.httpGet(url, result -> {
if(checkError(result)){ Http.get(url, result -> handleMod(repo, result), this::importFail);
handleMod(repo, result); }else{
} throw new ArcRuntimeException("No JAR file found in releases. Make sure you have a valid jar file in the mod's latest Github Release.");
}, this::importFail);
}else{
throw new ArcRuntimeException("No JAR file found in releases. Make sure you have a valid jar file in the mod's latest Github Release.");
}
} }
}, this::importFail); }, this::importFail);
} }
private boolean checkError(HttpResponse res){ private void githubImportBranch(String branch, String repo){
if(res.getStatus() == HttpStatus.OK){ Http.get(ghApi + "/repos/" + repo + "/zipball/" + branch, loc -> {
return true; if(loc.getHeader("Location") != null){
}else{ Http.get(loc.getHeader("Location"), result -> {
showStatus(res.getStatus()); handleMod(repo, result);
return false; }, this::importFail);
}
}
private void showStatus(HttpStatus status){
Core.app.post(() -> {
ui.showErrorMessage(Core.bundle.format("connectfail", Strings.capitalize(status.toString().toLowerCase())));
ui.loadfrag.hide();
});
}
private void githubImportBranch(String branch, String repo, Cons<HttpStatus> err){
Core.net.httpGet(ghApi + "/repos/" + repo + "/zipball/" + branch, loc -> {
if(loc.getStatus() == HttpStatus.OK){
if(loc.getHeader("Location") != null){
Core.net.httpGet(loc.getHeader("Location"), result -> {
if(result.getStatus() != HttpStatus.OK){
err.get(result.getStatus());
}else{
handleMod(repo, result);
}
}, this::importFail);
}else{
handleMod(repo, loc);
}
}else{ }else{
err.get(loc.getStatus()); handleMod(repo, loc);
} }
}, this::importFail); }, this::importFail);
} }
@@ -85,7 +85,7 @@ public class LiquidTurret extends Turret{
@Override @Override
public boolean shouldActiveSound(){ public boolean shouldActiveSound(){
return wasShooting; return wasShooting && enabled;
} }
@Override @Override
@@ -12,8 +12,6 @@ public class Prop extends Block{
breakable = true; breakable = true;
alwaysReplace = true; alwaysReplace = true;
instantDeconstruct = true; instantDeconstruct = true;
deconstructThreshold = 0.35f;
breakEffect = Fx.breakProp; breakEffect = Fx.breakProp;
} }
@@ -34,7 +34,7 @@ public class PayloadMassDriver extends PayloadBlock{
public Sound shootSound = Sounds.shootBig; public Sound shootSound = Sounds.shootBig;
public float shake = 3f; public float shake = 3f;
public Effect transferEffect = new Effect(11f, 300f, e -> { public Effect transferEffect = new Effect(11f, 600f, e -> {
if(!(e.data instanceof PayloadMassDriverData data)) return; if(!(e.data instanceof PayloadMassDriverData data)) return;
Tmp.v1.set(data.x, data.y).lerp(data.ox, data.oy, Interp.sineIn.apply(e.fin())); Tmp.v1.set(data.x, data.y).lerp(data.ox, data.oy, Interp.sineIn.apply(e.fin()));
data.payload.set(Tmp.v1.x, Tmp.v1.y, e.rotation); data.payload.set(Tmp.v1.x, Tmp.v1.y, e.rotation);
@@ -128,19 +128,17 @@ public class Separator extends Block{
return !consumes.itemFilters.get(item.id); return !consumes.itemFilters.get(item.id);
} }
//TODO write seed in 128 release, don't write it now for compatibility with 127.x @Override
//@Override public byte version(){
//public byte version(){ return 1;
// return 1; }
//}
@Override @Override
public void write(Writes write){ public void write(Writes write){
super.write(write); super.write(write);
write.f(progress); write.f(progress);
write.f(warmup); write.f(warmup);
//TODO see above write.i(seed);
//write.i(seed);
} }
@Override @Override
@@ -148,8 +146,7 @@ public class Separator extends Block{
super.read(read, revision); super.read(read, revision);
progress = read.f(); progress = read.f();
warmup = read.f(); warmup = read.f();
//TODO see above if(revision == 1) seed = read.i();
//if(revision == 1) seed = read.i();
} }
} }
} }
+1 -1
View File
@@ -10,4 +10,4 @@ kapt.include.compile.classpath=false
kotlin.stdlib.default.dependency=false kotlin.stdlib.default.dependency=false
#needed for android compilation #needed for android compilation
android.useAndroidX=true android.useAndroidX=true
archash=33c4976f8084fbb6fc26cfdcca2dda3442711d17 archash=b4dc34071be92f154034d9d9621e015f5c49030c
+3 -4
View File
@@ -1,5 +1,4 @@
import arc.*; import arc.util.*;
import arc.Net.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.*; import mindustry.*;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
@@ -14,13 +13,13 @@ public class GenericModTest{
static void grabMod(String url){ static void grabMod(String url){
//clear older mods //clear older mods
ApplicationTests.testDataFolder.deleteDirectory(); ApplicationTests.testDataFolder.deleteDirectory();
new Net().http(new HttpRequest().block(true).url(url).method(HttpMethod.GET), httpResponse -> { Http.get(url).error(Assertions::fail).block(httpResponse -> {
try{ try{
ApplicationTests.testDataFolder.child("mods").child("test_mod." + (url.endsWith("jar") ? "jar" : "zip")).writeBytes(Streams.copyBytes(httpResponse.getResultAsStream())); ApplicationTests.testDataFolder.child("mods").child("test_mod." + (url.endsWith("jar") ? "jar" : "zip")).writeBytes(Streams.copyBytes(httpResponse.getResultAsStream()));
}catch(IOException e){ }catch(IOException e){
Assertions.fail(e); Assertions.fail(e);
} }
}, Assertions::fail); });
ApplicationTests.launchApplication(false); ApplicationTests.launchApplication(false);
} }
+7 -15
View File
@@ -1,13 +1,9 @@
package mindustry.tools; package mindustry.tools;
import arc.*;
import arc.Net.*;
import arc.files.*; import arc.files.*;
import arc.util.*; import arc.util.*;
import arc.util.io.*; import arc.util.io.*;
import java.io.*;
/* icon font pipeline: /* icon font pipeline:
1. take set of pre-defined icons and SVGs 1. take set of pre-defined icons and SVGs
2. use Fontello API to get a font with these 2. use Fontello API to get a font with these
@@ -18,7 +14,6 @@ public class FontGenerator{
//E000 to F8FF //E000 to F8FF
public static void main(String[] args){ public static void main(String[] args){
Net net = Core.net = new Net();
Fi folder = Fi.get("core/assets-raw/fontgen/out/"); Fi folder = Fi.get("core/assets-raw/fontgen/out/");
folder.mkdirs(); folder.mkdirs();
@@ -29,13 +24,10 @@ public class FontGenerator{
Log.info("Zip..."); Log.info("Zip...");
String session = folder.child("session").readString(); String session = folder.child("session").readString();
net.http(new HttpRequest().method(HttpMethod.GET).url("https://fontello.com/" + session + "/get").block(true), result -> {
try{ Http.get("https://fontello.com/" + session + "/get").block(result -> {
Streams.copy(result.getResultAsStream(), folder.child("font.zip").write()); Streams.copy(result.getResultAsStream(), folder.child("font.zip").write());
}catch(IOException e){ });
throw new RuntimeException(e);
}
}, Log::err);
Log.info("Icon font..."); Log.info("Icon font...");
@@ -49,9 +41,9 @@ public class FontGenerator{
//TODO this is broken //TODO this is broken
Log.info(OS.exec("fontforge", "-script", Log.info(OS.exec("fontforge", "-script",
Fi.get("core/assets-raw/fontgen/merge.pe").absolutePath(), Fi.get("core/assets-raw/fontgen/merge.pe").absolutePath(),
Fi.get("core/assets/fonts/font.woff").absolutePath(), Fi.get("core/assets/fonts/font.woff").absolutePath(),
Fi.get("core/assets-raw/fontgen/out/font.woff").absolutePath()) Fi.get("core/assets-raw/fontgen/out/font.woff").absolutePath())
); );
Log.info("Done."); Log.info("Done.");