mirror of https://github.com/LOOHP/Limbo.git
Minecraft 1.19.1
This commit is contained in:
parent
42559d83f0
commit
ace420a017
4
pom.xml
4
pom.xml
|
|
@ -24,7 +24,7 @@
|
|||
<groupId>com.loohp</groupId>
|
||||
<artifactId>Limbo</artifactId>
|
||||
<name>Limbo</name>
|
||||
<version>0.6.16-ALPHA</version>
|
||||
<version>0.6.17-ALPHA</version>
|
||||
|
||||
<description>Standalone Limbo Minecraft Server.</description>
|
||||
<url>https://github.com/LOOHP/Limbo</url>
|
||||
|
|
@ -136,7 +136,7 @@
|
|||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<finalName>${project.artifactId}-${project.version}-1.19</finalName>
|
||||
<finalName>${project.artifactId}-${project.version}-1.19.1</finalName>
|
||||
</build>
|
||||
|
||||
<profiles>
|
||||
|
|
|
|||
|
|
@ -131,8 +131,8 @@ public class Limbo {
|
|||
|
||||
//===========================
|
||||
|
||||
public final String SERVER_IMPLEMENTATION_VERSION = "1.19";
|
||||
public final int SERVER_IMPLEMENTATION_PROTOCOL = 759;
|
||||
public final String SERVER_IMPLEMENTATION_VERSION = "1.19.1";
|
||||
public final int SERVER_IMPLEMENTATION_PROTOCOL = 760;
|
||||
public final String LIMBO_IMPLEMENTATION_VERSION;
|
||||
|
||||
private AtomicBoolean isRunning;
|
||||
|
|
|
|||
|
|
@ -618,7 +618,7 @@ public class ClientConnection extends Thread {
|
|||
PacketPlayInTabComplete request = (PacketPlayInTabComplete) packetIn;
|
||||
String[] command = CustomStringUtils.splitStringToArgs(request.getText().substring(1));
|
||||
|
||||
List<TabCompleteMatches> matches = new ArrayList<TabCompleteMatches>(Limbo.getInstance().getPluginManager().getTabOptions(player, command).stream().map(each -> new TabCompleteMatches(each)).collect(Collectors.toList()));
|
||||
List<TabCompleteMatches> matches = new ArrayList<>(Limbo.getInstance().getPluginManager().getTabOptions(player, command).stream().map(each -> new TabCompleteMatches(each)).collect(Collectors.toList()));
|
||||
|
||||
int start = CustomStringUtils.getIndexOfArg(request.getText(), command.length - 1) + 1;
|
||||
int length = command[command.length - 1].length();
|
||||
|
|
|
|||
|
|
@ -1,99 +0,0 @@
|
|||
/*
|
||||
* This file is part of Limbo.
|
||||
*
|
||||
* Copyright (C) 2022. LoohpJames <jamesloohp@gmail.com>
|
||||
* Copyright (C) 2022. Contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.loohp.limbo.network.protocol.packets;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.time.Instant;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
import com.loohp.limbo.utils.DataTypeIO;
|
||||
|
||||
import com.loohp.limbo.utils.NetworkEncryptionUtils;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
|
||||
public class ClientboundPlayerChatPacket extends PacketOut {
|
||||
|
||||
private Component signedContent;
|
||||
private Optional<Component> unsignedContent;
|
||||
private int position;
|
||||
private UUID sender;
|
||||
private Instant time;
|
||||
private NetworkEncryptionUtils.SignatureData saltSignature;
|
||||
|
||||
public ClientboundPlayerChatPacket(Component signedContent, Optional<Component> unsignedContent, int position, UUID sender, Instant time, NetworkEncryptionUtils.SignatureData saltSignature) {
|
||||
this.signedContent = signedContent;
|
||||
this.unsignedContent = unsignedContent;
|
||||
this.position = position;
|
||||
this.sender = sender;
|
||||
this.time = time;
|
||||
this.saltSignature = saltSignature;
|
||||
}
|
||||
|
||||
public Component getSignedContent() {
|
||||
return signedContent;
|
||||
}
|
||||
|
||||
public Optional<Component> getUnsignedContent() {
|
||||
return unsignedContent;
|
||||
}
|
||||
|
||||
public int getPosition() {
|
||||
return position;
|
||||
}
|
||||
|
||||
public UUID getSender() {
|
||||
return sender;
|
||||
}
|
||||
|
||||
public Instant getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
public NetworkEncryptionUtils.SignatureData getSaltSignature() {
|
||||
return saltSignature;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] serializePacket() throws IOException {
|
||||
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
|
||||
|
||||
DataOutputStream output = new DataOutputStream(buffer);
|
||||
output.writeByte(Packet.getPlayOut().get(getClass()));
|
||||
DataTypeIO.writeString(output, GsonComponentSerializer.gson().serialize(signedContent), StandardCharsets.UTF_8);
|
||||
if (unsignedContent.isPresent()) {
|
||||
output.writeBoolean(true);
|
||||
DataTypeIO.writeString(output, GsonComponentSerializer.gson().serialize(unsignedContent.get()), StandardCharsets.UTF_8);
|
||||
} else {
|
||||
output.writeBoolean(false);
|
||||
}
|
||||
DataTypeIO.writeVarInt(output, position);
|
||||
DataTypeIO.writeUUID(output, sender);
|
||||
output.writeLong(time.toEpochMilli());
|
||||
NetworkEncryptionUtils.SignatureData.write(output, saltSignature);
|
||||
|
||||
return buffer.toByteArray();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -31,19 +31,19 @@ import java.nio.charset.StandardCharsets;
|
|||
public class ClientboundSystemChatPacket extends PacketOut {
|
||||
|
||||
private Component message;
|
||||
private int position;
|
||||
private boolean overlay;
|
||||
|
||||
public ClientboundSystemChatPacket(Component message, int position) {
|
||||
public ClientboundSystemChatPacket(Component message, boolean overlay) {
|
||||
this.message = message;
|
||||
this.position = position;
|
||||
this.overlay = overlay;
|
||||
}
|
||||
|
||||
public Component getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public int getPosition() {
|
||||
return position;
|
||||
public boolean isOverlay() {
|
||||
return overlay;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -53,7 +53,7 @@ public class ClientboundSystemChatPacket extends PacketOut {
|
|||
DataOutputStream output = new DataOutputStream(buffer);
|
||||
output.writeByte(Packet.getPlayOut().get(getClass()));
|
||||
DataTypeIO.writeString(output, GsonComponentSerializer.gson().serialize(message), StandardCharsets.UTF_8);
|
||||
DataTypeIO.writeVarInt(output, position);
|
||||
output.writeBoolean(overlay);
|
||||
|
||||
return buffer.toByteArray();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,25 +25,29 @@ import java.nio.charset.StandardCharsets;
|
|||
import java.time.Instant;
|
||||
|
||||
import com.loohp.limbo.utils.DataTypeIO;
|
||||
import com.loohp.limbo.utils.NetworkEncryptionUtils;
|
||||
import com.loohp.limbo.utils.NetworkEncryptionUtils.SignatureData;
|
||||
import com.loohp.limbo.utils.LastSeenMessages;
|
||||
import com.loohp.limbo.utils.MessageSignature;
|
||||
|
||||
public class PacketPlayInChat extends PacketIn {
|
||||
|
||||
private String message;
|
||||
private Instant time;
|
||||
private NetworkEncryptionUtils.SignatureData signature;
|
||||
private boolean previewed;
|
||||
private long salt;
|
||||
private MessageSignature signature;
|
||||
private boolean signedPreview;
|
||||
private LastSeenMessages.b lastSeenMessages;
|
||||
|
||||
public PacketPlayInChat(String message, Instant time, SignatureData signature, boolean previewed) {
|
||||
public PacketPlayInChat(String message, Instant time, long salt, MessageSignature signature, boolean signedPreview, LastSeenMessages.b lastSeenMessages) {
|
||||
this.message = message;
|
||||
this.time = time;
|
||||
this.salt = salt;
|
||||
this.signature = signature;
|
||||
this.previewed = previewed;
|
||||
this.signedPreview = signedPreview;
|
||||
this.lastSeenMessages = lastSeenMessages;
|
||||
}
|
||||
|
||||
public PacketPlayInChat(DataInputStream in) throws IOException {
|
||||
this(DataTypeIO.readString(in, StandardCharsets.UTF_8), Instant.ofEpochMilli(in.readLong()), new NetworkEncryptionUtils.SignatureData(in), in.readBoolean());
|
||||
this(DataTypeIO.readString(in, StandardCharsets.UTF_8), Instant.ofEpochMilli(in.readLong()), in.readLong(), new MessageSignature(in), in.readBoolean(), new LastSeenMessages.b(in));
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
|
|
@ -54,12 +58,19 @@ public class PacketPlayInChat extends PacketIn {
|
|||
return time;
|
||||
}
|
||||
|
||||
public SignatureData getSignature() {
|
||||
public MessageSignature getSignature() {
|
||||
return signature;
|
||||
}
|
||||
|
||||
public boolean isPreviewed() {
|
||||
return previewed;
|
||||
public boolean isSignedPreview() {
|
||||
return signedPreview;
|
||||
}
|
||||
|
||||
public long getSalt() {
|
||||
return salt;
|
||||
}
|
||||
|
||||
public LastSeenMessages.b getLastSeenMessages() {
|
||||
return lastSeenMessages;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,45 +19,40 @@
|
|||
|
||||
package com.loohp.limbo.network.protocol.packets;
|
||||
|
||||
import com.loohp.limbo.utils.ArgumentSignatures;
|
||||
import com.loohp.limbo.utils.DataTypeIO;
|
||||
import com.loohp.limbo.utils.NetworkEncryptionUtils.ArgumentSignatures;
|
||||
import com.loohp.limbo.utils.LastSeenMessages;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.time.Instant;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class ServerboundChatCommandPacket extends PacketIn {
|
||||
|
||||
private String command;
|
||||
private Instant time;
|
||||
private long salt;
|
||||
private ArgumentSignatures argumentSignatures;
|
||||
private boolean commandPreview;
|
||||
private LastSeenMessages.b lastSeenMessages;
|
||||
|
||||
public ServerboundChatCommandPacket(String command, Instant time, ArgumentSignatures argumentSignatures, boolean commandPreview) {
|
||||
public ServerboundChatCommandPacket(String command, Instant time, long salt, ArgumentSignatures argumentSignatures, boolean commandPreview, LastSeenMessages.b lastSeenMessages) {
|
||||
this.command = command;
|
||||
this.time = time;
|
||||
this.salt = salt;
|
||||
this.argumentSignatures = argumentSignatures;
|
||||
this.commandPreview = commandPreview;
|
||||
this.lastSeenMessages = lastSeenMessages;
|
||||
}
|
||||
|
||||
public ServerboundChatCommandPacket(DataInputStream in) throws IOException {
|
||||
this.command = DataTypeIO.readString(in, StandardCharsets.UTF_8);
|
||||
this.time = Instant.ofEpochMilli(in.readLong());
|
||||
long salt = in.readLong();
|
||||
int size = DataTypeIO.readVarInt(in);
|
||||
Map<String, byte[]> signatures = new HashMap<>(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
String key = DataTypeIO.readString(in, StandardCharsets.UTF_8);
|
||||
int arraySize = DataTypeIO.readVarInt(in);
|
||||
byte[] value = new byte[arraySize];
|
||||
in.readFully(value);
|
||||
signatures.put(key, value);
|
||||
}
|
||||
this.argumentSignatures = new ArgumentSignatures(salt, signatures);
|
||||
this.salt = in.readLong();
|
||||
this.argumentSignatures = new ArgumentSignatures(in);
|
||||
this.commandPreview = in.readBoolean();
|
||||
this.lastSeenMessages = new LastSeenMessages.b(in);
|
||||
}
|
||||
|
||||
public String getCommand() {
|
||||
|
|
@ -68,6 +63,10 @@ public class ServerboundChatCommandPacket extends PacketIn {
|
|||
return time;
|
||||
}
|
||||
|
||||
public long getSalt() {
|
||||
return salt;
|
||||
}
|
||||
|
||||
public ArgumentSignatures getArgumentSignatures() {
|
||||
return argumentSignatures;
|
||||
}
|
||||
|
|
@ -76,4 +75,7 @@ public class ServerboundChatCommandPacket extends PacketIn {
|
|||
return commandPreview;
|
||||
}
|
||||
|
||||
public LastSeenMessages.b getLastSeenMessages() {
|
||||
return lastSeenMessages;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@ import com.loohp.limbo.network.protocol.packets.PacketPlayOutResourcePackSend;
|
|||
import com.loohp.limbo.network.protocol.packets.PacketPlayOutRespawn;
|
||||
import com.loohp.limbo.utils.BungeecordAdventureConversionUtils;
|
||||
import com.loohp.limbo.utils.GameMode;
|
||||
import com.loohp.limbo.utils.MessageSignature;
|
||||
import com.loohp.limbo.utils.NamespacedKey;
|
||||
import com.loohp.limbo.utils.NetworkEncryptionUtils;
|
||||
import net.kyori.adventure.audience.MessageType;
|
||||
import net.kyori.adventure.bossbar.BossBar;
|
||||
import net.kyori.adventure.identity.Identity;
|
||||
|
|
@ -304,7 +304,7 @@ public class Player extends LivingEntity implements CommandSender {
|
|||
chat(message, verbose, null, Instant.now());
|
||||
}
|
||||
|
||||
public void chat(String message, boolean verbose, NetworkEncryptionUtils.SignatureData saltSignature, Instant time) {
|
||||
public void chat(String message, boolean verbose, MessageSignature saltSignature, Instant time) {
|
||||
if (Limbo.getInstance().getServerProperties().isAllowChat()) {
|
||||
PlayerChatEvent event = Limbo.getInstance().getEventsManager().callEvent(new PlayerChatEvent(this, CHAT_DEFAULT_FORMAT, message, false));
|
||||
if (!event.isCancelled()) {
|
||||
|
|
@ -393,7 +393,7 @@ public class Player extends LivingEntity implements CommandSender {
|
|||
}
|
||||
|
||||
public void setTitleTimer(int fadeIn, int stay, int fadeOut) {
|
||||
sendTitlePart(TitlePart.TIMES, Title.Times.of(Duration.ofMillis(fadeIn * 50), Duration.ofMillis(stay * 50), Duration.ofMillis(fadeOut * 50)));
|
||||
sendTitlePart(TitlePart.TIMES, Title.Times.times(Duration.ofMillis(fadeIn * 50), Duration.ofMillis(stay * 50), Duration.ofMillis(fadeOut * 50)));
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
|
|
@ -409,7 +409,7 @@ public class Player extends LivingEntity implements CommandSender {
|
|||
}
|
||||
|
||||
public void setTitleSubTitle(String title, String subTitle, int fadeIn, int stay, int fadeOut) {
|
||||
sendTitlePart(TitlePart.TIMES, Title.Times.of(Duration.ofMillis(fadeIn * 50), Duration.ofMillis(stay * 50), Duration.ofMillis(fadeOut * 50)));
|
||||
sendTitlePart(TitlePart.TIMES, Title.Times.times(Duration.ofMillis(fadeIn * 50), Duration.ofMillis(stay * 50), Duration.ofMillis(fadeOut * 50)));
|
||||
sendTitlePart(TitlePart.SUBTITLE, LegacyComponentSerializer.legacySection().deserialize(subTitle));
|
||||
sendTitlePart(TitlePart.TITLE, LegacyComponentSerializer.legacySection().deserialize(title));
|
||||
}
|
||||
|
|
@ -419,7 +419,7 @@ public class Player extends LivingEntity implements CommandSender {
|
|||
sendMessage(source, message, type, null, Instant.now());
|
||||
}
|
||||
|
||||
public void sendMessage(Identity source, Component message, MessageType type, NetworkEncryptionUtils.SignatureData signature, Instant time) {
|
||||
public void sendMessage(Identity source, Component message, MessageType type, MessageSignature signature, Instant time) {
|
||||
try {
|
||||
PacketOut chat;
|
||||
switch (type) {
|
||||
|
|
@ -434,7 +434,7 @@ public class Player extends LivingEntity implements CommandSender {
|
|||
*/
|
||||
case SYSTEM:
|
||||
default:
|
||||
chat = new ClientboundSystemChatPacket(message, 1);
|
||||
chat = new ClientboundSystemChatPacket(message, false);
|
||||
break;
|
||||
}
|
||||
clientConnection.sendPacket(chat);
|
||||
|
|
@ -469,7 +469,7 @@ public class Player extends LivingEntity implements CommandSender {
|
|||
@Override
|
||||
public void sendActionBar(Component message) {
|
||||
try {
|
||||
ClientboundSystemChatPacket chat = new ClientboundSystemChatPacket(message, 2);
|
||||
ClientboundSystemChatPacket chat = new ClientboundSystemChatPacket(message, true);
|
||||
clientConnection.sendPacket(chat);
|
||||
} catch (IOException ignored) {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
* This file is part of Limbo.
|
||||
*
|
||||
* Copyright (C) 2022. LoohpJames <jamesloohp@gmail.com>
|
||||
* Copyright (C) 2022. Contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.loohp.limbo.utils;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
public class ArgumentSignatures {
|
||||
|
||||
public static final ArgumentSignatures EMPTY = new ArgumentSignatures(Collections.emptyList());
|
||||
private static final int MAX_ARGUMENT_COUNT = 8;
|
||||
private static final int MAX_ARGUMENT_NAME_LENGTH = 16;
|
||||
|
||||
private List<a> entries;
|
||||
|
||||
public ArgumentSignatures(List<a> entries) {
|
||||
this.entries = entries;
|
||||
}
|
||||
|
||||
public ArgumentSignatures(DataInputStream in) throws IOException {
|
||||
int size = DataTypeIO.readVarInt(in);
|
||||
entries = new ArrayList<>(8);
|
||||
for (int i = 0; i < size; i++) {
|
||||
entries.add(new ArgumentSignatures.a(in));
|
||||
}
|
||||
}
|
||||
|
||||
public List<a> getEntries() {
|
||||
return entries;
|
||||
}
|
||||
|
||||
public MessageSignature get(String s) {
|
||||
Iterator<ArgumentSignatures.a> iterator = this.entries.iterator();
|
||||
|
||||
ArgumentSignatures.a argumentsignatures_a;
|
||||
|
||||
do {
|
||||
if (!iterator.hasNext()) {
|
||||
return MessageSignature.EMPTY;
|
||||
}
|
||||
|
||||
argumentsignatures_a = iterator.next();
|
||||
} while (!argumentsignatures_a.name.equals(s));
|
||||
|
||||
return argumentsignatures_a.signature;
|
||||
}
|
||||
|
||||
public void write(DataOutputStream out) throws IOException {
|
||||
DataTypeIO.writeVarInt(out, entries.size());
|
||||
for (ArgumentSignatures.a argumentsignatures_a : entries) {
|
||||
argumentsignatures_a.write(out);
|
||||
}
|
||||
}
|
||||
|
||||
public static class a {
|
||||
|
||||
private String name;
|
||||
private MessageSignature signature;
|
||||
|
||||
public a(String name, MessageSignature signature) {
|
||||
this.name = name;
|
||||
this.signature = signature;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public MessageSignature getSignature() {
|
||||
return signature;
|
||||
}
|
||||
|
||||
public a(DataInputStream in) throws IOException {
|
||||
this(DataTypeIO.readString(in, StandardCharsets.UTF_8), new MessageSignature(in));
|
||||
}
|
||||
|
||||
public void write(DataOutputStream out) throws IOException {
|
||||
DataTypeIO.writeString(out, name, StandardCharsets.UTF_8);
|
||||
this.signature.write(out);
|
||||
}
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface b {
|
||||
|
||||
MessageSignature sign(String s, String s1);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,140 @@
|
|||
/*
|
||||
* This file is part of Limbo.
|
||||
*
|
||||
* Copyright (C) 2022. LoohpJames <jamesloohp@gmail.com>
|
||||
* Copyright (C) 2022. Contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.loohp.limbo.utils;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
public class LastSeenMessages {
|
||||
|
||||
public static LastSeenMessages EMPTY = new LastSeenMessages(Collections.emptyList());
|
||||
public static final int LAST_SEEN_MESSAGES_MAX_LENGTH = 5;
|
||||
|
||||
private List<a> entries;
|
||||
|
||||
public LastSeenMessages(List<LastSeenMessages.a> entries) {
|
||||
this.entries = entries;
|
||||
}
|
||||
|
||||
public LastSeenMessages(DataInputStream in) throws IOException {
|
||||
int size = DataTypeIO.readVarInt(in);
|
||||
entries = new ArrayList<>(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
entries.add(new LastSeenMessages.a(in));
|
||||
}
|
||||
}
|
||||
|
||||
public void write(DataOutputStream out) throws IOException {
|
||||
DataTypeIO.writeVarInt(out, entries.size());
|
||||
for (LastSeenMessages.a lastseenmessages_a : entries) {
|
||||
lastseenmessages_a.write(out);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateHash(DataOutputStream dataoutput) throws IOException {
|
||||
Iterator<a> iterator = this.entries.iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
LastSeenMessages.a lastseenmessages_a = iterator.next();
|
||||
UUID uuid = lastseenmessages_a.getProfileId();
|
||||
MessageSignature messagesignature = lastseenmessages_a.getLastSignature();
|
||||
|
||||
dataoutput.writeByte(70);
|
||||
dataoutput.writeLong(uuid.getMostSignificantBits());
|
||||
dataoutput.writeLong(uuid.getLeastSignificantBits());
|
||||
dataoutput.write(messagesignature.getBytes());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class a {
|
||||
|
||||
private UUID profileId;
|
||||
private MessageSignature lastSignature;
|
||||
|
||||
public UUID getProfileId() {
|
||||
return profileId;
|
||||
}
|
||||
|
||||
public MessageSignature getLastSignature() {
|
||||
return lastSignature;
|
||||
}
|
||||
|
||||
public a(UUID profileId, MessageSignature lastSignature) {
|
||||
this.profileId = profileId;
|
||||
this.lastSignature = lastSignature;
|
||||
}
|
||||
|
||||
public a(DataInputStream in) throws IOException {
|
||||
this(DataTypeIO.readUUID(in), new MessageSignature(in));
|
||||
}
|
||||
|
||||
public void write(DataOutputStream out) throws IOException {
|
||||
DataTypeIO.writeUUID(out, this.profileId);
|
||||
this.lastSignature.write(out);
|
||||
}
|
||||
}
|
||||
|
||||
public static class b {
|
||||
|
||||
private LastSeenMessages lastSeen;
|
||||
private Optional<a> lastReceived;
|
||||
|
||||
public b(LastSeenMessages lastSeen, Optional<LastSeenMessages.a> lastReceived) {
|
||||
this.lastSeen = lastSeen;
|
||||
this.lastReceived = lastReceived;
|
||||
}
|
||||
|
||||
public b(DataInputStream in) throws IOException {
|
||||
this.lastSeen = new LastSeenMessages(in);
|
||||
if (in.readBoolean()) {
|
||||
this.lastReceived = Optional.of(new LastSeenMessages.a(in));
|
||||
} else {
|
||||
this.lastReceived = Optional.empty();
|
||||
}
|
||||
}
|
||||
|
||||
public void write(DataOutputStream out) throws IOException {
|
||||
this.lastSeen.write(out);
|
||||
if (lastReceived.isPresent()) {
|
||||
out.writeBoolean(true);
|
||||
lastReceived.get().write(out);
|
||||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
}
|
||||
|
||||
public LastSeenMessages getLastSeen() {
|
||||
return lastSeen;
|
||||
}
|
||||
|
||||
public Optional<a> getLastReceived() {
|
||||
return lastReceived;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
* This file is part of Limbo.
|
||||
*
|
||||
* Copyright (C) 2022. LoohpJames <jamesloohp@gmail.com>
|
||||
* Copyright (C) 2022. Contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.loohp.limbo.utils;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
import java.util.Base64;
|
||||
|
||||
public class MessageSignature {
|
||||
|
||||
public static final MessageSignature EMPTY = new MessageSignature(new byte[0]);
|
||||
|
||||
private byte[] bytes;
|
||||
|
||||
public MessageSignature(byte[] bytes) {
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
public byte[] getBytes() {
|
||||
return bytes;
|
||||
}
|
||||
|
||||
public MessageSignature(DataInputStream in) throws IOException {
|
||||
this.bytes = new byte[DataTypeIO.readVarInt(in)];
|
||||
in.readFully(bytes);
|
||||
}
|
||||
|
||||
public void write(DataOutputStream out) throws IOException {
|
||||
out.write(this.bytes.length);
|
||||
out.write(this.bytes);
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return this.bytes.length == 0;
|
||||
}
|
||||
|
||||
public ByteBuffer asByteBuffer() {
|
||||
return !this.isEmpty() ? ByteBuffer.wrap(this.bytes) : null;
|
||||
}
|
||||
|
||||
public boolean equals(Object object) {
|
||||
boolean flag;
|
||||
|
||||
if (this != object) {
|
||||
label22:
|
||||
{
|
||||
if (object instanceof MessageSignature) {
|
||||
MessageSignature messagesignature = (MessageSignature) object;
|
||||
|
||||
if (Arrays.equals(this.bytes, messagesignature.bytes)) {
|
||||
break label22;
|
||||
}
|
||||
}
|
||||
|
||||
flag = false;
|
||||
return flag;
|
||||
}
|
||||
}
|
||||
|
||||
flag = true;
|
||||
return flag;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return Arrays.hashCode(this.bytes);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return !this.isEmpty() ? Base64.getEncoder().encodeToString(this.bytes) : "empty";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
/*
|
||||
* This file is part of Limbo.
|
||||
*
|
||||
* Copyright (C) 2022. LoohpJames <jamesloohp@gmail.com>
|
||||
* Copyright (C) 2022. Contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.loohp.limbo.utils;
|
||||
|
||||
import com.google.common.primitives.Longs;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
|
||||
public class NetworkEncryptionUtils {
|
||||
|
||||
public static class SignatureData {
|
||||
|
||||
public static final SignatureData NONE = new SignatureData(0L, new byte[0]);
|
||||
private long salt;
|
||||
private byte[] signature;
|
||||
|
||||
public SignatureData(long salt, byte[] signature) {
|
||||
this.salt = salt;
|
||||
this.signature = signature;
|
||||
}
|
||||
|
||||
public SignatureData(DataInputStream in) throws IOException {
|
||||
this.salt = in.readLong();
|
||||
int length = DataTypeIO.readVarInt(in);
|
||||
this.signature = new byte[length];
|
||||
in.readFully(this.signature);
|
||||
}
|
||||
|
||||
public boolean isSignaturePresent() {
|
||||
return this.signature.length > 0;
|
||||
}
|
||||
|
||||
public static void write(DataOutputStream out, SignatureData signatureData) throws IOException {
|
||||
out.writeLong(signatureData.salt);
|
||||
DataTypeIO.writeVarInt(out, signatureData.signature.length);
|
||||
out.write(signatureData.signature);
|
||||
}
|
||||
|
||||
public byte[] getSalt() {
|
||||
return Longs.toByteArray(this.salt);
|
||||
}
|
||||
}
|
||||
|
||||
public static class ArgumentSignatures {
|
||||
|
||||
private long salt;
|
||||
private Map<String, byte[]> signatures;
|
||||
|
||||
public ArgumentSignatures(long salt, Map<String, byte[]> signatures) {
|
||||
this.salt = salt;
|
||||
this.signatures = signatures;
|
||||
}
|
||||
|
||||
public long getSalt() {
|
||||
return salt;
|
||||
}
|
||||
|
||||
public Map<String, byte[]> getSignatures() {
|
||||
return signatures;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -12,44 +12,43 @@
|
|||
"PacketLoginOutPluginMessaging": "0x04"
|
||||
},
|
||||
"PlayIn": {
|
||||
"0x11": "PacketPlayInKeepAlive",
|
||||
"0x03": "ServerboundChatCommandPacket",
|
||||
"0x04": "PacketPlayInChat",
|
||||
"0x14": "PacketPlayInPositionAndLook",
|
||||
"0x13": "PacketPlayInPosition",
|
||||
"0x15": "PacketPlayInRotation",
|
||||
"0x0C": "PacketPlayInPluginMessaging",
|
||||
"0x08": "PacketPlayInTabComplete",
|
||||
"0x27": "PacketPlayInHeldItemChange",
|
||||
"0x23": "PacketPlayInResourcePackStatus"
|
||||
"0x12": "PacketPlayInKeepAlive",
|
||||
"0x04": "ServerboundChatCommandPacket",
|
||||
"0x05": "PacketPlayInChat",
|
||||
"0x15": "PacketPlayInPositionAndLook",
|
||||
"0x14": "PacketPlayInPosition",
|
||||
"0x16": "PacketPlayInRotation",
|
||||
"0x0D": "PacketPlayInPluginMessaging",
|
||||
"0x09": "PacketPlayInTabComplete",
|
||||
"0x28": "PacketPlayInHeldItemChange",
|
||||
"0x24": "PacketPlayInResourcePackStatus"
|
||||
},
|
||||
"PlayOut": {
|
||||
"PacketPlayOutLogin": "0x23",
|
||||
"PacketPlayOutPositionAndLook": "0x36",
|
||||
"PacketPlayOutSpawnPosition": "0x4A",
|
||||
"ClientboundPlayerChatPacket": "0x30",
|
||||
"ClientboundSystemChatPacket": "0x5F",
|
||||
"PacketPlayOutPlayerAbilities": "0x2F",
|
||||
"ClientboundLevelChunkWithLightPacket": "0x1F",
|
||||
"PacketPlayOutUnloadChunk": "0x1A",
|
||||
"PacketPlayOutKeepAlive": "0x1E",
|
||||
"PacketPlayOutPlayerInfo": "0x34",
|
||||
"PacketPlayOutUpdateViewPosition": "0x48",
|
||||
"PacketPlayOutDisconnect": "0x17",
|
||||
"PacketPlayOutPluginMessaging": "0x15",
|
||||
"PacketPlayOutLogin": "0x25",
|
||||
"PacketPlayOutPositionAndLook": "0x39",
|
||||
"PacketPlayOutSpawnPosition": "0x4D",
|
||||
"ClientboundSystemChatPacket": "0x62",
|
||||
"PacketPlayOutPlayerAbilities": "0x31",
|
||||
"ClientboundLevelChunkWithLightPacket": "0x21",
|
||||
"PacketPlayOutUnloadChunk": "0x1C",
|
||||
"PacketPlayOutKeepAlive": "0x20",
|
||||
"PacketPlayOutPlayerInfo": "0x37",
|
||||
"PacketPlayOutUpdateViewPosition": "0x4B",
|
||||
"PacketPlayOutDisconnect": "0x19",
|
||||
"PacketPlayOutPluginMessaging": "0x16",
|
||||
"PacketPlayOutTabComplete": "0x0E",
|
||||
"PacketPlayOutDeclareCommands": "0x0F",
|
||||
"PacketPlayOutRespawn": "0x3B",
|
||||
"PacketPlayOutGameState": "0x1B",
|
||||
"PacketPlayOutEntityDestroy": "0x38",
|
||||
"PacketPlayOutEntityMetadata": "0x4D",
|
||||
"PacketPlayOutRespawn": "0x3E",
|
||||
"PacketPlayOutGameState": "0x1D",
|
||||
"PacketPlayOutEntityDestroy": "0x3B",
|
||||
"PacketPlayOutEntityMetadata": "0x50",
|
||||
"PacketPlayOutSpawnEntity": "0x00",
|
||||
"PacketPlayOutHeldItemChange": "0x47",
|
||||
"PacketPlayOutPlayerListHeaderFooter": "0x60",
|
||||
"PacketPlayOutResourcePackSend": "0x3A",
|
||||
"ClientboundSetTitlesAnimationPacket": "0x5B",
|
||||
"ClientboundSetTitleTextPacket": "0x5A",
|
||||
"ClientboundSetSubtitleTextPacket": "0x58",
|
||||
"PacketPlayOutHeldItemChange": "0x4A",
|
||||
"PacketPlayOutPlayerListHeaderFooter": "0x63",
|
||||
"PacketPlayOutResourcePackSend": "0x3D",
|
||||
"ClientboundSetTitlesAnimationPacket": "0x5E",
|
||||
"ClientboundSetTitleTextPacket": "0x5D",
|
||||
"ClientboundSetSubtitleTextPacket": "0x5B",
|
||||
"ClientboundClearTitlesPacket": "0x0D"
|
||||
},
|
||||
"StatusIn": {
|
||||
|
|
|
|||
|
|
@ -4302,47 +4302,53 @@
|
|||
"minecraft:item_interact_start": {
|
||||
"protocol_id": 29
|
||||
},
|
||||
"minecraft:lightning_strike": {
|
||||
"minecraft:jukebox_play": {
|
||||
"protocol_id": 30
|
||||
},
|
||||
"minecraft:note_block_play": {
|
||||
"minecraft:jukebox_stop_play": {
|
||||
"protocol_id": 31
|
||||
},
|
||||
"minecraft:piston_contract": {
|
||||
"minecraft:lightning_strike": {
|
||||
"protocol_id": 32
|
||||
},
|
||||
"minecraft:piston_extend": {
|
||||
"minecraft:note_block_play": {
|
||||
"protocol_id": 33
|
||||
},
|
||||
"minecraft:prime_fuse": {
|
||||
"minecraft:piston_contract": {
|
||||
"protocol_id": 34
|
||||
},
|
||||
"minecraft:projectile_land": {
|
||||
"minecraft:piston_extend": {
|
||||
"protocol_id": 35
|
||||
},
|
||||
"minecraft:projectile_shoot": {
|
||||
"minecraft:prime_fuse": {
|
||||
"protocol_id": 36
|
||||
},
|
||||
"minecraft:sculk_sensor_tendrils_clicking": {
|
||||
"minecraft:projectile_land": {
|
||||
"protocol_id": 37
|
||||
},
|
||||
"minecraft:shear": {
|
||||
"minecraft:projectile_shoot": {
|
||||
"protocol_id": 38
|
||||
},
|
||||
"minecraft:shriek": {
|
||||
"minecraft:sculk_sensor_tendrils_clicking": {
|
||||
"protocol_id": 39
|
||||
},
|
||||
"minecraft:splash": {
|
||||
"minecraft:shear": {
|
||||
"protocol_id": 40
|
||||
},
|
||||
"minecraft:step": {
|
||||
"minecraft:shriek": {
|
||||
"protocol_id": 41
|
||||
},
|
||||
"minecraft:swim": {
|
||||
"minecraft:splash": {
|
||||
"protocol_id": 42
|
||||
},
|
||||
"minecraft:teleport": {
|
||||
"minecraft:step": {
|
||||
"protocol_id": 43
|
||||
},
|
||||
"minecraft:swim": {
|
||||
"protocol_id": 44
|
||||
},
|
||||
"minecraft:teleport": {
|
||||
"protocol_id": 45
|
||||
}
|
||||
},
|
||||
"protocol_id": 0
|
||||
|
|
|
|||
Loading…
Reference in New Issue