Skip to content

Commit 7ca9b47

Browse files
authored
Merge pull request #37 from LaBoulangerie/feat/add_command_to_give_masterItems
add commands and update api minelet
2 parents 388cc06 + 73a1212 commit 7ca9b47

15 files changed

Lines changed: 601 additions & 58 deletions

File tree

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<parent>
7+
<groupId>org.betonquest</groupId>
8+
<artifactId>parent</artifactId>
9+
<version>2.10.0</version>
10+
</parent>
11+
12+
<name>BetonQuest Build</name>
13+
<artifactId>betonquest</artifactId>
14+
<version>3.0.2</version>
15+
<description>All Your Adventure Supplies</description>
16+
17+
<properties>
18+
<revision>3.0.2</revision>
19+
<changelist>-SNAPSHOT</changelist>
20+
<pit.report.skip>true</pit.report.skip>
21+
22+
<maven-shade-plugin.path>${project.groupId}.${project.artifactId}</maven-shade-plugin.path>
23+
24+
<!-- plugin metadata -->
25+
<plugin.name>BetonQuest</plugin.name>
26+
<plugin.main>${project.groupId}.${project.artifactId}.${plugin.name}Plugin</plugin.main>
27+
<plugin.version>3.0.2</plugin.version>
28+
<plugin.api-version>1.18</plugin.api-version>
29+
<plugin.description>All Your Adventure Supplies</plugin.description>
30+
31+
<!-- module versions -->
32+
<betonquest.core.version>3.0.2</betonquest.core.version>
33+
<betonquest.mc_1_20_6.version>3.0.2</betonquest.mc_1_20_6.version>
34+
<betonquest.mc_1_21_4.version>3.0.2</betonquest.mc_1_21_4.version>
35+
<betonquest.compatibility.version>3.0.2</betonquest.compatibility.version>
36+
37+
<!-- dependency versions -->
38+
<paper-api.version>1.18.2-R0.1-SNAPSHOT</paper-api.version>
39+
</properties>
40+
41+
<dependencies>
42+
<!-- from betonquest module -->
43+
<dependency>
44+
<groupId>org.betonquest.betonquest</groupId>
45+
<artifactId>core</artifactId>
46+
<version>${betonquest.core.version}</version>
47+
</dependency>
48+
<dependency>
49+
<groupId>org.betonquest.betonquest</groupId>
50+
<artifactId>mc_1_20_6</artifactId>
51+
<version>${betonquest.mc_1_20_6.version}</version>
52+
</dependency>
53+
<dependency>
54+
<groupId>org.betonquest.betonquest</groupId>
55+
<artifactId>mc_1_21_4</artifactId>
56+
<version>${betonquest.mc_1_21_4.version}</version>
57+
</dependency>
58+
<dependency>
59+
<groupId>org.betonquest.betonquest</groupId>
60+
<artifactId>compatibility</artifactId>
61+
<version>${betonquest.compatibility.version}</version>
62+
</dependency>
63+
64+
<!-- from papermc repository -->
65+
<dependency>
66+
<groupId>io.papermc.paper</groupId>
67+
<artifactId>paper-api</artifactId>
68+
<version>${paper-api.version}</version>
69+
<scope>provided</scope>
70+
<exclusions>
71+
<exclusion>
72+
<groupId>junit</groupId>
73+
<artifactId>junit</artifactId>
74+
</exclusion>
75+
</exclusions>
76+
</dependency>
77+
</dependencies>
78+
79+
<repositories>
80+
<repository>
81+
<id>betonquest-repo</id>
82+
<url>https://repo.betonquest.org/betonquest/</url>
83+
</repository>
84+
<repository>
85+
<id>betonquest-papermc-repo</id>
86+
<url>https://repo.papermc.io/repository/maven-public/</url>
87+
</repository>
88+
</repositories>
89+
90+
<build>
91+
<plugins>
92+
<plugin>
93+
<groupId>org.apache.maven.plugins</groupId>
94+
<artifactId>maven-enforcer-plugin</artifactId>
95+
<executions>
96+
<execution>
97+
<id>enforce-banned-dependencies</id>
98+
<goals>
99+
<goal>enforce</goal>
100+
</goals>
101+
<configuration>
102+
<rules>
103+
<bannedDependencies>
104+
<excludes>
105+
<exclude>org.spigotmc</exclude>
106+
<exclude>org.bukkit</exclude>
107+
</excludes>
108+
</bannedDependencies>
109+
</rules>
110+
<fail>true</fail>
111+
</configuration>
112+
</execution>
113+
</executions>
114+
</plugin>
115+
<plugin>
116+
<groupId>org.apache.maven.plugins</groupId>
117+
<artifactId>maven-shade-plugin</artifactId>
118+
<executions>
119+
<execution>
120+
<phase>package</phase>
121+
<goals>
122+
<goal>shade</goal>
123+
</goals>
124+
<configuration>
125+
<artifactSet>
126+
<includes>
127+
<include>org.betonquest.betonquest</include>
128+
<include>org.bstats</include>
129+
<include>dev.faststats.metrics</include>
130+
<include>org.apache.maven</include>
131+
<include>org.apache.commons</include>
132+
<include>com.google.guava</include>
133+
<include>commons-io</include>
134+
<include>com.cronutils:cron-utils</include>
135+
<include>de.themoep:minedown-adventure</include>
136+
</includes>
137+
</artifactSet>
138+
<filters>
139+
<filter>
140+
<artifact>org.bstats</artifact>
141+
<includes>
142+
<include>org/bstats/**</include>
143+
</includes>
144+
</filter>
145+
</filters>
146+
<relocations>
147+
<relocation>
148+
<pattern>org.bstats</pattern>
149+
<shadedPattern>${maven-shade-plugin.path}.dependencies.org.bstats</shadedPattern>
150+
</relocation>
151+
<relocation>
152+
<pattern>org.apache.maven</pattern>
153+
<shadedPattern>${maven-shade-plugin.path}.dependencies.org.apache.maven</shadedPattern>
154+
</relocation>
155+
<relocation>
156+
<pattern>org.apache.commons</pattern>
157+
<shadedPattern>${maven-shade-plugin.path}.dependencies.org.apache.commons</shadedPattern>
158+
</relocation>
159+
<relocation>
160+
<pattern>com.google.common</pattern>
161+
<shadedPattern>${maven-shade-plugin.path}.dependencies.com.google.common</shadedPattern>
162+
</relocation>
163+
<relocation>
164+
<pattern>com.cronutils</pattern>
165+
<shadedPattern>${maven-shade-plugin.path}.dependencies.com.cronutils</shadedPattern>
166+
</relocation>
167+
<relocation>
168+
<pattern>de.themoep</pattern>
169+
<shadedPattern>${maven-shade-plugin.path}.dependencies.de.themoep</shadedPattern>
170+
</relocation>
171+
</relocations>
172+
</configuration>
173+
</execution>
174+
</executions>
175+
</plugin>
176+
<plugin>
177+
<groupId>org.apache.maven.plugins</groupId>
178+
<artifactId>maven-antrun-plugin</artifactId>
179+
<executions>
180+
<execution>
181+
<id>copy-jar-files</id>
182+
<phase>package</phase>
183+
<goals>
184+
<goal>run</goal>
185+
</goals>
186+
<configuration>
187+
<target name="copy .jar files to root">
188+
<copy toDir="../../target/code"
189+
overwrite="true"
190+
quiet="true"
191+
verbose="true"
192+
failonerror="false"
193+
preservelastmodified="true">
194+
<fileset dir="../">
195+
<include name="*/target/code/*.jar"/>
196+
</fileset>
197+
<filtermapper>
198+
<replacestring from="target/code/" to=""/>
199+
</filtermapper>
200+
</copy>
201+
<copy file="${project.build.directory}/${project.name}.jar"
202+
tofile="../../target/code/BetonQuest.jar"
203+
overwrite="true"
204+
quiet="true"
205+
verbose="true"
206+
failonerror="false"
207+
preservelastmodified="true"/>
208+
</target>
209+
</configuration>
210+
</execution>
211+
</executions>
212+
</plugin>
213+
</plugins>
214+
</build>
215+
</project>

build.gradle.kts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ dependencies {
7070
compileOnly("redis.clients:jedis:5.1.3") {
7171
isTransitive = false
7272
}
73-
compileOnly("fr.minelet:minelet-api:1.2.0")
73+
compileOnly("fr.minelet:minelet-api:2.0.0")
7474
compileOnly("me.clip:placeholderapi:2.11.6")
7575
compileOnly("com.palmergames.bukkit.towny:towny:0.100.4.0")
7676
compileOnly("org.betonquest:betonquest:3.0.2") {
@@ -96,7 +96,10 @@ dependencies {
9696
testImplementation("org.junit.jupiter:junit-jupiter")
9797
testImplementation("org.mockito:mockito-core:5.18.0")
9898
testImplementation("redis.clients:jedis:5.1.3")
99-
testImplementation("fr.minelet:minelet-api:1.2.0")
99+
testImplementation("fr.minelet:minelet-api:2.0.0")
100+
testImplementation("com.sk89q.worldguard:worldguard-core:7.0.15") {
101+
isTransitive = false
102+
}
100103
testImplementation("net.kyori:adventure-text-serializer-ansi:4.26.1")
101104
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
102105
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package net.laboulangerie.laboulangeriemmo.commands;
2+
3+
import java.util.List;
4+
import org.bukkit.command.Command;
5+
import org.bukkit.command.CommandExecutor;
6+
import org.bukkit.command.CommandSender;
7+
import org.bukkit.command.TabCompleter;
8+
import org.bukkit.entity.Player;
9+
import org.jetbrains.annotations.NotNull;
10+
import org.jetbrains.annotations.Nullable;
11+
import net.laboulangerie.laboulangeriemmo.core.abilities.thehunter.HeadConfig;
12+
import net.laboulangerie.laboulangeriemmo.core.abilities.thehunter.MobHeadsRegistry;
13+
14+
/** Gives one exact Hunter trophy head to the player running the command. */
15+
public final class HunterHeadCommand implements CommandExecutor, TabCompleter {
16+
@Override
17+
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label,
18+
@NotNull String[] args) {
19+
if (!(sender instanceof Player player)) {
20+
sender.sendMessage("§cCette commande doit être exécutée en jeu.");
21+
return true;
22+
}
23+
if (args.length < 1 || args.length > 2) {
24+
usage(sender);
25+
return true;
26+
}
27+
28+
int headCount = MobHeadsRegistry.getConfiguredHeadCount(args[0]);
29+
if (headCount == 0) {
30+
sender.sendMessage("§cMob sans tête Hunter configurée : §e" + args[0]);
31+
return true;
32+
}
33+
if (headCount > 1 && args.length == 1) {
34+
sender.sendMessage("§cCe mob possède plusieurs têtes ; indiquez une variante.");
35+
usage(sender);
36+
return true;
37+
}
38+
39+
String variant = args.length == 2 ? args[1] : null;
40+
HeadConfig head = MobHeadsRegistry.getConfiguredHead(args[0], variant);
41+
if (head == null) {
42+
sender.sendMessage("§cVariante de tête inconnue : §e" + variant);
43+
sender.sendMessage("§7Variantes valides : §f"
44+
+ String.join(", ", MobHeadsRegistry.getVariants(args[0])));
45+
return true;
46+
}
47+
48+
MasteryItemCommand.give(player, head.createHead());
49+
sender.sendMessage("§aTête Hunter reçue : §e" + args[0]
50+
+ (variant == null ? "" : " §7(" + variant + ")"));
51+
return true;
52+
}
53+
54+
@Override
55+
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
56+
@NotNull String alias, @NotNull String[] args) {
57+
if (args.length == 1) {
58+
return MasteryItemCommand.matching(MobHeadsRegistry.getMobTypes(), args[0]);
59+
}
60+
if (args.length == 2) {
61+
return MasteryItemCommand.matching(MobHeadsRegistry.getVariants(args[0]), args[1]);
62+
}
63+
return List.of();
64+
}
65+
66+
private static void usage(CommandSender sender) {
67+
sender.sendMessage("§cUtilisation : /lbmmo hunterhead <mob_type> [variante]");
68+
sender.sendMessage("§7La variante est obligatoire si le mob possède plusieurs têtes ; utilisez DEFAULT pour la tête normale.");
69+
}
70+
}

