chore: Water placement

This commit is contained in:
Jakub Žitník 2025-03-03 18:58:59 +01:00
parent bb4e7423e3
commit f5d2920a9a
Signed by: jzitnik
GPG Key ID: C577A802A6AF4EF3
14 changed files with 200 additions and 8 deletions

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="RawUseOfParameterizedType" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>

74
pom.xml
View File

@ -9,11 +9,69 @@
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<properties> <properties>
<maven.compiler.source>22</maven.compiler.source> <maven.compiler.source>23</maven.compiler.source>
<maven.compiler.target>22</maven.compiler.target> <maven.compiler.target>23</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>cz.jzitnik.Main</mainClass>
</transformer>
</transformers>
<shadedArtifactAttached>false</shadedArtifactAttached>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>cz.jzitnik.Main</mainClass>
<classpathScope>compile</classpathScope> <!-- This ensures the compiled classes are included -->
</configuration>
</plugin>
</plugins>
</build>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
@ -51,12 +109,24 @@
<artifactId>jackson-databind</artifactId> <artifactId>jackson-databind</artifactId>
<version>2.18.2</version> <version>2.18.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>4.13.2</version> <version>4.13.2</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.17</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -13,6 +13,7 @@ import org.jline.terminal.Terminal;
import org.jline.terminal.TerminalBuilder; import org.jline.terminal.TerminalBuilder;
import java.io.IOException; import java.io.IOException;
import java.sql.SQLOutput;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
@ -64,7 +65,7 @@ public class Main {
terminal.trackMouse(Terminal.MouseTracking.Off); terminal.trackMouse(Terminal.MouseTracking.Off);
terminal.close(); terminal.close();
} catch (IOException | InterruptedException _) { } catch (IOException | InterruptedException ignored) {
} }
} }
} }

View File

@ -22,7 +22,6 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.jline.terminal.Terminal; import org.jline.terminal.Terminal;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;

View File

@ -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();
}

View File

@ -3,10 +3,15 @@ package cz.jzitnik.game.crafting.recipes;
import cz.jzitnik.game.annotations.CraftingRecipeRegistry; import cz.jzitnik.game.annotations.CraftingRecipeRegistry;
@CraftingRecipeRegistry( @CraftingRecipeRegistry(
recipe = { /*recipe = {
"iron_ingot", "_", "iron_ingot", "iron_ingot", "_", "iron_ingot",
"_", "iron_ingot", "_", "_", "iron_ingot", "_",
"_", "_", "_" "_", "_", "_"
},*/
recipe = {
"dirt", "_", "_",
"_", "_", "_",
"_", "_", "_"
}, },
result = "bucket", result = "bucket",
amount = 1 amount = 1

View File

@ -1,5 +1,6 @@
package cz.jzitnik.game.entities; package cz.jzitnik.game.entities;
import cz.jzitnik.game.handlers.pickup.PickupHandlerProvider;
import cz.jzitnik.game.handlers.place.PlaceHandler; import cz.jzitnik.game.handlers.place.PlaceHandler;
import cz.jzitnik.game.mobs.EntityHurtAnimation; import cz.jzitnik.game.mobs.EntityHurtAnimation;
import cz.jzitnik.game.mobs.EntityKill; import cz.jzitnik.game.mobs.EntityKill;
@ -8,4 +9,5 @@ public class Dependencies {
public PlaceHandler placeHandler = new PlaceHandler(); public PlaceHandler placeHandler = new PlaceHandler();
public EntityHurtAnimation entityHurtAnimation = new EntityHurtAnimation(); public EntityHurtAnimation entityHurtAnimation = new EntityHurtAnimation();
public EntityKill entityKill = new EntityKill(); public EntityKill entityKill = new EntityKill();
public PickupHandlerProvider pickupHandlerProvider = new PickupHandlerProvider();
} }

View File

@ -82,8 +82,6 @@ public class ItemBlockSupplier {
Item dropItem = getItem(dropKey); Item dropItem = getItem(dropKey);
if (dropKey.equals(block.getBlockId())) { if (dropKey.equals(block.getBlockId())) {
dropItem.setBlock(Optional.of(block)); dropItem.setBlock(Optional.of(block));
} else {
dropItem.setBlock(Optional.of(getBlock(dropKey)));
} }
block.setDrops(List.of(dropItem)); block.setDrops(List.of(dropItem));
} }

View File

@ -6,7 +6,7 @@ import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.logic.services.water.WaterData; import cz.jzitnik.game.logic.services.water.WaterData;
import cz.jzitnik.game.sprites.Water; import cz.jzitnik.game.sprites.Water;
@BlockRegistry("water") @BlockRegistry(value = "water", drops = "water_item")
public class WaterBlock extends Block { public class WaterBlock extends Block {
public WaterBlock() { public WaterBlock() {
super("water", SpriteLoader.SPRITES.WATER); super("water", SpriteLoader.SPRITES.WATER);

View File

@ -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);
}

View File

@ -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<String, CustomPickupHandler> 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<Class<?>> 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();
}
}
}
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -1,6 +1,7 @@
package cz.jzitnik.tui; package cz.jzitnik.tui;
import cz.jzitnik.game.Game; import cz.jzitnik.game.Game;
import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.ui.Window; import cz.jzitnik.game.ui.Window;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.jline.terminal.MouseEvent; import org.jline.terminal.MouseEvent;