Skip to content

Commit c6d27c4

Browse files
committed
Add few placeholders
1 parent 2bf2dd6 commit c6d27c4

File tree

5 files changed

+177
-6
lines changed

5 files changed

+177
-6
lines changed

docs/user/default-placeholders.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Default placeholder list
22
These placeholders are provided by default and are available for every mod using Placeholder API.
3+
If placeholder isn't parsed, make sure it is used in correct context, with valid arguments and
4+
that you are using the latest version.
35

46
## List of placeholders
57
### Server
@@ -14,6 +16,9 @@ These placeholders are provided by default and are available for every mod using
1416
- `%server:max_ram%`/`%server:max_ram/gb%` - maximal amount of ram, that can be used by server
1517
- `%server:online%` - number of online players
1618
- `%server:max_players%` - maximal player count
19+
- `%server:mod_version/[modid]%` - returns version of the mod
20+
- `%server:mod_name/[modid]%` - returns name of the mod
21+
- `%server:mod_description/[modid]%` - returns description of the mod
1722

1823
### World
1924
- `%world:time%` - world's time
@@ -27,9 +32,11 @@ These placeholders are provided by default and are available for every mod using
2732

2833
### Player
2934
- `%player:name%` - player's name
35+
- `%player:name_visual%` - player's name (without hover and click action)
3036
- `%player:name_unformatted%` - player's name (without formatting)
31-
- `%player:displayname%` - player's displayname (used on chat)
32-
- `%player:displayname_unformatted%` - player's displayname (without formatting)
37+
- `%player:displayname%` - player's display name (used on chat)
38+
- `%player:displayname_visual%` - player's display name (without hover and click action)
39+
- `%player:displayname_unformatted%` - player's display name (without formatting)
3340
- `%player:ping%` - player's ping
3441
- `%player:ping_colored%` - colored player's ping
3542
- `%player:pos_x%` - player's x coordinate
@@ -39,6 +46,8 @@ These placeholders are provided by default and are available for every mod using
3946
- `%player:max_health%` - player's max health
4047
- `%player:hunger%` - player's hunger
4148
- `%player:saturation%` - player's saturation
49+
- `%player:inventory_slot/[slot number]%` - item in player's inventory at slot
50+
- `%player:equipment_slot/[name]%` - player's equipment at selected slot. Valid values for `[name]` are `mainhand`, `offhand`, `head`, `chest`, `legs` and `feet`
4251
- `%player:playtime%`/`%player:playtime/[formatting]%` - player's playtime
4352
- `%player:statistic/[statistic]%` - value of player's statistic
4453

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G
88
loader_version=0.11.3
99

1010
# Mod Properties
11-
mod_version = 1.1.2+1.17.1
11+
mod_version = 1.1.3+1.17.1
1212
maven_group = eu.pb4
1313
archives_base_name = placeholder-api
1414

src/main/java/eu/pb4/placeholders/builtin/PlayerPlaceholders.java

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import eu.pb4.placeholders.PlaceholderAPI;
44
import eu.pb4.placeholders.PlaceholderResult;
55
import eu.pb4.placeholders.util.GeneralUtils;
6-
import eu.pb4.placeholders.util.PlaceholderUtils;
7-
import net.minecraft.stat.Stat;
6+
import net.minecraft.entity.EquipmentSlot;
7+
import net.minecraft.item.ItemStack;
88
import net.minecraft.stat.Stats;
99
import net.minecraft.text.LiteralText;
1010
import net.minecraft.util.Formatting;
@@ -22,6 +22,14 @@ public static void register() {
2222
}
2323
});
2424

