Compare commits

...
33 Commits
Author SHA1 Message Date
Adrian 8f5a81c17e feat(platform): Added Fabric Implementation (#53) 2023-04-22 12:16:20 -05:00
Adrian dd0e895513 Merge branch 'main' into feat/platform/fabric 2023-04-21 23:14:30 -05:00
Adrian 8f42950ef3 ci: Increased compile timeout in GitHub Actions 2023-04-21 21:54:14 -05:00
Adrian 4043a578e1 feat(fabric): Finished server placeholders implementation 2023-04-21 19:48:44 -05:00
Adrian 1c06b1bee4 Merge pull request #56 from MiniPlaceholders/renovate/gradle-8.x
chore(deps): update dependency gradle to v8.1.1
2023-04-21 08:38:33 -05:00
renovate[bot] 5c6b3f4e43 chore(deps): update dependency gradle to v8.1.1 2023-04-21 13:20:37 +00:00
Adrian 8df4e70032 Merge pull request #55 from MiniPlaceholders/renovate/jmh
chore(deps): update dependency me.champeau.jmh to v0.7.1
2023-04-17 15:41:39 -05:00
renovate[bot] 432267b567 chore(deps): update dependency me.champeau.jmh to v0.7.1 2023-04-17 20:10:21 +00:00
Adrian 28090463b8 fix(fabric): Fixed meta file name 2023-04-16 22:29:31 -05:00
Adrian fff437a60b fix: Fixed project compilation 2023-04-16 21:10:40 -05:00
Adrian 00e0bdcaf3 feat(platform): Added Fabric support 2023-04-16 16:23:48 -05:00
Adrian 1c9ff78b4c feat(api): Added some utils methods to Expansions and MiniPlaceholders
- `Expansion#registered`
- `Expansion#unregister`
- `MiniPlaceholders#getExpansionByName`
2023-04-16 12:08:36 -05:00
Adrian 0aa037d1af feat(api): Added some utils methods to Expansions and MiniPlaceholders class
- Expansion#registered
- Expansion#unregister
- MiniPlaceholders#getExpansionByName

closes #51
2023-04-16 10:20:42 -05:00
Adrian 1440d19663 [ci skip] chore: Removed unused jitpack file 2023-04-15 23:54:08 -05:00
Adrian 20daf60534 fix(deps): Manually updated Krypton version
closes #42
closes #38
2023-04-15 23:52:03 -05:00
Adrian dd36c10a0f perf(api): Changed internal Set implementation from a synchronizedSet to a ConcurrentHashMap based Set 2023-04-15 23:42:40 -05:00
Adrian 0caddf5b44 [ci skip] chore: Update FUNDING.yml 2023-04-14 16:12:43 -05:00
Adrian 7ca4536dc5 Merge pull request #50 from MiniPlaceholders/renovate/gradle-8.x
chore(deps): update dependency gradle to v8.1
2023-04-14 09:32:21 -05:00
renovate[bot] e9ecd3aebf chore(deps): update dependency gradle to v8.1 2023-04-12 15:22:19 +00:00
Adrian 5adadcbbcb release: Version 2.0.2 2023-04-11 11:41:50 -05:00
Adrian 4c1739f3b0 feat: Added Folia Support 2023-04-11 11:38:52 -05:00
Adrian dcfd2a6fe1 Merge pull request #49 from MiniPlaceholders/renovate/net.kyori-adventure-text-serializer-plain-4.x
fix(deps): update dependency net.kyori:adventure-text-serializer-plain to v4.13.1
2023-04-09 21:38:18 -05:00
renovate[bot] b7a56198f4 fix(deps): update dependency net.kyori:adventure-text-serializer-plain to v4.13.1 2023-04-10 02:18:01 +00:00
Adrian 2d9fdaccc2 Merge pull request #48 from MiniPlaceholders/renovate/net.kyori-adventure-text-serializer-legacy-4.x
fix(deps): update dependency net.kyori:adventure-text-serializer-legacy to v4.13.1
2023-04-09 21:17:49 -05:00
Adrian 4f63f55d11 Merge pull request #47 from MiniPlaceholders/renovate/adventure
fix(deps): update adventure to v4.13.1
2023-04-09 21:17:33 -05:00
renovate[bot] 5495f5f57a fix(deps): update dependency net.kyori:adventure-text-serializer-legacy to v4.13.1 2023-04-10 01:56:07 +00:00
renovate[bot] d33e98714a fix(deps): update adventure to v4.13.1 2023-04-10 01:56:02 +00:00
Adrian e6e98c9852 Merge pull request #45 from MiniPlaceholders/renovate/kotlin-monorepo
fix(deps): update kotlin monorepo to v1.8.20
2023-04-06 18:16:14 -05:00
renovate[bot] 6f9abbefc9 fix(deps): update kotlin monorepo to v1.8.20 2023-04-06 23:06:12 +00:00
Adrian 7ee6dcb1b7 Merge pull request #46 from MiniPlaceholders/renovate/userdev
chore(deps): update dependency io.papermc.paperweight.userdev to v1.5.4
2023-04-04 22:44:55 -05:00
renovate[bot] db37d4ae66 chore(deps): update dependency io.papermc.paperweight.userdev to v1.5.4 2023-04-05 02:25:46 +00:00
Adrian 38b707d091 Merge pull request #43 from MiniPlaceholders/renovate/shadow
chore(deps): update shadow to v8.1.1
2023-03-20 17:50:22 -05:00
renovate[bot] 6737e63232 chore(deps): update shadow to v8.1.1 2023-03-20 21:45:41 +00:00
25 changed files with 430 additions and 70 deletions

No files matched your search

+2 -13
View File
@@ -1,13 +1,2 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: https://paypal.me/4drian3d # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
github: 4drian3d
custom: https://paypal.me/4drian3d
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
- name: Build with Gradle
uses: nick-invision/retry@v2
with:
timeout_minutes: 4
timeout_minutes: 8
max_attempts: 2
command: gradle build
+3 -8
View File
@@ -7,13 +7,13 @@ plugins {
dependencies {
compileOnly(libs.adventure.api)
compileOnly(libs.adventure.minimesssage)
compileOnly("net.kyori:adventure-text-serializer-legacy:4.13.0")
compileOnly("net.kyori:adventure-text-serializer-legacy:4.13.1")
compileOnly(projects.miniplaceholdersConnect)
testImplementation(platform("org.junit:junit-bom:5.9.2"))
testImplementation("org.junit.jupiter:junit-jupiter")
testImplementation(libs.adventure.api)
testImplementation(libs.adventure.minimesssage)
testImplementation("net.kyori:adventure-text-serializer-plain:4.13.0")
testImplementation("net.kyori:adventure-text-serializer-plain:4.13.1")
}
tasks {
@@ -36,15 +36,10 @@ java {
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}
repositories {
mavenCentral()
}
tasks {
compileJava {
options.encoding = Charsets.UTF_8.name()
options.release.set(11)
options.release.set(17)
}
processResources {
filteringCharset = Charsets.UTF_8.name()
@@ -74,9 +74,26 @@ public interface Expansion {
/**
* Register this expansion
* @since 1.0.0
* @throws IllegalStateException if the expansion you are trying to register is already registered
* @see Expansion#registered()
*/
void register();
/**
* Unregisters this expansion
* @since 2.1.0
* @throws IllegalStateException if the expansion you are trying to unregister is not registered
* @see Expansion#registered()
*/
void unregister();
/**
* Get the registration status of this expansion
* @return true if the expansion is registered, otherwise false
* @since 2.1.0
*/
boolean registered();
/**
* Creates a new Expansion Builder
* @param name the expansion name
@@ -125,7 +142,7 @@ public interface Expansion {
@NotNull Builder audiencePlaceholder(final @NotNull String key, final @NotNull AudiencePlaceholder audiencePlaceholder);
/**
* Adds an Relational Placeholder based on two audiences
* Adds a Relational Placeholder based on two audiences
*
* <p>This type of placeholder allows you to create
* components based on a 2-audiences relationship,
@@ -157,7 +174,7 @@ public interface Expansion {
/**
* Adds a global placeholder
*
* <p>This placeholder is not cached and is inmutable</p>
* <p>This placeholder is not cached and is immutable</p>
* @param key the placeholder key, cannot be an empty or black string
* @param tag the tag of this placeholder
* @return the {@link Builder} itself
@@ -102,10 +102,26 @@ final class ExpansionImpl implements Expansion {
}
@Override
public void register(){
public void register() {
if (this.registered()) {
throw new IllegalStateException("Expansion" + this.name + "is already registered");
}
MiniPlaceholders.expansions.add(this);
}
@Override
public void unregister() {
if (!this.registered()) {
throw new IllegalStateException("Expansion " + this.name + " is not registered");
}
MiniPlaceholders.expansions.remove(this);
}
@Override
public boolean registered() {
return MiniPlaceholders.expansions.contains(this);
}
static final class Builder implements Expansion.Builder {
private final String expansionName;
private Set<Tags.Single> audiencePlaceholders;
@@ -1,17 +1,18 @@
package io.github.miniplaceholders.api;
import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import io.github.miniplaceholders.api.enums.Platform;
import io.github.miniplaceholders.api.utils.Resolvers;
import org.jetbrains.annotations.NotNull;
import io.github.miniplaceholders.connect.InternalPlatform;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.jetbrains.annotations.Nullable;
import static io.github.miniplaceholders.api.utils.Resolvers.applyIfNotEmpty;
import static java.util.Objects.requireNonNull;
/**
@@ -27,8 +28,8 @@ import static java.util.Objects.requireNonNull;
* @since 1.0.0
*/
public final class MiniPlaceholders {
private MiniPlaceholders(){}
static final Set<Expansion> expansions = Collections.synchronizedSet(new HashSet<>());
private MiniPlaceholders() {}
static final Set<Expansion> expansions = ConcurrentHashMap.newKeySet();
/**
* Get the platform
@@ -36,11 +37,12 @@ public final class MiniPlaceholders {
* @since 1.0.0
*/
public static @NotNull Platform getPlatform() {
switch (InternalPlatform.platform()) {
case PAPER: return Platform.PAPER;
case VELOCITY: return Platform.VELOCITY;
default: return Platform.KRYPTON;
}
return switch (InternalPlatform.platform()) {
case PAPER -> Platform.PAPER;
case VELOCITY -> Platform.VELOCITY;
case KRYPTON -> Platform.KRYPTON;
case FABRIC -> Platform.FABRIC;
};
}
/**
@@ -49,7 +51,7 @@ public final class MiniPlaceholders {
* <pre>TagResolver resolver = MiniPlaceholders.getGlobalPlaceholders();
* Component messageParsed = MiniMessage.miniMessage().deserialize({@link String}, resolver);</pre>
*
* @return global placeholders independient of any audience
* @return global placeholders independent of any audience
* @see TagResolver
* @since 1.0.0
*/
@@ -79,8 +81,7 @@ public final class MiniPlaceholders {
final TagResolver.Builder resolvers = TagResolver.builder();
for (Expansion expansion : expansions) {
final TagResolver resolver = expansion.audiencePlaceholders(audience);
if (resolver != TagResolver.empty())
resolvers.resolver(resolver);
applyIfNotEmpty(resolver, resolvers);
}
return resolvers.build();
}
@@ -102,7 +103,7 @@ public final class MiniPlaceholders {
final TagResolver.Builder builder = TagResolver.builder();
for (final Expansion expansion : expansions) {
Resolvers.applyIfNotEmpty(
applyIfNotEmpty(
expansion.relationalPlaceholders(audience, otherAudience),
builder
);
@@ -134,8 +135,8 @@ public final class MiniPlaceholders {
final TagResolver.Builder builder = TagResolver.builder();
for (final Expansion expansion : expansions) {
Resolvers.applyIfNotEmpty(expansion.audiencePlaceholders(audience), builder);
Resolvers.applyIfNotEmpty(expansion.globalPlaceholders(), builder);
applyIfNotEmpty(expansion.audiencePlaceholders(audience), builder);
applyIfNotEmpty(expansion.globalPlaceholders(), builder);
}
return builder.build();
@@ -168,9 +169,9 @@ public final class MiniPlaceholders {
final TagResolver.Builder builder = TagResolver.builder();
for (final Expansion expansion : expansions) {
Resolvers.applyIfNotEmpty(expansion.audiencePlaceholders(audience), builder);
Resolvers.applyIfNotEmpty(expansion.relationalPlaceholders(audience, otherAudience), builder);
Resolvers.applyIfNotEmpty(expansion.globalPlaceholders(), builder);
applyIfNotEmpty(expansion.audiencePlaceholders(audience), builder);
applyIfNotEmpty(expansion.relationalPlaceholders(audience, otherAudience), builder);
applyIfNotEmpty(expansion.globalPlaceholders(), builder);
}
return builder.build();
@@ -184,4 +185,27 @@ public final class MiniPlaceholders {
public static int getExpansionCount(){
return expansions.size();
}
/**
* Get a specific expansion by name
* <p>The name of each expansion is set when the expansion is created</p>
* <pre>
* Expansion expansion = Expansion.builder("example").build();
* expansion.register();
*
* assertThat(MiniPlaceholders.getExpansionByName("example")).isNotNull();
* </pre>
* @param name the name of the required expansion
* @return the required expansion, if not present, will return null
* @see Expansion#builder(String)
* @since 2.1.0
*/
public @Nullable Expansion getExpansionByName(final @NotNull String name) {
for (final Expansion expansion : expansions) {
if (Objects.equals(expansion.name(), name)) {
return expansion;
}
}
return null;
}
}
@@ -7,5 +7,7 @@ public enum Platform {
/**Velocity Platform */
VELOCITY,
/**Krypton Platform */
KRYPTON
KRYPTON,
/**Fabric Platform */
FABRIC
}
@@ -1,7 +1,5 @@
package io.github.miniplaceholders.test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@@ -11,6 +9,8 @@ import io.github.miniplaceholders.api.utils.TagsUtils;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import static org.junit.jupiter.api.Assertions.*;
class MiniPlaceholdersTest {
@Test
@Disabled("Cannot correctly calculate the equity of 2 TagResolvers obtained in different ways")
@@ -30,4 +30,16 @@ class MiniPlaceholdersTest {
)
);
}
@Test
void registrationTest() {
Expansion expansion = Expansion.builder("testregistration")
.build();
expansion.register();
assertTrue(expansion.registered());
assertThrows(IllegalStateException.class, expansion::register);
assertDoesNotThrow(expansion::unregister);
}
}
+1 -2
View File
@@ -1,7 +1,7 @@
plugins {
java
alias(libs.plugins.shadow)
kotlin("jvm") version "1.8.10" apply false
kotlin("jvm") version "1.8.20" apply false
}
allprojects {
@@ -16,7 +16,6 @@ dependencies {
subprojects {
repositories {
mavenCentral()
maven("https://papermc.io/repo/repository/maven-public/")
maven("https://repo.maven.apache.org/maven2/")
}
-1
View File
@@ -8,7 +8,6 @@ repositories {
includeGroup("com.mojang")
}
}
mavenCentral()
}
dependencies {
@@ -165,7 +165,7 @@ public final class PlaceholdersCommand<A> {
}
private Audience getAudience(final A possibleAudience) {
if (possibleAudience instanceof Audience audience){
if (possibleAudience instanceof Audience audience) {
return audience;
}
final Audience audience = sourceToAudience.apply(possibleAudience);
@@ -2,7 +2,7 @@ package io.github.miniplaceholders.connect;
public enum InternalPlatform {
PAPER, VELOCITY, KRYPTON;
PAPER, VELOCITY, KRYPTON, FABRIC;
private static InternalPlatform actualPlatform;
+54
View File
@@ -0,0 +1,54 @@
plugins {
id("fabric-loom") version "1.1-SNAPSHOT"
alias(libs.plugins.shadow)
}
repositories {
maven("https://oss.sonatype.org/content/repositories/snapshots")
}
val shade: Configuration by configurations.creating
dependencies {
minecraft(libs.minecraft)
mappings(loom.officialMojangMappings())
modImplementation(libs.fabric.loader)
modImplementation(libs.fabric.api)
modImplementation(libs.adventure.platform.fabric)
include(libs.adventure.platform.fabric)
modImplementation(libs.luckopermissionsapi)
include(libs.luckopermissionsapi)
shadeModule(projects.miniplaceholdersCommon)
shadeModule(projects.miniplaceholdersApi)
shadeModule(projects.miniplaceholdersConnect)
}
fun DependencyHandlerScope.shadeModule(module: ProjectDependency) {
shade(module)
implementation(module)
}
tasks {
processResources {
filteringCharset = Charsets.UTF_8.name()
filesMatching("fabric.mod.json") {
expand("version" to project.version)
}
}
compileJava {
options.encoding = Charsets.UTF_8.name()
options.release.set(17)
}
remapJar {
inputFile.set(shadowJar.get().archiveFile)
archiveFileName.set("MiniPlaceholders-Fabric-mc${libs.versions.minecraft.get()}-v${project.version}.jar")
}
shadowJar {
configurations = listOf(shade)
}
}
java {
withSourcesJar()
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}
@@ -0,0 +1,105 @@
package io.github.miniplaceholders.fabric;
import io.github.miniplaceholders.api.Expansion;
import io.github.miniplaceholders.common.PlaceholdersCommand;
import io.github.miniplaceholders.common.PlaceholdersPlugin;
import io.github.miniplaceholders.connect.InternalPlatform;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.packs.PackResources;
import net.minecraft.world.entity.Entity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.DecimalFormat;
import java.util.Arrays;
public class FabricMod implements ModInitializer, PlaceholdersPlugin {
private final Logger logger = LoggerFactory.getLogger("miniplaceholders");
private static final DecimalFormat MSPT_FORMAT = new DecimalFormat("###.###");
private final TickManager tickManager = new TickManager();
private MinecraftServer minecraftServer;
@Override
public void onInitialize() {
logger.info("Starting MiniPlaceholders Fabric");
InternalPlatform.platform(InternalPlatform.FABRIC);
ServerLifecycleEvents.SERVER_STARTING.register(minecraftServer -> {
this.minecraftServer = minecraftServer;
this.loadDefaultExpansions();
});
this.registerPlatformCommand();
}
@Override
public void loadDefaultExpansions() {
Expansion.builder("server")
.globalPlaceholder("name", Tag.selfClosingInserting(Component.text(this.minecraftServer.getServerModName())))
.globalPlaceholder("online", (queue, ctx) -> Tag.preProcessParsed(Integer.toString(this.minecraftServer.getPlayerCount())))
.globalPlaceholder("version", (ctx, queue) -> Tag.selfClosingInserting(Component.text(this.minecraftServer.getServerVersion())))
.globalPlaceholder("max_players", (ctx, queue) -> Tag.selfClosingInserting(Component.text(this.minecraftServer.getMaxPlayers())))
.globalPlaceholder("unique_joins", (queue, ctx) -> Tag.preProcessParsed(Integer.toString(this.minecraftServer.getProfileCache().load().size())))
.globalPlaceholder("tps_1m", (ctx, queue) -> Tag.preProcessParsed(tickManager.getTps1m().formattedAverage()))
.globalPlaceholder("tps_5m", (ctx, queue) -> Tag.preProcessParsed(tickManager.getTps5m().formattedAverage()))
//.globalPlaceholder("tps_15m", (ctx, queue) -> Tag.preProcessParsed(tickManager.getTps15m().formattedAverage()))
.globalPlaceholder("tick_count", (queue, ctx) -> Tag.selfClosingInserting(Component.text(this.minecraftServer.getTickCount())))
.globalPlaceholder("has_whitelist", (queue, ctx) -> Tag.preProcessParsed(Boolean.toString(this.minecraftServer.getPlayerList().isUsingWhitelist())))
.globalPlaceholder("total_chunks", (queue, ctx) -> {
int chunks = 0;
for (final ServerLevel level : this.minecraftServer.getAllLevels()) {
chunks += level.getChunkSource().getLoadedChunksCount();
}
return Tag.preProcessParsed(Integer.toString(chunks));
})
.globalPlaceholder("total_entities", (queue, ctx) -> {
int entities = 0;
for (final ServerLevel level : this.minecraftServer.getAllLevels()) {
for (final Entity ignored : level.getAllEntities()) {
entities++;
}
}
return Tag.preProcessParsed(Integer.toString(entities));
})
.globalPlaceholder("mspt", (queue, ctx) -> Tag.preProcessParsed(MSPT_FORMAT.format(this.minecraftServer.getAverageTickTime())))
.globalPlaceholder("datapack_list", (queue, ctx) ->
Tag.selfClosingInserting(this.minecraftServer.getResourceManager()
.listPacks()
.map(PackResources::packId)
.map(id -> Component.text()
.content("[")
.append(Component.text(id))
.append(Component.text("]"))
.build())
.collect(Component.toComponent(Component.space())))
)
.globalPlaceholder("datapack_count", (queue, ctx) ->
Tag.preProcessParsed(Long.toString(this.minecraftServer.getResourceManager()
.listPacks()
.count()))
)
.build()
.register();
}
@Override
public void registerPlatformCommand() {
CommandRegistrationCallback.EVENT.register((dispatcher, commandBuildContext, commandSelection) ->
dispatcher.register(PlaceholdersCommand.<CommandSourceStack>builder()
.hasPermissionCheck((source, permission) -> Permissions.check(source, permission, 4))
.toAudience(string -> this.minecraftServer.getPlayerList().getPlayerByName(string))
.playerSuggestions(() -> Arrays.asList(this.minecraftServer.getPlayerNames()))
.build()
.asBuilder("miniplaceholders"))
);
}
}
@@ -0,0 +1,59 @@
package io.github.miniplaceholders.fabric;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
/**
* Based on the MIT licensed Paper-Server patch "Further improve server tick loop".
*
* @author Daniel Ennis/Aikar
*/
final class RollingAverage {
private static final DecimalFormat TPS_FORMAT = new DecimalFormat("###.##");
static { TPS_FORMAT.setRoundingMode(RoundingMode.HALF_UP); }
private static final int TPS = 20;
private static final long SEC_IN_NANO = 1000000000;
private final int size;
private final BigDecimal[] samples;
private final long[] times;
private long time;
private BigDecimal total;
private int index = 0;
RollingAverage(final int size) {
this.size = size;
this.samples = new BigDecimal[size];
this.times = new long[size];
this.time = size * SEC_IN_NANO;
this.total = dec(TPS).multiply(dec(SEC_IN_NANO)).multiply(dec(size));
for (int i = 0; i < size; i++) {
this.samples[i] = dec(TPS);
this.times[i] = SEC_IN_NANO;
}
}
private static BigDecimal dec(final long t) {
return new BigDecimal(t);
}
void add(final BigDecimal x, final long t) {
this.time -= this.times[this.index];
this.total = this.total.subtract(this.samples[this.index].multiply(dec(this.times[this.index])));
this.samples[this.index] = x;
this.times[this.index] = t;
this.time += t;
this.total = this.total.add(x.multiply(dec(t)));
if (++this.index == this.size) {
this.index = 0;
}
}
double average() {
return this.total.divide(dec(this.time), 30, RoundingMode.HALF_UP).doubleValue();
}
String formattedAverage() {
return TPS_FORMAT.format(average());
}
}
@@ -0,0 +1,45 @@
package io.github.miniplaceholders.fabric;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import java.math.BigDecimal;
import java.math.RoundingMode;
final class TickManager {
private static final int TICK_DURATION = 20;
private static final BigDecimal TPS_BASE = new BigDecimal(1E9).multiply(new BigDecimal(TICK_DURATION));
private final RollingAverage tps1m = new RollingAverage(60);
private final RollingAverage tps5m = new RollingAverage(60 * 5);
private final RollingAverage tps15m = new RollingAverage(60 * 15);
private long lastStartTick = 0;
private long lastEndTick = 0;
TickManager() {
ServerTickEvents.START_SERVER_TICK.register(server -> this.lastStartTick = System.nanoTime());
ServerTickEvents.END_SERVER_TICK.register(server -> {
if (server.getTickCount() % TICK_DURATION == 0) {
final long diff = lastStartTick - lastEndTick;
final BigDecimal currentTps = TPS_BASE.divide(new BigDecimal(diff), 30, RoundingMode.HALF_UP);
this.tps1m.add(currentTps, diff);
this.tps5m.add(currentTps, diff);
this.tps15m.add(currentTps, diff);
this.lastEndTick = System.nanoTime();
}
});
}
public RollingAverage getTps1m() {
return tps1m;
}
public RollingAverage getTps5m() {
return tps5m;
}
public RollingAverage getTps15m() {
return tps15m;
}
}
+29
View File
@@ -0,0 +1,29 @@
{
"schemaVersion": 1,
"id": "miniplaceholders",
"version": "${version}",
"name": "MiniPlaceholders",
"description": "MiniMessage Component-based Placeholders for PaperMC, Fabric, Krypton and Velocity platforms",
"authors": [
"4drian3d"
],
"contact": {
"homepage": "https://github.com/MiniPlaceholders/MiniPlaceholders",
"sources": "https://github.com/MiniPlaceholders/MiniPlaceholders",
"issues": "https://github.com/MiniPlaceholders/MiniPlaceholders/issues"
},
"license": "GPL",
"environment": "server",
"entrypoints": {
"main": [
"io.github.miniplaceholders.fabric.FabricMod"
]
},
"depends": {
"fabricloader": ">=0.14.19",
"fabric": "*",
"java": ">=17",
"minecraft": "~1.19.4",
"fabric-permissions-api-v0": "*"
}
}
+3 -1
View File
@@ -1,3 +1,5 @@
group = io.github.miniplaceholders
version = 2.0.1
version = 2.1.0-SNAPSHOT
description = MiniMessage Component-based Placeholders for PaperMC, Krypton and Velocity platforms
org.gradle.jvmargs=-Xmx2G
+17 -6
View File
@@ -4,20 +4,25 @@ metadata.format.version = "1.1"
velocity = "3.2.0-SNAPSHOT"
paper = "1.19.4-R0.1-SNAPSHOT"
krypton = "7f7a457cdf"
krypton = "cbfaff4aa4"
minecraft = "1.19.4"
runtask = "2.0.1"
pluginyml = "0.5.3"
userdev = "1.5.3"
userdev = "1.5.4"
blossom = "1.3.1"
indra = "3.0.1"
shadow = "8.1.0"
jmh = "0.7.0"
shadow = "8.1.1"
jmh = "0.7.1"
dokka = "1.8.10"
adventure = "4.13.0"
adventure = "4.13.1"
adventurefabric = "5.8.0"
brigadier = "1.0.500"
kotlin="1.8.10"
kotlin="1.8.20"
fabric-api = "0.78.0+1.19.4"
fabric-loader = "0.14.19"
[libraries]
@@ -25,9 +30,15 @@ kotlin="1.8.10"
velocity = { group = "com.velocitypowered", name = "velocity-api", version.ref = "velocity" }
paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" }
krypton-server = { group = "org.kryptonmc", name = "krypton-server", version.ref = "krypton" }
minecraft = { group = "com.mojang", name = "minecraft", version.ref = "minecraft" }
fabric-api = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fabric-api" }
fabric-loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fabric-loader" }
luckopermissionsapi = { group = "me.lucko", name = "fabric-permissions-api", version = "0.2-SNAPSHOT" }
adventure-api = { group = "net.kyori", name = "adventure-api", version.ref = "adventure" }
adventure-minimesssage = { group = "net.kyori", name = "adventure-text-minimessage", version.ref = "adventure" }
adventure-platform-fabric = { group = "net.kyori", name = "adventure-platform-fabric", version.ref = "adventurefabric" }
brigadier = { group = "com.mojang", name = "brigadier", version.ref = "brigadier" }
Binary file not shown.
Vendored
+4 -3
View File
@@ -85,9 +85,6 @@ done
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -197,6 +194,10 @@ if "$cygwin" || "$msys" ; then
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
-2
View File
@@ -1,2 +0,0 @@
jdk:
- openjdk17
+3 -3
View File
@@ -20,8 +20,8 @@ dependencies {
implementation(projects.miniplaceholdersKotlinExt)
}
tasks {
compileKotlin {
kotlinOptions.jvmTarget = "17"
kotlin {
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}
+2 -1
View File
@@ -2,4 +2,5 @@ name: MiniPlaceholders
version: '${version}'
main: io.github.miniplaceholders.paper.PaperPlugin
description: MiniMessage Component-based Placeholders for PaperMC, Krypton and Velocity platforms
api-version: '1.19'
api-version: '1.19'
folia-supported: true
+4 -2
View File
@@ -3,11 +3,12 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
rootProject.name = "miniplaceholders-parent"
pluginManagement {
@Suppress("UnstableApiUsage")
includeBuild("build-logic")
repositories {
gradlePluginPortal()
mavenCentral()
maven("https://maven.fabricmc.net/")
maven("https://maven.quiltmc.org/repository/release/")
}
}
@@ -22,7 +23,8 @@ arrayOf(
"common",
"paper",
"velocity",
"krypton"
"krypton",
"fabric"
).forEach {
include("miniplaceholders-$it")
project(":miniplaceholders-$it").projectDir = file(it)