Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
f4e4657
feat(api): Add event classes
Thorinwasher Nov 13, 2025
8bcb8d8
fix(brewery-events): Event system changes
Thorinwasher Dec 4, 2025
c91b728
fix(brewery-events): Rework events
Thorinwasher Dec 4, 2025
a4fa9c6
temp
Thorinwasher Dec 5, 2025
9ff98fc
fix(events): Preset logic to track item transactions
Thorinwasher Dec 5, 2025
983bfe3
temp
Thorinwasher Dec 7, 2025
d08b3ea
fix(brew-events): Shift clicking issue
Thorinwasher Dec 22, 2025
82326a4
fix(brew-events): Cancel non brew transactions by default
Thorinwasher Dec 22, 2025
db1647d
fix(brew-events): Hotswap issues
Thorinwasher Dec 22, 2025
8b9e223
fix(brew-events): Double check the right item is being modified
Thorinwasher Dec 22, 2025
9690c3e
fix(brew-events): Add another permission check
Thorinwasher Dec 23, 2025
3492e2c
fix(brew-events): Add cauldron event triggers
Thorinwasher Dec 24, 2025
9d80308
fix(brew-events): Store event cancel state differently
Thorinwasher Dec 25, 2025
0342a81
fix(api-events): Clone item stack before saving it
Thorinwasher Dec 31, 2025
4d45538
fix(api): Better distillery/barrel api access
Thorinwasher Dec 31, 2025
de2312e
fix(api): Better cauldron api access
Thorinwasher Dec 31, 2025
feb4eab
fix(api-events): Avoid using non API classes in API
Thorinwasher Dec 31, 2025
413d039
fix(api-events): Add hopper and drag event tracking (untested)
Thorinwasher Dec 31, 2025
5282e56
fix(brew-events): Fix Paper not recognizing handler list
Tisawesomeness Dec 31, 2025
8f1e111
fix(api-breweries): Prefer CancelState return type over boolean
Thorinwasher Jan 1, 2026
35309d0
fix(brew-events): Update brew lore on barrel insert/extract
Tisawesomeness Jan 2, 2026
e7a6c05
fix(brew-events): Fire CauldronExtractEvent and tweak API
Tisawesomeness Jan 3, 2026
2f681cc
fix(brew-events): Clone items on API boundary
Tisawesomeness Jan 3, 2026
aeb2916
fix(brew-events): Setters on cauldron events
Tisawesomeness Jan 3, 2026
f4006fb
fix(events-api): Invert statement - Bug for drag event
Thorinwasher Jan 4, 2026
19675e7
feat(events-api): Add drunken event initiate event
Thorinwasher Jan 4, 2026
e25ba51
feat(brew-events): Add destroy events
Tisawesomeness Jan 5, 2026
7c27a40
feat(brew-events): Allow editing drops in destroy events
Tisawesomeness Jan 6, 2026
d75136c
fix(api-events): Simplify code
Thorinwasher Jan 6, 2026
a727ce2
fix(api-events): Only trigger events once for each structure
Thorinwasher Jan 6, 2026
eac2f28
fix(api-events): Avoid unnecessary addition of element into set
Thorinwasher Jan 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

import dev.jsinco.brewery.api.structure.StructureType;

