diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..30e75dc
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 9c32aed..06ba9f4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,11 +9,69 @@
1.0-SNAPSHOT
- 22
- 22
+ 23
+ 23
UTF-8
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.36
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.2.1
+
+
+ package
+
+ shade
+
+
+
+
+
+
+ cz.jzitnik.Main
+
+
+ false
+ false
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 3.1.0
+
+
+
+ java
+
+
+
+
+ cz.jzitnik.Main
+ compile
+
+
+
+
org.projectlombok
@@ -51,12 +109,24 @@
jackson-databind
2.18.2
+
junit
junit
4.13.2
test
+
+
+ org.slf4j
+ slf4j-api
+ 2.0.17
+
+
+ org.slf4j
+ slf4j-simple
+ 2.0.17
+
diff --git a/src/main/java/cz/jzitnik/Main.java b/src/main/java/cz/jzitnik/Main.java
index 58b2936..bb77c7a 100644
--- a/src/main/java/cz/jzitnik/Main.java
+++ b/src/main/java/cz/jzitnik/Main.java
@@ -13,6 +13,7 @@ import org.jline.terminal.Terminal;
import org.jline.terminal.TerminalBuilder;
import java.io.IOException;
+import java.sql.SQLOutput;
public class Main {
public static void main(String[] args) {
@@ -64,7 +65,7 @@ public class Main {
terminal.trackMouse(Terminal.MouseTracking.Off);
terminal.close();
- } catch (IOException | InterruptedException _) {
+ } catch (IOException | InterruptedException ignored) {
}
}
}
diff --git a/src/main/java/cz/jzitnik/game/Game.java b/src/main/java/cz/jzitnik/game/Game.java
index 826154e..804b4f3 100644
--- a/src/main/java/cz/jzitnik/game/Game.java
+++ b/src/main/java/cz/jzitnik/game/Game.java
@@ -22,7 +22,6 @@ import lombok.Getter;
import lombok.Setter;
import org.jline.terminal.Terminal;
-import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
diff --git a/src/main/java/cz/jzitnik/game/annotations/PickupHandler.java b/src/main/java/cz/jzitnik/game/annotations/PickupHandler.java
new file mode 100644
index 0000000..8f0d6e0
--- /dev/null
+++ b/src/main/java/cz/jzitnik/game/annotations/PickupHandler.java
@@ -0,0 +1,12 @@
+package cz.jzitnik.game.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface PickupHandler {
+ String value();
+}
diff --git a/src/main/java/cz/jzitnik/game/crafting/recipes/BucketRecipe.java b/src/main/java/cz/jzitnik/game/crafting/recipes/BucketRecipe.java
index 637cea3..21290ba 100644
--- a/src/main/java/cz/jzitnik/game/crafting/recipes/BucketRecipe.java
+++ b/src/main/java/cz/jzitnik/game/crafting/recipes/BucketRecipe.java
@@ -3,10 +3,15 @@ package cz.jzitnik.game.crafting.recipes;
import cz.jzitnik.game.annotations.CraftingRecipeRegistry;
@CraftingRecipeRegistry(
- recipe = {
+ /*recipe = {
"iron_ingot", "_", "iron_ingot",
"_", "iron_ingot", "_",
"_", "_", "_"
+ },*/
+ recipe = {
+ "dirt", "_", "_",
+ "_", "_", "_",
+ "_", "_", "_"
},
result = "bucket",
amount = 1
diff --git a/src/main/java/cz/jzitnik/game/entities/Dependencies.java b/src/main/java/cz/jzitnik/game/entities/Dependencies.java
index b04394b..896063c 100644
--- a/src/main/java/cz/jzitnik/game/entities/Dependencies.java
+++ b/src/main/java/cz/jzitnik/game/entities/Dependencies.java
@@ -1,5 +1,6 @@
package cz.jzitnik.game.entities;
+import cz.jzitnik.game.handlers.pickup.PickupHandlerProvider;
import cz.jzitnik.game.handlers.place.PlaceHandler;
import cz.jzitnik.game.mobs.EntityHurtAnimation;
import cz.jzitnik.game.mobs.EntityKill;
@@ -8,4 +9,5 @@ public class Dependencies {
public PlaceHandler placeHandler = new PlaceHandler();
public EntityHurtAnimation entityHurtAnimation = new EntityHurtAnimation();
public EntityKill entityKill = new EntityKill();
+ public PickupHandlerProvider pickupHandlerProvider = new PickupHandlerProvider();
}
diff --git a/src/main/java/cz/jzitnik/game/entities/items/ItemBlockSupplier.java b/src/main/java/cz/jzitnik/game/entities/items/ItemBlockSupplier.java
index faf5b43..6aa96ab 100644
--- a/src/main/java/cz/jzitnik/game/entities/items/ItemBlockSupplier.java
+++ b/src/main/java/cz/jzitnik/game/entities/items/ItemBlockSupplier.java
@@ -82,8 +82,6 @@ public class ItemBlockSupplier {
Item dropItem = getItem(dropKey);
if (dropKey.equals(block.getBlockId())) {
dropItem.setBlock(Optional.of(block));
- } else {
- dropItem.setBlock(Optional.of(getBlock(dropKey)));
}
block.setDrops(List.of(dropItem));
}
diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/WaterBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/WaterBlock.java
index a9a9e5c..c7ea153 100644
--- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/WaterBlock.java
+++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/WaterBlock.java
@@ -6,7 +6,7 @@ import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.logic.services.water.WaterData;
import cz.jzitnik.game.sprites.Water;
-@BlockRegistry("water")
+@BlockRegistry(value = "water", drops = "water_item")
public class WaterBlock extends Block {
public WaterBlock() {
super("water", SpriteLoader.SPRITES.WATER);
diff --git a/src/main/java/cz/jzitnik/game/handlers/pickup/CustomPickupHandler.java b/src/main/java/cz/jzitnik/game/handlers/pickup/CustomPickupHandler.java
new file mode 100644
index 0000000..9459450
--- /dev/null
+++ b/src/main/java/cz/jzitnik/game/handlers/pickup/CustomPickupHandler.java
@@ -0,0 +1,7 @@
+package cz.jzitnik.game.handlers.pickup;
+
+import cz.jzitnik.game.Game;
+
+public interface CustomPickupHandler {
+ boolean handle(Game game, int x, int y);
+}
diff --git a/src/main/java/cz/jzitnik/game/handlers/pickup/PickupHandlerProvider.java b/src/main/java/cz/jzitnik/game/handlers/pickup/PickupHandlerProvider.java
new file mode 100644
index 0000000..77006b7
--- /dev/null
+++ b/src/main/java/cz/jzitnik/game/handlers/pickup/PickupHandlerProvider.java
@@ -0,0 +1,44 @@
+package cz.jzitnik.game.handlers.pickup;
+
+import java.util.HashMap;
+import java.util.Set;
+
+import cz.jzitnik.game.annotations.PickupHandler;
+import org.reflections.Reflections;
+
+public class PickupHandlerProvider {
+ public final HashMap pickupList = new HashMap<>();
+
+ public CustomPickupHandler get(String itemId) {
+ return pickupList.get(itemId);
+ }
+
+ public PickupHandlerProvider() {
+ registerHandlers();
+ }
+
+ private void registerHandlers() {
+ Reflections reflections = new Reflections("cz.jzitnik.game.handlers.pickup.handlers");
+ Set> handlerClasses = reflections.getTypesAnnotatedWith(PickupHandler.class);
+
+ for (Class> clazz : handlerClasses) {
+ if (CustomPickupHandler.class.isAssignableFrom(clazz)) {
+ try {
+ CustomPickupHandler handlerInstance = (CustomPickupHandler) clazz.getDeclaredConstructor().newInstance();
+ PickupHandler annotation = clazz.getAnnotation(PickupHandler.class);
+ String key = annotation.value();
+ if (!key.contains(",")) {
+ pickupList.put(key, handlerInstance);
+ } else {
+ String[] keys = key.split(",");
+ for (String keyx : keys) {
+ pickupList.put(keyx, handlerInstance);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/cz/jzitnik/game/handlers/pickup/handlers/WaterPickupHandler.java b/src/main/java/cz/jzitnik/game/handlers/pickup/handlers/WaterPickupHandler.java
new file mode 100644
index 0000000..7f81fe0
--- /dev/null
+++ b/src/main/java/cz/jzitnik/game/handlers/pickup/handlers/WaterPickupHandler.java
@@ -0,0 +1,14 @@
+package cz.jzitnik.game.handlers.pickup.handlers;
+
+import cz.jzitnik.game.Game;
+import cz.jzitnik.game.annotations.PickupHandler;
+import cz.jzitnik.game.handlers.pickup.CustomPickupHandler;
+
+@PickupHandler("bucket,water_bucket")
+public class WaterPickupHandler implements CustomPickupHandler {
+
+ @Override
+ public boolean handle(Game game, int x, int y) {
+ return false;
+ }
+}
diff --git a/src/main/java/cz/jzitnik/game/handlers/place/handlers/BucketPlaceHandler.java b/src/main/java/cz/jzitnik/game/handlers/place/handlers/BucketPlaceHandler.java
new file mode 100644
index 0000000..e9fd764
--- /dev/null
+++ b/src/main/java/cz/jzitnik/game/handlers/place/handlers/BucketPlaceHandler.java
@@ -0,0 +1,33 @@
+package cz.jzitnik.game.handlers.place.handlers;
+
+import cz.jzitnik.game.Game;
+import cz.jzitnik.game.annotations.PlaceHandler;
+import cz.jzitnik.game.entities.Block;
+import cz.jzitnik.game.entities.items.Item;
+import cz.jzitnik.game.handlers.place.CustomPlaceHandler;
+
+@PlaceHandler("bucket")
+public class BucketPlaceHandler implements CustomPlaceHandler {
+ @Override
+ public boolean place(Game game, int x, int y) {
+ return false;
+ }
+
+ @Override
+ public void mine(Game game, int x, int y) {
+ var world = game.getWorld();
+ var blocks = world[y][x];
+ var flowingBlocks = blocks.stream().filter(Block::isFlowing).toList();
+
+ if (flowingBlocks.isEmpty()) {
+ return;
+ }
+
+ var flowingBlock = flowingBlocks.getFirst();
+ var items = flowingBlock.getDrops();
+ for (Item item: items) {
+ game.getInventory().addItem(item);
+ }
+ blocks.remove(flowingBlock);
+ }
+}
diff --git a/src/main/java/cz/jzitnik/tui/MouseHandler.java b/src/main/java/cz/jzitnik/tui/MouseHandler.java
index 1d60f15..ef5fce1 100644
--- a/src/main/java/cz/jzitnik/tui/MouseHandler.java
+++ b/src/main/java/cz/jzitnik/tui/MouseHandler.java
@@ -1,6 +1,7 @@
package cz.jzitnik.tui;
import cz.jzitnik.game.Game;
+import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.ui.Window;
import lombok.AllArgsConstructor;
import org.jline.terminal.MouseEvent;