Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -72,6 +72,8 @@ public class Renderer implements ApplicationListener{
|
|||||||
landPTimer,
|
landPTimer,
|
||||||
//intensity for screen shake
|
//intensity for screen shake
|
||||||
shakeIntensity,
|
shakeIntensity,
|
||||||
|
//reduction rate of screen shake
|
||||||
|
shakeReduction,
|
||||||
//current duration of screen shake
|
//current duration of screen shake
|
||||||
shakeTime;
|
shakeTime;
|
||||||
//for landTime > 0: if true, core is currently *launching*, otherwise landing.
|
//for landTime > 0: if true, core is currently *launching*, otherwise landing.
|
||||||
@@ -83,14 +85,15 @@ public class Renderer implements ApplicationListener{
|
|||||||
Shaders.init();
|
Shaders.init();
|
||||||
|
|
||||||
Events.on(ResetEvent.class, e -> {
|
Events.on(ResetEvent.class, e -> {
|
||||||
shakeTime = shakeIntensity = 0f;
|
shakeTime = shakeIntensity = shakeReduction = 0f;
|
||||||
camShakeOffset.setZero();
|
camShakeOffset.setZero();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shake(float intensity, float duration){
|
public void shake(float intensity, float duration){
|
||||||
shakeIntensity = Math.max(shakeIntensity, intensity);
|
shakeIntensity = Math.max(shakeIntensity, Mathf.clamp(intensity, 0, 100));
|
||||||
shakeTime = Math.max(shakeTime, duration);
|
shakeTime = Math.max(shakeTime, duration);
|
||||||
|
shakeReduction = shakeIntensity / shakeTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addEnvRenderer(int mask, Runnable render){
|
public void addEnvRenderer(int mask, Runnable render){
|
||||||
@@ -210,7 +213,7 @@ public class Renderer implements ApplicationListener{
|
|||||||
float intensity = shakeIntensity * (settings.getInt("screenshake", 4) / 4f) * 0.75f;
|
float intensity = shakeIntensity * (settings.getInt("screenshake", 4) / 4f) * 0.75f;
|
||||||
camShakeOffset.setToRandomDirection().scl(Mathf.random(intensity));
|
camShakeOffset.setToRandomDirection().scl(Mathf.random(intensity));
|
||||||
camera.position.add(camShakeOffset);
|
camera.position.add(camShakeOffset);
|
||||||
shakeIntensity -= 0.25f * Time.delta;
|
shakeIntensity -= shakeReduction * Time.delta;
|
||||||
shakeTime -= Time.delta;
|
shakeTime -= Time.delta;
|
||||||
shakeIntensity = Mathf.clamp(shakeIntensity, 0f, 100f);
|
shakeIntensity = Mathf.clamp(shakeIntensity, 0f, 100f);
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -554,7 +554,7 @@ public class BulletType extends Content implements Cloneable{
|
|||||||
|
|
||||||
public void init(Bullet b){
|
public void init(Bullet b){
|
||||||
|
|
||||||
if(killShooter && b.owner() instanceof Healthc h){
|
if(killShooter && b.owner() instanceof Healthc h && !h.dead()){
|
||||||
h.kill();
|
h.kill();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -700,7 +700,6 @@ public class BulletType extends Content implements Cloneable{
|
|||||||
return create(owner, team, x, y, angle, -1, velocityScl, lifetimeScl, null);
|
return create(owner, team, x, y, angle, -1, velocityScl, lifetimeScl, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public @Nullable Bullet create(Entityc owner, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl, Mover mover){
|
public @Nullable Bullet create(Entityc owner, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl, Mover mover){
|
||||||
return create(owner, team, x, y, angle, -1, velocityScl, lifetimeScl, null, mover);
|
return create(owner, team, x, y, angle, -1, velocityScl, lifetimeScl, null, mover);
|
||||||
}
|
}
|
||||||
@@ -732,24 +731,27 @@ public class BulletType extends Content implements Cloneable{
|
|||||||
Unit spawned = spawnUnit.create(team);
|
Unit spawned = spawnUnit.create(team);
|
||||||
spawned.set(x, y);
|
spawned.set(x, y);
|
||||||
spawned.rotation = angle;
|
spawned.rotation = angle;
|
||||||
|
|
||||||
//immediately spawn at top speed, since it was launched
|
//immediately spawn at top speed, since it was launched
|
||||||
if(spawnUnit.missileAccelTime <= 0f){
|
if(spawnUnit.missileAccelTime <= 0f){
|
||||||
spawned.vel.trns(angle, spawnUnit.speed);
|
spawned.vel.trns(angle, spawnUnit.speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
//assign unit owner
|
//assign unit owner
|
||||||
if(spawned.controller() instanceof MissileAI ai){
|
if(spawned.controller() instanceof MissileAI ai){
|
||||||
if(owner instanceof Unit unit){
|
if(owner instanceof Unit unit){
|
||||||
ai.shooter = unit;
|
ai.shooter = unit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(owner instanceof ControlBlock control){
|
if(owner instanceof ControlBlock control){
|
||||||
ai.shooter = control.unit();
|
ai.shooter = control.unit();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
spawned.add();
|
spawned.add();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Since bullet init is never called, handle killing shooter here
|
||||||
|
if(killShooter && owner instanceof Healthc h && !h.dead()) h.kill();
|
||||||
|
|
||||||
//no bullet returned
|
//no bullet returned
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import arc.math.geom.*;
|
|||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import mindustry.ai.types.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.audio.*;
|
import mindustry.audio.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
@@ -456,7 +457,8 @@ public class Weapon implements Cloneable{
|
|||||||
lifeScl = bullet.scaleLife ? Mathf.clamp(Mathf.dst(bulletX, bulletY, mount.aimX, mount.aimY) / bullet.range) : 1f,
|
lifeScl = bullet.scaleLife ? Mathf.clamp(Mathf.dst(bulletX, bulletY, mount.aimX, mount.aimY) / bullet.range) : 1f,
|
||||||
angle = angleOffset + shootAngle + Mathf.range(inaccuracy + bullet.inaccuracy);
|
angle = angleOffset + shootAngle + Mathf.range(inaccuracy + bullet.inaccuracy);
|
||||||
|
|
||||||
mount.bullet = bullet.create(unit, unit.team, bulletX, bulletY, angle, -1f, (1f - velocityRnd) + Mathf.random(velocityRnd), lifeScl, null, mover, mount.aimX, mount.aimY);
|
Entityc shooter = unit.controller() instanceof MissileAI ai ? ai.shooter : unit; //Pass the missile's shooter down to its bullets
|
||||||
|
mount.bullet = bullet.create(shooter, unit.team, bulletX, bulletY, angle, -1f, (1f - velocityRnd) + Mathf.random(velocityRnd), lifeScl, null, mover, mount.aimX, mount.aimY);
|
||||||
handleBullet(unit, mount, mount.bullet);
|
handleBullet(unit, mount, mount.bullet);
|
||||||
|
|
||||||
if(!continuous){
|
if(!continuous){
|
||||||
|
|||||||
@@ -468,10 +468,10 @@ public class Turret extends ReloadTurret{
|
|||||||
target = Units.bestEnemy(team, x, y, range, e -> !e.dead() && !e.isGrounded() && unitFilter.get(e), unitSort);
|
target = Units.bestEnemy(team, x, y, range, e -> !e.dead() && !e.isGrounded() && unitFilter.get(e), unitSort);
|
||||||
}else{
|
}else{
|
||||||
target = Units.bestTarget(team, x, y, range, e -> !e.dead() && unitFilter.get(e) && (e.isGrounded() || targetAir) && (!e.isGrounded() || targetGround), b -> targetGround && buildingFilter.get(b), unitSort);
|
target = Units.bestTarget(team, x, y, range, e -> !e.dead() && unitFilter.get(e) && (e.isGrounded() || targetAir) && (!e.isGrounded() || targetGround), b -> targetGround && buildingFilter.get(b), unitSort);
|
||||||
|
}
|
||||||
|
|
||||||
if(target == null && canHeal()){
|
if(target == null && canHeal()){
|
||||||
target = Units.findAllyTile(team, x, y, range, b -> b.damaged() && b != this);
|
target = Units.findAllyTile(team, x, y, range, b -> b.damaged() && b != this);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user