aboutsummaryrefslogtreecommitdiff
path: root/spark-forge/src
diff options
context:
space:
mode:
authorembeddedt <42941056+embeddedt@users.noreply.github.com>2022-12-26 18:58:46 -0500
committerembeddedt <42941056+embeddedt@users.noreply.github.com>2022-12-26 18:58:46 -0500
commit1075665def4a41cf0064255a6da1d1a652f5d473 (patch)
tree11bba64e8f28ce8b83adc05252b75f17e2ccbf6a /spark-forge/src
parentd9550259c1995d21fc345c58f2e531fdecf75acd (diff)
parentd9655c40c02aef137c7a6a00a1cc90a1e6fb08d1 (diff)
downloadspark-1075665def4a41cf0064255a6da1d1a652f5d473.tar.gz
spark-1075665def4a41cf0064255a6da1d1a652f5d473.tar.bz2
spark-1075665def4a41cf0064255a6da1d1a652f5d473.zip
Merge remote-tracking branch 'lucko/master' into forge-1.7.10
Diffstat (limited to 'spark-forge/src')
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeClassSourceLookup.java2
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeExtraMetadataProvider.java75
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerConfigProvider.java4
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java42
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java7
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java41
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeSparkPlugin.java16
-rw-r--r--spark-forge/src/main/resources/META-INF/accesstransformer.cfg4
8 files changed, 178 insertions, 13 deletions
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClassSourceLookup.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClassSourceLookup.java
index 7900bc3..82d66ca 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClassSourceLookup.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClassSourceLookup.java
@@ -20,7 +20,7 @@
package me.lucko.spark.forge;
-import me.lucko.spark.common.util.ClassSourceLookup;
+import me.lucko.spark.common.sampler.source.ClassSourceLookup;
import cpw.mods.modlauncher.TransformingClassLoader;
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeExtraMetadataProvider.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeExtraMetadataProvider.java
new file mode 100644
index 0000000..cac2771
--- /dev/null
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeExtraMetadataProvider.java
@@ -0,0 +1,75 @@
+/*
+ * This file is part of spark.
+ *
+ * Copyright (c) lucko (Luck) <luck@lucko.me>
+ * Copyright (c) contributors
+ *
+ * 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
+ * (at your option) 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 <http://www.gnu.org/licenses/>.
+ */
+
+package me.lucko.spark.forge;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+import me.lucko.spark.common.platform.MetadataProvider;
+
+import net.minecraft.server.packs.repository.Pack;
+import net.minecraft.server.packs.repository.PackRepository;
+import net.minecraft.server.packs.repository.PackSource;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class ForgeExtraMetadataProvider implements MetadataProvider {
+
+ private final PackRepository resourcePackManager;
+
+ public ForgeExtraMetadataProvider(PackRepository resourcePackManager) {
+ this.resourcePackManager = resourcePackManager;
+ }
+
+ @Override
+ public Map<String, JsonElement> get() {
+ Map<String, JsonElement> metadata = new LinkedHashMap<>();
+ metadata.put("datapacks", datapackMetadata());
+ return metadata;
+ }
+
+ private JsonElement datapackMetadata() {
+ JsonObject datapacks = new JsonObject();
+ for (Pack profile : this.resourcePackManager.getSelectedPacks()) {
+ JsonObject obj = new JsonObject();
+ obj.addProperty("name", profile.getTitle().getString());
+ obj.addProperty("description", profile.getDescription().getString());
+ obj.addProperty("source", resourcePackSource(profile.getPackSource()));
+ datapacks.add(profile.getId(), obj);
+ }
+ return datapacks;
+ }
+
+ private static String resourcePackSource(PackSource source) {
+ if (source == PackSource.DEFAULT) {
+ return "none";
+ } else if (source == PackSource.BUILT_IN) {
+ return "builtin";
+ } else if (source == PackSource.WORLD) {
+ return "world";
+ } else if (source == PackSource.SERVER) {
+ return "server";
+ } else {
+ return "unknown";
+ }
+ }
+}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerConfigProvider.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerConfigProvider.java
index baa1358..6feba52 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerConfigProvider.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerConfigProvider.java
@@ -23,14 +23,14 @@ package me.lucko.spark.forge;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
-import me.lucko.spark.common.platform.serverconfig.AbstractServerConfigProvider;
import me.lucko.spark.common.platform.serverconfig.ConfigParser;
import me.lucko.spark.common.platform.serverconfig.PropertiesConfigParser;
+import me.lucko.spark.common.platform.serverconfig.ServerConfigProvider;
import java.util.Collection;
import java.util.Map;
-public class ForgeServerConfigProvider extends AbstractServerConfigProvider {
+public class ForgeServerConfigProvider extends ServerConfigProvider {
/** A map of provided files and their type */
private static final Map<String, ConfigParser> FILES;
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java
index 1d65d6a..4750c08 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java
@@ -34,6 +34,7 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.ChunkPos;
+import net.minecraft.world.level.entity.EntityLookup;
import net.minecraft.world.level.entity.EntitySection;
import net.minecraft.world.level.entity.EntitySectionStorage;
import net.minecraft.world.level.entity.PersistentEntitySectionManager;
@@ -68,8 +69,25 @@ public abstract class ForgeWorldInfoProvider implements WorldInfoProvider {
}
@Override
- public Result<ForgeChunkInfo> poll() {
- Result<ForgeChunkInfo> data = new Result<>();
+ public CountsResult pollCounts() {
+ int players = this.server.getPlayerCount();
+ int entities = 0;
+ int chunks = 0;
+
+ for (ServerLevel level : this.server.getAllLevels()) {
+ PersistentEntitySectionManager<Entity> entityManager = level.entityManager;
+ EntityLookup<Entity> entityIndex = entityManager.visibleEntityStorage;
+
+ entities += entityIndex.count();
+ chunks += level.getChunkSource().getLoadedChunksCount();
+ }
+
+ return new CountsResult(players, entities, -1, chunks);
+ }
+
+ @Override
+ public ChunksResult<ForgeChunkInfo> pollChunks() {
+ ChunksResult<ForgeChunkInfo> data = new ChunksResult<>();
for (ServerLevel level : this.server.getAllLevels()) {
PersistentEntitySectionManager<Entity> entityManager = level.entityManager;
@@ -91,8 +109,24 @@ public abstract class ForgeWorldInfoProvider implements WorldInfoProvider {
}
@Override
- public Result<ForgeChunkInfo> poll() {
- Result<ForgeChunkInfo> data = new Result<>();
+ public CountsResult pollCounts() {
+ ClientLevel level = this.client.level;
+ if (level == null) {
+ return null;
+ }
+
+ TransientEntitySectionManager<Entity> entityManager = level.entityStorage;
+ EntityLookup<Entity> entityIndex = entityManager.entityStorage;
+
+ int entities = entityIndex.count();
+ int chunks = level.getChunkSource().getLoadedChunksCount();
+
+ return new CountsResult(-1, entities, -1, chunks);
+ }
+
+ @Override
+ public ChunksResult<ForgeChunkInfo> pollChunks() {
+ ChunksResult<ForgeChunkInfo> data = new ChunksResult<>();
ClientLevel level = this.client.level;
if (level == null) {
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java
index a4c6bd1..a8c7c92 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java
@@ -27,12 +27,14 @@ import com.mojang.brigadier.suggestion.SuggestionProvider;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
+import me.lucko.spark.common.platform.MetadataProvider;
import me.lucko.spark.common.platform.PlatformInfo;
import me.lucko.spark.common.platform.world.WorldInfoProvider;
import me.lucko.spark.common.sampler.ThreadDumper;
import me.lucko.spark.common.tick.TickHook;
import me.lucko.spark.common.tick.TickReporter;
import me.lucko.spark.forge.ForgeCommandSender;
+import me.lucko.spark.forge.ForgeExtraMetadataProvider;
import me.lucko.spark.forge.ForgePlatformInfo;
import me.lucko.spark.forge.ForgeSparkMod;
import me.lucko.spark.forge.ForgeTickHook;
@@ -137,6 +139,11 @@ public class ForgeClientSparkPlugin extends ForgeSparkPlugin implements Command<
}
@Override
+ public MetadataProvider createExtraMetadataProvider() {
+ return new ForgeExtraMetadataProvider(this.minecraft.getResourcePackRepository());
+ }
+
+ @Override
public PlatformInfo getPlatformInfo() {
return new ForgePlatformInfo(PlatformInfo.Type.CLIENT);
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java
index 1aeb2b1..8737057 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java
@@ -30,6 +30,7 @@ import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import me.lucko.spark.common.monitor.ping.PlayerPingProvider;
+import me.lucko.spark.common.platform.MetadataProvider;
import me.lucko.spark.common.platform.PlatformInfo;
import me.lucko.spark.common.platform.serverconfig.ServerConfigProvider;
import me.lucko.spark.common.platform.world.WorldInfoProvider;
@@ -37,6 +38,7 @@ import me.lucko.spark.common.sampler.ThreadDumper;
import me.lucko.spark.common.tick.TickHook;
import me.lucko.spark.common.tick.TickReporter;
import me.lucko.spark.forge.ForgeCommandSender;
+import me.lucko.spark.forge.ForgeExtraMetadataProvider;
import me.lucko.spark.forge.ForgePlatformInfo;
import me.lucko.spark.forge.ForgePlayerPingProvider;
import me.lucko.spark.forge.ForgeServerConfigProvider;
@@ -65,6 +67,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -75,6 +78,19 @@ public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command<
plugin.enable();
}
+ private static final PermissionResolver<Boolean> DEFAULT_PERMISSION_VALUE = (player, playerUUID, context) -> {
+ if (player == null) {
+ return false;
+ }
+
+ MinecraftServer server = player.getServer();
+ if (server != null && server.isSingleplayerOwner(player.getGameProfile())) {
+ return true;
+ }
+
+ return player.hasPermissions(4);
+ };
+
private final MinecraftServer server;
private final ThreadDumper gameThreadDumper;
private Map<String, PermissionNode<Boolean>> registeredPermissions = Collections.emptyMap();
@@ -113,8 +129,6 @@ public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command<
@SubscribeEvent
public void onPermissionGather(PermissionGatherEvent.Nodes e) {
- PermissionResolver<Boolean> defaultValue = (player, playerUUID, context) -> player != null && player.hasPermissions(4);
-
// collect all possible permissions
List<String> permissions = this.platform.getCommands().stream()
.map(me.lucko.spark.common.command.Command::primaryAlias)
@@ -125,10 +139,24 @@ public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command<
// register permissions with forge & keep a copy for lookup
ImmutableMap.Builder<String, PermissionNode<Boolean>> builder = ImmutableMap.builder();
+
+ Map<String, PermissionNode<?>> alreadyRegistered = e.getNodes().stream().collect(Collectors.toMap(PermissionNode::getNodeName, Function.identity()));
+
for (String permission : permissions) {
- PermissionNode<Boolean> node = new PermissionNode<>("spark", permission, PermissionTypes.BOOLEAN, defaultValue);
+ String permissionString = "spark." + permission;
+
+ // there's a weird bug where it seems that this listener can be called twice, causing an
+ // IllegalArgumentException to be thrown the second time e.addNodes is called.
+ PermissionNode<?> existing = alreadyRegistered.get(permissionString);
+ if (existing != null) {
+ //noinspection unchecked
+ builder.put(permissionString, (PermissionNode<Boolean>) existing);
+ continue;
+ }
+
+ PermissionNode<Boolean> node = new PermissionNode<>("spark", permission, PermissionTypes.BOOLEAN, DEFAULT_PERMISSION_VALUE);
e.addNodes(node);
- builder.put("spark." + permission, node);
+ builder.put(permissionString, node);
}
this.registeredPermissions = builder.build();
}
@@ -220,6 +248,11 @@ public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command<
}
@Override
+ public MetadataProvider createExtraMetadataProvider() {
+ return new ForgeExtraMetadataProvider(this.server.getPackRepository());
+ }
+
+ @Override
public WorldInfoProvider createWorldInfoProvider() {
return new ForgeWorldInfoProvider.Server(this.server);
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeSparkPlugin.java
index 36a7ce8..56061b9 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeSparkPlugin.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeSparkPlugin.java
@@ -34,18 +34,22 @@ import com.mojang.brigadier.tree.LiteralCommandNode;
import me.lucko.spark.common.SparkPlatform;
import me.lucko.spark.common.SparkPlugin;
import me.lucko.spark.common.command.sender.CommandSender;
-import me.lucko.spark.common.util.ClassSourceLookup;
+import me.lucko.spark.common.sampler.source.ClassSourceLookup;
+import me.lucko.spark.common.sampler.source.SourceMetadata;
import me.lucko.spark.common.util.SparkThreadFactory;
import me.lucko.spark.forge.ForgeClassSourceLookup;
import me.lucko.spark.forge.ForgeSparkMod;
import net.minecraft.commands.CommandSource;
+import net.minecraftforge.fml.ModList;
+import net.minecraftforge.forgespi.language.IModInfo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.nio.file.Path;
import java.util.Arrays;
+import java.util.Collection;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -110,6 +114,16 @@ public abstract class ForgeSparkPlugin implements SparkPlugin {
return new ForgeClassSourceLookup();
}
+ @Override
+ public Collection<SourceMetadata> getKnownSources() {
+ return SourceMetadata.gather(
+ ModList.get().getMods(),
+ IModInfo::getModId,
+ mod -> mod.getVersion().toString(),
+ mod -> null // ?
+ );
+ }
+
protected CompletableFuture<Suggestions> generateSuggestions(CommandSender sender, String[] args, SuggestionsBuilder builder) {
SuggestionsBuilder suggestions;
diff --git a/spark-forge/src/main/resources/META-INF/accesstransformer.cfg b/spark-forge/src/main/resources/META-INF/accesstransformer.cfg
index 39e9c1a..2699a0e 100644
--- a/spark-forge/src/main/resources/META-INF/accesstransformer.cfg
+++ b/spark-forge/src/main/resources/META-INF/accesstransformer.cfg
@@ -1,5 +1,7 @@
public net.minecraft.server.level.ServerLevel f_143244_ # entityManager
public net.minecraft.world.level.entity.PersistentEntitySectionManager f_157495_ # sectionStorage
+public net.minecraft.world.level.entity.PersistentEntitySectionManager f_157494_ # visibleEntityStorage
public net.minecraft.client.multiplayer.ClientLevel f_171631_ # entityStorage
public net.minecraft.world.level.entity.TransientEntitySectionManager f_157638_ # sectionStorage
-public net.minecraft.client.Minecraft f_91018_ # gameThread \ No newline at end of file
+public net.minecraft.world.level.entity.TransientEntitySectionManager f_157637_ # entityStorage
+public net.minecraft.client.Minecraft f_91018_ # gameThread