blob: 7ca0ac3f6bc7abfd46e48869027e963d42243ff5 [file] [log] [blame] [raw]
package us.myles.ViaVersion;
import com.google.gson.JsonObject;
import com.google.inject.Inject;
import lombok.Getter;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.chat.ComponentSerializer;
import org.spongepowered.api.Game;
import org.spongepowered.api.config.DefaultConfig;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.game.state.GameAboutToStartServerEvent;
import org.spongepowered.api.event.game.state.GameInitializationEvent;
import org.spongepowered.api.event.game.state.GameStoppingServerEvent;
import org.spongepowered.api.plugin.Plugin;
import org.spongepowered.api.plugin.PluginContainer;
import org.spongepowered.api.scheduler.Task;
import org.spongepowered.api.text.serializer.TextSerializers;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.ViaAPI;
import us.myles.ViaVersion.api.command.ViaCommandSender;
import us.myles.ViaVersion.api.configuration.ConfigurationProvider;
import us.myles.ViaVersion.api.platform.TaskId;
import us.myles.ViaVersion.api.platform.ViaPlatform;
import us.myles.ViaVersion.dump.PluginInfo;
import us.myles.ViaVersion.sponge.VersionInfo;
import us.myles.ViaVersion.sponge.commands.SpongeCommandHandler;
import us.myles.ViaVersion.sponge.commands.SpongeCommandSender;
import us.myles.ViaVersion.sponge.platform.*;
import us.myles.ViaVersion.sponge.util.LoggerWrapper;
import us.myles.ViaVersion.util.GsonUtil;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
@Plugin(id = "viaversion",
name = "ViaVersion",
version = VersionInfo.VERSION,
authors = {"_MylesC", "Matsv"},
description = "Allow newer Minecraft versions to connect to an older server version."
)
public class SpongePlugin implements ViaPlatform {
@Inject
private Game game;
@Inject
private PluginContainer container;
@Inject
@DefaultConfig(sharedRoot = false)
private File defaultConfig;
@Getter
private SpongeViaAPI api = new SpongeViaAPI();
@Getter
private SpongeConfigAPI conf;
@Getter
private Logger logger;
@Listener
public void onGameStart(GameInitializationEvent event) {
// Setup Logger
logger = new LoggerWrapper(container.getLogger());
// Setup Plugin
conf = new SpongeConfigAPI(container, defaultConfig.getParentFile());
SpongeCommandHandler commandHandler = new SpongeCommandHandler();
game.getCommandManager().register(this, commandHandler, "viaversion", "viaver", "vvsponge");
getLogger().info("ViaVersion " + getPluginVersion() + " is now loaded!");
// Init platform
Via.init(ViaManager.builder()
.platform(this)
.commandHandler(commandHandler)
.injector(new SpongeViaInjector())
.loader(new SpongeViaLoader(this))
.build());
}
@Listener
public void onServerStart(GameAboutToStartServerEvent event) {
// Inject!
logger.info("ViaVersion is injecting!");
Via.getManager().init();
}
@Listener
public void onServerStop(GameStoppingServerEvent event) {
Via.getManager().destroy();
}
@Override
public String getPlatformName() {
return game.getPlatform().getImplementation().getName();
}
@Override
public String getPlatformVersion() {
return game.getPlatform().getImplementation().getVersion().orElse("Unknown Version");
}
@Override
public String getPluginVersion() {
return container.getVersion().orElse("Unknown Version");
}
@Override
public TaskId runAsync(Runnable runnable) {
return new SpongeTaskId(
Task.builder()
.execute(runnable)
.async()
.submit(this)
);
}
@Override
public TaskId runSync(Runnable runnable) {
return new SpongeTaskId(
Task.builder()
.execute(runnable)
.submit(this)
);
}
@Override
public TaskId runSync(Runnable runnable, Long ticks) {
return new SpongeTaskId(
Task.builder()
.execute(runnable)
.delayTicks(ticks)
.submit(this)
);
}
@Override
public TaskId runRepeatingSync(Runnable runnable, Long ticks) {
return new SpongeTaskId(
Task.builder()
.execute(runnable)
.intervalTicks(ticks)
.submit(this)
);
}
@Override
public void cancelTask(TaskId taskId) {
if (taskId == null) return;
if (taskId.getObject() == null) return;
if (taskId instanceof SpongeTaskId) {
((SpongeTaskId) taskId).getObject().cancel();
}
}
@Override
public ViaCommandSender[] getOnlinePlayers() {
ViaCommandSender[] array = new ViaCommandSender[game.getServer().getOnlinePlayers().size()];
int i = 0;
for (Player player : game.getServer().getOnlinePlayers()) {
array[i++] = new SpongeCommandSender(player);
}
return array;
}
@Override
public void sendMessage(UUID uuid, String message) {
game.getServer().getPlayer(uuid)
.ifPresent(player ->
player.sendMessage(
TextSerializers.JSON.deserialize(
ComponentSerializer.toString(
TextComponent.fromLegacyText(message) // Hacky way to fix links
)
)
)
);
}
@Override
public boolean kickPlayer(UUID uuid, String message) {
return game.getServer().getPlayer(uuid).map(player -> {
player.kick(TextSerializers.LEGACY_FORMATTING_CODE.deserialize(message));
return true;
}).orElse(false);
}
@Override
public boolean isPluginEnabled() {
return true;
}
@Override
public ConfigurationProvider getConfigurationProvider() {
return conf;
}
@Override
public void onReload() {
getLogger().severe("ViaVersion is already loaded, this should work fine. If you get any console errors, try rebooting.");
}
@Override
public JsonObject getDump() {
JsonObject platformSpecific = new JsonObject();
List<PluginInfo> plugins = new ArrayList<>();
for (PluginContainer p : game.getPluginManager().getPlugins()) {
plugins.add(new PluginInfo(
true,
p.getName(),
p.getVersion().orElse("Unknown Version"),
p.getInstance().isPresent() ? p.getInstance().get().getClass().getCanonicalName() : "Unknown",
p.getAuthors()
));
}
platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins));
return platformSpecific;
}
@Override
public boolean isOldClientsAllowed() {
return true;
}
}