1
0

Commits vergleichen

...

3 Commits

Autor SHA1 Nachricht Datum
Finn
e72c3c4f2d Dont send everybody the packet. 2023-04-21 11:39:57 +02:00
Finn
2a91330453 fix build 2023-04-20 12:16:17 +02:00
Finn
ba106edd58 Initial test implementation 2023-04-20 12:15:15 +02:00
8 geänderte Dateien mit 318 neuen und 1 gelöschten Zeilen

Datei anzeigen

@ -24,6 +24,7 @@ import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.commands.*;
import de.steamwar.bungeecore.listeners.*;
import de.steamwar.bungeecore.listeners.mods.*;
import de.steamwar.bungeecore.listeners.mods.lunar.Lunar;
import de.steamwar.bungeecore.listeners.ping.PingListener;
import de.steamwar.bungeecore.network.BungeeNetworkHandler;
import de.steamwar.bungeecore.network.NetworkReceiver;
@ -122,6 +123,7 @@ public class BungeeCore extends Plugin {
new Fabric();
new SubserverProtocolFixer();
new PingListener();
new Lunar();
local = new Node.LocalNode();
if(MAIN_SERVER) {

Datei anzeigen

@ -22,6 +22,7 @@ package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.Storage;
import de.steamwar.bungeecore.listeners.mods.Utils;
import de.steamwar.bungeecore.listeners.mods.lunar.Lunar;
import de.steamwar.command.SWCommand;
import de.steamwar.command.SWCommandUtils;
import de.steamwar.command.TypeMapper;
@ -111,7 +112,9 @@ public class WhoisCommand extends SWCommand {
if (Utils.playerModMap.containsKey(user.getUUID())) {
Mod.Platform modPlatform = Utils.playerModMap.get(user.getUUID()).get(0).getPlatform();
Message.send("WHOIS_PLATFORM", player, modPlatform.toString());
//Message.send("WHOIS_PLATFORM", player, modPlatform.toString());
Message.send("WHOIS_PLATFORM", player, Lunar.lunarPlayers.contains(player) ? "LABYMOD" : modPlatform.toString());
}
if (parameterTypes.contains(WhoisParameterTypes.MOD)) {

Datei anzeigen

@ -0,0 +1,74 @@
package de.steamwar.bungeecore.listeners.mods.lunar;
import io.netty.buffer.ByteBuf;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
public class ByteBufWrapper {
private final ByteBuf buf;
public ByteBufWrapper(ByteBuf buf) {
this.buf = buf;
}
public void writeVarInt(int b) {
while ((b & -128) != 0) {
this.buf.writeByte(b & 127 | 128);
b >>>= 7;
}
this.buf.writeByte(b);
}
public int readVarInt() {
int i = 0;
int chunk = 0;
byte b;
do {
b = this.buf.readByte();
i |= (b & 127) << chunk++ * 7;
if (chunk > 5) {
throw new RuntimeException("VarInt too big");
}
} while ((b & 128) == 128);
return i;
}
public void writeString(String s) {
byte[] arr = s.getBytes(StandardCharsets.UTF_8);
this.writeVarInt(arr.length);
this.buf.writeBytes(arr);
}
public String readString() {
int len = readVarInt();
byte[] buffer = new byte[len];
buf.readBytes(buffer);
return new String(buffer, StandardCharsets.UTF_8);
}
public void writeUUID(UUID uuid) {
this.buf.writeLong(uuid.getMostSignificantBits());
this.buf.writeLong(uuid.getLeastSignificantBits());
}
public UUID readUUID() {
long mostSigBits = this.buf.readLong();
long leastSigBits = this.buf.readLong();
return new UUID(mostSigBits, leastSigBits);
}
public ByteBuf buf() {
return buf;
}
}

Datei anzeigen

@ -0,0 +1,44 @@
package de.steamwar.bungeecore.listeners.mods.lunar;
import de.steamwar.bungeecore.listeners.mods.lunar.packets.LCPacketModSettings;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public abstract class LCPacket {
private static final Map<Class<? extends LCPacket>, Integer> classToId = new HashMap<>();
static {
addPacket(31, LCPacketModSettings.class);
}
public static byte[] getPacketData(LCPacket packet) {
return getPacketBuf(packet).array();
}
public abstract void write(ByteBufWrapper buf) throws IOException;
public static ByteBuf getPacketBuf(LCPacket packet) {
ByteBufWrapper wrappedBuffer = new ByteBufWrapper(Unpooled.buffer());
wrappedBuffer.writeVarInt(classToId.get(packet.getClass()));
try {
packet.write(wrappedBuffer);
} catch (IOException ex) {
ex.printStackTrace();
}
return wrappedBuffer.buf();
}
private static void addPacket(int id, Class<? extends LCPacket> clazz) {
if (classToId.containsKey(clazz)) {
throw new IllegalArgumentException("Duplicate packet class (" + clazz.getSimpleName() + "), already used by " + classToId.get(clazz));
}
classToId.put(clazz, id);
}
}

Datei anzeigen

@ -0,0 +1,57 @@
package de.steamwar.bungeecore.listeners.mods.lunar;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.listeners.BasicListener;
import de.steamwar.bungeecore.listeners.mods.lunar.packets.LCPacketModSettings;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.event.EventHandler;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
public class Lunar extends BasicListener {
public static final Set<ProxiedPlayer> lunarPlayers = new HashSet<>();
public static final String MESSAGE_CHANNEL = "lunarclient:pm";
static {
BungeeCore.get().getProxy().registerChannel(MESSAGE_CHANNEL);
}
@EventHandler
public void onPostLogin(PostLoginEvent e) {
ProxiedPlayer player = e.getPlayer();
LCPacketModSettings modSettingsPacket = new LCPacketModSettings();
ModSettings modSettings = new ModSettings();
modSettings.addModSetting("freelook", new ModSettings.ModSetting(false, new HashMap<>()));
player.sendData(MESSAGE_CHANNEL, LCPacket.getPacketData(modSettingsPacket));
}
@EventHandler
public void onPluginMessageEvent(PluginMessageEvent e) {
if (!e.getTag().equals(MESSAGE_CHANNEL))
return;
if (!(e.getSender() instanceof ProxiedPlayer)) {
return;
}
lunarPlayers.add((ProxiedPlayer) e.getSender());
}
@EventHandler
public void onDisconnect(PlayerDisconnectEvent e) {
lunarPlayers.remove(e.getPlayer());
}
}

Datei anzeigen

@ -0,0 +1,71 @@
package de.steamwar.bungeecore.listeners.mods.lunar;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class ModSettings {
public static final Gson GSON = new GsonBuilder().registerTypeHierarchyAdapter(ModSettings.class, new ModSettingsAdapter()).create();
private Map<String, ModSetting> modSettings = new HashMap<>();
public ModSettings addModSetting(String modId, ModSetting setting) {
modSettings.put(modId, setting);
return this;
}
public ModSetting getModSetting(String modId) {
return this.modSettings.get(modId);
}
public Map<String, ModSetting> getModSettings() {
return modSettings;
}
public static class ModSetting {
private boolean enabled;
private Map<String, Object> properties;
public ModSetting() { } // for serialization
public ModSetting(boolean enabled, Map<String, Object> properties) {
this.enabled = enabled;
this.properties = properties;
}
public boolean isEnabled() {
return enabled;
}
public Map<String, Object> getProperties() {
return properties;
}
@Override
public String toString() {
return "ModSetting{" +
"enabled=" + enabled +
", properties=" + properties +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ModSetting that = (ModSetting) o;
return enabled == that.enabled &&
Objects.equals(properties, that.properties);
}
@Override
public int hashCode() {
return Objects.hash(enabled, properties);
}
}
}

Datei anzeigen

@ -0,0 +1,40 @@
package de.steamwar.bungeecore.listeners.mods.lunar;
import com.google.gson.*;
import java.lang.reflect.Type;
import java.util.Map;
public class ModSettingsAdapter implements JsonSerializer<ModSettings> {
@Override
public JsonElement serialize(ModSettings modSettings, Type type, JsonSerializationContext jsonSerializationContext) {
JsonObject object = new JsonObject();
for (Map.Entry<String, ModSettings.ModSetting> entry : modSettings.getModSettings().entrySet()) {
object.add(entry.getKey(), serializeModSetting(entry.getValue()));
}
return object;
}
private JsonObject serializeModSetting(ModSettings.ModSetting setting) {
JsonObject object = new JsonObject();
JsonObject properties = new JsonObject();
object.addProperty("enabled", setting.isEnabled());
for (Map.Entry<String, Object> entry : setting.getProperties().entrySet()) {
JsonPrimitive primitive;
if (entry.getValue() instanceof Boolean) {
primitive = new JsonPrimitive((Boolean) entry.getValue());
} else if (entry.getValue() instanceof String) {
primitive = new JsonPrimitive((String) entry.getValue());
} else if (entry.getValue() instanceof Number) {
primitive = new JsonPrimitive((Number) entry.getValue());
} else {
continue;
}
properties.add(entry.getKey(), primitive);
}
object.add("properties", properties);
return object;
}
}

Datei anzeigen

@ -0,0 +1,26 @@
package de.steamwar.bungeecore.listeners.mods.lunar.packets;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import de.steamwar.bungeecore.listeners.mods.lunar.ByteBufWrapper;
import de.steamwar.bungeecore.listeners.mods.lunar.LCPacket;
import de.steamwar.bungeecore.listeners.mods.lunar.ModSettings;
import java.io.IOException;
public final class LCPacketModSettings extends LCPacket {
private ModSettings settings;
public LCPacketModSettings() {}
public LCPacketModSettings(ModSettings modSettings) {
this.settings = modSettings;
}
@Override
public void write(ByteBufWrapper buf) throws IOException {
buf.writeString(ModSettings.GSON.toJson(this.settings));
}
}