mirror of
https://github.com/ViaVersion/ViaVersion.git
synced 2024-12-23 08:57:39 +01:00
Update Sponge module to API v8
This commit is contained in:
parent
2a1e82ac6d
commit
2704d70c1f
@ -6,7 +6,7 @@ plugins {
|
|||||||
tasks {
|
tasks {
|
||||||
// Variable replacements
|
// Variable replacements
|
||||||
processResources {
|
processResources {
|
||||||
filesMatching(listOf("plugin.yml", "mcmod.info", "fabric.mod.json", "bungee.yml")) {
|
filesMatching(listOf("plugin.yml", "META-INF/sponge_plugins.json", "fabric.mod.json", "bungee.yml")) {
|
||||||
expand("version" to project.version, "description" to project.description)
|
expand("version" to project.version, "description" to project.description)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,6 @@ import com.viaversion.viaversion.configuration.AbstractViaConfig;
|
|||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.URL;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -50,11 +49,6 @@ public class BukkitViaConfig extends AbstractViaConfig {
|
|||||||
blockConnectionMethod = getString("blockconnection-method", "packet");
|
blockConnectionMethod = getString("blockconnection-method", "packet");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public URL getDefaultConfigURL() {
|
|
||||||
return BukkitViaConfig.class.getClassLoader().getResource("assets/viaversion/config.yml");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void handleConfig(Map<String, Object> config) {
|
protected void handleConfig(Map<String, Object> config) {
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,6 @@ import com.viaversion.viaversion.bungee.providers.BungeeVersionProvider;
|
|||||||
import com.viaversion.viaversion.configuration.AbstractViaConfig;
|
import com.viaversion.viaversion.configuration.AbstractViaConfig;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.URL;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -48,11 +47,6 @@ public class BungeeViaConfig extends AbstractViaConfig {
|
|||||||
bungeeServerProtocols = get("bungee-servers", Map.class, new HashMap<>());
|
bungeeServerProtocols = get("bungee-servers", Map.class, new HashMap<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public URL getDefaultConfigURL() {
|
|
||||||
return BungeeViaConfig.class.getClassLoader().getResource("assets/viaversion/config.yml");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void handleConfig(Map<String, Object> config) {
|
protected void handleConfig(Map<String, Object> config) {
|
||||||
// Parse servers
|
// Parse servers
|
||||||
|
@ -61,7 +61,9 @@ public abstract class Config implements ConfigurationProvider {
|
|||||||
this.configFile = configFile;
|
this.configFile = configFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract URL getDefaultConfigURL();
|
public URL getDefaultConfigURL() {
|
||||||
|
return getClass().getClassLoader().getResource("assets/viaversion/config.yml");
|
||||||
|
}
|
||||||
|
|
||||||
public synchronized Map<String, Object> loadConfig(File location) {
|
public synchronized Map<String, Object> loadConfig(File location) {
|
||||||
List<String> unsupported = getUnsupportedOptions();
|
List<String> unsupported = getUnsupportedOptions();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Project properties - we put these here so they can be modified without causing a recompile of the build scripts
|
# Project properties - we put these here so they can be modified without causing a recompile of the build scripts
|
||||||
projectVersion=4.1.2-SNAPSHOT
|
projectVersion=4.2.0-SNAPSHOT
|
||||||
|
|
||||||
# Gradle properties
|
# Gradle properties
|
||||||
org.gradle.daemon=true
|
org.gradle.daemon=true
|
||||||
|
@ -21,7 +21,7 @@ checkerQual = "3.18.0"
|
|||||||
paper = "1.16.5-R0.1-SNAPSHOT"
|
paper = "1.16.5-R0.1-SNAPSHOT"
|
||||||
legacyBukkit = "1.8.8-R0.1-SNAPSHOT"
|
legacyBukkit = "1.8.8-R0.1-SNAPSHOT"
|
||||||
bungee = "1.17-R0.1-SNAPSHOT"
|
bungee = "1.17-R0.1-SNAPSHOT"
|
||||||
sponge = "8.0.0-SNAPSHOT"
|
sponge = "8.0.0"
|
||||||
legacySponge = "4.0.0"
|
legacySponge = "4.0.0"
|
||||||
velocity = "3.0.0-SNAPSHOT"
|
velocity = "3.0.0-SNAPSHOT"
|
||||||
|
|
||||||
|
@ -38,7 +38,6 @@ setupViaSubproject("bukkit-legacy")
|
|||||||
setupViaSubproject("bungee")
|
setupViaSubproject("bungee")
|
||||||
setupViaSubproject("velocity")
|
setupViaSubproject("velocity")
|
||||||
setupViaSubproject("sponge")
|
setupViaSubproject("sponge")
|
||||||
setupViaSubproject("sponge-legacy")
|
|
||||||
setupViaSubproject("fabric")
|
setupViaSubproject("fabric")
|
||||||
|
|
||||||
setupSubproject("viaversion") {
|
setupSubproject("viaversion") {
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
dependencies {
|
|
||||||
implementation(projects.viaversionCommon)
|
|
||||||
compileOnly(libs.legacySponge)
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
|
||||||
* Copyright (C) 2016-2021 ViaVersion and 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 com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8;
|
|
||||||
|
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
import org.spongepowered.api.item.inventory.ItemStack;
|
|
||||||
|
|
||||||
public interface ItemGrabber {
|
|
||||||
public ItemStack getItem(Player player);
|
|
||||||
}
|
|
@ -1,159 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
|
||||||
* Copyright (C) 2016-2021 ViaVersion and 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 com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.sponge4;
|
|
||||||
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.ClientboundPackets1_9;
|
|
||||||
import org.spongepowered.api.Sponge;
|
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
import org.spongepowered.api.event.Listener;
|
|
||||||
import org.spongepowered.api.event.action.InteractEvent;
|
|
||||||
import org.spongepowered.api.event.entity.DisplaceEntityEvent;
|
|
||||||
import org.spongepowered.api.event.entity.living.humanoid.player.RespawnPlayerEvent;
|
|
||||||
import org.spongepowered.api.event.filter.cause.Root;
|
|
||||||
import org.spongepowered.api.event.item.inventory.ClickInventoryEvent;
|
|
||||||
import org.spongepowered.api.event.network.ClientConnectionEvent;
|
|
||||||
import org.spongepowered.api.item.inventory.ItemStack;
|
|
||||||
import org.spongepowered.api.item.inventory.transaction.SlotTransaction;
|
|
||||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
|
||||||
import com.viaversion.viaversion.api.Via;
|
|
||||||
import com.viaversion.viaversion.ViaListener;
|
|
||||||
import com.viaversion.viaversion.api.type.Type;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.ArmorType;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public class Sponge4ArmorListener extends ViaListener {
|
|
||||||
private static Field entityIdField;
|
|
||||||
|
|
||||||
private static final UUID ARMOR_ATTRIBUTE = UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150");
|
|
||||||
|
|
||||||
public Sponge4ArmorListener() {
|
|
||||||
super(Protocol1_9To1_8.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
public void sendArmorUpdate(Player player) {
|
|
||||||
// Ensure that the player is on our pipe
|
|
||||||
if (!isOnPipe(player.getUniqueId())) return;
|
|
||||||
|
|
||||||
|
|
||||||
int armor = 0;
|
|
||||||
armor += calculate(player.getHelmet());
|
|
||||||
armor += calculate(player.getChestplate());
|
|
||||||
armor += calculate(player.getLeggings());
|
|
||||||
armor += calculate(player.getBoots());
|
|
||||||
|
|
||||||
PacketWrapper wrapper = PacketWrapper.create(ClientboundPackets1_9.ENTITY_PROPERTIES, null, getUserConnection(player.getUniqueId()));
|
|
||||||
try {
|
|
||||||
wrapper.write(Type.VAR_INT, getEntityId(player)); // Player ID
|
|
||||||
wrapper.write(Type.INT, 1); // only 1 property
|
|
||||||
wrapper.write(Type.STRING, "generic.armor");
|
|
||||||
wrapper.write(Type.DOUBLE, 0D); //default 0 armor
|
|
||||||
wrapper.write(Type.VAR_INT, 1); // 1 modifier
|
|
||||||
wrapper.write(Type.UUID, ARMOR_ATTRIBUTE); // armor modifier uuid
|
|
||||||
wrapper.write(Type.DOUBLE, (double) armor); // the modifier value
|
|
||||||
wrapper.write(Type.BYTE, (byte) 0);// the modifier operation, 0 is add number
|
|
||||||
|
|
||||||
wrapper.scheduleSend(Protocol1_9To1_8.class);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int calculate(Optional<ItemStack> itemStack) {
|
|
||||||
if (itemStack.isPresent())
|
|
||||||
return ArmorType.findByType(itemStack.get().getItem().getType().getId()).getArmorPoints();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onInventoryClick(ClickInventoryEvent e, @Root Player player) {
|
|
||||||
for (SlotTransaction transaction : e.getTransactions()) {
|
|
||||||
if (ArmorType.isArmor(transaction.getFinal().getType().getId()) ||
|
|
||||||
ArmorType.isArmor(e.getCursorTransaction().getFinal().getType().getId())) {
|
|
||||||
sendDelayedArmorUpdate(player);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onInteract(InteractEvent event, @Root Player player) {
|
|
||||||
if (player.getItemInHand().isPresent()) {
|
|
||||||
if (ArmorType.isArmor(player.getItemInHand().get().getItem().getId()))
|
|
||||||
sendDelayedArmorUpdate(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onJoin(ClientConnectionEvent.Join e) {
|
|
||||||
sendArmorUpdate(e.getTargetEntity());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onRespawn(RespawnPlayerEvent e) {
|
|
||||||
sendDelayedArmorUpdate(e.getTargetEntity());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onWorldChange(DisplaceEntityEvent.Teleport e) {
|
|
||||||
if (!(e.getTargetEntity() instanceof Player)) return;
|
|
||||||
if (!e.getFromTransform().getExtent().getUniqueId().equals(e.getToTransform().getExtent().getUniqueId())) {
|
|
||||||
sendArmorUpdate((Player) e.getTargetEntity());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sendDelayedArmorUpdate(final Player player) {
|
|
||||||
if (!isOnPipe(player.getUniqueId())) return; // Don't start a task if the player is not on the pipe
|
|
||||||
Via.getPlatform().runSync(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
sendArmorUpdate(player);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void register() {
|
|
||||||
if (isRegistered()) return;
|
|
||||||
|
|
||||||
Sponge.getEventManager().registerListeners(Via.getPlatform(), this);
|
|
||||||
setRegistered(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int getEntityId(Player p) {
|
|
||||||
try {
|
|
||||||
if (entityIdField == null) {
|
|
||||||
entityIdField = p.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("field_145783_c");
|
|
||||||
entityIdField.setAccessible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return entityIdField.getInt(p);
|
|
||||||
} catch (Exception e) {
|
|
||||||
Via.getPlatform().getLogger().severe("Could not get the entity id, please report this on our Github");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
Via.getPlatform().getLogger().severe("Could not get the entity id, please report this on our Github");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
|
||||||
* Copyright (C) 2016-2021 ViaVersion and 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 com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.sponge4;
|
|
||||||
|
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
import org.spongepowered.api.item.inventory.ItemStack;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.ItemGrabber;
|
|
||||||
|
|
||||||
public class Sponge4ItemGrabber implements ItemGrabber {
|
|
||||||
@Override
|
|
||||||
public ItemStack getItem(Player player) {
|
|
||||||
return player.getItemInHand().orElse(null);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,4 @@
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation(projects.viaversionSpongeLegacy)
|
|
||||||
implementation(projects.viaversionCommon)
|
implementation(projects.viaversionCommon)
|
||||||
compileOnly(libs.sponge)
|
compileOnly(libs.sponge)
|
||||||
}
|
}
|
||||||
|
@ -26,37 +26,39 @@ import com.viaversion.viaversion.api.data.MappingDataLoader;
|
|||||||
import com.viaversion.viaversion.api.platform.PlatformTask;
|
import com.viaversion.viaversion.api.platform.PlatformTask;
|
||||||
import com.viaversion.viaversion.api.platform.ViaPlatform;
|
import com.viaversion.viaversion.api.platform.ViaPlatform;
|
||||||
import com.viaversion.viaversion.dump.PluginInfo;
|
import com.viaversion.viaversion.dump.PluginInfo;
|
||||||
import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
|
||||||
import com.viaversion.viaversion.sponge.commands.SpongeCommandHandler;
|
import com.viaversion.viaversion.sponge.commands.SpongeCommandHandler;
|
||||||
import com.viaversion.viaversion.sponge.commands.SpongeCommandSender;
|
import com.viaversion.viaversion.sponge.commands.SpongePlayer;
|
||||||
import com.viaversion.viaversion.sponge.platform.SpongeViaTask;
|
|
||||||
import com.viaversion.viaversion.sponge.platform.SpongeViaAPI;
|
import com.viaversion.viaversion.sponge.platform.SpongeViaAPI;
|
||||||
import com.viaversion.viaversion.sponge.platform.SpongeViaConfig;
|
import com.viaversion.viaversion.sponge.platform.SpongeViaConfig;
|
||||||
import com.viaversion.viaversion.sponge.platform.SpongeViaInjector;
|
import com.viaversion.viaversion.sponge.platform.SpongeViaInjector;
|
||||||
import com.viaversion.viaversion.sponge.platform.SpongeViaLoader;
|
import com.viaversion.viaversion.sponge.platform.SpongeViaLoader;
|
||||||
|
import com.viaversion.viaversion.sponge.platform.SpongeViaTask;
|
||||||
import com.viaversion.viaversion.sponge.util.LoggerWrapper;
|
import com.viaversion.viaversion.sponge.util.LoggerWrapper;
|
||||||
import com.viaversion.viaversion.util.ChatColorUtil;
|
|
||||||
import com.viaversion.viaversion.util.GsonUtil;
|
import com.viaversion.viaversion.util.GsonUtil;
|
||||||
import org.apache.maven.artifact.versioning.ArtifactVersion;
|
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||||
import org.spongepowered.api.Game;
|
import org.spongepowered.api.Game;
|
||||||
import org.spongepowered.api.Platform;
|
import org.spongepowered.api.Platform;
|
||||||
import org.spongepowered.api.config.DefaultConfig;
|
import org.spongepowered.api.Server;
|
||||||
|
import org.spongepowered.api.Sponge;
|
||||||
|
import org.spongepowered.api.command.Command;
|
||||||
|
import org.spongepowered.api.config.ConfigDir;
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
import org.spongepowered.api.entity.living.player.Player;
|
||||||
|
import org.spongepowered.api.entity.living.player.server.ServerPlayer;
|
||||||
import org.spongepowered.api.event.Listener;
|
import org.spongepowered.api.event.Listener;
|
||||||
import org.spongepowered.api.event.game.state.GameAboutToStartServerEvent;
|
import org.spongepowered.api.event.lifecycle.ConstructPluginEvent;
|
||||||
import org.spongepowered.api.event.game.state.GameInitializationEvent;
|
import org.spongepowered.api.event.lifecycle.StartingEngineEvent;
|
||||||
import org.spongepowered.api.event.game.state.GameStoppingServerEvent;
|
|
||||||
import org.spongepowered.api.event.lifecycle.StoppingEngineEvent;
|
import org.spongepowered.api.event.lifecycle.StoppingEngineEvent;
|
||||||
import org.spongepowered.api.plugin.Plugin;
|
|
||||||
import org.spongepowered.api.scheduler.Task;
|
import org.spongepowered.api.scheduler.Task;
|
||||||
import org.spongepowered.api.text.serializer.TextSerializers;
|
import org.spongepowered.api.util.Ticks;
|
||||||
import org.spongepowered.plugin.PluginContainer;
|
import org.spongepowered.plugin.PluginContainer;
|
||||||
import org.spongepowered.plugin.builtin.jvm.Plugin;
|
import org.spongepowered.plugin.builtin.jvm.Plugin;
|
||||||
import org.spongepowered.plugin.metadata.PluginMetadata;
|
import org.spongepowered.plugin.metadata.PluginMetadata;
|
||||||
import org.spongepowered.plugin.metadata.model.PluginContributor;
|
import org.spongepowered.plugin.metadata.model.PluginContributor;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
@ -64,40 +66,46 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
@Plugin("viaversion")
|
@Plugin("viaversion")
|
||||||
public class SpongePlugin implements ViaPlatform<Player> {
|
public class SpongePlugin implements ViaPlatform<Player> {
|
||||||
@Inject
|
|
||||||
private Game game;
|
|
||||||
@Inject
|
|
||||||
private PluginContainer container;
|
|
||||||
@Inject
|
|
||||||
@DefaultConfig(sharedRoot = false)
|
|
||||||
private File spongeConfig;
|
|
||||||
|
|
||||||
public static final LegacyComponentSerializer COMPONENT_SERIALIZER = LegacyComponentSerializer.builder().character(ChatColorUtil.COLOR_CHAR).extractUrls().build();
|
public static final LegacyComponentSerializer LEGACY_SERIALIZER = LegacyComponentSerializer.builder().extractUrls().build();
|
||||||
private final SpongeViaAPI api = new SpongeViaAPI();
|
private final SpongeViaAPI api = new SpongeViaAPI();
|
||||||
|
private final PluginContainer container;
|
||||||
|
private final Game game;
|
||||||
|
@SuppressWarnings("SpongeLogging")
|
||||||
|
private final Logger logger;
|
||||||
private SpongeViaConfig conf;
|
private SpongeViaConfig conf;
|
||||||
private Logger logger;
|
@Inject
|
||||||
|
@ConfigDir(sharedRoot = false)
|
||||||
|
private Path configDir;
|
||||||
|
|
||||||
|
@SuppressWarnings("SpongeInjection")
|
||||||
|
@Inject
|
||||||
|
SpongePlugin(final PluginContainer container, final Game game, final org.apache.logging.log4j.Logger logger) {
|
||||||
|
this.container = container;
|
||||||
|
this.game = game;
|
||||||
|
this.logger = new LoggerWrapper(logger);
|
||||||
|
}
|
||||||
|
|
||||||
@Listener
|
@Listener
|
||||||
public void onGameStart(GameInitializationEvent event) {
|
public void constructPlugin(ConstructPluginEvent event) {
|
||||||
// Setup Logger
|
|
||||||
logger = new LoggerWrapper(container.logger());
|
|
||||||
// Setup Plugin
|
// Setup Plugin
|
||||||
conf = new SpongeViaConfig(container, spongeConfig.getParentFile());
|
conf = new SpongeViaConfig(configDir.toFile());
|
||||||
SpongeCommandHandler commandHandler = new SpongeCommandHandler();
|
|
||||||
game.getCommandManager().register(this, commandHandler, "viaversion", "viaver", "vvsponge");
|
|
||||||
logger.info("ViaVersion " + getPluginVersion() + " is now loaded!");
|
logger.info("ViaVersion " + getPluginVersion() + " is now loaded!");
|
||||||
|
|
||||||
// Init platform
|
// Init platform
|
||||||
Via.init(ViaManagerImpl.builder()
|
Via.init(ViaManagerImpl.builder()
|
||||||
.platform(this)
|
.platform(this)
|
||||||
.commandHandler(commandHandler)
|
.commandHandler(new SpongeCommandHandler())
|
||||||
.injector(new SpongeViaInjector())
|
.injector(new SpongeViaInjector())
|
||||||
.loader(new SpongeViaLoader(this))
|
.loader(new SpongeViaLoader(this))
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Listener
|
@Listener
|
||||||
public void onServerStart(GameAboutToStartServerEvent event) {
|
public void onServerStart(StartingEngineEvent<Server> event) {
|
||||||
|
// Can't use the command register event for raw commands...
|
||||||
|
Sponge.server().commandManager().registrar(Command.Raw.class).get().register(container, (Command.Raw) Via.getManager().getCommandHandler(), "viaversion", "viaver", "vvsponge");
|
||||||
|
|
||||||
if (game.pluginManager().plugin("viabackwards").isPresent()) {
|
if (game.pluginManager().plugin("viabackwards").isPresent()) {
|
||||||
MappingDataLoader.enableMappingsCache();
|
MappingDataLoader.enableMappingsCache();
|
||||||
}
|
}
|
||||||
@ -108,7 +116,7 @@ public class SpongePlugin implements ViaPlatform<Player> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Listener
|
@Listener
|
||||||
public void onServerStop(StoppingEngineEvent<?> event) {
|
public void onServerStop(StoppingEngineEvent<Server> event) {
|
||||||
((ViaManagerImpl) Via.getManager()).destroy();
|
((ViaManagerImpl) Via.getManager()).destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,80 +127,58 @@ public class SpongePlugin implements ViaPlatform<Player> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPlatformVersion() {
|
public String getPlatformVersion() {
|
||||||
return readVersion(game.platform().container(Platform.Component.IMPLEMENTATION).metadata().version());
|
return game.platform().container(Platform.Component.IMPLEMENTATION).metadata().version().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPluginVersion() {
|
public String getPluginVersion() {
|
||||||
return readVersion(container.metadata().version());
|
return container.metadata().version().toString();
|
||||||
}
|
|
||||||
|
|
||||||
private static String readVersion(ArtifactVersion version) {
|
|
||||||
String qualifier = version.getQualifier();
|
|
||||||
qualifier = (qualifier == null || qualifier.isEmpty()) ? "" : "-" + qualifier;
|
|
||||||
|
|
||||||
return version.getMajorVersion() + "." + version.getMinorVersion() + "." + version.getIncrementalVersion() + qualifier;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlatformTask runAsync(Runnable runnable) {
|
public PlatformTask runAsync(Runnable runnable) {
|
||||||
return new SpongeViaTask(
|
final Task task = Task.builder().plugin(container).execute(runnable).build();
|
||||||
Task.builder()
|
return new SpongeViaTask(game.asyncScheduler().submit(task));
|
||||||
.execute(runnable)
|
|
||||||
.async()
|
|
||||||
.submit(this)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlatformTask runSync(Runnable runnable) {
|
public PlatformTask runSync(Runnable runnable) {
|
||||||
return new SpongeViaTask(
|
final Task task = Task.builder().plugin(container).execute(runnable).build();
|
||||||
Task.builder()
|
return new SpongeViaTask(game.server().scheduler().submit(task));
|
||||||
.execute(runnable)
|
|
||||||
.submit(this)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlatformTask runSync(Runnable runnable, long ticks) {
|
public PlatformTask runSync(Runnable runnable, long ticks) {
|
||||||
return new SpongeViaTask(
|
final Task task = Task.builder().plugin(container).execute(runnable).delay(Ticks.of(ticks)).build();
|
||||||
Task.builder()
|
return new SpongeViaTask(game.server().scheduler().submit(task));
|
||||||
.execute(runnable)
|
|
||||||
.delayTicks(ticks)
|
|
||||||
.submit(this)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlatformTask runRepeatingSync(Runnable runnable, long ticks) {
|
public PlatformTask runRepeatingSync(Runnable runnable, long ticks) {
|
||||||
return new SpongeViaTask(
|
final Task task = Task.builder().plugin(container).execute(runnable).interval(Ticks.of(ticks)).build();
|
||||||
Task.builder()
|
return new SpongeViaTask(game.server().scheduler().submit(task));
|
||||||
.execute(runnable)
|
|
||||||
.intervalTicks(ticks)
|
|
||||||
.submit(this)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ViaCommandSender[] getOnlinePlayers() {
|
public ViaCommandSender[] getOnlinePlayers() {
|
||||||
ViaCommandSender[] array = new ViaCommandSender[game.server().onlinePlayers().size()];
|
Collection<ServerPlayer> players = game.server().onlinePlayers();
|
||||||
|
ViaCommandSender[] array = new ViaCommandSender[players.size()];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (Player player : game.server().onlinePlayers()) {
|
for (ServerPlayer player : players) {
|
||||||
array[i++] = new SpongeCommandSender(player);
|
array[i++] = new SpongePlayer(player);
|
||||||
}
|
}
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(UUID uuid, String message) {
|
public void sendMessage(UUID uuid, String message) {
|
||||||
String serialized = SpongePlugin.COMPONENT_SERIALIZER.serialize(SpongePlugin.COMPONENT_SERIALIZER.deserialize(message));
|
game.server().player(uuid).ifPresent(player -> player.sendMessage(LEGACY_SERIALIZER.deserialize(message)));
|
||||||
game.server().player(uuid).ifPresent(player -> player.sendMessage(TextSerializers.JSON.deserialize(serialized))); // Hacky way to fix links
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean kickPlayer(UUID uuid, String message) {
|
public boolean kickPlayer(UUID uuid, String message) {
|
||||||
return game.server().player(uuid).map(player -> {
|
return game.server().player(uuid).map(player -> {
|
||||||
player.kick(TextSerializers.formattingCode(ChatColorUtil.COLOR_CHAR).deserialize(message));
|
player.kick(LegacyComponentSerializer.legacySection().deserialize(message));
|
||||||
return true;
|
return true;
|
||||||
}).orElse(false);
|
}).orElse(false);
|
||||||
}
|
}
|
||||||
@ -209,12 +195,12 @@ public class SpongePlugin implements ViaPlatform<Player> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public File getDataFolder() {
|
public File getDataFolder() {
|
||||||
return spongeConfig.getParentFile();
|
return configDir.toFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReload() {
|
public void onReload() {
|
||||||
getLogger().severe("ViaVersion is already loaded, this should work fine. If you get any console errors, try rebooting.");
|
logger.severe("ViaVersion is already loaded, this should work fine. If you get any console errors, try rebooting.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -222,14 +208,14 @@ public class SpongePlugin implements ViaPlatform<Player> {
|
|||||||
JsonObject platformSpecific = new JsonObject();
|
JsonObject platformSpecific = new JsonObject();
|
||||||
|
|
||||||
List<PluginInfo> plugins = new ArrayList<>();
|
List<PluginInfo> plugins = new ArrayList<>();
|
||||||
for (PluginContainer p : game.pluginManager().plugins()) {
|
for (PluginContainer plugin : game.pluginManager().plugins()) {
|
||||||
PluginMetadata meta = p.metadata();
|
PluginMetadata metadata = plugin.metadata();
|
||||||
plugins.add(new PluginInfo(
|
plugins.add(new PluginInfo(
|
||||||
true,
|
true,
|
||||||
meta.name().orElse("Unknown"),
|
metadata.name().orElse("Unknown"),
|
||||||
readVersion(meta.version()),
|
metadata.version().toString(),
|
||||||
p.instance() != null ? p.instance().getClass().getCanonicalName() : "Unknown",
|
plugin.instance().getClass().getCanonicalName(),
|
||||||
meta.contributors().stream().map(PluginContributor::name).collect(Collectors.toList())
|
metadata.contributors().stream().map(PluginContributor::name).collect(Collectors.toList())
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins));
|
platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins));
|
||||||
@ -257,7 +243,7 @@ public class SpongePlugin implements ViaPlatform<Player> {
|
|||||||
return logger;
|
return logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PluginContainer getPluginContainer() {
|
public PluginContainer container() {
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,9 +21,9 @@ import com.viaversion.viaversion.commands.ViaCommandHandler;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.spongepowered.api.command.Command;
|
import org.spongepowered.api.command.Command;
|
||||||
|
import org.spongepowered.api.command.CommandCause;
|
||||||
import org.spongepowered.api.command.CommandCompletion;
|
import org.spongepowered.api.command.CommandCompletion;
|
||||||
import org.spongepowered.api.command.CommandResult;
|
import org.spongepowered.api.command.CommandResult;
|
||||||
import org.spongepowered.api.command.CommandCause;
|
|
||||||
import org.spongepowered.api.command.parameter.ArgumentReader;
|
import org.spongepowered.api.command.parameter.ArgumentReader;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -19,6 +19,7 @@ package com.viaversion.viaversion.sponge.commands;
|
|||||||
|
|
||||||
import com.viaversion.viaversion.SpongePlugin;
|
import com.viaversion.viaversion.SpongePlugin;
|
||||||
import com.viaversion.viaversion.api.command.ViaCommandSender;
|
import com.viaversion.viaversion.api.command.ViaCommandSender;
|
||||||
|
import net.kyori.adventure.identity.Identity;
|
||||||
import org.spongepowered.api.command.CommandCause;
|
import org.spongepowered.api.command.CommandCause;
|
||||||
import org.spongepowered.api.util.Identifiable;
|
import org.spongepowered.api.util.Identifiable;
|
||||||
|
|
||||||
@ -38,8 +39,7 @@ public class SpongeCommandSender implements ViaCommandSender {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(String msg) {
|
public void sendMessage(String msg) {
|
||||||
String serialized = SpongePlugin.COMPONENT_SERIALIZER.serialize(SpongePlugin.COMPONENT_SERIALIZER.deserialize(msg));
|
source.sendMessage(Identity.nil(), SpongePlugin.LEGACY_SERIALIZER.deserialize(msg));
|
||||||
source.sendMessage(TextSerializers.JSON.deserialize(serialized)); // Hacky way to fix links
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
||||||
|
* Copyright (C) 2016-2021 ViaVersion and 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 com.viaversion.viaversion.sponge.commands;
|
||||||
|
|
||||||
|
import com.viaversion.viaversion.SpongePlugin;
|
||||||
|
import com.viaversion.viaversion.api.command.ViaCommandSender;
|
||||||
|
import org.spongepowered.api.entity.living.player.server.ServerPlayer;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class SpongePlayer implements ViaCommandSender {
|
||||||
|
private final ServerPlayer player;
|
||||||
|
|
||||||
|
public SpongePlayer(ServerPlayer player) {
|
||||||
|
this.player = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasPermission(String permission) {
|
||||||
|
return player.hasPermission(permission);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendMessage(String msg) {
|
||||||
|
player.sendMessage(SpongePlugin.LEGACY_SERIALIZER.deserialize(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UUID getUUID() {
|
||||||
|
return player.uniqueId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return player.friendlyIdentifier().orElse(player.identifier());
|
||||||
|
}
|
||||||
|
}
|
@ -23,6 +23,7 @@ import org.spongepowered.api.event.Listener;
|
|||||||
import org.spongepowered.api.event.network.ServerSideConnectionEvent;
|
import org.spongepowered.api.event.network.ServerSideConnectionEvent;
|
||||||
|
|
||||||
public class UpdateListener {
|
public class UpdateListener {
|
||||||
|
|
||||||
@Listener
|
@Listener
|
||||||
public void onJoin(ServerSideConnectionEvent.Join join) {
|
public void onJoin(ServerSideConnectionEvent.Join join) {
|
||||||
if (join.player().hasPermission("viaversion.update") && Via.getConfig().isCheckForUpdates()) {
|
if (join.player().hasPermission("viaversion.update") && Via.getConfig().isCheckForUpdates()) {
|
||||||
|
@ -19,10 +19,8 @@ package com.viaversion.viaversion.sponge.listeners;
|
|||||||
|
|
||||||
import com.viaversion.viaversion.SpongePlugin;
|
import com.viaversion.viaversion.SpongePlugin;
|
||||||
import com.viaversion.viaversion.ViaListener;
|
import com.viaversion.viaversion.ViaListener;
|
||||||
import com.viaversion.viaversion.api.Via;
|
|
||||||
import com.viaversion.viaversion.api.protocol.Protocol;
|
import com.viaversion.viaversion.api.protocol.Protocol;
|
||||||
import org.spongepowered.api.Sponge;
|
import org.spongepowered.api.Sponge;
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
@ -40,25 +38,7 @@ public class ViaSpongeListener extends ViaListener {
|
|||||||
public void register() {
|
public void register() {
|
||||||
if (isRegistered()) return;
|
if (isRegistered()) return;
|
||||||
|
|
||||||
Sponge.eventManager().registerListeners(plugin.getPluginContainer(), this);
|
Sponge.eventManager().registerListeners(plugin.container(), this);
|
||||||
setRegistered(true);
|
setRegistered(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hey sponge, please create a getEntityId method :'(
|
|
||||||
protected int getEntityId(Player p) {
|
|
||||||
try {
|
|
||||||
if (entityIdField == null) {
|
|
||||||
entityIdField = p.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("field_145783_c");
|
|
||||||
entityIdField.setAccessible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return entityIdField.getInt(p);
|
|
||||||
} catch (Exception e) {
|
|
||||||
Via.getPlatform().getLogger().severe("Could not get the entity id, please report this on our Github");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
Via.getPlatform().getLogger().severe("Could not get the entity id, please report this on our Github");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
|
||||||
* Copyright (C) 2016-2021 ViaVersion and 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 com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8;
|
|
||||||
|
|
||||||
import com.viaversion.viaversion.SpongePlugin;
|
|
||||||
import com.viaversion.viaversion.api.minecraft.Position;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.storage.EntityTracker1_9;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.ViaSpongeListener;
|
|
||||||
import org.spongepowered.api.block.transaction.BlockTransaction;
|
|
||||||
import org.spongepowered.api.block.transaction.Operations;
|
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
import org.spongepowered.api.event.Listener;
|
|
||||||
import org.spongepowered.api.event.block.ChangeBlockEvent;
|
|
||||||
import org.spongepowered.api.event.filter.cause.Root;
|
|
||||||
import org.spongepowered.api.world.server.ServerLocation;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class BlockListener extends ViaSpongeListener {
|
|
||||||
|
|
||||||
public BlockListener(SpongePlugin plugin) {
|
|
||||||
super(plugin, Protocol1_9To1_8.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void placeBlock(ChangeBlockEvent.All e, @Root Player player) {
|
|
||||||
BlockTransaction transaction = e.transactions().get(0);
|
|
||||||
if (transaction.operation().equals(Operations.PLACE.get())) {
|
|
||||||
if (isOnPipe(player.uniqueId())) {
|
|
||||||
Optional<ServerLocation> optional = transaction.finalReplacement().location();
|
|
||||||
if (optional.isPresent()) {
|
|
||||||
ServerLocation loc = optional.get();
|
|
||||||
EntityTracker1_9 tracker = getUserConnection(player.uniqueId()).getEntityTracker(Protocol1_9To1_8.class);
|
|
||||||
tracker.addBlockInteraction(new Position(loc.blockX(), loc.blockY(), loc.blockZ()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,84 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
|
||||||
* Copyright (C) 2016-2021 ViaVersion and 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 com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8;
|
|
||||||
|
|
||||||
import com.viaversion.viaversion.SpongePlugin;
|
|
||||||
import com.viaversion.viaversion.api.Via;
|
|
||||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
|
||||||
import com.viaversion.viaversion.api.type.Type;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.ClientboundPackets1_9;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.ViaSpongeListener;
|
|
||||||
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
import org.spongepowered.api.event.Listener;
|
|
||||||
import org.spongepowered.api.event.Order;
|
|
||||||
import org.spongepowered.api.event.entity.DestructEntityEvent;
|
|
||||||
import org.spongepowered.api.world.World;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class DeathListener extends ViaSpongeListener {
|
|
||||||
public DeathListener(SpongePlugin plugin) {
|
|
||||||
super(plugin, Protocol1_9To1_8.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener(order = Order.LAST)
|
|
||||||
public void onDeath(DestructEntityEvent.Death e) {
|
|
||||||
if (!(e.entity() instanceof Player))
|
|
||||||
return;
|
|
||||||
|
|
||||||
Player p = (Player) e.entity();
|
|
||||||
if (isOnPipe(p.uniqueId()) && Via.getConfig().isShowNewDeathMessages() && checkGamerule(p.getWorld())) {
|
|
||||||
sendPacket(p, PlainTextComponentSerializer.plainText().serialize(e.message()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean checkGamerule(World w) {
|
|
||||||
Optional<String> gamerule = w.gameRule("showDeathMessages");
|
|
||||||
|
|
||||||
if (gamerule.isPresent()) {
|
|
||||||
try {
|
|
||||||
return Boolean.parseBoolean(gamerule.get());
|
|
||||||
} catch (Exception e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendPacket(final Player p, final String msg) {
|
|
||||||
Via.getPlatform().runSync(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
PacketWrapper wrapper = PacketWrapper.create(ClientboundPackets1_9.COMBAT_EVENT, null, getUserConnection(p.getUniqueId()));
|
|
||||||
try {
|
|
||||||
int entityId = getEntityId(p);
|
|
||||||
wrapper.write(Type.VAR_INT, 2); // Event - Entity dead
|
|
||||||
wrapper.write(Type.VAR_INT, entityId); // Player ID
|
|
||||||
wrapper.write(Type.INT, entityId); // Entity ID
|
|
||||||
Protocol1_9To1_8.FIX_JSON.write(wrapper, msg); // Message
|
|
||||||
|
|
||||||
wrapper.scheduleSend(Protocol1_9To1_8.class);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,111 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
|
||||||
* Copyright (C) 2016-2021 ViaVersion and 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 com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8;
|
|
||||||
|
|
||||||
import com.viaversion.viaversion.api.minecraft.item.DataItem;
|
|
||||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.sponge4.Sponge4ItemGrabber;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.sponge5.Sponge5ItemGrabber;
|
|
||||||
import org.spongepowered.api.Sponge;
|
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
import org.spongepowered.api.item.inventory.ItemStack;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
|
|
||||||
public class HandItemCache implements Runnable {
|
|
||||||
public static boolean CACHE = false;
|
|
||||||
private static Map<UUID, Item> handCache = new ConcurrentHashMap<>();
|
|
||||||
private static Field GET_DAMAGE;
|
|
||||||
private static Method GET_ID;
|
|
||||||
private static ItemGrabber grabber;
|
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
Class.forName("org.spongepowered.api.event.entity.DisplaceEntityEvent");
|
|
||||||
grabber = new Sponge4ItemGrabber();
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
grabber = new Sponge5ItemGrabber();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Item getHandItem(UUID player) {
|
|
||||||
return handCache.get(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
List<UUID> players = new ArrayList<>(handCache.keySet());
|
|
||||||
|
|
||||||
for (Player p : Sponge.server().onlinePlayers()) {
|
|
||||||
handCache.put(p.uniqueId(), convert(grabber.getItem(p)));
|
|
||||||
players.remove(p.uniqueId());
|
|
||||||
}
|
|
||||||
// Remove offline players
|
|
||||||
for (UUID uuid : players) {
|
|
||||||
handCache.remove(uuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Item convert(ItemStack itemInHand) {
|
|
||||||
if (itemInHand == null) return new DataItem(0, (byte) 0, (short) 0, null);
|
|
||||||
if (GET_DAMAGE == null) {
|
|
||||||
try {
|
|
||||||
GET_DAMAGE = itemInHand.getClass().getDeclaredField("field_77991_e");
|
|
||||||
GET_DAMAGE.setAccessible(true);
|
|
||||||
} catch (NoSuchFieldException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (GET_ID == null) {
|
|
||||||
try {
|
|
||||||
GET_ID = Class.forName("net.minecraft.item.Item").getDeclaredMethod("func_150891_b", Class.forName("net.minecraft.item.Item"));
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int id = 0;
|
|
||||||
if (GET_ID != null) {
|
|
||||||
try {
|
|
||||||
id = (int) GET_ID.invoke(null, itemInHand.getItem());
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int damage = 0;
|
|
||||||
if (GET_DAMAGE != null) {
|
|
||||||
try {
|
|
||||||
damage = (int) GET_DAMAGE.get(itemInHand);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new DataItem(id, (byte) itemInHand.quantity(), (short) damage, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,135 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
|
||||||
* Copyright (C) 2016-2021 ViaVersion and 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 com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.sponge5;
|
|
||||||
|
|
||||||
import com.viaversion.viaversion.SpongePlugin;
|
|
||||||
import com.viaversion.viaversion.api.Via;
|
|
||||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
|
||||||
import com.viaversion.viaversion.api.type.Type;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.ArmorType;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.ClientboundPackets1_9;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.ViaSpongeListener;
|
|
||||||
import org.spongepowered.api.data.type.HandTypes;
|
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
import org.spongepowered.api.event.Listener;
|
|
||||||
import org.spongepowered.api.event.action.InteractEvent;
|
|
||||||
import org.spongepowered.api.event.cause.entity.MovementTypes;
|
|
||||||
import org.spongepowered.api.event.entity.MoveEntityEvent;
|
|
||||||
import org.spongepowered.api.event.entity.living.player.RespawnPlayerEvent;
|
|
||||||
import org.spongepowered.api.event.filter.cause.Root;
|
|
||||||
import org.spongepowered.api.event.item.inventory.container.ClickContainerEvent;
|
|
||||||
import org.spongepowered.api.event.network.ServerSideConnectionEvent;
|
|
||||||
import org.spongepowered.api.item.inventory.ItemStack;
|
|
||||||
import org.spongepowered.api.item.inventory.transaction.SlotTransaction;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public class Sponge5ArmorListener extends ViaSpongeListener {
|
|
||||||
private static final UUID ARMOR_ATTRIBUTE = UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150");
|
|
||||||
|
|
||||||
public Sponge5ArmorListener(SpongePlugin plugin) {
|
|
||||||
super(plugin, Protocol1_9To1_8.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
public void sendArmorUpdate(Player player) {
|
|
||||||
// Ensure that the player is on our pipe
|
|
||||||
if (!isOnPipe(player.uniqueId())) return;
|
|
||||||
|
|
||||||
|
|
||||||
int armor = 0;
|
|
||||||
armor += calculate(player.head());
|
|
||||||
armor += calculate(player.chest());
|
|
||||||
armor += calculate(player.legs());
|
|
||||||
armor += calculate(player.feet());
|
|
||||||
|
|
||||||
PacketWrapper wrapper = PacketWrapper.create(ClientboundPackets1_9.ENTITY_PROPERTIES, null, getUserConnection(player.getUniqueId()));
|
|
||||||
try {
|
|
||||||
wrapper.write(Type.VAR_INT, getEntityId(player)); // Player ID
|
|
||||||
wrapper.write(Type.INT, 1); // only 1 property
|
|
||||||
wrapper.write(Type.STRING, "generic.armor");
|
|
||||||
wrapper.write(Type.DOUBLE, 0D); //default 0 armor
|
|
||||||
wrapper.write(Type.VAR_INT, 1); // 1 modifier
|
|
||||||
wrapper.write(Type.UUID, ARMOR_ATTRIBUTE); // armor modifier uuid
|
|
||||||
wrapper.write(Type.DOUBLE, (double) armor); // the modifier value
|
|
||||||
wrapper.write(Type.BYTE, (byte) 0);// the modifier operation, 0 is add number
|
|
||||||
|
|
||||||
wrapper.scheduleSend(Protocol1_9To1_8.class);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int calculate(ItemStack itemStack) {
|
|
||||||
if (itemStack != null) {
|
|
||||||
// todo
|
|
||||||
return ArmorType.findByType(itemStack.type()).getArmorPoints();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onContainerClick(ClickContainerEvent e, @Root Player player) {
|
|
||||||
for (SlotTransaction transaction : e.transactions()) {
|
|
||||||
if (ArmorType.isArmor(transaction.finalReplacement().type()) ||
|
|
||||||
ArmorType.isArmor(e.cursorTransaction().finalReplacement().type())) {
|
|
||||||
sendDelayedArmorUpdate(player);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onInteract(InteractEvent event, @Root Player player) {
|
|
||||||
if (player.itemInHand(HandTypes.MAIN_HAND) != null) {
|
|
||||||
if (ArmorType.isArmor(player.itemInHand(HandTypes.MAIN_HAND).type()))
|
|
||||||
sendDelayedArmorUpdate(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onJoin(ServerSideConnectionEvent.Join e) {
|
|
||||||
sendArmorUpdate(e.player());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onRespawn(RespawnPlayerEvent e) {
|
|
||||||
sendDelayedArmorUpdate(e.entity());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onWorldChange(MoveEntityEvent e) {
|
|
||||||
if (!(e.entity() instanceof Player)) return;
|
|
||||||
if (!e.cause().contains(MovementTypes.ENTITY_TELEPORT)) return; //todo: probably doesn't work
|
|
||||||
|
|
||||||
if (!e.originalDestinationPosition().getExtent().getUniqueId().equals(e.destinationPosition().getExtent().getUniqueId())) {
|
|
||||||
sendArmorUpdate((Player) e.entity());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sendDelayedArmorUpdate(final Player player) {
|
|
||||||
if (!isOnPipe(player.uniqueId())) return; // Don't start a task if the player is not on the pipe
|
|
||||||
Via.getPlatform().runSync(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
sendArmorUpdate(player);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
|
||||||
* Copyright (C) 2016-2021 ViaVersion and 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 com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.sponge5;
|
|
||||||
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.ItemGrabber;
|
|
||||||
import org.spongepowered.api.data.type.HandTypes;
|
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
import org.spongepowered.api.item.inventory.ItemStack;
|
|
||||||
|
|
||||||
public class Sponge5ItemGrabber implements ItemGrabber {
|
|
||||||
@Override
|
|
||||||
public ItemStack getItem(Player player) {
|
|
||||||
return player.itemInHand(HandTypes.MAIN_HAND);
|
|
||||||
}
|
|
||||||
}
|
|
@ -18,37 +18,22 @@
|
|||||||
package com.viaversion.viaversion.sponge.platform;
|
package com.viaversion.viaversion.sponge.platform;
|
||||||
|
|
||||||
import com.viaversion.viaversion.configuration.AbstractViaConfig;
|
import com.viaversion.viaversion.configuration.AbstractViaConfig;
|
||||||
import org.spongepowered.api.asset.Asset;
|
|
||||||
import org.spongepowered.plugin.PluginContainer;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.URL;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class SpongeViaConfig extends AbstractViaConfig {
|
public class SpongeViaConfig extends AbstractViaConfig {
|
||||||
private static final List<String> UNSUPPORTED = Arrays.asList("anti-xray-patch", "bungee-ping-interval",
|
private static final List<String> UNSUPPORTED = Arrays.asList("anti-xray-patch", "bungee-ping-interval",
|
||||||
"bungee-ping-save", "bungee-servers", "velocity-ping-interval", "velocity-ping-save", "velocity-servers",
|
"bungee-ping-save", "bungee-servers", "velocity-ping-interval", "velocity-ping-save", "velocity-servers",
|
||||||
"quick-move-action-fix", "change-1_9-hitbox", "change-1_14-hitbox", "blockconnection-method");
|
"quick-move-action-fix", "change-1_9-hitbox", "change-1_14-hitbox", "blockconnection-method");
|
||||||
private final PluginContainer pluginContainer;
|
|
||||||
|
|
||||||
public SpongeViaConfig(PluginContainer pluginContainer, File configFile) {
|
public SpongeViaConfig(File configFile) {
|
||||||
super(new File(configFile, "config.yml"));
|
super(new File(configFile, "config.yml"));
|
||||||
this.pluginContainer = pluginContainer;
|
|
||||||
reloadConfig();
|
reloadConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public URL getDefaultConfigURL() {
|
|
||||||
Optional<Asset> config = pluginContainer.getAsset("config.yml");
|
|
||||||
if (!config.isPresent()) {
|
|
||||||
throw new IllegalArgumentException("Default config is missing from jar");
|
|
||||||
}
|
|
||||||
return config.get().url();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void handleConfig(Map<String, Object> config) {
|
protected void handleConfig(Map<String, Object> config) {
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,6 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
|||||||
import org.spongepowered.api.MinecraftVersion;
|
import org.spongepowered.api.MinecraftVersion;
|
||||||
import org.spongepowered.api.Sponge;
|
import org.spongepowered.api.Sponge;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
public class SpongeViaInjector extends LegacyViaInjector {
|
public class SpongeViaInjector extends LegacyViaInjector {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -40,15 +38,7 @@ public class SpongeViaInjector extends LegacyViaInjector {
|
|||||||
@Override
|
@Override
|
||||||
protected @Nullable Object getServerConnection() throws ReflectiveOperationException {
|
protected @Nullable Object getServerConnection() throws ReflectiveOperationException {
|
||||||
Class<?> serverClazz = Class.forName("net.minecraft.server.MinecraftServer");
|
Class<?> serverClazz = Class.forName("net.minecraft.server.MinecraftServer");
|
||||||
for (Method method : serverClazz.getDeclaredMethods()) {
|
return serverClazz.getDeclaredMethod("getConnection").invoke(Sponge.server());
|
||||||
if (method.getReturnType().getSimpleName().equals("NetworkSystem") && method.getParameterTypes().length == 0) {
|
|
||||||
Object connection = method.invoke(Sponge.server());
|
|
||||||
if (connection != null) {
|
|
||||||
return connection;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -18,21 +18,9 @@
|
|||||||
package com.viaversion.viaversion.sponge.platform;
|
package com.viaversion.viaversion.sponge.platform;
|
||||||
|
|
||||||
import com.viaversion.viaversion.SpongePlugin;
|
import com.viaversion.viaversion.SpongePlugin;
|
||||||
import com.viaversion.viaversion.api.Via;
|
|
||||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
|
||||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
|
||||||
import com.viaversion.viaversion.api.platform.PlatformTask;
|
import com.viaversion.viaversion.api.platform.PlatformTask;
|
||||||
import com.viaversion.viaversion.api.platform.ViaPlatformLoader;
|
import com.viaversion.viaversion.api.platform.ViaPlatformLoader;
|
||||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider;
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.UpdateListener;
|
import com.viaversion.viaversion.sponge.listeners.UpdateListener;
|
||||||
import com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.BlockListener;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.DeathListener;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.HandItemCache;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.sponge4.Sponge4ArmorListener;
|
|
||||||
import com.viaversion.viaversion.sponge.listeners.protocol1_9to1_8.sponge5.Sponge5ArmorListener;
|
|
||||||
import com.viaversion.viaversion.sponge.providers.SpongeViaMovementTransmitter;
|
|
||||||
import org.spongepowered.api.Sponge;
|
import org.spongepowered.api.Sponge;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -50,7 +38,7 @@ public class SpongeViaLoader implements ViaPlatformLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void registerListener(Object listener) {
|
private void registerListener(Object listener) {
|
||||||
Sponge.getEventManager().registerListeners(plugin, storeListener(listener));
|
Sponge.eventManager().registerListeners(plugin.container(), storeListener(listener));
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T> T storeListener(T listener) {
|
private <T> T storeListener(T listener) {
|
||||||
@ -62,43 +50,11 @@ public class SpongeViaLoader implements ViaPlatformLoader {
|
|||||||
public void load() {
|
public void load() {
|
||||||
// Update Listener
|
// Update Listener
|
||||||
registerListener(new UpdateListener());
|
registerListener(new UpdateListener());
|
||||||
|
|
||||||
/* 1.9 client to 1.8 server */
|
|
||||||
if (Via.getAPI().getServerVersion().lowestSupportedVersion() < ProtocolVersion.v1_9.getVersion()) {
|
|
||||||
try {
|
|
||||||
Class.forName("org.spongepowered.api.event.entity.DisplaceEntityEvent");
|
|
||||||
storeListener(new Sponge4ArmorListener()).register();
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
storeListener(new Sponge5ArmorListener(plugin)).register();
|
|
||||||
}
|
|
||||||
storeListener(new DeathListener(plugin)).register();
|
|
||||||
storeListener(new BlockListener(plugin)).register();
|
|
||||||
|
|
||||||
if (plugin.getConf().isItemCache()) {
|
|
||||||
tasks.add(Via.getPlatform().runRepeatingSync(new HandItemCache(), 2L)); // Updates players items :)
|
|
||||||
HandItemCache.CACHE = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Providers */
|
|
||||||
if (Via.getAPI().getServerVersion().lowestSupportedVersion() < ProtocolVersion.v1_9.getVersion()) {
|
|
||||||
Via.getManager().getProviders().use(MovementTransmitterProvider.class, new SpongeViaMovementTransmitter());
|
|
||||||
|
|
||||||
Via.getManager().getProviders().use(HandItemProvider.class, new HandItemProvider() {
|
|
||||||
@Override
|
@Override
|
||||||
public Item getHandItem(final UserConnection info) {
|
|
||||||
if (HandItemCache.CACHE) {
|
|
||||||
return HandItemCache.getHandItem(info.getProtocolInfo().getUuid());
|
|
||||||
} else {
|
|
||||||
return super.getHandItem(info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void unload() {
|
public void unload() {
|
||||||
listeners.forEach(Sponge.getEventManager()::unregisterListeners);
|
listeners.forEach(Sponge.eventManager()::unregisterListeners);
|
||||||
listeners.clear();
|
listeners.clear();
|
||||||
tasks.forEach(PlatformTask::cancel);
|
tasks.forEach(PlatformTask::cancel);
|
||||||
tasks.clear();
|
tasks.clear();
|
||||||
|
@ -18,17 +18,17 @@
|
|||||||
package com.viaversion.viaversion.sponge.platform;
|
package com.viaversion.viaversion.sponge.platform;
|
||||||
|
|
||||||
import com.viaversion.viaversion.api.platform.PlatformTask;
|
import com.viaversion.viaversion.api.platform.PlatformTask;
|
||||||
import org.spongepowered.api.scheduler.Task;
|
import org.spongepowered.api.scheduler.ScheduledTask;
|
||||||
|
|
||||||
public class SpongeViaTask implements PlatformTask<Task> {
|
public class SpongeViaTask implements PlatformTask<ScheduledTask> {
|
||||||
private final Task task;
|
private final ScheduledTask task;
|
||||||
|
|
||||||
public SpongeViaTask(Task task) {
|
public SpongeViaTask(ScheduledTask task) {
|
||||||
this.task = task;
|
this.task = task;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Task getObject() {
|
public ScheduledTask getObject() {
|
||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
|
||||||
* Copyright (C) 2016-2021 ViaVersion and 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 com.viaversion.viaversion.sponge.providers;
|
|
||||||
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
public class SpongeViaMovementTransmitter extends MovementTransmitterProvider {
|
|
||||||
// Used for packet mode
|
|
||||||
private Object idlePacket;
|
|
||||||
private Object idlePacket2;
|
|
||||||
|
|
||||||
public SpongeViaMovementTransmitter() {
|
|
||||||
Class<?> idlePacketClass;
|
|
||||||
try {
|
|
||||||
idlePacketClass = Class.forName("net.minecraft.network.play.client.C03PacketPlayer");
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
return; // We'll hope this is 1.9.4+
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
idlePacket = idlePacketClass.newInstance();
|
|
||||||
idlePacket2 = idlePacketClass.newInstance();
|
|
||||||
|
|
||||||
Field flying = idlePacketClass.getDeclaredField("field_149474_g");
|
|
||||||
flying.setAccessible(true);
|
|
||||||
|
|
||||||
flying.set(idlePacket2, true);
|
|
||||||
} catch (NoSuchFieldException | InstantiationException | IllegalArgumentException | IllegalAccessException e) {
|
|
||||||
throw new RuntimeException("Couldn't make player idle packet, help!", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getFlyingPacket() {
|
|
||||||
if (idlePacket == null)
|
|
||||||
throw new NullPointerException("Could not locate flying packet");
|
|
||||||
return idlePacket2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getGroundPacket() {
|
|
||||||
if (idlePacket == null)
|
|
||||||
throw new NullPointerException("Could not locate flying packet");
|
|
||||||
return idlePacket;
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,37 +4,33 @@
|
|||||||
"version": "1.0"
|
"version": "1.0"
|
||||||
},
|
},
|
||||||
"license": "GNU GPLv3",
|
"license": "GNU GPLv3",
|
||||||
"plugins": [
|
"global": {
|
||||||
{
|
|
||||||
"id": "viaversion",
|
|
||||||
"name": "ViaVersion",
|
|
||||||
"version": "${version}",
|
"version": "${version}",
|
||||||
"description": "${description}",
|
|
||||||
"entrypoint": "com.viaversion.viaversion.SpongePlugin",
|
|
||||||
"branding": {
|
|
||||||
"logo": "assets/viaversion/textures/logo.png",
|
|
||||||
"icon": "assets/viaversion/textures/logo.png"
|
|
||||||
},
|
|
||||||
"links": {
|
"links": {
|
||||||
"homepage": "https://www.spigotmc.org/resources/viaversion.19254/",
|
"homepage": "https://viaversion.com/",
|
||||||
"source": "https://github.com/ViaVersion/ViaVersion",
|
"source": "https://github.com/ViaVersion/ViaVersion",
|
||||||
"issues": "https://github.com/ViaVersion/ViaVersion"
|
"issues": "https://github.com/ViaVersion/ViaVersion/issues"
|
||||||
},
|
},
|
||||||
"contributors": [
|
"contributors": [
|
||||||
{
|
{
|
||||||
"name": "_MylesC"
|
"name": "_MylesC",
|
||||||
|
"description": "Maintainer"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "creeper123123321"
|
"name": "creeper123123321",
|
||||||
|
"description": "Contributor"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Gerrygames"
|
"name": "Gerrygames",
|
||||||
|
"description": "Contributor"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "kennytv"
|
"name": "kennytv",
|
||||||
|
"description": "Maintainer"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Matsv"
|
"name": "Matsv",
|
||||||
|
"description": "Contributor"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
@ -42,7 +38,17 @@
|
|||||||
"id": "spongeapi",
|
"id": "spongeapi",
|
||||||
"version": "8.0.0"
|
"version": "8.0.0"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"branding": {
|
||||||
|
"logo": "assets/viaversion/textures/logo.png"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"id": "viaversion",
|
||||||
|
"name": "ViaVersion",
|
||||||
|
"entrypoint": "com.viaversion.viaversion.SpongePlugin",
|
||||||
|
"description": "${description}"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -1,16 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"modid": "viaversion",
|
|
||||||
"name": "ViaVersion",
|
|
||||||
"version": "${version}",
|
|
||||||
"description": "${description}",
|
|
||||||
"authorList": [
|
|
||||||
"_MylesC",
|
|
||||||
"creeper123123321",
|
|
||||||
"Gerrygames",
|
|
||||||
"kennytv",
|
|
||||||
"Matsv"
|
|
||||||
],
|
|
||||||
"logoFile": "assets/viaversion/textures/logo.png"
|
|
||||||
}
|
|
||||||
]
|
|
@ -21,7 +21,6 @@ import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
|||||||
import com.viaversion.viaversion.configuration.AbstractViaConfig;
|
import com.viaversion.viaversion.configuration.AbstractViaConfig;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.URL;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -47,11 +46,6 @@ public class VelocityViaConfig extends AbstractViaConfig {
|
|||||||
velocityServerProtocols = get("velocity-servers", Map.class, new HashMap<>());
|
velocityServerProtocols = get("velocity-servers", Map.class, new HashMap<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public URL getDefaultConfigURL() {
|
|
||||||
return getClass().getClassLoader().getResource("assets/viaversion/config.yml");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void handleConfig(Map<String, Object> config) {
|
protected void handleConfig(Map<String, Object> config) {
|
||||||
// Parse servers
|
// Parse servers
|
||||||
|
Loading…
Reference in New Issue
Block a user