Added deflector walls

This commit is contained in:
Anuken
2018-06-15 21:52:02 -04:00
parent 09ebb7a01c
commit eb94a4ee14
11 changed files with 459 additions and 329 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 118 KiB

View File

@@ -21,7 +21,8 @@ public class Recipes implements ContentList{
new Recipe(defense, DefenseBlocks.diriumwall, new ItemStack(Items.surgealloy, 12 * 4)); new Recipe(defense, DefenseBlocks.diriumwall, new ItemStack(Items.surgealloy, 12 * 4));
new Recipe(defense, DefenseBlocks.door, new ItemStack(Items.steel, 3), new ItemStack(Items.iron, 3 * 4)); new Recipe(defense, DefenseBlocks.door, new ItemStack(Items.steel, 3), new ItemStack(Items.iron, 3 * 4));
new Recipe(defense, DefenseBlocks.largedoor, new ItemStack(Items.steel, 3 * 4), new ItemStack(Items.iron, 3 * 4 * 4)); new Recipe(defense, DefenseBlocks.largedoor, new ItemStack(Items.steel, 3 * 4), new ItemStack(Items.iron, 3 * 4 * 4));
new Recipe(defense, DefenseBlocks.titaniumshieldwall, new ItemStack(Items.titanium, 16)); new Recipe(defense, DefenseBlocks.deflectorwall, new ItemStack(Items.titanium, 1));
new Recipe(defense, DefenseBlocks.deflectorwalllarge, new ItemStack(Items.titanium, 1));
new Recipe(distribution, DistributionBlocks.conveyor, new ItemStack(Items.iron, 1)); new Recipe(distribution, DistributionBlocks.conveyor, new ItemStack(Items.iron, 1));
new Recipe(distribution, DistributionBlocks.steelconveyor, new ItemStack(Items.steel, 1)); new Recipe(distribution, DistributionBlocks.steelconveyor, new ItemStack(Items.steel, 1));

View File

@@ -4,11 +4,11 @@ import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.Wall; import io.anuke.mindustry.world.blocks.Wall;
import io.anuke.mindustry.world.blocks.defense.DeflectorWall;
import io.anuke.mindustry.world.blocks.defense.Door; import io.anuke.mindustry.world.blocks.defense.Door;
import io.anuke.mindustry.world.blocks.defense.ShieldedWallBlock;
public class DefenseBlocks extends BlockList implements ContentList { public class DefenseBlocks extends BlockList implements ContentList {
public static Block stonewall, ironwall, steelwall, titaniumwall, diriumwall, compositewall, steelwalllarge, titaniumwalllarge, diriumwalllarge, titaniumshieldwall, door, largedoor; public static Block stonewall, ironwall, steelwall, titaniumwall, diriumwall, steelwalllarge, titaniumwalllarge, diriumwalllarge, door, largedoor, deflectorwall, deflectorwalllarge;
@Override @Override
public void load() { public void load() {
@@ -34,10 +34,6 @@ public class DefenseBlocks extends BlockList implements ContentList {
health = 190 * wallHealthMultiplier; health = 190 * wallHealthMultiplier;
}}; }};
compositewall = new Wall("compositewall") {{
health = 270 * wallHealthMultiplier;
}};
steelwalllarge = new Wall("steelwall-large") {{ steelwalllarge = new Wall("steelwall-large") {{
health = 110 * 4 * wallHealthMultiplier; health = 110 * 4 * wallHealthMultiplier;
size = 2; size = 2;
@@ -53,10 +49,15 @@ public class DefenseBlocks extends BlockList implements ContentList {
size = 2; size = 2;
}}; }};
titaniumshieldwall = new ShieldedWallBlock("titaniumshieldwall") {{ deflectorwall = new DeflectorWall("deflector-wall") {{
health = 150 * wallHealthMultiplier; health = 150 * wallHealthMultiplier;
}}; }};
deflectorwalllarge = new DeflectorWall("deflector-wall-large") {{
health = 150 * 4 * wallHealthMultiplier;
size = 2;
}};
door = new Door("door") {{ door = new Door("door") {{
health = 90 * wallHealthMultiplier; health = 90 * wallHealthMultiplier;
}}; }};

View File

@@ -113,7 +113,7 @@ public class TileEntity extends BaseEntity implements TargetTrait {
} }
public void collision(Bullet other){ public void collision(Bullet other){
damage(other.getDamage()); tile.block().handleBulletHit(this, other);
} }
public void damage(float damage){ public void damage(float damage){

View File

@@ -30,6 +30,7 @@ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncT
private static Vector2 vector = new Vector2(); private static Vector2 vector = new Vector2();
private Team team; private Team team;
private boolean supressCollision;
public Timer timer = new Timer(3); public Timer timer = new Timer(3);
@@ -73,7 +74,11 @@ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncT
public Bullet(){} public Bullet(){}
public boolean collidesTiles(){ public boolean collidesTiles(){
return type.collidesTiles; //TODO make artillery and such not do this return type.collidesTiles;
}
public void supressCollision(){
supressCollision = true;
} }
@Override @Override
@@ -141,7 +146,7 @@ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncT
public void update(){ public void update(){
super.update(); super.update();
if (type.hitTiles && collidesTiles()) { if (type.hitTiles && collidesTiles() && !supressCollision) {
world.raycastEach(world.toTile(lastPosition().x), world.toTile(lastPosition().y), world.toTile(x), world.toTile(y), (x, y) -> { world.raycastEach(world.toTile(lastPosition().x), world.toTile(lastPosition().y), world.toTile(x), world.toTile(y), (x, y) -> {
Tile tile = world.tile(x, y); Tile tile = world.tile(x, y);
@@ -150,8 +155,11 @@ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncT
if (tile.entity != null && tile.entity.collide(this) && !tile.entity.isDead() && tile.entity.tile.getTeam() != team) { if (tile.entity != null && tile.entity.collide(this) && !tile.entity.isDead() && tile.entity.tile.getTeam() != team) {
tile.entity.collision(this); tile.entity.collision(this);
remove();
type.hit(this); if(!supressCollision){
type.hit(this);
remove();
}
return true; return true;
} }
@@ -159,6 +167,8 @@ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncT
return false; return false;
}); });
} }
supressCollision = false;
} }
@Override @Override

View File

@@ -6,6 +6,7 @@ import io.anuke.annotations.Annotations.ReadClass;
import io.anuke.annotations.Annotations.WriteClass; import io.anuke.annotations.Annotations.WriteClass;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.entities.bullet.BulletType;
import io.anuke.mindustry.entities.traits.CarriableTrait; import io.anuke.mindustry.entities.traits.CarriableTrait;
import io.anuke.mindustry.entities.traits.CarryTrait; import io.anuke.mindustry.entities.traits.CarryTrait;
@@ -23,6 +24,7 @@ import io.anuke.ucore.entities.Entities;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import static io.anuke.mindustry.Vars.bulletGroup;
import static io.anuke.mindustry.Vars.playerGroup; import static io.anuke.mindustry.Vars.playerGroup;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
@@ -51,12 +53,23 @@ public class TypeIO {
} }
@ReadClass(Unit.class) @ReadClass(Unit.class)
public static Unit writeUnit(ByteBuffer buffer){ public static Unit readUnit(ByteBuffer buffer){
byte gid = buffer.get(); byte gid = buffer.get();
int id = buffer.getInt(); int id = buffer.getInt();
return (Unit)Entities.getGroup(gid).getByID(id); return (Unit)Entities.getGroup(gid).getByID(id);
} }
@WriteClass(Bullet.class)
public static void writeBullet(ByteBuffer buffer, Bullet bullet){
buffer.putInt(bullet.getID());
}
@ReadClass(Bullet.class)
public static Bullet readBullet(ByteBuffer buffer){
int id = buffer.getInt();
return (Bullet)bulletGroup.getByID(id);
}
@WriteClass(CarriableTrait.class) @WriteClass(CarriableTrait.class)
public static void writeCarriable(ByteBuffer buffer, CarriableTrait unit){ public static void writeCarriable(ByteBuffer buffer, CarriableTrait unit){
if(unit == null){ if(unit == null){

View File

@@ -10,6 +10,7 @@ import io.anuke.mindustry.entities.Damage;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.effect.Puddle; import io.anuke.mindustry.entities.effect.Puddle;
import io.anuke.mindustry.entities.effect.Rubble; import io.anuke.mindustry.entities.effect.Rubble;
import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Content;
@@ -238,6 +239,10 @@ public class Block extends BaseBlock implements UnlockableContent{
return amount; return amount;
} }
public void handleBulletHit(TileEntity entity, Bullet bullet){
entity.damage(bullet.getDamage());
}
public void update(Tile tile){} public void update(Tile tile){}
public boolean isAccessible(){ public boolean isAccessible(){

View File

@@ -0,0 +1,72 @@
package io.anuke.mindustry.world.blocks.defense;
import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.bullet.BulletType;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Wall;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.tilesize;
public class DeflectorWall extends Wall {
static final float hitTime = 10f;
public DeflectorWall(String name) {
super(name);
update = false;
}
@Override
public void draw(Tile tile){
super.draw(tile);
DeflectorEntity entity = tile.entity();
if(entity.hit < 0.0001f) return;
Graphics.setAdditiveBlending();
Draw.color(Color.WHITE);
Draw.alpha(entity.hit * 0.5f);
Draw.rect("blank", tile.drawx(), tile.drawy(), tilesize * size, tilesize * size);
Draw.reset();
entity.hit = Mathf.clamp(entity.hit - Timers.delta()/hitTime);
Graphics.setNormalBlending();
}
@Override
public void handleBulletHit(TileEntity entity, Bullet bullet){
super.handleBulletHit(entity, bullet);
float penX = Math.abs(entity.x - bullet.x), penY = Math.abs(entity.y - bullet.y);
if(penX < tilesize/2f * size) {
bullet.getVelocity().x *= -1;
}
if(penY < tilesize/2f * size){
bullet.getVelocity().y *= -1;
}
bullet.updateVelocity(BulletType.getByID(bullet.getTypeID()).drag);
bullet.supressCollision();
((DeflectorEntity)entity).hit = 1f;
}
@Override
public TileEntity getEntity() {
return new DeflectorEntity();
}
static class DeflectorEntity extends TileEntity{
public float hit;
}
}