Leg unit movement fixes

This commit is contained in:
Anuken
2020-07-12 11:34:19 -04:00
parent dad5b186db
commit f5f495b9b8
12 changed files with 63 additions and 23 deletions

View File

@@ -24,6 +24,12 @@ public class EntityCollisions{
//entity collisions
private Seq<Hitboxc> arrOut = new Seq<>();
public void moveCheck(Hitboxc entity, float deltax, float deltay, SolidPred solidCheck){
if(!solidCheck.solid(entity.tileX(), entity.tileY())){
move(entity, deltax, deltay, solidCheck);
}
}
public void move(Hitboxc entity, float deltax, float deltay){
move(entity, deltax, deltay, EntityCollisions::solid);
}
@@ -119,14 +125,19 @@ public class EntityCollisions{
});
}
public static boolean legsSolid(int x, int y){
Tile tile = world.tile(x, y);
return tile == null || tile.staticDarkness() >= 2;
}
public static boolean waterSolid(int x, int y){
Tile tile = world.tile(x, y);
return tile != null && (tile.solid() || !tile.floor().isLiquid);
return tile == null || (tile.solid() || !tile.floor().isLiquid);
}
public static boolean solid(int x, int y){
Tile tile = world.tile(x, y);
return tile != null && tile.solid();
return tile == null || tile.solid();
}
private void checkCollide(Hitboxc a, Hitboxc b){

View File

@@ -19,4 +19,5 @@ abstract class ElevationMoveComp implements Velc, Posc, Flyingc, Hitboxc{
collisions.move(this, cx, cy);
}
}
}

View File

@@ -12,8 +12,10 @@ import mindustry.graphics.*;
import mindustry.type.*;
import mindustry.world.blocks.environment.*;
import static mindustry.Vars.*;
@Component
abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc, ElevationMovec{
abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{
@Import float x, y;
@Import UnitType type;
@@ -22,6 +24,12 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc, Elevatio
transient float moveSpace;
transient float baseRotation;
@Replace
@Override
public void move(float cx, float cy){
collisions.moveCheck(this, cx, cy, !type.allowLegStep ? EntityCollisions::solid : EntityCollisions::legsSolid);
}
@Override
public void update(){
if(Mathf.dst(deltaX(), deltaY()) > 0.001f){

View File

@@ -122,7 +122,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
this.type = type;
this.maxHealth = type.health;
this.drag = type.drag;
this.elevation = type.flying ? 1f : type.baseElevation;
this.elevation = type.flying ? 1f : 0;
this.armor = type.armor;
this.hitSize = type.hitsize;
this.hovering = type.hovering;
@@ -214,17 +214,12 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
Tile tile = tileOn();
Floor floor = floorOn();
if(tile != null && isGrounded()){
if(tile != null && isGrounded() && !type.hovering){
//unit block update
if(tile.build != null){
tile.build.unitOn(base());
}
//kill when stuck in wall
if(tile.solid()){
kill();
}
//apply damage
if(floor.damageTaken > 0f){
damageContinuous(floor.damageTaken);

View File

@@ -17,9 +17,7 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc{
@Override
public void move(float cx, float cy){
if(isGrounded()){
if(!EntityCollisions.waterSolid(tileX(), tileY())){
collisions.move(this, cx, cy, EntityCollisions::waterSolid);
}
collisions.moveCheck(this, cx, cy, EntityCollisions::waterSolid);
}else{
x += cx;
y += cy;