Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,5 @@ bin/

## jpenilla runServer
bukkit/run/
bukkit/run-folia/
core/src/autogenerated/*
11 changes: 9 additions & 2 deletions bukkit/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -75,12 +75,19 @@ dependencies {
testAnnotationProcessor(libs.lombok)
}

runPaper {
folia.registerTask {
runDirectory.set(File("run-folia"))

minecraftVersion(project.findProperty("folia.version")!! as String)
}
}

tasks {
test {
useJUnitPlatform()
}


runServer {
minecraftVersion(project.findProperty("minecraft.version")!! as String)
if (project.findProperty("testing.integrations")!! == "true") {
Expand Down Expand Up @@ -125,7 +132,7 @@ tasks {

bukkit {
main = "dev.jsinco.brewery.bukkit.TheBrewingProject"
foliaSupported = false
foliaSupported = true
apiVersion = "1.21"
authors = listOf("Jsinco", "Mitality", "Thorinwasher", "Nadwey")
name = rootProject.name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import dev.jsinco.brewery.TheBrewingProjectApi;
import dev.jsinco.brewery.brew.BrewManager;
import dev.jsinco.brewery.breweries.Barrel;
import dev.jsinco.brewery.breweries.BarrelType;
import dev.jsinco.brewery.breweries.Distillery;
import dev.jsinco.brewery.breweries.Tickable;
Expand All @@ -23,6 +22,7 @@
import dev.jsinco.brewery.bukkit.recipe.DefaultRecipeReader;
import dev.jsinco.brewery.bukkit.structure.*;
import dev.jsinco.brewery.bukkit.util.BreweryTimeDataType;
import dev.jsinco.brewery.bukkit.util.BukkitAdapter;
import dev.jsinco.brewery.configuration.Config;
import dev.jsinco.brewery.configuration.locale.TranslationsConfig;
import dev.jsinco.brewery.configuration.serializers.EventRegistrySerializer;
Expand All @@ -40,6 +40,7 @@
import dev.jsinco.brewery.sound.SoundDefinition;
import dev.jsinco.brewery.structure.MultiblockStructure;
import dev.jsinco.brewery.structure.PlacedStructureRegistryImpl;
import dev.jsinco.brewery.structure.SinglePositionStructure;
import dev.jsinco.brewery.structure.StructureMeta;
import dev.jsinco.brewery.structure.StructureType;
import dev.jsinco.brewery.util.BreweryKey;
Expand All @@ -50,6 +51,7 @@
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.ServicePriority;
Expand Down Expand Up @@ -141,7 +143,7 @@ public void reload() {
try {
database.init(this.getDataFolder());
} catch (IOException | SQLException e) {
throw new RuntimeException(e); // Hard exit if any issues here
throw new RuntimeException(e);
}
this.drunksManager.reset(Config.config().events().enabledRandomEvents().stream().map(BreweryKey::parse).collect(Collectors.toSet()));
worldEventListener.init();
Expand Down Expand Up @@ -193,9 +195,13 @@ public void onEnable() {
saveResources();
this.database = new Database(DatabaseDriver.SQLITE);
try {
database.init(this.getDataFolder());
try {
database.init(this.getDataFolder());
} catch (IOException | SQLException e) {
throw new RuntimeException(e);
}
this.time = database.getSingletonNow(BreweryTimeDataType.INSTANCE);
} catch (IOException | PersistenceException | SQLException e) {
} catch (PersistenceException e) {
throw new RuntimeException(e); // Hard exit if any issues here
}
this.drunksManager = new DrunksManagerImpl<>(customDrunkEventRegistry, Config.config().events().enabledRandomEvents().stream().map(BreweryKey::parse).collect(Collectors.toSet()), () -> this.time, database, SqlDrunkStateDataType.INSTANCE);
Expand All @@ -210,8 +216,8 @@ public void onEnable() {
pluginManager.registerEvents(playerWalkListener, this);
pluginManager.registerEvents(new EntityEventListener(), this);

Bukkit.getScheduler().runTaskTimer(this, this::updateStructures, 0, 1);
Bukkit.getScheduler().runTaskTimer(this, this::otherTicking, 0, 1);
Bukkit.getGlobalRegionScheduler().runAtFixedRate(this, task -> this.updateStructures(), 20, 1);
Bukkit.getGlobalRegionScheduler().runAtFixedRate(this, task -> this.otherTicking(), 20, 1);
RecipeReader<ItemStack> recipeReader = new RecipeReader<>(this.getDataFolder(), new BukkitRecipeResultReader(), BukkitIngredientManager.INSTANCE);

recipeReader.readRecipes().thenAcceptAsync(this.recipeRegistry::registerRecipes);
Expand Down Expand Up @@ -250,13 +256,29 @@ private void updateStructures() {
breweryRegistry.getActiveSinglePositionStructure().stream()
.filter(Tickable.class::isInstance)
.map(Tickable.class::cast)
.forEach(Tickable::tick);
.forEach(tickable -> {
final Location loc = BukkitAdapter.toLocation(((SinglePositionStructure) tickable).position());
Bukkit.getRegionScheduler().run(this, loc, task -> tickable.tick());
});

placedStructureRegistry.getStructures(StructureType.DISTILLERY).stream()
.map(MultiblockStructure::getHolder)
.map(Distillery.class::cast)
.forEach(Distillery::tick);
List.copyOf(breweryRegistry.<BukkitBarrel>getOpened(StructureType.BARREL)).forEach(Barrel::tickInventory);
List.copyOf(breweryRegistry.<BukkitDistillery>getOpened(StructureType.DISTILLERY)).forEach(Distillery::tickInventory);
.forEach(distillery -> {
final Location loc = BukkitAdapter.toLocation(distillery.getStructure().getUnique());
Bukkit.getRegionScheduler().run(this, loc, task -> distillery.tick());
});

List.copyOf(breweryRegistry.<BukkitBarrel>getOpened(StructureType.BARREL)).forEach(barrel -> {
final Location loc = BukkitAdapter.toLocation(barrel.getStructure().getUnique());
Bukkit.getRegionScheduler().run(this, loc, task -> barrel.tickInventory());
});

List.copyOf(breweryRegistry.<BukkitDistillery>getOpened(StructureType.DISTILLERY)).forEach(distillery -> {
final Location loc = BukkitAdapter.toLocation(distillery.getStructure().getUnique());
Bukkit.getRegionScheduler().run(this, loc, task -> distillery.tickInventory());
});

}

private void otherTicking() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@
import dev.jsinco.brewery.moment.Interval;
import dev.jsinco.brewery.recipe.Recipe;
import dev.jsinco.brewery.sound.SoundDefinition;
import dev.jsinco.brewery.structure.SinglePositionStructure;
import dev.jsinco.brewery.util.Registry;
import dev.jsinco.brewery.vector.BreweryLocation;
import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
import lombok.Getter;
import lombok.Setter;
import net.kyori.adventure.sound.Sound;
Expand Down Expand Up @@ -48,6 +50,7 @@ public class BukkitCauldron implements dev.jsinco.brewery.breweries.Cauldron {
private boolean brewExtracted = false;
private Color particleColor = Color.AQUA;

private ScheduledTask cauldronTask;

public BukkitCauldron(BreweryLocation location, boolean hot) {
this.location = location;
Expand All @@ -68,24 +71,40 @@ private static CauldronType findCauldronType(Block block) {
.orElseThrow(() -> new IllegalArgumentException("Expected cauldron"));
}

@Override
public void tick() {
if (!BlockUtil.isChunkLoaded(location)) {
private void startCauldronTask() {
final SinglePositionStructure structure = this;
if (cauldronTask != null && !cauldronTask.isCancelled()) {
return;
}
if (!Tag.CAULDRONS.isTagged(getBlock().getType()) || getBlock().getType() == Material.CAULDRON) {
ListenerUtil.removeActiveSinglePositionStructure(this, TheBrewingProject.getInstance().getBreweryRegistry(), TheBrewingProject.getInstance().getDatabase());
return;
}
this.hot = isHeatSource(getBlock().getRelative(BlockFace.DOWN));
recalculateBrewTime();
Color baseParticleColor = computeBaseParticleColor(getBlock());
Optional<Recipe<ItemStack>> recipeOptional = brew.closestRecipe(TheBrewingProject.getInstance().getRecipeRegistry());
Color resultColor = computeResultColor(recipeOptional);
this.particleColor = recipeOptional.map(recipe -> computeParticleColor(baseParticleColor, resultColor, recipe))
.orElse(Color.GRAY);
cauldronTask = new FoliaRunnable(Bukkit.getRegionScheduler(), getBlock().getWorld(), getBlock().getX() >> 4, getBlock().getZ() >> 4) {
@Override
public void run() {
if (!BlockUtil.isChunkLoaded(location)) {
cancel();
cauldronTask = null;
return;
}
if (!Tag.CAULDRONS.isTagged(getBlock().getType()) || getBlock().getType() == Material.CAULDRON) {
ListenerUtil.removeActiveSinglePositionStructure(structure, TheBrewingProject.getInstance().getBreweryRegistry(), TheBrewingProject.getInstance().getDatabase());
cancel();
cauldronTask = null;
return;
}
hot = isHeatSource(getBlock().getRelative(BlockFace.DOWN));
recalculateBrewTime();
Color baseParticleColor = computeBaseParticleColor(getBlock());
Optional<Recipe<ItemStack>> recipeOptional = brew.closestRecipe(TheBrewingProject.getInstance().getRecipeRegistry());
Color resultColor = computeResultColor(recipeOptional);
particleColor = recipeOptional.map(recipe -> computeParticleColor(baseParticleColor, resultColor, recipe))
.orElse(Color.GRAY);
playBrewingEffects();
}
}.runAtFixedRate(TheBrewingProject.getInstance(), 20, 1);
}

this.playBrewingEffects();
@Override
public void tick() {
this.startCauldronTask();
}

private Color computeParticleColor(Color baseColor, Color resultColor, Recipe<ItemStack> recipe) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,18 @@ public void doDrunkEvents(UUID playerUuid, List<EventStep> events) {
applyPotionEffect.durationBounds(),
applyPotionEffect.amplifierBounds()
).newPotionEffect();
player.addPotionEffect(potionEffect);
player.getScheduler().run(TheBrewingProject.getInstance(), task -> {
if (player.isOnline()) {
player.addPotionEffect(potionEffect);
}
}, null);
}
case NamedDrunkEvent namedDrunkEvent ->
NamedDrunkEventExecutor.doDrunkEvent(playerUuid, namedDrunkEvent);
case NamedDrunkEvent namedDrunkEvent -> NamedDrunkEventExecutor.doDrunkEvent(playerUuid, namedDrunkEvent);
case CustomEvent customEvent -> doDrunkEvents(playerUuid, customEvent.getSteps());
case SendCommand sendCommand -> {
switch (sendCommand.senderType()) {
case PLAYER -> player.performCommand(sendCommand.command());
case SERVER ->
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), sendCommand.command());
case SERVER -> Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), sendCommand.command());
}
}
case Teleport teleport -> player.teleport(BukkitAdapter.toLocation(teleport.location().get()));
Expand All @@ -62,16 +64,13 @@ public void doDrunkEvents(UUID playerUuid, List<EventStep> events) {
return;
}
final List<EventStep> eventsLeft = events.subList(i + 1, events.size());
Bukkit.getScheduler().runTaskLater(
player.getScheduler().runDelayed(
TheBrewingProject.getInstance(),
() -> doDrunkEvents(playerUuid, eventsLeft),
waitStep.durationTicks()
);
task ->
doDrunkEvents(playerUuid, eventsLeft),null, waitStep.durationTicks());
return;
}
case ConsumeStep consumeStep -> {
TheBrewingProject.getInstance().getDrunksManager().consume(playerUuid, consumeStep.alcohol(), consumeStep.toxins());
}
case ConsumeStep consumeStep -> TheBrewingProject.getInstance().getDrunksManager().consume(playerUuid, consumeStep.alcohol(), consumeStep.toxins());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import dev.jsinco.brewery.bukkit.TheBrewingProject;
import dev.jsinco.brewery.event.NamedDrunkEvent;
import dev.jsinco.brewery.util.Pair;
import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;
Expand Down Expand Up @@ -49,7 +50,7 @@ private LinkedList<Pair<Vector, Integer>> compileRandomVectors(int duration) {
return output;
}

public void tick(BukkitTask task) {
public void tick(ScheduledTask task) {
if (duration <= timestamp++ || currentPush == null) {
task.cancel();
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public static void doDrunkEvent(UUID playerUuid, NamedDrunkEvent event) {
case PUKE -> {
PukeHandler pukeHandler = new PukeHandler(Config.config().puke().pukeTime(), player);
TheBrewingProject.getInstance().getActiveEventsRegistry().registerActiveEvent(playerUuid, event, Config.config().puke().pukeTime());
Bukkit.getScheduler().runTaskTimer(TheBrewingProject.getInstance(), pukeHandler::tick, 0, 1);
player.getScheduler().runAtFixedRate(TheBrewingProject.getInstance(), pukeHandler::tick,null ,1, 1);
}
case PASS_OUT -> {
DrunksManagerImpl<?> drunksManager = TheBrewingProject.getInstance().getDrunksManager();
Expand All @@ -57,7 +57,7 @@ public static void doDrunkEvent(UUID playerUuid, NamedDrunkEvent event) {
int duration = RANDOM.nextInt(STUMBLE_DURATION / 2, STUMBLE_DURATION * 3 / 2 + 1);
StumbleHandler stumbleHandler = new StumbleHandler(duration, player);
TheBrewingProject.getInstance().getActiveEventsRegistry().registerActiveEvent(playerUuid, event, duration);
Bukkit.getScheduler().runTaskTimer(TheBrewingProject.getInstance(), stumbleHandler::doStumble, 0, 1);
player.getScheduler().runAtFixedRate(TheBrewingProject.getInstance(), stumbleHandler::doStumble, null ,1, 1);
}
case CHICKEN -> {
player.getWorld().spawn(player.getLocation(), Chicken.class, chicken -> {
Expand Down Expand Up @@ -92,16 +92,16 @@ public static void doDrunkEvent(UUID playerUuid, NamedDrunkEvent event) {
}
BreweryLocation teleport = locations.get(RANDOM.nextInt(locations.size()));
Location location = BukkitAdapter.toLocation(teleport);
player.teleport(location);
player.teleportAsync(location);
player.sendMessage(MiniMessage.miniMessage().deserialize(TranslationsConfig.TELEPORT_MESSAGE, BukkitMessageUtil.getPlayerTagResolver(player)));
}
case NAUSEA -> {
player.addPotionEffect(new PotionEffect(PotionEffectType.NAUSEA, RANDOM.nextInt(Moment.MINUTE / 2, Moment.MINUTE * 3 / 2), 1));
}
case NAUSEA ->
player.getScheduler().run(TheBrewingProject.getInstance(), task ->
player.addPotionEffect(new PotionEffect(PotionEffectType.NAUSEA, RANDOM.nextInt(Moment.MINUTE / 2, Moment.MINUTE * 3 / 2), 1)), null);
case DRUNKEN_WALK -> {
int duration = RANDOM.nextInt(DRUNKEN_WALK_DURATION / 2, DRUNKEN_WALK_DURATION * 3 / 2);
DrunkenWalkHandler drunkenWalkHandler = new DrunkenWalkHandler(duration, player);
Bukkit.getScheduler().runTaskTimer(TheBrewingProject.getInstance(), drunkenWalkHandler::tick, 0, 1);
player.getScheduler().runAtFixedRate(TheBrewingProject.getInstance(), drunkenWalkHandler::tick, null, 1, 1);
TheBrewingProject.getInstance().getActiveEventsRegistry().registerActiveEvent(playerUuid, event, duration);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.jsinco.brewery.bukkit.effect.event;

import dev.jsinco.brewery.configuration.Config;
import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
import org.bukkit.*;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Item;
Expand All @@ -24,7 +25,7 @@ public class PukeHandler {
this.player = player;
}

public void tick(BukkitTask task) {
public void tick(ScheduledTask task) {
if (!player.isOnline() || countDown-- <= 0) {
task.cancel();
return;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.jsinco.brewery.bukkit.effect.event;

import dev.jsinco.brewery.bukkit.TheBrewingProject;
import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;
Expand Down Expand Up @@ -34,7 +35,7 @@ public StumbleHandler(int duration, Player player) {
.multiply(RANDOM.nextDouble(maxMagnitude));
}

public void doStumble(BukkitTask task) {
public void doStumble(ScheduledTask task) {
if (!player.isOnline() || countDown-- < 0) {
task.cancel();
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ public String getId() {
public void initialize() {
this.initializedFuture = new CompletableFuture<>();
Bukkit.getPluginManager().registerEvents(this, TheBrewingProject.getInstance());
Bukkit.getScheduler().runTask(TheBrewingProject.getInstance(), () -> initializedFuture.completeExceptionally(new TimeoutException()));
Bukkit.getAsyncScheduler().runNow(TheBrewingProject.getInstance(), task ->
initializedFuture.completeExceptionally(new TimeoutException()));
}

@EventHandler
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ public String getId() {
public void initialize() {
Bukkit.getPluginManager().registerEvents(this, TheBrewingProject.getInstance());
this.initializedFuture = new CompletableFuture<>();
Bukkit.getScheduler().runTask(TheBrewingProject.getInstance(), () -> initializedFuture.completeExceptionally(new TimeoutException()));
Bukkit.getAsyncScheduler().runNow(TheBrewingProject.getInstance(), task ->
initializedFuture.completeExceptionally(new TimeoutException()));
}

@EventHandler
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ public String getId() {
public void initialize() {
Bukkit.getPluginManager().registerEvents(this, TheBrewingProject.getInstance());
this.initializedFuture = new CompletableFuture<>();
Bukkit.getScheduler().runTask(TheBrewingProject.getInstance(), () -> initializedFuture.completeExceptionally(new TimeoutException()));
Bukkit.getAsyncScheduler().runNow(TheBrewingProject.getInstance(), task ->
initializedFuture.completeExceptionally(new TimeoutException()));
}

@EventHandler
Expand Down
Loading