Skip to content

Commit

Permalink
Add priority and tooltip visibility to composable modifiers
Browse files Browse the repository at this point in the history
Might be worth letting the modules take a poll on priority if you don't set it, but thats a later feature to consider
  • Loading branch information
KnightMiner committed Jun 5, 2023
1 parent b3c974a commit b550b22
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
{
"type": "tconstruct:composable",
"level_display": "tconstruct:default",
"tooltip_display": "always",
"priority": 100,
"modules": [
{
"type": "tconstruct:harvest_enchantment",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
{
"type": "tconstruct:composable",
"level_display": "tconstruct:default",
"tooltip_display": "always",
"priority": 100,
"modules": [
{
"type": "tconstruct:looting",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
"type": "tconstruct:unique",
"unique_until": 3
},
"tooltip_display": "always",
"priority": 100,
"modules": [
{
"type": "tconstruct:harvest_enchantment",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
{
"type": "tconstruct:composable",
"level_display": "tconstruct:no_levels",
"tooltip_display": "always",
"priority": 100,
"modules": [
{
"type": "tconstruct:harvest_enchantment",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
import com.google.gson.JsonSyntaxException;
import io.netty.handler.codec.DecoderException;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.util.GsonHelper;
import slimeknights.mantle.data.GenericLoaderRegistry.IGenericLoader;
import slimeknights.mantle.util.JsonHelper;
import slimeknights.tconstruct.library.modifiers.Modifier;
Expand All @@ -22,16 +24,22 @@

import java.util.Collections;
import java.util.List;
import java.util.Locale;

/**
* Modifier consisting of many composed hooks
*/
public class ComposableModifier extends Modifier {
private final ModifierLevelDisplay levelDisplay;
private final TooltipDisplay tooltipDisplay;
@Getter
private final int priority;
private final List<ModuleWithHooks> modules;
public ComposableModifier(ModifierLevelDisplay levelDisplay, List<ModuleWithHooks> modules) {
protected ComposableModifier(ModifierLevelDisplay levelDisplay, TooltipDisplay tooltipDisplay, int priority, List<ModuleWithHooks> modules) {
super(ModifierModule.createMap(modules));
this.levelDisplay = levelDisplay;
this.tooltipDisplay = tooltipDisplay;
this.priority = priority;
this.modules = modules;
}

Expand All @@ -54,14 +62,28 @@ public Component getDisplayName(int level) {
return levelDisplay.nameForLevel(this, level);
}

@Override
public boolean shouldDisplay(boolean advanced) {
return advanced ? tooltipDisplay != TooltipDisplay.NEVER
: tooltipDisplay == TooltipDisplay.ALWAYS;
}

/** Determines when this modifier shows in tooltips */
public enum TooltipDisplay { ALWAYS, TINKER_STATION, NEVER }

public static IGenericLoader<ComposableModifier> LOADER = new IGenericLoader<>() {
@Override
public ComposableModifier deserialize(JsonObject json) {
ModifierLevelDisplay display = ModifierLevelDisplay.LOADER.getAndDeserialize(json, "level_display");
ModifierLevelDisplay level_display = ModifierLevelDisplay.LOADER.getAndDeserialize(json, "level_display");
TooltipDisplay tooltipDisplay = TooltipDisplay.ALWAYS;
int priority = GsonHelper.getAsInt(json, "priority", DEFAULT_PRIORITY);
if (json.has("tooltip_display")) {
tooltipDisplay = JsonHelper.getAsEnum(json, "tooltip_display", TooltipDisplay.class);
}
List<ModuleWithHooks> modules = JsonHelper.parseList(json, "modules", ModuleWithHooks::deserialize);
// convert illegal argument to json syntax, bit more expected in this context
try {
return new ComposableModifier(display, modules);
return new ComposableModifier(level_display, tooltipDisplay, priority, modules);
} catch (IllegalArgumentException e) {
throw new JsonSyntaxException(e.getMessage(), e);
}
Expand All @@ -70,6 +92,8 @@ public ComposableModifier deserialize(JsonObject json) {
@Override
public void serialize(ComposableModifier object, JsonObject json) {
json.add("level_display", ModifierLevelDisplay.LOADER.serialize(object.levelDisplay));
json.addProperty("tooltip_display", object.tooltipDisplay.name().toLowerCase(Locale.ROOT));
json.addProperty("priority", object.priority);
JsonArray modules = new JsonArray();
for (ModuleWithHooks module : object.modules) {
modules.add(module.serialize());
Expand All @@ -79,14 +103,16 @@ public void serialize(ComposableModifier object, JsonObject json) {

@Override
public ComposableModifier fromNetwork(FriendlyByteBuf buffer) {
ModifierLevelDisplay display = ModifierLevelDisplay.LOADER.fromNetwork(buffer);
ModifierLevelDisplay levelDisplay = ModifierLevelDisplay.LOADER.fromNetwork(buffer);
TooltipDisplay tooltipDisplay = buffer.readEnum(TooltipDisplay.class);
int priority = buffer.readInt();
int moduleCount = buffer.readVarInt();
ImmutableList.Builder<ModuleWithHooks> builder = ImmutableList.builder();
for (int i = 0; i < moduleCount; i++) {
builder.add(ModuleWithHooks.fromNetwork(buffer));
}
try {
return new ComposableModifier(display, builder.build());
return new ComposableModifier(levelDisplay, tooltipDisplay, priority, builder.build());
} catch (IllegalArgumentException e) {
throw new DecoderException(e.getMessage(), e);
}
Expand All @@ -95,6 +121,8 @@ public ComposableModifier fromNetwork(FriendlyByteBuf buffer) {
@Override
public void toNetwork(ComposableModifier object, FriendlyByteBuf buffer) {
ModifierLevelDisplay.LOADER.toNetwork(object.levelDisplay, buffer);
buffer.writeEnum(object.tooltipDisplay);
buffer.writeInt(object.priority);
buffer.writeVarInt(object.modules.size());
for (ModuleWithHooks module : object.modules) {
module.toNetwork(buffer);
Expand All @@ -108,6 +136,10 @@ public void toNetwork(ComposableModifier object, FriendlyByteBuf buffer) {
public static class Builder {
@Setter
private ModifierLevelDisplay levelDisplay = ModifierLevelDisplay.DEFAULT;
@Setter
private TooltipDisplay tooltipDisplay = TooltipDisplay.ALWAYS;
@Setter
private int priority = DEFAULT_PRIORITY;
private final ImmutableList.Builder<ModuleWithHooks> modules = ImmutableList.builder();

/** Adds a module to the builder */
Expand All @@ -125,7 +157,7 @@ public final <T extends ModifierModule> Builder addHook(T object, ModifierHook<?

/** Builds the final instance */
public ComposableModifier build() {
return new ComposableModifier(levelDisplay, modules.build());
return new ComposableModifier(levelDisplay, tooltipDisplay, priority, modules.build());
}
}
}

0 comments on commit b550b22

Please sign in to comment.