diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index 5052e7138c..3ab5baa306 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -882,7 +882,7 @@ public class EntityProcess extends BaseProcessor{ for(Smethod method : methods){ String signature = method.toString(); - if(signatures.contains(signature)) continue; + if(!signatures.add(signature)) continue; Stype compType = interfaceToComp(method.type()); MethodSpec.Builder builder = MethodSpec.overriding(method.e).addModifiers(Modifier.PUBLIC, Modifier.FINAL); @@ -893,25 +893,29 @@ public class EntityProcess extends BaseProcessor{ builder.addAnnotation(OverrideCallSuper.class); //just in case if(!method.isVoid()){ - if(method.name().equals("isNull")){ - builder.addStatement("return true"); - }else if(method.name().equals("id")){ + String methodName = method.name(); + switch(methodName){ + case "isNull": + builder.addStatement("return true"); + break; + case "id": builder.addStatement("return -1"); - }else{ - Svar variable = compType == null || method.params().size > 0 ? null : compType.fields().find(v -> v.name().equals(method.name())); - String desc = variable == null ? null : variable.descString(); - if(variable == null || !varInitializers.containsKey(desc)){ - builder.addStatement("return " + getDefault(method.ret().toString())); - }else{ - String init = varInitializers.get(desc); - builder.addStatement("return " + (init.equals("{}") ? "new " + variable.mirror().toString() : "") + init); - } + break; + case "toString": + builder.addStatement("return $S", className); + break; + default: + Svar variable = compType == null || method.params().size > 0 ? null : compType.fields().find(v -> v.name().equals(methodName)); + String desc = variable == null ? null : variable.descString(); + if(variable == null || !varInitializers.containsKey(desc)){ + builder.addStatement("return " + getDefault(method.ret().toString())); + }else{ + String init = varInitializers.get(desc); + builder.addStatement("return " + (init.equals("{}") ? "new " + variable.mirror().toString() : "") + init); + } } } - nullBuilder.addMethod(builder.build()); - - signatures.add(signature); } nullsBuilder.addField(FieldSpec.builder(type, Strings.camelize(baseName)).initializer("new " + className + "()").addModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.PUBLIC).build()); diff --git a/core/src/mindustry/ai/types/BuilderAI.java b/core/src/mindustry/ai/types/BuilderAI.java index cc3eb8565c..eebb6ef850 100644 --- a/core/src/mindustry/ai/types/BuilderAI.java +++ b/core/src/mindustry/ai/types/BuilderAI.java @@ -145,7 +145,7 @@ public class BuilderAI extends AIController{ float minDst = Float.MAX_VALUE; Player closest = null; for(var player : Groups.player){ - if(player.unit().canBuild() && !player.dead()){ + if(player.unit().canBuild() && !player.dead() && player.team() == unit.team){ float dst = player.dst2(unit); if(dst < minDst){ closest = player; diff --git a/core/src/mindustry/entities/Lightning.java b/core/src/mindustry/entities/Lightning.java index 453150205b..76bbcb82b5 100644 --- a/core/src/mindustry/entities/Lightning.java +++ b/core/src/mindustry/entities/Lightning.java @@ -43,7 +43,7 @@ public class Lightning{ bhit = false; for(int i = 0; i < length / 2; i++){ - hitCreate.create(null, team, x, y, rotation, damage, 1f, 1f, hitter); + hitCreate.create(null, team, x, y, rotation, damage * (hitter == null ? 1f : hitter.damageMultiplier()), 1f, 1f, hitter); lines.add(new Vec2(x + Mathf.range(3f), y + Mathf.range(3f))); if(lines.size > 1){ diff --git a/core/src/mindustry/entities/abilities/EnergyFieldAbility.java b/core/src/mindustry/entities/abilities/EnergyFieldAbility.java index 0ccf221a35..c8b2452fc3 100644 --- a/core/src/mindustry/entities/abilities/EnergyFieldAbility.java +++ b/core/src/mindustry/entities/abilities/EnergyFieldAbility.java @@ -141,9 +141,9 @@ public class EnergyFieldAbility extends Ability{ }else{ anyNearby = true; if(other instanceof Building b){ - b.damage(unit.team, damage); + b.damage(unit.team, damage * state.rules.unitDamage(unit.team)); }else{ - other.damage(damage); + other.damage(damage * state.rules.unitDamage(unit.team)); } if(other instanceof Statusc s){ s.apply(status, statusDuration); diff --git a/core/src/mindustry/entities/comp/CrawlComp.java b/core/src/mindustry/entities/comp/CrawlComp.java index d1d8fcb7ce..fa057f6730 100644 --- a/core/src/mindustry/entities/comp/CrawlComp.java +++ b/core/src/mindustry/entities/comp/CrawlComp.java @@ -88,7 +88,7 @@ abstract class CrawlComp implements Posc, Rotc, Hitboxc, Unitc{ //TODO area damage to units if(t.build != null && t.build.team != team){ - t.build.damage(team, type.crushDamage * Time.delta); + t.build.damage(team, type.crushDamage * Time.delta * state.rules.unitDamage(team)); } if(Mathf.chanceDelta(0.025)){ diff --git a/core/src/mindustry/entities/comp/LegsComp.java b/core/src/mindustry/entities/comp/LegsComp.java index 68a67b6927..34b3cc3506 100644 --- a/core/src/mindustry/entities/comp/LegsComp.java +++ b/core/src/mindustry/entities/comp/LegsComp.java @@ -192,7 +192,7 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ } if(type.legSplashDamage > 0){ - Damage.damage(team, l.base.x, l.base.y, type.legSplashRange, type.legSplashDamage, false, true); + Damage.damage(team, l.base.x, l.base.y, type.legSplashRange, type.legSplashDamage * state.rules.unitDamage(team), false, true); } } diff --git a/core/src/mindustry/entities/comp/TankComp.java b/core/src/mindustry/entities/comp/TankComp.java index 20e3831064..38946709ac 100644 --- a/core/src/mindustry/entities/comp/TankComp.java +++ b/core/src/mindustry/entities/comp/TankComp.java @@ -66,7 +66,7 @@ abstract class TankComp implements Posc, Flyingc, Hitboxc, Unitc, ElevationMovec //damage radius is 1 tile smaller to prevent it from just touching walls as it passes && Math.max(Math.abs(dx), Math.abs(dy)) <= r - 1){ - t.build.damage(team, type.crushDamage * Time.delta * t.block().crushDamageMultiplier); + t.build.damage(team, type.crushDamage * Time.delta * t.block().crushDamageMultiplier * state.rules.unitDamage(team)); } } } diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index e8af89a646..8a68125f31 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -618,7 +618,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I //if this unit crash landed (was flying), damage stuff in a radius if(type.flying && !spawnedByCore && type.createWreck){ - Damage.damage(team, x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f, true, false, true); + Damage.damage(team, x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f * state.rules.unitDamage(team), true, false, true); } if(!headless && type.createScorch){ diff --git a/core/src/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java index 1e3cf0ad92..6334d2491f 100644 --- a/core/src/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -45,8 +45,10 @@ public class Scripts implements Disposable{ try{ Object o = context.evaluateString(scope, text, "console.js", 1); if(o instanceof NativeJavaObject n) o = n.unwrap(); - if(o instanceof Undefined) o = "undefined"; - return String.valueOf(o); + if(o == null) o = "null"; + else if(o instanceof Undefined) o = "undefined"; + var out = o.toString(); + return out == null ? "null" : out; }catch(Throwable t){ return getError(t, false); }