Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated Upstream (Bukkit/CraftBukkit/Spigot) #11197

Merged
merged 6 commits into from
Aug 9, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Separate shield base and patterns
lynxplay committed Aug 9, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 79091b6b51960505dd1ecaf8ce075f71383d809e
22 changes: 22 additions & 0 deletions patches/server/0925-Fixup-NamespacedKey-handling.patch
Original file line number Diff line number Diff line change
@@ -143,6 +143,28 @@ index 478059eb3ad76b41e6a20e9b489a2a4fb19e7c7c..3599ef1675b6091e9b67fb5241886460
});
}

diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java
index c8eec04685456d89cb41466cddcc3975d0ceeb29..c10609472c1b86c3abb19a62bef4c9ce436307ea 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java
@@ -17,6 +17,7 @@ import org.bukkit.block.BlockState;
import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType;
import org.bukkit.configuration.serialization.DelegateDeserialization;
+import org.bukkit.craftbukkit.CraftRegistry;
import org.bukkit.craftbukkit.block.CraftBlockStates;
import org.bukkit.craftbukkit.block.banner.CraftPatternType;
import org.bukkit.inventory.meta.BlockStateMeta;
@@ -53,7 +54,8 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS
for (int i = 0; i < Math.min(patterns.size(), 20); i++) {
BannerPatternLayers.Layer p = patterns.get(i);
DyeColor color = DyeColor.getByWoolData((byte) p.color().getId());
- PatternType pattern = CraftPatternType.minecraftHolderToBukkit(p.pattern());
+ PatternType pattern = CraftRegistry.unwrapAndConvertHolder(io.papermc.paper.registry.RegistryKey.BANNER_PATTERN, p.pattern()).orElse(null); // Paper - fix upstream not being correct
+ if (pattern == null) continue; // Paper - just delete the pattern because upstream is not doing this right

if (color != null && pattern != null) {
this.addPattern(new Pattern(color, pattern));
diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionType.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionType.java
index 82a50b06c08b632f77d73745e1fa9bd22dfd950a..f1d8ed4a2b8959873b02d57f6a40323a841f3d7f 100644
--- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionType.java
Original file line number Diff line number Diff line change
@@ -456,7 +456,7 @@ index 8c1d2d0521da52f9a1262f5433da21700b9b0454..9600b23666668d7d581e2920a4e03e59
getOrEmpty(tag, CraftMetaFirework.FIREWORKS).ifPresent((fireworks) -> {
this.power = fireworks.flightDuration();
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
index 6f3ab40a9d0bccd9a2c439bf0e200ba5cf0f5f6e..5b94deb8604902ed61405867c65bdc4910672395 100644
index 6f3ab40a9d0bccd9a2c439bf0e200ba5cf0f5f6e..bee2f2f5675b8aaeb2a04ada1f6dba9aa9a14ed3 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
@@ -339,7 +339,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
@@ -585,8 +585,8 @@ index 6f3ab40a9d0bccd9a2c439bf0e200ba5cf0f5f6e..5b94deb8604902ed61405867c65bdc49
+ map.put(CraftMetaArmor.class, Set.of(CraftMetaArmor.TRIM.TYPE));
+ map.put(CraftMetaArmorStand.class, Set.of(CraftMetaArmorStand.ENTITY_TAG.TYPE));
+ map.put(CraftMetaAxolotlBucket.class, Set.of(CraftMetaAxolotlBucket.ENTITY_TAG.TYPE, CraftMetaAxolotlBucket.BUCKET_ENTITY_TAG.TYPE));
+ map.put(CraftMetaBanner.class, Set.of(/*CraftMetaBlockState.BLOCK_ENTITY_TAG.NBT, */CraftMetaBanner.PATTERNS.TYPE)); // banner uses same tag as block state
+ map.put(CraftMetaShield.class, Set.of(CraftMetaShield.BASE_COLOR.TYPE));
+ map.put(CraftMetaBanner.class, Set.of(CraftMetaBanner.PATTERNS.TYPE)); // banner uses same tag as block state
+ map.put(CraftMetaShield.class, Set.of(CraftMetaShield.BASE_COLOR.TYPE, CraftMetaBanner.PATTERNS.TYPE));
+ map.put(CraftMetaBlockState.class, Set.of(CraftMetaBlockState.BLOCK_ENTITY_TAG.TYPE));
+ map.put(CraftMetaBook.class, Set.of(CraftMetaBook.BOOK_CONTENT.TYPE));
+ map.put(CraftMetaBookSigned.class, Set.of(CraftMetaBookSigned.BOOK_CONTENT.TYPE));
@@ -714,10 +714,10 @@ index d1cb8d520b6d7b0981d70412def71e7aab04560a..7f9182809f6e67ff571db0f365bc7e05
potionContents.potion().ifPresent((potion) -> {
this.type = CraftPotionType.minecraftHolderToBukkit(potion);
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java
index c8eec04685456d89cb41466cddcc3975d0ceeb29..55551b3dbf6a80efde37ad85e89f18a1232d2261 100644
index c10609472c1b86c3abb19a62bef4c9ce436307ea..d2b74daa5788c1e6d9eaddb47bc3a062287ba036 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java
@@ -41,8 +41,8 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS
@@ -42,8 +42,8 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS
}
}

302 changes: 301 additions & 1 deletion patches/server/0966-General-ItemMeta-fixes.patch
Original file line number Diff line number Diff line change
@@ -802,7 +802,7 @@ index 9600b23666668d7d581e2920a4e03e59cc2339fb..0eceacbb096481d3bd31f5f99e964c88
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
index 5b94deb8604902ed61405867c65bdc4910672395..18d2531bade0bdd3da7116679b38a687c2f664ca 100644
index bee2f2f5675b8aaeb2a04ada1f6dba9aa9a14ed3..67181b215312f1f572d6ac5afd289c6540b12829 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
@@ -182,9 +182,10 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
@@ -1387,6 +1387,306 @@ index 7f9182809f6e67ff571db0f365bc7e05f600775a..01c49df291f721bab3acb788ff2f2787
}

@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java
index d2b74daa5788c1e6d9eaddb47bc3a062287ba036..5c551f86b94320367aedd800fee8bd2c19719f79 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaShield.java
@@ -28,17 +28,29 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS

static final ItemMetaKeyType<net.minecraft.world.item.DyeColor> BASE_COLOR = new ItemMetaKeyType<>(DataComponents.BASE_COLOR, "Base", "base-color");

- private Banner banner;
+ // Paper start - general item meta fixes - decoupled base colour and patterns
+ private @org.jetbrains.annotations.Nullable List<Pattern> patterns;
+ private @org.jetbrains.annotations.Nullable DyeColor baseColor;
+
+ // An empty pattern list is the same as the default on the Shield item, and will hence not be present in the data components of the stack.
+ private boolean hasPatterns() {
+ return this.patterns != null && !this.patterns.isEmpty();
+ }
+ // Paper end - general item meta fixes - decoupled base colour and patterns

CraftMetaShield(CraftMetaItem meta) {
super(meta);

if (meta instanceof CraftMetaShield craftMetaShield) {
- if (craftMetaShield.banner != null) {
- this.banner = (Banner) craftMetaShield.banner.copy();
- }
+ // Paper start - general item meta fixes - decoupled base colour and patterns
+ if (craftMetaShield.patterns != null) this.patterns = new ArrayList<>(craftMetaShield.getPatterns());
+ if (craftMetaShield.baseColor != null) this.baseColor = craftMetaShield.baseColor;
+ // Paper end - general item meta fixes - decoupled base colour and patterns
} else if (meta instanceof CraftMetaBlockState state && state.hasBlockState() && state.getBlockState() instanceof Banner banner) {
- this.banner = (Banner) banner.copy();
+ // Paper start - general item meta fixes - decoupled base colour and patterns
+ this.patterns = banner.getPatterns();
+ this.baseColor = banner.getBaseColor();
+ // Paper end - general item meta fixes - decoupled base colour and patterns
}
}

@@ -46,7 +58,7 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS
super(tag, extraHandledDcts); // Paper - improve checking handled tags in item meta

getOrEmpty(tag, CraftMetaShield.BASE_COLOR).ifPresent((color) -> {
- this.banner = CraftMetaShield.getBlockState(DyeColor.getByWoolData((byte) color.getId()));
+ this.baseColor = DyeColor.getByWoolData((byte) color.getId()); // Paper - general item meta fixes - decoupled base colour and patterns
});

getOrEmpty(tag, CraftMetaBanner.PATTERNS).ifPresent((entityTag) -> {
@@ -69,7 +81,7 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS

String baseColor = SerializableMeta.getString(map, CraftMetaShield.BASE_COLOR.BUKKIT, true);
if (baseColor != null) {
- this.banner = CraftMetaShield.getBlockState(DyeColor.valueOf(baseColor));
+ this.baseColor = DyeColor.valueOf(baseColor); // Paper - general item meta fixes - decoupled base colour and patterns
}

Iterable<?> rawPatternList = SerializableMeta.getObject(Iterable.class, map, CraftMetaBanner.PATTERNS.BUKKIT, true);
@@ -87,13 +99,14 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS
void applyToItem(CraftMetaItem.Applicator tag) {
super.applyToItem(tag);

- if (this.banner != null) {
- tag.put(CraftMetaShield.BASE_COLOR, net.minecraft.world.item.DyeColor.byId(this.banner.getBaseColor().getWoolData()));
-
- if (this.banner.numberOfPatterns() > 0) {
+ // Paper start - general item meta fixes - decoupled base colour and patterns
+ if (this.baseColor != null) tag.put(CraftMetaShield.BASE_COLOR, net.minecraft.world.item.DyeColor.byFireworkColor(this.baseColor.getWoolData()));
+ if (this.patterns != null && !this.patterns.isEmpty()) {
+ {
+ // Paper end - general item meta fixes - decoupled base colour and patterns
List<BannerPatternLayers.Layer> newPatterns = new ArrayList<>();

- for (Pattern p : this.banner.getPatterns()) {
+ for (Pattern p : this.patterns) { // Paper - general item meta fixes - decoupled base colour and patterns
newPatterns.add(new BannerPatternLayers.Layer(CraftPatternType.bukkitToMinecraftHolder(p.getPattern()), net.minecraft.world.item.DyeColor.byId(p.getColor().getWoolData())));
}

@@ -104,108 +117,84 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS

@Override
public List<Pattern> getPatterns() {
- if (this.banner == null) {
+ if (this.patterns == null) { // Paper - general item meta fixes - decoupled base colour and patterns
return new ArrayList<>();
}

- return this.banner.getPatterns();
+ return new ArrayList<>(this.patterns); // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
public void setPatterns(List<Pattern> patterns) {
- if (this.banner == null) {
- if (patterns.isEmpty()) {
- return;
- }
-
- this.banner = CraftMetaShield.getBlockState(null);
- }
-
- this.banner.setPatterns(patterns);
+ this.patterns = new ArrayList<>(patterns); // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
public void addPattern(Pattern pattern) {
- if (this.banner == null) {
- this.banner = CraftMetaShield.getBlockState(null);
- }
-
- this.banner.addPattern(pattern);
+ // Paper start - general item meta fixes - decoupled base colour and patterns
+ if (this.patterns == null) this.patterns = new ArrayList<>();
+ this.patterns.add(pattern);
+ // Paper end - general item meta fixes - decoupled base colour and patterns
}

@Override
public Pattern getPattern(int i) {
- if (this.banner == null) {
+ if (this.patterns == null) { // Paper - general item meta fixes - decoupled base colour and patterns
throw new IndexOutOfBoundsException(i);
}

- return this.banner.getPattern(i);
+ return this.patterns.get(i); // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
public Pattern removePattern(int i) {
- if (this.banner == null) {
+ if (this.patterns == null) { // Paper - general item meta fixes - decoupled base colour and patterns
throw new IndexOutOfBoundsException(i);
}

- return this.banner.removePattern(i);
+ return this.patterns.remove(i); // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
public void setPattern(int i, Pattern pattern) {
- if (this.banner == null) {
+ if (this.patterns == null) { // Paper - general item meta fixes - decoupled base colour and patterns
throw new IndexOutOfBoundsException(i);
}

- this.banner.setPattern(i, pattern);
+ this.patterns.set(i, pattern); // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
public int numberOfPatterns() {
- if (this.banner == null) {
+ if (this.patterns == null) { // Paper - general item meta fixes - decoupled base colour and patterns
return 0;
}

- return this.banner.numberOfPatterns();
+ return this.patterns.size(); // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
public DyeColor getBaseColor() {
- if (this.banner == null) {
- return null;
- }
-
- return this.banner.getBaseColor();
+ return this.baseColor; // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
public void setBaseColor(DyeColor baseColor) {
- if (baseColor == null) {
- if (this.banner.numberOfPatterns() > 0) {
- this.banner.setBaseColor(DyeColor.WHITE);
- } else {
- this.banner = null;
- }
- } else {
- if (this.banner == null) {
- this.banner = CraftMetaShield.getBlockState(baseColor);
- }
-
- this.banner.setBaseColor(baseColor);
- }
+ this.baseColor = baseColor; // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
ImmutableMap.Builder<String, Object> serialize(ImmutableMap.Builder<String, Object> builder) {
super.serialize(builder);

- if (this.banner != null) {
- builder.put(CraftMetaShield.BASE_COLOR.BUKKIT, this.banner.getBaseColor().toString());
-
- if (this.banner.numberOfPatterns() > 0) {
- builder.put(CraftMetaBanner.PATTERNS.BUKKIT, this.banner.getPatterns());
- }
+ // Paper start - general item meta fixes - decoupled base colour and patterns
+ if (this.baseColor != null) {
+ builder.put(CraftMetaShield.BASE_COLOR.BUKKIT, this.baseColor.toString());
+ }
+ if (hasPatterns()) {
+ builder.put(CraftMetaBanner.PATTERNS.BUKKIT, this.patterns);
}
+ // Paper end - general item meta fixes - decoupled base colour and patterns

return builder;
}
@@ -214,8 +203,13 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS
int applyHash() {
final int original;
int hash = original = super.applyHash();
- if (this.banner != null) {
- hash = 61 * hash + this.banner.hashCode();
+ // Paper start - general item meta fixes - decoupled base colour and patterns
+ if (this.baseColor != null) {
+ hash = 61 * hash + this.baseColor.hashCode();
+ }
+ if (hasPatterns()) {
+ hash = 61 * hash + this.patterns.hashCode();
+ // Paper end - general item meta fixes - decoupled base colour and patterns
}
return original != hash ? CraftMetaShield.class.hashCode() ^ hash : hash;
}
@@ -226,29 +220,33 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS
return false;
}
if (meta instanceof CraftMetaShield that) {
- return Objects.equal(this.banner, that.banner);
+ return Objects.equal(this.baseColor, that.baseColor) && Objects.equal(this.hasPatterns(), that.hasPatterns()); // Paper - general item meta fixes - decoupled base colour and patterns
}
return true;
}

@Override
boolean notUncommon(CraftMetaItem meta) {
- return super.notUncommon(meta) && (meta instanceof CraftMetaShield || this.banner == null);
+ return super.notUncommon(meta) && (meta instanceof CraftMetaShield || (this.baseColor == null && !hasPatterns())); // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
boolean isEmpty() {
- return super.isEmpty() && this.banner == null;
+ return super.isEmpty() && this.baseColor == null && !hasPatterns(); // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
public boolean hasBlockState() {
- return this.banner != null;
+ return this.baseColor != null || hasPatterns(); // Paper - general item meta fixes - decoupled base colour and patterns
}

@Override
public BlockState getBlockState() {
- return (this.banner != null) ? this.banner.copy() : CraftMetaShield.getBlockState(null);
+ // Paper start - general item meta fixes - decoupled base colour and patterns
+ final Banner banner = CraftMetaShield.getBlockState(this.baseColor);
+ if (this.patterns != null) banner.setPatterns(this.patterns);
+ return banner;
+ // Paper end - general item meta fixes - decoupled base colour and patterns
}

@Override
@@ -256,13 +254,18 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS
Preconditions.checkArgument(blockState != null, "blockState must not be null");
Preconditions.checkArgument(blockState instanceof Banner, "Invalid blockState");

- this.banner = (Banner) blockState;
+ // Paper start - general item meta fixes - decoupled base colour and patterns
+ final Banner banner = (Banner) blockState;
+ this.baseColor = banner.getBaseColor();
+ this.patterns = banner.getPatterns();
+ // Paper end - general item meta fixes - decoupled base colour and patterns
}

// Paper start - add method to clear block state
@Override
public void clearBlockState() {
- this.banner = null;
+ this.baseColor = null;
+ this.patterns = null;
}
// Paper end - add method to clear block state

@@ -276,9 +279,10 @@ public class CraftMetaShield extends CraftMetaItem implements ShieldMeta, BlockS
@Override
public CraftMetaShield clone() {
CraftMetaShield meta = (CraftMetaShield) super.clone();
- if (this.banner != null) {
- meta.banner = (Banner) this.banner.copy();
- }
+ // Paper start - general item meta fixes - decoupled base colour and patterns
+ meta.baseColor = this.baseColor;
+ meta.patterns = this.patterns == null ? null : new ArrayList<>(this.patterns);
+ // Paper start - general item meta fixes - decoupled base colour and patterns
return meta;
}

diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
index ab860f1179fa2618c8fbc30ac5f48ff78b8abb60..7de2ed297d0b2bf8adf2058e75a9b594ec2197bd 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java