83 lines
2.4 KiB
Java
83 lines
2.4 KiB
Java
package mindustry.entities;
|
|
|
|
import arc.*;
|
|
import arc.util.*;
|
|
import mindustry.content.*;
|
|
import mindustry.game.EventType.*;
|
|
import mindustry.gen.*;
|
|
import mindustry.world.*;
|
|
import mindustry.world.meta.*;
|
|
|
|
import static mindustry.Vars.*;
|
|
|
|
public class Fires{
|
|
private static final float baseLifetime = 1000f;
|
|
|
|
/** Start a fire on the tile. If there already is a fire there, refreshes its lifetime. */
|
|
public static void create(Tile tile){
|
|
if(net.client() || tile == null || !state.rules.fire || !state.rules.hasEnv(Env.oxygen)) return; //not clientside.
|
|
|
|
Fire fire = get(tile);
|
|
|
|
if(fire == null){
|
|
fire = Fire.create();
|
|
fire.tile = tile;
|
|
fire.lifetime = baseLifetime;
|
|
fire.set(tile.worldx(), tile.worldy());
|
|
fire.add();
|
|
set(tile, fire);
|
|
}else{
|
|
fire.lifetime = baseLifetime;
|
|
fire.time = 0f;
|
|
}
|
|
}
|
|
|
|
public static @Nullable Fire get(Tile tile){
|
|
return tile == null ? null : world.tiles.getFire(tile.array());
|
|
}
|
|
|
|
public static @Nullable Fire get(int x, int y){
|
|
return Structs.inBounds(x, y, world.width(), world.height()) ? world.tiles.getFire(world.packArray(x, y)) : null;
|
|
}
|
|
|
|
private static void set(Tile tile, Fire fire){
|
|
world.tiles.setFire(tile.array(), fire);
|
|
}
|
|
|
|
public static boolean has(int x, int y){
|
|
if(!Structs.inBounds(x, y, world.width(), world.height())){
|
|
return false;
|
|
}
|
|
Fire fire = get(x, y);
|
|
return fire != null && fire.isAdded() && fire.fin() < 1f && fire.tile != null && fire.tile.x == x && fire.tile.y == y;
|
|
}
|
|
|
|
/**
|
|
* Attempts to extinguish a fire by shortening its life. If there is no fire here, does nothing.
|
|
*/
|
|
public static void extinguish(Tile tile, float intensity){
|
|
if(tile != null){
|
|
Fire fire = get(tile);
|
|
if(fire != null){
|
|
fire.time(fire.time + intensity * Time.delta);
|
|
Fx.steam.at(fire);
|
|
if(fire.time >= fire.lifetime){
|
|
Events.fire(Trigger.fireExtinguish);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void remove(Tile tile){
|
|
if(tile != null){
|
|
set(tile, null);
|
|
}
|
|
}
|
|
|
|
public static void register(Fire fire){
|
|
if(fire.tile != null){
|
|
set(fire.tile, fire);
|
|
}
|
|
}
|
|
}
|