Skip to content

Commit

Permalink
pass 2
Browse files Browse the repository at this point in the history
  • Loading branch information
deirn committed Feb 10, 2024
1 parent 078f578 commit dc655e9
Show file tree
Hide file tree
Showing 11 changed files with 136 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import mcp.mobius.waila.util.ModInfo;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.CommonLifecycleEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
Expand All @@ -27,6 +28,7 @@ public void onInitialize() {

ServerLifecycleEvents.SERVER_STARTING.register(server -> PluginConfig.reload());
ServerLifecycleEvents.SERVER_STOPPED.register(server -> onServerStopped());
CommonLifecycleEvents.TAGS_LOADED.register((registries, client) -> onTagReload());

ModInfo.register(new ModInfo(false, "c", "Common", "0"));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import mcp.mobius.waila.debug.DumpGenerator;
import mcp.mobius.waila.network.Packets;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.TagsUpdatedEvent;
import net.minecraftforge.event.server.ServerStartingEvent;
import net.minecraftforge.event.server.ServerStoppedEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
Expand Down Expand Up @@ -52,6 +53,11 @@ static void serverStopped(ServerStoppedEvent event) {
onServerStopped();
}

@SubscribeEvent
static void tagReload(TagsUpdatedEvent event) {
onTagReload();
}

@SubscribeEvent
static void registerCommands(RegisterCommandsEvent event) {
ServerCommand.register(event.getDispatcher());
Expand Down
6 changes: 6 additions & 0 deletions platform/neo/src/main/java/mcp/mobius/waila/neo/NeoWaila.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent;
import net.neoforged.neoforge.event.RegisterCommandsEvent;
import net.neoforged.neoforge.event.TagsUpdatedEvent;
import net.neoforged.neoforge.event.server.ServerStartingEvent;
import net.neoforged.neoforge.event.server.ServerStoppedEvent;

Expand Down Expand Up @@ -52,6 +53,11 @@ static void serverStopped(ServerStoppedEvent event) {
onServerStopped();
}

@SubscribeEvent
static void tagReload(TagsUpdatedEvent event) {
onTagReload();
}

@SubscribeEvent
static void registerCommands(RegisterCommandsEvent event) {
ServerCommand.register(event.getDispatcher());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ public interface IHarvestService {

IToolType.Builder0 createToolTypeBuilder();

void resetCache();

}
25 changes: 0 additions & 25 deletions src/api/java/mcp/mobius/waila/api/component/ToolComponent.java

This file was deleted.

5 changes: 5 additions & 0 deletions src/main/java/mcp/mobius/waila/Waila.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import mcp.mobius.waila.api.IJsonConfig;
import mcp.mobius.waila.api.IPluginInfo;
import mcp.mobius.waila.api.WailaConstants;
import mcp.mobius.waila.api.__internal__.IHarvestService;
import mcp.mobius.waila.config.BlacklistConfig;
import mcp.mobius.waila.config.WailaConfig;
import mcp.mobius.waila.gui.hud.theme.ThemeDefinition;
Expand Down Expand Up @@ -57,6 +58,10 @@ protected static void onServerStopped() {
RegistryFilter.attach(null);
}

protected static void onTagReload() {
IHarvestService.INSTANCE.resetCache();
}

protected static void unsupportedPlatform(String platformName, String loaderName, String clazz) {
try {
Class.forName(clazz);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public class WailaPluginHarvest implements IWailaPlugin {
@Override
public void register(IRegistrar registrar) {
registrar.addComponent(HarvestProvider.INSTANCE, TooltipPosition.BODY, Block.class);
registrar.addEventListener(HarvestProvider.INSTANCE);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package mcp.mobius.waila.plugin.harvest.component;

import mcp.mobius.waila.api.ITooltipComponent;
import mcp.mobius.waila.api.__internal__.ApiSide;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;

@ApiSide.ClientOnly
public class ToolComponent implements ITooltipComponent {

private final ItemStack icon;
private final @Nullable Boolean matches;

public ToolComponent(ItemStack icon, @Nullable Boolean matches) {
this.icon = icon;
this.matches = matches;
}

@Override
public int getWidth() {
return 10;
}

@Override
public int getHeight() {
return Minecraft.getInstance().font.lineHeight;
}

@Override
public void render(GuiGraphics ctx, int x, int y, float delta) {
ctx.pose().pushPose();
ctx.pose().translate(-1, -2, 0);
ctx.pose().scale(0.8f, 0.8f, 1f);
ctx.pose().translate(x / 0.8f, y / 0.8f, 0);
ctx.renderItem(icon, 0, 0);
ctx.pose().popPose();

if (matches == null) return;
if (matches) {
//TODO
}
}

}
Original file line number Diff line number Diff line change
@@ -1,61 +1,93 @@
package mcp.mobius.waila.plugin.harvest.provider;

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

import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;
import mcp.mobius.waila.api.IBlockAccessor;
import mcp.mobius.waila.api.IBlockComponentProvider;
import mcp.mobius.waila.api.ICommonAccessor;
import mcp.mobius.waila.api.IEventListener;
import mcp.mobius.waila.api.IPluginConfig;
import mcp.mobius.waila.api.ITooltip;
import mcp.mobius.waila.api.__internal__.IApiService;
import mcp.mobius.waila.api.component.ItemComponent;
import mcp.mobius.waila.api.component.GrowingComponent;
import mcp.mobius.waila.plugin.harvest.component.ToolComponent;
import mcp.mobius.waila.plugin.harvest.tool.ToolType;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Tier;
import net.minecraft.world.item.TieredItem;
import net.minecraft.world.item.Tiers;
import net.minecraft.world.level.block.state.BlockState;

public enum HarvestProvider implements IBlockComponentProvider {
public enum HarvestProvider implements IBlockComponentProvider, IEventListener {

INSTANCE;

public final Map<BlockState, List<ToolType>> toolsCache = new Reference2ObjectOpenHashMap<>();
public final Map<BlockState, Tier> tierCache = new Reference2ObjectOpenHashMap<>();

private int updateId = 0;
private BlockState state;
private List<ToolType> tools;
private Tier highestTier;

@Override
public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig config) {
var state = accessor.getBlockState();
var world = accessor.getWorld();
var pos = accessor.getPosition();
var stack = accessor.getStack();
var player = accessor.getPlayer();
updateId = accessor.getUpdateId();
state = accessor.getBlockState();

var destroySpeed = state.getDestroySpeed(world, pos);
var destroySpeed = state.getDestroySpeed(accessor.getWorld(), accessor.getPosition());
if (destroySpeed <= 0) return;

var tools = new ArrayList<Map.Entry<ResourceLocation, ToolType>>();
for (var entry : ToolType.MAP.entrySet()) {
var tool = entry.getValue();
if (tool.blockPredicate.test(state) || tool.lowestTierStack.getDestroySpeed(state) >= Tiers.WOOD.getSpeed()) {
tools.add(entry);
tools = toolsCache.get(state);
if (tools == null) {
tools = new ArrayList<>();
for (var entry : ToolType.MAP.entrySet()) {
var tool = entry.getValue();
if (tool.blockPredicate.test(state)) {
tools.add(tool);
}
}
if (tools.isEmpty()) tools = List.of();
toolsCache.put(state, tools);
}

if (tools.isEmpty()) return;

Tier highestTier = Tiers.WOOD;
for (var tier : IApiService.INSTANCE.getTiers()) {
var tag = IApiService.INSTANCE.getTierTag(tier);
if (tag != null && state.is(tag)) {
highestTier = tier;
highestTier = tierCache.get(state);
if (highestTier == null) {
highestTier = Tiers.WOOD;
for (var tier : IApiService.INSTANCE.getTiers()) {
var tag = IApiService.INSTANCE.getTierTag(tier);
if (tag != null && state.is(tag)) {
highestTier = tier;
}
}
tierCache.put(state, highestTier);
}
}

var line = tooltip.addLine();
for (var tool : tools) {
var icon = tool.getValue().icons.get().get(highestTier);
line.with(new ItemComponent(icon));
@Override
public void onHandleTooltip(ITooltip tooltip, ICommonAccessor accessor, IPluginConfig config) {
if (updateId != accessor.getUpdateId()) return;
if (tools.isEmpty()) return;

var heldStack = accessor.getPlayer().getInventory().getSelected();

var line = tooltip.getLine(tooltip.getLineCount() - 1);
line.with(GrowingComponent.INSTANCE);

for (var tool : tools) {
var icon = tool.icons.get().get(highestTier);
Boolean matches = null;
if (state.requiresCorrectToolForDrops()) {
line.with(Component.literal(String.valueOf(player.hasCorrectToolForDrops(state))));
matches = tool.itemPredicate.test(heldStack);
if (highestTier != Tiers.WOOD && heldStack.getItem() instanceof TieredItem tiered) {
matches = matches && tiered.getTier() == highestTier;
}
}
line.with(new ToolComponent(icon, matches));
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,40 +1,29 @@
package mcp.mobius.waila.plugin.harvest.service;

import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;

import mcp.mobius.waila.api.IToolType;
import mcp.mobius.waila.api.__internal__.IHarvestService;
import mcp.mobius.waila.plugin.harvest.provider.HarvestProvider;
import mcp.mobius.waila.plugin.harvest.tool.ToolType;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Tier;
import net.minecraft.world.level.block.Block;
import org.jetbrains.annotations.Nullable;

public class HarvestService implements IHarvestService {

private static Function<Tier, @Nullable TagKey<Block>> tierTagKeyFunction = tier -> null;
private static Supplier<List<Tier>> tierListSupplier = List::of;

@Nullable
public static TagKey<Block> getTierTag(Tier tier) {
return tierTagKeyFunction.apply(tier);
}

public static List<Tier> getTiers() {
return tierListSupplier.get();
}

@Override
public void addToolType(ResourceLocation id, IToolType toolType) {
ToolType.MAP.put(id, (ToolType) toolType);
var impl = (ToolType) toolType;
impl.id = id;
ToolType.MAP.put(id, impl);
}

@Override
public IToolType.Builder0 createToolTypeBuilder() {
return new ToolType();
}

@Override
public void resetCache() {
HarvestProvider.INSTANCE.toolsCache.clear();
HarvestProvider.INSTANCE.tierCache.clear();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public class ToolType implements IToolType, IToolType.Builder0, IToolType.Builde

public static final Map<ResourceLocation, ToolType> MAP = new HashMap<>();

public ResourceLocation id;
public ItemStack lowestTierStack;
public Predicate<BlockState> blockPredicate;
public Predicate<ItemStack> itemPredicate;
Expand Down

0 comments on commit dc655e9

Please sign in to comment.