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
62 changes: 53 additions & 9 deletions src/main/java/net/tfminecraft/activitytf/gui/ActivityGui.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,14 @@
import net.tfminecraft.activitytf.managers.ActivityManager;
import net.tfminecraft.activitytf.models.ActivityDef;
import net.tfminecraft.activitytf.models.PlayerData;
import net.tfminecraft.activitytf.models.RewardEntry;
import net.tfminecraft.activitytf.utils.Bar;
import net.tfminecraft.activitytf.utils.ItemPath;
import net.tfminecraft.activitytf.utils.Utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

public class ActivityGui implements Listener {
Expand Down Expand Up @@ -117,25 +119,67 @@ private void fillEmptySlots(Inventory inventory, Messages messages) {
private ItemStack barItem(ActivityConfiguration config, Messages messages, PlayerData data) {
List<Integer> milestones = config.milestones();
String bar = Bar.render(data.points(), config.barMax(), config.barLength(), milestones);
int due = data.claimable(milestones);
Integer next = nextMilestone(data, milestones);

List<String> lore = new ArrayList<>();
lore.add(Utils.colorize(bar));
lore.add(" ");
if (due > 0) {
lore.add(messages.get("gui.reward-click", "%count%", due));
} else if (next != null) {
lore.add(messages.get("gui.bar-lore-next", "%points%", next));
} else {
lore.add(messages.get("gui.bar-lore-done"));
}
lore.addAll(weeklyRewardLore(messages, data, milestones, config.milestoneDrops(),
config.rewardMultiplier(), config::rewardPool));

return item(Material.EXPERIENCE_BOTTLE,
messages.get("gui.bar-name", "%points%", data.points(), "%max%", config.barMax()),
lore);
}

static List<String> weeklyRewardLore(Messages messages, PlayerData data, List<Integer> milestones,
Map<Integer, RewardEntry> drops, int multiplier,
Function<String, List<RewardEntry>> pools) {
List<String> lore = new ArrayList<>();
int due = data.claimable(milestones);
Integer next = nextMilestone(data, milestones);
if (next == null) {
lore.add(messages.get("gui.bar-lore-none"));
return lore;
}

List<String> rewards = nextRewardDisplays(next, drops, multiplier, pools);
if (rewards.size() == 1) {
lore.add(messages.get("gui.bar-lore-reward", "%points%", next, "%reward%",
Utils.colorize(rewards.get(0))));
} else {
lore.add(messages.get("gui.bar-lore-next-options", "%points%", next));
for (String reward : rewards) {
lore.add(Utils.colorize(reward));
}
}
if (due > 0) {
lore.add(messages.get("gui.reward-click", "%count%", due));
}
return lore;
}

static List<String> nextRewardDisplays(int milestone, Map<Integer, RewardEntry> drops, int multiplier,
Function<String, List<RewardEntry>> pools) {
RewardEntry drop = drops.get(milestone);
String pool = drop == null ? ActivityConfiguration.DEFAULT_POOL
: ActivityConfiguration.referencedPool(drop);
if (pool == null) {
RewardEntry.Item item = drop.items().get(0);
return List.of("#50d990x" + item.amount() * multiplier + " #b8906e" + drop.display());
}
List<RewardEntry> entries = pools.apply(pool);
if (entries == null || entries.isEmpty()) {
return List.of();
}
List<String> displays = new ArrayList<>();
for (RewardEntry entry : entries) {
if (entry.display() != null && !entry.display().isBlank()) {
displays.add(entry.display());
}
}
return displays;
}

private static Integer nextMilestone(PlayerData data, List<Integer> milestones) {
for (Integer milestone : milestones) {
if (milestone > data.claimedPoints()) {
Expand Down
5 changes: 3 additions & 2 deletions src/main/resources/messages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ reroll-locked: "&7Rerolling daily tasks is an #823FFF&l[#8939EE&lA#9033DD&ls#972
gui:
bar-name: "#e6ca40&lWeekly Activity&e: #50d990%points%&7/&f%max%"
daily-bar-name: "#e6ca40&lDaily Activity&e: #50d990%points%&7/&f%max%"
bar-lore-next: "#d97b66Next reward at&e: &6%points% #b8906epoints"
bar-lore-done: "&8All rewards claimed this week"
bar-lore-reward: "#d97b66Next reward&e: %reward% #b8906eat &6%points% #b8906epoints"
bar-lore-next-options: "#d97b66Next reward at&e: &6%points% #b8906epoints"
bar-lore-none: "&7No more rewards this week"
reward-click: "#6b9c68[#fafa16Click to claim %count% reward(s)#6b9c68]"
activity-lore-progress: "#af97bdProgress&e: %bar%"
activity-lore-today: "#d97b66Today&e: &6%today%"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
Expand All @@ -34,51 +33,54 @@ class ActivityConfigurationRewardsTest {
private static final class TestPlugin extends JavaPlugin {
}

private static final ThreadLocal<List<String>> LOGGED = ThreadLocal.withInitial(ArrayList::new);

private static final class CapturingLogger extends Logger {
CapturingLogger() {
super("ActivityConfigurationRewardsTest", null);
setLevel(Level.ALL);
}

@Override
public void log(LogRecord record) {
String message = record.getMessage();
if (message != null) {
LOGGED.get().add(message);
}
super.log(record);
}
}

private static JavaPlugin stubPlugin() {
try {
JavaPlugin plugin = new ObjenesisStd().newInstance(TestPlugin.class);

Field loggerField = JavaPlugin.class.getDeclaredField("logger");
loggerField.setAccessible(true);
loggerField.set(plugin, Logger.getLogger("ActivityConfigurationRewardsTest"));
loggerField.set(plugin, new CapturingLogger());

return plugin;
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}

private final List<String> logged = new ArrayList<>();

private final Handler capture = new Handler() {
@Override
public void publish(LogRecord record) {
logged.add(record.getMessage());
}

@Override
public void flush() {
}

@Override
public void close() {
}
};

@BeforeEach
void captureLog() {
Logger logger = Logger.getLogger("ActivityConfigurationRewardsTest");
logger.setLevel(Level.ALL);
logger.addHandler(capture);
LOGGED.get().clear();
}

@AfterEach
void releaseLog() {
Logger.getLogger("ActivityConfigurationRewardsTest").removeHandler(capture);
LOGGED.remove();
}

private static List<String> logged() {
return LOGGED.get();
}

private boolean loggedContains(String fragment) {
return logged.stream().anyMatch(message -> message.contains(fragment));
return logged().stream().anyMatch(message -> message != null && message.contains(fragment));
}

private static FileConfiguration yaml(String content) {
Expand Down Expand Up @@ -487,20 +489,20 @@ void aFixedDropLoadsAgainstItsMilestoneWithPathAmountAndName() {
List.of(new RewardEntry.Item("m.material.steel", 3))),
30, new RewardEntry(1, "Diamond", List.of(),
List.of(new RewardEntry.Item("DIAMOND", 1)))), drops);
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
void aMissingDropsSectionMeansEveryMilestoneDrawsFromThePool() {
assertTrue(loadDrops(List.of(10, 20), "rewards:\n multiplier: 1\n").isEmpty());
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
void poolIsCaseInsensitive() {
assertTrue(loadDrops(List.of(10, 20), "rewards:\n drops:\n drop_1: POOL\n drop_2: Pool\n")
.isEmpty());
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
Expand Down Expand Up @@ -616,14 +618,14 @@ void dailyRewardGroupsLoadInConfigOrderWithPathAmountAndName() {
groups.get("vip"));
assertEquals(new RewardEntry(1, "Steel", List.of(),
List.of(new RewardEntry.Item("m.material.steel", 3))), groups.get("ascended"));
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
void noDailyRewardSectionOrAnEmptyOnePaysNothingQuietly() {
assertTrue(loadDailyRewards("rewards:\n multiplier: 1\n").isEmpty());
assertTrue(loadDailyRewards("daily-reward:\n groups: {}\n").isEmpty());
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
Expand Down Expand Up @@ -659,7 +661,7 @@ void aPoolDailyRewardGroupLoadsBesideAnItemGroup() throws ReflectiveOperationExc
assertSame(ActivityConfiguration.DAILY_POOL, groups.get("old"));
assertEquals(new RewardEntry(1, "Diamond", List.of(), List.of(new RewardEntry.Item("DIAMOND", 2))),
groups.get("noble"));
assertTrue(logged.isEmpty(), logged.toString());
assertTrue(logged().isEmpty(), logged().toString());
}

@Test
Expand All @@ -674,7 +676,7 @@ void aPoolDailyRewardGroupWithAnEmptyPoolIsKeptAndWarnedAbout() {
@Test
void anEmptyPoolIsNotWarnedAboutWithoutAPoolGroup() {
loadDailyRewards("daily-reward:\n groups:\n vip: DIAMOND\n");
assertTrue(logged.isEmpty(), logged.toString());
assertTrue(logged().isEmpty(), logged().toString());
}

@Test
Expand All @@ -695,7 +697,7 @@ void aBlockDropLoadsWithItsPathAndAmount() {

assertEquals(Map.of(10, new RewardEntry(1, "Steel", List.of(),
List.of(new RewardEntry.Item("m.material.steel", 3)))), drops);
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
Expand All @@ -705,7 +707,7 @@ void aBlockDropWithNoAmountDefaultsToOne() {

assertEquals(Map.of(10, new RewardEntry(1, "Diamond", List.of(),
List.of(new RewardEntry.Item("DIAMOND", 1)))), drops);
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
Expand All @@ -715,7 +717,7 @@ void aBlockDropAmountMayBeAQuotedString() {

assertEquals(Map.of(10, new RewardEntry(1, "Diamond", List.of(),
List.of(new RewardEntry.Item("DIAMOND", 3)))), drops);
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
Expand Down Expand Up @@ -790,7 +792,7 @@ void aStringDropStillLoadsAlongsideBlockForm() {
List.of(new RewardEntry.Item("m.material.steel", 3))),
20, new RewardEntry(1, "Diamond", List.of(),
List.of(new RewardEntry.Item("DIAMOND", 1)))), drops);
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
Expand All @@ -800,7 +802,7 @@ void aBlockDailyRewardLoadsWithItsPathAndAmount() {

assertEquals(Map.of("legacy", new RewardEntry(1, "Rare Item Skin Scroll", List.of(),
List.of(new RewardEntry.Item("m.loot.rare_item_skin_scroll", 1)))), groups);
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
Expand All @@ -810,7 +812,7 @@ void aBlockDailyRewardWithNoAmountDefaultsToOne() {

assertEquals(Map.of("vip", new RewardEntry(1, "Diamond", List.of(),
List.of(new RewardEntry.Item("DIAMOND", 1)))), groups);
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
Expand All @@ -820,7 +822,7 @@ void aBlockDailyRewardAmountMayBeAQuotedString() {

assertEquals(Map.of("vip", new RewardEntry(1, "Diamond", List.of(),
List.of(new RewardEntry.Item("DIAMOND", 3)))), groups);
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}

@Test
Expand Down Expand Up @@ -897,7 +899,7 @@ void aStringDailyRewardStillLoadsAlongsideBlockForm() {
groups.get("vip"));
assertEquals(new RewardEntry(1, "Steel", List.of(),
List.of(new RewardEntry.Item("m.material.steel", 3))), groups.get("ascended"));
assertTrue(logged.isEmpty());
assertTrue(logged().isEmpty());
}
@Test
void namedPoolsDoNotInheritPackagedRewardsAndReloadReplacesThem() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,13 @@ void guiMessagesKeepTheirPlaceholders() {
assertTrue(messages.getString("gui.activity-lore-today-capped").contains("%today%"));
assertTrue(messages.getString("gui.activity-lore-today-capped").contains("%cap%"));
assertNull(messages.getString("gui.bar-lore-milestones"));
assertTrue(messages.getString("gui.bar-lore-next").contains("%points%"));
assertNull(messages.getString("gui.bar-lore-next"));
assertNull(messages.getString("gui.bar-lore-done"));
assertTrue(messages.getString("gui.bar-lore-reward").contains("%points%"));
assertTrue(messages.getString("gui.bar-lore-reward").contains("%reward%"));
assertTrue(messages.getString("gui.bar-lore-next-options").contains("%points%"));
assertTrue(messages.getString("gui.bar-lore-none").toLowerCase(java.util.Locale.ROOT)
.contains("no more rewards this week"));
}

private static final Pattern HEX_MARKER = Pattern.compile("#[0-9a-fA-F]{6}");
Expand Down
Loading