From 2a5118326a0d75230578af4ee25f35eca1c3ed40 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 4 Jun 2018 16:17:24 -0400 Subject: [PATCH] Added item drops, fixed various bugs --- core/src/io/anuke/mindustry/Vars.java | 14 +- .../mindustry/content/StatusEffects.java | 2 +- .../anuke/mindustry/core/ContentLoader.java | 2 +- core/src/io/anuke/mindustry/core/Logic.java | 4 +- .../src/io/anuke/mindustry/core/Platform.java | 2 +- .../src/io/anuke/mindustry/core/Renderer.java | 5 +- .../anuke/mindustry/core/ThreadHandler.java | 2 +- .../io/anuke/mindustry/entities/Player.java | 9 +- .../mindustry/entities/StatusController.java | 11 +- .../src/io/anuke/mindustry/entities/Unit.java | 14 +- .../mindustry/entities/UnitInventory.java | 8 +- .../mindustry/entities/bullet/Bullet.java | 13 +- .../mindustry/entities/bullet/BulletType.java | 2 +- .../anuke/mindustry/entities/effect/Fire.java | 10 +- .../entities/effect/GroundEffectEntity.java | 4 +- .../mindustry/entities/effect/ItemDrop.java | 125 +++++++++++++++++- .../entities/effect/ItemTransfer.java | 14 +- .../mindustry/entities/effect/Lightning.java | 8 +- .../mindustry/entities/effect/Puddle.java | 2 +- .../mindustry/entities/effect/Rubble.java | 5 +- .../mindustry/entities/traits/SaveTrait.java | 2 +- .../mindustry/entities/traits/SyncTrait.java | 2 +- .../entities/traits/TargetTrait.java | 6 +- .../mindustry/entities/traits/TeamTrait.java | 2 +- .../anuke/mindustry/input/DesktopInput.java | 4 +- .../anuke/mindustry/input/InputHandler.java | 6 +- core/src/io/anuke/mindustry/io/MapIO.java | 12 +- .../anuke/mindustry/io/versions/Save16.java | 2 +- core/src/io/anuke/mindustry/type/Liquid.java | 1 - .../{entities => type}/StatusEffect.java | 3 +- .../ui/fragments/BlockInventoryFragment.java | 2 +- core/src/io/anuke/mindustry/world/Tile.java | 10 +- .../mindustry/world/blocks/types/Floor.java | 2 +- .../blocks/types/distribution/Conveyor.java | 2 +- .../io/anuke/kryonet/DefaultThreadImpl.java | 2 +- 35 files changed, 233 insertions(+), 81 deletions(-) rename core/src/io/anuke/mindustry/{entities => type}/StatusEffect.java (96%) diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index c4b832b645..aa7def6b1f 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -9,6 +9,7 @@ import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.bullet.Bullet; import io.anuke.mindustry.entities.effect.Fire; +import io.anuke.mindustry.entities.effect.ItemDrop; import io.anuke.mindustry.entities.effect.Puddle; import io.anuke.mindustry.entities.effect.Shield; import io.anuke.mindustry.entities.units.BaseUnit; @@ -16,7 +17,7 @@ import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.Version; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.EntityGroup; -import io.anuke.ucore.entities.component.DrawTrait; +import io.anuke.ucore.entities.trait.DrawTrait; import io.anuke.ucore.entities.impl.EffectEntity; import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.util.OS; @@ -63,7 +64,7 @@ public class Vars{ //whether turrets have infinite ammo (only with debug) public static boolean infiniteAmmo = true; //whether to show paths of enemies - public static boolean showPaths = true; + public static boolean showPaths = false; //if false, player is always hidden public static boolean showPlayer = true; //whether to hide ui, only on debug @@ -81,6 +82,8 @@ public class Vars{ public static final int saveSlots = 64; + public static final float itemSize = 5f; + //only if smoothCamera public static boolean snapCamera = true; @@ -132,8 +135,10 @@ public class Vars{ public static EntityGroup shieldGroup; public static EntityGroup effectGroup; public static EntityGroup groundEffectGroup; + public static EntityGroup itemGroup; + public static EntityGroup puddleGroup; - public static EntityGroup airItemGroup; + public static EntityGroup fireGroup; public static EntityGroup[] unitGroups; public static void init(){ @@ -146,7 +151,8 @@ public class Vars{ effectGroup = Entities.addGroup(EffectEntity.class, false); groundEffectGroup = Entities.addGroup(DrawTrait.class, false); puddleGroup = Entities.addGroup(Puddle.class, false); - airItemGroup = Entities.addGroup(Fire.class, false); + itemGroup = Entities.addGroup(ItemDrop.class); + fireGroup = Entities.addGroup(Fire.class, false); unitGroups = new EntityGroup[Team.values().length]; threads = new ThreadHandler(Platform.instance.getThreadProvider()); diff --git a/core/src/io/anuke/mindustry/content/StatusEffects.java b/core/src/io/anuke/mindustry/content/StatusEffects.java index 22f0560752..f660cffaeb 100644 --- a/core/src/io/anuke/mindustry/content/StatusEffects.java +++ b/core/src/io/anuke/mindustry/content/StatusEffects.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.content; import io.anuke.mindustry.content.fx.EnvironmentFx; import io.anuke.mindustry.entities.StatusController.TransitionResult; -import io.anuke.mindustry.entities.StatusEffect; +import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.type.ContentList; import io.anuke.ucore.core.Effects; diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index ff4d6e64f8..d129fb0d49 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -4,7 +4,7 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.blocks.*; import io.anuke.mindustry.content.bullets.*; import io.anuke.mindustry.content.fx.*; -import io.anuke.mindustry.entities.StatusEffect; +import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.entities.units.UnitType; import io.anuke.mindustry.type.ContentList; diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 5dd207e01a..5d762fbb44 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -149,9 +149,10 @@ public class Logic extends Module { } Entities.update(puddleGroup); Entities.update(tileGroup); - Entities.update(airItemGroup); + Entities.update(fireGroup); Entities.update(shieldGroup); Entities.update(playerGroup); + Entities.update(itemGroup); for(EntityGroup group : unitGroups){ if(!group.isEmpty()){ @@ -166,6 +167,7 @@ public class Logic extends Module { } EntityPhysics.collideGroups(bulletGroup, playerGroup); + EntityPhysics.collideGroups(itemGroup, playerGroup); world.pathfinder().update(); } diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index 9a9f3a3fa1..d108599824 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -5,7 +5,7 @@ import com.badlogic.gdx.utils.Base64Coder; import io.anuke.mindustry.core.ThreadHandler.ThreadProvider; import io.anuke.ucore.core.Settings; import io.anuke.ucore.entities.EntityGroup; -import io.anuke.ucore.entities.component.Entity; +import io.anuke.ucore.entities.trait.Entity; import io.anuke.ucore.function.Consumer; import io.anuke.ucore.scene.ui.TextField; diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 905228f90b..b249b48dc3 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -78,7 +78,6 @@ public class Renderer extends RendererModule{ entity.effect = effect; entity.color = color; entity.rotation = rotation; - entity.lifetime = effect.lifetime; entity.data = data; entity.id ++; entity.set(x, y); @@ -92,7 +91,6 @@ public class Renderer extends RendererModule{ entity.effect = effect; entity.color = color; entity.rotation = rotation; - entity.lifetime = effect.lifetime; entity.id ++; entity.data = data; entity.set(x, y); @@ -207,6 +205,7 @@ public class Renderer extends RendererModule{ EntityDraw.draw(groundEffectGroup, e -> e instanceof BelowLiquidTrait); EntityDraw.draw(puddleGroup); EntityDraw.draw(groundEffectGroup, e -> !(e instanceof BelowLiquidTrait)); + EntityDraw.draw(itemGroup); blocks.processBlocks(); blocks.drawBlocks(Layer.block); @@ -229,7 +228,7 @@ public class Renderer extends RendererModule{ drawAllTeams(true); EntityDraw.draw(bulletGroup); - EntityDraw.draw(airItemGroup); + EntityDraw.draw(fireGroup); EntityDraw.draw(effectGroup); overlays.drawTop(); diff --git a/core/src/io/anuke/mindustry/core/ThreadHandler.java b/core/src/io/anuke/mindustry/core/ThreadHandler.java index 8eedb881b4..1a7f7dec04 100644 --- a/core/src/io/anuke/mindustry/core/ThreadHandler.java +++ b/core/src/io/anuke/mindustry/core/ThreadHandler.java @@ -7,7 +7,7 @@ import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup.ArrayContainer; -import io.anuke.ucore.entities.component.Entity; +import io.anuke.ucore.entities.trait.Entity; import io.anuke.ucore.util.Log; import static io.anuke.mindustry.Vars.control; diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 3ff45e55f9..6e45bbd6fb 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -11,6 +11,7 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Mechs; import io.anuke.mindustry.content.Weapons; import io.anuke.mindustry.entities.effect.DamageArea; +import io.anuke.mindustry.entities.effect.ItemDrop; import io.anuke.mindustry.entities.traits.BuilderTrait; import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.game.Team; @@ -22,7 +23,7 @@ import io.anuke.mindustry.world.blocks.types.Floor; import io.anuke.mindustry.world.blocks.types.storage.CoreBlock.CoreEntity; import io.anuke.ucore.core.*; import io.anuke.ucore.entities.EntityGroup; -import io.anuke.ucore.entities.component.SolidTrait; +import io.anuke.ucore.entities.trait.SolidTrait; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Fill; import io.anuke.ucore.graphics.Lines; @@ -145,10 +146,10 @@ public class Player extends Unit implements BuilderTrait { } @Override - public boolean collides(SolidTrait other){ - return !isDead() && super.collides(other) && !mech.flying; + public boolean collides(SolidTrait other) { + return super.collides(other) || other instanceof ItemDrop; } - + @Override public void onDeath(){ dead = true; diff --git a/core/src/io/anuke/mindustry/entities/StatusController.java b/core/src/io/anuke/mindustry/entities/StatusController.java index b6bcba7aef..79d0f138fc 100644 --- a/core/src/io/anuke/mindustry/entities/StatusController.java +++ b/core/src/io/anuke/mindustry/entities/StatusController.java @@ -1,16 +1,17 @@ package io.anuke.mindustry.entities; import io.anuke.mindustry.content.StatusEffects; +import io.anuke.mindustry.type.StatusEffect; import io.anuke.ucore.core.Timers; /**Class for controlling status effects on an entity.*/ public class StatusController { private static final TransitionResult globalResult = new TransitionResult(); - private StatusEffect current = StatusEffects.none; + private io.anuke.mindustry.type.StatusEffect current = StatusEffects.none; private float time; - public void handleApply(Unit unit, StatusEffect effect, float intensity){ + public void handleApply(Unit unit, io.anuke.mindustry.type.StatusEffect effect, float intensity){ if(effect == StatusEffects.none) return; //don't apply empty effects float newTime = effect.baseDuration*intensity; @@ -44,12 +45,12 @@ public class StatusController { } } - public void set(StatusEffect current, float time){ + public void set(io.anuke.mindustry.type.StatusEffect current, float time){ this.current = current; this.time = time; } - public StatusEffect current() { + public io.anuke.mindustry.type.StatusEffect current() { return current; } @@ -58,7 +59,7 @@ public class StatusController { } public static class TransitionResult{ - public StatusEffect result; + public io.anuke.mindustry.type.StatusEffect result; public float time; public TransitionResult set(StatusEffect effect, float time){ diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java index 0219fbd6f2..7bdce2e6f6 100644 --- a/core/src/io/anuke/mindustry/entities/Unit.java +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.entities; import com.badlogic.gdx.math.Vector2; import io.anuke.mindustry.content.blocks.Blocks; -import io.anuke.mindustry.entities.bullet.Bullet; import io.anuke.mindustry.entities.traits.SaveTrait; import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.entities.traits.TargetTrait; @@ -11,12 +10,14 @@ import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.TeamInfo.TeamData; import io.anuke.mindustry.net.Interpolator; import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.types.Floor; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; -import io.anuke.ucore.entities.component.DrawTrait; -import io.anuke.ucore.entities.component.SolidTrait; +import io.anuke.ucore.entities.trait.DamageTrait; +import io.anuke.ucore.entities.trait.DrawTrait; +import io.anuke.ucore.entities.trait.SolidTrait; import io.anuke.ucore.entities.impl.DestructibleEntity; import io.anuke.ucore.util.Geometry; import io.anuke.ucore.util.Mathf; @@ -70,7 +71,8 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ @Override public boolean collides(SolidTrait other){ - return other instanceof Bullet && state.teams.areEnemies((((Bullet) other).team), team); + return other instanceof DamageTrait && other + instanceof TeamTrait && state.teams.areEnemies((((TeamTrait) other).getTeam()), team) && !isDead(); } @Override @@ -110,10 +112,10 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ this.health = health; this.x = x; this.y = y; - this.status.set(StatusEffect.getByID(effect), etime); + this.status.set(io.anuke.mindustry.type.StatusEffect.getByID(effect), etime); } - public StatusEffect getStatus(){ + public io.anuke.mindustry.type.StatusEffect getStatus(){ return status.current(); } diff --git a/core/src/io/anuke/mindustry/entities/UnitInventory.java b/core/src/io/anuke/mindustry/entities/UnitInventory.java index f3a54cb5e0..98e06af93e 100644 --- a/core/src/io/anuke/mindustry/entities/UnitInventory.java +++ b/core/src/io/anuke/mindustry/entities/UnitInventory.java @@ -27,10 +27,6 @@ public class UnitInventory { return item != null && item.amount >= capacity; } - public boolean isInfiniteAmmo() { - return infiniteAmmo; - } - public void setInfiniteAmmo(boolean infinite){ infiniteAmmo = infinite; } @@ -137,6 +133,10 @@ public class UnitInventory { return !hasItem() || (item.item == type && capacity - item.amount > 0); } + public boolean canAcceptItem(Item type, int amount){ + return !hasItem() || (item.item == type && item.amount + amount <= capacity); + } + public void clear(){ item = null; ammos.clear(); diff --git a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java b/core/src/io/anuke/mindustry/entities/bullet/Bullet.java index 779b8b33ff..3c7ccf6019 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java +++ b/core/src/io/anuke/mindustry/entities/bullet/Bullet.java @@ -7,16 +7,16 @@ import io.anuke.mindustry.entities.traits.TeamTrait; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.entities.EntityGroup; -import io.anuke.ucore.entities.component.Entity; -import io.anuke.ucore.entities.component.SolidTrait; -import io.anuke.ucore.entities.component.VelocityTrait; +import io.anuke.ucore.entities.trait.Entity; +import io.anuke.ucore.entities.trait.SolidTrait; +import io.anuke.ucore.entities.trait.VelocityTrait; import io.anuke.ucore.entities.impl.BulletEntity; import io.anuke.ucore.util.Timer; import static io.anuke.mindustry.Vars.bulletGroup; import static io.anuke.mindustry.Vars.world; -public class Bullet extends BulletEntity{ +public class Bullet extends BulletEntity implements TeamTrait{ private static Vector2 vector = new Vector2(); public Timer timer = new Timer(3); @@ -52,6 +52,11 @@ public class Bullet extends BulletEntity{ return true; //TODO make artillery and such not do this } + @Override + public Team getTeam() { + return team; + } + @Override public void draw(){ type.draw(this); diff --git a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java index 342cdc6e17..4702633b42 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.entities.bullet; import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.content.fx.BulletFx; -import io.anuke.mindustry.entities.StatusEffect; +import io.anuke.mindustry.type.StatusEffect; import io.anuke.ucore.core.Effects; import io.anuke.ucore.entities.impl.BaseBulletType; diff --git a/core/src/io/anuke/mindustry/entities/effect/Fire.java b/core/src/io/anuke/mindustry/entities/effect/Fire.java index 03e1eb749e..3fa2f17d0e 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Fire.java +++ b/core/src/io/anuke/mindustry/entities/effect/Fire.java @@ -13,7 +13,7 @@ import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.EntityGroup; -import io.anuke.ucore.entities.component.DrawTrait; +import io.anuke.ucore.entities.trait.DrawTrait; import io.anuke.ucore.entities.impl.TimedEntity; import io.anuke.ucore.util.Geometry; import io.anuke.ucore.util.Mathf; @@ -32,6 +32,7 @@ public class Fire extends TimedEntity implements SaveTrait, Poolable, DrawTrait private Tile tile; private Block block; private float baseFlammability = -1, puddleFlammability; + private float lifetime; /**Start a fire on the tile. If there already is a file there, refreshes its lifetime..*/ public static void create(Tile tile){ @@ -59,6 +60,11 @@ public class Fire extends TimedEntity implements SaveTrait, Poolable, DrawTrait /**Deserialization use only!*/ public Fire(){} + @Override + public float lifetime() { + return lifetime; + } + @Override public void update() { super.update(); @@ -153,6 +159,6 @@ public class Fire extends TimedEntity implements SaveTrait, Poolable, DrawTrait @Override public EntityGroup targetGroup() { - return airItemGroup; + return fireGroup; } } diff --git a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java b/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java index b2ce950deb..9fc829dba7 100644 --- a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java +++ b/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java @@ -22,7 +22,7 @@ public class GroundEffectEntity extends EffectEntity { time = Mathf.clamp(time, 0, effect.staticLife); - if (!once && time >= lifetime) { + if (!once && time >= lifetime()) { once = true; time = 0f; Tile tile = Vars.world.tileWorld(x, y); @@ -42,7 +42,7 @@ public class GroundEffectEntity extends EffectEntity { GroundEffect effect = (GroundEffect)this.effect; if(once && effect.isStatic) - Effects.renderEffect(id, effect, color, lifetime, rotation, x, y, data); + Effects.renderEffect(id, effect, color, lifetime(), rotation, x, y, data); else Effects.renderEffect(id, effect, color, time, rotation, x, y, data); } diff --git a/core/src/io/anuke/mindustry/entities/effect/ItemDrop.java b/core/src/io/anuke/mindustry/entities/effect/ItemDrop.java index b3d2cbb24b..15d7c3b9e1 100644 --- a/core/src/io/anuke/mindustry/entities/effect/ItemDrop.java +++ b/core/src/io/anuke/mindustry/entities/effect/ItemDrop.java @@ -1,28 +1,133 @@ package io.anuke.mindustry.entities.effect; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Pool.Poolable; import com.badlogic.gdx.utils.Pools; +import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.net.Interpolator; import io.anuke.mindustry.type.Item; -import io.anuke.ucore.entities.component.DrawTrait; +import io.anuke.mindustry.world.Tile; +import io.anuke.ucore.core.Effects; +import io.anuke.ucore.core.Timers; +import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.impl.SolidEntity; +import io.anuke.ucore.entities.trait.DrawTrait; +import io.anuke.ucore.entities.trait.SolidTrait; +import io.anuke.ucore.entities.trait.TimeTrait; +import io.anuke.ucore.entities.trait.VelocityTrait; +import io.anuke.ucore.graphics.Draw; +import io.anuke.ucore.util.Mathf; import java.nio.ByteBuffer; -public class ItemDrop extends SolidEntity implements SyncTrait, DrawTrait { +import static io.anuke.mindustry.Vars.itemGroup; +import static io.anuke.mindustry.Vars.itemSize; +import static io.anuke.mindustry.Vars.world; + +public class ItemDrop extends SolidEntity implements SyncTrait, DrawTrait, VelocityTrait, TimeTrait, Poolable { + private static final float sinkLifetime = 80f; + private Interpolator interpolator = new Interpolator(); private Item item; + private int amount; - public static ItemDrop create(Item item, float x, float y){ + private Vector2 velocity = new Vector2(); + private float time; + private float sinktime; + + public static ItemDrop create(Item item, int amount, float x, float y, float angle){ ItemDrop drop = Pools.obtain(ItemDrop.class); drop.item = item; + drop.amount = amount; + drop.velocity.set(4f, 0f).rotate(angle); drop.set(x, y); + drop.add(); return drop; } /**Internal use only!*/ - public ItemDrop(){} + public ItemDrop(){ + hitbox.setSize(5f); + } + + @Override + public float lifetime() { + return 60*60; + } + + @Override + public void time(float time) { + this.time = time; + } + + @Override + public float time() { + return time; + } + + @Override + public Vector2 getVelocity() { + return velocity; + } + + @Override + public boolean collides(SolidTrait other) { + return other instanceof Player && time > 20f; + } + + @Override + public void collision(SolidTrait other, float x, float y) { + Player player = (Player)other; + if(player.inventory.canAcceptItem(item, amount)){ + player.inventory.addItem(item, amount); + remove(); + } + } + + @Override + public void draw() { + float size = itemSize * (1f - sinktime/sinkLifetime); + + Tile tile = world.tileWorld(x, y); + + Draw.color(Color.WHITE, tile == null || !tile.floor().liquid ? Color.WHITE : tile.floor().liquidColor, sinktime/sinkLifetime); + Draw.rect(item.region, x, y, size, size); + + int stored = Mathf.clamp(amount / 6, 1, 8); + + for(int i = 0; i < stored; i ++) { + float px = Mathf.randomSeedRange(i + 1, 4f); + float py = Mathf.randomSeedRange(i + 2, 4f); + Draw.rect(item.region, x + px, y + py, size, size); + } + + Draw.color(); + } + + @Override + public void update() { + updateVelocity(0.2f); + updateTime(); + + Tile tile = world.tileWorld(x, y); + + if(tile.floor().liquid){ + sinktime += Timers.delta(); + + if(Mathf.chance(0.04 * Timers.delta())){ + Effects.effect(tile.floor().drownUpdateEffect, tile.floor().liquidColor, x, y); + } + + if(sinktime >= sinkLifetime){ + remove(); + } + }else{ + sinktime = 0f; + } + } @Override public void removed() { @@ -30,8 +135,8 @@ public class ItemDrop extends SolidEntity implements SyncTrait, DrawTrait { } @Override - public void draw() { - + public void reset() { + time = 0f; } @Override @@ -44,6 +149,11 @@ public class ItemDrop extends SolidEntity implements SyncTrait, DrawTrait { return 10; } + @Override + public EntityGroup targetGroup() { + return itemGroup; + } + @Override public void write(ByteBuffer data) { data.putFloat(x); @@ -52,6 +162,7 @@ public class ItemDrop extends SolidEntity implements SyncTrait, DrawTrait { @Override public void read(ByteBuffer data, long time) { - + x = data.getFloat(); + y = data.getFloat(); } } diff --git a/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java b/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java index 4cf1772e04..6eea5e77cb 100644 --- a/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java +++ b/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java @@ -6,14 +6,14 @@ import com.badlogic.gdx.utils.Pools; import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.type.Item; import io.anuke.ucore.entities.EntityGroup; -import io.anuke.ucore.entities.component.DrawTrait; +import io.anuke.ucore.entities.trait.DrawTrait; import io.anuke.ucore.entities.impl.TimedEntity; import io.anuke.ucore.function.Callable; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Fill; import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.util.Mathf; -import io.anuke.ucore.util.Position; +import io.anuke.ucore.entities.trait.PosTrait; import static io.anuke.mindustry.Vars.effectGroup; @@ -23,22 +23,26 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{ private Vector2 tovec = new Vector2(); private Item item; private float seed; - private Position to; + private PosTrait to; private Callable done; - public static void create(Item item, float fromx, float fromy, Position to, Callable done){ + public static void create(Item item, float fromx, float fromy, PosTrait to, Callable done){ ItemTransfer tr = Pools.obtain(ItemTransfer.class); tr.item = item; tr.from.set(fromx, fromy); tr.to = to; tr.done = done; - tr.lifetime = 60f; tr.seed = Mathf.range(1f); tr.add(); } public ItemTransfer(){} + @Override + public float lifetime() { + return 60; + } + @Override public void reset() { super.reset(); diff --git a/core/src/io/anuke/mindustry/entities/effect/Lightning.java b/core/src/io/anuke/mindustry/entities/effect/Lightning.java index 5ae4657123..c3f38ed036 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Lightning.java +++ b/core/src/io/anuke/mindustry/entities/effect/Lightning.java @@ -13,7 +13,7 @@ import io.anuke.mindustry.graphics.Palette; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.entities.EntityGroup; -import io.anuke.ucore.entities.component.SolidTrait; +import io.anuke.ucore.entities.trait.SolidTrait; import io.anuke.ucore.entities.impl.TimedEntity; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Lines; @@ -39,7 +39,6 @@ public class Lightning extends TimedEntity implements Poolable{ l.x = x; l.y = y; - l.lifetime = 10f; l.color = color; float step = 3f; @@ -100,6 +99,11 @@ public class Lightning extends TimedEntity implements Poolable{ /**For pooling use only. Do not call directly!*/ public Lightning(){} + @Override + public float lifetime() { + return 10; + } + @Override public void reset() { color = Palette.lancerLaser; diff --git a/core/src/io/anuke/mindustry/entities/effect/Puddle.java b/core/src/io/anuke/mindustry/entities/effect/Puddle.java index e1a951ca56..57f21840e3 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Puddle.java +++ b/core/src/io/anuke/mindustry/entities/effect/Puddle.java @@ -20,7 +20,7 @@ import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.EntityGroup; -import io.anuke.ucore.entities.component.DrawTrait; +import io.anuke.ucore.entities.trait.DrawTrait; import io.anuke.ucore.entities.impl.BaseEntity; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Fill; diff --git a/core/src/io/anuke/mindustry/entities/effect/Rubble.java b/core/src/io/anuke/mindustry/entities/effect/Rubble.java index a90f2f5bb6..6b8864c7da 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Rubble.java +++ b/core/src/io/anuke/mindustry/entities/effect/Rubble.java @@ -22,8 +22,9 @@ public class Rubble extends TimedEntity implements BelowLiquidTrait { rubble.add(); } - public Rubble(){ - lifetime = 7000f; + @Override + public float lifetime() { + return 7000f; } @Override diff --git a/core/src/io/anuke/mindustry/entities/traits/SaveTrait.java b/core/src/io/anuke/mindustry/entities/traits/SaveTrait.java index c23efa78ff..a6f94b371a 100644 --- a/core/src/io/anuke/mindustry/entities/traits/SaveTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/SaveTrait.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.entities.traits; -import io.anuke.ucore.entities.component.Entity; +import io.anuke.ucore.entities.trait.Entity; import java.io.DataInputStream; import java.io.DataOutputStream; diff --git a/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java b/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java index ceff825508..21113f01d9 100644 --- a/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.entities.traits; import com.badlogic.gdx.Gdx; import io.anuke.mindustry.net.Interpolator; -import io.anuke.ucore.entities.component.Entity; +import io.anuke.ucore.entities.trait.Entity; import java.nio.ByteBuffer; diff --git a/core/src/io/anuke/mindustry/entities/traits/TargetTrait.java b/core/src/io/anuke/mindustry/entities/traits/TargetTrait.java index e1d485a307..488f853feb 100644 --- a/core/src/io/anuke/mindustry/entities/traits/TargetTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/TargetTrait.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.entities.traits; import io.anuke.mindustry.game.Team; -import io.anuke.ucore.entities.component.VelocityTrait; -import io.anuke.ucore.util.Position; +import io.anuke.ucore.entities.trait.VelocityTrait; +import io.anuke.ucore.entities.trait.PosTrait; /**Base interface for targetable entities.*/ -public interface TargetTrait extends Position, VelocityTrait { +public interface TargetTrait extends PosTrait, VelocityTrait { boolean isDead(); Team getTeam(); diff --git a/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java b/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java index 77809420ff..a02c3e902c 100644 --- a/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.entities.traits; import io.anuke.mindustry.game.Team; -import io.anuke.ucore.entities.component.Entity; +import io.anuke.ucore.entities.trait.Entity; public interface TeamTrait extends Entity { Team getTeam(); diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index 8d7ad64c4e..d3901a45af 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -163,7 +163,7 @@ public class DesktopInput extends InputHandler{ } if(canTapPlayer(Graphics.mouseWorld().x, Graphics.mouseWorld().y)){ - cursorType = drill; + cursorType = unload; } } @@ -246,7 +246,7 @@ public class DesktopInput extends InputHandler{ } } - tryDropItems(cursor.target()); + tryDropItems(cursor.target(), Graphics.world(screenX, screenY).x, Graphics.world(screenX, screenY).y); mode = none; diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 4a71d646e3..f2565a7475 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.input; import com.badlogic.gdx.InputAdapter; import com.badlogic.gdx.math.Vector2; import io.anuke.mindustry.content.blocks.Blocks; +import io.anuke.mindustry.entities.effect.ItemDrop; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.effect.ItemTransfer; @@ -189,7 +190,7 @@ public abstract class InputHandler extends InputAdapter{ return droppingItem; } - public void tryDropItems(Tile tile){ + public void tryDropItems(Tile tile, float x, float y){ if(!droppingItem || !player.inventory.hasItem() || !tile.block().hasItems){ droppingItem = false; return; @@ -240,6 +241,9 @@ public abstract class InputHandler extends InputAdapter{ } }); } + }else{ + ItemDrop.create(stack.item, stack.amount, player.x, player.y, player.angleTo(x, y)); + player.inventory.clearItem(); } //TODO create drop on the ground otherwise } diff --git a/core/src/io/anuke/mindustry/io/MapIO.java b/core/src/io/anuke/mindustry/io/MapIO.java index 39937f0050..c72f034e3e 100644 --- a/core/src/io/anuke/mindustry/io/MapIO.java +++ b/core/src/io/anuke/mindustry/io/MapIO.java @@ -20,15 +20,11 @@ import java.io.IOException; import java.io.OutputStream; /**Reads and writes map files.*/ -//TODO GWT support -//TODO map header that maps block names to IDs for backwards compatibility public class MapIO { private static final int version = 0; - private static final IntIntMap defaultBlockMap = new IntIntMap(); - - //TODO static initializers are evil, remove - static{ + private static IntIntMap defaultBlockMap = new IntIntMap(); + private static void loadDefaultBlocks(){ for(Block block : Block.getAllBlocks()){ defaultBlockMap.put(block.id, block.id); } @@ -77,6 +73,10 @@ public class MapIO { } public static void writeMap(OutputStream stream, ObjectMap tags, MapTileData data) throws IOException{ + if(defaultBlockMap == null){ + loadDefaultBlocks(); + } + MapMeta meta = new MapMeta(version, tags, data.width(), data.height(), defaultBlockMap); DataOutputStream ds = new DataOutputStream(stream); diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index f628ead9e8..185a5bbcb0 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -15,7 +15,7 @@ import io.anuke.mindustry.world.blocks.types.BlockPart; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityPhysics; -import io.anuke.ucore.entities.component.Entity; +import io.anuke.ucore.entities.trait.Entity; import io.anuke.ucore.util.Bits; import java.io.DataInputStream; diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/io/anuke/mindustry/type/Liquid.java index 5ea0ac086d..06f42745be 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/io/anuke/mindustry/type/Liquid.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.type; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.content.StatusEffects; -import io.anuke.mindustry.entities.StatusEffect; import io.anuke.mindustry.game.Content; import io.anuke.ucore.util.Bundles; diff --git a/core/src/io/anuke/mindustry/entities/StatusEffect.java b/core/src/io/anuke/mindustry/type/StatusEffect.java similarity index 96% rename from core/src/io/anuke/mindustry/entities/StatusEffect.java rename to core/src/io/anuke/mindustry/type/StatusEffect.java index 3e038e63f3..66e26174b3 100644 --- a/core/src/io/anuke/mindustry/entities/StatusEffect.java +++ b/core/src/io/anuke/mindustry/type/StatusEffect.java @@ -1,8 +1,9 @@ -package io.anuke.mindustry.entities; +package io.anuke.mindustry.type; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectSet; import io.anuke.mindustry.entities.StatusController.TransitionResult; +import io.anuke.mindustry.entities.Unit; public class StatusEffect{ private static final Array array = new Array<>(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index d05a288953..523a18ccac 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -5,8 +5,8 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.IntSet; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.entities.effect.ItemTransfer; import io.anuke.mindustry.entities.Player; +import io.anuke.mindustry.entities.effect.ItemTransfer; import io.anuke.mindustry.input.InputHandler; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.ui.ItemImage; diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 8f3922f692..f6b4a3d642 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -15,13 +15,13 @@ import io.anuke.mindustry.world.blocks.types.modules.LiquidModule; import io.anuke.mindustry.world.blocks.types.modules.PowerModule; import io.anuke.ucore.function.Consumer; import io.anuke.ucore.util.Bits; -import io.anuke.ucore.util.Position; +import io.anuke.ucore.entities.trait.PosTrait; import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.world; -public class Tile implements Position, TargetTrait { +public class Tile implements PosTrait, TargetTrait { public static final Object tileSetLock = new Object(); /**Block ID data.*/ @@ -360,6 +360,12 @@ public class Tile implements Position, TargetTrait { return drawy(); } + @Override + public void setX(float x) {} + + @Override + public void setY(float y) {} + @Override public String toString(){ Block block = block(); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/Floor.java b/core/src/io/anuke/mindustry/world/blocks/types/Floor.java index 24d1b48412..0eb25ee907 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/Floor.java @@ -6,7 +6,7 @@ import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.content.fx.BlockFx; -import io.anuke.mindustry.entities.StatusEffect; +import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java index 7852cade6c..4ccfb6d511 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java @@ -17,6 +17,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import static io.anuke.mindustry.Vars.itemSize; import static io.anuke.mindustry.Vars.tilesize; public class Conveyor extends Block{ @@ -27,7 +28,6 @@ public class Conveyor extends Block{ private static final float itemSpace = 0.135f * 2.2f; private static final float offsetScl = 128f*3f; private static final float minmove = 1f / (Short.MAX_VALUE - 2); - private static final float itemSize = 5f; private final Translator tr1 = new Translator(); private final Translator tr2 = new Translator(); diff --git a/kryonet/src/io/anuke/kryonet/DefaultThreadImpl.java b/kryonet/src/io/anuke/kryonet/DefaultThreadImpl.java index 30648bd868..7e2b8670f6 100644 --- a/kryonet/src/io/anuke/kryonet/DefaultThreadImpl.java +++ b/kryonet/src/io/anuke/kryonet/DefaultThreadImpl.java @@ -3,7 +3,7 @@ package io.anuke.kryonet; import io.anuke.mindustry.core.ThreadHandler.ThreadProvider; import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup.EntityContainer; -import io.anuke.ucore.entities.component.Entity; +import io.anuke.ucore.entities.trait.Entity; import io.anuke.ucore.util.Log; import java.util.Iterator;