25+
PlaceholderAPI.register(new Identifier("player", "name_visual"), (ctx) -> {
26+
if (ctx.hasPlayer()) {
27+
return PlaceholderResult.value(GeneralUtils.removeHoverAndClick(ctx.getPlayer().getName()));
28+
} else {
29+
return PlaceholderResult.invalid("No player!");
30+
}
31+
});
32+
2533
PlaceholderAPI.register(new Identifier("player", "name_unformatted"), (ctx) -> {
2634
if (ctx.hasPlayer()) {
2735
return PlaceholderResult.value(GeneralUtils.textToString(ctx.getPlayer().getName()));
@@ -55,6 +63,14 @@ public static void register() {
5563
}
5664
});
5765

66+
PlaceholderAPI.register(new Identifier("player", "displayname_visual"), (ctx) -> {
67+
if (ctx.hasPlayer()) {
68+
return PlaceholderResult.value(GeneralUtils.removeHoverAndClick(ctx.getPlayer().getDisplayName()));
69+
} else {
70+
return PlaceholderResult.invalid("No player!");
71+
}
72+
});
73+
5874
PlaceholderAPI.register(new Identifier("player", "displayname_unformatted"), (ctx) -> {
5975
if (ctx.hasPlayer()) {
6076
return PlaceholderResult.value(GeneralUtils.textToString(ctx.getPlayer().getDisplayName()));
@@ -63,13 +79,51 @@ public static void register() {
6379
}
6480
});
6581

82+
PlaceholderAPI.register(new Identifier("player", "inventory_slot"), (ctx) -> {
83+
if (ctx.hasPlayer() && ctx.hasArgument()) {
84+
try {
85+
int slot = Integer.parseInt(ctx.getArgument());
86+
87+
var inventory = ctx.getPlayer().getInventory();
88+
89+
if (slot >= 0 && slot < inventory.size()) {
90+
var stack = inventory.getStack(slot);
91+
92+
return PlaceholderResult.value(GeneralUtils.getItemText(stack));
93+
}
94+
95+
} catch (Exception e) {
96+
// noop
97+
}
98+
return PlaceholderResult.invalid("Invalid argument");
99+
} else {
100+
return PlaceholderResult.invalid("No player!");
101+
}
102+
});
103+
104+
PlaceholderAPI.register(new Identifier("player", "equipment_slot"), (ctx) -> {
105+
if (ctx.hasPlayer() && ctx.hasArgument()) {
106+
try {
107+
var slot = EquipmentSlot.byName(ctx.getArgument());
108+
109+
var stack = ctx.getPlayer().getEquippedStack(slot);
110+
return PlaceholderResult.value(GeneralUtils.getItemText(stack));
111+
} catch (Exception e) {
112+
// noop
113+
}
114+
return PlaceholderResult.invalid("Invalid argument");
115+
} else {
116+
return PlaceholderResult.invalid("No player!");
117+
}
118+
});
119+
66120
PlaceholderAPI.register(new Identifier("player", "playtime"), (ctx) -> {
67121
if (ctx.hasPlayer()) {
68122
int x = ctx.getPlayer().getStatHandler().getStat(Stats.CUSTOM.getOrCreateStat(Stats.PLAY_TIME));
69123
return PlaceholderResult.value(ctx.hasArgument()
70124
? DurationFormatUtils.formatDuration((long) x * 50, ctx.getArgument(), true)
71125
: GeneralUtils.durationToString((long) x / 20)
72-
);
126+
);
73127
} else {
74128
return PlaceholderResult.invalid("No player!");
75129
}

src/main/java/eu/pb4/placeholders/builtin/ServerPlaceholders.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import eu.pb4.placeholders.PlaceholderAPI;
44
import eu.pb4.placeholders.PlaceholderResult;
5+
import eu.pb4.placeholders.util.GeneralUtils;
6+
import net.fabricmc.loader.api.FabricLoader;
57
import net.minecraft.text.LiteralText;
68
import net.minecraft.util.Formatting;
79
import net.minecraft.util.Identifier;
@@ -59,6 +61,40 @@ public static void register() {
5961
});
6062

6163
PlaceholderAPI.register(new Identifier("server", "version"), (ctx) -> PlaceholderResult.value(ctx.getServer().getVersion()));
64+
65+
PlaceholderAPI.register(new Identifier("server", "mod_version"), (ctx) -> {
66+
if (ctx.hasArgument()) {
67+
var container = FabricLoader.getInstance().getModContainer(ctx.getArgument());
68+
69+
if (container.isPresent()) {
70+
return PlaceholderResult.value(new LiteralText(container.get().getMetadata().getVersion().getFriendlyString()));
71+
}
72+
}
73+
return PlaceholderResult.invalid("Invalid argument");
74+
});
75+
76+
PlaceholderAPI.register(new Identifier("server", "mod_name"), (ctx) -> {
77+
if (ctx.hasArgument()) {
78+
var container = FabricLoader.getInstance().getModContainer(ctx.getArgument());
79+
80+
if (container.isPresent()) {
81+
return PlaceholderResult.value(new LiteralText(container.get().getMetadata().getName()));
82+
}
83+
}
84+
return PlaceholderResult.invalid("Invalid argument");
85+
});
86+
87+
PlaceholderAPI.register(new Identifier("server", "mod_description"), (ctx) -> {
88+
if (ctx.hasArgument()) {
89+
var container = FabricLoader.getInstance().getModContainer(ctx.getArgument());
90+
91+
if (container.isPresent()) {
92+
return PlaceholderResult.value(new LiteralText(container.get().getMetadata().getDescription()));
93+
}
94+
}
95+
return PlaceholderResult.invalid("Invalid argument");
96+
});
97+
6298
PlaceholderAPI.register(new Identifier("server", "name"), (ctx) -> PlaceholderResult.value(ctx.getServer().getName()));
6399

64100
PlaceholderAPI.register(new Identifier("server", "used_ram"), (ctx) -> {

src/main/java/eu/pb4/placeholders/util/GeneralUtils.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package eu.pb4.placeholders.util;
22

33
import it.unimi.dsi.fastutil.ints.Int2ObjectFunction;
4+
import net.minecraft.item.ItemStack;
45
import net.minecraft.text.*;
6+
import net.minecraft.util.Formatting;
57
import org.jetbrains.annotations.ApiStatus;
68

9+
import java.util.ArrayList;
710
import java.util.List;
811

912
@ApiStatus.Internal
@@ -118,6 +121,75 @@ public static GeneralUtils.HSV rgbToHsv(int rgb) {
118121
return new HSV(h, s, cmax);
119122
}
120123

124+
public static Text removeHoverAndClick(Text input) {
125+
var output = cloneText(input);
126+
removeHoverAndClick(output);
127+
return output;
128+
}
129+
130+
private static void removeHoverAndClick(MutableText input) {
131+
if (input.getStyle() != null) {
132+
input.setStyle(input.getStyle().withHoverEvent(null).withClickEvent(null));
133+
}
134+
135+
if (input instanceof TranslatableText text) {
136+
for (int i = 0; i < text.getArgs().length; i++) {
137+
var arg = text.getArgs()[i];
138+
if (arg instanceof MutableText argText) {
139+
removeHoverAndClick(argText);
140+
}
141+
}
142+
}
143+
144+
for (var sibling : input.getSiblings()) {
145+
removeHoverAndClick((MutableText) sibling);
146+
}
147+
148+
}
149+
150+
public static MutableText cloneText(Text input) {
151+
MutableText baseText;
152+
if (input instanceof TranslatableText translatable) {
153+
var obj = new ArrayList<>();
154+
155+
for (var arg : translatable.getArgs()) {
156+
if (arg instanceof Text argText) {
157+
obj.add(cloneText(argText));
158+
} else {
159+
obj.add(arg);
160+
}
161+
}
162+
163+
baseText = new TranslatableText(translatable.getKey(), obj.toArray());
164+
} else {
165+
baseText = input.copy();
166+
}
167+
168+
for (var sibling : input.getSiblings()) {
169+
baseText.append(cloneText(sibling));
170+
}
171+
172+
baseText.setStyle(input.getStyle());
173+
return baseText;
174+
}
175+
176+
public static Text getItemText(ItemStack stack) {
177+
if (!stack.isEmpty()) {
178+
MutableText mutableText = (new LiteralText("")).append(stack.getName());
179+
if (stack.hasCustomName()) {
180+
mutableText.formatted(Formatting.ITALIC);
181+
}
182+
183+
mutableText.formatted(stack.getRarity().formatting).styled((style) -> {
184+
return style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackContent(stack)));
185+
});
186+
187+
return mutableText;
188+
}
189+
190+
return (new LiteralText("")).append(ItemStack.EMPTY.getName());
191+
}
192+
121193
public static record HSV(float h, float s, float v) {
122194
}
123195

0 commit comments

Comments
 (0)