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;