src/main/java/net/laboulangerie/laboulangeriemmo/commands/LbmmoCommand.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ public LbmmoCommand() {
2525
register("stats", new Stats(), "laboulangeriemmo.stats", true);
2626
register("combo", new Combo(), "laboulangeriemmo.combo", true);
2727
register("talent", new TalentTree(), "laboulangeriemmo.talent", true);
28+
register("masteryitem", new MasteryItemCommand(), ADMIN_PERMISSION, true);
29+
register("hunterhead", new HunterHeadCommand(), ADMIN_PERMISSION, true);
2830
if (LaBoulangerieMmo.PLUGIN.getServer().getPluginManager().getPlugin("Towny") != null) {
2931
register("towny", new TownyMmo(), null, true);
3032
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package net.laboulangerie.laboulangeriemmo.commands;
2+
3+
import java.util.List;
4+
import java.util.Locale;
5+
import java.util.Map;
6+
import org.bukkit.command.Command;
7+
import org.bukkit.command.CommandExecutor;
8+
import org.bukkit.command.CommandSender;
9+
import org.bukkit.command.TabCompleter;
10+
import org.bukkit.entity.Player;
11+
import org.bukkit.inventory.ItemStack;
12+
import org.jetbrains.annotations.NotNull;
13+
import org.jetbrains.annotations.Nullable;
14+
import net.laboulangerie.laboulangeriemmo.LaBoulangerieMmo;
15+
16+
/** Gives one configured mastery item to the player running the command. */
17+
public final class MasteryItemCommand implements CommandExecutor, TabCompleter {
18+
@Override
19+
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label,
20+
@NotNull String[] args) {
21+
if (!(sender instanceof Player player)) {
22+
sender.sendMessage("§cCette commande doit être exécutée en jeu.");
23+
return true;
24+
}
25+
if (args.length != 1) {
26+
sender.sendMessage("§cUtilisation : /lbmmo masteryitem <item_id>");
27+
return true;
28+
}
29+
30+
ItemStack item = LaBoulangerieMmo.PLUGIN.getRareLootManager().createItem(args[0]).orElse(null);
31+
if (item == null) {
32+
sender.sendMessage("§cItem de maîtrise inconnu ou indisponible : §e" + args[0]);
33+
return true;
34+
}
35+
36+
give(player, item);
37+
sender.sendMessage("§aItem de maîtrise reçu : §e" + args[0]);
38+
return true;
39+
}
40+
41+
@Override
42+
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
43+
@NotNull String alias, @NotNull String[] args) {
44+
if (args.length != 1) return List.of();
45+
return matching(LaBoulangerieMmo.PLUGIN.getRareLootManager().itemIds(), args[0]);
46+
}
47+
48+
static void give(Player player, ItemStack item) {
49+
Map<Integer, ItemStack> overflow = player.getInventory().addItem(item);
50+
overflow.values().forEach(leftover -> player.getWorld().dropItemNaturally(player.getLocation(), leftover));
51+
}
52+
53+
static List<String> matching(List<String> values, String prefix) {
54+
String normalized = prefix.toLowerCase(Locale.ROOT);
55+
return values.stream().filter(value -> value.toLowerCase(Locale.ROOT).startsWith(normalized)).toList();
56+
}
57+
}

0 commit comments

Comments
 (0)