Compare commits

...
30 Commits
Author SHA1 Message Date
XiaoMoMi 26b593950d bump version 3.0.15.2 2024-12-10 16:24:46 +08:00
XiaoMoMi 63896acda6 use snapshot adventure 2024-12-10 16:24:06 +08:00
XiaoMoMi 6eb5dee611 Update custom-placeholders.yml 2024-12-10 16:23:48 +08:00
XiaoMoMi 69869d1cb1 update pack format 2024-12-10 16:02:48 +08:00
XiaoMoMi 2e702d8945 Fix thread safety issue 2024-12-09 03:29:06 +08:00
XiaoMoMi 56c77bd294 3.0.15.1 2024-12-04 15:35:12 +08:00
XiaoMoMi 4d195820a0 improve send delay 2024-11-29 17:40:54 +08:00
XiaoMoMi 2874ab7c4e send bossbar immediately 2024-11-29 17:34:40 +08:00
XiaoMoMi cd1a0bffb6 chatty 2024-11-28 18:49:59 +08:00
XiaoMoMi 20d3919c6b Fix regex 2024-11-22 00:57:24 +08:00
XiaoMoMi fccaa059ff Added generate option for bitmaps 2024-11-21 02:14:49 +08:00
XiaoMoMi ed2fb60748 Update settings.gradle.kts 2024-11-19 18:38:26 +08:00
XiaoMoMi 378dc2e3bc Update gradle.properties 2024-11-19 18:37:38 +08:00
XiaoMoMi 6144423110 Update gradle.properties 2024-11-19 18:33:13 +08:00
XiaoMoMi d21fa8a3f7 work 2024-11-19 18:33:04 +08:00
XiaoMoMi 7e68a6cda7 move packages 2024-11-19 16:52:02 +08:00
XiaoMoMi 3df6d66efb better support 2024-11-19 16:46:01 +08:00
XiaoMoMi 001ecd28ed remove debug 2024-11-18 15:14:05 +08:00
XiaoMoMi 6fe8625722 Update TagRendererImpl.java 2024-11-18 03:06:23 +08:00
XiaoMoMi 43e006f49d 3.0.12 2024-11-18 03:03:45 +08:00
XiaoMoMi 8d63ad9c74 fix bugs 2024-11-18 02:51:49 +08:00
XiaoMoMi 5c2411e420 We need more work 2024-11-18 01:53:08 +08:00
XiaoMoMi a57cfb0842 more work 2024-11-18 01:30:54 +08:00
XiaoMoMi e4d7fb4346 work 2024-11-18 01:22:23 +08:00
XiaoMoMi 9a9865c424 improved default configs 2024-11-14 16:26:11 +08:00
XiaoMoMi f6b8ce253f Fixed advance not instantly updated 2024-11-11 22:11:38 +08:00
XiaoMoMi 144b358768 3.0.10.1 2024-11-11 15:37:37 +08:00
XiaoMoMi 0fd7ac1a79 Update OraxenEmojiProvider.java 2024-11-10 20:32:56 +08:00
XiaoMoMi 67f0e60327 Update README.md 2024-11-10 19:54:00 +08:00
XiaoMoMi d10eb6de67 code clean up 2024-11-10 19:39:00 +08:00
178 changed files with 1284 additions and 350 deletions

No files matched your search

