1
0
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:
Camotoy
2021-03-29 13:09:57 -04:00
parent 312c59f67d
commit 71395ed659
5 changed files with 103 additions and 62 deletions

View File

@@ -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()
); );

View File

@@ -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();
} }
} }

View File

@@ -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;
}
} }

View File

@@ -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;
}
} }

View File

@@ -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;
}
}
} }