mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-03 05:26:50 +01:00
842e040c19
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 220bc594 #486: Add method to get player's attack cooldown 21853d39 SPIGOT-5681: Increase max plugin channel size 5b972adc Improve build process b55e58d9 Note which custom generator is missing required method CraftBukkit Changes:893ad93b
#650: Add method to get player's attack cooldownef706b06
#655: Added support for the VM tag jansi.passthrough when processing messages sent to a ColouredConsoleSender.e0cfb347
SPIGOT-5689: Fireball.setDirection increases velocity too much94cb030f
SPIGOT-5673: swingHand API does not show to selfb331a055
SPIGOT-5680: isChunkGenerated creates empty region filese1335932
Improve build processa8ec1d60
Add a couple of method null checks to CraftWorldce66f693
Misc checkstyle fixes8bd0e9ab
SPIGOT-5669: Fix Beehive.isSedated Spigot Changes: 2040c4c4 SPIGOT-5677, MC-114796: Fix portals generating outside world border ab8f6b5a Rebuild patches e7dc2f53 Rebuild patches
204 lines
9.4 KiB
Diff
204 lines
9.4 KiB
Diff
From d166e9638ad9b6fe12aee5037f72db11e495044f Mon Sep 17 00:00:00 2001
|
|
From: MiniDigger <admin@minidigger.me>
|
|
Date: Mon, 20 Jan 2020 21:38:15 +0100
|
|
Subject: [PATCH] Implement Player Client Options API
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperSkinParts.java b/src/main/java/com/destroystokyo/paper/PaperSkinParts.java
|
|
new file mode 100644
|
|
index 0000000000..b6f4400df3
|
|
--- /dev/null
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperSkinParts.java
|
|
@@ -0,0 +1,74 @@
|
|
+package com.destroystokyo.paper;
|
|
+
|
|
+import com.google.common.base.Objects;
|
|
+
|
|
+import java.util.StringJoiner;
|
|
+
|
|
+public class PaperSkinParts implements SkinParts {
|
|
+
|
|
+ private final int raw;
|
|
+
|
|
+ public PaperSkinParts(int raw) {
|
|
+ this.raw = raw;
|
|
+ }
|
|
+
|
|
+ public boolean hasCapeEnabled() {
|
|
+ return (raw & 1) == 1;
|
|
+ }
|
|
+
|
|
+ public boolean hasJacketEnabled() {
|
|
+ return (raw >> 1 & 1) == 1;
|
|
+ }
|
|
+
|
|
+ public boolean hasLeftSleeveEnabled() {
|
|
+ return (raw >> 2 & 1) == 1;
|
|
+ }
|
|
+
|
|
+ public boolean hasRightSleeveEnabled() {
|
|
+ return (raw >> 3 & 1) == 1;
|
|
+ }
|
|
+
|
|
+ public boolean hasLeftPantsEnabled() {
|
|
+ return (raw >> 4 & 1) == 1;
|
|
+ }
|
|
+
|
|
+ public boolean hasRightPantsEnabled() {
|
|
+ return (raw >> 5 & 1) == 1;
|
|
+ }
|
|
+
|
|
+ public boolean hasHatsEnabled() {
|
|
+ return (raw >> 6 & 1) == 1;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public int getRaw() {
|
|
+ return raw;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean equals(Object o) {
|
|
+ if (this == o) return true;
|
|
+ if (o == null || getClass() != o.getClass()) return false;
|
|
+ PaperSkinParts that = (PaperSkinParts) o;
|
|
+ return raw == that.raw;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public int hashCode() {
|
|
+ return Objects.hashCode(raw);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public String toString() {
|
|
+ return new StringJoiner(", ", PaperSkinParts.class.getSimpleName() + "[", "]")
|
|
+ .add("raw=" + raw)
|
|
+ .add("cape=" + hasCapeEnabled())
|
|
+ .add("jacket=" + hasJacketEnabled())
|
|
+ .add("leftSleeve=" + hasLeftSleeveEnabled())
|
|
+ .add("rightSleeve=" + hasRightSleeveEnabled())
|
|
+ .add("leftPants=" + hasLeftPantsEnabled())
|
|
+ .add("rightPants=" + hasRightPantsEnabled())
|
|
+ .add("hats=" + hasHatsEnabled())
|
|
+ .toString();
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
|
|
index c4d4334305..7df24be46e 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityHuman.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
|
|
@@ -35,7 +35,7 @@ public abstract class EntityHuman extends EntityLiving {
|
|
private static final Map<EntityPose, EntitySize> b = ImmutableMap.<EntityPose, EntitySize>builder().put(EntityPose.STANDING, EntityHuman.bp).put(EntityPose.SLEEPING, EntityHuman.ap).put(EntityPose.FALL_FLYING, EntitySize.b(0.6F, 0.6F)).put(EntityPose.SWIMMING, EntitySize.b(0.6F, 0.6F)).put(EntityPose.SPIN_ATTACK, EntitySize.b(0.6F, 0.6F)).put(EntityPose.CROUCHING, EntitySize.b(0.6F, 1.5F)).put(EntityPose.DYING, EntitySize.c(0.2F, 0.2F)).build();
|
|
private static final DataWatcherObject<Float> c = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.c);
|
|
private static final DataWatcherObject<Integer> d = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.b);
|
|
- protected static final DataWatcherObject<Byte> bq = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.a);
|
|
+ protected static final DataWatcherObject<Byte> bq = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.a); public static DataWatcherObject<Byte> getSkinPartsWatcher() { return bq; } // Paper - OBFHELPER
|
|
protected static final DataWatcherObject<Byte> br = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.a);
|
|
protected static final DataWatcherObject<NBTTagCompound> bs = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.p);
|
|
protected static final DataWatcherObject<NBTTagCompound> bt = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.p);
|
|
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
index 0c0224d1eb..c108a38018 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
@@ -2,6 +2,7 @@ package net.minecraft.server;
|
|
|
|
import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent;
|
|
import com.google.common.collect.Lists;
|
|
+import com.destroystokyo.paper.event.player.PlayerClientOptionsChangeEvent; // Paper
|
|
import com.mojang.authlib.GameProfile;
|
|
import com.mojang.datafixers.util.Either;
|
|
import io.netty.util.concurrent.Future;
|
|
@@ -59,7 +60,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
|
public int lastSentExp = -99999999;
|
|
public int invulnerableTicks = 60;
|
|
private EnumChatVisibility ch;
|
|
- private boolean ci = true;
|
|
+ private boolean ci = true; public boolean hasChatColorsEnabled() { return this.ci; } // Paper - OBFHELPER
|
|
private long cj = SystemUtils.getMonotonicMillis();
|
|
private Entity spectatedEntity; private void setSpectatorTargetField(Entity e) { this.spectatedEntity = e; } // Paper - OBFHELPER
|
|
public boolean worldChangeInvuln;
|
|
@@ -1577,6 +1578,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
|
}
|
|
|
|
public void a(PacketPlayInSettings packetplayinsettings) {
|
|
+ new PlayerClientOptionsChangeEvent(getBukkitEntity(), packetplayinsettings.getLocale(), packetplayinsettings.viewDistance, com.destroystokyo.paper.ClientOption.ChatVisibility.valueOf(packetplayinsettings.getChatVisibility().name()), packetplayinsettings.hasChatColorsEnabled(), new com.destroystokyo.paper.PaperSkinParts(packetplayinsettings.getSkinParts()), packetplayinsettings.getMainHand() == EnumMainHand.LEFT ? MainHand.LEFT : MainHand.RIGHT).callEvent(); // Paper - settings event
|
|
// CraftBukkit start
|
|
if (getMainHand() != packetplayinsettings.getMainHand()) {
|
|
PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(getBukkitEntity(), getMainHand() == EnumMainHand.LEFT ? MainHand.LEFT : MainHand.RIGHT);
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayInSettings.java b/src/main/java/net/minecraft/server/PacketPlayInSettings.java
|
|
index 8faebf9efe..4da6371381 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayInSettings.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayInSettings.java
|
|
@@ -37,18 +37,22 @@ public class PacketPlayInSettings implements Packet<PacketListenerPlayIn> {
|
|
packetlistenerplayin.a(this);
|
|
}
|
|
|
|
+ public String getLocale() { return b(); } // Paper - OBFHELPER
|
|
public String b() {
|
|
return this.a;
|
|
}
|
|
|
|
+ public EnumChatVisibility getChatVisibility() { return d(); } // Paper - OBFHELPER
|
|
public EnumChatVisibility d() {
|
|
return this.c;
|
|
}
|
|
|
|
+ public boolean hasChatColorsEnabled() { return e(); } // Paper - OBFHELPER
|
|
public boolean e() {
|
|
return this.d;
|
|
}
|
|
|
|
+ public int getSkinParts() { return f(); } // Paper - OBFHELPER
|
|
public int f() {
|
|
return this.e;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index e76f2b9c7f..3515b72682 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -1,5 +1,8 @@
|
|
package org.bukkit.craftbukkit.entity;
|
|
|
|
+import com.destroystokyo.paper.ClientOption.ChatVisibility;
|
|
+import com.destroystokyo.paper.PaperSkinParts;
|
|
+import com.destroystokyo.paper.ClientOption;
|
|
import com.destroystokyo.paper.Title;
|
|
import com.destroystokyo.paper.profile.CraftPlayerProfile;
|
|
import com.destroystokyo.paper.profile.PlayerProfile;
|
|
@@ -36,6 +39,7 @@ import net.minecraft.server.BlockPosition;
|
|
import net.minecraft.server.ChatComponentText;
|
|
import net.minecraft.server.Container;
|
|
import net.minecraft.server.Entity;
|
|
+import net.minecraft.server.EntityHuman;
|
|
import net.minecraft.server.EntityLiving;
|
|
import net.minecraft.server.EntityPlayer;
|
|
import net.minecraft.server.EnumChatFormat;
|
|
@@ -1969,6 +1973,24 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
public void setViewDistance(int viewDistance) {
|
|
throw new NotImplementedException("Per-Player View Distance APIs need further understanding to properly implement"); // TODO
|
|
}
|
|
+
|
|
+ @Override
|
|
+ public <T> T getClientOption(ClientOption<T> type) {
|
|
+ if(ClientOption.SKIN_PARTS.equals(type)) {
|
|
+ return type.getType().cast(new PaperSkinParts(getHandle().getDataWatcher().get(EntityHuman.getSkinPartsWatcher())));
|
|
+ } else if(ClientOption.CHAT_COLORS_ENABLED.equals(type)) {
|
|
+ return type.getType().cast(getHandle().hasChatColorsEnabled());
|
|
+ } else if(ClientOption.CHAT_VISIBILITY.equals(type)) {
|
|
+ return type.getType().cast(getHandle().getChatFlags() == null ? ChatVisibility.UNKNOWN : ChatVisibility.valueOf(getHandle().getChatFlags().name()));
|
|
+ } else if(ClientOption.LOCALE.equals(type)) {
|
|
+ return type.getType().cast(getLocale());
|
|
+ } else if(ClientOption.MAIN_HAND.equals(type)) {
|
|
+ return type.getType().cast(getMainHand());
|
|
+ } else if(ClientOption.VIEW_DISTANCE.equals(type)) {
|
|
+ return type.getType().cast(getClientViewDistance());
|
|
+ }
|
|
+ throw new RuntimeException("Unknown settings type");
|
|
+ }
|
|
// Paper end
|
|
|
|
// Spigot start
|
|
--
|
|
2.26.2
|
|
|