13
0
geforkt von Mirrors/Velocity

Merge branch 'master' into registered-server

Dieser Commit ist enthalten in:
Andrew Steinborn 2018-09-18 16:50:13 -04:00
Commit 89b5da25be
6 geänderte Dateien mit 80 neuen und 43 gelöschten Zeilen

1
.gitignore vendored
Datei anzeigen

@ -135,3 +135,4 @@ logs/
server-icon.png server-icon.png
/bin/ /bin/
run/ run/
plugins/

Datei anzeigen

@ -10,7 +10,7 @@ import java.util.regex.Pattern;
* Represents a Minecraft 1.13+ channel identifier. This class is immutable and safe for multi-threaded use. * Represents a Minecraft 1.13+ channel identifier. This class is immutable and safe for multi-threaded use.
*/ */
public final class MinecraftChannelIdentifier implements ChannelIdentifier { public final class MinecraftChannelIdentifier implements ChannelIdentifier {
private static final Pattern VALID_IDENTIFIER_REGEX = Pattern.compile("[a-z0-9\\-_]+", Pattern.CASE_INSENSITIVE); private static final Pattern VALID_IDENTIFIER_REGEX = Pattern.compile("[a-z0-9\\-_]+");
private final String namespace; private final String namespace;
private final String name; private final String name;

Datei anzeigen

@ -74,6 +74,7 @@ public class ServerPing {
builder.favicon = favicon; builder.favicon = favicon;
builder.nullOutModinfo = modinfo == null; builder.nullOutModinfo = modinfo == null;
if (modinfo != null) { if (modinfo != null) {
builder.modType = modinfo.type;
builder.mods.addAll(modinfo.modList); builder.mods.addAll(modinfo.modList);
} }
return builder; return builder;
@ -91,6 +92,7 @@ public class ServerPing {
private int onlinePlayers; private int onlinePlayers;
private int maximumPlayers; private int maximumPlayers;
private final List<SamplePlayer> samplePlayers = new ArrayList<>(); private final List<SamplePlayer> samplePlayers = new ArrayList<>();
private String modType;
private final List<Mod> mods = new ArrayList<>(); private final List<Mod> mods = new ArrayList<>();
private Component description; private Component description;
private Favicon favicon; private Favicon favicon;
@ -121,6 +123,11 @@ public class ServerPing {
return this; return this;
} }
public Builder modType(String modType) {
this.modType = Preconditions.checkNotNull(modType, "modType");
return this;
}
public Builder mods(Mod... mods) { public Builder mods(Mod... mods) {
this.mods.addAll(Arrays.asList(mods)); this.mods.addAll(Arrays.asList(mods));
return this; return this;
@ -158,7 +165,7 @@ public class ServerPing {
public ServerPing build() { public ServerPing build() {
return new ServerPing(version, nullOutPlayers ? null : new Players(onlinePlayers, maximumPlayers, samplePlayers), description, favicon, return new ServerPing(version, nullOutPlayers ? null : new Players(onlinePlayers, maximumPlayers, samplePlayers), description, favicon,
nullOutModinfo ? null : new Modinfo(mods)); nullOutModinfo ? null : new Modinfo(modType, mods));
} }
public Version getVersion() { public Version getVersion() {
@ -185,6 +192,10 @@ public class ServerPing {
return favicon; return favicon;
} }
public String getModType() {
return modType;
}
public List<Mod> getMods() { public List<Mod> getMods() {
return mods; return mods;
} }
@ -196,6 +207,7 @@ public class ServerPing {
", onlinePlayers=" + onlinePlayers + ", onlinePlayers=" + onlinePlayers +
", maximumPlayers=" + maximumPlayers + ", maximumPlayers=" + maximumPlayers +
", samplePlayers=" + samplePlayers + ", samplePlayers=" + samplePlayers +
", modType=" + modType +
", mods=" + mods + ", mods=" + mods +
", description=" + description + ", description=" + description +
", favicon=" + favicon + ", favicon=" + favicon +
@ -291,12 +303,13 @@ public class ServerPing {
} }
public static class Modinfo { public static class Modinfo {
public static final Modinfo DEFAULT = new Modinfo(ImmutableList.of()); public static final Modinfo DEFAULT = new Modinfo("FML", ImmutableList.of());
private final String type = "FML"; private final String type;
private final List<Mod> modList; private final List<Mod> modList;
public Modinfo(List<Mod> modList) { public Modinfo(String type, List<Mod> modList) {
this.type = Preconditions.checkNotNull(type, "type");
this.modList = ImmutableList.copyOf(modList); this.modList = ImmutableList.copyOf(modList);
} }
} }

Datei anzeigen

@ -8,7 +8,7 @@ import java.util.function.Supplier;
public class NativeCodeLoader<T> implements Supplier<T> { public class NativeCodeLoader<T> implements Supplier<T> {
private final List<Variant<T>> variants; private final List<Variant<T>> variants;
private Variant<T> selected; private volatile Variant<T> selected;
public NativeCodeLoader(List<Variant<T>> variants) { public NativeCodeLoader(List<Variant<T>> variants) {
this.variants = ImmutableList.copyOf(variants); this.variants = ImmutableList.copyOf(variants);
@ -16,36 +16,41 @@ public class NativeCodeLoader<T> implements Supplier<T> {
@Override @Override
public T get() { public T get() {
if (selected == null) { return tryLoad().object;
selected = select(); }
}
return selected.object; private Variant<T> tryLoad() {
if (selected != null) {
return selected;
}
synchronized (this) {
if (selected != null) {
return selected;
} }
private Variant<T> select() {
for (Variant<T> variant : variants) { for (Variant<T> variant : variants) {
T got = variant.get(); T got = variant.get();
if (got == null) { if (got == null) {
continue; continue;
} }
return variant; selected = variant;
return selected;
} }
throw new IllegalArgumentException("Can't find any suitable variants"); throw new IllegalArgumentException("Can't find any suitable variants");
} }
}
public String getLoadedVariant() { public String getLoadedVariant() {
if (selected == null) { return tryLoad().name;
selected = select();
}
return selected.name;
} }
static class Variant<T> { static class Variant<T> {
private boolean available; private volatile boolean available;
private final Runnable setup; private final Runnable setup;
private final String name; private final String name;
private final T object; private final T object;
private boolean hasBeenSetup = false; private volatile boolean hasBeenSetup = false;
Variant(BooleanSupplier available, Runnable setup, String name, T object) { Variant(BooleanSupplier available, Runnable setup, String name, T object) {
this.available = available.getAsBoolean(); this.available = available.getAsBoolean();
@ -54,29 +59,36 @@ public class NativeCodeLoader<T> implements Supplier<T> {
this.object = object; this.object = object;
} }
private void setup() { public T get() {
if (available && !hasBeenSetup) { if (!available) {
return null;
}
// Make sure setup happens only once
if (!hasBeenSetup) {
synchronized (this) {
// We change availability if need be below, may as well check it again here for sanity.
if (!available) {
return null;
}
// Okay, now try the setup if we haven't done so yet.
if (!hasBeenSetup) {
try { try {
setup.run(); setup.run();
hasBeenSetup = true; hasBeenSetup = true;
return object;
} catch (Exception e) { } catch (Exception e) {
available = false; available = false;
}
}
}
public T get() {
if (!hasBeenSetup) {
setup();
}
if (available) {
return object;
}
return null; return null;
} }
} }
}
}
return object;
}
}
static final BooleanSupplier MACOS = () -> System.getProperty("os.name").equalsIgnoreCase("Mac OS X") && static final BooleanSupplier MACOS = () -> System.getProperty("os.name").equalsIgnoreCase("Mac OS X") &&
System.getProperty("os.arch").equals("x86_64"); System.getProperty("os.arch").equals("x86_64");

Datei anzeigen

@ -23,7 +23,7 @@ public enum StateRegistry {
}, },
STATUS { STATUS {
{ {
SERVERBOUND.register(StatusRequest.class, StatusRequest::new, SERVERBOUND.register(StatusRequest.class, () -> StatusRequest.INSTANCE,
genericMappings(0x00)); genericMappings(0x00));
SERVERBOUND.register(StatusPing.class, StatusPing::new, SERVERBOUND.register(StatusPing.class, StatusPing::new,
genericMappings(0x01)); genericMappings(0x01));

Datei anzeigen

@ -5,6 +5,12 @@ import com.velocitypowered.proxy.protocol.MinecraftPacket;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
public class StatusRequest implements MinecraftPacket { public class StatusRequest implements MinecraftPacket {
public static final StatusRequest INSTANCE = new StatusRequest();
private StatusRequest() {
}
@Override @Override
public void decode(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) { public void decode(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) {
@ -14,4 +20,9 @@ public class StatusRequest implements MinecraftPacket {
public void encode(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) { public void encode(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) {
} }
@Override
public String toString() {
return "StatusRequest";
}
} }