properly add / remove things from tiles

world-object-unification-project
Ivory 2023-01-10 01:26:30 -05:00
parent e31a164871
commit 17171f4e6e
4 changed files with 47 additions and 13 deletions

View File

@ -120,8 +120,7 @@ public class Tree extends WorldObject implements ITileThing, ISelectable, IWorka
@Override @Override
public void onRemove() { public void onRemove() {
Vector2i pos = getWorldPosition().xy(); Vector2i pos = getWorldPosition().xy();
Log log = new Log(pos.x, pos.y); add(new Log(pos.x, pos.y));
getTile().placeThing(log);
} }
@Override @Override

View File

@ -3,6 +3,7 @@ package xyz.valnet.hadean.gameobjects.worldobjects;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.engine.math.Vector4i; import xyz.valnet.engine.math.Vector4i;
import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.GameObject;
@ -42,6 +43,7 @@ public abstract class WorldObject extends GameObject {
private void updateTileLinks(Set<Tile> tiles) { private void updateTileLinks(Set<Tile> tiles) {
if(tiles == null || tiles.size() == 0) return; if(tiles == null || tiles.size() == 0) return;
if(!(this instanceof ITileThing)) return; if(!(this instanceof ITileThing)) return;
boolean inScene = inScene();
Set<Tile> removeTiles = new HashSet<Tile>(); Set<Tile> removeTiles = new HashSet<Tile>();
Set<Tile> addTiles = new HashSet<Tile>(); Set<Tile> addTiles = new HashSet<Tile>();
@ -58,25 +60,41 @@ public abstract class WorldObject extends GameObject {
for(Tile tile : removeTiles) { for(Tile tile : removeTiles) {
linkedTiles.remove(tile); linkedTiles.remove(tile);
tile.remove(this); if(this instanceof ITileThing) {
tile.removeThing((ITileThing) this);
}
} }
for(Tile tile : addTiles) { for(Tile tile : addTiles) {
linkedTiles.add(tile); linkedTiles.add(tile);
tile.placeThing((ITileThing) this); if(this instanceof ITileThing) {
tile.placeThing((ITileThing) this);
}
}
if(linkedTiles.size() == 0 && inScene()) {
remove(this);
}
if(linkedTiles.size() != 0 && !inScene()) {
add(this);
} }
} }
public void setPosition(Vector4i vector) { protected void setPosition(Vector4i vector) {
setPosition(vector.x, vector.y, vector.z, vector.w); setPosition(vector.x, vector.y, vector.z, vector.w);
} }
public void setPosition(int x, int y) { protected void setPosition(Vector2i vector) {
setPosition(vector.x, vector.y);
}
protected void setPosition(int x, int y) {
setPosition(x, y, 1, 1); setPosition(x, y, 1, 1);
} }
public void setPosition(int x, int y, int w, int h) { protected void setPosition(int x, int y, int w, int h) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.w = w; this.w = w;

View File

@ -1,6 +1,7 @@
package xyz.valnet.hadean.gameobjects.worldobjects.items; package xyz.valnet.hadean.gameobjects.worldobjects.items;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4i;
import xyz.valnet.hadean.gameobjects.Job; import xyz.valnet.hadean.gameobjects.Job;
import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.gameobjects.JobBoard;
import xyz.valnet.hadean.gameobjects.Tile; import xyz.valnet.hadean.gameobjects.Tile;
@ -91,4 +92,22 @@ public abstract class Item extends WorldObject implements ISelectable, ITileThin
public boolean matches(IItemPredicate itemPredicate) { public boolean matches(IItemPredicate itemPredicate) {
return itemPredicate.matches(this); return itemPredicate.matches(this);
} }
public void setPosition(Vector4i vector) {
super.setPosition(vector);
}
public void setPosition(Vector2i vector) {
super.setPosition(vector);
}
public void setPosition(int x, int y) {
super.setPosition(x, y);
}
public void setPosition(int x, int y, int w, int h) {
super.setPosition(x, y, w, h);
}
} }

View File

@ -42,9 +42,7 @@ public class Pawn extends Agent {
public void pickupItemByPredicate(IItemPredicate itemPredicate) { public void pickupItemByPredicate(IItemPredicate itemPredicate) {
Item item = getTile().pickupByItemPredicate(itemPredicate); Item item = getTile().pickupByItemPredicate(itemPredicate);
if(item == null) return; dropoffItem(item);
remove(item);
inventory.add(item);
} }
public void pickupItem(Item i) { public void pickupItem(Item i) {
@ -58,8 +56,8 @@ public class Pawn extends Agent {
if(!inventory.contains(item)) { if(!inventory.contains(item)) {
return; return;
} }
inventory.remove(item); inventory.remove(add(item));
add(item); item.setPosition(getWorldPosition().xy());
getTile().placeThing(item); getTile().placeThing(item);
} }