Merge branch 'master' of https://github.com/Anuken/Mindustry into 7.0-features
Conflicts: gradle.properties
@@ -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}]}
|
||||||
|
Before Width: | Height: | Size: 239 KiB After Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 447 KiB After Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 398 KiB After Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 316 KiB After Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 229 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 147 KiB |
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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. */
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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(){
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.");
|
||||||
|
|||||||