Misc bugfixes

This commit is contained in:
Anuken
2021-12-08 14:28:27 -05:00
parent 6c10a400ed
commit 5fbfe52d0a
12 changed files with 206 additions and 46 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -21,18 +21,10 @@ void main(){
vec4 color = texture2D(u_texture, T); vec4 color = texture2D(u_texture, T);
vec2 v = u_invsize; vec2 v = u_invsize;
vec4 maxed = max(max(max(max(max(max(max( vec4 maxed = max(max(max(texture2D(u_texture, T + vec2(0, step) * v), texture2D(u_texture, T + vec2(0, -step) * v)), texture2D(u_texture, T + vec2(step, 0) * v)), texture2D(u_texture, T + vec2(-step, 0) * v));
texture2D(u_texture, T + vec2(0, step) * v),
texture2D(u_texture, T + vec2(0, -step) * v)),
texture2D(u_texture, T + vec2(step, 0) * v)),
texture2D(u_texture, T + vec2(-step, 0) * v)),
texture2D(u_texture, T + vec2(-step, -step) * v)),
texture2D(u_texture, T + vec2(-step, step) * v)),
texture2D(u_texture, T + vec2(step, -step) * v)),
texture2D(u_texture, T + vec2(step, step) * v));
if(texture2D(u_texture, T).a < 0.9 && maxed.a > 0.9){ if(texture2D(u_texture, T).a < 0.9 && maxed.a > 0.9){
gl_FragColor = vec4(maxed.rgb, maxed.a * 100.0); gl_FragColor = vec4(maxed.rgb, maxed.a * 100.0);
}else{ }else{

View File

@@ -1513,7 +1513,8 @@ public class Blocks{
//TODO //TODO
requirements(Category.effect, with(Items.surgeAlloy, 100, Items.silicon, 125)); requirements(Category.effect, with(Items.surgeAlloy, 100, Items.silicon, 125));
size = 3; size = 3;
radius = 50f; width = 50f;
length = 36;
shieldHealth = 2000f; shieldHealth = 2000f;
cooldownNormal = 3f; cooldownNormal = 3f;
cooldownBrokenBase = 0.35f; cooldownBrokenBase = 0.35f;

View File

@@ -78,6 +78,14 @@ public class Fx{
Draw.rect(Icon.warning.getRegion(), e.x, e.y, size, size); Draw.rect(Icon.warning.getRegion(), e.x, e.y, size, size);
}), }),
unitEnvKill = new Effect(80f, e -> {
color(Color.scarlet);
alpha(e.fout(Interp.pow4Out));
float size = 10f + e.fout(Interp.pow10In) * 25f;
Draw.rect(Icon.cancel.getRegion(), e.x, e.y, size, size);
}),
unitControl = new Effect(30f, e -> { unitControl = new Effect(30f, e -> {
if(!(e.data instanceof Unit select)) return; if(!(e.data instanceof Unit select)) return;

View File

@@ -33,6 +33,15 @@ public class Units{
} }
} }
@Remote(called = Loc.server)
public static void unitEnvDeath(Unit unit){
if(unit != null){
unit.dead = true;
Fx.unitEnvKill.at(unit);
Core.app.post(() -> Call.unitDestroy(unit.id));
}
}
@Remote(called = Loc.server) @Remote(called = Loc.server)
public static void unitDeath(int uid){ public static void unitDeath(int uid){
Unit unit = Groups.unit.getByID(uid); Unit unit = Groups.unit.getByID(uid);

View File

@@ -378,7 +378,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
//check if environment is unsupported //check if environment is unsupported
if(!type.supportsEnv(state.rules.environment) && !dead){ if(!type.supportsEnv(state.rules.environment) && !dead){
Call.unitCapDeath(self()); Call.unitEnvDeath(self());
team.data().updateCount(type, -1); team.data().updateCount(type, -1);
} }

View File

@@ -138,8 +138,7 @@ public class LParser{
try{ try{
st = LogicIO.read(tokens, tok); st = LogicIO.read(tokens, tok);
}catch(Exception e){ }catch(Exception e){
//log invalid statements //replace invalid statements
Log.err(e);
st = new InvalidStatement(); st = new InvalidStatement();
} }

View File

@@ -6,19 +6,32 @@ import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.consumers.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class DirectionalForceProjector extends ForceProjector{ //TODO use completely different layer
//TODO consume heat
public class DirectionalForceProjector extends Block{
protected static final Vec2 intersectOut = new Vec2(), p1 = new Vec2(), p2 = new Vec2(); protected static final Vec2 intersectOut = new Vec2(), p1 = new Vec2(), p2 = new Vec2();
protected static DirectionalForceProjectorBuild paramEntity;
protected static Effect paramEffect;
protected static final Cons<Bullet> dirShieldConsumer = b -> { protected static final Cons<Bullet> dirShieldConsumer = b -> {
if(b.team != paramEntity.team && b.type.absorbable){ if(b.team != paramEntity.team && b.type.absorbable){
//just in case //just in case
float deltaAdd = 1.1f; float deltaAdd = 1.1f;
if(Intersector.intersectSegments(b.x, b.y, b.x + b.vel.x * (Time.delta + deltaAdd), b.y + b.vel.y * (Time.delta + deltaAdd), p1.x, p1.y, p2.x, p2.y, intersectOut)){ if(Intersector.intersectSegments(b.x, b.y,
b.x + b.vel.x * (Time.delta + deltaAdd),
b.y + b.vel.y * (Time.delta + deltaAdd), p1.x, p1.y, p2.x, p2.y, intersectOut)){
b.set(intersectOut); b.set(intersectOut);
b.absorb(); b.absorb();
paramEffect.at(b); paramEffect.at(b);
@@ -28,48 +41,141 @@ public class DirectionalForceProjector extends ForceProjector{
} }
}; };
//TODO proper length? public float width = 30f;
public float shieldHealth = 3000f;
public float cooldownNormal = 1.75f;
public float cooldownLiquid = 1.5f;
public float cooldownBrokenBase = 0.35f;
public Effect absorbEffect = Fx.absorb;
public Effect shieldBreakEffect = Fx.shieldBreak;
public @Load("@-top") TextureRegion topRegion;
public float length = 40f; public float length = 40f;
public float padSize = 40f; public float padSize = 40f;
public DirectionalForceProjector(String name){ public DirectionalForceProjector(String name){
super(name); super(name);
radius = 30f;
consumeCoolant = false;
rotate = true; rotate = true;
rotateDraw = false; rotateDraw = false;
update = true;
solid = true;
group = BlockGroup.projectors;
envEnabled |= Env.space;
ambientSound = Sounds.shield;
ambientSoundVolume = 0.08f;
} }
@Override @Override
public void init(){ public void init(){
clipSize = Math.max(clipSize, (width + 3f) * 2f);
super.init(); super.init();
if(length < 0){ if(length < 0){
length = size * tilesize/2f; length = size * tilesize/2f;
} }
} }
@Override
public void setBars(){
super.setBars();
bars.add("shield", (DirectionalForceProjectorBuild entity) -> new Bar("stat.shieldhealth", Pal.accent, () -> entity.broken ? 0f : 1f - entity.buildup / (shieldHealth)).blink(Color.white));
}
@Override
public boolean outputsItems(){
return false;
}
@Override
public void setStats(){
super.setStats();
stats.add(Stat.shieldHealth, shieldHealth, StatUnit.none);
stats.add(Stat.cooldownTime, (int) (shieldHealth / cooldownBrokenBase / 60f), StatUnit.seconds);
}
@Override @Override
public void drawPlace(int x, int y, int rotation, boolean valid){ public void drawPlace(int x, int y, int rotation, boolean valid){
drawPotentialLinks(x, y); drawPotentialLinks(x, y);
//TODO x *= tilesize;
y *= tilesize;
Tmp.v1.set(length - size/2f, (width + size/2f)).rotate(rotation * 90).add(x, y);
Tmp.v2.set(length - size/2f, -(width + size/2f)).rotate(rotation * 90).add(x, y);
Drawf.dashLine(Color.lightGray, x, y, Tmp.v1.x, Tmp.v1.y);
Drawf.dashLine(Color.lightGray, x, y, Tmp.v2.x, Tmp.v2.y);
Drawf.dashLine(Pal.accent, Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y);
} }
public class DirectionalForceProjectorBuild extends ForceBuild{ public class DirectionalForceProjectorBuild extends Building{
public boolean broken = true;
public float buildup, hit, warmup, shieldRadius;
@Override @Override
public void deflectBullets(){ public boolean shouldAmbientSound(){
float realRadius = realRadius(); return !broken && shieldRadius > 1f;
}
if(realRadius > 0 && !broken){ @Override
public void pickedUp(){
super.pickedUp();
shieldRadius = warmup = 0f;
}
@Override
public void updateTile(){
shieldRadius = Mathf.lerpDelta(shieldRadius, broken ? 0f : warmup * width, 0.05f);
//TODO ?????????????????
if(Mathf.chanceDelta(buildup / shieldHealth * 0.1f)){
Fx.reactorsmoke.at(x + Mathf.range(tilesize / 2f), y + Mathf.range(tilesize / 2f));
}
warmup = Mathf.lerpDelta(warmup, efficiency(), 0.1f);
if(buildup > 0 && consumes.has(ConsumeType.liquid)){
float scale = !broken ? cooldownNormal : cooldownBrokenBase;
Consume cons = consumes.get(ConsumeType.liquid);
if(cons.valid(this)){
cons.update(this);
scale *= (cooldownLiquid * (1f + (liquids.current().heatCapacity - 0.4f) * 0.9f));
}
buildup -= delta() * scale;
}
if(broken && buildup <= 0){
broken = false;
}
if(buildup >= shieldHealth && !broken){
broken = true;
buildup = shieldHealth;
shieldBreakEffect.at(x, y, shieldRadius, team.color);
}
if(hit > 0f){
hit -= 1f / 5f * Time.delta;
}
deflectBullets();
}
public void deflectBullets(){
if(shieldRadius > 0 && !broken){
paramEntity = this; paramEntity = this;
paramEffect = absorbEffect; paramEffect = absorbEffect;
//top //top
p1.set(length, realRadius).rotate(rotdeg()); p1.set(length, shieldRadius).rotate(rotdeg());
//bot //bot
p2.set(length, -realRadius).rotate(rotdeg()); p2.set(length, -shieldRadius).rotate(rotdeg());
//"check" radius is grown to catch bullets moving at high velocity //"check" radius is grown to catch bullets moving at high velocity
Tmp.r1.set(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y).normalize().grow(padSize); Tmp.r1.set(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y).normalize().grow(padSize);
@@ -82,13 +188,30 @@ public class DirectionalForceProjector extends ForceProjector{
} }
@Override @Override
public void drawShield(){ public void draw(){
if(!broken && realRadius() > 0){ super.draw();
float realRadius = realRadius(), rot = rotdeg();
p1.set(length, realRadius).rotate(rot).add(this); //TODO wrong
p2.set(length, -realRadius).rotate(rot).add(this); if(buildup > 0f){
float size = 3f; Draw.alpha(buildup / shieldHealth * 0.75f);
Draw.z(Layer.blockAdditive);
Draw.blend(Blending.additive);
Draw.rect(topRegion, x, y);
Draw.blend();
Draw.z(Layer.block);
Draw.reset();
}
drawShield();
}
public void drawShield(){
if(!broken && shieldRadius > 0){
float rot = rotdeg();
p1.set(length, shieldRadius).rotate(rot).add(this);
p2.set(length, -shieldRadius).rotate(rot).add(this);
float size = 4f;
Tmp.r1.set(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y).normalize().grow(size); Tmp.r1.set(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y).normalize().grow(size);
Draw.z(Layer.shields); Draw.z(Layer.shields);
@@ -98,15 +221,20 @@ public class DirectionalForceProjector extends ForceProjector{
if(renderer.animateShields){ if(renderer.animateShields){
Fill.rect(Tmp.r1); Fill.rect(Tmp.r1);
Tmp.v1.set(length - size/2f - size * 2, (realRadius + size/2f)).rotate(rot).add(this); Tmp.v1.set(length - size/2f, (shieldRadius + size/2f)).rotate(rot).add(this);
Tmp.v2.set(length - size/2f - size * 2, -(realRadius + size/2f)).rotate(rot).add(this); Tmp.v2.set(length - size/2f, -(shieldRadius + size/2f)).rotate(rot).add(this);
Fill.tri(x, y, Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y); //Fill.tri(x, y, Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y);
Lines.stroke(3f);
Lines.line(x, y, Tmp.v1.x, Tmp.v1.y);
Lines.line(x, y, Tmp.v2.x, Tmp.v2.y);
Draw.z(Layer.shields);
for(int i : Mathf.signs){ for(int i : Mathf.signs){
Tmp.v1.set(length - size/2f, (realRadius + size/2f) * i).rotate(rot).add(this); Tmp.v1.set(length - size/2f, (shieldRadius + size/2f) * i).rotate(rot).add(this);
Tmp.v3.set(length + size/2f, (realRadius + size/2f) * i).rotate(rot).add(this); Tmp.v3.set(length + size/2f, (shieldRadius + size/2f) * i).rotate(rot).add(this);
Tmp.v2.set(length, (realRadius + size) * i).rotate(rot).add(this); Tmp.v2.set(length, (shieldRadius + size) * i).rotate(rot).add(this);
Fill.tri(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y, Tmp.v3.x, Tmp.v3.y); Fill.tri(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y, Tmp.v3.x, Tmp.v3.y);
} }
}else{ }else{
@@ -121,5 +249,25 @@ public class DirectionalForceProjector extends ForceProjector{
Draw.reset(); Draw.reset();
} }
} }
//TODO
/*
@Override
public void write(Writes write){
super.write(write);
write.bool(broken);
write.f(buildup);
write.f(radscl);
write.f(warmup);
}
@Override
public void read(Reads read, byte revision){
super.read(read, revision);
broken = read.bool();
buildup = read.f();
radscl = read.f();
warmup = read.f();
}*/
} }
} }

View File

@@ -155,12 +155,15 @@ public class ForceProjector extends Block{
warmup = Mathf.lerpDelta(warmup, efficiency(), 0.1f); warmup = Mathf.lerpDelta(warmup, efficiency(), 0.1f);
if(buildup > 0 && consumes.has(ConsumeType.liquid)){ if(buildup > 0){
float scale = !broken ? cooldownNormal : cooldownBrokenBase; float scale = !broken ? cooldownNormal : cooldownBrokenBase;
Consume cons = consumes.get(ConsumeType.liquid);
if(cons.valid(this)){ if(consumes.has(ConsumeType.liquid)){
cons.update(this); Consume cons = consumes.get(ConsumeType.liquid);
scale *= (cooldownLiquid * (1f + (liquids.current().heatCapacity - 0.4f) * 0.9f)); if(cons.valid(this)){
cons.update(this);
scale *= (cooldownLiquid * (1f + (liquids.current().heatCapacity - 0.4f) * 0.9f));
}
} }
buildup -= delta() * scale; buildup -= delta() * scale;

View File

@@ -75,7 +75,7 @@ public class PayloadSource extends PayloadBlock{
} }
public boolean canProduce(UnitType t){ public boolean canProduce(UnitType t){
return !t.isHidden() && !t.isBanned(); return !t.isHidden() && !t.isBanned() && t.supportsEnv(state.rules.environment);
} }
public class PayloadSourceBuild extends PayloadBlockBuild<Payload>{ public class PayloadSourceBuild extends PayloadBlockBuild<Payload>{

View File

@@ -111,7 +111,7 @@ public class Reconstructor extends UnitBlock{
@Override @Override
public boolean acceptUnitPayload(Unit unit){ public boolean acceptUnitPayload(Unit unit){
return hasUpgrade(unit.type); return hasUpgrade(unit.type) && !upgrade(unit.type).isBanned();
} }
@Override @Override

View File

@@ -24,4 +24,4 @@ android.useAndroidX=true
#used for slow jitpack builds; TODO see if this actually works #used for slow jitpack builds; TODO see if this actually works
org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.socketTimeout=100000
org.gradle.internal.http.connectionTimeout=100000 org.gradle.internal.http.connectionTimeout=100000
archash=997803e989 archash=3dc6a7fac5