/**
* Due to using too much generics complexity, replaced with {@link BarrelAccess}
* @param <B> Self
* @param <IS> ItemStack
* @param <I> Inventory
*/
@Deprecated(forRemoval = true)
public interface Barrel<B extends Barrel<B, IS, I>, IS, I> extends StructureHolder<B>, InventoryAccessible<IS, I> {

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package dev.jsinco.brewery.api.breweries;

import dev.jsinco.brewery.api.structure.MultiblockStructure;
import dev.jsinco.brewery.api.util.CancelState;
import dev.jsinco.brewery.api.util.Holder;
import dev.jsinco.brewery.api.vector.BreweryLocation;
import org.jetbrains.annotations.NotNull;

import java.util.UUID;

public interface BarrelAccess {

/**
* Open this barrels inventory for the player with the specified UUID
* @param location The location to open from
* @param player The player
* @return The resulting state
*/
CancelState open(@NotNull BreweryLocation location, @NotNull Holder.Player player);

/**
* Closes the barrel inventory for all viewers
* @param silent Whether to play a barrel sound or not
*/
void close(boolean silent);

/**
* Destroy the barrel, dropping all contained items
* @param breweryLocation The location to destroy from
*/
void destroy(BreweryLocation breweryLocation);

/**
* @return The barrels inventory
*/
BrewInventory getBrewInventory();

/**
* @return The underlying barrel structure
*/
MultiblockStructure<? extends BarrelAccess> getStructure();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package dev.jsinco.brewery.api.breweries;

import dev.jsinco.brewery.api.brew.Brew;
import org.jetbrains.annotations.Nullable;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public interface BrewInventory {

/**
* Gets a view of brews in the inventory, where each index of the array corresponds to a position in the inventory.
* Empty slots are represented by null.
*
* @return All brews in this inventory
*/
Brew[] getBrews();

/**
* Gets a snapshot of all brews currently in the inventory. The list does not update as the inventory updates.
*
* @return All brews in this inventory
*/
default List<Brew> getBrewSnapshot() {
return Arrays.stream(getBrews())
.filter(Objects::nonNull)
.toList();
}

/**
* Set an item in the inventory without changing the database
*
* @param brew The brew to set
* @param position The position of the brew to set
*/
void set(@Nullable Brew brew, int position);

/**
* Update the inventory GUI from brew inventory
*/
void updateInventoryFromBrews();

/**
* Update the brew inventory from inventory GUI
* @return True if inventory GUI had any changes
*/
boolean updateBrewsFromInventory();

/**
* Store an item in the inventory, also modify the database
* @param brew The brew to store
* @param position The position to store the brew
*/
void store(Brew brew, int position);

/**
* @return True if inventory is empty
*/
boolean isEmpty();

/**
* @return True if inventory is full
*/
boolean isFull();

/**
* @return The amount of brews in this inventory
*/
int brewAmount();
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
package dev.jsinco.brewery.api.breweries;

import dev.jsinco.brewery.api.brew.Brew;
import dev.jsinco.brewery.api.structure.SinglePositionStructure;
import org.jetbrains.annotations.NotNull;

public interface Cauldron extends Tickable, SinglePositionStructure {

long getTime();

boolean isHot();

@NotNull Brew getBrew();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import dev.jsinco.brewery.api.structure.StructureType;

@Deprecated(forRemoval = true)
public interface Distillery<D extends Distillery<D, IS, I>, IS, I> extends StructureHolder<D>, InventoryAccessible<IS, I>, Tickable {

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package dev.jsinco.brewery.api.breweries;

import dev.jsinco.brewery.api.structure.MultiblockStructure;
import dev.jsinco.brewery.api.util.CancelState;
import dev.jsinco.brewery.api.util.Holder;
import dev.jsinco.brewery.api.vector.BreweryLocation;
import org.jetbrains.annotations.NotNull;

import java.util.UUID;

public interface DistilleryAccess {
/**
* Open this distillery inventory for the player with the specified UUID
* @param location The location to open from
* @param player The player UUID
* @return True if canceled
*/
CancelState open(@NotNull BreweryLocation location, @NotNull Holder.Player player);

/**
* Closes the distillery inventory for all viewers
* @param silent Whether to play a close sound or not
*/
void close(boolean silent);

/**
* Destroy the distillery, dropping all contained items
* @param breweryLocation The location to destroy from
*/
void destroy(BreweryLocation breweryLocation);

/**
* @return This distillery mixture inventory
*/
BrewInventory getMixture();

/**
* @return This distillery distillate inventory
*/
BrewInventory getDistillate();

/**
* @return The underlying distillery structure
*/
MultiblockStructure<? extends DistilleryAccess> getStructure();

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public interface StructureHolder<H extends StructureHolder<H>> {
MultiblockStructure<H> getStructure();

/**
* Persistently destroy the structure
* Persistently destroy the structure, dropping all contained items
*
* @param breweryLocation The location to destroy from
*/
Expand Down
24 changes: 24 additions & 0 deletions api/src/main/java/dev/jsinco/brewery/api/util/CancelState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package dev.jsinco.brewery.api.util;

import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
import org.jetbrains.annotations.Nullable;

public sealed interface CancelState {

record Cancelled() implements CancelState {
}

record PermissionDenied(Component message) implements CancelState {

public void sendMessage(@Nullable Audience audience) {
if(audience == null) {
return;
}
audience.sendMessage(message);
}
}

record Allowed() implements CancelState {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@
import dev.jsinco.brewery.bukkit.effect.SqlDrunkenModifierDataType;
import dev.jsinco.brewery.bukkit.effect.event.ActiveEventsRegistry;
import dev.jsinco.brewery.bukkit.effect.event.DrunkEventExecutor;
import dev.jsinco.brewery.bukkit.event.*;
import dev.jsinco.brewery.bukkit.ingredient.BukkitIngredientManager;
import dev.jsinco.brewery.bukkit.integration.IntegrationManagerImpl;
import dev.jsinco.brewery.bukkit.listener.*;
import dev.jsinco.brewery.bukkit.migration.Migrations;
import dev.jsinco.brewery.bukkit.migration.breweryx.BreweryXMigrationListener;
import dev.jsinco.brewery.bukkit.recipe.BukkitRecipeResultReader;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package dev.jsinco.brewery.bukkit.api.event;

import dev.jsinco.brewery.api.brew.Brew;
import dev.jsinco.brewery.api.breweries.BarrelAccess;
import dev.jsinco.brewery.api.util.CancelState;
import lombok.Getter;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class BarrelDestroyEvent extends PermissibleBreweryEvent {

private static final HandlerList HANDLERS = new HandlerList();

/**
* The barrel that was destroyed.
*/
@Getter
private final BarrelAccess barrel;
/**
* The player that destroyed the barrel. Will be null if the barrel was destroyed by an explosion, piston,
* or any non-player source.
*/
@Getter
private final @Nullable Player player;
/**
* The location of the block that was destroyed or changed. If multiple blocks were destroyed,
* such as by an explosion, then an arbitrary block is chosen.
*/
@Getter
private final Location location;
/**
* The brews that will be dropped when the barrel is broken. Can be modified.
*/
@Getter
private List<Brew> drops;

public BarrelDestroyEvent(CancelState state, BarrelAccess barrel, @Nullable Player player, Location location, Collection<Brew> drops) {
super(state);
this.barrel = barrel;
this.player = player;
this.location = location;
setDrops(drops);
}

/**
* Replaces the list of drops with the provided collection.
* @param drops collection of brews to drop
*/
public void setDrops(Collection<Brew> drops) {
this.drops = new ArrayList<>(drops);
}

@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}

public static HandlerList getHandlerList() {
return HANDLERS;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package dev.jsinco.brewery.bukkit.api.event;

import dev.jsinco.brewery.api.breweries.BarrelAccess;
import dev.jsinco.brewery.bukkit.api.transaction.ItemSource;
import dev.jsinco.brewery.bukkit.api.transaction.ItemTransactionSession;
import lombok.Getter;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class BarrelExtractEvent extends PermissibleBreweryEvent implements ItemTransactionEvent<ItemSource.ItemBasedSource> {

private static final HandlerList HANDLERS = new HandlerList();
@Getter
private final BarrelAccess barrel;
@Getter
private final @Nullable Player player;
@Getter
private final ItemTransactionSession<ItemSource.ItemBasedSource> transactionSession;


public BarrelExtractEvent(BarrelAccess barrel, ItemTransactionSession<ItemSource.ItemBasedSource> transactionSession,
@NotNull dev.jsinco.brewery.api.util.CancelState state, @Nullable Player player) {
super(state);
this.barrel = barrel;
this.transactionSession = transactionSession;
this.player = player;
}

@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}

public static HandlerList getHandlerList() {
return HANDLERS;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package dev.jsinco.brewery.bukkit.api.event;

import dev.jsinco.brewery.api.breweries.BarrelAccess;
import dev.jsinco.brewery.bukkit.api.transaction.ItemSource;
import dev.jsinco.brewery.bukkit.api.transaction.ItemTransactionSession;
import lombok.Getter;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class BarrelInsertEvent extends PermissibleBreweryEvent implements ItemTransactionEvent<ItemSource.BrewBasedSource> {

private static final HandlerList HANDLERS = new HandlerList();
@Getter
private final BarrelAccess barrel;
@Getter
private final @Nullable Player player;
@Getter
private final ItemTransactionSession<ItemSource.BrewBasedSource> transactionSession;


public BarrelInsertEvent(BarrelAccess barrel, ItemTransactionSession<ItemSource.BrewBasedSource> transactionSession,
@NotNull dev.jsinco.brewery.api.util.CancelState state, @Nullable Player player) {
super(state);
this.barrel = barrel;
this.transactionSession = transactionSession;
this.player = player;
}

@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}

public static HandlerList getHandlerList() {
return HANDLERS;
}
}
Loading