+3
View File
@@ -5,6 +5,9 @@ target/
!**/src/main/**/build/
!**/src/test/**/build/
### Unfinished ###
platforms/sponge/
### IntelliJ IDEA ###
.idea
*.iws
+11 -4
View File
@@ -11,7 +11,7 @@
![bStats Players](https://img.shields.io/bstats/players/16649)
![GitHub](https://img.shields.io/github/license/Xiao-MoMi/Custom-Nameplates)
## How to build
## How to Build
#### Command Line
Install JDK 17 & 21. \
@@ -22,10 +22,17 @@ Execute ".\gradlew build" and get the artifact under /target folder
Import the project and execute gradle build action. \
Get the artifact under /target folder
## Support the developer
## How to Contribute
Polymart: https://polymart.org/resource/customnameplates.2543 \
Afdian: https://afdian.com/@xiaomomi
#### Translations
Clone this project and create a new language file in the /common/src/main/resources/translations directory. \
Once your changes are ready, open a pull request for review. We appreciate your works!
## Support the Developer
Polymart: https://polymart.org/resource/customnameplates.2543/ \
BuiltByBit: https://builtbybit.com/resources/customnameplates.36359/ \
Afdian: https://afdian.com/@xiaomomi/
## CustomNameplates API
+1 -1
View File
@@ -6,7 +6,7 @@ plugins {
repositories {
maven("https://jitpack.io/")
maven("https://papermc.io/repo/repository/maven-public/")
maven("https://oss.sonatype.org/content/repositories/snapshots")
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
}
dependencies {
@@ -18,9 +18,6 @@
package net.momirealms.customnameplates.api;
import io.netty.channel.Channel;
import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenCustomHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.momirealms.customnameplates.api.feature.Feature;
@@ -34,10 +31,13 @@ import net.momirealms.customnameplates.api.placeholder.SharedPlaceholder;
import net.momirealms.customnameplates.api.requirement.Requirement;
import net.momirealms.customnameplates.api.storage.data.PlayerData;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public abstract class AbstractCNPlayer implements CNPlayer {
@@ -46,27 +46,27 @@ public abstract class AbstractCNPlayer implements CNPlayer {
protected Object player;
private boolean isLoaded = false;
private boolean tempPreviewing = false;
private boolean toggleablePreviewing = false;
private volatile boolean isLoaded = false;
private volatile boolean tempPreviewing = false;
private volatile boolean toggleablePreviewing = false;
private String equippedNameplate;
private String equippedBubble;
private final TeamView teamView = new TeamView();
private final Int2ObjectOpenHashMap<TimeStampData<String>> cachedValues = new Int2ObjectOpenHashMap<>(64);
private final Int2ObjectOpenHashMap<WeakHashMap<CNPlayer, TimeStampData<String>>> cachedRelationalValues = new Int2ObjectOpenHashMap<>(64);
private final Int2ObjectOpenHashMap<TimeStampData<Boolean>> cachedRequirements = new Int2ObjectOpenHashMap<>(128);
private final Int2ObjectOpenHashMap<WeakHashMap<CNPlayer, TimeStampData<Boolean>>> cachedRelationalRequirements = new Int2ObjectOpenHashMap<>(128);
// these maps might be visited by other threads through PlaceholderAPI
private final Map<Integer, TimeStampData<String>> cachedValues = new ConcurrentHashMap<>(128);
private final Map<Integer, WeakHashMap<CNPlayer, TimeStampData<String>>> cachedRelationalValues = new ConcurrentHashMap<>(128);
private final Map<Integer, TimeStampData<Boolean>> cachedRequirements = new ConcurrentHashMap<>(32);
private final Map<Integer, WeakHashMap<CNPlayer, TimeStampData<Boolean>>> cachedRelationalRequirements = new ConcurrentHashMap<>(32);
private final Set<Feature> activeFeatures = new CopyOnWriteArraySet<>();
private final Map<Placeholder, Set<Feature>> placeholder2Features = new ConcurrentHashMap<>();
private final Map<Feature, Set<Placeholder>> feature2Placeholders = new ConcurrentHashMap<>();
private final Map<CNPlayer, Tracker> trackers = Collections.synchronizedMap(new WeakHashMap<>());
private final Map<CNPlayer, Tracker> trackers = new WeakHashMap<>();
private final ReadWriteLock trackerLock = new ReentrantReadWriteLock();
protected AbstractCNPlayer(CustomNameplates plugin, Channel channel) {
this.plugin = plugin;
@@ -83,6 +83,68 @@ public abstract class AbstractCNPlayer implements CNPlayer {
return placeholderWithChildren.stream().distinct().toList();
}
private String updatePlayerPlaceholder(PlayerPlaceholder placeholder) {
TimeStampData<String> value = getRawPlayerValue(placeholder);
if (value == null) {
value = new TimeStampData<>(placeholder.request(this), MainTask.getTicks(), true);
setPlayerValue(placeholder, value);
return value.data();
}
if (value.ticks() != MainTask.getTicks()) {
String newValue = placeholder.request(this);
value.updateTicks(!value.data().equals(newValue));
value.data(newValue);
}
return value.data();
}
private void updateRelationalPlaceholder(RelationalPlaceholder placeholder, Collection<CNPlayer> others) {
for (CNPlayer another : others) {
updateRelationalPlaceholder(placeholder, another);
}
}
private String updateRelationalPlaceholder(RelationalPlaceholder placeholder, CNPlayer another) {
TimeStampData<String> value = getRawRelationalValue(placeholder, another);
if (value == null) {
value = new TimeStampData<>(placeholder.request(this, another), MainTask.getTicks(), true);
setRelationalValue(placeholder, another, value);
return value.data();
}
if (value.ticks() != MainTask.getTicks()) {
String newValue = placeholder.request(this, another);
value.updateTicks(!value.data().equals(newValue));
value.data(newValue);
}
return value.data();
}
private String updateSharedPlaceholder(SharedPlaceholder placeholder) {
TimeStampData<String> value = getRawSharedValue(placeholder);
if (value == null) {
String latest;
if (MainTask.hasRequested(placeholder.countId())) {
latest = placeholder.getLatestValue();
} else {
latest = placeholder.request();
}
value = new TimeStampData<>(latest, MainTask.getTicks(), true);
setSharedValue(placeholder, value);
return value.data();
}
if (value.ticks() != MainTask.getTicks()) {
String latest;
if (MainTask.hasRequested(placeholder.countId())) {
latest = placeholder.getLatestValue();
} else {
latest = placeholder.request();
}
value.updateTicks(!value.data().equals(latest));
value.data(latest);
}
return value.data();
}
@Override
public void forceUpdatePlaceholders(Set<Placeholder> placeholders, Collection<CNPlayer> others) {
if (placeholders.isEmpty()) return;
@@ -93,54 +155,11 @@ public abstract class AbstractCNPlayer implements CNPlayer {
placeholderWithChildren = placeholderWithChildren.stream().distinct().toList();
for (Placeholder placeholder : placeholderWithChildren) {
if (placeholder instanceof PlayerPlaceholder playerPlaceholder) {
TimeStampData<String> value = getValue(placeholder);
if (value == null) {
value = new TimeStampData<>(playerPlaceholder.request(this), MainTask.getTicks(), true);
setValue(placeholder, value);
continue;
}
if (value.ticks() != MainTask.getTicks()) {
String newValue = playerPlaceholder.request(this);
value.updateTicks(!value.data().equals(newValue));
value.data(newValue);
}
} else if (placeholder instanceof RelationalPlaceholder relational) {
for (CNPlayer player : others) {
TimeStampData<String> value = getRelationalValue(placeholder, player);
if (value == null) {
value = new TimeStampData<>(relational.request(this, player), MainTask.getTicks(), true);
setRelationalValue(placeholder, player, value);
continue;
}
if (value.ticks() != MainTask.getTicks()) {
String newValue = relational.request(this, player);
value.updateTicks(!value.data().equals(newValue));
value.data(newValue);
}
}
updatePlayerPlaceholder(playerPlaceholder);
} else if (placeholder instanceof RelationalPlaceholder relationalPlaceholder) {
updateRelationalPlaceholder(relationalPlaceholder, others);
} else if (placeholder instanceof SharedPlaceholder sharedPlaceholder) {
TimeStampData<String> value = getValue(placeholder);
if (value == null) {
String latest;
if (MainTask.hasRequested(sharedPlaceholder.countId())) {
latest = sharedPlaceholder.getLatestValue();
} else {
latest = sharedPlaceholder.request();
}
value = new TimeStampData<>(latest, MainTask.getTicks(), true);
setValue(placeholder, value);
continue;
}
if (value.ticks() != MainTask.getTicks()) {
String latest;
if (MainTask.hasRequested(sharedPlaceholder.countId())) {
latest = sharedPlaceholder.getLatestValue();
} else {
latest = sharedPlaceholder.request();
}
value.updateTicks(!value.data().equals(latest));
value.data(latest);
}
updateSharedPlaceholder(sharedPlaceholder);
}
}
}
@@ -248,84 +267,98 @@ public abstract class AbstractCNPlayer implements CNPlayer {
}
@Override
public void setValue(Placeholder placeholder, TimeStampData<String> value) {
public void setPlayerValue(PlayerPlaceholder placeholder, TimeStampData<String> value) {
cachedValues.put(placeholder.countId(), value);
}
@Override
public boolean setValue(Placeholder placeholder, String value) {
TimeStampData<String> previous = cachedValues.get(placeholder.countId());
int currentTicks = MainTask.getTicks();
boolean changed = false;
if (previous != null) {
if (previous.ticks() == currentTicks) {
return false;
}
String data = previous.data();
if (!data.equals(value)) {
changed = true;
previous.data(value);
previous.updateTicks(true);
}
} else {
changed= true;
previous = new TimeStampData<>(value, currentTicks, true);
cachedValues.put(placeholder.countId(), previous);
}
return changed;
public void setSharedValue(SharedPlaceholder placeholder, TimeStampData<String> value) {
cachedValues.put(placeholder.countId(), value);
}
@Override
public void setRelationalValue(Placeholder placeholder, CNPlayer another, TimeStampData<String> value) {
public void setRelationalValue(RelationalPlaceholder placeholder, CNPlayer another, TimeStampData<String> value) {
WeakHashMap<CNPlayer, TimeStampData<String>> map = cachedRelationalValues.computeIfAbsent(placeholder.countId(), k -> new WeakHashMap<>());
map.put(another, value);
}
// @Override
// public boolean setPlayerValue(PlayerPlaceholder placeholder, String value) {
// TimeStampData<String> previous = cachedValues.get(placeholder.countId());
// int currentTicks = MainTask.getTicks();
// boolean changed = false;
// if (previous != null) {
// if (previous.ticks() == currentTicks) {
// return false;
// }
// String data = previous.data();
// if (!data.equals(value)) {
// changed = true;
// previous.data(value);
// previous.updateTicks(true);
// }
// } else {
// changed= true;
// previous = new TimeStampData<>(value, currentTicks, true);
// cachedValues.put(placeholder.countId(), previous);
// }
// return changed;
// }
// @Override
// public boolean setRelationalValue(RelationalPlaceholder placeholder, CNPlayer another, String value) {
// WeakHashMap<CNPlayer, TimeStampData<String>> map = cachedRelationalValues.computeIfAbsent(placeholder.countId(), k -> new WeakHashMap<>());
// TimeStampData<String> previous = map.get(another);
// int currentTicks = MainTask.getTicks();
// boolean changed = false;
// if (previous != null) {
// if (previous.ticks() == currentTicks) {
// return false;
// }
// String data = previous.data();
// if (!data.equals(value)) {
// changed = true;
// previous.data(value);
// previous.updateTicks(true);
// }
// } else {
// changed= true;
// previous = new TimeStampData<>(value, currentTicks, true);
// map.put(another, previous);
// }
// return changed;
// }
@Override
public boolean setRelationalValue(Placeholder placeholder, CNPlayer another, String value) {
WeakHashMap<CNPlayer, TimeStampData<String>> map = cachedRelationalValues.computeIfAbsent(placeholder.countId(), k -> new WeakHashMap<>());
TimeStampData<String> previous = map.get(another);
int currentTicks = MainTask.getTicks();
boolean changed = false;
if (previous != null) {
if (previous.ticks() == currentTicks) {
return false;
}
String data = previous.data();
if (!data.equals(value)) {
changed = true;
previous.data(value);
previous.updateTicks(true);
}
} else {
changed= true;
previous = new TimeStampData<>(value, currentTicks, true);
map.put(another, previous);
}
return changed;
public @NotNull String getCachedSharedValue(SharedPlaceholder placeholder) {
return updateSharedPlaceholder(placeholder);
}
@Override
public @NotNull String getData(Placeholder placeholder) {
return Optional.ofNullable(cachedValues.get(placeholder.countId())).map(TimeStampData::data).orElse(placeholder.id());
public @NotNull String getCachedPlayerValue(PlayerPlaceholder placeholder) {
return updatePlayerPlaceholder(placeholder);
}
@Override
public TimeStampData<String> getValue(Placeholder placeholder) {
public @NotNull String getCachedRelationalValue(RelationalPlaceholder placeholder, CNPlayer another) {
return updateRelationalPlaceholder(placeholder, another);
}
@Nullable
@Override
public TimeStampData<String> getRawPlayerValue(PlayerPlaceholder placeholder) {
return cachedValues.get(placeholder.countId());
}
@Nullable
@Override
public @NotNull String getRelationalData(Placeholder placeholder, CNPlayer another) {
WeakHashMap<CNPlayer, TimeStampData<String>> map = cachedRelationalValues.get(placeholder.countId());
if (map == null) {
return placeholder.id();
}
return Optional.ofNullable(map.get(another)).map(TimeStampData::data).orElse(placeholder.id());
public TimeStampData<String> getRawSharedValue(SharedPlaceholder placeholder) {
return cachedValues.get(placeholder.countId());
}
@Nullable
@Override
public TimeStampData<String> getRelationalValue(Placeholder placeholder, CNPlayer another) {
public TimeStampData<String> getRawRelationalValue(RelationalPlaceholder placeholder, CNPlayer another) {
WeakHashMap<CNPlayer, TimeStampData<String>> map = cachedRelationalValues.get(placeholder.countId());
if (map == null) {
return null;
@@ -405,58 +438,90 @@ public abstract class AbstractCNPlayer implements CNPlayer {
@Override
public Tracker addPlayerToTracker(CNPlayer another) {
Tracker tracker = trackers.get(another);
if (tracker != null) {
return tracker;
}
tracker = new Tracker(another);
trackers.put(another, tracker);
for (Placeholder placeholder : activePlaceholders()) {
if (placeholder instanceof RelationalPlaceholder relationalPlaceholder) {
String value = relationalPlaceholder.request(this, another);
setRelationalValue(placeholder, another, value);
trackerLock.writeLock().lock();
try {
Tracker tracker = trackers.get(another);
if (tracker != null) {
return tracker;
}
tracker = new Tracker(another);
trackers.put(another, tracker);
return tracker;
} finally {
trackerLock.writeLock().unlock();
}
return tracker;
}
@Override
public void removePlayerFromTracker(CNPlayer another) {
trackers.remove(another);
trackerLock.writeLock().lock();
try {
trackers.remove(another);
} finally {
trackerLock.writeLock().unlock();
}
}
@Override
public Collection<CNPlayer> nearbyPlayers() {
return new ObjectArrayList<>(trackers.keySet());
trackerLock.readLock().lock();
try {
// Create a snapshot of keys to avoid concurrent modification
return new ObjectArrayList<>(trackers.keySet());
} finally {
trackerLock.readLock().unlock();
}
}
@Override
public void trackPassengers(CNPlayer another, int... passengers) {
Tracker tracker = trackers.get(another);
if (tracker != null) {
for (int passenger : passengers) {
tracker.addPassengerID(passenger);
}
}
trackerLock.writeLock().lock();
try {
Tracker tracker = trackers.get(another);
if (tracker != null) {
for (int passenger : passengers) {
tracker.addPassengerID(passenger);
}
}
} finally {
trackerLock.writeLock().unlock();
}
}
@Override
public void untrackPassengers(CNPlayer another, int... passengers) {
Optional.ofNullable(trackers.get(another)).ifPresent(tracker -> {
for (int passenger : passengers) {
tracker.removePassengerID(passenger);
trackerLock.writeLock().lock();
try {
Tracker tracker = trackers.get(another);
if (tracker != null) {
for (int passenger : passengers) {
tracker.removePassengerID(passenger);
}
}
});
} finally {
trackerLock.writeLock().unlock();
}
}
@Override
public Set<Integer> getTrackedPassengerIds(CNPlayer another) {
return Optional.ofNullable(trackers.get(another)).map(Tracker::getPassengerIDs).orElse(new ObjectOpenHashSet<>());
trackerLock.readLock().lock();
try {
Tracker tracker = trackers.get(another);
return tracker != null ? tracker.getPassengerIDs() : new ObjectOpenHashSet<>();
} finally {
trackerLock.readLock().unlock();
}
}
@Override
public Tracker getTracker(CNPlayer another) {
return trackers.get(another);
trackerLock.readLock().lock();
try {
return trackers.get(another);
} finally {
trackerLock.readLock().unlock();
}
}
@Override
@@ -23,6 +23,9 @@ import net.momirealms.customnameplates.api.feature.TimeStampData;
import net.momirealms.customnameplates.api.feature.tag.TeamView;
import net.momirealms.customnameplates.api.network.Tracker;
import net.momirealms.customnameplates.api.placeholder.Placeholder;
import net.momirealms.customnameplates.api.placeholder.PlayerPlaceholder;
import net.momirealms.customnameplates.api.placeholder.RelationalPlaceholder;
import net.momirealms.customnameplates.api.placeholder.SharedPlaceholder;
import net.momirealms.customnameplates.api.requirement.Requirement;
import net.momirealms.customnameplates.api.util.Vector3;
import org.jetbrains.annotations.NotNull;
@@ -200,16 +203,16 @@ public interface CNPlayer {
* @return the cached data as a string
*/
@NotNull
String getData(Placeholder placeholder);
String getCachedSharedValue(SharedPlaceholder placeholder);
/**
* Retrieves the cached {@link TimeStampData} for a given placeholder.
* Retrieves the cached data for a given placeholder.
*
* @param placeholder the placeholder to retrieve data for
* @return the cached TickStampData, or null if none exists
* @return the cached data as a string
*/
@Nullable
TimeStampData<String> getValue(Placeholder placeholder);
@NotNull
String getCachedPlayerValue(PlayerPlaceholder placeholder);
/**
* Retrieves the cached relational data between this player and another for a given placeholder.
@@ -219,7 +222,25 @@ public interface CNPlayer {
* @return the relational data as a string
*/
@NotNull
String getRelationalData(Placeholder placeholder, CNPlayer another);
String getCachedRelationalValue(RelationalPlaceholder placeholder, CNPlayer another);
/**
* Retrieves the cached {@link TimeStampData} for a given placeholder.
*
* @param placeholder the placeholder to retrieve data for
* @return the cached TickStampData, or null if none exists
*/
@Nullable
TimeStampData<String> getRawPlayerValue(PlayerPlaceholder placeholder);
/**
* Retrieves the cached {@link TimeStampData} for a given placeholder.
*
* @param placeholder the placeholder to retrieve data for
* @return the cached TickStampData, or null if none exists
*/
@Nullable
TimeStampData<String> getRawSharedValue(SharedPlaceholder placeholder);
/**
* Retrieves the cached relational {@link TimeStampData} for a given placeholder.
@@ -229,7 +250,7 @@ public interface CNPlayer {
* @return the cached relational TickStampData, or null if none exists
*/
@Nullable
TimeStampData<String> getRelationalValue(Placeholder placeholder, CNPlayer another);
TimeStampData<String> getRawRelationalValue(RelationalPlaceholder placeholder, CNPlayer another);
/**
* Caches the specified {@link TimeStampData} for the given placeholder.
@@ -237,16 +258,15 @@ public interface CNPlayer {
* @param placeholder the placeholder to cache
* @param value the value to cache
*/
void setValue(Placeholder placeholder, TimeStampData<String> value);
void setPlayerValue(PlayerPlaceholder placeholder, TimeStampData<String> value);
/**
* Caches the specified value for the given placeholder.
* Caches the specified {@link TimeStampData} for the given placeholder.
*
* @param placeholder the placeholder to cache
* @param value the value to cache
* @return true if the value was changed, false otherwise
*/
boolean setValue(Placeholder placeholder, String value);
void setSharedValue(SharedPlaceholder placeholder, TimeStampData<String> value);
/**
* Caches the specified relational {@link TimeStampData} for a given placeholder and player.
@@ -255,17 +275,26 @@ public interface CNPlayer {
* @param another the other player
* @param value the value to cache
*/
void setRelationalValue(Placeholder placeholder, CNPlayer another, TimeStampData<String> value);
void setRelationalValue(RelationalPlaceholder placeholder, CNPlayer another, TimeStampData<String> value);
/**
* Caches the specified relational value for a given placeholder and player.
*
* @param placeholder the relational placeholder
* @param another the other player
* @param value the value to cache
* @return true if the value was changed, false otherwise
*/
boolean setRelationalValue(Placeholder placeholder, CNPlayer another, String value);
// /**
// * Caches the specified value for the given placeholder.
// *
// * @param placeholder the placeholder to cache
// * @param value the value to cache
// * @return true if the value was changed, false otherwise
// */
// boolean setPlayerValue(PlayerPlaceholder placeholder, String value);
// /**
// * Caches the specified relational value for a given placeholder and player.
// *
// * @param placeholder the relational placeholder
// * @param another the other player
// * @param value the value to cache
// * @return true if the value was changed, false otherwise
// */
// boolean setRelationalValue(RelationalPlaceholder placeholder, CNPlayer another, String value);
/**
* Adds a feature to the player
@@ -402,4 +431,11 @@ public interface CNPlayer {
* @return team view
*/
TeamView teamView();
/**
* Check if the player is initialized
*
* @return initialized or not
*/
boolean isInitialized();
}
@@ -102,6 +102,7 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable {
protected boolean packItemsAdder;
protected boolean packItemsAdderLegacy;
protected boolean packOraxen;
protected boolean packNexo;
protected boolean packCreativeCentral;
protected boolean chatUnsafe;
@@ -111,6 +112,8 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable {
protected boolean chatCarbon;
protected boolean chatAdvanced;
protected boolean chatEss;
protected boolean chatChatControlRed;
protected boolean chatChatty;
protected String configVersion;
@@ -181,6 +184,7 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable {
if (packItemsAdder) packItemsAdderLegacy = false;
packOraxen = config.getBoolean("integrations.resource-pack.Oraxen", false);
packCreativeCentral = config.getBoolean("integrations.resource-pack.Creative-Central");
packNexo = config.getBoolean("integrations.resource-pack.Nexo");
chatUnsafe = config.getBoolean("other-settings.unsafe-chat-event", false);
chatEss = config.getBoolean("integrations.chat.Essentials", false);
@@ -189,6 +193,8 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable {
chatAdvanced = config.getBoolean("integrations.chat.AdvancedChat", false);
chatTR = config.getBoolean("integrations.chat.TrChat", false);
chatVenture = config.getBoolean("integrations.chat.VentureChat", false);
chatChatControlRed = config.getBoolean("integrations.chat.ChatControlRed", false);
chatChatty = config.getBoolean("integrations.chat.Chatty", false);
// Packs
generateOnStart = !config.getBoolean("resource-pack.disable-generation-on-start", false);
@@ -217,7 +223,7 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable {
// Other settings
delaySend = config.getInt("other-settings.send-delay", 0);
defaultPlaceholderRefreshInterval = config.getInt("other-settings.default-placeholder-refresh-interval", 1);
defaultConditionRefreshInterval = config.getInt("other-settings.ddefault-condition-refresh-interval", 1);
defaultConditionRefreshInterval = config.getInt("other-settings.default-condition-refresh-interval", 20);
catchOtherActionBar = config.getBoolean("other-settings.catch-other-plugin-actionbar", true);
otherActionBarStayTime = config.getInt("other-settings.other-actionbar-stay-time", 3000);
displaySystemChat = config.getBoolean("other-settings.display-system-actionbar", true);
@@ -305,6 +311,10 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable {
return instance.packOraxen;
}
public static boolean packNexo() {
return instance.packNexo;
}
public static boolean packCreativeCentral() { return instance.packCreativeCentral; }
public static boolean hideScoreBoardNumber() {
@@ -411,6 +421,14 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable {
return instance.chatAdvanced;
}
public static boolean chatChatControlRed() {
return instance.chatChatControlRed;
}
public static boolean chatChatty() {
return instance.chatChatty;
}
@Override
public YamlDocument loadConfig(String filePath) {
return loadConfig(filePath, '.');
@@ -29,6 +29,7 @@ import net.momirealms.customnameplates.api.feature.image.ImageManager;
import net.momirealms.customnameplates.api.feature.nameplate.NameplateManager;
import net.momirealms.customnameplates.api.feature.pack.ResourcePackManager;
import net.momirealms.customnameplates.api.feature.tag.UnlimitedTagManager;
import net.momirealms.customnameplates.api.helper.VersionHelper;
import net.momirealms.customnameplates.api.network.PacketSender;
import net.momirealms.customnameplates.api.network.PipelineInjector;
import net.momirealms.customnameplates.api.placeholder.PlaceholderManager;
@@ -40,7 +41,8 @@ import net.momirealms.customnameplates.common.locale.TranslationManager;
import net.momirealms.customnameplates.common.plugin.NameplatesPlugin;
import net.momirealms.customnameplates.common.plugin.scheduler.SchedulerTask;
import java.util.*;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Supplier;
@@ -80,6 +82,13 @@ public abstract class CustomNameplates implements NameplatesPlugin {
protected ResourcePackManager resourcePackManager;
protected CustomNameplatesAPI api;
private String buildByBit = "%%__BUILTBYBIT__%%";
private String polymart = "%%__POLYMART__%%";
private String time = "%%__TIMESTAMP__%%";
private String user = "%%__USER__%%";
private String username = "%%__USERNAME__%%";
private boolean isLatest = false;
protected CustomNameplates() {
instance = this;
}
@@ -96,6 +105,36 @@ public abstract class CustomNameplates implements NameplatesPlugin {
@Override
public abstract void disable();
@Override
public void enable() {
boolean downloadFromPolymart = polymart.equals("1");
boolean downloadFromBBB = buildByBit.equals("true");
if (ConfigManager.checkUpdate()) {
VersionHelper.UPDATE_CHECKER.apply(this).thenAccept(result -> {
String link;
if (downloadFromPolymart) {
link = "https://polymart.org/resource/2543/";
} else if (downloadFromBBB) {
link = "https://builtbybit.com/resources/36359/";
} else {
link = "https://github.com/Xiao-MoMi/Custom-Nameplates/";
}
if (!result) {
this.getPluginLogger().info("You are using the latest version.");
isLatest = true;
} else {
this.getPluginLogger().warn("Update is available: " + link);
isLatest = false;
}
});
}
}
@Override
public boolean isUpToDate() {
return isLatest;
}
/**
* Logs debug messages through the provided supplier.
*
@@ -20,7 +20,6 @@ package net.momirealms.customnameplates.api;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -35,6 +34,7 @@ public class MainTask implements Runnable {
private int timer;
private final CustomNameplates plugin;
private boolean state;
public MainTask(CustomNameplates plugin) {
this.plugin = plugin;
@@ -54,24 +54,31 @@ public class MainTask implements Runnable {
@Override
public void run() {
RUN_TICKS++;
requestedSharedPlaceholders.clear();
long time1 = System.nanoTime();
plugin.actionBarManager.refreshConditions();
plugin.bossBarManager.onTick();
plugin.unlimitedTagManager.onTick();
long time2 = System.nanoTime();
plugin.placeholderManager.refreshPlaceholders();
long time3 = System.nanoTime();
plugin.actionBarManager.checkHeartBeats();
int diff1 = (int) (time2 - time1);
TIME_1.put(timer, diff1);
int diff2 = (int) (time3 - time2);
TIME_2.put(timer, diff2);
timer++;
if (timer >= 1200) timer = 0;
if (RUN_TICKS < 0) {
CustomNameplates.getInstance().reload();
// we should skip the task if the server is heavily loaded
if (this.state) return;
this.state = true;
try {
RUN_TICKS++;
requestedSharedPlaceholders.clear();
long time1 = System.nanoTime();
plugin.actionBarManager.refreshConditions();
plugin.bossBarManager.onTick();
plugin.unlimitedTagManager.onTick();
long time2 = System.nanoTime();
plugin.placeholderManager.refreshPlaceholders();
long time3 = System.nanoTime();
plugin.actionBarManager.checkHeartBeats();
int diff1 = (int) (time2 - time1);
TIME_1.put(timer, diff1);
int diff2 = (int) (time3 - time2);
TIME_2.put(timer, diff2);
timer++;
if (timer >= 1200) timer = 0;
if (RUN_TICKS < 0) {
CustomNameplates.getInstance().reload();
}
} finally {
this.state = false;
}
}
@@ -23,7 +23,10 @@ import net.momirealms.customnameplates.api.CNPlayer;
import net.momirealms.customnameplates.api.CustomNameplates;
import net.momirealms.customnameplates.api.placeholder.*;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
public class PreParsedDynamicText {
@@ -52,18 +55,24 @@ public class PreParsedDynamicText {
for (String id : detectedPlaceholders) {
Placeholder placeholder = manager.getPlaceholder(id);
placeholders.add(placeholder);
if (placeholder instanceof RelationalPlaceholder) {
convertor.add((owner) -> (viewer) -> owner.getRelationalData(placeholder, viewer));
if (placeholder instanceof RelationalPlaceholder relationalPlaceholder) {
convertor.add((owner) -> (viewer) -> owner.getCachedRelationalValue(relationalPlaceholder, viewer));
} else if (placeholder instanceof PlayerPlaceholder playerPlaceholder) {
convertor.add((owner) -> (viewer) -> {
if (owner != null) {
return owner.getData(placeholder);
return owner.getCachedPlayerValue(playerPlaceholder);
} else {
return playerPlaceholder.request(null);
}
});
} else if (placeholder instanceof SharedPlaceholder sharedPlaceholder) {
convertor.add((owner) -> (viewer) -> sharedPlaceholder.getLatestValue());
convertor.add((owner) -> (viewer) -> {
if (owner != null) {
return owner.getCachedSharedValue(sharedPlaceholder);
} else {
return sharedPlaceholder.request();
}
});
} else {
convertor.add((owner) -> (viewer) -> id);
}
@@ -20,7 +20,6 @@ package net.momirealms.customnameplates.api.feature.advance;
import com.google.gson.JsonObject;
import it.unimi.dsi.fastutil.ints.Int2FloatOpenHashMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@@ -76,6 +76,7 @@ public abstract class AbstractTag implements Tag {
@Override
public void show(CNPlayer viewer) {
if (!renderer.isValid()) return;
if (!isShown()) throw new IllegalStateException("This tag is currently hidden");
viewers.add(viewer);
resetViewerArray();
@@ -35,6 +35,13 @@ public interface TagRenderer {
*/
void hatOffset(double hatOffset);
/**
* Checks if the tag is valid
*
* @return valid or not
*/
boolean isValid();
/**
* Called every tick to update the state of the tags managed by this renderer.
*/
@@ -21,7 +21,9 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
public class TeamView {
@@ -61,12 +61,18 @@ public class VersionHelper {
private static float version;
private static boolean mojmap;
private static boolean folia;
private static boolean mohist;
private static boolean paper;
public static void init(String serverVersion) {
String[] split = serverVersion.split("\\.");
version = Float.parseFloat(split[1] + "." + (split.length == 3 ? split[2] : "0"));
checkMojMap();
checkFolia();
checkMohist();
checkPaper();
boolean isModdedServer = mohist;
paper = paper && !isModdedServer;
}
public static float version() {
@@ -90,6 +96,22 @@ public class VersionHelper {
}
}
private static void checkMohist() {
try {
Class.forName("com.mohistmc.api.ServerAPI");
mohist = true;
} catch (ClassNotFoundException ignored) {
}
}
private static void checkPaper() {
try {
Class.forName("com.destroystokyo.paper.Metrics");
paper = true;
} catch (ClassNotFoundException ignored) {
}
}
public static boolean isVersionNewerThan1_21_2() {
return version >= 21.19;
}
@@ -118,6 +140,14 @@ public class VersionHelper {
return folia;
}
public static boolean isMohist() {
return mohist;
}
public static boolean isPaperOrItsForks() {
return paper;
}
public static boolean isMojmap() {
return mojmap;
}
@@ -20,7 +20,6 @@ package net.momirealms.customnameplates.api.network;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.momirealms.customnameplates.api.CNPlayer;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -20,7 +20,6 @@ package net.momirealms.customnameplates.api.placeholder;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.momirealms.customnameplates.api.CustomNameplates;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
+4
View File
@@ -2,6 +2,10 @@ plugins {
id("io.github.goooler.shadow") version "8.1.8"
}
repositories {
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
}
dependencies {
compileOnly(project(":common"))
compileOnly(project(":api"))
@@ -124,14 +124,19 @@ public class ActionBarManagerImpl implements ActionBarManager, JoinQuitListener
@Override
public void onPlayerJoin(CNPlayer player) {
if (!ConfigManager.actionbarModule()) return;
plugin.getScheduler().asyncLater(() -> {
Runnable r = () -> {
if (!player.isOnline()) return;
ActionBarSender sender = new ActionBarSender(this, player);
ActionBarSender previous = senders.put(player.uuid(), sender);
if (previous != null) {
previous.destroy();
}
}, ConfigManager.delaySend() * 50L, TimeUnit.MILLISECONDS);
};
if (ConfigManager.delaySend() < 0) {
r.run();
} else {
plugin.getScheduler().asyncLater(r, ConfigManager.delaySend() * 50L, TimeUnit.MILLISECONDS);
}
}
@Override
@@ -32,7 +32,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import static java.util.Objects.requireNonNull;
@@ -81,7 +80,7 @@ public class ActionBarSender implements Feature {
this.onConditionTimerCheck();
}
public void onConditionTimerCheck() {
public synchronized void onConditionTimerCheck() {
ActionBarConfig[] configs = manager.actionBarConfigs();
outer: {
for (ActionBarConfig config : configs) {
@@ -522,6 +522,8 @@ public class AdvanceManagerImpl implements AdvanceManager {
String codePoints = requireNonNull(section.getString("codepoints", ""), "codepoints should be NonNull");
int height = section.getInt("height", 8);
boolean custom = section.getBoolean("custom", false);
boolean copy = section.getBoolean("generate", false);
String namespace = section.getString("namespace", ConfigManager.namespace());
File bitmapCache = new File(plugin.getDataDirectory().toFile(), "tmp" + File.separator + id + ".tmp");
if (!bitmapCache.exists()) {
@@ -586,9 +588,25 @@ public class AdvanceManagerImpl implements AdvanceManager {
}
registerCharacterFontData(id, bitmapCache, (properties) -> {
int ascent = (int) properties.get("shift_y");
String filePath = custom ? ConfigManager.namespace() + ":font/" + file : "minecraft:font/" + codePoints + ".png";
String filePath = custom ? namespace + ":font/" + file : "minecraft:font/" + codePoints + ".png";
plugin.getConfigManager().saveResource("tmp/" + codePoints + ".json");
StringBuilder jsonContent = new StringBuilder();
if (copy) {
File pngFile = new File(plugin.getDataDirectory().toFile(), "font" + File.separator + file);
File destination = new File(plugin.getDataDirectory().toFile(),
"ResourcePack"
+ File.separator + "assets"
+ File.separator + (custom ? namespace : "minecraft")
+ File.separator + "textures"
+ File.separator + "font"
+ File.separator + (custom ? file : codePoints + ".png")
);
try {
FileUtils.copyFile(pngFile, destination);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
try (BufferedReader reader = new BufferedReader(new FileReader(new File(plugin.getDataDirectory().toFile(), "tmp" + File.separator + codePoints + ".json")))) {
String line;
while ((line = reader.readLine()) != null) {
@@ -933,7 +951,7 @@ public class AdvanceManagerImpl implements AdvanceManager {
.advance(dataMap)
.fontProviderFunction(function)
.build();
charFontWidthDataMap.put(id, fontWidthData);
this.charFontWidthDataMap.put(id, fontWidthData);
}
@Override
@@ -1021,8 +1039,8 @@ public class AdvanceManagerImpl implements AdvanceManager {
@Override
public void unload() {
this.textWidthCache.invalidateAll();
this.configFontWidthDataMap.clear();
this.textWidthCache.cleanUp();
}
@Override
@@ -1218,6 +1236,7 @@ public class AdvanceManagerImpl implements AdvanceManager {
return totalAdvance;
}
@SuppressWarnings("UnstableApiUsage")
@Override
public List<Tuple<String, Key, Boolean>> miniMessageToIterable(String text) {
if (AdventureHelper.legacySupport) text = AdventureHelper.legacyToMiniMessage(text);
@@ -1227,6 +1246,7 @@ public class AdvanceManagerImpl implements AdvanceManager {
return iterableTexts;
}
@SuppressWarnings("UnstableApiUsage")
private void nodeToIterableTexts(ElementNode node, List<Tuple<String, Key, Boolean>> list, Key font, boolean bold) {
if (node instanceof ValueNode valueNode) {
String text = valueNode.value();
@@ -28,7 +28,10 @@ import net.momirealms.customnameplates.api.util.ConfigUtils;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.*;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BackgroundManagerImpl implements BackgroundManager {
@@ -84,14 +84,19 @@ public class BossBarManagerImpl implements BossBarManager, JoinQuitListener {
@Override
public void onPlayerJoin(CNPlayer player) {
if (!ConfigManager.bossbarModule()) return;
plugin.getScheduler().asyncLater(() -> {
Runnable r = () -> {
if (!player.isOnline()) return;
BossBarDisplayController sender = new BossBarDisplayController(this, player);
BossBarDisplayController previous = senders.put(player.uuid(), sender);
if (previous != null) {
previous.destroy();
}
}, ConfigManager.delaySend() * 50L, TimeUnit.MILLISECONDS);
};
if (ConfigManager.delaySend() < 0) {
r.run();
} else {
plugin.getScheduler().asyncLater(r, ConfigManager.delaySend() * 50L, TimeUnit.MILLISECONDS);
}
}
@Override
@@ -29,7 +29,6 @@ import net.momirealms.customnameplates.api.helper.AdventureHelper;
import net.momirealms.customnameplates.api.placeholder.Placeholder;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
@@ -99,7 +98,7 @@ public class BossBarSender implements Feature, BossBar {
timeLeft = 0;
}
public void tick() {
public synchronized void tick() {
if (timeLeft > 0)
timeLeft--;
@@ -110,6 +110,7 @@ public abstract class AbstractChatManager implements ChatManager {
@Override
public void onChat(CNPlayer player, String message, String channel) {
String text = message;
plugin.debug(() -> player.name() + " says [" + message + "]");
for (EmojiProvider provider : emojiProviders) {
text = provider.replace(player, text);
}
@@ -31,7 +31,6 @@ import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
public class ImageManagerImpl implements ImageManager {
@@ -138,7 +138,7 @@ public class NameplateManagerImpl implements NameplateManager {
}
private void saveDefaultNameplates() {
String[] png_list = new String[]{"cat", "egg", "cheems", "wither", "xmas", "halloween", "hutao", "starsky", "trident", "rabbit"};
String[] png_list = new String[]{"egg", "xmas", "halloween", "hutao", "starsky", "trident", "rabbit", "sign", "game", "enter", "panda", "angel", "banner"};
String[] part_list = new String[]{"_left.png", "_middle.png", "_right.png", ".yml"};
for (String name : png_list) {
for (String part : part_list) {
@@ -41,6 +41,7 @@ import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.*;
public class ResourcePackManagerImpl implements ResourcePackManager {
@@ -236,6 +237,14 @@ public class ResourcePackManagerImpl implements ResourcePackManager {
plugin.getPluginLogger().warn("Failed to copy files to Oraxen", e);
}
}
if (ConfigManager.packNexo()){
try {
FileUtils.deleteDirectory(new File(pluginsFolder, "Nexo" + File.separator + "pack" + File.separator + "external_packs" + File.separator + "CustomNameplates"));
FileUtils.copyDirectory(resourcePackFolder, new File(pluginsFolder, "Nexo" + File.separator + "pack" + File.separator + "external_packs" + File.separator + "CustomNameplates"));
} catch (IOException e){
plugin.getPluginLogger().warn("Failed to copy files to Nexo", e);
}
}
if(ConfigManager.packCreativeCentral()) {
try {
FileUtils.copyDirectory(new File(resourcePackFolder, "assets"), new File(pluginsFolder, "creative-central" + File.separator + "resources" + File.separator + "assets"));
@@ -32,7 +32,6 @@ import net.momirealms.customnameplates.api.placeholder.Placeholder;
import net.momirealms.customnameplates.api.util.Vector3;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -25,6 +25,7 @@ import net.momirealms.customnameplates.api.feature.tag.NameTagConfig;
import net.momirealms.customnameplates.api.feature.tag.Tag;
import net.momirealms.customnameplates.api.feature.tag.TagRenderer;
import net.momirealms.customnameplates.api.feature.tag.UnlimitedTagManager;
import net.momirealms.customnameplates.api.helper.VersionHelper;
import net.momirealms.customnameplates.api.network.Tracker;
import java.util.*;
@@ -38,6 +39,7 @@ public class TagRendererImpl implements TagRenderer {
private Tag[] tagArray;
private Tag[] rTagsArray;
private double hatOffset;
private boolean valid = true;
public TagRendererImpl(UnlimitedTagManager manager, CNPlayer owner) {
this.owner = owner;
@@ -69,7 +71,14 @@ public class TagRendererImpl implements TagRenderer {
}
@Override
public void onTick() {
public boolean isValid() {
return valid;
}
@Override
public synchronized void onTick() {
if (!isValid()) return;
Set<CNPlayer> playersToUpdatePassengers = new ObjectOpenHashSet<>();
Set<CNPlayer> tagTranslationUpdates = new ObjectOpenHashSet<>();
@@ -135,6 +144,7 @@ public class TagRendererImpl implements TagRenderer {
@Override
public void destroy() {
this.valid = false;
for (Tag tag : this.tagArray) {
tag.hide();
if (tag instanceof Feature feature) {
@@ -292,7 +302,13 @@ public class TagRendererImpl implements TagRenderer {
passengers[index++] = passenger;
}
Object packet = CustomNameplates.getInstance().getPlatform().setPassengersPacket(owner.entityID(), passengers);
CustomNameplates.getInstance().getPacketSender().sendPacket(another, packet);
if (VersionHelper.isPaperOrItsForks()) {
CustomNameplates.getInstance().getPacketSender().sendPacket(another, packet);
} else {
CustomNameplates.getInstance().getScheduler().sync().runLater(() -> {
CustomNameplates.getInstance().getPacketSender().sendPacket(another, packet);
}, 0, null);
}
}
public void handleEntityDataChange(CNPlayer another, boolean isCrouching) {
@@ -140,8 +140,8 @@ public class UnlimitedTagManagerImpl implements UnlimitedTagManager, JoinQuitLis
@Override
public void onPlayerJoin(CNPlayer player) {
plugin.debug(() -> player.name() + " joined the server");
TagRendererImpl sender = new TagRendererImpl(this, player);
sender.onTick();
TagRendererImpl previous = tagRenderers.put(player.uuid(), sender);
if (previous != null) {
previous.destroy();
@@ -114,7 +114,15 @@ public class PlaceholderManagerImpl implements PlaceholderManager {
}
private void loadNestNameplatePlaceholders() {
if (!ConfigManager.nameplateModule()) return;
if (!ConfigManager.nameplateModule()) {
this.registerPlayerPlaceholder("%np_tag-image%", (player -> "Please remove %np_tag-image% if you have disabled nameplates module"));
this.registerPlayerPlaceholder("%rel_np_tag-image%", (player -> "Please remove %rel_np_tag-image% if you have disabled nameplates module"));
this.registerPlayerPlaceholder("%np_tag-text%", (player -> "Please remove %np_tag-text% if you have disabled nameplates module"));
this.registerPlayerPlaceholder("%rel_np_tag-text%", (player -> "Please remove %rel_np_tag-text% if you have disabled nameplates module"));
this.registerPlayerPlaceholder("%np_tag%", (player -> "Please remove %np_tag% if you have disabled nameplates module"));
this.registerPlayerPlaceholder("%rel_np_tag%", (player -> "Please remove %rel_np_tag% if you have disabled nameplates module"));
return;
}
PreParsedDynamicText nameTag = new PreParsedDynamicText(plugin.getNameplateManager().playerNameTag());
Placeholder placeholder1 = this.registerPlayerPlaceholder("%np_tag-image%", (player -> {
String equippedNameplate = player.equippedNameplate();
@@ -584,10 +592,10 @@ public class PlaceholderManagerImpl implements PlaceholderManager {
List<RelationalPlaceholder> delayedPlaceholdersToUpdate = new ObjectArrayList<>();
for (Placeholder placeholder : player.activePlaceholdersToRefresh()) {
if (placeholder instanceof PlayerPlaceholder playerPlaceholder) {
TimeStampData<String> previous = player.getValue(placeholder);
TimeStampData<String> previous = player.getRawPlayerValue(playerPlaceholder);
if (previous == null) {
String value = playerPlaceholder.request(player);
player.setValue(placeholder, new TimeStampData<>(value, MainTask.getTicks(), true));
player.setPlayerValue(playerPlaceholder, new TimeStampData<>(value, MainTask.getTicks(), true));
featuresToNotifyUpdates.addAll(player.activeFeatures(placeholder));
} else {
if (previous.ticks() > MainTask.getTicks() - getRefreshInterval(placeholder.countId())) {
@@ -609,7 +617,7 @@ public class PlaceholderManagerImpl implements PlaceholderManager {
} else if (placeholder instanceof RelationalPlaceholder relationalPlaceholder) {
delayedPlaceholdersToUpdate.add(relationalPlaceholder);
} else if (placeholder instanceof SharedPlaceholder sharedPlaceholder) {
TimeStampData<String> previous = player.getValue(placeholder);
TimeStampData<String> previous = player.getRawSharedValue(sharedPlaceholder);
if (previous == null) {
String value;
// if the shared placeholder has been updated by other players
@@ -618,7 +626,7 @@ public class PlaceholderManagerImpl implements PlaceholderManager {
} else {
value = sharedPlaceholder.request();
}
player.setValue(placeholder, new TimeStampData<>(value, MainTask.getTicks(), true));
player.setSharedValue(sharedPlaceholder, new TimeStampData<>(value, MainTask.getTicks(), true));
featuresToNotifyUpdates.addAll(player.activeFeatures(placeholder));
} else {
// The placeholder has been refreshed by other codes
@@ -649,7 +657,7 @@ public class PlaceholderManagerImpl implements PlaceholderManager {
for (RelationalPlaceholder placeholder : delayedPlaceholdersToUpdate) {
for (CNPlayer nearby : player.nearbyPlayers()) {
TimeStampData<String> previous = player.getRelationalValue(placeholder, nearby);
TimeStampData<String> previous = player.getRawRelationalValue(placeholder, nearby);
if (previous == null) {
String value = placeholder.request(player, nearby);
player.setRelationalValue(placeholder, nearby, new TimeStampData<>(value, MainTask.getTicks(), true));
@@ -32,7 +32,10 @@ import net.momirealms.customnameplates.common.util.ListUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
public abstract class AbstractRequirementManager implements RequirementManager {
@@ -63,6 +66,7 @@ public abstract class AbstractRequirementManager implements RequirementManager {
}
private void registerInternalRequirements() {
this.registerRequirement((args, interval) -> new LaggyRequirement(interval, (int) args), "laggy");
this.registerRequirement((args, interval) -> {
Section section = ConfigUtils.safeCast(args, Section.class);
if (section == null) return Requirement.empty();
@@ -120,10 +124,17 @@ public abstract class AbstractRequirementManager implements RequirementManager {
this.registerRequirement((args, interval) -> {
Section section = ConfigUtils.safeCast(args, Section.class);
if (section == null) return Requirement.empty();
PreParsedDynamicText dynamicText1 = new PreParsedDynamicText(section.getString("value1", ""), true);
String regex = section.getString("value2", "");
PreParsedDynamicText dynamicText1 = new PreParsedDynamicText(section.getString("papi", ""), true);
String regex = section.getString("regex", "");
return new RegexRequirement(interval, dynamicText1, regex);
}, "regex");
this.registerRequirement((args, interval) -> {
Section section = ConfigUtils.safeCast(args, Section.class);
if (section == null) return Requirement.empty();
PreParsedDynamicText dynamicText1 = new PreParsedDynamicText(section.getString("papi", ""), true);
String regex = section.getString("regex", "");
return new NotRegexRequirement(interval, dynamicText1, regex);
}, "!regex");
this.registerRequirement((args, interval) -> {
Section section = ConfigUtils.safeCast(args, Section.class);
if (section == null) return Requirement.empty();
@@ -0,0 +1,61 @@
/*
* Copyright (C) <2024> <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.backend.requirement.builtin;
import net.momirealms.customnameplates.api.CNPlayer;
import net.momirealms.customnameplates.api.ConfigManager;
import net.momirealms.customnameplates.backend.requirement.AbstractRequirement;
public class LaggyRequirement extends AbstractRequirement {
private final int time;
public LaggyRequirement(int refreshInterval, int time) {
super(refreshInterval);
this.time = time;
}
@Override
public boolean isSatisfied(CNPlayer p1, CNPlayer p2) {
if (!ConfigManager.debug()) return true;
long time1 = System.currentTimeMillis();
while (true) {
if (System.currentTimeMillis() - time1 > time) {
break;
}
}
return true;
}
@Override
public String type() {
return "laggy";
}
@Override
public int hashCode() {
return type().hashCode() + time * 17;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof LaggyRequirement that)) return false;
return time == that.time;
}
}
@@ -0,0 +1,37 @@
/*
* Copyright (C) <2024> <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.backend.requirement.builtin;
import net.momirealms.customnameplates.api.feature.PreParsedDynamicText;
public class NotRegexRequirement extends PlaceholderRequirement<String> {
public NotRegexRequirement(int refreshInterval, PreParsedDynamicText text, String any) {
super(refreshInterval, text, any);
}
@Override
protected boolean checkArgument(String a1, String a2) {
return !a1.matches(a2);
}
@Override
public String type() {
return "!regex";
}
}
@@ -4,7 +4,7 @@
"description": "CustomNameplates",
"supported_formats": {
"min_inclusive": 13,
"max_inclusive": 43
"max_inclusive": 46
}
},
"overlays": {
@@ -19,7 +19,7 @@
{
"formats": {
"min_inclusive": 42,
"max_inclusive": 43
"max_inclusive": 46
},
"directory": "overlay_1_21_2"
}
@@ -4,7 +4,7 @@
"description": "CustomNameplates",
"supported_formats": {
"min_inclusive": 32,
"max_inclusive": 42
"max_inclusive": 46
}
},
"overlays": {
@@ -19,7 +19,7 @@
{
"formats": {
"min_inclusive": 42,
"max_inclusive": 43
"max_inclusive": 46
},
"directory": "overlay_1_21_2"
}
@@ -4,7 +4,7 @@
"description": "CustomNameplates",
"supported_formats": {
"min_inclusive": 42,
"max_inclusive": 43
"max_inclusive": 46
}
}
}
+13 -7
View File
@@ -23,8 +23,9 @@ modules:
integrations:
resource-pack:
ItemsAdder: false # Integration with ItemsAdder
ItemsAdder-old-method: false # Old method for ItemsAdder
ItemsAdder-old-method: false # Legacy integration with ItemsAdder
Oraxen: false # Integration with Oraxen
Nexo: false # Integration with Nexo
Creative-Central: false # Integration with Creative-Central
chat:
TrChat: false # Integration with TrChat
@@ -33,6 +34,8 @@ integrations:
CarbonChat: false # Integration with CarbonChat
AdvancedChat: false # Integration with AdvancedChat
Essentials: false # Integration with Essentials chat
ChatControlRed: false # Integration with ChatControlRed
Chatty: false # Integration with Chatty
# Resource Pack Generation Settings: Configure resource pack generation behavior.
resource-pack:
@@ -60,18 +63,19 @@ resource-pack:
# Additional Settings: Extra options to control behavior and performance.
other-settings:
legacy-color-code-support: true # Enable support for legacy color codes using &
send-delay: 20 # Set actionbar/bossbar send delay (ticks)
send-delay: 20 # Set actionbar/bossbar send delay (ticks) (0 = send immediately on async threads, -1 = send immediately on main thread)
catch-other-plugin-actionbar: true # Capture actionbars from other plugins
other-actionbar-stay-time: 3000 # How long does other actionsbars stay (ms)
display-system-actionbar: true # Should the plugin display system actionbar and temporarily hide the custom actionbar?
hide-team-names: true # Hide the team name sent by other plugins or vanilla team system
unsafe-chat-event: false # Listen for canceled(unsafe) chat events from unknown plugins
default-condition-refresh-interval: 1 # Set default condition refresh interval
default-placeholder-refresh-interval: 1 # Set default placeholder refresh interval
default-condition-refresh-interval: 10 # Set default condition refresh interval in ticks
default-placeholder-refresh-interval: 1 # Set default placeholder refresh interval in ticks
placeholder-refresh-interval: # Custom placeholder refresh intervals for performance optimization
"%player_name%": 100
"%vault_prefix%": 20
# Font Templates: Define different fonts and their settings.
# Requires a restart to apply because it can be laggy to read thousands of character
font-templates:
space:
space:
@@ -80,7 +84,7 @@ other-settings:
unihex:
unifont:
file: unifont.zip # Load font from unifont.zip
generate: false # Don't include font in the generated resource pack
generate: false # Should this unihex file be included in the generated pack
size_overrides: # Override size for specific Unicode ranges
- from: "\\u3001"
to: "\\u30FF"
@@ -120,7 +124,7 @@ other-settings:
right: 15
unifont_jp:
file: unifont_jp.zip # Load Japanese unifont
generate: false # Don't generate in the resource pack
generate: false # Should this unihex file be included in the generated pack
filter:
"jp": true # Apply to Japanese characters only
size_overrides:
@@ -137,7 +141,9 @@ other-settings:
codepoints: ascii # Define ASCII bitmap font
file: ascii.png # Use ascii.png file for the font
height: 8 # Font height is 8 units
custom: false # Not a custom font (default Minecraft)
custom: false # Does this png path point to a non-default font path??
generate: false # Should this png file be included in the generated pack
# namespace: custom # Optional namespace if you don't want to use the global namespace set in config.yml
ascii_sga:
codepoints: ascii_sga
file: ascii_sga.png
@@ -4,18 +4,33 @@ conditional-text:
priority_1:
text: '%np_background_other_actionbar%' # hides the money hud when a player rides something or dives in water
conditions:
'||':
is-passenger: true
'!=':
value1: '%player_remaining_air%'
value2: "300"
'!gamemode': survival
condition_or:
type: "||"
refresh-interval: 1
value:
condition_passenger:
type: is-passenger
refresh-interval: 1
value: true
condition_air:
type: "!="
refresh-interval: 1
value:
value1: '%player_remaining_air%'
value2: "300"
condition_gamemode:
type: "!gamemode"
refresh-interval: 1
value: survival
priority_2:
text: '%np_static_money_hud%%np_offset_-179%%np_static_other_actionbar%' # displays the money hud + other plugin's actionbar message
conditions:
'!equals':
value1: '%np_actionbar%'
value2: ""
condition_other_actionbar:
type: "!equals"
refresh-interval: 1
value:
value1: '%np_actionbar%'
value2: ""
priority_3:
text: '%np_static_money_hud%' # displays the money hud only
weather:
@@ -131,30 +146,32 @@ switch-text:
switch: "%np_equipped_nameplate%"
default: ""
case:
'wither': "<gradient:#FF0000:#000000:%np_gradient_3%>"
'halloween': "<gradient:#FF0000:#000000:%np_gradient_3%>"
'hutao': "<gradient:#FFFFFF:#FF4500:%np_gradient_3%>"
'rabbit': "<gradient:#FFFFFF:#DB7093:%np_gradient_3%>"
'starsky': "<gradient:#FFFFF0:#696969:%np_gradient_3%>"
'trident': "<gradient:#E1FFFF:#008B8B:%np_gradient_10%>"
'cheems': "<gradient:#C0C0C0:#F5F5F5:%np_gradient_5%>"
'egg': "<gradient:#FFFFFF:#FFA500:%np_gradient_5%>"
'cat': "<gradient:#FFFFFF:#1E90FF:%np_gradient_5%>"
'xmas': "<gradient:#FFFFFF:#FF4500:%np_gradient_5%>"
'xmas': "<WHITE>"
'angel': "<#8B4513>"
'sign': "<BLACK>"
'banner': "<WHITE>"
'enter': "<WHITE>"
nameplate_color_suffix:
switch: "%np_equipped_nameplate%"
default: ""
case:
'wither': "</gradient>"
'halloween': "</gradient>"
'hutao': "</gradient>"
'rabbit': "</gradient>"
'starsky': "</gradient>"
'trident': "</gradient>"
'cheems': "</gradient>"
'egg': "</gradient>"
'cat': "</gradient>"
'xmas': "</gradient>"
'xmas': "</WHITE>"
'angel': "</#8B4513>"
'sign': "</BLACK>"
'banner': "</WHITE>"
'enter': "</WHITE>"
world:
switch: '%player_world%'
case:
@@ -0,0 +1,13 @@
display-name: Angel
left:
image: angel_left
height: 16
ascent: 14
middle:
image: angel_middle
height: 16
ascent: 14
right:
image: angel_right
height: 16
ascent: 14
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1006 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,13 @@
display-name: Banner
left:
image: banner_left
height: 16
ascent: 13
middle:
image: banner_middle
height: 16
ascent: 13
right:
image: banner_right
height: 16
ascent: 13
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1000 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

@@ -1,13 +1,13 @@
display-name: Sad Cat
display-name: Enter
left:
image: cat_left
image: enter_left
height: 16
ascent: 12
middle:
image: cat_middle
image: enter_middle
height: 16
ascent: 12
right:
image: cat_right
image: enter_right
height: 16
ascent: 12
Binary file not shown.

After

Width:  |  Height:  |  Size: 957 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 958 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -1,13 +1,13 @@
display-name: Thank you, Cheems
display-name: Video Game Console
left:
image: cheems_left
image: game_left
height: 16
ascent: 12
middle:
image: cheems_middle
image: game_middle
height: 16
ascent: 12
right:
image: cheems_right
image: game_right
height: 16
ascent: 12
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 958 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -1,13 +1,13 @@
display-name: Wither Rose
display-name: Panda
left:
image: wither_left
image: panda_left
height: 16
ascent: 12
middle:
image: wither_middle
image: panda_middle
height: 16
ascent: 12
right:
image: wither_right
image: panda_right
height: 16
ascent: 12
@@ -0,0 +1,13 @@
display-name: Oak Sign
left:
image: sign_left
height: 16
ascent: 14
middle:
image: sign_middle
height: 16
ascent: 14
right:
image: sign_right
height: 16
ascent: 14
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1023 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

+1 -1
View File
@@ -26,7 +26,7 @@ subprojects {
expand(rootProject.properties)
}
filesMatching(arrayListOf("*.yml", "*/*.yml")) {
filesMatching(arrayListOf("*.yml", "*/*.yml", "META-INF/sponge_plugins.json")) {
expand(
Pair("project_version", rootProject.properties["project_version"]),
Pair("config_version", rootProject.properties["config_version"])
+4
View File
@@ -1,3 +1,7 @@
repositories {
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
}
dependencies {
compileOnly("net.kyori:adventure-api:${rootProject.properties["adventure_bundle_version"]}") {
exclude(module = "adventure-bom")
@@ -113,6 +113,14 @@ public enum Dependency {
Relocation.of("cloud", "org{}incendo{}cloud"),
Relocation.of("geantyref", "io{}leangen{}geantyref")
),
CLOUD_SPONGE(
"org{}incendo",
"cloud-sponge7",
"maven",
"cloud-sponge7",
Relocation.of("cloud", "org{}incendo{}cloud"),
Relocation.of("geantyref", "io{}leangen{}geantyref")
),
CLOUD_MINECRAFT_EXTRAS(
"org{}incendo",
"cloud-minecraft-extras",
@@ -226,6 +234,18 @@ public enum Dependency {
return Dependency.BSTATS_BASE.getVersion();
}
},
BSTATS_SPONGE(
"org{}bstats",
"bstats-sponge",
"maven",
"bstats-sponge",
Relocation.of("bstats", "org{}bstats")
) {
@Override
public String getVersion() {
return Dependency.BSTATS_BASE.getVersion();
}
},
GSON(
"com.google.code.gson",
"gson",
+13 -13
View File
@@ -1,7 +1,7 @@
# Project settings
# Rule: [major update].[feature update].[bug fix]
project_version=3.0.10
config_version=32
project_version=3.0.15.2
config_version=34
project_group=net.momirealms
# Supported languages
@@ -10,16 +10,16 @@ lang=en,zh_cn
# Dependency settings
paper_version=1.20.4
jetbrains_annotations_version=24.0.0
slf4j_version=2.0.13
log4j_version=2.23.1
slf4j_version=2.0.16
log4j_version=2.24.1
gson_version=2.11.0
asm_version=9.7.1
asm_commons_version=9.7.1
jar_relocator_version=1.7
h2_driver_version=2.2.224
sqlite_driver_version=3.46.1.0
adventure_bundle_version=4.17.0
adventure_platform_version=4.3.4
h2_driver_version=2.3.232
sqlite_driver_version=3.47.0.0
adventure_bundle_version=4.18.0-SNAPSHOT
adventure_platform_version=4.3.5-SNAPSHOT
cloud_core_version=2.0.0
cloud_services_version=2.0.0
cloud_brigadier_version=2.0.0-beta.10
@@ -27,14 +27,14 @@ cloud_bukkit_version=2.0.0-beta.10
cloud_paper_version=2.0.0-beta.10
cloud_minecraft_extras_version=2.0.0-beta.10
boosted_yaml_version=1.3.7
byte_buddy_version=1.14.18
byte_buddy_version=1.15.10
mojang_brigadier_version=1.0.18
mongodb_driver_version=5.1.4
mariadb_driver_version=3.4.1
mysql_driver_version=9.0.0
mongodb_driver_version=5.2.1
mariadb_driver_version=3.5.0
mysql_driver_version=9.1.0
hikari_version=5.1.0
commons_pool_version=2.12.0
bstats_version=3.0.2
bstats_version=3.1.0
geantyref_version=1.3.16
caffeine_version=3.1.8
jedis_version=5.1.5
+1 -1
View File
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
File renamed without changes.
@@ -7,7 +7,7 @@ repositories {
maven("https://libraries.minecraft.net") // brigadier
maven("https://jitpack.io/")
maven("https://papermc.io/repo/repository/maven-public/") // paper
maven("https://oss.sonatype.org/content/repositories/snapshots")
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") // spigot
}
@@ -17,7 +17,7 @@ dependencies {
}
implementation(project(":common"))
implementation(project(":backend"))
implementation(project(":compatibility"))
implementation(project(":platforms:bukkit:compatibility"))
compileOnly("dev.folia:folia-api:${rootProject.properties["paper_version"]}-R0.1-SNAPSHOT")
compileOnly("me.clip:placeholderapi:${rootProject.properties["placeholder_api_version"]}")
@@ -46,7 +46,7 @@ dependencies {
tasks {
shadowJar {
archiveFileName = "CustomNameplates-${rootProject.properties["project_version"]}.jar"
archiveFileName = "CustomNameplates-Bukkit-${rootProject.properties["project_version"]}.jar"
destinationDirectory.set(file("$rootDir/target"))
relocate("net.kyori", "net.momirealms.customnameplates.libraries")
relocate("org.incendo", "net.momirealms.customnameplates.libraries")
@@ -29,9 +29,12 @@ dependencies {
compileOnly(files("libs/carbonchat-paper-3.0.0-beta.27.jar"))
compileOnly(files("libs/AdvancedChat-1.3.7.jar"))
compileOnly(files("libs/CMIAPI-9.7.4.1.jar"))
compileOnly(files("libs/ChatControl-Red-10.28.3.jar"))
compileOnly("net.william278.huskchat:huskchat-bukkit:3.0.4")
compileOnly("net.essentialsx:EssentialsX:2.20.1")
compileOnly("net.essentialsx:EssentialsXChat:2.20.1")
// compileOnly("com.github.Brikster:Chatty:v2.19.14")
compileOnly(files("libs/Chatty-3.0.0-SNAPSHOT.jar"))
// Emoji
compileOnly("com.github.LoneDev6:api-itemsadder:3.6.3-beta-14")
compileOnly("io.th0rgal:oraxen:1.182.0")
@@ -21,18 +21,15 @@ import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import me.clip.placeholderapi.expansion.Relational;
import net.momirealms.customnameplates.api.CNPlayer;
import net.momirealms.customnameplates.api.CustomNameplates;
import net.momirealms.customnameplates.api.feature.TimeStampData;
import net.momirealms.customnameplates.api.placeholder.Placeholder;
import net.momirealms.customnameplates.api.placeholder.PlayerPlaceholder;
import net.momirealms.customnameplates.api.placeholder.RelationalPlaceholder;
import net.momirealms.customnameplates.api.placeholder.SharedPlaceholder;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
public class NameplatesExpansion extends PlaceholderExpansion implements Relational {
private final CustomNameplates plugin;
@@ -64,14 +61,10 @@ public class NameplatesExpansion extends PlaceholderExpansion implements Relatio
@Override
public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) {
Placeholder placeholder = plugin.getPlaceholderManager().getRegisteredPlaceholder("%np_" + params + "%");
CNPlayer cnPlayer = player == null ? null : plugin.getPlayer(player.getUniqueId());
if (placeholder instanceof PlayerPlaceholder playerPlaceholder) {
CNPlayer cnPlayer = player == null ? null : plugin.getPlayer(player.getUniqueId());
if (placeholder.children().isEmpty()) {
return playerPlaceholder.request(cnPlayer);
}
if (cnPlayer != null) {
cnPlayer.forceUpdatePlaceholders(Set.of(placeholder), Collections.emptySet());
return cnPlayer.getData(placeholder);
return cnPlayer.getCachedPlayerValue(playerPlaceholder);
} else {
try {
return playerPlaceholder.request(null);
@@ -79,6 +72,12 @@ public class NameplatesExpansion extends PlaceholderExpansion implements Relatio
plugin.getPluginLogger().warn("%nameplates_" + params + "% contains a placeholder that requires a player as the parameter");
}
}
} else if (placeholder instanceof SharedPlaceholder sharedPlaceholder) {
if (cnPlayer != null) {
return cnPlayer.getCachedSharedValue(sharedPlaceholder);
} else {
return sharedPlaceholder.request();
}
}
return null;
}
@@ -91,9 +90,8 @@ public class NameplatesExpansion extends PlaceholderExpansion implements Relatio
return null;
}
Placeholder placeholder = plugin.getPlaceholderManager().getRegisteredPlaceholder("%rel_np_" + params + "%");
if (placeholder != null) {
cnPlayer1.forceUpdatePlaceholders(Set.of(placeholder), Set.of(cnPlayer2));
return Optional.ofNullable(cnPlayer1.getRelationalValue(placeholder, cnPlayer2)).map(TimeStampData::data).orElse(placeholder.id());
if (placeholder instanceof RelationalPlaceholder relationalPlaceholder) {
return cnPlayer1.getCachedRelationalValue(relationalPlaceholder, cnPlayer2);
}
return null;
}
@@ -235,6 +235,9 @@ public class NameplatesExtraExpansion extends PlaceholderExpansion {
String minuteStr = (minutes < 10) ? "0" + minutes : String.valueOf(minutes);
return hours + ":" + minuteStr;
}
case "newline" -> {
return "\n";
}
}
return null;
}
@@ -0,0 +1,85 @@
/*
* 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.bukkit.compatibility.chat;
import net.momirealms.customnameplates.api.CNPlayer;
import net.momirealms.customnameplates.api.CustomNameplates;
import net.momirealms.customnameplates.api.feature.chat.AbstractChatMessageProvider;
import net.momirealms.customnameplates.api.feature.chat.ChatManager;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.mineacademy.chatcontrol.PlayerCache;
import org.mineacademy.chatcontrol.api.ChatChannelEvent;
import org.mineacademy.chatcontrol.model.Channel;
import java.util.Objects;
public class ChatControlRedProvider extends AbstractChatMessageProvider implements Listener {
public ChatControlRedProvider(CustomNameplates plugin, ChatManager manager) {
super(plugin, manager);
}
@EventHandler(ignoreCancelled = true)
public void onChat(ChatChannelEvent event) {
plugin.debug(() -> "ChatChannelEvent triggered");
final CommandSender sender = event.getSender();
if (!(sender instanceof Player player)) {
return;
}
if (!player.isOnline()) return;
CNPlayer cnPlayer = plugin.getPlayer(player.getUniqueId());
if (cnPlayer == null) return;
plugin.getScheduler().async().execute(() -> {
manager.onChat(cnPlayer, event.getMessage(), event.getChannel().getName());
});
}
@Override
public boolean hasJoinedChannel(CNPlayer player, String channelID) {
Channel channel = Channel.findChannel(channelID);
if (channel == null) return false;
return channel.isInChannel((Player) player.player());
}
@Override
public boolean canJoinChannel(CNPlayer player, String channelID) {
return ((Player) player).hasPermission("chatcontrol.channel.join."+channelID+".read");
}
@Override
public boolean isIgnoring(CNPlayer sender, CNPlayer receiver) {
PlayerCache cache = PlayerCache.from((Player) receiver.player());
if (cache == null) return false;
return cache.isIgnoringPlayer(sender.uuid());
}
@Override
public void register() {
Bukkit.getPluginManager().registerEvents(this, Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("CustomNameplates")));
}
@Override
public void unregister() {
HandlerList.unregisterAll(this);
}
}
@@ -0,0 +1,82 @@
/*
* 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.bukkit.compatibility.chat;
import net.momirealms.customnameplates.api.CNPlayer;
import net.momirealms.customnameplates.api.CustomNameplates;
import net.momirealms.customnameplates.api.feature.chat.AbstractChatMessageProvider;
import net.momirealms.customnameplates.api.feature.chat.ChatManager;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import ru.brikster.chatty.api.ChattyApi;
import ru.brikster.chatty.api.chat.Chat;
import ru.brikster.chatty.api.event.ChattyMessageEvent;
import java.util.Objects;
public class ChattyProvider extends AbstractChatMessageProvider implements Listener {
public ChattyProvider(CustomNameplates plugin, ChatManager manager) {
super(plugin, manager);
}
@EventHandler(ignoreCancelled = true)
public void onChat(ChattyMessageEvent event) {
final String message = event.getPlainMessage();
final Player player = event.getSender();
if (!player.isOnline()) return;
CNPlayer cnPlayer = plugin.getPlayer(player.getUniqueId());
if (cnPlayer == null) return;
plugin.getScheduler().async().execute(() -> {
manager.onChat(cnPlayer, message, event.getChat().getId());
});
}
@Override
public boolean hasJoinedChannel(CNPlayer player, String channelID) {
return true;
}
@Override
public boolean canJoinChannel(CNPlayer player, String channelID) {
Chat chat = ChattyApi.instance().getChats().get(channelID);
if (chat == null) {
return false;
}
if (!chat.isPermissionRequired()) return true;
return chat.hasReadPermission((Player) player.player());
}
@Override
public boolean isIgnoring(CNPlayer sender, CNPlayer receiver) {
return false;
}
@Override
public void register() {
Bukkit.getPluginManager().registerEvents(this, Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("CustomNameplates")));
}
@Override
public void unregister() {
HandlerList.unregisterAll(this);
}
}
Loaded 100 of 178 files, more files were not shown because too many files have changed in this diff. Show more