Skip to content
Merged
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
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ finished item.
it, never the count); a natural 20 always succeeds and a natural 1 always
fails. The roll never changes the piece: 100% hits is always a Masterwork.

## Requirements

Paper 1.21.10 with MMOCore, MMOItems, MythicLib and **TLibs 2.3.0 or newer**
(builds pin 2.6.1). The item refresh listens for TLibs' character session
event, so on an older TLibs its listener cannot register. `plugin.yml` cannot
declare a minimum version, so update TLibs before or together with this plugin.

## Credits

Originally authored by **Drefvelin**.
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.proc>full</maven.compiler.proc>
<project.build.outputTimestamp>2026-09-22T00:00:00Z</project.build.outputTimestamp>
<tlibs.version>2.0.0</tlibs.version>
<tlibs.version>2.6.1</tlibs.version>
</properties>

<dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import net.tfminecraft.tlibs.armour.ArmorEquipEvent;
import net.tfminecraft.tlibs.armour.ArmorType;
import net.tfminecraft.tlibs.character.CharacterSessionStartEvent;
import net.tfminecraft.advancedcrafting.AdvancedCrafting;
import net.tfminecraft.advancedcrafting.utils.AcItemRefresher;

Expand Down Expand Up @@ -88,7 +89,16 @@ public void onArmorEquip(ArmorEquipEvent event) {
/** After a restart every player rejoins, so this brings their carried items up to date without anyone acting. */
@EventHandler(priority = EventPriority.MONITOR)
public void onJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
sweepLater(event.getPlayer());
}

/** A character's inventory is only put on when it is played, after the join sweep has already run. */
@EventHandler(priority = EventPriority.MONITOR)
public void onSessionStart(CharacterSessionStartEvent event) {
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
sweepLater(event.getPlayer());
}

private void sweepLater(Player player) {
Bukkit.getScheduler().runTask(AdvancedCrafting.plugin, () -> {
if (!player.isOnline()) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.tfminecraft.advancedcrafting.managers.*;
import net.tfminecraft.advancedcrafting.utils.*;
import net.tfminecraft.tlibs.armour.*;
import net.tfminecraft.tlibs.character.CharacterSessionStartEvent;
import net.tfminecraft.tlibs.event.MMOItemRebuildEvent;
import org.bukkit.Material;
import org.bukkit.block.DoubleChest;
Expand Down Expand Up @@ -158,6 +159,33 @@ void joinSweepRefreshesInventoryArmourOffhandAndEnderChestOneTickLater() throws
verify(gone, never()).getInventory();
}

@Test
void characterSessionStartSweepsTheCharacterInventoryOneTickLater() throws Exception {
when(plugin.isEnabled()).thenReturn(true);
var p = server.addPlayer();
var iron = ingredient("iron", "");
iron.setRevision(1);
var stale = iron.build();
iron.setRevision(2);
// The character's body is put on after the join sweep, so the join tick finds nothing to refresh.
var join = mock(PlayerJoinEvent.class);
when(join.getPlayer()).thenReturn(p);
var listener = new CraftRefreshListener();
listener.onJoin(join);
server.getScheduler().performOneTick();
p.getInventory().setChestplate(stale.clone());
p.getInventory().setItem(5, stale.clone());
p.getEnderChest().setItem(1, stale.clone());
var start = mock(CharacterSessionStartEvent.class);
when(start.getPlayer()).thenReturn(p);
listener.onSessionStart(start);
assertEquals(1, AcItemTags.getStoredRevision(p.getInventory().getChestplate()));
server.getScheduler().performOneTick();
assertEquals(2, AcItemTags.getStoredRevision(p.getInventory().getChestplate()));
assertEquals(2, AcItemTags.getStoredRevision(p.getInventory().getItem(5)));
assertEquals(2, AcItemTags.getStoredRevision(p.getEnderChest().getItem(1)));
}

@Test
void aBrokenItemIsLoggedAndTheSweepCarriesOn() {
when(plugin.isEnabled()).thenReturn(true);
Expand Down
Loading