95 lines
2.8 KiB
Java
95 lines
2.8 KiB
Java
package mindustry.entities.comp;
|
|
|
|
import arc.graphics.*;
|
|
import arc.math.*;
|
|
import arc.math.geom.*;
|
|
import arc.util.*;
|
|
import mindustry.annotations.Annotations.*;
|
|
import mindustry.content.*;
|
|
import mindustry.entities.*;
|
|
import mindustry.gen.*;
|
|
import mindustry.type.*;
|
|
import mindustry.world.*;
|
|
|
|
import static mindustry.Vars.*;
|
|
|
|
@Component
|
|
abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, ElevationMovec{
|
|
@Import float x, y, hitSize;
|
|
@Import UnitType type;
|
|
|
|
@SyncField(false) @SyncLocal float baseRotation;
|
|
transient float walkTime, walkExtension;
|
|
transient private boolean walked;
|
|
|
|
@Override
|
|
public void update(){
|
|
//trigger animation only when walking manually
|
|
if(walked || net.client()){
|
|
float len = deltaLen();
|
|
baseRotation = Angles.moveToward(baseRotation, deltaAngle(), type().baseRotateSpeed * Mathf.clamp(len / type().speed / Time.delta) * Time.delta);
|
|
walkTime += len;
|
|
walked = false;
|
|
}
|
|
|
|
//update mech effects
|
|
float extend = walkExtend(false);
|
|
float base = walkExtend(true);
|
|
float extendScl = base % 1f;
|
|
|
|
float lastExtend = walkExtension;
|
|
|
|
if(extendScl < lastExtend && base % 2f > 1f && !isFlying()){
|
|
int side = -Mathf.sign(extend);
|
|
float width = hitSize / 2f * side, length = type.mechStride * 1.35f;
|
|
|
|
float cx = x + Angles.trnsx(baseRotation, length, width),
|
|
cy = y + Angles.trnsy(baseRotation, length, width);
|
|
|
|
if(type.mechStepShake > 0){
|
|
Effect.shake(type.mechStepShake, type.mechStepShake, cx, cy);
|
|
}
|
|
|
|
if(type.mechStepParticles){
|
|
Tile tile = world.tileWorld(cx, cy);
|
|
if(tile != null){
|
|
Color color = tile.floor().mapColor;
|
|
Fx.unitLand.at(cx, cy, hitSize/8f, color);
|
|
}
|
|
}
|
|
}
|
|
|
|
walkExtension = extendScl;
|
|
}
|
|
|
|
public float walkExtend(boolean scaled){
|
|
|
|
//now ranges from -maxExtension to maxExtension*3
|
|
float raw = walkTime % (type.mechStride * 4);
|
|
|
|
if(scaled) return raw / type.mechStride;
|
|
|
|
if(raw > type.mechStride*3) raw = raw - type.mechStride * 4;
|
|
else if(raw > type.mechStride*2) raw = type.mechStride * 2 - raw;
|
|
else if(raw > type.mechStride) raw = type.mechStride * 2 - raw;
|
|
|
|
return raw;
|
|
}
|
|
|
|
@Override
|
|
public void moveAt(Vec2 vector, float acceleration){
|
|
//mark walking state when moving in a controlled manner
|
|
if(!vector.isZero()){
|
|
walked = true;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void approach(Vec2 vector){
|
|
//mark walking state when moving in a controlled manner
|
|
if(!vector.isZero(0.001f)){
|
|
walked = true;
|
|
}
|
|
}
|
|
}
|