mirror of
https://github.com/GeyserMC/Floodgate.git
synced 2025-12-22 16:29:25 +00:00
Commands now work
This commit is contained in:
@@ -7,36 +7,37 @@ import net.fabricmc.api.ModInitializer;
|
|||||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.kyori.adventure.platform.fabric.FabricServerAudiences;
|
import net.kyori.adventure.platform.fabric.FabricServerAudiences;
|
||||||
import net.minecraft.server.MinecraftServer;
|
|
||||||
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
||||||
import org.geysermc.floodgate.module.FabricAddonModule;
|
import org.geysermc.floodgate.module.*;
|
||||||
import org.geysermc.floodgate.module.FabricCommandModule;
|
import org.geysermc.floodgate.pluginmessage.FabricSkinApplier;
|
||||||
import org.geysermc.floodgate.module.FabricListenerModule;
|
import org.geysermc.floodgate.util.FabricCommandUtil;
|
||||||
import org.geysermc.floodgate.module.FabricPlatformModule;
|
|
||||||
import org.geysermc.floodgate.module.ServerCommonModule;
|
|
||||||
|
|
||||||
public class FabricMod implements ModInitializer {
|
public class FabricMod implements ModInitializer {
|
||||||
private MinecraftServer server;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitialize() {
|
public void onInitialize() {
|
||||||
FabricInjector.setInstance(new FabricInjector());
|
FabricInjector.setInstance(new FabricInjector());
|
||||||
|
|
||||||
|
Injector injector = Guice.createInjector(
|
||||||
|
new ServerCommonModule(FabricLoader.getInstance().getConfigDir().resolve("floodgate")),
|
||||||
|
new FabricPlatformModule()
|
||||||
|
);
|
||||||
|
|
||||||
|
FabricPlatform platform = injector.getInstance(FabricPlatform.class);
|
||||||
|
|
||||||
|
platform.enable(new FabricCommandModule());
|
||||||
|
|
||||||
ServerLifecycleEvents.SERVER_STARTED.register((server) -> {
|
ServerLifecycleEvents.SERVER_STARTED.register((server) -> {
|
||||||
long ctm = System.currentTimeMillis();
|
long ctm = System.currentTimeMillis();
|
||||||
this.server = server;
|
|
||||||
|
|
||||||
FabricServerAudiences adventure = FabricServerAudiences.of(server);
|
FabricServerAudiences adventure = FabricServerAudiences.of(server);
|
||||||
|
|
||||||
Injector injector = Guice.createInjector(
|
// Stupid hack, see the class for more information
|
||||||
new ServerCommonModule(FabricLoader.getInstance().getConfigDir().resolve("floodgate")),
|
// This can probably be Guice-i-fied but that is beyond me
|
||||||
new FabricPlatformModule(this.server, adventure)
|
FabricCommandUtil.setLaterVariables(server, adventure);
|
||||||
);
|
FabricSkinApplier.setServer(server);
|
||||||
|
|
||||||
injector.getInstance(FabricPlatform.class)
|
platform.enable(
|
||||||
.enable(
|
|
||||||
new FabricAddonModule(),
|
new FabricAddonModule(),
|
||||||
new FabricCommandModule(),
|
|
||||||
new FabricListenerModule()
|
new FabricListenerModule()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ import com.google.inject.Provides;
|
|||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
import com.google.inject.name.Named;
|
import com.google.inject.name.Named;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import net.kyori.adventure.platform.fabric.FabricServerAudiences;
|
|
||||||
import net.minecraft.server.MinecraftServer;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.geysermc.floodgate.api.FloodgateApi;
|
import org.geysermc.floodgate.api.FloodgateApi;
|
||||||
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
||||||
@@ -24,20 +22,6 @@ import org.geysermc.floodgate.util.LanguageManager;
|
|||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public final class FabricPlatformModule extends AbstractModule {
|
public final class FabricPlatformModule extends AbstractModule {
|
||||||
private final MinecraftServer server;
|
|
||||||
private final FabricServerAudiences adventure;
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
public MinecraftServer server() {
|
|
||||||
return server;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
public FabricServerAudiences adventure() {
|
|
||||||
return adventure;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
@@ -51,7 +35,7 @@ public final class FabricPlatformModule extends AbstractModule {
|
|||||||
FloodgateApi api,
|
FloodgateApi api,
|
||||||
FloodgateLogger logger,
|
FloodgateLogger logger,
|
||||||
LanguageManager languageManager) {
|
LanguageManager languageManager) {
|
||||||
return new FabricCommandUtil(adventure, api, logger, languageManager, server);
|
return new FabricCommandUtil(api, logger, languageManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@@ -96,7 +80,7 @@ public final class FabricPlatformModule extends AbstractModule {
|
|||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
public SkinApplier skinApplier(MinecraftServer server) {
|
public SkinApplier skinApplier() {
|
||||||
return new FabricSkinApplier(server);
|
return new FabricSkinApplier();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,12 +14,13 @@ import org.geysermc.floodgate.skin.SkinApplier;
|
|||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public final class FabricSkinApplier implements SkinApplier {
|
public final class FabricSkinApplier implements SkinApplier {
|
||||||
private final MinecraftServer server;
|
// See FabricCommandUtil
|
||||||
|
private static MinecraftServer SERVER;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void applySkin(FloodgatePlayer floodgatePlayer, JsonObject skinResult) {
|
public void applySkin(FloodgatePlayer floodgatePlayer, JsonObject skinResult) {
|
||||||
this.server.execute(() -> {
|
SERVER.execute(() -> {
|
||||||
ServerPlayerEntity bedrockPlayer = this.server.getPlayerManager().getPlayer(floodgatePlayer.getCorrectUniqueId());
|
ServerPlayerEntity bedrockPlayer = SERVER.getPlayerManager().getPlayer(floodgatePlayer.getCorrectUniqueId());
|
||||||
if (bedrockPlayer == null) {
|
if (bedrockPlayer == null) {
|
||||||
// Disconnected probably?
|
// Disconnected probably?
|
||||||
return;
|
return;
|
||||||
@@ -36,7 +37,7 @@ public final class FabricSkinApplier implements SkinApplier {
|
|||||||
properties.put("textures", property);
|
properties.put("textures", property);
|
||||||
|
|
||||||
// Skin is applied - now it's time to refresh the player for everyone. Oof.
|
// Skin is applied - now it's time to refresh the player for everyone. Oof.
|
||||||
for (ServerPlayerEntity otherPlayer : this.server.getPlayerManager().getPlayerList()) {
|
for (ServerPlayerEntity otherPlayer : SERVER.getPlayerManager().getPlayerList()) {
|
||||||
if (otherPlayer == bedrockPlayer) {
|
if (otherPlayer == bedrockPlayer) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -55,4 +56,8 @@ public final class FabricSkinApplier implements SkinApplier {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setServer(MinecraftServer server) {
|
||||||
|
SERVER = server;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,11 +25,15 @@ import java.util.*;
|
|||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public final class FabricCommandUtil implements CommandUtil {
|
public final class FabricCommandUtil implements CommandUtil {
|
||||||
@Getter private final FabricServerAudiences adventure;
|
// Static because commands *need* to be initialized before the server is available
|
||||||
|
// Otherwise it would be a class variable
|
||||||
|
private static MinecraftServer SERVER;
|
||||||
|
// This one also requires the server so it's bundled in
|
||||||
|
private static FabricServerAudiences ADVENTURE;
|
||||||
|
|
||||||
@Getter private final FloodgateApi api;
|
@Getter private final FloodgateApi api;
|
||||||
@Getter private final FloodgateLogger logger;
|
@Getter private final FloodgateLogger logger;
|
||||||
@Getter private final LanguageManager manager;
|
@Getter private final LanguageManager manager;
|
||||||
@Getter private final MinecraftServer server;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull UserAudience getAudience(@NonNull Object source) {
|
public @NonNull UserAudience getAudience(@NonNull Object source) {
|
||||||
@@ -46,8 +50,8 @@ public final class FabricCommandUtil implements CommandUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable UserAudience getAudienceByUuid(@NonNull UUID uuid) {
|
public UserAudience getAudienceByUuid(@NonNull UUID uuid) {
|
||||||
ServerPlayerEntity player = this.server.getPlayerManager().getPlayer(uuid);
|
ServerPlayerEntity player = SERVER.getPlayerManager().getPlayer(uuid);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
return getAudience0(player);
|
return getAudience0(player);
|
||||||
}
|
}
|
||||||
@@ -55,8 +59,8 @@ public final class FabricCommandUtil implements CommandUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable UserAudience getAudienceByUsername(@NonNull String username) {
|
public UserAudience getAudienceByUsername(@NonNull String username) {
|
||||||
ServerPlayerEntity player = this.server.getPlayerManager().getPlayer(username);
|
ServerPlayerEntity player = SERVER.getPlayerManager().getPlayer(username);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
return getAudience0(player);
|
return getAudience0(player);
|
||||||
}
|
}
|
||||||
@@ -66,10 +70,11 @@ public final class FabricCommandUtil implements CommandUtil {
|
|||||||
private FabricUserAudience getAudience0(ServerPlayerEntity player) {
|
private FabricUserAudience getAudience0(ServerPlayerEntity player) {
|
||||||
// Marked as internal??? Should probably find a better way to get this.
|
// Marked as internal??? Should probably find a better way to get this.
|
||||||
Locale locale = ((ConnectionAccess) player.networkHandler.getConnection()).getChannel().attr(FriendlyByteBufBridge.CHANNEL_LOCALE).get();
|
Locale locale = ((ConnectionAccess) player.networkHandler.getConnection()).getChannel().attr(FriendlyByteBufBridge.CHANNEL_LOCALE).get();
|
||||||
return new FabricUserAudience(
|
return new FabricUserAudience.NamedFabricUserAudience(
|
||||||
|
player.getName().asString(),
|
||||||
player.getUuid(), locale != null ?
|
player.getUuid(), locale != null ?
|
||||||
locale.getLanguage().toLowerCase(Locale.ROOT) + "_" + locale.getCountry().toUpperCase(Locale.ROOT) :
|
locale.getLanguage().toLowerCase(Locale.ROOT) + "_" + locale.getCountry().toUpperCase(Locale.ROOT) :
|
||||||
manager.getDefaultLocale(), player.getCommandSource(), this);
|
manager.getDefaultLocale(), player.getCommandSource(), this, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -80,16 +85,16 @@ public final class FabricCommandUtil implements CommandUtil {
|
|||||||
@Override
|
@Override
|
||||||
public @NonNull UserAudience getOfflineAudienceByUsername(@NonNull String username) {
|
public @NonNull UserAudience getOfflineAudienceByUsername(@NonNull String username) {
|
||||||
UUID uuid = null;
|
UUID uuid = null;
|
||||||
GameProfile profile = this.server.getUserCache().findByName(username);
|
GameProfile profile = SERVER.getUserCache().findByName(username);
|
||||||
if (profile != null) {
|
if (profile != null) {
|
||||||
uuid = profile.getId();
|
uuid = profile.getId();
|
||||||
}
|
}
|
||||||
return new FabricUserAudience(uuid, username, null, this);
|
return new FabricUserAudience.NamedFabricUserAudience(username, uuid, username, null, this, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull Collection<String> getOnlineUsernames(UserAudienceArgument.@NonNull PlayerType limitTo) {
|
public @NonNull Collection<String> getOnlineUsernames(UserAudienceArgument.@NonNull PlayerType limitTo) {
|
||||||
List<ServerPlayerEntity> players = this.server.getPlayerManager().getPlayerList();
|
List<ServerPlayerEntity> players = SERVER.getPlayerManager().getPlayerList();
|
||||||
|
|
||||||
Collection<String> usernames = new ArrayList<>();
|
Collection<String> usernames = new ArrayList<>();
|
||||||
switch (limitTo) {
|
switch (limitTo) {
|
||||||
@@ -120,7 +125,14 @@ public final class FabricCommandUtil implements CommandUtil {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(Object player, String locale, CommandMessage message, Object... args) {
|
public void sendMessage(Object player, String locale, CommandMessage message, Object... args) {
|
||||||
getPlayer(player).sendMessage(translateAndTransform(locale, message, args), false);
|
ServerCommandSource commandSource = (ServerCommandSource) player;
|
||||||
|
if (commandSource.getEntity() instanceof ServerPlayerEntity) {
|
||||||
|
SERVER.execute(() -> ((ServerPlayerEntity) commandSource.getEntity())
|
||||||
|
.sendMessage(translateAndTransform(locale, message, args), false));
|
||||||
|
} else {
|
||||||
|
// Console?
|
||||||
|
logger.info(message.translateMessage(manager, locale, args));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -131,14 +143,14 @@ public final class FabricCommandUtil implements CommandUtil {
|
|||||||
@Override
|
@Override
|
||||||
public boolean whitelistPlayer(String xuid, String username) {
|
public boolean whitelistPlayer(String xuid, String username) {
|
||||||
GameProfile profile = new GameProfile(Utils.getJavaUuid(xuid), username);
|
GameProfile profile = new GameProfile(Utils.getJavaUuid(xuid), username);
|
||||||
this.server.getPlayerManager().getWhitelist().add(new WhitelistEntry(profile));
|
SERVER.getPlayerManager().getWhitelist().add(new WhitelistEntry(profile));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean removePlayerFromWhitelist(String xuid, String username) {
|
public boolean removePlayerFromWhitelist(String xuid, String username) {
|
||||||
GameProfile profile = new GameProfile(Utils.getJavaUuid(xuid), username);
|
GameProfile profile = new GameProfile(Utils.getJavaUuid(xuid), username);
|
||||||
this.server.getPlayerManager().getWhitelist().remove(profile);
|
SERVER.getPlayerManager().getWhitelist().remove(profile);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,7 +159,7 @@ public final class FabricCommandUtil implements CommandUtil {
|
|||||||
ServerCommandSource source = (ServerCommandSource) instance;
|
ServerCommandSource source = (ServerCommandSource) instance;
|
||||||
return source.getPlayer();
|
return source.getPlayer();
|
||||||
} catch (ClassCastException | CommandSyntaxException exception) {
|
} catch (ClassCastException | CommandSyntaxException exception) {
|
||||||
logger.error("Failed to cast {} to Player", instance.getClass().getName());
|
logger.error("Failed to cast {} as a player", instance.getClass().getName());
|
||||||
throw new RuntimeException();
|
throw new RuntimeException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -155,4 +167,13 @@ public final class FabricCommandUtil implements CommandUtil {
|
|||||||
public Text translateAndTransform(String locale, CommandMessage message, Object... args) {
|
public Text translateAndTransform(String locale, CommandMessage message, Object... args) {
|
||||||
return Text.of(message.translateMessage(manager, locale, args));
|
return Text.of(message.translateMessage(manager, locale, args));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FabricServerAudiences getAdventure() {
|
||||||
|
return ADVENTURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setLaterVariables(MinecraftServer server, FabricServerAudiences adventure) {
|
||||||
|
SERVER = server;
|
||||||
|
ADVENTURE = adventure;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.geysermc.floodgate.util;
|
package org.geysermc.floodgate.util;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import me.lucko.fabric.api.permissions.v0.Permissions;
|
||||||
import net.kyori.adventure.audience.Audience;
|
import net.kyori.adventure.audience.Audience;
|
||||||
import net.kyori.adventure.audience.ForwardingAudience;
|
import net.kyori.adventure.audience.ForwardingAudience;
|
||||||
import net.kyori.adventure.audience.MessageType;
|
import net.kyori.adventure.audience.MessageType;
|
||||||
@@ -15,7 +16,7 @@ import org.geysermc.floodgate.player.UserAudience;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public final class FabricUserAudience implements UserAudience, ForwardingAudience.Single {
|
public class FabricUserAudience implements UserAudience, ForwardingAudience.Single {
|
||||||
private final UUID uuid;
|
private final UUID uuid;
|
||||||
private final String locale;
|
private final String locale;
|
||||||
private final ServerCommandSource source;
|
private final ServerCommandSource source;
|
||||||
@@ -33,6 +34,10 @@ public final class FabricUserAudience implements UserAudience, ForwardingAudienc
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull String username() {
|
public @NonNull String username() {
|
||||||
|
if (source == null) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
return source.getName();
|
return source.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,17 +53,12 @@ public final class FabricUserAudience implements UserAudience, ForwardingAudienc
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(@NonNull String permission) {
|
public boolean hasPermission(@NonNull String permission) {
|
||||||
//TODO
|
return Permissions.check(source, permission);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(@NonNull Identity source, @NonNull Component message, @NonNull MessageType type) {
|
public void sendMessage(@NonNull Identity source, @NonNull Component message, @NonNull MessageType type) {
|
||||||
if (this.source.getEntity() instanceof ServerPlayerEntity) {
|
commandUtil.getAdventure().audience(this.source).sendMessage(message);
|
||||||
((ServerPlayerEntity) this.source.getEntity()).sendMessage(
|
|
||||||
commandUtil.getAdventure().toNative(message), false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -83,4 +83,34 @@ public final class FabricUserAudience implements UserAudience, ForwardingAudienc
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used whenever a name has been explicitly defined for us. Most helpful in offline players.
|
||||||
|
*/
|
||||||
|
public static final class NamedFabricUserAudience extends FabricUserAudience implements PlayerAudience {
|
||||||
|
private final String name;
|
||||||
|
private final boolean online;
|
||||||
|
|
||||||
|
public NamedFabricUserAudience(
|
||||||
|
String name,
|
||||||
|
UUID uuid,
|
||||||
|
String locale,
|
||||||
|
ServerCommandSource source,
|
||||||
|
FabricCommandUtil commandUtil,
|
||||||
|
boolean online) {
|
||||||
|
super(uuid, locale, source, commandUtil);
|
||||||
|
this.name = name;
|
||||||
|
this.online = online;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NonNull String username() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean online() {
|
||||||
|
return online;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user