mirror of
https://github.com/Xiao-MoMi/Custom-Nameplates.git
synced 2025-12-28 03:09:14 +00:00
2.3 release
This commit is contained in:
@@ -167,14 +167,6 @@ public interface AdventureManager {
|
||||
*/
|
||||
String componentToJson(Component component);
|
||||
|
||||
/**
|
||||
* Get the component in original package
|
||||
*
|
||||
* @param component shaded component
|
||||
* @return paper component
|
||||
*/
|
||||
Object shadedToOriginal(Component component);
|
||||
|
||||
/**
|
||||
* Get MiniMessage format text from component
|
||||
*
|
||||
|
||||
@@ -7,7 +7,7 @@ plugins {
|
||||
|
||||
allprojects {
|
||||
|
||||
version = "2.3.0.0-beta-5"
|
||||
version = "2.3.0.0"
|
||||
|
||||
apply<JavaPlugin>()
|
||||
apply(plugin = "java")
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
systemProp.socks.proxyHost=127.0.0.1
|
||||
systemProp.socks.proxyPort=7890
|
||||
|
||||
systemProp.http.proxyHost=127.0.0.1
|
||||
systemProp.http.proxyPort=7890
|
||||
|
||||
systemProp.https.proxyHost=127.0.0.1
|
||||
systemProp.https.proxyPort=7890
|
||||
#systemProp.socks.proxyHost=127.0.0.1
|
||||
#systemProp.socks.proxyPort=7890
|
||||
#
|
||||
#systemProp.http.proxyHost=127.0.0.1
|
||||
#systemProp.http.proxyPort=7890
|
||||
#
|
||||
#systemProp.https.proxyHost=127.0.0.1
|
||||
#systemProp.https.proxyPort=7890
|
||||
@@ -271,18 +271,6 @@ public class AdventureManagerImpl implements AdventureManager {
|
||||
return GsonComponentSerializer.gson().serialize(component);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object shadedToOriginal(Component component) {
|
||||
Object cp;
|
||||
try {
|
||||
cp = ReflectionUtils.gsonDeserializeMethod.invoke(ReflectionUtils.gsonInstance, GsonComponentSerializer.gson().serialize(component));
|
||||
} catch (InvocationTargetException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
return cp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMiniMessageFormat(Component component) {
|
||||
return MiniMessage.miniMessage().serialize(component);
|
||||
@@ -291,10 +279,10 @@ public class AdventureManagerImpl implements AdventureManager {
|
||||
@Override
|
||||
public Object getIChatComponent(String json) {
|
||||
try {
|
||||
return ReflectionUtils.iChatComponentMethod.invoke(null, json);
|
||||
return ReflectionUtils.getiChatComponentMethod().invoke(null, json);
|
||||
} catch (InvocationTargetException | IllegalAccessException exception) {
|
||||
exception.printStackTrace();
|
||||
return ReflectionUtils.emptyComponent;
|
||||
return ReflectionUtils.getEmptyComponent();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -374,7 +362,7 @@ public class AdventureManagerImpl implements AdventureManager {
|
||||
return miniMessageToIChatComponentCache.get(text);
|
||||
} catch (ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
return ReflectionUtils.emptyComponent;
|
||||
return ReflectionUtils.getEmptyComponent();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ public class BossBar {
|
||||
packet.getModifier().write(0, uuid);
|
||||
try {
|
||||
Object chatComponent = AdventureManagerImpl.getInstance().getIChatComponentFromMiniMessage(latestMiniMessage);
|
||||
Object updatePacket = ReflectionUtils.updateConstructor.newInstance(chatComponent);
|
||||
Object updatePacket = ReflectionUtils.getUpdateConstructor().newInstance(chatComponent);
|
||||
packet.getModifier().write(1, updatePacket);
|
||||
} catch (InvocationTargetException | IllegalAccessException | InstantiationException e) {
|
||||
throw new RuntimeException(e);
|
||||
@@ -97,7 +97,7 @@ public class BossBar {
|
||||
private PacketContainer getRemovePacket() {
|
||||
PacketContainer packet = new PacketContainer(PacketType.Play.Server.BOSS);
|
||||
packet.getModifier().write(0, uuid);
|
||||
packet.getModifier().write(1, ReflectionUtils.removeBossBarPacket);
|
||||
packet.getModifier().write(1, ReflectionUtils.getRemoveBossBarPacket());
|
||||
return packet;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ package net.momirealms.customnameplates.paper.mechanic.bubble.listener;
|
||||
|
||||
import me.arasple.mc.trchat.api.event.TrChatEvent;
|
||||
import me.arasple.mc.trchat.module.display.channel.Channel;
|
||||
import net.momirealms.customnameplates.api.CustomNameplatesPlugin;
|
||||
import net.momirealms.customnameplates.paper.mechanic.bubble.BubbleManagerImpl;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
@@ -35,6 +36,8 @@ public class TrChatListener extends AbstractChatListener {
|
||||
for (String channel : chatBubblesManager.getBlacklistChannels()) {
|
||||
if (channelName.equals(channel)) return;
|
||||
}
|
||||
CustomNameplatesPlugin.get().getScheduler().runTaskAsync(() -> {
|
||||
chatBubblesManager.onChat(event.getSession().getPlayer(), event.getMessage());
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ package net.momirealms.customnameplates.paper.mechanic.bubble.listener;
|
||||
|
||||
import mineverse.Aust1n46.chat.api.MineverseChatPlayer;
|
||||
import mineverse.Aust1n46.chat.api.events.VentureChatEvent;
|
||||
import net.momirealms.customnameplates.api.CustomNameplatesPlugin;
|
||||
import net.momirealms.customnameplates.paper.mechanic.bubble.BubbleManagerImpl;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
@@ -38,6 +39,8 @@ public class VentureChatListener extends AbstractChatListener {
|
||||
if (chatPlayer == null) {
|
||||
return;
|
||||
}
|
||||
CustomNameplatesPlugin.get().getScheduler().runTaskAsync(() -> {
|
||||
chatBubblesManager.onChat(chatPlayer.getPlayer(), event.getChat());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@ public class NameplateManagerImpl implements NameplateManager, Listener {
|
||||
teamPrefix = config.getString("team.prefix", "");
|
||||
teamSuffix = config.getString("team.suffix", "");
|
||||
teamRefreshFrequency = config.getInt("team.refresh-frequency", 10);
|
||||
fixTab = config.getBoolean("team.fix-Tab", true);
|
||||
fixTab = config.getBoolean("team.fix-Tab", false);
|
||||
|
||||
ConfigurationSection unlimitedSection = config.getConfigurationSection("unlimited");
|
||||
if (unlimitedSection != null) {
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (C) <2022> <XiaoMoMi>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package net.momirealms.customnameplates.paper.mechanic.nameplate.tag.listener;
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.events.ListenerPriority;
|
||||
import com.comphenix.protocol.events.PacketAdapter;
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.events.PacketEvent;
|
||||
import com.comphenix.protocol.wrappers.EnumWrappers;
|
||||
import com.comphenix.protocol.wrappers.PlayerInfoData;
|
||||
import com.comphenix.protocol.wrappers.WrappedChatComponent;
|
||||
import com.comphenix.protocol.wrappers.WrappedGameProfile;
|
||||
import com.destroystokyo.paper.profile.PlayerProfile;
|
||||
import net.momirealms.customnameplates.api.CustomNameplatesPlugin;
|
||||
import net.momirealms.customnameplates.paper.mechanic.nameplate.NameplateManagerImpl;
|
||||
import net.momirealms.customnameplates.paper.mechanic.nameplate.tag.team.TeamTagManagerImpl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class PlayerInfoListener extends PacketAdapter {
|
||||
|
||||
private final TeamTagManagerImpl manager;
|
||||
|
||||
public PlayerInfoListener(TeamTagManagerImpl manager) {
|
||||
super(CustomNameplatesPlugin.getInstance(), ListenerPriority.HIGHEST, PacketType.Play.Server.PLAYER_INFO);
|
||||
this.manager = manager;
|
||||
}
|
||||
|
||||
public void onPacketSending(PacketEvent event) {
|
||||
PacketContainer packet = event.getPacket();
|
||||
Set<EnumWrappers.PlayerInfoAction> actions = packet.getPlayerInfoActions().read(0);
|
||||
if (!actions.contains(EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME))
|
||||
return;
|
||||
List<?> list = (List<?>) packet.getModifier().read(1);
|
||||
List<Object> newList = new ArrayList<>();
|
||||
int size = list.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
Object dataHandle = list.get(i);
|
||||
if (dataHandle == null) {
|
||||
continue;
|
||||
}
|
||||
PlayerInfoData data = PlayerInfoData.getConverter().getSpecific(dataHandle);
|
||||
WrappedGameProfile profile = data.getProfile();
|
||||
PlayerInfoData newData = new PlayerInfoData(
|
||||
profile,
|
||||
data.getLatency(),
|
||||
data.getGameMode(),
|
||||
WrappedChatComponent.fromJson(String.format("{\"text\":\"%s\"}", profile.getName()))
|
||||
);
|
||||
newList.add(PlayerInfoData.getConverter().getGeneric(newData));
|
||||
}
|
||||
packet.getModifier().write(1, newList);
|
||||
}
|
||||
}
|
||||
@@ -17,12 +17,14 @@
|
||||
|
||||
package net.momirealms.customnameplates.paper.mechanic.nameplate.tag.team;
|
||||
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import net.momirealms.customnameplates.api.CustomNameplatesPlugin;
|
||||
import net.momirealms.customnameplates.api.manager.NameplateManager;
|
||||
import net.momirealms.customnameplates.api.manager.TeamTagManager;
|
||||
import net.momirealms.customnameplates.api.scheduler.CancellableTask;
|
||||
import net.momirealms.customnameplates.api.util.LocationUtils;
|
||||
import net.momirealms.customnameplates.api.util.LogUtils;
|
||||
import net.momirealms.customnameplates.paper.mechanic.nameplate.tag.listener.PlayerInfoListener;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -38,10 +40,12 @@ public class TeamTagManagerImpl implements TeamTagManager {
|
||||
private final NameplateManager manager;
|
||||
private final ConcurrentHashMap<UUID, TeamPlayer> teamPlayerMap;
|
||||
private CancellableTask refreshTask;
|
||||
private PlayerInfoListener tabListener;
|
||||
|
||||
public TeamTagManagerImpl(NameplateManager manager) {
|
||||
this.manager = manager;
|
||||
this.teamPlayerMap = new ConcurrentHashMap<>();
|
||||
this.tabListener = new PlayerInfoListener(this);
|
||||
}
|
||||
|
||||
public void load(long refreshFrequency, boolean fixTab) {
|
||||
@@ -66,7 +70,7 @@ public class TeamTagManagerImpl implements TeamTagManager {
|
||||
TimeUnit.MILLISECONDS
|
||||
);
|
||||
if (fixTab) {
|
||||
// TODO
|
||||
ProtocolLibrary.getProtocolManager().addPacketListener(tabListener);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,6 +81,7 @@ public class TeamTagManagerImpl implements TeamTagManager {
|
||||
for (TeamPlayer entry : teamPlayerMap.values()) {
|
||||
entry.destroy();
|
||||
}
|
||||
ProtocolLibrary.getProtocolManager().removePacketListener(tabListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -17,25 +17,27 @@
|
||||
|
||||
package net.momirealms.customnameplates.paper.util;
|
||||
|
||||
import com.comphenix.protocol.utility.MinecraftFields;
|
||||
import com.comphenix.protocol.utility.MinecraftMethods;
|
||||
import com.comphenix.protocol.utility.MinecraftReflection;
|
||||
import com.comphenix.protocol.wrappers.WrappedGameProfile;
|
||||
import net.momirealms.customnameplates.api.util.LogUtils;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.UUID;
|
||||
|
||||
public class ReflectionUtils {
|
||||
|
||||
private ReflectionUtils() {}
|
||||
|
||||
public static Object removeBossBarPacket;
|
||||
public static Constructor<?> progressConstructor;
|
||||
public static Constructor<?> updateConstructor;
|
||||
public static Method iChatComponentMethod;
|
||||
public static Method gsonDeserializeMethod;
|
||||
public static Object gsonInstance;
|
||||
public static Object emptyComponent;
|
||||
private static Object removeBossBarPacket;
|
||||
private static Constructor<?> progressConstructor;
|
||||
private static Constructor<?> updateConstructor;
|
||||
private static Method iChatComponentMethod;
|
||||
private static Object emptyComponent;
|
||||
|
||||
public static void load() {
|
||||
try {
|
||||
@@ -57,4 +59,24 @@ public class ReflectionUtils {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static Object getRemoveBossBarPacket() {
|
||||
return removeBossBarPacket;
|
||||
}
|
||||
|
||||
public static Constructor<?> getProgressConstructor() {
|
||||
return progressConstructor;
|
||||
}
|
||||
|
||||
public static Constructor<?> getUpdateConstructor() {
|
||||
return updateConstructor;
|
||||
}
|
||||
|
||||
public static Method getiChatComponentMethod() {
|
||||
return iChatComponentMethod;
|
||||
}
|
||||
|
||||
public static Object getEmptyComponent() {
|
||||
return emptyComponent;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
# Player can only receive at most 1 actionbar at the same time
|
||||
actionbar:
|
||||
# The frequency of checking conditions for a bar, measured in ticks
|
||||
check-frequency: 10
|
||||
conditions:
|
||||
permission: "actionbar.show"
|
||||
@@ -12,3 +13,9 @@ actionbar:
|
||||
# The frequency of refreshing the text, the lower the value is, the faster the placeholders are updated
|
||||
# measured in ticks, -1 = disable refreshing
|
||||
refresh-frequency: 1
|
||||
# Optional
|
||||
# When enabling conditions, make sure that players would see at least one in the order,
|
||||
# otherwise it will fall into a dead cycle
|
||||
# If your player doesn't meet the conditions, it would be skipped
|
||||
# This condition would only be checked once until the next turn
|
||||
conditions: {}
|
||||
@@ -29,8 +29,9 @@ bossbar_1:
|
||||
# Optional
|
||||
# When enabling conditions, make sure that players would see at least one in the order,
|
||||
# otherwise it will fall into a dead cycle
|
||||
conditions:
|
||||
# If your player doesn't meet the conditions, it would be skipped
|
||||
# This condition would only be checked once until the next turn
|
||||
conditions:
|
||||
permission: nameplates.admin
|
||||
equals:
|
||||
value1: '%nameplates_is-latest%'
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# https://mo-mi.gitbook.io/xiaomomi-plugins/plugin-wiki/customnameplates/custom-placeholders/conditional-text
|
||||
conditional-text:
|
||||
actionbar:
|
||||
priority_0:
|
||||
@@ -40,11 +41,13 @@ conditional-text:
|
||||
weather:
|
||||
- rainstorm
|
||||
|
||||
# https://mo-mi.gitbook.io/xiaomomi-plugins/plugin-wiki/customnameplates/custom-placeholders/nameplate-text
|
||||
nameplate-text:
|
||||
halloween:
|
||||
nameplate: halloween
|
||||
text: '<gradient:#FFD700:#FFA500:#FFD700>Today is Halloween! Trick or treat!</gradient>'
|
||||
|
||||
# https://mo-mi.gitbook.io/xiaomomi-plugins/plugin-wiki/customnameplates/custom-placeholders/background-text
|
||||
background-text:
|
||||
location:
|
||||
background: bedrock_1
|
||||
@@ -71,6 +74,7 @@ background-text:
|
||||
text: '%nameplates_actionbar%'
|
||||
remove-shadow: true
|
||||
|
||||
# https://mo-mi.gitbook.io/xiaomomi-plugins/plugin-wiki/customnameplates/custom-placeholders/static-text
|
||||
static-text:
|
||||
money_hud:
|
||||
position: right
|
||||
@@ -81,6 +85,7 @@ static-text:
|
||||
text: "%nameplates_background_other_actionbar%"
|
||||
value: 180
|
||||
|
||||
# https://mo-mi.gitbook.io/xiaomomi-plugins/plugin-wiki/customnameplates/custom-placeholders/static-text
|
||||
descent-text:
|
||||
location:
|
||||
text: "Your Location: %player_x%, %player_y%, %player_z%"
|
||||
@@ -107,6 +112,7 @@ descent-text:
|
||||
descent: 5
|
||||
is-unicode: true
|
||||
|
||||
# https://mo-mi.gitbook.io/xiaomomi-plugins/plugin-wiki/customnameplates/custom-placeholders/switch-text
|
||||
switch-text:
|
||||
season:
|
||||
switch: '%customcrops_season%'
|
||||
@@ -117,6 +123,7 @@ switch-text:
|
||||
'Winter': '<blue>Winter</blue>'
|
||||
default: 'Invalid season'
|
||||
|
||||
# https://mo-mi.gitbook.io/xiaomomi-plugins/plugin-wiki/customnameplates/custom-placeholders/vanilla-hud
|
||||
vanilla-hud:
|
||||
stamina_hud:
|
||||
reverse: true
|
||||
|
||||
@@ -13,8 +13,6 @@ nameplate:
|
||||
prefix: ''
|
||||
player-name: '%player_name%'
|
||||
suffix: ''
|
||||
# Disable this if you are using a custom Tab plugin
|
||||
fix-Tab: true
|
||||
|
||||
# Settings for Team mode
|
||||
team:
|
||||
@@ -22,20 +20,26 @@ team:
|
||||
refresh-frequency: 10
|
||||
prefix: '%nameplates_prefix%'
|
||||
suffix: '%nameplates_suffix%'
|
||||
# Don't enable this if you are using a custom Tab plugin
|
||||
fix-Tab: false
|
||||
|
||||
# Settings for Unlimited mode
|
||||
unlimited:
|
||||
tag_1:
|
||||
# The texts to display
|
||||
text: '%nameplates_nametag%'
|
||||
# Verticle offset of the fake entity
|
||||
vertical-offset: -1
|
||||
# Conditions (Owner side)
|
||||
owner-conditions:
|
||||
potion-effect: "INVISIBILITY<0"
|
||||
# Conditions (Viewer side)
|
||||
viewer-conditions: { }
|
||||
tag_2:
|
||||
text: "IP: %player_ip% My IP: %viewer_player_ip%"
|
||||
text: "IP: %player_ip% My IP: %viewer_player_ip%" # If a placeholder starts with "%viewer_", it would display the viewer's.
|
||||
vertical-offset: -0.7
|
||||
refresh-frequency: 10
|
||||
check-frequency: 20
|
||||
refresh-frequency: 10 # Decides the frequency of the text refreshing
|
||||
check-frequency: 20 # Decides the frequency of the condition check
|
||||
owner-conditions:
|
||||
potion-effect: "INVISIBILITY<0"
|
||||
viewer-conditions:
|
||||
|
||||
@@ -8,7 +8,7 @@ depend: [ ProtocolLib ,PlaceholderAPI ]
|
||||
softdepend: [ MagicCosmetics, TAB, CMI, TrChat, ItemsAdder, Oraxen ]
|
||||
permissions:
|
||||
nameplates.*:
|
||||
description: Gives access to all user commands
|
||||
description: Gives access to all nameplate user commands
|
||||
children:
|
||||
nameplates.equip: true
|
||||
nameplates.unequip: true
|
||||
@@ -24,3 +24,16 @@ permissions:
|
||||
default: true
|
||||
customnameplates.admin:
|
||||
default: op
|
||||
|
||||
bubbles.*:
|
||||
description: Gives access to bubble all user commands
|
||||
children:
|
||||
bubbles.equip: true
|
||||
bubbles.unequip: true
|
||||
bubbles.list: true
|
||||
bubbles.equip:
|
||||
default: true
|
||||
bubbles.unequip:
|
||||
default: true
|
||||
bubbles.list:
|
||||
default: true
|
||||
@@ -4,3 +4,4 @@ include("bungeecord")
|
||||
include("velocity")
|
||||
include("paper")
|
||||
include("common")
|
||||
include("universe")
|
||||
|
||||
42
universe/.gitignore
vendored
Normal file
42
universe/.gitignore
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
.gradle
|
||||
build/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
out/
|
||||
!**/src/main/**/out/
|
||||
!**/src/test/**/out/
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
bin/
|
||||
!**/src/main/**/bin/
|
||||
!**/src/test/**/bin/
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
15
universe/build.gradle.kts
Normal file
15
universe/build.gradle.kts
Normal file
@@ -0,0 +1,15 @@
|
||||
dependencies {
|
||||
implementation(project(":api"))
|
||||
implementation(project(":common"))
|
||||
implementation(project(":paper"))
|
||||
implementation(project(":velocity"))
|
||||
implementation(project(":bungeecord"))
|
||||
}
|
||||
|
||||
tasks {
|
||||
shadowJar {
|
||||
relocate ("net.kyori", "net.momirealms.customnameplates.libraries")
|
||||
relocate ("org.bstats", "net.momirealms.customnameplates.libraries.bstats")
|
||||
relocate ("net.momirealms.biomeapi", "net.momirealms.customnameplates.libraries.biomeapi")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user