From ad0e5fa730ac193c6b6406cbb056287f1b2019ef Mon Sep 17 00:00:00 2001 From: JustRed23 Date: Sat, 16 Mar 2024 19:30:16 +0100 Subject: [PATCH 01/21] Add world system merging --- .../net/minecraft/server/Main.java.patch | 3 +- .../server/MinecraftServer.java.patch | 7 ++- .../server/level/ServerLevel.java.patch | 2 +- .../storage/LevelStorageSource.java.patch | 53 +++++++++++++++---- .../ketting/config/KettingConfig.java | 2 + 5 files changed, 54 insertions(+), 13 deletions(-) diff --git a/patches/minecraft/net/minecraft/server/Main.java.patch b/patches/minecraft/net/minecraft/server/Main.java.patch index 9e2922fe7a..743fa2b269 100644 --- a/patches/minecraft/net/minecraft/server/Main.java.patch +++ b/patches/minecraft/net/minecraft/server/Main.java.patch @@ -62,7 +62,7 @@ Path path = optionset.valueOf(optionspec14); if (path != null) { -@@ -102,29 +_,52 @@ +@@ -102,29 +_,53 @@ JvmProfiler.INSTANCE.start(Environment.SERVER); } @@ -121,6 +121,7 @@ LevelStorageSource levelstoragesource = LevelStorageSource.createDefault(file1.toPath()); - LevelStorageSource.LevelStorageAccess levelstoragesource$levelstorageaccess = levelstoragesource.validateAndCreateAccess(s); + LevelStorageSource.LevelStorageAccess levelstoragesource$levelstorageaccess = levelstoragesource.validateAndCreateAccess(s, LevelStem.OVERWORLD); ++ levelstoragesource$levelstorageaccess.setReference(levelstoragesource); //Ketting + levelstoragesource$levelstorageaccess.readAdditionalLevelSaveData(); LevelSummary levelsummary = levelstoragesource$levelstorageaccess.getSummary(); if (levelsummary != null) { diff --git a/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch b/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch index 5a9b48f951..99ff8457fe 100644 --- a/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch +++ b/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch @@ -139,7 +139,7 @@ if (!serverleveldata.isInitialized()) { try { setInitialSpawn(serverlevel, serverleveldata, worldoptions.generateBonusChest(), flag); -@@ -373,9 +_,54 @@ +@@ -373,9 +_,57 @@ if (resourcekey != LevelStem.OVERWORLD) { ResourceKey resourcekey1 = ResourceKey.create(Registries.DIMENSION, resourcekey.location()); DerivedLevelData derivedleveldata = new DerivedLevelData(this.worldData, serverleveldata); @@ -172,7 +172,10 @@ + + LevelStorageSource.LevelStorageAccess source; + try { -+ source = LevelStorageSource.createDefault(server.getWorldContainer().toPath()).validateAndCreateAccess(name, resourcekey); ++ if (org.kettingpowered.ketting.config.KettingConfig.getInstance().MERGE_WORLD_SYSTEMS.getValue()) ++ source = this.storageSource.reference.deriveFromSource(this.storageSource, resourcekey); ++ else ++ source = LevelStorageSource.createDefault(server.getWorldContainer().toPath()).validateAndCreateAccess(name, resourcekey); + } catch (IOException | net.minecraft.world.level.validation.ContentValidationException e) { + throw new RuntimeException(e); + } diff --git a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch index 25ca324eca..7b6b3889ba 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch @@ -43,7 +43,7 @@ super(p_215002_, p_215003_, p_214999_.registryAccess(), p_215004_.type(), p_214999_::getProfiler, false, p_215006_, p_215007_, p_214999_.getMaxChainedNeighborUpdates()); + this.pvpMode = p_214999_.isPvpAllowed(); + convertable = p_215001_; -+ uuid = org.bukkit.craftbukkit.v1_20_R1.util.WorldUUID.getUUID((p_215002_ instanceof net.minecraft.world.level.storage.DerivedLevelData ? p_215001_.levelDirectory.path() : p_215001_.getDimensionPath(p_215003_)).toFile()); //Ketting ++ uuid = org.bukkit.craftbukkit.v1_20_R1.util.WorldUUID.getUUID(p_215001_.getDimensionPath(p_215003_).toFile()); + // CraftBukkit end this.tickTime = p_215009_; this.server = p_214999_; diff --git a/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch b/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch index dbfa7ff6c9..e79cd34dc2 100644 --- a/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch +++ b/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch @@ -9,7 +9,7 @@ return Pair.of(primaryleveldata, worlddimensions$complete); }; } -@@ -334,24 +_,46 @@ +@@ -334,24 +_,52 @@ } public LevelStorageSource.LevelStorageAccess validateAndCreateAccess(String p_289980_) throws IOException, ContentValidationException { @@ -26,6 +26,12 @@ + return new LevelStorageSource.LevelStorageAccess(p_289980_, path, dimensionType); // CraftBukkit } } ++ ++ //Ketting start - try merging both world systems ++ public LevelStorageSource.LevelStorageAccess deriveFromSource(LevelStorageSource.LevelStorageAccess source, ResourceKey dimensionType) throws IOException { ++ return new LevelStorageSource.LevelStorageAccess(source, dimensionType); ++ } ++ //Ketting end public LevelStorageSource.LevelStorageAccess createAccess(String p_78261_) throws IOException { + return this.createAccess(p_78261_, null); @@ -58,7 +64,7 @@ public static record LevelCandidates(List levels) implements Iterable { public boolean isEmpty() { return this.levels.isEmpty(); -@@ -397,8 +_,18 @@ +@@ -397,9 +_,34 @@ public final LevelStorageSource.LevelDirectory levelDirectory; private final String levelId; private final Map resources = Maps.newHashMap(); @@ -68,17 +74,33 @@ + public ResourceKey dimensionType; + + //Ketting start ++ public final Path dimensionPath; ++ + public void setDimensionType(ResourceKey dimensionType) { + this.dimensionType = dimensionType; + } + //Ketting end + ++ //Ketting start ++ LevelStorageAccess(LevelStorageAccess original, ResourceKey dimensionType) { ++ this.dimensionType = dimensionType; ++ ++ this.levelId = original.levelId; ++ this.dimensionPath = original.dimensionPath; ++ this.levelDirectory = original.levelDirectory; ++ this.lock = original.lock; ++ this.resources.putAll(original.resources); ++ } ++ //Ketting end ++ + LevelStorageAccess(String p_289967_, Path p_289988_, ResourceKey dimensionType) throws IOException { + this.dimensionType = dimensionType; + // CraftBukkit end this.levelId = p_289967_; ++ this.dimensionPath = p_289988_; //Ketting this.levelDirectory = new LevelStorageSource.LevelDirectory(p_289988_); this.lock = DirectoryLock.create(p_289988_); + } @@ -413,7 +_,7 @@ } @@ -117,14 +139,27 @@ try { File file2 = File.createTempFile("level", ".dat", file1); NbtIo.writeCompressed(compoundtag1, file2); -@@ -469,6 +_,10 @@ - - public Optional getIconFile() { +@@ -471,6 +_,10 @@ return !this.lock.isValid() ? Optional.empty() : Optional.of(this.levelDirectory.iconFile()); -+ } -+ -+ public Path getWorldDir() { -+ return baseDir; } ++ public Path getWorldDir() { ++ return baseDir; ++ } ++ public void deleteLevel() throws IOException { + this.checkLock(); + final Path path = this.levelDirectory.lockFile(); +@@ -569,6 +_,12 @@ + + public void close() throws IOException { + this.lock.close(); ++ } ++ ++ //Ketting start ++ public @Nullable LevelStorageSource reference; ++ public void setReference(LevelStorageSource levelstoragesource) { ++ this.reference = levelstoragesource; + } + } + } diff --git a/src/main/java/org/kettingpowered/ketting/config/KettingConfig.java b/src/main/java/org/kettingpowered/ketting/config/KettingConfig.java index 8f644a7d43..9f9c685481 100644 --- a/src/main/java/org/kettingpowered/ketting/config/KettingConfig.java +++ b/src/main/java/org/kettingpowered/ketting/config/KettingConfig.java @@ -40,5 +40,7 @@ public KettingConfig(@NotNull String fileName) { public final BooleanValue WARN_ON_NULL_NBT = new BooleanValue("debug.warn_on_null_nbt", true, "Print a warning to the console when something tries to set a null NBT tag."); public final BooleanValue OVERWRITE_FORGE_PERMISSIONS = new BooleanValue("forge.overwrite_forge_permissions", false, "--- WARNING - THIS WILL COMPLETELY DISABLE FORGE PERMISSION CHECKS --- Overwrite Forge permissions with Bukkit permissions, makes it possible to use a permission manager plugin for modded commands. If true, Forge permissions will be set to 'forge.command.MODDEDCOMMAND' where MODDEDCOMMAND is the name of the modded command."); + + public final BooleanValue MERGE_WORLD_SYSTEMS = new BooleanValue("ketting.merge_world_systems", false, "--- WARNING - THIS WILL BREAK EXISTING WORLDS --- If true, this will attempt to merge both the Forge and Bukkit world system into one, making dimensions exist in the world folder, and Bukkit worlds in their own folder."); //End of config values } From 7d7e6130041ab001dde2518f764609f2ed3d5a46 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:29:01 +0100 Subject: [PATCH 02/21] Rewrite #1 --- .../packs/PackSelectionScreen.java.patch | 13 ++--- .../arguments/EntityArgument.java.patch | 41 +++++----------- .../selector/EntitySelectorParser.java.patch | 49 +++++++++++-------- .../world/entity/LivingEntity.java.patch | 10 +++- src/main/resources/mapping/bukkit_srg.srg | 1 + 5 files changed, 54 insertions(+), 60 deletions(-) diff --git a/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch index 596764e429..1e9cf93791 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch @@ -1,16 +1,11 @@ --- a/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java +++ b/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java -@@ -130,10 +_,10 @@ +@@ -130,7 +_,7 @@ TransferableSelectionList.PackEntry transferableselectionlist$packentry = p_100014_.getSelected(); String s = transferableselectionlist$packentry == null ? "" : transferableselectionlist$packentry.getPackId(); p_100014_.setSelected((TransferableSelectionList.PackEntry)null); - p_100015_.forEach((p_280875_) -> { -- TransferableSelectionList.PackEntry transferableselectionlist$packentry1 = new TransferableSelectionList.PackEntry(this.minecraft, p_100014_, p_280875_); -+ p_100015_.filter(PackSelectionModel.Entry::notHidden).forEach((p_264692_) -> { -+ TransferableSelectionList.PackEntry transferableselectionlist$packentry1 = new TransferableSelectionList.PackEntry(this.minecraft, p_100014_, p_264692_); ++ p_100015_.filter(PackSelectionModel.Entry::notHidden).forEach((p_280875_) -> { + TransferableSelectionList.PackEntry transferableselectionlist$packentry1 = new TransferableSelectionList.PackEntry(this.minecraft, p_100014_, p_280875_); p_100014_.children().add(transferableselectionlist$packentry1); -- if (p_280875_.getId().equals(s)) { -+ if (p_264692_.getId().equals(s)) { - p_100014_.setSelected(transferableselectionlist$packentry1); - } - + if (p_280875_.getId().equals(s)) { diff --git a/patches/minecraft/net/minecraft/commands/arguments/EntityArgument.java.patch b/patches/minecraft/net/minecraft/commands/arguments/EntityArgument.java.patch index 37abcc95c9..e2b448b458 100644 --- a/patches/minecraft/net/minecraft/commands/arguments/EntityArgument.java.patch +++ b/patches/minecraft/net/minecraft/commands/arguments/EntityArgument.java.patch @@ -1,40 +1,25 @@ --- a/net/minecraft/commands/arguments/EntityArgument.java +++ b/net/minecraft/commands/arguments/EntityArgument.java -@@ -91,20 +_,26 @@ +@@ -90,9 +_,19 @@ + } } - public EntitySelector parse(StringReader p_91451_) throws CommandSyntaxException { -+ // CraftBukkit start -+ return parse(p_91451_, false); ++ // Ketting start - Keep CraftBukkit method ++ public java.util.concurrent.atomic.AtomicBoolean ketting$parse$overridePermissions = new java.util.concurrent.atomic.AtomicBoolean(false); ++ ++ public EntitySelector parse(StringReader p_91451_, boolean overridePermissions) throws CommandSyntaxException { ++ ketting$parse$overridePermissions.set(overridePermissions); ++ return parse(p_91451_); + } ++ // Ketting end + -+ public EntitySelector parse(StringReader stringreader, boolean overridePermissions) throws CommandSyntaxException { -+ // CraftBukkit end + public EntitySelector parse(StringReader p_91451_) throws CommandSyntaxException { int i = 0; -- EntitySelectorParser entityselectorparser = new EntitySelectorParser(p_91451_); -- EntitySelector entityselector = entityselectorparser.parse(); -+ EntitySelectorParser entityselectorparser = new EntitySelectorParser(stringreader); -+ EntitySelector entityselector = entityselectorparser.parse(overridePermissions); // CraftBukkit + EntitySelectorParser entityselectorparser = new EntitySelectorParser(p_91451_); ++ entityselectorparser.ketting$parse$overridePermissions.set(ketting$parse$overridePermissions.getAndSet(false)); + EntitySelector entityselector = entityselectorparser.parse(); if (entityselector.getMaxResults() > 1 && this.single) { if (this.playersOnly) { -- p_91451_.setCursor(0); -- throw ERROR_NOT_SINGLE_PLAYER.createWithContext(p_91451_); -+ stringreader.setCursor(0); -+ throw ERROR_NOT_SINGLE_PLAYER.createWithContext(stringreader); - } else { -- p_91451_.setCursor(0); -- throw ERROR_NOT_SINGLE_ENTITY.createWithContext(p_91451_); -+ stringreader.setCursor(0); -+ throw ERROR_NOT_SINGLE_ENTITY.createWithContext(stringreader); - } - } else if (entityselector.includesEntities() && this.playersOnly && !entityselector.isSelfSelector()) { -- p_91451_.setCursor(0); -- throw ERROR_ONLY_PLAYERS_ALLOWED.createWithContext(p_91451_); -+ stringreader.setCursor(0); -+ throw ERROR_ONLY_PLAYERS_ALLOWED.createWithContext(stringreader); - } else { - return entityselector; - } @@ -115,7 +_,7 @@ if (s instanceof SharedSuggestionProvider sharedsuggestionprovider) { StringReader stringreader = new StringReader(p_91483_.getInput()); diff --git a/patches/minecraft/net/minecraft/commands/arguments/selector/EntitySelectorParser.java.patch b/patches/minecraft/net/minecraft/commands/arguments/selector/EntitySelectorParser.java.patch index 08019b9fc9..7775bfc421 100644 --- a/patches/minecraft/net/minecraft/commands/arguments/selector/EntitySelectorParser.java.patch +++ b/patches/minecraft/net/minecraft/commands/arguments/selector/EntitySelectorParser.java.patch @@ -1,44 +1,51 @@ --- a/net/minecraft/commands/arguments/selector/EntitySelectorParser.java +++ b/net/minecraft/commands/arguments/selector/EntitySelectorParser.java -@@ -195,7 +_,12 @@ +@@ -194,8 +_,20 @@ + }; } - protected void parseSelector() throws CommandSyntaxException { -- this.usesSelectors = true; -+ parseSelector(false); -+ } -+ // CraftBukkit start ++ ++ //Ketting start - CraftBukkit method ++ public final java.util.concurrent.atomic.AtomicBoolean ketting$parseSelector$overridePermissions = new java.util.concurrent.atomic.AtomicBoolean(false); ++ @SuppressWarnings("unused") + protected void parseSelector(boolean overridePermissions) throws CommandSyntaxException { -+ this.usesSelectors = !overridePermissions; -+ // CraftBukkit end ++ ketting$parseSelector$overridePermissions.set(overridePermissions); ++ parseSelector(); ++ } ++ //Ketting end - CraftBukkit method ++ + protected void parseSelector() throws CommandSyntaxException { + this.usesSelectors = true; ++ //Ketting - the above does get overwritten immediately, but keep it for mixin compat anyway ++ this.usesSelectors = !ketting$parseSelector$overridePermissions.getAndSet(false); //CraftBukkit this.suggestions = this::suggestSelector; if (!this.reader.canRead()) { throw ERROR_MISSING_SELECTOR_TYPE.createWithContext(this.reader); -@@ -451,6 +_,12 @@ +@@ -449,6 +_,13 @@ + public void setOrder(BiConsumer> p_121269_) { + this.order = p_121269_; } ++ //Ketting start - CraftBukkit Method ++ public java.util.concurrent.atomic.AtomicBoolean ketting$parse$overridePermissions = new java.util.concurrent.atomic.AtomicBoolean(false); ++ public EntitySelector parse(boolean overridePermissions) throws CommandSyntaxException { ++ ketting$parseSelector$overridePermissions.set(overridePermissions); ++ return parse(); ++ } ++ //Ketting end public EntitySelector parse() throws CommandSyntaxException { -+ // CraftBukkit start -+ return parse(false); -+ } -+ -+ public EntitySelector parse(boolean overridePermissions) throws CommandSyntaxException { -+ // CraftBukkit end this.startPosition = this.reader.getCursor(); - this.suggestions = this::suggestNameOrSelector; - if (this.reader.canRead() && this.reader.peek() == '@') { -@@ -459,7 +_,10 @@ +@@ -459,6 +_,10 @@ } this.reader.skip(); -- this.parseSelector(); + EntitySelector forgeSelector = net.minecraftforge.common.command.EntitySelectorManager.parseSelector(this); + if (forgeSelector != null) + return forgeSelector; -+ this.parseSelector(overridePermissions); // CraftBukkit ++ ketting$parseSelector$overridePermissions.set(ketting$parse$overridePermissions.getAndSet(false)); //Ketting - from CraftBukkit + this.parseSelector(); } else { this.parseNameOrUUID(); - } @@ -474,6 +_,7 @@ p_121248_.suggest("@r", Component.translatable("argument.entity.selector.randomPlayer")); p_121248_.suggest("@s", Component.translatable("argument.entity.selector.self")); diff --git a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch index 2dd0fdc0c7..f8c1655f5a 100644 --- a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch @@ -51,14 +51,20 @@ this.blocksBuilding = true; this.rotA = (float)((Math.random() + 1.0D) * (double)0.01F); this.reapplyPosition(); -@@ -239,7 +_,9 @@ +@@ -238,8 +_,15 @@ + this.setYRot((float)(Math.random() * (double)((float)Math.PI * 2F))); this.yHeadRot = this.getYRot(); this.setMaxUpStep(0.6F); ++ this.entityData.set(DATA_HEALTH_ID, (float) this.getAttributeBaseValue(Attributes.MAX_HEALTH)); ++ if (!(this instanceof org.bukkit.entity.Player)) postInit(); ++ } ++ @Override ++ protected void postInit(){ ++ super.postInit(); NbtOps nbtops = NbtOps.INSTANCE; - this.brain = this.makeBrain(new Dynamic<>(nbtops, nbtops.createMap(ImmutableMap.of(nbtops.createString("memories"), nbtops.emptyMap())))); + var dyn = new Dynamic<>(nbtops, nbtops.createMap(ImmutableMap.of(nbtops.createString("memories"), nbtops.emptyMap()))); + this.brain = net.minecraftforge.common.ForgeHooks.onLivingMakeBrain(this, this.makeBrain(dyn), dyn); -+ this.entityData.set(DATA_HEALTH_ID, (float) this.getAttributeBaseValue(Attributes.MAX_HEALTH)); } public Brain getBrain() { diff --git a/src/main/resources/mapping/bukkit_srg.srg b/src/main/resources/mapping/bukkit_srg.srg index f6b6e0a769..874cf26bd7 100644 --- a/src/main/resources/mapping/bukkit_srg.srg +++ b/src/main/resources/mapping/bukkit_srg.srg @@ -57233,6 +57233,7 @@ net/minecraft/commands/arguments/selector/ArgumentParserSelector net/minecraft/c r ()Ljava/lang/Double; m_121376_ s ()Ljava/util/function/BiConsumer; m_175146_ t ()Lnet/minecraft/commands/arguments/selector/EntitySelector; m_121377_ + t (Z)Lnet/minecraft/commands/arguments/selector/EntitySelector; parse u ()Z m_121378_ v ()Z m_121379_ w ()Z m_121380_ From b50503aeba4bee9eaa54d93934a4b478e5020a57 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Mon, 18 Mar 2024 18:30:51 +0100 Subject: [PATCH 03/21] Rewrite #2 --- .../minecraft/commands/Commands.java.patch | 40 +++++----- .../DefaultDispenseItemBehavior.java.patch | 75 ++++++++++--------- 2 files changed, 61 insertions(+), 54 deletions(-) diff --git a/patches/minecraft/net/minecraft/commands/Commands.java.patch b/patches/minecraft/net/minecraft/commands/Commands.java.patch index 10d50efd75..266da11418 100644 --- a/patches/minecraft/net/minecraft/commands/Commands.java.patch +++ b/patches/minecraft/net/minecraft/commands/Commands.java.patch @@ -44,7 +44,7 @@ } public static ParseResults mapSource(ParseResults p_242928_, UnaryOperator p_242890_) { -@@ -230,11 +_,64 @@ +@@ -230,11 +_,71 @@ return new ParseResults<>(commandcontextbuilder1, p_242928_.getReader(), p_242928_.getExceptions()); } @@ -93,23 +93,27 @@ + } + } + // CraftBukkit end -+ - public int performPrefixedCommand(CommandSourceStack p_230958_, String p_230959_) { -- p_230959_ = p_230959_.startsWith("/") ? p_230959_.substring(1) : p_230959_; -- return this.performCommand(this.dispatcher.parse(p_230959_, p_230958_), p_230959_); -- } -- -+ // CraftBukkit start -+ return this.performPrefixedCommand(p_230958_, p_230959_, p_230959_); ++ //Ketting start ++ private java.util.concurrent.atomic.AtomicReference ketting$performPrefixedCommand$label = new java.util.concurrent.atomic.AtomicReference<>(null); // Ketting ++ public int performPrefixedCommand(CommandSourceStack p_230958_, String p_230959_, String label) { ++ ketting$performPrefixedCommand$label.set(label); ++ return performPrefixedCommand(p_230958_, p_230959_); + } -+ -+ public int performPrefixedCommand(CommandSourceStack commandlistenerwrapper, String s, String label) { -+ s = s.startsWith("/") ? s.substring(1) : s; -+ return this.performCommand(this.getCorrectDispatcher(s).unwrap().parse(s, commandlistenerwrapper), s, label); -+ // CraftBukkit end ++ private void ketting$performPrefixedCommandPass(String s){ ++ String label = ketting$performPrefixedCommand$label.get(); ++ if (label == null) ketting$performCommand$label.set(s); ++ else ketting$performCommand$label.set(label); + } ++ //Ketting end + public int performPrefixedCommand(CommandSourceStack p_230958_, String p_230959_) { + p_230959_ = p_230959_.startsWith("/") ? p_230959_.substring(1) : p_230959_; +- return this.performCommand(this.dispatcher.parse(p_230959_, p_230958_), p_230959_); ++ ketting$performPrefixedCommandPass(p_230959_); //Ketting ++ return this.performCommand(this.getCorrectDispatcher(p_230959_).unwrap().parse(p_230959_, p_230958_), p_230959_); + } + + -+ private String ketting$label = null; // Ketting ++ private final java.util.concurrent.atomic.AtomicReference ketting$performCommand$label = new java.util.concurrent.atomic.AtomicReference<>(null); // Ketting public int performCommand(ParseResults p_242844_, String p_242841_) { CommandSourceStack commandsourcestack = p_242844_.getContext().getSource(); commandsourcestack.getServer().getProfiler().push(() -> { @@ -136,7 +140,7 @@ int j = Math.min(commandsyntaxexception.getInput().length(), commandsyntaxexception.getCursor()); MutableComponent mutablecomponent1 = Component.empty().withStyle(ChatFormatting.GRAY).withStyle((p_82134_) -> { - return p_82134_.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/" + p_242841_)); -+ return p_82134_.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/" + (ketting$label == null ? p_242841_ : ketting$label))); // CraftBukkit ++ return p_82134_.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/" + (java.util.Objects.requireNonNullElse(ketting$performCommand$label.get(), p_242841_)))); // CraftBukkit }); if (j > 10) { mutablecomponent1.append(CommonComponents.ELLIPSIS); @@ -144,13 +148,13 @@ return 0; } finally { -+ ketting$label = null; ++ ketting$performCommand$label.set(null); commandsourcestack.getServer().getProfiler().pop(); } } + public int performCommand(ParseResults p_242844_, String p_242841_, String label) { // CraftBukkit -+ this.ketting$label = label; ++ this.ketting$performCommand$label.set(label); + return this.performCommand(p_242844_, p_242841_); + } + diff --git a/patches/minecraft/net/minecraft/core/dispenser/DefaultDispenseItemBehavior.java.patch b/patches/minecraft/net/minecraft/core/dispenser/DefaultDispenseItemBehavior.java.patch index 855e3f3f60..c3cea69acf 100644 --- a/patches/minecraft/net/minecraft/core/dispenser/DefaultDispenseItemBehavior.java.patch +++ b/patches/minecraft/net/minecraft/core/dispenser/DefaultDispenseItemBehavior.java.patch @@ -18,36 +18,38 @@ public final ItemStack dispense(BlockSource p_123391_, ItemStack p_123392_) { ItemStack itemstack = this.execute(p_123391_, p_123392_); this.playSound(p_123391_); -@@ -20,11 +_,21 @@ +@@ -20,11 +_,67 @@ Direction direction = p_123385_.getBlockState().getValue(DispenserBlock.FACING); Position position = DispenserBlock.getDispensePosition(p_123385_); ItemStack itemstack = p_123386_.split(1); -- spawnItem(p_123385_.getLevel(), itemstack, 6, direction, position); ++ ketting$spawnItem$source = p_123385_; //Ketting ++ ketting$spawnItem$dropper.set(dropper); //Ketting + spawnItem(p_123385_.getLevel(), itemstack, 6, direction, position); + // CraftBukkit start -+ if (!spawnItem(p_123385_.getLevel(), itemstack, 6, direction, p_123385_, dropper)) { ++ if (!ketting$spawnItem$result.get()) { + p_123386_.grow(1); + } + // CraftBukkit end ++ ketting$spawnItem$source = null; //Ketting return p_123386_; } + //Ketting start - use original function -+ private static boolean spawnItem$result; -+ private static BlockSource spawnItem$source; -+ private static boolean spawnItem$dropper; - public static void spawnItem(Level p_123379_, ItemStack p_123380_, int p_123381_, Direction p_123382_, Position p_123383_) { -+ spawnItem$result = true; -+ if (p_123380_.isEmpty()) return; - double d0 = p_123383_.x(); - double d1 = p_123383_.y(); - double d2 = p_123383_.z(); -@@ -37,8 +_,51 @@ - ItemEntity itementity = new ItemEntity(p_123379_, d0, d1, d2, p_123380_); - double d3 = p_123379_.random.nextDouble() * 0.1D + 0.2D; - itementity.setDeltaMovement(p_123379_.random.triangle((double)p_123382_.getStepX() * d3, 0.0172275D * (double)p_123381_), p_123379_.random.triangle(0.2D, 0.0172275D * (double)p_123381_), p_123379_.random.triangle((double)p_123382_.getStepZ() * d3, 0.0172275D * (double)p_123381_)); -+ -+ if (spawnItem$source != null) { -+ org.bukkit.block.Block block = org.bukkit.craftbukkit.v1_20_R1.block.CraftBlock.at(p_123379_, spawnItem$source.getPos()); ++ private static final java.util.concurrent.atomic.AtomicBoolean ketting$spawnItem$result = new java.util.concurrent.atomic.AtomicBoolean(true); ++ private static @org.jetbrains.annotations.Nullable BlockSource ketting$spawnItem$source = null; ++ private static final java.util.concurrent.atomic.AtomicBoolean ketting$spawnItem$dropper = new java.util.concurrent.atomic.AtomicBoolean(false); ++ @SuppressWarnings("unused") ++ public static boolean spawnItem(Level p_123379_, ItemStack p_123380_, int p_123381_, Direction p_123382_, BlockSource p_123383_, boolean dropper) { ++ Position position = DispenserBlock.getDispensePosition(p_123383_); ++ ketting$spawnItem$source = p_123383_; ++ ketting$spawnItem$dropper.set(dropper); ++ spawnItem(p_123379_, p_123380_, p_123381_, p_123382_, position); ++ ketting$spawnItem$source = null; ++ return ketting$spawnItem$result.get(); ++ } ++ private static void ketting$spawnItem(Level p_123379_, ItemStack p_123380_, ItemEntity itementity){ ++ if (ketting$spawnItem$source != null) { ++ org.bukkit.block.Block block = org.bukkit.craftbukkit.v1_20_R1.block.CraftBlock.at(p_123379_, ketting$spawnItem$source.getPos()); + org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack.asCraftMirror(p_123380_); + + org.bukkit.event.block.BlockDispenseEvent event = new org.bukkit.event.block.BlockDispenseEvent(block, craftItem.clone(), org.bukkit.craftbukkit.v1_20_R1.util.CraftVector.toBukkit(itementity.getDeltaMovement())); @@ -56,40 +58,41 @@ + } + + if (event.isCancelled()) { -+ spawnItem$result = false; ++ ketting$spawnItem$result.set(false); + return; + } + + itementity.setItem(org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack.asNMSCopy(event.getItem())); + itementity.setDeltaMovement(org.bukkit.craftbukkit.v1_20_R1.util.CraftVector.toNMS(event.getVelocity())); + -+ if (!spawnItem$dropper && !event.getItem().getType().equals(craftItem.getType())) { ++ if (!ketting$spawnItem$dropper.getAndSet(false) && !event.getItem().getType().equals(craftItem.getType())) { + // Chain to handler for new item + ItemStack eventStack = org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack.asNMSCopy(event.getItem()); + DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior.getClass() != DefaultDispenseItemBehavior.class) { -+ idispensebehavior.dispense(spawnItem$source, eventStack); ++ idispensebehavior.dispense(ketting$spawnItem$source, eventStack); + } else { + p_123379_.addFreshEntity(itementity); + } -+ spawnItem$result = false; ++ ketting$spawnItem$result.set(false); + return; + } + } ++ } ++ //Ketting end + public static void spawnItem(Level p_123379_, ItemStack p_123380_, int p_123381_, Direction p_123382_, Position p_123383_) { ++ ketting$spawnItem$result.set(true); //Ketting ++ if (p_123380_.isEmpty()) return; //Ketting? + double d0 = p_123383_.x(); + double d1 = p_123383_.y(); + double d2 = p_123383_.z(); +@@ -37,6 +_,9 @@ + ItemEntity itementity = new ItemEntity(p_123379_, d0, d1, d2, p_123380_); + double d3 = p_123379_.random.nextDouble() * 0.1D + 0.2D; + itementity.setDeltaMovement(p_123379_.random.triangle((double)p_123382_.getStepX() * d3, 0.0172275D * (double)p_123381_), p_123379_.random.triangle(0.2D, 0.0172275D * (double)p_123381_), p_123379_.random.triangle((double)p_123382_.getStepZ() * d3, 0.0172275D * (double)p_123381_)); ++ ++ ketting$spawnItem(p_123379_, p_123380_, itementity);//Ketting + p_123379_.addFreshEntity(itementity); } -+ -+ public static boolean spawnItem(Level p_123379_, ItemStack p_123380_, int p_123381_, Direction p_123382_, BlockSource p_123383_, boolean dropper) { -+ Position position = DispenserBlock.getDispensePosition(p_123383_); -+ spawnItem$source = p_123383_; -+ spawnItem$dropper = dropper; -+ spawnItem(p_123379_, p_123380_, p_123381_, p_123382_, position); -+ spawnItem$source = null; -+ spawnItem$dropper = false; -+ return spawnItem$result; -+ } -+ //Ketting end - protected void playSound(BlockSource p_123384_) { - p_123384_.getLevel().levelEvent(1000, p_123384_.getPos(), 0); From e6094141a79f448f5af1dfd2f2d6d6614e864ae6 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Mon, 18 Mar 2024 18:52:27 +0100 Subject: [PATCH 04/21] Rewrite #2 --- .../ShearsDispenseItemBehavior.java.patch | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/patches/minecraft/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java.patch b/patches/minecraft/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java.patch index fe1a989098..c73acab643 100644 --- a/patches/minecraft/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java.patch +++ b/patches/minecraft/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java +++ b/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java -@@ -23,9 +_,33 @@ +@@ -23,9 +_,37 @@ public class ShearsDispenseItemBehavior extends OptionalDispenseItemBehavior { protected ItemStack execute(BlockSource p_123580_, ItemStack p_123581_) { ServerLevel serverlevel = p_123580_.getLevel(); @@ -30,22 +30,26 @@ + if (!serverlevel.isClientSide()) { BlockPos blockpos = p_123580_.getPos().relative(p_123580_.getBlockState().getValue(DispenserBlock.FACING)); -- this.setSuccess(tryShearBeehive(serverlevel, blockpos) || tryShearLivingEntity(serverlevel, blockpos)); -+ this.setSuccess(tryShearBeehive(serverlevel, blockpos) || tryShearLivingEntity(serverlevel, blockpos, bukkitBlock, craftItem)); // CraftBukkit ++ ketting$tryShearLivingEntity$bukkitBlock = bukkitBlock; //Ketting ++ ketting$tryShearLivingEntity$craftItem = craftItem; //Ketting + this.setSuccess(tryShearBeehive(serverlevel, blockpos) || tryShearLivingEntity(serverlevel, blockpos)); ++ ketting$tryShearLivingEntity$bukkitBlock = null;//Ketting ++ ketting$tryShearLivingEntity$craftItem = null;//Ketting if (this.isSuccess() && p_123581_.hurt(1, serverlevel.getRandom(), (ServerPlayer)null)) { p_123581_.setCount(0); } -@@ -52,10 +_,15 @@ +@@ -52,10 +_,17 @@ return false; } -- private static boolean tryShearLivingEntity(ServerLevel p_123583_, BlockPos p_123584_) { -+ private static boolean tryShearLivingEntity(ServerLevel p_123583_, BlockPos p_123584_, org.bukkit.block.Block bukkitBlock, org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack craftItem) { // CraftBukkit - add args ++ private static @org.jetbrains.annotations.Nullable org.bukkit.block.Block ketting$tryShearLivingEntity$bukkitBlock; ++ private static @org.jetbrains.annotations.Nullable org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack ketting$tryShearLivingEntity$craftItem; + private static boolean tryShearLivingEntity(ServerLevel p_123583_, BlockPos p_123584_) { for(LivingEntity livingentity : p_123583_.getEntitiesOfClass(LivingEntity.class, new AABB(p_123584_), EntitySelector.NO_SPECTATORS)) { if (livingentity instanceof Shearable shearable) { if (shearable.readyForShearing()) { + // CraftBukkit start -+ if (org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callBlockShearEntityEvent(livingentity, bukkitBlock, craftItem).isCancelled()) { ++ if (ketting$tryShearLivingEntity$bukkitBlock != null && ketting$tryShearLivingEntity$craftItem != null &&org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callBlockShearEntityEvent(livingentity, ketting$tryShearLivingEntity$bukkitBlock, ketting$tryShearLivingEntity$craftItem).isCancelled()) { + continue; + } + // CraftBukkit end From 13179f70fdb91a830a019468284d143acce0d1fd Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Mon, 18 Mar 2024 18:56:01 +0100 Subject: [PATCH 05/21] Rewrite #3 --- .../data/recipes/RecipeProvider.java.patch | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/patches/minecraft/net/minecraft/data/recipes/RecipeProvider.java.patch b/patches/minecraft/net/minecraft/data/recipes/RecipeProvider.java.patch index 77025cd9d2..bc6553a35b 100644 --- a/patches/minecraft/net/minecraft/data/recipes/RecipeProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/recipes/RecipeProvider.java.patch @@ -11,10 +11,12 @@ } } -@@ -99,13 +_,23 @@ +@@ -97,6 +_,16 @@ + return CompletableFuture.allOf(list.toArray((p_253414_) -> { + return new CompletableFuture[p_253414_]; })); - } - ++ } ++ + /** + * Called every time a recipe is saved to also save the advancement JSON if it exists. + * @@ -23,16 +25,6 @@ + @org.jetbrains.annotations.Nullable + protected CompletableFuture saveAdvancement(CachedOutput output, FinishedRecipe finishedRecipe, JsonObject advancementJson) { + return DataProvider.saveStable(output, advancementJson, this.advancementPathProvider.json(finishedRecipe.getAdvancementId())); -+ } -+ - protected CompletableFuture buildAdvancement(CachedOutput p_253674_, ResourceLocation p_254102_, Advancement.Builder p_253712_) { - return DataProvider.saveStable(p_253674_, p_253712_.serializeToJson(), this.advancementPathProvider.json(p_254102_)); } - protected abstract void buildRecipes(Consumer p_251297_); - -- protected static void generateForEnabledBlockFamilies(Consumer p_249188_, FeatureFlagSet p_251836_) { -+ protected void generateForEnabledBlockFamilies(Consumer p_249188_, FeatureFlagSet p_251836_) { - BlockFamilies.getAllFamilies().filter((p_248034_) -> { - return p_248034_.shouldGenerateRecipe(p_251836_); - }).forEach((p_176624_) -> { + protected CompletableFuture buildAdvancement(CachedOutput p_253674_, ResourceLocation p_254102_, Advancement.Builder p_253712_) { From 563a88ccef3e93360a5210714078b498383a10e4 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Mon, 18 Mar 2024 19:27:32 +0100 Subject: [PATCH 06/21] Rewrite network patches --- .../minecraft/network/Connection.java.patch | 10 +-- .../network/chat/TextColor.java.patch | 23 +++--- .../ServerboundMovePlayerPacket.java.patch | 24 ------ .../ClientIntentionPacket.java.patch | 5 +- .../syncher/SynchedEntityData.java.patch | 82 ------------------- .../resources/META-INF/accesstransformer.cfg | 11 +++ 6 files changed, 28 insertions(+), 127 deletions(-) delete mode 100644 patches/minecraft/net/minecraft/network/protocol/game/ServerboundMovePlayerPacket.java.patch diff --git a/patches/minecraft/net/minecraft/network/Connection.java.patch b/patches/minecraft/net/minecraft/network/Connection.java.patch index a4ccf0b9e0..7e379e6467 100644 --- a/patches/minecraft/net/minecraft/network/Connection.java.patch +++ b/patches/minecraft/net/minecraft/network/Connection.java.patch @@ -1,13 +1,9 @@ --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java -@@ -72,8 +_,13 @@ - }); - private final PacketFlow receiving; +@@ -74,6 +_,11 @@ private final Queue queue = Queues.newConcurrentLinkedQueue(); -- private Channel channel; -- private SocketAddress address; -+ public Channel channel; -+ public SocketAddress address; + public Channel channel; + public SocketAddress address; + // Spigot Start + public java.util.UUID spoofedUUID; + public com.mojang.authlib.properties.Property[] spoofedProfile; diff --git a/patches/minecraft/net/minecraft/network/chat/TextColor.java.patch b/patches/minecraft/net/minecraft/network/chat/TextColor.java.patch index d304a2963a..ffece7e362 100644 --- a/patches/minecraft/net/minecraft/network/chat/TextColor.java.patch +++ b/patches/minecraft/net/minecraft/network/chat/TextColor.java.patch @@ -1,15 +1,14 @@ --- a/net/minecraft/network/chat/TextColor.java +++ b/net/minecraft/network/chat/TextColor.java -@@ -20,7 +_,7 @@ +@@ -20,6 +_,7 @@ }); }, TextColor::serialize); private static final Map LEGACY_FORMAT_TO_COLOR = Stream.of(ChatFormatting.values()).filter(ChatFormatting::isColor).collect(ImmutableMap.toImmutableMap(Function.identity(), (p_237301_) -> { -- return new TextColor(p_237301_.getColor(), p_237301_.getName()); -+ return new TextColor(p_237301_.getColor(), p_237301_.getName(), p_237301_); // CraftBukkit ++ ketting$format = p_237301_; // Ketting - CraftBukkit + return new TextColor(p_237301_.getColor(), p_237301_.getName()); })); private static final Map NAMED_COLORS = LEGACY_FORMAT_TO_COLOR.values().stream().collect(ImmutableMap.toImmutableMap((p_237297_) -> { - return p_237297_.name; -@@ -28,16 +_,26 @@ +@@ -28,16 +_,30 @@ private final int value; @Nullable private final String name; @@ -17,15 +16,19 @@ + // CraftBukkit start + @Nullable + public final ChatFormatting format; -+ -+ @SuppressWarnings("unused") //Ketting - mixin/minecraft compat - private TextColor(int p_131263_, String p_131264_) { -+ this(p_131263_, p_131264_, null); ++ public static @Nullable ChatFormatting ketting$format; ++ private static String wrap(String passthrough, @Nullable ChatFormatting format){ ++ ketting$format = format; ++ return passthrough; + } + private TextColor(int p_131263_, String p_131264_, @Nullable ChatFormatting format) { ++ this(p_131263_, wrap(p_131264_, format)); ++ } ++ + private TextColor(int p_131263_, String p_131264_) { this.value = p_131263_; this.name = p_131264_; -+ this.format = format; ++ this.format = ketting$format; } private TextColor(int p_131261_) { diff --git a/patches/minecraft/net/minecraft/network/protocol/game/ServerboundMovePlayerPacket.java.patch b/patches/minecraft/net/minecraft/network/protocol/game/ServerboundMovePlayerPacket.java.patch deleted file mode 100644 index 520a414fb6..0000000000 --- a/patches/minecraft/net/minecraft/network/protocol/game/ServerboundMovePlayerPacket.java.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/net/minecraft/network/protocol/game/ServerboundMovePlayerPacket.java -+++ b/net/minecraft/network/protocol/game/ServerboundMovePlayerPacket.java -@@ -4,14 +_,14 @@ - import net.minecraft.network.protocol.Packet; - - public abstract class ServerboundMovePlayerPacket implements Packet { -- protected final double x; -- protected final double y; -- protected final double z; -- protected final float yRot; -- protected final float xRot; -+ public final double x; -+ public final double y; -+ public final double z; -+ public final float yRot; -+ public final float xRot; - protected final boolean onGround; -- protected final boolean hasPos; -- protected final boolean hasRot; -+ public final boolean hasPos; -+ public final boolean hasRot; - - protected ServerboundMovePlayerPacket(double p_179675_, double p_179676_, double p_179677_, float p_179678_, float p_179679_, boolean p_179680_, boolean p_179681_, boolean p_179682_) { - this.x = p_179675_; diff --git a/patches/minecraft/net/minecraft/network/protocol/handshake/ClientIntentionPacket.java.patch b/patches/minecraft/net/minecraft/network/protocol/handshake/ClientIntentionPacket.java.patch index 50304e714e..f458bf1d45 100644 --- a/patches/minecraft/net/minecraft/network/protocol/handshake/ClientIntentionPacket.java.patch +++ b/patches/minecraft/net/minecraft/network/protocol/handshake/ClientIntentionPacket.java.patch @@ -8,7 +8,7 @@ public ClientIntentionPacket(String p_134726_, int p_134727_, ConnectionProtocol p_134728_) { this.protocolVersion = SharedConstants.getCurrentVersion().getProtocolVersion(); -@@ -21,14 +_,19 @@ +@@ -21,14 +_,16 @@ public ClientIntentionPacket(FriendlyByteBuf p_179801_) { this.protocolVersion = p_179801_.readVarInt(); @@ -18,9 +18,6 @@ this.intention = ConnectionProtocol.getById(p_179801_.readVarInt()); + this.fmlVersion = net.minecraftforge.network.NetworkHooks.getFMLVersion(hostName); + this.hostName = hostName.split("\0")[0]; -+//- this(p_179801_.readVarInt(), p_179801_.readUtf(255), p_179801_.readUnsignedShort(), ClientIntent.byId(p_179801_.readVarInt())); -+//+ // Spigot - increase max hostName length -+//+ this(p_179801_.readVarInt(), p_179801_.readUtf(Short.MAX_VALUE), p_179801_.readUnsignedShort(), ClientIntent.byId(p_179801_.readVarInt())); } public void write(FriendlyByteBuf p_134737_) { diff --git a/patches/minecraft/net/minecraft/network/syncher/SynchedEntityData.java.patch b/patches/minecraft/net/minecraft/network/syncher/SynchedEntityData.java.patch index 3ac6fea519..6176c67d04 100644 --- a/patches/minecraft/net/minecraft/network/syncher/SynchedEntityData.java.patch +++ b/patches/minecraft/net/minecraft/network/syncher/SynchedEntityData.java.patch @@ -26,37 +26,6 @@ int i = p_135373_.getId(); if (i > 254) { throw new IllegalArgumentException("Data value id is too big with " + i + "! (Max is 254)"); -@@ -87,9 +_,9 @@ - - private void createDataItem(EntityDataAccessor p_135386_, T p_135387_) { - SynchedEntityData.DataItem dataitem = new SynchedEntityData.DataItem<>(p_135386_, p_135387_); -- this.lock.writeLock().lock(); -+ // this.lock.writeLock().lock(); // Spigot - not required - this.itemsById.put(p_135386_.getId(), dataitem); -- this.lock.writeLock().unlock(); -+ // this.lock.writeLock().unlock(); // Spigot - not required - } - - public boolean hasItem(EntityDataAccessor p_286294_) { -@@ -97,6 +_,8 @@ - } - - private SynchedEntityData.DataItem getItem(EntityDataAccessor p_135380_) { -+ // Spigot start -+ /* - this.lock.readLock().lock(); - - SynchedEntityData.DataItem dataitem; -@@ -112,6 +_,9 @@ - } - - return dataitem; -+ */ -+ return (SynchedEntityData.DataItem)this.itemsById.get(p_135380_.getId()); -+ // Spigot end - } - - public T get(EntityDataAccessor p_135371_) { @@ -133,6 +_,13 @@ } @@ -71,57 +40,6 @@ public boolean isDirty() { return this.isDirty; } -@@ -141,7 +_,7 @@ - public List> packDirty() { - List> list = null; - if (this.isDirty) { -- this.lock.readLock().lock(); -+ // this.lock.readLock().lock(); // Spigot - not required - - for(SynchedEntityData.DataItem dataitem : this.itemsById.values()) { - if (dataitem.isDirty()) { -@@ -154,7 +_,7 @@ - } - } - -- this.lock.readLock().unlock(); -+ // this.lock.readLock().unlock(); // Spigot - not required - } - - this.isDirty = false; -@@ -164,7 +_,7 @@ - @Nullable - public List> getNonDefaultValues() { - List> list = null; -- this.lock.readLock().lock(); -+ // this.lock.readLock().lock(); // Spigot - not required - - for(SynchedEntityData.DataItem dataitem : this.itemsById.values()) { - if (!dataitem.isSetToDefault()) { -@@ -176,12 +_,12 @@ - } - } - -- this.lock.readLock().unlock(); -+ // this.lock.readLock().unlock(); // Spigot - not required - return list; - } - - public void assignValues(List> p_135357_) { -- this.lock.writeLock().lock(); -+ // this.lock.writeLock().lock(); // Spigot - not required - - try { - for(SynchedEntityData.DataValue datavalue : p_135357_) { -@@ -192,7 +_,7 @@ - } - } - } finally { -- this.lock.writeLock().unlock(); -+ // this.lock.writeLock().unlock(); // Spigot - not required - } - - this.entity.onSyncedDataUpdated(p_135357_); @@ -209,6 +_,18 @@ public boolean isEmpty() { return this.itemsById.isEmpty(); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index d47a2fa018..fb58c44941 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -959,4 +959,15 @@ public net.minecraft.world.inventory.InventoryMenu f_39701_ # craftSlots public-f net.minecraft.world.inventory.AbstractContainerMenu f_38841_ # lastSlots public-f net.minecraft.world.inventory.AbstractContainerMenu f_38839_ # slots public-f net.minecraft.world.inventory.AbstractContainerMenu f_150394_ # remoteSlots + +public net.minecraft.network.protocol.game.ServerboundMovePlayerPacket f_134118_ # x +public net.minecraft.network.protocol.game.ServerboundMovePlayerPacket f_134119_ # y +public net.minecraft.network.protocol.game.ServerboundMovePlayerPacket f_134120_ # z +public net.minecraft.network.protocol.game.ServerboundMovePlayerPacket f_134121_ # yRot +public net.minecraft.network.protocol.game.ServerboundMovePlayerPacket f_134122_ # xRot +public net.minecraft.network.protocol.game.ServerboundMovePlayerPacket f_134124_ # hasPos +public net.minecraft.network.protocol.game.ServerboundMovePlayerPacket f_134125_ # hasRot + +public net.minecraft.network.Connection f_129468_ # channel +public net.minecraft.network.Connection f_129469_ # address #endgroup KETTING \ No newline at end of file From 3c3fa8972e2d8da185846c82d6f0d8180ba6f3c3 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Mon, 18 Mar 2024 21:06:03 +0100 Subject: [PATCH 07/21] Rewrite part of world (drifted off into server patches) --- .../server/level/ServerLevel.java.patch | 146 +++++++++--------- .../server/level/WorldGenRegion.java.patch | 32 ++-- .../world/CompoundContainer.java.patch | 14 +- .../minecraft/world/entity/Entity.java.patch | 5 +- .../world/level/LevelWriter.java.patch | 23 ++- .../world/level/NaturalSpawner.java.patch | 25 ++- .../resources/META-INF/accesstransformer.cfg | 3 + 7 files changed, 126 insertions(+), 122 deletions(-) diff --git a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch index 7b6b3889ba..2296fe36d5 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch @@ -424,70 +424,65 @@ } this.getChunkSource().getDataStorage().save(); -@@ -799,16 +_,60 @@ +@@ -799,18 +_,58 @@ return list.isEmpty() ? null : list.get(this.random.nextInt(list.size())); } + //Ketting start - move spawnreason, disable spawns -+ private org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason addFreshEntity$spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; ++ private java.util.concurrent.atomic.AtomicReference ketting$addFreshEntity$spawnReason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); + @Override + public void prepareAddFreshEntity(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ addFreshEntity$spawnReason = spawnReason; ++ ketting$addFreshEntity$spawnReason.set(spawnReason); + } + -+ private java.util.List disabledEntitySpawns = new java.util.ArrayList<>(); ++ private java.util.List ketting$disabledEntitySpawns = new java.util.ArrayList<>(); + @Override + public void disableSpawnFor(Entity entity) { -+ disabledEntitySpawns.add(entity); ++ ketting$disabledEntitySpawns.add(entity); + } + public boolean addFreshEntity(Entity p_8837_) { -- return this.addEntity(p_8837_); -+ // CraftBukkit start -+ try { -+ if (disabledEntitySpawns.contains(p_8837_)) { -+ disabledEntitySpawns.remove(p_8837_); -+ return false; -+ } -+ return this.addFreshEntity(p_8837_, addFreshEntity$spawnReason); -+ } finally { -+ addFreshEntity$spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; ++ if (ketting$disabledEntitySpawns.contains(p_8837_)) { ++ ketting$disabledEntitySpawns.remove(p_8837_); ++ return false; + } -+ } -+ //Ketting end -+ -+ @Override -+ public boolean addFreshEntity(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { -+ return this.addEntityCB(entity, reason); -+ // CraftBukkit end ++ ketting$addEntity$spawnReason.set(ketting$addFreshEntity$spawnReason.getAndSet(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT)); ++ // Ketting end + return this.addEntity(p_8837_); } - public boolean addWithUUID(Entity p_8848_) { -- return this.addEntity(p_8848_); -+ // CraftBukkit start -+ return this.addWithUUID(p_8848_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); -+ } ++ //Ketting start ++ private java.util.concurrent.atomic.AtomicReference ketting$addWithUUID$spawnReason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); + + public boolean addWithUUID(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { -+ return this.addEntityCB(entity, reason); -+ // CraftBukkit end ++ ketting$addWithUUID$spawnReason.set(reason); ++ return this.addWithUUID(entity); ++ } ++ //Ketting end ++ + public boolean addWithUUID(Entity p_8848_) { ++ ketting$addEntity$spawnReason.getAndSet(ketting$addWithUUID$spawnReason.getAndSet(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT)); //Ketting + return this.addEntity(p_8848_); } public void addDuringTeleport(Entity p_143335_) { -- this.addEntity(p_143335_); + // CraftBukkit start + // SPIGOT-6415: Don't call spawn event for entities which travel trough worlds, + // since it is only an implementation detail, that a new entity is created when + // they are traveling between worlds. -+ this.addDuringTeleport(p_143335_, null); -+ } -+ -+ public void addDuringTeleport(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { -+ this.addEntityCB(entity, reason); -+ // CraftBukkit end ++ ketting$addEntity$spawnReason.set(null); + this.addEntity(p_143335_); } ++ public void addDuringTeleport(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { ++ ketting$addEntity$spawnReason.set(reason); ++ this.addEntity(entity); ++ // CraftBukkit end ++ } ++ public void addDuringCommandTeleport(ServerPlayer p_8623_) { + this.addPlayer(p_8623_); + } @@ -828,6 +_,7 @@ } @@ -496,7 +491,7 @@ Entity entity = this.getEntities().get(p_8854_.getUUID()); if (entity != null) { LOGGER.warn("Force-added player with duplicate UUID {}", (Object)p_8854_.getUUID().toString()); -@@ -835,28 +_,70 @@ +@@ -835,28 +_,67 @@ this.removePlayerImmediately((ServerPlayer)entity, Entity.RemovalReason.DISCARDED); } @@ -506,15 +501,15 @@ } + //Ketting start - add original method back, reverse delegation so that the CB method calls the original method. -+ @SuppressWarnings({"OptionalUsedAsFieldOrParameterType", "OptionalAssignedToNull"}) //yeah, this is not really nice here, but whatever. -+ @Nullable private Optional addEntity$spawnReason = null; -+ private boolean addEntityCB(Entity p_8873_, @Nullable org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ try{ -+ addEntity$spawnReason = Optional.ofNullable(spawnReason); -+ return addEntity(p_8873_); -+ } finally { -+ addEntity$spawnReason = null; ++ private final java.util.concurrent.atomic.AtomicReference ketting$addEntity$spawnReason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CUSTOM); ++ private boolean ketting$addEntity(Entity p_8873_){ ++ //Ketting: add original method back ++ org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason = ketting$addEntity$spawnReason.getAndSet(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CUSTOM); ++ if (reason != null && !org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.doEntityAddEventCalling(this, p_8873_, reason)) { ++ return true; + } ++ return false; ++ // CraftBukkit end + } + //Ketting end private boolean addEntity(Entity p_8873_) { @@ -524,13 +519,9 @@ return false; } else { - return this.entityManager.addNewEntity(p_8873_); ++ //return this.entityManager.addNewEntity(p_8873_); + // SPIGOT-6415: Don't call spawn event when reason is null. For example when an entity teleports to a new world. -+ //Ketting: add original method back -+ //noinspection OptionalAssignedToNull -+ if (addEntity$spawnReason != null && !org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.doEntityAddEventCalling(this, p_8873_, addEntity$spawnReason.orElse(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CUSTOM))) { -+ return false; -+ } -+ // CraftBukkit end ++ if (ketting$addEntity(p_8873_)) return false; + + if (this.entityManager.addNewEntity(p_8873_)) { + p_8873_.onAddedToWorld(); @@ -541,17 +532,18 @@ } } - public boolean tryAddFreshEntityWithPassengers(Entity p_8861_) { -+ // CraftBukkit start -+ return this.tryAddFreshEntityWithPassengers(p_8861_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); -+ } -+ ++ //Ketting start ++ private final java.util.concurrent.atomic.AtomicReference ketting$tryAddFreshEntityWithPassengers$spawnReason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); + public boolean tryAddFreshEntityWithPassengers(Entity p_8861_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { -+ // CraftBukkit end ++ ketting$tryAddFreshEntityWithPassengers$spawnReason.set(reason); ++ return tryAddFreshEntityWithPassengers(p_8861_); ++ } ++ //Ketting end + public boolean tryAddFreshEntityWithPassengers(Entity p_8861_) { if (p_8861_.getSelfAndPassengers().map(Entity::getUUID).anyMatch(this.entityManager::isLoaded)) { return false; } else { -+ this.prepareAddFreshEntityWithPassengers(reason); ++ this.prepareAddFreshEntityWithPassengers(ketting$tryAddFreshEntityWithPassengers$spawnReason.getAndSet(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT)); this.addFreshEntityWithPassengers(p_8861_); return true; } @@ -695,15 +687,26 @@ if (!explosion.interactsWithBlocks()) { explosion.clearToBlow(); } -@@ -1031,12 +_,20 @@ +@@ -1030,13 +_,31 @@ + return this.server.getStructureManager(); } - public int sendParticles(T p_8768_, double p_8769_, double p_8770_, double p_8771_, int p_8772_, double p_8773_, double p_8774_, double p_8775_, double p_8776_) { ++ private final java.util.concurrent.atomic.AtomicReference ketting$sendParticles$sender = new java.util.concurrent.atomic.AtomicReference<>(null); ++ private final java.util.concurrent.atomic.AtomicBoolean ketting$sendParticles$force = new java.util.concurrent.atomic.AtomicBoolean(false); ++ ++ public int sendParticles(ServerPlayer sender, T p_8768_, double p_8769_, double p_8770_, double p_8771_, int p_8772_, double p_8773_, double p_8774_, double p_8775_, double p_8776_, boolean force) { ++ ketting$sendParticles$sender.set(sender); ++ ketting$sendParticles$force.set(force); + // CraftBukkit - visibility api support -+ return sendParticles(null, p_8768_, p_8769_, p_8770_, p_8771_, p_8772_, p_8773_, p_8774_, p_8775_, p_8776_, false); ++ return sendParticles(p_8768_, p_8769_, p_8770_, p_8771_, p_8772_, p_8773_, p_8774_, p_8775_, p_8776_); ++ } ++ private boolean ketting$sendParticles(ServerPlayer serverplayer){ ++ ServerPlayer sender = ketting$sendParticles$sender.getAndSet(null); ++ if (sender != null && !serverplayer.getBukkitEntity().canSee(sender.getBukkitEntity())) return true; ++ return false; + } + -+ public int sendParticles(ServerPlayer sender, T p_8768_, double p_8769_, double p_8770_, double p_8771_, int p_8772_, double p_8773_, double p_8774_, double p_8775_, double p_8776_, boolean force) { + public int sendParticles(T p_8768_, double p_8769_, double p_8770_, double p_8771_, int p_8772_, double p_8773_, double p_8774_, double p_8775_, double p_8776_) { ClientboundLevelParticlesPacket clientboundlevelparticlespacket = new ClientboundLevelParticlesPacket(p_8768_, false, p_8769_, p_8770_, p_8771_, (float)p_8773_, (float)p_8774_, (float)p_8775_, (float)p_8776_, p_8772_); + // CraftBukkit end int i = 0; @@ -711,9 +714,9 @@ for(int j = 0; j < this.players.size(); ++j) { ServerPlayer serverplayer = this.players.get(j); - if (this.sendParticles(serverplayer, false, p_8769_, p_8770_, p_8771_, clientboundlevelparticlespacket)) { -+ if (sender != null && !serverplayer.getBukkitEntity().canSee(sender.getBukkitEntity())) continue; // CraftBukkit ++ if (ketting$sendParticles(serverplayer)) continue; // Ketting - from CraftBukkit + -+ if (this.sendParticles(serverplayer, force, p_8769_, p_8770_, p_8771_, clientboundlevelparticlespacket)) { // CraftBukkit ++ if (this.sendParticles(serverplayer, ketting$sendParticles$force.getAndSet(false), p_8769_, p_8770_, p_8771_, clientboundlevelparticlespacket)) { // CraftBukkit ++i; } } @@ -760,16 +763,16 @@ } @Nullable -@@ -1368,19 +_,43 @@ +@@ -1367,20 +_,44 @@ + } } - public static void makeObsidianPlatform(ServerLevel p_8618_) { -+ // CraftBukkit start -+ ServerLevel.makeObsidianPlatform(p_8618_, null); -+ } -+ ++ public static final java.util.concurrent.atomic.AtomicReference ketting$makeObsidianPlatform$entity = new java.util.concurrent.atomic.AtomicReference<>(null); + public static void makeObsidianPlatform(ServerLevel p_8618_, Entity entity) { -+ // CraftBukkit end ++ ketting$makeObsidianPlatform$entity.set(entity); ++ ServerLevel.makeObsidianPlatform(p_8618_); ++ } + public static void makeObsidianPlatform(ServerLevel p_8618_) { BlockPos blockpos = END_SPAWN_POINT; int i = blockpos.getX(); int j = blockpos.getY() - 2; @@ -790,6 +793,7 @@ + blockList.setBlock(blockposition1, Blocks.OBSIDIAN.defaultBlockState(), 3); + }); + org.bukkit.World bworld = p_8618_.getWorld(); ++ Entity entity = ketting$makeObsidianPlatform$entity.getAndSet(null); + org.bukkit.event.world.PortalCreateEvent portalEvent = new org.bukkit.event.world.PortalCreateEvent((List) (List) blockList.getList(), bworld, (entity == null) ? null : entity.getBukkitEntity(), org.bukkit.event.world.PortalCreateEvent.CreateReason.END_PLATFORM); + + p_8618_.getCraftServer().getPluginManager().callEvent(portalEvent); diff --git a/patches/minecraft/net/minecraft/server/level/WorldGenRegion.java.patch b/patches/minecraft/net/minecraft/server/level/WorldGenRegion.java.patch index cd473787b5..c7a434faf1 100644 --- a/patches/minecraft/net/minecraft/server/level/WorldGenRegion.java.patch +++ b/patches/minecraft/net/minecraft/server/level/WorldGenRegion.java.patch @@ -9,39 +9,31 @@ BlockEntity blockentity = blockstate.hasBlockEntity() ? this.getBlockEntity(p_9550_) : null; Block.dropResources(blockstate, this.level, p_9550_, blockentity, p_9552_, ItemStack.EMPTY); } -@@ -296,7 +_,37 @@ +@@ -296,7 +_,29 @@ this.getChunk(p_9592_).markPosForPostprocessing(p_9592_); } + //Ketting start -+ private org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason addFreshEntity$spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; ++ private java.util.List ketting$disabledEntitySpawns = new java.util.ArrayList<>(); + @Override -+ public void prepareAddFreshEntity(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { -+ this.addFreshEntity$spawnReason = reason; ++ public void disableSpawnFor(Entity entity) { ++ ketting$disabledEntitySpawns.add(entity); + } + -+ private java.util.List disabledEntitySpawns = new java.util.ArrayList<>(); -+ @Override -+ public void disableSpawnFor(Entity entity) { -+ disabledEntitySpawns.add(entity); ++ //Ketting - CB does nothing with the spawn reason? ++ //https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse/nms-patches/net/minecraft/server/level/RegionLimitedWorldAccess.patch#1-2 ++ public boolean addFreshEntity(Entity p_9580_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { ++ return addFreshEntity(p_9580_); + } + public boolean addFreshEntity(Entity p_9580_) { + // CraftBukkit start -+ try { -+ if (disabledEntitySpawns.contains(p_9580_)) { -+ disabledEntitySpawns.remove(p_9580_); -+ return false; -+ } -+ return addFreshEntity(p_9580_, addFreshEntity$spawnReason); -+ } finally { -+ addFreshEntity$spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; ++ if (ketting$disabledEntitySpawns.contains(p_9580_)) { ++ ketting$disabledEntitySpawns.remove(p_9580_); ++ return false; + } -+ } -+ //Ketting end -+ -+ public boolean addFreshEntity(Entity p_9580_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { + // CraftBukkit end ++ // Ketting end + if (p_9580_ instanceof net.minecraft.world.entity.Mob mob && mob.isSpawnCancelled()) return false; + int i = SectionPos.blockToSectionCoord(p_9580_.getBlockX()); diff --git a/patches/minecraft/net/minecraft/world/CompoundContainer.java.patch b/patches/minecraft/net/minecraft/world/CompoundContainer.java.patch index 8f284c8205..e600358af0 100644 --- a/patches/minecraft/net/minecraft/world/CompoundContainer.java.patch +++ b/patches/minecraft/net/minecraft/world/CompoundContainer.java.patch @@ -1,14 +1,9 @@ --- a/net/minecraft/world/CompoundContainer.java +++ b/net/minecraft/world/CompoundContainer.java -@@ -4,8 +_,50 @@ - import net.minecraft.world.item.ItemStack; +@@ -7,6 +_,48 @@ + public final Container container1; + public final Container container2; - public class CompoundContainer implements Container { -- private final Container container1; -- private final Container container2; -+ public final Container container1; -+ public final Container container2; -+ + // CraftBukkit start - add fields and methods + public java.util.List transaction = new java.util.ArrayList(); + @@ -50,9 +45,10 @@ + return container1.getLocation(); // TODO: right? + } + // CraftBukkit end - ++ public CompoundContainer(Container p_18913_, Container p_18914_) { this.container1 = p_18913_; + this.container2 = p_18914_; @@ -46,7 +_,7 @@ } diff --git a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch index 6b15dfbfe3..5b546f3160 100644 --- a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch @@ -949,7 +949,7 @@ } public boolean is(Entity p_20356_) { -@@ -2410,36 +_,85 @@ +@@ -2410,36 +_,86 @@ @Nullable public Entity changeDimension(ServerLevel p_20118_) { @@ -1020,7 +1020,8 @@ + entity.setDeltaMovement(portalinfo.speed); + finalLevel.addDuringTeleport(entity); + if (spawnPortal && finalLevel.getTypeKey() == net.minecraft.world.level.dimension.LevelStem.END) { // CraftBukkit -+ ServerLevel.makeObsidianPlatform(finalLevel, this); // CraftBukkit ++ ServerLevel.ketting$makeObsidianPlatform$entity.set(this); ++ ServerLevel.makeObsidianPlatform(finalLevel); + } + + // CraftBukkit start - Forward the org.bukkit.craftbukkit.entity.CraftEntity to the new entity diff --git a/patches/minecraft/net/minecraft/world/level/LevelWriter.java.patch b/patches/minecraft/net/minecraft/world/level/LevelWriter.java.patch index 75f7788339..b4dd38184c 100644 --- a/patches/minecraft/net/minecraft/world/level/LevelWriter.java.patch +++ b/patches/minecraft/net/minecraft/world/level/LevelWriter.java.patch @@ -1,26 +1,25 @@ --- a/net/minecraft/world/level/LevelWriter.java +++ b/net/minecraft/world/level/LevelWriter.java -@@ -24,7 +_,23 @@ +@@ -24,6 +_,22 @@ boolean destroyBlock(BlockPos p_46957_, boolean p_46958_, @Nullable Entity p_46959_, int p_46960_); + //Ketting start -+ default void prepareAddFreshEntity(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {} -+ -+ default void disableSpawnFor(Entity entity) {} -+ //Ketting end -+ - default boolean addFreshEntity(Entity p_46964_) { - return false; - } -+ + // CraftBukkit start + /** + * Ketting - use addFreshEntity instead with prepareAddFreshEntity + */ + @Deprecated + default boolean addFreshEntity(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { -+ return false; ++ prepareAddFreshEntity(reason); ++ return addFreshEntity(entity); + } + // CraftBukkit end - } ++ default void prepareAddFreshEntity(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {} ++ ++ default void disableSpawnFor(Entity entity) {} ++ //Ketting end ++ + default boolean addFreshEntity(Entity p_46964_) { + return false; + } diff --git a/patches/minecraft/net/minecraft/world/level/NaturalSpawner.java.patch b/patches/minecraft/net/minecraft/world/level/NaturalSpawner.java.patch index 7047ebecef..db91cf65c6 100644 --- a/patches/minecraft/net/minecraft/world/level/NaturalSpawner.java.patch +++ b/patches/minecraft/net/minecraft/world/level/NaturalSpawner.java.patch @@ -9,7 +9,7 @@ if (mobcategory != MobCategory.MISC) { BlockPos blockpos = entity.blockPosition(); p_186527_.query(ChunkPos.asLong(blockpos), (p_275163_) -> { -@@ -101,13 +_,31 @@ +@@ -101,13 +_,33 @@ public static void spawnForChunk(ServerLevel p_47030_, LevelChunk p_47031_, NaturalSpawner.SpawnState p_47032_, boolean p_47033_, boolean p_47034_, boolean p_47035_) { p_47030_.getProfiler().push("spawner"); @@ -18,7 +18,6 @@ + net.minecraft.world.level.storage.LevelData worlddata = p_47030_.getLevelData(); // CraftBukkit - Other mob type spawn tick rate for(MobCategory mobcategory : SPAWNING_CATEGORIES) { -- if ((p_47033_ || !mobcategory.isFriendly()) && (p_47034_ || mobcategory.isFriendly()) && (p_47035_ || !mobcategory.isPersistent()) && p_47032_.canSpawnForCategory(mobcategory, p_47031_.getPos())) { + // CraftBukkit start - Use per-world spawn limits + boolean spawnThisTick = true; + int limit = mobcategory.getMaxInstancesPerChunk(); @@ -32,10 +31,12 @@ + continue; + } + -+ if ((p_47033_ || !mobcategory.isFriendly()) && (p_47034_ || mobcategory.isFriendly()) && (p_47035_ || !mobcategory.isPersistent()) && p_47032_.canSpawnForCategory(mobcategory, p_47031_.getPos(), limit)) { ++ p_47032_.ketting$canSpawnForCategory$limit.set(limit); + if ((p_47033_ || !mobcategory.isFriendly()) && (p_47034_ || mobcategory.isFriendly()) && (p_47035_ || !mobcategory.isPersistent()) && p_47032_.canSpawnForCategory(mobcategory, p_47031_.getPos())) { + // CraftBukkit end spawnCategoryForChunk(mobcategory, p_47030_, p_47031_, p_47032_::canSpawn, p_47032_::afterSpawn); } ++ p_47032_.ketting$canSpawnForCategory$limit.set(Integer.MAX_VALUE); } + p_47030_.timings.mobSpawn.stopTiming(); // Spigot @@ -122,15 +123,23 @@ spawngroupdata = mob.finalizeSpawn(p_220451_, p_220451_.getCurrentDifficultyAt(mob.blockPosition()), MobSpawnType.CHUNK_GENERATION, spawngroupdata, (CompoundTag)null); p_220451_.addFreshEntityWithPassengers(mob); flag = true; -@@ -489,8 +_,11 @@ +@@ -489,8 +_,20 @@ return this.unmodifiableMobCategoryCounts; } -- boolean canSpawnForCategory(MobCategory p_186549_, ChunkPos p_186550_) { -- int i = p_186549_.getMaxInstancesPerChunk() * this.spawnableChunkCount / NaturalSpawner.MAGIC_NUMBER; -+ // CraftBukkit start ++ ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicInteger ketting$canSpawnForCategory$limit = new java.util.concurrent.atomic.AtomicInteger(Integer.MAX_VALUE); ++ @SuppressWarnings("unused") //Ketting - CB compat + boolean canSpawnForCategory(MobCategory p_186549_, ChunkPos p_186550_, int limit) { -+ int i = limit * this.spawnableChunkCount / NaturalSpawner.MAGIC_NUMBER; ++ ketting$canSpawnForCategory$limit.set(limit); ++ return canSpawnForCategory(p_186549_, p_186550_); ++ } ++ // CraftBukkit start + boolean canSpawnForCategory(MobCategory p_186549_, ChunkPos p_186550_) { +- int i = p_186549_.getMaxInstancesPerChunk() * this.spawnableChunkCount / NaturalSpawner.MAGIC_NUMBER; ++ int i = ketting$canSpawnForCategory$limit.getAndSet(Integer.MAX_VALUE) * this.spawnableChunkCount / NaturalSpawner.MAGIC_NUMBER; ++ //Ketting end + // CraftBukkit end + if (this.mobCategoryCounts.getInt(p_186549_) >= i) { diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index fb58c44941..1f803c3d8b 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -970,4 +970,7 @@ public net.minecraft.network.protocol.game.ServerboundMovePlayerPacket f_134125_ public net.minecraft.network.Connection f_129468_ # channel public net.minecraft.network.Connection f_129469_ # address + +public net.minecraft.world.CompoundContainer f_18910_ # container1 +public net.minecraft.world.CompoundContainer f_18911_ # container2 #endgroup KETTING \ No newline at end of file From e9adb1ecbcdbf414f3f4fb5266a43896dc1f8934 Mon Sep 17 00:00:00 2001 From: JustRed23 Date: Mon, 18 Mar 2024 20:57:00 +0100 Subject: [PATCH 08/21] Fix warden spawn animation getting played twice --- .../spigot/InactiveTickExclusions.java | 19 +++++++++++++++++++ .../java/org/spigotmc/ActivationRange.java | 8 ++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/main/java/org/kettingpowered/ketting/spigot/InactiveTickExclusions.java diff --git a/src/main/java/org/kettingpowered/ketting/spigot/InactiveTickExclusions.java b/src/main/java/org/kettingpowered/ketting/spigot/InactiveTickExclusions.java new file mode 100644 index 0000000000..ad508f43b2 --- /dev/null +++ b/src/main/java/org/kettingpowered/ketting/spigot/InactiveTickExclusions.java @@ -0,0 +1,19 @@ +package org.kettingpowered.ketting.spigot; + +import net.minecraft.world.entity.Entity; + +import java.util.ArrayList; +import java.util.List; + +public class InactiveTickExclusions { + + private static final List> EXCLUDED_ENTITIES = new ArrayList<>(); + + static { + EXCLUDED_ENTITIES.add(net.minecraft.world.entity.monster.warden.Warden.class); + } + + public static boolean isExcluded(Entity entity) { + return EXCLUDED_ENTITIES.contains(entity.getClass()); + } +} diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java index 1c32fb4f5e..68443f67c7 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -28,6 +28,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; import org.bukkit.craftbukkit.v1_20_R1.SpigotTimings; +import org.kettingpowered.ketting.spigot.InactiveTickExclusions; public class ActivationRange { @@ -236,6 +237,13 @@ public static boolean checkIfActive(Entity entity) return true; } + //Ketting start - exclusions - this prevents some weird animation bugs with some entities + if (InactiveTickExclusions.isExcluded(entity)) { + SpigotTimings.checkIfActiveTimer.stopTiming(); + return true; + } + //Ketting end + boolean isActive = entity.activatedTick >= MinecraftServer.currentTick || entity.defaultActivationState; // Should this entity tick? From 4b12476b82533f310938c94a9d7c6a709309e030 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Tue, 19 Mar 2024 01:21:52 +0100 Subject: [PATCH 09/21] Rewrite net/minecraft/level/world --- .../server/level/ServerLevel.java.patch | 5 +- .../net/minecraft/world/entity/Mob.java.patch | 35 +++++++-- .../world/entity/NeutralMob.java.patch | 11 +-- .../target/DefendVillageTargetGoal.java.patch | 8 +- .../goal/target/HurtByTargetGoal.java.patch | 15 ++-- .../NearestAttackableTargetGoal.java.patch | 8 +- .../target/OwnerHurtByTargetGoal.java.patch | 8 +- .../target/OwnerHurtTargetGoal.java.patch | 8 +- .../ai/goal/target/TargetGoal.java.patch | 16 ++-- .../world/entity/animal/Bee.java.patch | 8 +- .../world/entity/animal/IronGolem.java.patch | 8 +- .../world/entity/animal/Panda.java.patch | 8 +- .../world/entity/animal/Wolf.java.patch | 14 ++-- .../animal/horse/TraderLlama.java.patch | 8 +- .../world/entity/monster/EnderMan.java.patch | 23 +++--- .../world/entity/monster/Phantom.java.patch | 8 +- .../world/entity/monster/Vex.java.patch | 8 +- .../world/entity/monster/Zombie.java.patch | 10 ++- .../entity/monster/ZombifiedPiglin.java.patch | 22 ++---- .../world/entity/raid/Raider.java.patch | 14 ++-- .../minecraft/world/level/Level.java.patch | 31 ++++---- .../world/level/LevelAccessor.java.patch | 14 ---- .../block/BasePressurePlateBlock.java.patch | 15 ++-- .../world/level/block/BeehiveBlock.java.patch | 8 +- .../level/block/BigDripleafBlock.java.patch | 41 ++++++---- .../world/level/block/Block.java.patch | 29 +++---- .../level/block/ComposterBlock.java.patch | 18 +++-- .../level/block/DispenserBlock.java.patch | 7 +- .../block/DropExperienceBlock.java.patch | 5 +- .../block/LayeredCauldronBlock.java.patch | 19 +++-- .../world/level/block/LecternBlock.java.patch | 7 +- .../level/block/MultifaceSpreader.java.patch | 3 +- .../block/PointedDripstoneBlock.java.patch | 29 ++++--- .../level/block/RedStoneOreBlock.java.patch | 20 +++-- .../level/block/SculkCatalystBlock.java.patch | 5 +- .../level/block/SculkSensorBlock.java.patch | 5 +- .../level/block/SculkShriekerBlock.java.patch | 5 +- .../level/block/SculkVeinBlock.java.patch | 16 ++-- .../world/level/block/SignBlock.java.patch | 15 ++-- .../AbstractFurnaceBlockEntity.java.patch | 36 ++++----- .../entity/BeehiveBlockEntity.java.patch | 40 ++++++---- .../block/entity/BellBlockEntity.java.patch | 11 --- .../entity/CampfireBlockEntity.java.patch | 11 --- .../block/entity/HopperBlockEntity.java.patch | 40 ++++++---- .../entity/JukeboxBlockEntity.java.patch | 14 +--- .../entity/LecternBlockEntity.java.patch | 10 +-- ...andomizableContainerBlockEntity.java.patch | 11 --- .../block/entity/SignBlockEntity.java.patch | 12 ++- .../entity/StructureBlockEntity.java.patch | 34 --------- .../properties/IntegerProperty.java.patch | 13 ---- .../level/chunk/ChunkGenerator.java.patch | 9 --- .../world/level/chunk/LevelChunk.java.patch | 23 ++---- .../chunk/storage/ChunkStorage.java.patch | 9 +++ .../dimension/end/EndDragonFight.java.patch | 49 ++++++------ .../PersistentEntitySectionManager.java.patch | 65 ++++++++-------- .../LegacyStructureDataHandler.java.patch | 5 +- .../structure/StructurePiece.java.patch | 9 --- .../placement/StructurePlacement.java.patch | 19 ----- .../structures/MineshaftPieces.java.patch | 11 --- .../NetherFortressPieces.java.patch | 11 --- .../structures/StrongholdPieces.java.patch | 11 --- .../StructureTemplate.java.patch | 9 +-- .../level/portal/PortalForcer.java.patch | 47 +++++++----- .../world/level/portal/PortalInfo.java.patch | 26 +++++-- .../world/level/portal/PortalShape.java.patch | 33 ++++---- .../maps/MapItemSavedData.java.patch | 31 ++++---- .../storage/LevelStorageSource.java.patch | 75 ++++++++++++------- .../level/storage/loot/LootTable.java.patch | 21 +++--- ...andomChanceWithLootingCondition.java.patch | 16 ++-- .../v1_20_R1/boss/CraftDragonBattle.java | 2 +- .../v1_20_R1/event/CraftEventFactory.java | 2 + .../resources/META-INF/accesstransformer.cfg | 47 +++++++++++- 72 files changed, 651 insertions(+), 648 deletions(-) delete mode 100644 patches/minecraft/net/minecraft/world/level/block/entity/StructureBlockEntity.java.patch delete mode 100644 patches/minecraft/net/minecraft/world/level/block/state/properties/IntegerProperty.java.patch delete mode 100644 patches/minecraft/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java.patch delete mode 100644 patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/MineshaftPieces.java.patch delete mode 100644 patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces.java.patch delete mode 100644 patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/StrongholdPieces.java.patch diff --git a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch index 2296fe36d5..adc526d017 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch @@ -763,15 +763,18 @@ } @Nullable -@@ -1367,20 +_,44 @@ +@@ -1367,20 +_,47 @@ } } ++ //Ketting start + public static final java.util.concurrent.atomic.AtomicReference ketting$makeObsidianPlatform$entity = new java.util.concurrent.atomic.AtomicReference<>(null); ++ @SuppressWarnings("unused") + public static void makeObsidianPlatform(ServerLevel p_8618_, Entity entity) { + ketting$makeObsidianPlatform$entity.set(entity); + ServerLevel.makeObsidianPlatform(p_8618_); + } ++ //Ketting end public static void makeObsidianPlatform(ServerLevel p_8618_) { BlockPos blockpos = END_SPAWN_POINT; int i = blockpos.getX(); diff --git a/patches/minecraft/net/minecraft/world/entity/Mob.java.patch b/patches/minecraft/net/minecraft/world/entity/Mob.java.patch index 0e774866d9..ffc27858fc 100644 --- a/patches/minecraft/net/minecraft/world/entity/Mob.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Mob.java.patch @@ -25,17 +25,34 @@ protected void registerGoals() { } -@@ -229,7 +_,42 @@ +@@ -228,8 +_,61 @@ + return this.target; } - public void setTarget(@Nullable LivingEntity p_21544_) { ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$setTarget$reason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN); ++ public final java.util.concurrent.atomic.AtomicBoolean ketting$setTarget$fireEvent = new java.util.concurrent.atomic.AtomicBoolean(true); ++ public boolean ketting$setTarget$result = false; ++ ++ public boolean setTarget(@Nullable LivingEntity p_21544_, @Nullable org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent) { ++ if (reason != null) ketting$setTarget$reason.set(reason); ++ ketting$setTarget$fireEvent.set(fireEvent); + // CraftBukkit start - fire event -+ setTarget(p_21544_, org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN, true); ++ setTarget(p_21544_); ++ return ketting$setTarget$result; + } ++ //Ketting end + -+ public boolean setTarget(@Nullable LivingEntity p_21544_, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent) { -+ if (getTarget() == p_21544_) return false; -+ if (fireEvent) { + public void setTarget(@Nullable LivingEntity p_21544_) { ++ if (getTarget() == p_21544_) { ++ ketting$setTarget$result = false; ++ ketting$setTarget$fireEvent.set(true); ++ ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN); ++ return; ++ } ++ if (ketting$setTarget$fireEvent.getAndSet(true)) { ++ org.bukkit.event.entity.EntityTargetEvent.TargetReason reason = ketting$setTarget$reason.getAndSet(org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN); ++ if (reason == null) reason = org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN; + if (reason == org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN && getTarget() != null && p_21544_ == null) { + reason = getTarget().isAlive() ? org.bukkit.event.entity.EntityTargetEvent.TargetReason.FORGOT_TARGET : org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_DIED; + } @@ -52,7 +69,8 @@ + org.bukkit.event.entity.EntityTargetLivingEntityEvent event = new org.bukkit.event.entity.EntityTargetLivingEntityEvent(this.getBukkitEntity(), ctarget, reason); + this.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { -+ return false; ++ ketting$setTarget$result = false; ++ return; + } + + if (event.getTarget() != null) { @@ -63,7 +81,8 @@ + } + this.target = p_21544_; -+ return true; ++ ketting$setTarget$result = true; ++ return; + // CraftBukkit end } diff --git a/patches/minecraft/net/minecraft/world/entity/NeutralMob.java.patch b/patches/minecraft/net/minecraft/world/entity/NeutralMob.java.patch index f83cb025ac..9bc9241954 100644 --- a/patches/minecraft/net/minecraft/world/entity/NeutralMob.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/NeutralMob.java.patch @@ -9,17 +9,10 @@ this.setRemainingPersistentAngerTime(0); } -@@ -119,7 +_,13 @@ - +@@ -120,6 +_,7 @@ void setLastHurtByPlayer(@Nullable Player p_21680_); -- void setTarget(@Nullable LivingEntity p_21681_); -+ //Ketting start -+ default void setTarget(@Nullable LivingEntity p_21681_) -+ { -+ setTarget(p_21681_, org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN, true); -+ } -+ //Ketting end + void setTarget(@Nullable LivingEntity p_21681_); + boolean setTarget(@Nullable LivingEntity p_21681_, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent); // CraftBukkit boolean canAttack(LivingEntity p_181126_); diff --git a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.java.patch index 3df7cad489..82069ba4d6 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.java +++ b/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.java -@@ -47,7 +_,7 @@ +@@ -47,6 +_,8 @@ } public void start() { -- this.golem.setTarget(this.potentialTarget); -+ this.golem.setTarget(this.potentialTarget, org.bukkit.event.entity.EntityTargetEvent.TargetReason.DEFEND_VILLAGE, true); // CraftBukkit - reason ++ golem.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.DEFEND_VILLAGE); ++ golem.ketting$setTarget$fireEvent.set(true); + this.golem.setTarget(this.potentialTarget); super.start(); } - } diff --git a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.java.patch index f6bbac2a9f..8b8088a691 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.java.patch @@ -1,19 +1,20 @@ --- a/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.java +++ b/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.java -@@ -57,7 +_,7 @@ +@@ -57,6 +_,8 @@ } public void start() { -- this.mob.setTarget(this.mob.getLastHurtByMob()); -+ this.mob.setTarget(this.mob.getLastHurtByMob(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit - reason ++ mob.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY); ++ mob.ketting$setTarget$fireEvent.set(true); + this.mob.setTarget(this.mob.getLastHurtByMob()); this.targetMob = this.mob.getTarget(); this.timestamp = this.mob.getLastHurtByMobTimestamp(); - this.unseenMemoryTicks = 300; -@@ -107,6 +_,6 @@ +@@ -107,6 +_,8 @@ } protected void alertOther(Mob p_26042_, LivingEntity p_26043_) { -- p_26042_.setTarget(p_26043_); -+ p_26042_.setTarget(p_26043_, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true); // CraftBukkit - reason ++ p_26042_.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY); ++ p_26042_.ketting$setTarget$fireEvent.set(true); + p_26042_.setTarget(p_26043_); } } diff --git a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.java.patch index 8084d06e84..8cd4bdffd5 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.java +++ b/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.java -@@ -64,7 +_,7 @@ +@@ -64,6 +_,8 @@ } public void start() { -- this.mob.setTarget(this.target); -+ this.mob.setTarget(this.target, target instanceof ServerPlayer ? org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER : org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY, true); // CraftBukkit - reason ++ mob.ketting$setTarget$reason.set(target instanceof ServerPlayer ? org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER : org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY); ++ mob.ketting$setTarget$fireEvent.set(true); + this.mob.setTarget(this.target); super.start(); } - diff --git a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.java.patch index bb25f4eff1..b58ff31993 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.java +++ b/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.java -@@ -33,7 +_,7 @@ +@@ -33,6 +_,8 @@ } public void start() { -- this.mob.setTarget(this.ownerLastHurtBy); -+ this.mob.setTarget(this.ownerLastHurtBy, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER, true); // CraftBukkit - reason ++ mob.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER); ++ mob.ketting$setTarget$fireEvent.set(true); + this.mob.setTarget(this.ownerLastHurtBy); LivingEntity livingentity = this.tameAnimal.getOwner(); if (livingentity != null) { - this.timestamp = livingentity.getLastHurtByMobTimestamp(); diff --git a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.java.patch index 48cc003e1f..3005d49fa7 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.java +++ b/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.java -@@ -33,7 +_,7 @@ +@@ -33,6 +_,8 @@ } public void start() { -- this.mob.setTarget(this.ownerLastHurt); -+ this.mob.setTarget(this.ownerLastHurt, org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET, true); // CraftBukkit - reason ++ mob.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET); ++ mob.ketting$setTarget$fireEvent.set(true); + this.mob.setTarget(this.ownerLastHurt); LivingEntity livingentity = this.tameAnimal.getOwner(); if (livingentity != null) { - this.timestamp = livingentity.getLastHurtMobTimestamp(); diff --git a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/TargetGoal.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/TargetGoal.java.patch index f0936e5204..f3025eda0a 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/goal/target/TargetGoal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/goal/target/TargetGoal.java.patch @@ -1,20 +1,20 @@ --- a/net/minecraft/world/entity/ai/goal/target/TargetGoal.java +++ b/net/minecraft/world/entity/ai/goal/target/TargetGoal.java -@@ -62,7 +_,7 @@ +@@ -62,6 +_,8 @@ } } -- this.mob.setTarget(livingentity); -+ this.mob.setTarget(livingentity, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY, true); // CraftBukkit ++ mob.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY); ++ mob.ketting$setTarget$fireEvent.set(true); + this.mob.setTarget(livingentity); return true; } - } -@@ -80,7 +_,7 @@ +@@ -80,6 +_,8 @@ } public void stop() { -- this.mob.setTarget((LivingEntity)null); -+ this.mob.setTarget((LivingEntity)null, org.bukkit.event.entity.EntityTargetEvent.TargetReason.FORGOT_TARGET, true); // CraftBukkit ++ mob.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.FORGOT_TARGET); ++ mob.ketting$setTarget$fireEvent.set(true); + this.mob.setTarget((LivingEntity)null); this.targetMob = null; } - diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch index f99df55355..ee12dfbfaf 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch @@ -82,12 +82,12 @@ Bee.this.level().levelEvent(2005, blockpos, 0); Bee.this.level().setBlockAndUpdate(blockpos, blockstate1); Bee.this.incrementNumCropsGrownSincePollination(); -@@ -934,7 +_,7 @@ +@@ -934,6 +_,8 @@ protected void alertOther(Mob p_28035_, LivingEntity p_28036_) { if (p_28035_ instanceof Bee && this.mob.hasLineOfSight(p_28036_)) { -- p_28035_.setTarget(p_28036_); -+ p_28035_.setTarget(p_28036_, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit - reason ++ p_28035_.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY); ++ p_28035_.ketting$setTarget$fireEvent.set(true); + p_28035_.setTarget(p_28036_); } - } diff --git a/patches/minecraft/net/minecraft/world/entity/animal/IronGolem.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/IronGolem.java.patch index 0e202a858c..b68eed13b2 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/IronGolem.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/IronGolem.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/animal/IronGolem.java +++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -96,7 +_,7 @@ +@@ -96,6 +_,8 @@ protected void doPush(Entity p_28839_) { if (p_28839_ instanceof Enemy && !(p_28839_ instanceof Creeper) && this.getRandom().nextInt(20) == 0) { -- this.setTarget((LivingEntity)p_28839_); -+ this.setTarget((LivingEntity)p_28839_, org.bukkit.event.entity.EntityTargetLivingEntityEvent.TargetReason.COLLISION, true); // CraftBukkit - set reason ++ this.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetLivingEntityEvent.TargetReason.COLLISION); ++ this.ketting$setTarget$fireEvent.set(true); + this.setTarget((LivingEntity)p_28839_); } - super.doPush(p_28839_); diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Panda.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Panda.java.patch index 3605299862..cd7e4462fb 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Panda.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Panda.java.patch @@ -9,12 +9,12 @@ this.onItemPickup(p_29121_); ItemStack itemstack = p_29121_.getItem(); this.setItemSlot(EquipmentSlot.MAINHAND, itemstack); -@@ -828,7 +_,7 @@ +@@ -828,6 +_,8 @@ protected void alertOther(Mob p_29295_, LivingEntity p_29296_) { if (p_29295_ instanceof Panda && p_29295_.isAggressive()) { -- p_29295_.setTarget(p_29296_); -+ p_29295_.setTarget(p_29296_, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit ++ p_29295_.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY); ++ p_29295_.ketting$setTarget$fireEvent.set(true); + p_29295_.setTarget(p_29296_); } - } diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch index 649a1b6739..4755f545b2 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch @@ -47,16 +47,16 @@ return InteractionResult.SUCCESS; } else { if (item instanceof DyeItem) { -@@ -353,7 +_,7 @@ +@@ -353,6 +_,8 @@ this.setOrderedToSit(!this.isOrderedToSit()); this.jumping = false; this.navigation.stop(); -- this.setTarget((LivingEntity)null); -+ this.setTarget((LivingEntity)null, org.bukkit.event.entity.EntityTargetEvent.TargetReason.FORGOT_TARGET, true); // CraftBukkit - reason ++ ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.FORGOT_TARGET); ++ ketting$setTarget$fireEvent.set(true); + this.setTarget((LivingEntity)null); return InteractionResult.SUCCESS; } else { - return interactionresult; -@@ -364,10 +_,11 @@ +@@ -364,10 +_,13 @@ itemstack.shrink(1); } @@ -66,7 +66,9 @@ this.tame(p_30412_); this.navigation.stop(); - this.setTarget((LivingEntity)null); -+ this.setTarget((LivingEntity) null, org.bukkit.event.entity.EntityTargetEvent.TargetReason.FORGOT_TARGET, true); // CraftBukkit - reason ++ ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.FORGOT_TARGET); ++ ketting$setTarget$fireEvent.set(true); ++ this.setTarget((LivingEntity) null); this.setOrderedToSit(true); this.level().broadcastEntityEvent(this, (byte)7); } else { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/horse/TraderLlama.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/horse/TraderLlama.java.patch index 1ab1ee62bc..30333c90b9 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/horse/TraderLlama.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/horse/TraderLlama.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/animal/horse/TraderLlama.java +++ b/net/minecraft/world/entity/animal/horse/TraderLlama.java -@@ -137,7 +_,7 @@ +@@ -137,6 +_,8 @@ } public void start() { -- this.mob.setTarget(this.ownerLastHurtBy); -+ this.mob.setTarget(this.ownerLastHurtBy, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER, true); // CraftBukkit ++ mob.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER); ++ mob.ketting$setTarget$fireEvent.set(true); + this.mob.setTarget(this.ownerLastHurtBy); Entity entity = this.llama.getLeashHolder(); if (entity instanceof WanderingTrader) { - this.timestamp = ((WanderingTrader)entity).getLastHurtByMobTimestamp(); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch index ade40fa092..be465f8e85 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch @@ -1,18 +1,16 @@ --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -110,7 +_,18 @@ +@@ -109,8 +_,16 @@ + return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 40.0D).add(Attributes.MOVEMENT_SPEED, (double)0.3F).add(Attributes.ATTACK_DAMAGE, 7.0D).add(Attributes.FOLLOW_RANGE, 64.0D); } - public void setTarget(@Nullable LivingEntity p_32537_) { -- super.setTarget(p_32537_); -+ // CraftBukkit start - fire event -+ setTarget(p_32537_, org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN, true); -+ } -+ +- public void setTarget(@Nullable LivingEntity p_32537_) { + @Override -+ public boolean setTarget(LivingEntity p_32537_, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent) { -+ if (!super.setTarget(p_32537_, reason, fireEvent)) { -+ return false; ++ public void setTarget(LivingEntity p_32537_) { + super.setTarget(p_32537_); ++ if (!ketting$setTarget$result) { ++ ketting$setTarget$result = false; ++ return; + } + p_32537_ = getTarget(); + // CraftBukkit end @@ -20,11 +18,12 @@ AttributeInstance attributeinstance = this.getAttribute(Attributes.MOVEMENT_SPEED); if (p_32537_ == null) { this.targetChangeTime = 0; -@@ -125,6 +_,7 @@ +@@ -125,6 +_,8 @@ } } -+ return true; ++ ketting$setTarget$result = true; ++ return; } protected void defineSynchedData() { diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Phantom.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Phantom.java.patch index 49affd25ef..55f0b9566a 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Phantom.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Phantom.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -226,7 +_,7 @@ +@@ -226,6 +_,8 @@ for(Player player : list) { if (Phantom.this.canAttack(player, TargetingConditions.DEFAULT)) { -- Phantom.this.setTarget(player); -+ Phantom.this.setTarget(player, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit - reason ++ Phantom.this.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER); ++ Phantom.this.ketting$setTarget$fireEvent.set(true); + Phantom.this.setTarget(player); return true; } - } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Vex.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Vex.java.patch index 7531db21d5..b6d582bda7 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Vex.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Vex.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -280,7 +_,7 @@ +@@ -280,6 +_,8 @@ } public void start() { -- Vex.this.setTarget(Vex.this.owner.getTarget()); -+ Vex.this.setTarget(Vex.this.owner.getTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET, true); // CraftBukkit ++ Vex.this.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET); ++ Vex.this.ketting$setTarget$fireEvent.set(true); + Vex.this.setTarget(Vex.this.owner.getTarget()); super.start(); } - } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch index d17afd4fb6..a70953aa33 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch @@ -82,13 +82,15 @@ for(int l = 0; l < 50; ++l) { int i1 = i + Mth.nextInt(this.random, 7, 40) * Mth.nextInt(this.random, -1, 1); -@@ -290,8 +_,10 @@ +@@ -290,8 +_,13 @@ if (NaturalSpawner.isSpawnPositionOk(spawnplacements$type, this.level(), blockpos, entitytype) && SpawnPlacements.checkSpawnRules(entitytype, serverlevel, MobSpawnType.REINFORCEMENT, blockpos, this.level().random)) { zombie.setPos((double)i1, (double)j1, (double)k1); if (!this.level().hasNearbyAlivePlayer((double)i1, (double)j1, (double)k1, 7.0D) && this.level().isUnobstructed(zombie) && this.level().noCollision(zombie) && !this.level().containsAnyLiquid(zombie.getBoundingBox())) { -- zombie.setTarget(livingentity); -+ if (livingentity != null) -+ zombie.setTarget(livingentity, org.bukkit.event.entity.EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); // CraftBukkit ++ if (livingentity != null){ ++ zombie.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET); ++ zombie.ketting$setTarget$fireEvent.set(true); + zombie.setTarget(livingentity); ++ } zombie.finalizeSpawn(serverlevel, this.level().getCurrentDifficultyAt(zombie.blockPosition()), MobSpawnType.REINFORCEMENT, (SpawnGroupData)null, (CompoundTag)null); + serverlevel.prepareAddFreshEntityWithPassengers(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); serverlevel.addFreshEntityWithPassengers(zombie); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/ZombifiedPiglin.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/ZombifiedPiglin.java.patch index f6dc6ff276..91e564d8c4 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/ZombifiedPiglin.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/ZombifiedPiglin.java.patch @@ -1,29 +1,23 @@ --- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -144,7 +_,7 @@ +@@ -144,6 +_,8 @@ }).filter((p_289463_) -> { return !p_289463_.isAlliedTo(this.getTarget()); }).forEach((p_289464_) -> { -- p_289464_.setTarget(this.getTarget()); -+ p_289464_.setTarget(this.getTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true); // CraftBukkit ++ p_289464_.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY); ++ p_289464_.ketting$setTarget$fireEvent.set(true); + p_289464_.setTarget(this.getTarget()); }); } - -@@ -152,7 +_,7 @@ +@@ -152,6 +_,7 @@ this.playSound(SoundEvents.ZOMBIFIED_PIGLIN_ANGRY, this.getSoundVolume() * 2.0F, this.getVoicePitch() * 1.8F); } -- public void setTarget(@Nullable LivingEntity p_34478_) { -+ public boolean setTarget(@Nullable LivingEntity p_34478_, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent) { // CraftBukkit - signature ++ @Override + public void setTarget(@Nullable LivingEntity p_34478_) { if (this.getTarget() == null && p_34478_ != null) { this.playFirstAngerSoundIn = FIRST_ANGER_SOUND_DELAY.sample(this.random); - this.ticksUntilNextAlert = ALERT_INTERVAL.sample(this.random); -@@ -162,11 +_,20 @@ - this.setLastHurtByPlayer((Player)p_34478_); - } - -- super.setTarget(p_34478_); -+ return super.setTarget(p_34478_, reason, fireEvent); // CraftBukkit +@@ -166,7 +_,16 @@ } public void startPersistentAngerTimer() { diff --git a/patches/minecraft/net/minecraft/world/entity/raid/Raider.java.patch b/patches/minecraft/net/minecraft/world/entity/raid/Raider.java.patch index d1dc275ae7..a82a8c39a4 100644 --- a/patches/minecraft/net/minecraft/world/entity/raid/Raider.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/raid/Raider.java.patch @@ -8,21 +8,23 @@ player.addEffect(mobeffectinstance); } } -@@ -296,7 +_,7 @@ +@@ -296,6 +_,8 @@ this.mob.getNavigation().stop(); for(Raider raider : this.mob.level().getNearbyEntities(Raider.class, this.shoutTargeting, this.mob, this.mob.getBoundingBox().inflate(8.0D, 8.0D, 8.0D))) { -- raider.setTarget(this.mob.getTarget()); -+ raider.setTarget(this.mob.getTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.FOLLOW_LEADER, true); // CraftBukkit ++ raider.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.FOLLOW_LEADER); ++ raider.ketting$setTarget$fireEvent.set(true); + raider.setTarget(this.mob.getTarget()); } - } -@@ -306,7 +_,7 @@ +@@ -306,7 +_,9 @@ LivingEntity livingentity = this.mob.getTarget(); if (livingentity != null) { for(Raider raider : this.mob.level().getNearbyEntities(Raider.class, this.shoutTargeting, this.mob, this.mob.getBoundingBox().inflate(8.0D, 8.0D, 8.0D))) { - raider.setTarget(livingentity); -+ raider.setTarget(this.mob.getTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.FOLLOW_LEADER, true); // CraftBukkit ++ raider.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.FOLLOW_LEADER); ++ raider.ketting$setTarget$fireEvent.set(true); ++ raider.setTarget(this.mob.getTarget()); raider.setAggressive(true); } diff --git a/patches/minecraft/net/minecraft/world/level/Level.java.patch b/patches/minecraft/net/minecraft/world/level/Level.java.patch index c996fc4f93..9dedc9159b 100644 --- a/patches/minecraft/net/minecraft/world/level/Level.java.patch +++ b/patches/minecraft/net/minecraft/world/level/Level.java.patch @@ -180,11 +180,10 @@ if (this.isOutsideBuildHeight(p_46605_)) { return false; } else if (!this.isClientSide && this.isDebug()) { -@@ -198,17 +_,83 @@ +@@ -198,17 +_,78 @@ } else { LevelChunk levelchunk = this.getChunkAt(p_46605_); Block block = p_46606_.getBlock(); -- BlockState blockstate = levelchunk.setBlockState(p_46605_, p_46606_, (p_46607_ & 64) != 0); + + p_46605_ = p_46605_.immutable(); // Forge - prevent mutable BlockPos leaks + net.minecraftforge.common.util.BlockSnapshot blockSnapshot = null; @@ -208,13 +207,8 @@ + + // CraftBukkit custom NO_PLACE flag + //Ketting reverse delegation because of mixins -+ BlockState blockstate; -+ try{ -+ levelchunk.prepareSetBlockState((p_46607_ & 1024) == 0); -+ blockstate= levelchunk.setBlockState(p_46605_, p_46606_, (p_46607_ & 64) != 0); -+ }finally { -+ levelchunk.resetSetBlockState(); -+ } ++ levelchunk.ketting$setBlockState$doPlace.set((p_46607_ & 1024) == 0); + BlockState blockstate = levelchunk.setBlockState(p_46605_, p_46606_, (p_46607_ & 64) != 0); if (blockstate == null) { + if (blockSnapshot != null) this.capturedBlockSnapshots.remove(blockSnapshot); + // CraftBukkit start - remove blockstate if failed (or the same) @@ -431,18 +425,23 @@ explosion.explode(); explosion.finalizeExplosion(p_256377_); return explosion; -@@ -494,7 +_,18 @@ +@@ -493,8 +_,22 @@ + public abstract String gatherChunkSourceStats(); - @Nullable -+ @Override - public BlockEntity getBlockEntity(BlockPos p_46716_) { -+ // CraftBukkit start -+ return this.getBlockEntity(p_46716_, true); -+ } +- @Nullable ++ ++ //public java.util.concurrent.atomic.AtomicBoolean ketting$getBlockEntity$validate = new java.util.concurrent.atomic.AtomicBoolean(true); + + @Nullable + public BlockEntity getBlockEntity(BlockPos p_46716_, boolean validate) { ++ // ketting$getBlockEntity$validate.set(validate); //Ketting - CB also doesn't do anything with this. ++ return getBlockEntity(p_46716_); ++ } ++ ++ @Nullable ++ @Override + public BlockEntity getBlockEntity(BlockPos p_46716_) { + if (capturedTileEntities.containsKey(p_46716_)) { + return capturedTileEntities.get(p_46716_); + } diff --git a/patches/minecraft/net/minecraft/world/level/LevelAccessor.java.patch b/patches/minecraft/net/minecraft/world/level/LevelAccessor.java.patch index 4f23afcfa7..3fe07ae956 100644 --- a/patches/minecraft/net/minecraft/world/level/LevelAccessor.java.patch +++ b/patches/minecraft/net/minecraft/world/level/LevelAccessor.java.patch @@ -1,19 +1,5 @@ --- a/net/minecraft/world/level/LevelAccessor.java +++ b/net/minecraft/world/level/LevelAccessor.java -@@ -33,11 +_,11 @@ - - LevelTickAccess getBlockTicks(); - -- private ScheduledTick createTick(BlockPos p_186483_, T p_186484_, int p_186485_, TickPriority p_186486_) { -+ default ScheduledTick createTick(BlockPos p_186483_, T p_186484_, int p_186485_, TickPriority p_186486_) { - return new ScheduledTick<>(p_186484_, p_186483_, this.getLevelData().getGameTime() + (long)p_186485_, p_186486_, this.nextSubTickCount()); - } - -- private ScheduledTick createTick(BlockPos p_186479_, T p_186480_, int p_186481_) { -+ default ScheduledTick createTick(BlockPos p_186479_, T p_186480_, int p_186481_) { - return new ScheduledTick<>(p_186480_, p_186479_, this.getLevelData().getGameTime() + (long)p_186481_, this.nextSubTickCount()); - } - @@ -112,4 +_,6 @@ default void gameEvent(GameEvent p_220408_, BlockPos p_220409_, GameEvent.Context p_220410_) { this.gameEvent(p_220408_, Vec3.atCenterOf(p_220409_), p_220410_); diff --git a/patches/minecraft/net/minecraft/world/level/block/BasePressurePlateBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/BasePressurePlateBlock.java.patch index 570b9fed38..b4b2dfe3aa 100644 --- a/patches/minecraft/net/minecraft/world/level/block/BasePressurePlateBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/BasePressurePlateBlock.java.patch @@ -19,22 +19,21 @@ if (p_152148_ != i) { BlockState blockstate = this.setSignalForState(p_152147_, i); p_152145_.setBlock(p_152146_, blockstate, 2); -@@ -124,9 +_,15 @@ +@@ -124,9 +_,16 @@ } protected static int getEntityCount(Level p_289656_, AABB p_289647_, Class p_289686_) { -- return p_289656_.getEntitiesOfClass(p_289686_, p_289647_, EntitySelector.NO_SPECTATORS.and((p_289691_) -> { -- return !p_289691_.isIgnoringBlockTriggers(); -- })).size(); + // CraftBukkit start + return getEntities(p_289656_, p_289647_, p_289686_).size(); + } + -+ protected static java.util.List getEntities(Level world, AABB axisalignedbb, Class oclass) { ++ protected static java.util.List getEntities(Level p_289656_, AABB p_289647_, Class p_289686_) { + // CraftBukkit end -+ return world.getEntitiesOfClass(oclass, axisalignedbb, EntitySelector.NO_SPECTATORS.and((entity) -> { -+ return !entity.isIgnoringBlockTriggers(); -+ })); // CraftBukkit + return p_289656_.getEntitiesOfClass(p_289686_, p_289647_, EntitySelector.NO_SPECTATORS.and((p_289691_) -> { + return !p_289691_.isIgnoringBlockTriggers(); +- })).size(); ++ })); ++ // CraftBukkit } protected abstract int getSignalStrength(Level p_49336_, BlockPos p_49337_); diff --git a/patches/minecraft/net/minecraft/world/level/block/BeehiveBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/BeehiveBlock.java.patch index aecf6d26ff..c1540265a3 100644 --- a/patches/minecraft/net/minecraft/world/level/block/BeehiveBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/BeehiveBlock.java.patch @@ -10,7 +10,7 @@ public void playerDestroy(Level p_49584_, Player p_49585_, BlockPos p_49586_, BlockState p_49587_, @Nullable BlockEntity p_49588_, ItemStack p_49589_) { super.playerDestroy(p_49584_, p_49585_, p_49586_, p_49587_, p_49588_, p_49589_); -@@ -89,11 +_,12 @@ +@@ -89,10 +_,13 @@ List list = p_49650_.getEntitiesOfClass(Bee.class, (new AABB(p_49651_)).inflate(8.0D, 6.0D, 8.0D)); if (!list.isEmpty()) { List list1 = p_49650_.getEntitiesOfClass(Player.class, (new AABB(p_49651_)).inflate(8.0D, 6.0D, 8.0D)); @@ -19,11 +19,11 @@ for(Bee bee : list) { if (bee.getTarget() == null) { -- bee.setTarget(list1.get(p_49650_.random.nextInt(i))); -+ bee.setTarget(list1.get(p_49650_.random.nextInt(i)), org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit ++ bee.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER); ++ bee.ketting$setTarget$fireEvent.set(true); + bee.setTarget(list1.get(p_49650_.random.nextInt(i))); } } - } @@ -110,7 +_,7 @@ boolean flag = false; if (i >= 5) { diff --git a/patches/minecraft/net/minecraft/world/level/block/BigDripleafBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/BigDripleafBlock.java.patch index ef37bcea19..dd28c39d6e 100644 --- a/patches/minecraft/net/minecraft/world/level/block/BigDripleafBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/BigDripleafBlock.java.patch @@ -43,38 +43,50 @@ } else if (tilt == Tilt.FULL) { resetTilt(p_220798_, p_220799_, p_220800_); } -@@ -190,8 +_,10 @@ +@@ -190,8 +_,19 @@ return p_152303_.onGround() && p_152303_.position().y > (double)((float)p_152302_.getY() + 0.6875F); } -- private void setTiltAndScheduleTick(BlockState p_152283_, Level p_152284_, BlockPos p_152285_, Tilt p_152286_, @Nullable SoundEvent p_152287_) { -- setTilt(p_152283_, p_152284_, p_152285_, p_152286_); ++ // Ketting start ++ private final java.util.concurrent.atomic.AtomicReference ketting$setTiltAndScheduleTick$entity = new java.util.concurrent.atomic.AtomicReference<>(null); + // CraftBukkit start + private void setTiltAndScheduleTick(BlockState p_152283_, Level p_152284_, BlockPos p_152285_, Tilt p_152286_, @Nullable SoundEvent p_152287_, @Nullable Entity entity) { -+ if (setTilt(p_152283_, p_152284_, p_152285_, p_152286_, entity)) return; ++ ketting$setTiltAndScheduleTick$entity.set(entity); ++ setTiltAndScheduleTick(p_152283_, p_152284_, p_152285_, p_152286_, p_152287_); ++ } + private void setTiltAndScheduleTick(BlockState p_152283_, Level p_152284_, BlockPos p_152285_, Tilt p_152286_, @Nullable SoundEvent p_152287_) { ++ ketting$setTilt$entity.set(ketting$setTiltAndScheduleTick$entity.getAndSet(null)); //Ketting + setTilt(p_152283_, p_152284_, p_152285_, p_152286_); ++ if (ketting$setTilt$returnValue) return; //Ketting - CraftBukkit + // CraftBukkit end ++ // Ketting end if (p_152287_ != null) { playTiltSound(p_152284_, p_152285_, p_152287_); } -@@ -204,20 +_,28 @@ +@@ -204,6 +_,7 @@ } private static void resetTilt(BlockState p_152314_, Level p_152315_, BlockPos p_152316_) { -- setTilt(p_152314_, p_152315_, p_152316_, Tilt.NONE); -+ setTilt(p_152314_, p_152315_, p_152316_, Tilt.NONE, null); // CraftBukkit ++ ketting$setTilt$entity.set(null);// CraftBukkit + setTilt(p_152314_, p_152315_, p_152316_, Tilt.NONE); if (p_152314_.getValue(TILT) != Tilt.NONE) { playTiltSound(p_152315_, p_152316_, SoundEvents.BIG_DRIPLEAF_TILT_UP); - } +@@ -211,13 +_,28 @@ } -- private static void setTilt(BlockState p_152278_, Level p_152279_, BlockPos p_152280_, Tilt p_152281_) { + // CraftBukkit start ++ private static final java.util.concurrent.atomic.AtomicReference ketting$setTilt$entity = new java.util.concurrent.atomic.AtomicReference<>(null); ++ private static boolean ketting$setTilt$returnValue = true; + private static boolean setTilt(BlockState p_152278_, Level p_152279_, BlockPos p_152280_, Tilt p_152281_, @Nullable Entity entity) { -+ if (entity != null) { -+ if (!org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntityChangeBlockEvent(entity, p_152280_, p_152278_.setValue(BigDripleafBlock.TILT, p_152281_))) { -+ return false; -+ } ++ ketting$setTilt$entity.set(entity); ++ setTilt(p_152278_, p_152279_, p_152280_, p_152281_); ++ return ketting$setTilt$returnValue; ++ } + private static void setTilt(BlockState p_152278_, Level p_152279_, BlockPos p_152280_, Tilt p_152281_) { ++ if (!org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntityChangeBlockEvent(ketting$setTilt$entity.getAndSet(null), p_152280_, p_152278_.setValue(BigDripleafBlock.TILT, p_152281_))) { ++ ketting$setTilt$returnValue = false; ++ return; + } + // CraftBukkit end Tilt tilt = p_152278_.getValue(TILT); @@ -83,7 +95,8 @@ p_152279_.gameEvent((Entity)null, GameEvent.BLOCK_CHANGE, p_152280_); } -+ return true; // CraftBukkit ++ ketting$setTilt$returnValue = true; // CraftBukkit ++ return; } public VoxelShape getCollisionShape(BlockState p_152307_, BlockGetter p_152308_, BlockPos p_152309_, CollisionContext p_152310_) { diff --git a/patches/minecraft/net/minecraft/world/level/block/Block.java.patch b/patches/minecraft/net/minecraft/world/level/block/Block.java.patch index 5d7538a2e5..8c3ef53029 100644 --- a/patches/minecraft/net/minecraft/world/level/block/Block.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/Block.java.patch @@ -32,19 +32,22 @@ } else if (blockstate.canOcclude()) { Block.BlockStatePairKey block$blockstatepairkey = new Block.BlockStatePairKey(p_152445_, blockstate, p_152448_); Object2ByteLinkedOpenHashMap object2bytelinkedopenhashmap = OCCLUSION_CACHE.get(); -@@ -276,11 +_,14 @@ +@@ -275,12 +_,17 @@ + } - public static void dropResources(BlockState p_49882_, Level p_49883_, BlockPos p_49884_, @Nullable BlockEntity p_49885_, @Nullable Entity p_49886_, ItemStack p_49887_) { -+ dropResources(p_49882_, p_49883_, p_49884_, p_49885_, p_49886_, p_49887_, true); -+ } ++ private static final java.util.concurrent.atomic.AtomicBoolean ketting$dropResources$dropXp = new java.util.concurrent.atomic.AtomicBoolean(true); + public static void dropResources(BlockState p_49882_, Level p_49883_, BlockPos p_49884_, @Nullable BlockEntity p_49885_, @Nullable Entity p_49886_, ItemStack p_49887_, boolean dropXp) { ++ ketting$dropResources$dropXp.set(dropXp); ++ dropResources(p_49882_, p_49883_, p_49884_, p_49885_, p_49886_, p_49887_); ++ } + public static void dropResources(BlockState p_49882_, Level p_49883_, BlockPos p_49884_, @Nullable BlockEntity p_49885_, @Nullable Entity p_49886_, ItemStack p_49887_) { if (p_49883_ instanceof ServerLevel) { getDrops(p_49882_, (ServerLevel)p_49883_, p_49884_, p_49885_, p_49886_, p_49887_).forEach((p_49944_) -> { popResource(p_49883_, p_49884_, p_49944_); }); - p_49882_.spawnAfterBreak((ServerLevel)p_49883_, p_49884_, p_49887_, true); -+ p_49882_.spawnAfterBreak((ServerLevel)p_49883_, p_49884_, p_49887_, dropXp); ++ p_49882_.spawnAfterBreak((ServerLevel)p_49883_, p_49884_, p_49887_, ketting$dropResources$dropXp.getAndSet(true)); } } @@ -127,7 +130,7 @@ } public boolean hasDynamicShape() { -@@ -473,6 +_,74 @@ +@@ -473,21 +_,112 @@ return this.stateDefinition.getPossibleStates().stream().collect(ImmutableMap.toImmutableMap(Function.identity(), p_152459_)); } @@ -202,25 +205,25 @@ /** @deprecated */ @Deprecated public Holder.Reference builtInRegistryHolder() { -@@ -480,14 +_,37 @@ + return this.builtInRegistryHolder; } - protected void tryDropExperience(ServerLevel p_220823_, BlockPos p_220824_, ItemStack p_220825_, IntProvider p_220826_) { -+ tryDropExperienceInt(p_220823_, p_220824_, p_220825_, p_220826_); -+ } ++ public int ketting$tryDropExperience$result = 0; //Ketting + // CraftBukkit start -+ protected int tryDropExperienceInt(ServerLevel p_220823_, BlockPos p_220824_, ItemStack p_220825_, IntProvider p_220826_) { + protected void tryDropExperience(ServerLevel p_220823_, BlockPos p_220824_, ItemStack p_220825_, IntProvider p_220826_) { if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, p_220825_) == 0) { int i = p_220826_.sample(p_220823_.random); if (i > 0) { - this.popExperience(p_220823_, p_220824_, i); + // this.popExperience(p_220823_, p_220824_, i); -+ return i; ++ ketting$tryDropExperience$result = i; ++ return; } } - } -+ return 0; ++ ketting$tryDropExperience$result = 0; ++ return; + } + + public int getExpDrop(BlockState blockstate, ServerLevel serverlevel, BlockPos blockpos, ItemStack itemstack, boolean flag) { diff --git a/patches/minecraft/net/minecraft/world/level/block/ComposterBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/ComposterBlock.java.patch index 42983502fc..d6214aa05f 100644 --- a/patches/minecraft/net/minecraft/world/level/block/ComposterBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/ComposterBlock.java.patch @@ -31,20 +31,22 @@ if (!p_52000_.isClientSide) { Vec3 vec3 = Vec3.atLowerCornerWithOffset(p_52001_, 0.5D, 1.01D, 0.5D).offsetRandom(p_52000_.random, 0.7F); ItemEntity itementity = new ItemEntity(p_52000_, vec3.x(), vec3.y(), vec3.z(), new ItemStack(Items.BONE_MEAL)); -@@ -265,9 +_,15 @@ +@@ -264,10 +_,17 @@ + return blockstate; } - static BlockState addItem(@Nullable Entity p_270464_, BlockState p_270603_, LevelAccessor p_270151_, BlockPos p_270547_, ItemStack p_270354_) { -+ // CraftBukkit start -+ return addItem(p_270464_, p_270603_, p_270151_, p_270547_, p_270354_, p_270151_.getRandom().nextDouble()); -+ } -+ ++ //Ketting - start ++ private static final java.util.concurrent.atomic.AtomicReference ketting$addItem$rand = new java.util.concurrent.atomic.AtomicReference<>(null); + static BlockState addItem(@Nullable Entity p_270464_, BlockState p_270603_, LevelAccessor p_270151_, BlockPos p_270547_, ItemStack p_270354_, double rand) { -+ // CraftBukkit end ++ ketting$addItem$rand.set(rand); ++ return addItem(p_270464_, p_270603_, p_270151_, p_270547_, p_270354_); ++ } ++ //Ketting end + static BlockState addItem(@Nullable Entity p_270464_, BlockState p_270603_, LevelAccessor p_270151_, BlockPos p_270547_, ItemStack p_270354_) { int i = p_270603_.getValue(LEVEL); float f = COMPOSTABLES.getFloat(p_270354_.getItem()); - if ((i != 0 || !(f > 0.0F)) && !(p_270151_.getRandom().nextDouble() < (double)f)) { -+ if ((i != 0 || !(f > 0.0F)) && rand >= (double) f) { ++ if ((i != 0 || !(f > 0.0F)) && java.util.Objects.requireNonNullElse(ketting$addItem$rand.get(), p_270151_.getRandom().nextDouble()) >= (double) f) { //Ketting return p_270603_; } else { int j = i + 1; diff --git a/patches/minecraft/net/minecraft/world/level/block/DispenserBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/DispenserBlock.java.patch index c2356533f1..8a9f248b47 100644 --- a/patches/minecraft/net/minecraft/world/level/block/DispenserBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/DispenserBlock.java.patch @@ -1,11 +1,6 @@ --- a/net/minecraft/world/level/block/DispenserBlock.java +++ b/net/minecraft/world/level/block/DispenserBlock.java -@@ -40,10 +_,11 @@ - public class DispenserBlock extends BaseEntityBlock { - public static final DirectionProperty FACING = DirectionalBlock.FACING; - public static final BooleanProperty TRIGGERED = BlockStateProperties.TRIGGERED; -- private static final Map DISPENSER_REGISTRY = Util.make(new Object2ObjectOpenHashMap<>(), (p_52723_) -> { -+ public static final Map DISPENSER_REGISTRY = Util.make(new Object2ObjectOpenHashMap<>(), (p_52723_) -> { +@@ -44,6 +_,7 @@ p_52723_.defaultReturnValue(new DefaultDispenseItemBehavior()); }); private static final int TRIGGER_DURATION = 4; diff --git a/patches/minecraft/net/minecraft/world/level/block/DropExperienceBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/DropExperienceBlock.java.patch index b10018fd3c..86d94d4efa 100644 --- a/patches/minecraft/net/minecraft/world/level/block/DropExperienceBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/DropExperienceBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/DropExperienceBlock.java +++ b/net/minecraft/world/level/block/DropExperienceBlock.java -@@ -22,9 +_,21 @@ +@@ -22,9 +_,22 @@ public void spawnAfterBreak(BlockState p_221086_, ServerLevel p_221087_, BlockPos p_221088_, ItemStack p_221089_, boolean p_221090_) { super.spawnAfterBreak(p_221086_, p_221087_, p_221088_, p_221089_, p_221090_); @@ -12,7 +12,8 @@ + @Override + public int getExpDrop(BlockState iblockdata, ServerLevel worldserver, BlockPos blockposition, ItemStack itemstack, boolean flag) { + if (flag) { -+ return this.tryDropExperienceInt(worldserver, blockposition, itemstack, this.xpRange); ++ this.tryDropExperience(worldserver, blockposition, itemstack, this.xpRange); ++ return ketting$tryDropExperience$result; } + return 0; diff --git a/patches/minecraft/net/minecraft/world/level/block/LayeredCauldronBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/LayeredCauldronBlock.java.patch index 181f897887..ab702718f9 100644 --- a/patches/minecraft/net/minecraft/world/level/block/LayeredCauldronBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/LayeredCauldronBlock.java.patch @@ -17,22 +17,29 @@ } } -@@ -64,17 +_,39 @@ +@@ -63,18 +_,46 @@ + lowerFillLevel(p_153556_, p_153557_, p_153558_); } - public static void lowerFillLevel(BlockState p_153560_, Level p_153561_, BlockPos p_153562_) { ++ private static final java.util.concurrent.atomic.AtomicReference ketting$lowerFillLevel$reason = new java.util.concurrent.atomic.AtomicReference<>(null); ++ private static final java.util.concurrent.atomic.AtomicReference ketting$lowerFillLevel$entity = new java.util.concurrent.atomic.AtomicReference<>(null); ++ private static boolean ketting$lowerFillLevel$result = false; ++ public static boolean lowerFillLevel(BlockState p_153560_, Level p_153561_, BlockPos p_153562_, Entity entity, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason reason) { ++ ketting$lowerFillLevel$reason.set(reason); ++ ketting$lowerFillLevel$entity.set(entity); + // CraftBukkit start -+ lowerFillLevel(p_153560_, p_153561_, p_153562_, null, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.UNKNOWN); ++ lowerFillLevel(p_153560_, p_153561_, p_153562_); ++ return ketting$lowerFillLevel$result; + } + -+ public static boolean lowerFillLevel(BlockState p_153560_, Level p_153561_, BlockPos p_153562_, Entity entity, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason reason) { + public static void lowerFillLevel(BlockState p_153560_, Level p_153561_, BlockPos p_153562_) { int i = p_153560_.getValue(LEVEL) - 1; - BlockState blockstate = i == 0 ? Blocks.CAULDRON.defaultBlockState() : p_153560_.setValue(LEVEL, Integer.valueOf(i)); - p_153561_.setBlockAndUpdate(p_153562_, blockstate); - p_153561_.gameEvent(GameEvent.BLOCK_CHANGE, p_153562_, GameEvent.Context.of(blockstate)); - } + BlockState blockstate = i == 0 ? Blocks.CAULDRON.defaultBlockState() : p_153560_.setValue(LEVEL, i); -+ return changeLevel(p_153560_, p_153561_, p_153562_, blockstate, entity, reason); ++ ketting$lowerFillLevel$result = changeLevel(p_153560_, p_153561_, p_153562_, blockstate, ketting$lowerFillLevel$entity.getAndSet(null), ketting$lowerFillLevel$reason.getAndSet(org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.UNKNOWN)); + } + + // CraftBukkit start @@ -42,7 +49,7 @@ + + org.bukkit.event.block.CauldronLevelChangeEvent event = new org.bukkit.event.block.CauldronLevelChangeEvent( + world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), -+ (entity == null) ? null : entity.getBukkitEntity(), reason, newState ++ (entity == null) ? null : entity.getBukkitEntity(), (reason == null) ? org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.UNKNOWN : reason, newState + ); + world.getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { diff --git a/patches/minecraft/net/minecraft/world/level/block/LecternBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/LecternBlock.java.patch index 05efddc50f..4167f1e562 100644 --- a/patches/minecraft/net/minecraft/world/level/block/LecternBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/LecternBlock.java.patch @@ -1,11 +1,12 @@ --- a/net/minecraft/world/level/block/LecternBlock.java +++ b/net/minecraft/world/level/block/LecternBlock.java -@@ -181,10 +_,11 @@ +@@ -181,10 +_,13 @@ } private void popBook(BlockState p_54588_, Level p_54589_, BlockPos p_54590_) { -- BlockEntity blockentity = p_54589_.getBlockEntity(p_54590_); -+ BlockEntity blockentity = p_54589_.getBlockEntity(p_54590_, false); // CraftBukkit - don't validate, type may be changed already ++ // CraftBukkit - don't validate, type may be changed already ++ //Ketting - even in CB, this doesn't change the behaviour. (removed false from call) + BlockEntity blockentity = p_54589_.getBlockEntity(p_54590_); if (blockentity instanceof LecternBlockEntity lecternblockentity) { Direction direction = p_54588_.getValue(FACING); ItemStack itemstack = lecternblockentity.getBook().copy(); diff --git a/patches/minecraft/net/minecraft/world/level/block/MultifaceSpreader.java.patch b/patches/minecraft/net/minecraft/world/level/block/MultifaceSpreader.java.patch index bc85b8d454..12f0eae166 100644 --- a/patches/minecraft/net/minecraft/world/level/block/MultifaceSpreader.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/MultifaceSpreader.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/MultifaceSpreader.java +++ b/net/minecraft/world/level/block/MultifaceSpreader.java -@@ -136,14 +_,15 @@ +@@ -136,14 +_,16 @@ p_221702_.getChunk(p_221703_.pos()).markPosForPostprocessing(p_221703_.pos()); } @@ -14,6 +14,7 @@ } - public static record SpreadPos(BlockPos pos, Direction face) { ++ //Ketting - Todo: How do we fix this? Let's wait for an error to come around. + public static record SpreadPos(BlockPos pos, Direction face, BlockPos source) { // CraftBukkit } diff --git a/patches/minecraft/net/minecraft/world/level/block/PointedDripstoneBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/PointedDripstoneBlock.java.patch index 57d62f505b..45d0082fc1 100644 --- a/patches/minecraft/net/minecraft/world/level/block/PointedDripstoneBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/PointedDripstoneBlock.java.patch @@ -22,32 +22,39 @@ } else { super.fallOn(p_154047_, p_154048_, p_154049_, p_154050_, p_154051_); } -@@ -339,14 +_,14 @@ +@@ -339,14 +_,24 @@ if (isUnmergedTipWithDirection(blockstate, p_154038_.getOpposite())) { createMergedTips(blockstate, p_154036_, blockpos); } else if (blockstate.isAir() || blockstate.is(Blocks.WATER)) { -- createDripstone(p_154036_, blockpos, p_154038_, DripstoneThickness.TIP); -+ createDripstone(p_154036_, blockpos, p_154038_, DripstoneThickness.TIP, p_154037_); // CraftBukkit ++ ketting$createDripstone$source.set(p_154037_); //Ketting - CraftBukkit + createDripstone(p_154036_, blockpos, p_154038_, DripstoneThickness.TIP); } } -- private static void createDripstone(LevelAccessor p_154088_, BlockPos p_154089_, Direction p_154090_, DripstoneThickness p_154091_) { ++ //Ketting start ++ private final static java.util.concurrent.atomic.AtomicReference ketting$createDripstone$source = new java.util.concurrent.atomic.AtomicReference<>(null); ++ @SuppressWarnings("unused") //Ketting - Keep for CB compat + private static void createDripstone(LevelAccessor p_154088_, BlockPos p_154089_, Direction p_154090_, DripstoneThickness p_154091_, BlockPos source) { // CraftBukkit ++ ketting$createDripstone$source.set(source); ++ createDripstone(p_154088_, p_154089_, p_154090_, p_154091_); ++ } ++ //Ketting end + private static void createDripstone(LevelAccessor p_154088_, BlockPos p_154089_, Direction p_154090_, DripstoneThickness p_154091_) { BlockState blockstate = Blocks.POINTED_DRIPSTONE.defaultBlockState().setValue(TIP_DIRECTION, p_154090_).setValue(THICKNESS, p_154091_).setValue(WATERLOGGED, Boolean.valueOf(p_154088_.getFluidState(p_154089_).getType() == Fluids.WATER)); - p_154088_.setBlock(p_154089_, blockstate, 3); -+ org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.handleBlockSpreadEvent(p_154088_, source, p_154089_, blockstate, 3); // CraftBukkit ++ BlockPos source = ketting$createDripstone$source.getAndSet(null); //Ketting ++ if (source != null) org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.handleBlockSpreadEvent(p_154088_, source, p_154089_, blockstate, 3); // CraftBukkit } private static void createMergedTips(BlockState p_154231_, LevelAccessor p_154232_, BlockPos p_154233_) { -@@ -360,8 +_,8 @@ +@@ -360,7 +_,9 @@ blockpos1 = p_154233_.below(); } -- createDripstone(p_154232_, blockpos, Direction.DOWN, DripstoneThickness.TIP_MERGE); -- createDripstone(p_154232_, blockpos1, Direction.UP, DripstoneThickness.TIP_MERGE); -+ createDripstone(p_154232_, blockpos, Direction.DOWN, DripstoneThickness.TIP_MERGE, p_154233_); -+ createDripstone(p_154232_, blockpos1, Direction.UP, DripstoneThickness.TIP_MERGE, p_154233_); ++ ketting$createDripstone$source.set(p_154233_); + createDripstone(p_154232_, blockpos, Direction.DOWN, DripstoneThickness.TIP_MERGE); ++ ketting$createDripstone$source.set(p_154233_); + createDripstone(p_154232_, blockpos1, Direction.UP, DripstoneThickness.TIP_MERGE); } - public static void spawnDripParticle(Level p_154063_, BlockPos p_154064_, BlockState p_154065_) { diff --git a/patches/minecraft/net/minecraft/world/level/block/RedStoneOreBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/RedStoneOreBlock.java.patch index 48a324c279..a99f2c4f58 100644 --- a/patches/minecraft/net/minecraft/world/level/block/RedStoneOreBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/RedStoneOreBlock.java.patch @@ -1,18 +1,20 @@ --- a/net/minecraft/world/level/block/RedStoneOreBlock.java +++ b/net/minecraft/world/level/block/RedStoneOreBlock.java -@@ -30,13 +_,27 @@ +@@ -30,13 +_,31 @@ } public void attack(BlockState p_55467_, Level p_55468_, BlockPos p_55469_, Player p_55470_) { -- interact(p_55467_, p_55468_, p_55469_); -+ interact(p_55467_, p_55468_, p_55469_, p_55470_); // CraftBukkit - add player ++ interact$entity = p_55470_; // CraftBukkit - add player + interact(p_55467_, p_55468_, p_55469_); ++ interact$entity = null; //Ketting super.attack(p_55467_, p_55468_, p_55469_, p_55470_); } public void stepOn(Level p_154299_, BlockPos p_154300_, BlockState p_154301_, Entity p_154302_) { if (!p_154302_.isSteppingCarefully()) { -- interact(p_154301_, p_154299_, p_154300_); -+ interact(p_154301_, p_154299_, p_154300_, p_154302_); ++ interact$entity = p_154302_; // CraftBukkit - add player + interact(p_154301_, p_154299_, p_154300_); ++ interact$entity = null; //Ketting + // CraftBukkit start + if (p_154302_ instanceof Player) { + org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callPlayerInteractEvent((Player) p_154302_, org.bukkit.event.block.Action.PHYSICAL, p_154300_, null, null, null); @@ -30,12 +32,16 @@ } super.stepOn(p_154299_, p_154300_, p_154301_, p_154302_); -@@ -46,16 +_,30 @@ +@@ -46,16 +_,34 @@ if (p_55473_.isClientSide) { spawnParticles(p_55473_, p_55474_); } else { - interact(p_55472_, p_55473_, p_55474_); -+ interact(p_55472_, p_55473_, p_55474_, p_55475_); // CraftBukkit - add player ++ interact$entity = p_55475_; ++ // CraftBukkit - add player ++ interact(p_55472_, p_55473_, p_55474_); ++ interact$entity = null; //Ketting ++ } ItemStack itemstack = p_55475_.getItemInHand(p_55476_); diff --git a/patches/minecraft/net/minecraft/world/level/block/SculkCatalystBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/SculkCatalystBlock.java.patch index 3f6a45c53b..22d683764d 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SculkCatalystBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SculkCatalystBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/SculkCatalystBlock.java +++ b/net/minecraft/world/level/block/SculkCatalystBlock.java -@@ -54,9 +_,21 @@ +@@ -54,9 +_,22 @@ public void spawnAfterBreak(BlockState p_222109_, ServerLevel p_222110_, BlockPos p_222111_, ItemStack p_222112_, boolean p_222113_) { super.spawnAfterBreak(p_222109_, p_222110_, p_222111_, p_222112_, p_222113_); @@ -12,7 +12,8 @@ + @Override + public int getExpDrop(BlockState iblockdata, ServerLevel worldserver, BlockPos blockposition, ItemStack itemstack, boolean flag) { + if (flag) { -+ return this.tryDropExperienceInt(worldserver, blockposition, itemstack, this.xpRange); ++ this.tryDropExperience(worldserver, blockposition, itemstack, this.xpRange); ++ return ketting$tryDropExperience$result; } + return 0; diff --git a/patches/minecraft/net/minecraft/world/level/block/SculkSensorBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/SculkSensorBlock.java.patch index 50ff2552eb..fdda93d15f 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SculkSensorBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SculkSensorBlock.java.patch @@ -51,7 +51,7 @@ p_277340_.setBlock(p_277386_, p_277799_.setValue(PHASE, SculkSensorPhase.ACTIVE).setValue(POWER, Integer.valueOf(p_277993_)), 3); p_277340_.scheduleTick(p_277386_, p_277799_.getBlock(), this.getActiveTicks()); updateNeighbours(p_277340_, p_277386_, p_277799_); -@@ -252,9 +_,21 @@ +@@ -252,9 +_,22 @@ public void spawnAfterBreak(BlockState p_222142_, ServerLevel p_222143_, BlockPos p_222144_, ItemStack p_222145_, boolean p_222146_) { super.spawnAfterBreak(p_222142_, p_222143_, p_222144_, p_222145_, p_222146_); @@ -63,7 +63,8 @@ + @Override + public int getExpDrop(BlockState iblockdata, ServerLevel worldserver, BlockPos blockposition, ItemStack itemstack, boolean flag) { + if (flag) { -+ return this.tryDropExperienceInt(worldserver, blockposition, itemstack, ConstantInt.of(5)); ++ this.tryDropExperience(worldserver, blockposition, itemstack, ConstantInt.of(5)); ++ return ketting$tryDropExperience$result; } + return 0; diff --git a/patches/minecraft/net/minecraft/world/level/block/SculkShriekerBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/SculkShriekerBlock.java.patch index 938c90aa12..8535bf03d2 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SculkShriekerBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SculkShriekerBlock.java.patch @@ -8,7 +8,7 @@ serverlevel.getBlockEntity(p_222178_, BlockEntityType.SCULK_SHRIEKER).ifPresent((p_222163_) -> { p_222163_.tryShriek(serverlevel, serverplayer); }); -@@ -121,10 +_,22 @@ +@@ -121,10 +_,23 @@ public void spawnAfterBreak(BlockState p_222192_, ServerLevel p_222193_, BlockPos p_222194_, ItemStack p_222195_, boolean p_222196_) { super.spawnAfterBreak(p_222192_, p_222193_, p_222194_, p_222195_, p_222196_); @@ -20,7 +20,8 @@ + @Override + public int getExpDrop(BlockState iblockdata, ServerLevel worldserver, BlockPos blockposition, ItemStack itemstack, boolean flag) { + if (flag) { -+ return this.tryDropExperienceInt(worldserver, blockposition, itemstack, ConstantInt.of(5)); ++ this.tryDropExperience(worldserver, blockposition, itemstack, ConstantInt.of(5)); ++ return ketting$tryDropExperience$result; } + return 0; diff --git a/patches/minecraft/net/minecraft/world/level/block/SculkVeinBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/SculkVeinBlock.java.patch index 8b9294cc99..befe4a7899 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SculkVeinBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SculkVeinBlock.java.patch @@ -1,28 +1,28 @@ --- a/net/minecraft/world/level/block/SculkVeinBlock.java +++ b/net/minecraft/world/level/block/SculkVeinBlock.java -@@ -84,14 +_,14 @@ +@@ -84,6 +_,8 @@ } public int attemptUseCharge(SculkSpreader.ChargeCursor p_222369_, LevelAccessor p_222370_, BlockPos p_222371_, RandomSource p_222372_, SculkSpreader p_222373_, boolean p_222374_) { -- if (p_222374_ && this.attemptPlaceSculk(p_222373_, p_222370_, p_222369_.getPos(), p_222372_)) { -+ if (p_222374_ && this.attemptPlaceSculk(p_222373_, p_222370_, p_222369_.getPos(), p_222372_, p_222371_)) { // CraftBukkit - add source block ++ ketting$attemptPlaceSculk$sourceBlock.set(p_222371_); ++ // CraftBukkit - add source block + if (p_222374_ && this.attemptPlaceSculk(p_222373_, p_222370_, p_222369_.getPos(), p_222372_)) { return p_222369_.getCharge() - 1; } else { - return p_222372_.nextInt(p_222373_.chargeDecayRate()) == 0 ? Mth.floor((float)p_222369_.getCharge() * 0.5F) : p_222369_.getCharge(); +@@ -91,6 +_,7 @@ } } -- private boolean attemptPlaceSculk(SculkSpreader p_222376_, LevelAccessor p_222377_, BlockPos p_222378_, RandomSource p_222379_) { -+ private boolean attemptPlaceSculk(SculkSpreader p_222376_, LevelAccessor p_222377_, BlockPos p_222378_, RandomSource p_222379_, BlockPos sourceBlock) { // CraftBukkit ++ private final java.util.concurrent.atomic.AtomicReference ketting$attemptPlaceSculk$sourceBlock = new java.util.concurrent.atomic.AtomicReference<>(null); + private boolean attemptPlaceSculk(SculkSpreader p_222376_, LevelAccessor p_222377_, BlockPos p_222378_, RandomSource p_222379_) { BlockState blockstate = p_222377_.getBlockState(p_222378_); TagKey tagkey = p_222376_.replaceableBlocks(); - @@ -102,6 +_,11 @@ if (blockstate1.is(tagkey)) { BlockState blockstate2 = Blocks.SCULK.defaultBlockState(); p_222377_.setBlock(blockpos, blockstate2, 3); + // CraftBukkit start - Call BlockSpreadEvent -+ if (!org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.handleBlockSpreadEvent(p_222377_, sourceBlock, blockpos, blockstate2, 3)) { ++ if (!org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.handleBlockSpreadEvent(p_222377_, ketting$attemptPlaceSculk$sourceBlock.getAndSet(null), blockpos, blockstate2, 3)) { + return false; + } + // CraftBukkit end diff --git a/patches/minecraft/net/minecraft/world/level/block/SignBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/SignBlock.java.patch index 56da03c83a..2424475693 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SignBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SignBlock.java.patch @@ -9,16 +9,21 @@ return InteractionResult.SUCCESS; } else { return InteractionResult.PASS; -@@ -147,6 +_,15 @@ +@@ -146,7 +_,20 @@ + return woodtype; } - public void openTextEdit(Player p_277738_, SignBlockEntity p_277467_, boolean p_277771_) { ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$openTextEdit$cause = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.player.PlayerSignOpenEvent.Cause.UNKNOWN); ++ public void openTextEdit(Player p_277738_, SignBlockEntity p_277467_, boolean p_277771_, org.bukkit.event.player.PlayerSignOpenEvent.Cause cause) { ++ ketting$openTextEdit$cause.set(cause); + // Craftbukkit start -+ openTextEdit(p_277738_, p_277467_, p_277771_, org.bukkit.event.player.PlayerSignOpenEvent.Cause.UNKNOWN); ++ openTextEdit(p_277738_, p_277467_, p_277771_); + } + -+ public void openTextEdit(Player p_277738_, SignBlockEntity p_277467_, boolean p_277771_, org.bukkit.event.player.PlayerSignOpenEvent.Cause cause) { -+ if (!org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callPlayerSignOpenEvent(p_277738_, p_277467_, p_277771_, cause)) { + public void openTextEdit(Player p_277738_, SignBlockEntity p_277467_, boolean p_277771_) { ++ if (!org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callPlayerSignOpenEvent(p_277738_, p_277467_, p_277771_, ketting$openTextEdit$cause.getAndSet(org.bukkit.event.player.PlayerSignOpenEvent.Cause.UNKNOWN))) { ++ //Ketting end + return; + } + // Craftbukkit end diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch index 781496df66..b94cff2616 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch @@ -258,15 +258,24 @@ p_155004_.awardRecipes(list); for(Recipe recipe : list) { -@@ -467,18 +_,30 @@ +@@ -466,13 +_,33 @@ + this.recipesUsed.clear(); } - public List> getRecipesToAwardAndPopExperience(ServerLevel p_154996_, Vec3 p_154997_) { -+ // CraftBukkit start -+ return this.getRecipesToAwardAndPopExperience(p_154996_, p_154997_, this.worldPosition, null, null, 0); -+ } -+ ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$getRecipesToAwardAndPopExperience$blockposition = new java.util.concurrent.atomic.AtomicReference<>(null); ++ public final java.util.concurrent.atomic.AtomicReference ketting$getRecipesToAwardAndPopExperience$entityplayer = new java.util.concurrent.atomic.AtomicReference<>(null); ++ public final java.util.concurrent.atomic.AtomicReference ketting$getRecipesToAwardAndPopExperience$itemstack = new java.util.concurrent.atomic.AtomicReference<>(null); ++ public final java.util.concurrent.atomic.AtomicInteger ketting$getRecipesToAwardAndPopExperience$amount = new java.util.concurrent.atomic.AtomicInteger(0); + public List> getRecipesToAwardAndPopExperience(ServerLevel p_154996_, Vec3 p_154997_, BlockPos blockposition, ServerPlayer entityplayer, ItemStack itemstack, int amount) { ++ ketting$getRecipesToAwardAndPopExperience$blockposition.set(blockposition); ++ ketting$getRecipesToAwardAndPopExperience$entityplayer.set(entityplayer); ++ ketting$getRecipesToAwardAndPopExperience$itemstack.set(itemstack); ++ ketting$getRecipesToAwardAndPopExperience$amount.set(amount); ++ return getRecipesToAwardAndPopExperience(p_154996_, p_154997_); ++ } ++ //Ketting end + public List> getRecipesToAwardAndPopExperience(ServerLevel p_154996_, Vec3 p_154997_) { + // CraftBukkit end List> list = Lists.newArrayList(); @@ -275,22 +284,15 @@ list.add(p_155023_); - createExperience(p_154996_, p_154997_, entry.getIntValue(), ((AbstractCookingRecipe)p_155023_).getExperience()); + // Ketting start - Add CraftBukkit -+ ketting$blockposition$1 = blockposition; -+ ketting$entityhuman = entityplayer; -+ ketting$itemstack = itemstack; -+ ketting$amount = amount; ++ ketting$blockposition$1 = ketting$getRecipesToAwardAndPopExperience$blockposition.getAndSet(this.worldPosition); ++ ketting$entityhuman = ketting$getRecipesToAwardAndPopExperience$entityplayer.getAndSet(null); ++ ketting$itemstack = ketting$getRecipesToAwardAndPopExperience$itemstack.getAndSet(null); ++ ketting$amount = ketting$getRecipesToAwardAndPopExperience$amount.getAndSet(0); + // Ketting end + createExperience(p_154996_, p_154997_, entry.getIntValue(), ((AbstractCookingRecipe)p_155023_).getExperience()); // CraftBukkit }); } - return list; - } -- -+ - private static void createExperience(ServerLevel p_154999_, Vec3 p_155000_, int p_155001_, float p_155002_) { - int i = Mth.floor((float)p_155001_ * p_155002_); - float f = Mth.frac((float)p_155001_ * p_155002_); @@ -486,13 +_,69 @@ ++i; } diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch index d1fc8bf369..90033f1e13 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch @@ -17,29 +17,34 @@ } public void emptyAllLivingFromHive(@Nullable Player p_58749_, BlockState p_58750_, BeehiveBlockEntity.BeeReleaseStatus p_58751_) { -@@ -85,7 +_,7 @@ +@@ -85,6 +_,8 @@ Bee bee = (Bee)entity; if (p_58749_.position().distanceToSqr(entity.position()) <= 16.0D) { if (!this.isSedated()) { -- bee.setTarget(p_58749_); -+ bee.setTarget(p_58749_, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit ++ bee.ketting$setTarget$reason.set(org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER); ++ bee.ketting$setTarget$fireEvent.set(true); + bee.setTarget(p_58749_); } else { bee.setStayOutOfHiveCountdown(400); - } -@@ -97,9 +_,15 @@ +@@ -96,10 +_,20 @@ + } - private List releaseAllOccupants(BlockState p_58760_, BeehiveBlockEntity.BeeReleaseStatus p_58761_) { -+ // CraftBukkit start - This allows us to bypass the night/rain/emergency check -+ return releaseBees(p_58760_, p_58761_, false); ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicBoolean ketting$releaseAllOccupants$force = new java.util.concurrent.atomic.AtomicBoolean(false); ++ // CraftBukkit start - This allows us to bypass the night/rain/emergency check ++ public List releaseBees(BlockState p_58760_, BeehiveBlockEntity.BeeReleaseStatus p_58761_, boolean force) { ++ ketting$releaseAllOccupants$force.set(false); ++ return releaseAllOccupants(p_58760_, p_58761_); + } + -+ public List releaseBees(BlockState p_58760_, BeehiveBlockEntity.BeeReleaseStatus p_58761_, boolean force) { + private List releaseAllOccupants(BlockState p_58760_, BeehiveBlockEntity.BeeReleaseStatus p_58761_) { List list = Lists.newArrayList(); this.stored.removeIf((p_272556_) -> { - return releaseOccupant(this.level, this.worldPosition, p_58760_, p_272556_, list, p_58761_, this.savedFlowerPos); -+ return releaseBee(this.level, this.worldPosition, p_58760_, p_272556_, list, p_58761_, this.savedFlowerPos, force); ++ return releaseBee(this.level, this.worldPosition, p_58760_, p_272556_, list, p_58761_, this.savedFlowerPos, ketting$releaseAllOccupants$force.getAndSet(false)); + // CraftBukkit end ++ //Ketting end }); if (!list.isEmpty()) { super.setChanged(); @@ -64,17 +69,20 @@ p_58745_.stopRiding(); p_58745_.ejectPassengers(); CompoundTag compoundtag = new CompoundTag(); -@@ -156,7 +_,13 @@ +@@ -155,8 +_,16 @@ + this.stored.add(new BeehiveBlockEntity.BeeData(p_155158_, p_155159_, p_155160_ ? 2400 : 600)); } - private static boolean releaseOccupant(Level p_155137_, BlockPos p_155138_, BlockState p_155139_, BeehiveBlockEntity.BeeData p_155140_, @Nullable List p_155141_, BeehiveBlockEntity.BeeReleaseStatus p_155142_, @Nullable BlockPos p_155143_) { -- if ((p_155137_.isNight() || p_155137_.isRaining()) && p_155142_ != BeehiveBlockEntity.BeeReleaseStatus.EMERGENCY) { ++ public static final java.util.concurrent.atomic.AtomicBoolean ketting$releaseOccupant$force = new java.util.concurrent.atomic.AtomicBoolean(false); ++ private static boolean releaseBee(Level p_155137_, BlockPos p_155138_, BlockState p_155139_, BeehiveBlockEntity.BeeData p_155140_, @Nullable List p_155141_, BeehiveBlockEntity.BeeReleaseStatus p_155142_, @Nullable BlockPos p_155143_, boolean force) { ++ ketting$releaseOccupant$force.set(force); + // CraftBukkit start - This allows us to bypass the night/rain/emergency check -+ return releaseBee(p_155137_, p_155138_, p_155139_, p_155140_, p_155141_, p_155142_, p_155143_, false); ++ return releaseOccupant(p_155137_, p_155138_, p_155139_, p_155140_, p_155141_, p_155142_, p_155143_); + } + -+ private static boolean releaseBee(Level p_155137_, BlockPos p_155138_, BlockState p_155139_, BeehiveBlockEntity.BeeData p_155140_, @Nullable List p_155141_, BeehiveBlockEntity.BeeReleaseStatus p_155142_, @Nullable BlockPos p_155143_, boolean force) { -+ if (!force && (p_155137_.isNight() || p_155137_.isRaining()) && p_155142_ != BeehiveBlockEntity.BeeReleaseStatus.EMERGENCY) { + private static boolean releaseOccupant(Level p_155137_, BlockPos p_155138_, BlockState p_155139_, BeehiveBlockEntity.BeeData p_155140_, @Nullable List p_155141_, BeehiveBlockEntity.BeeReleaseStatus p_155142_, @Nullable BlockPos p_155143_) { +- if ((p_155137_.isNight() || p_155137_.isRaining()) && p_155142_ != BeehiveBlockEntity.BeeReleaseStatus.EMERGENCY) { ++ if (!ketting$releaseOccupant$force.getAndSet(false) && (p_155137_.isNight() || p_155137_.isRaining()) && p_155142_ != BeehiveBlockEntity.BeeReleaseStatus.EMERGENCY) { + // CraftBukkit end return false; } else { diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/BellBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/BellBlockEntity.java.patch index 7444cd731c..03e37fadd1 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/BellBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/BellBlockEntity.java.patch @@ -1,16 +1,5 @@ --- a/net/minecraft/world/level/block/entity/BellBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BellBlockEntity.java -@@ -33,8 +_,8 @@ - public boolean shaking; - public Direction clickDirection; - private List nearbyEntities; -- private boolean resonating; -- private int resonationTicks; -+ public boolean resonating; -+ public int resonationTicks; - - public BellBlockEntity(BlockPos p_155173_, BlockState p_155174_) { - super(BlockEntityType.BELL, p_155173_, p_155174_); @@ -128,9 +_,12 @@ } diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/CampfireBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/CampfireBlockEntity.java.patch index 8610809262..d95a82dde2 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/CampfireBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/CampfireBlockEntity.java.patch @@ -1,16 +1,5 @@ --- a/net/minecraft/world/level/block/entity/CampfireBlockEntity.java +++ b/net/minecraft/world/level/block/entity/CampfireBlockEntity.java -@@ -29,8 +_,8 @@ - private static final int BURN_COOL_SPEED = 2; - private static final int NUM_SLOTS = 4; - private final NonNullList items = NonNullList.withSize(4, ItemStack.EMPTY); -- private final int[] cookingProgress = new int[4]; -- private final int[] cookingTime = new int[4]; -+ public final int[] cookingProgress = new int[4]; -+ public final int[] cookingTime = new int[4]; - private final RecipeManager.CachedCheck quickCheck = RecipeManager.createCheck(RecipeType.CAMPFIRE_COOKING); - - public CampfireBlockEntity(BlockPos p_155301_, BlockState p_155302_) { @@ -51,6 +_,20 @@ return p_270054_.assemble(container, p_155307_.registryAccess()); }).orElse(itemstack); diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/HopperBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/HopperBlockEntity.java.patch index 9e44fc48fe..3057deb8a8 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/HopperBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/HopperBlockEntity.java.patch @@ -155,44 +155,56 @@ }); } else { for(ItemEntity itementity : getItemsAtAndAbove(p_155553_, p_155554_)) { -@@ -192,16 +_,46 @@ +@@ -192,16 +_,59 @@ } } -- private static boolean tryTakeInItemFromSlot(Hopper p_59355_, Container p_59356_, int p_59357_, Direction p_59358_) { -+ private static boolean tryTakeInItemFromSlot(Hopper p_59355_, Container p_59356_, int p_59357_, Direction p_59358_, Level world) { // Spigot ++ public static final java.util.concurrent.atomic.AtomicReference ketting$tryTakeInItemFromSlot$world = new java.util.concurrent.atomic.AtomicReference<>(null); ++ private static boolean tryTakeInItemFromSlot(Hopper p_59355_, Container p_59356_, int p_59357_, Direction p_59358_, Level world) { ++ ketting$tryTakeInItemFromSlot$world.set(world); ++ return tryTakeInItemFromSlot(p_59355_, p_59356_, p_59357_, p_59358_); ++ } + private static boolean tryTakeInItemFromSlot(Hopper p_59355_, Container p_59356_, int p_59357_, Direction p_59358_) { ItemStack itemstack = p_59356_.getItem(p_59357_); if (!itemstack.isEmpty() && canTakeItemFromContainer(p_59355_, p_59356_, itemstack, p_59357_, p_59358_)) { ItemStack itemstack1 = itemstack.copy(); - ItemStack itemstack2 = addItem(p_59356_, p_59355_, p_59356_.removeItem(p_59357_, 1), (Direction)null); + // ItemStack itemstack2 = addItem(p_59356_, p_59355_, p_59356_.removeItem(p_59357_, 1), (Direction)null); -+ // CraftBukkit start - Call event on collection of items from inventories into the hopper ++ // CraftBukkit start - Call event on collection of items from inventories into the hopper ++ Level world = ketting$tryTakeInItemFromSlot$world.getAndSet(null); ++ int origCount; ++ ItemStack itemstack2; ++ if (world != null){ + org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack oitemstack = org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack.asCraftMirror(p_59356_.removeItem(p_59357_, world.spigotConfig.hopperAmount)); // Spigot + + org.bukkit.inventory.Inventory sourceInventory; + // Have to special case large chests as they work oddly + if (p_59356_ instanceof ChestBlock.DoubleInventory) { -+ sourceInventory = new org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryDoubleChest((ChestBlock.DoubleInventory) p_59356_); ++ sourceInventory = new org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryDoubleChest((ChestBlock.DoubleInventory) p_59356_); + } else if (p_59356_.getOwner() != null) { -+ sourceInventory = p_59356_.getOwner().getInventory(); ++ sourceInventory = p_59356_.getOwner().getInventory(); + } else { -+ sourceInventory = new org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventory(p_59356_); ++ sourceInventory = new org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventory(p_59356_); + } + + org.bukkit.event.inventory.InventoryMoveItemEvent event = new org.bukkit.event.inventory.InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), p_59355_.getOwner().getInventory(), false); + + org.bukkit.Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { -+ p_59356_.setItem(p_59357_, itemstack1); ++ p_59356_.setItem(p_59357_, itemstack1); + -+ if (p_59355_ instanceof HopperBlockEntity) { -+ ((HopperBlockEntity) p_59355_).setCooldown(world.spigotConfig.hopperTransfer); // Spigot -+ } ++ if (p_59355_ instanceof HopperBlockEntity) { ++ ((HopperBlockEntity) p_59355_).setCooldown(world.spigotConfig.hopperTransfer); // Spigot ++ } + -+ return false; ++ return false; ++ } ++ origCount = event.getItem().getAmount(); // Spigot ++ itemstack2 = addItem(p_59356_, p_59355_, org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack.asNMSCopy(event.getItem()), null); ++ }else{ ++ origCount = p_59357_; ++ itemstack2 = addItem(p_59356_, p_59355_, p_59356_.removeItem(p_59357_, 1), (Direction)null); + } -+ int origCount = event.getItem().getAmount(); // Spigot -+ ItemStack itemstack2 = addItem(p_59356_, p_59355_, org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack.asNMSCopy(event.getItem()), null); + // CraftBukkit end + if (itemstack2.isEmpty()) { diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/JukeboxBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/JukeboxBlockEntity.java.patch index 45be7c8590..5d25b1e415 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/JukeboxBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/JukeboxBlockEntity.java.patch @@ -1,15 +1,9 @@ --- a/net/minecraft/world/level/block/entity/JukeboxBlockEntity.java +++ b/net/minecraft/world/level/block/entity/JukeboxBlockEntity.java -@@ -28,9 +_,45 @@ - private static final int SONG_END_PADDING = 20; - private final NonNullList items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); - private int ticksSinceLastEvent; -- private long tickCount; -- private long recordStartedTick; -- private boolean isPlaying; -+ public long tickCount; -+ public long recordStartedTick; -+ public boolean isPlaying; +@@ -31,6 +_,42 @@ + public long tickCount; + public long recordStartedTick; + public boolean isPlaying; + // CraftBukkit start - add fields and methods + public java.util.List transaction = new java.util.ArrayList(); + private int maxStack = MAX_STACK; diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/LecternBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/LecternBlockEntity.java.patch index 66ede2ab77..7c55da9d55 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/LecternBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/LecternBlockEntity.java.patch @@ -1,11 +1,10 @@ --- a/net/minecraft/world/level/block/entity/LecternBlockEntity.java +++ b/net/minecraft/world/level/block/entity/LecternBlockEntity.java -@@ -25,12 +_,59 @@ +@@ -25,12 +_,58 @@ import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; -public class LecternBlockEntity extends BlockEntity implements Clearable, MenuProvider { -+ +public class LecternBlockEntity extends BlockEntity implements Clearable, MenuProvider, CommandSource { // CraftBukkit - CommandSource public static final int DATA_PAGE = 0; public static final int NUM_DATA = 1; @@ -66,11 +65,10 @@ } } -- public void setItem(int p_59585_, ItemStack p_59586_) { + // CraftBukkit start -+ public void setItem(int i, ItemStack itemstack) { -+ if (i == 0) { -+ LecternBlockEntity.this.setBook(itemstack); + public void setItem(int p_59585_, ItemStack p_59586_) { ++ if (p_59585_ == 0) { ++ LecternBlockEntity.this.setBook(p_59586_); + if (LecternBlockEntity.this.getLevel() != null) { + LecternBlock.resetBookState(null, LecternBlockEntity.this.getLevel(), LecternBlockEntity.this.getBlockPos(), LecternBlockEntity.this.getBlockState(), LecternBlockEntity.this.hasBook()); + } diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java.patch index b90e07aec7..ecb49bd49b 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java.patch @@ -1,16 +1,5 @@ --- a/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java +++ b/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java -@@ -27,8 +_,8 @@ - public static final String LOOT_TABLE_TAG = "LootTable"; - public static final String LOOT_TABLE_SEED_TAG = "LootTableSeed"; - @Nullable -- protected ResourceLocation lootTable; -- protected long lootTableSeed; -+ public ResourceLocation lootTable; -+ public long lootTableSeed; - - protected RandomizableContainerBlockEntity(BlockEntityType p_155629_, BlockPos p_155630_, BlockState p_155631_) { - super(p_155629_, p_155630_, p_155631_); @@ -148,4 +_,12 @@ return null; } diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch index e9e6f57371..15775defe5 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch @@ -24,12 +24,18 @@ } } -@@ -156,7 +_,8 @@ +@@ -156,7 +_,15 @@ return this.setText(p_277877_.apply(signtext), p_277426_); } -- private SignText setMessages(Player p_277396_, List p_277744_, SignText p_277359_) { ++ //Ketting start ++ private final java.util.concurrent.atomic.AtomicBoolean ketting$setMessages$front = new java.util.concurrent.atomic.AtomicBoolean(true); + private SignText setMessages(Player p_277396_, List p_277744_, SignText p_277359_, boolean front) { // CraftBukkit ++ ketting$setMessages$front.set(front); ++ return setMessages(p_277396_, p_277744_, p_277359_); ++ } ++ //Ketting end + private SignText setMessages(Player p_277396_, List p_277744_, SignText p_277359_) { + SignText originalText = p_277359_; // CraftBukkit for(int i = 0; i < p_277744_.size(); ++i) { FilteredText filteredtext = p_277744_.get(i); @@ -46,7 +52,7 @@ + lines[i] = org.bukkit.craftbukkit.v1_20_R1.util.CraftChatMessage.fromComponent(p_277359_.getMessage(i, p_277396_.isTextFilteringEnabled())); + } + -+ org.bukkit.event.block.SignChangeEvent event = new org.bukkit.event.block.SignChangeEvent(org.bukkit.craftbukkit.v1_20_R1.block.CraftBlock.at(this.level, this.worldPosition), player, lines.clone(), (front) ? org.bukkit.block.sign.Side.FRONT : org.bukkit.block.sign.Side.BACK); ++ org.bukkit.event.block.SignChangeEvent event = new org.bukkit.event.block.SignChangeEvent(org.bukkit.craftbukkit.v1_20_R1.block.CraftBlock.at(this.level, this.worldPosition), player, lines.clone(), (ketting$setMessages$front.getAndSet(true)) ? org.bukkit.block.sign.Side.FRONT : org.bukkit.block.sign.Side.BACK); + p_277396_.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/StructureBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/StructureBlockEntity.java.patch deleted file mode 100644 index ff0598038c..0000000000 --- a/patches/minecraft/net/minecraft/world/level/block/entity/StructureBlockEntity.java.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- a/net/minecraft/world/level/block/entity/StructureBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/StructureBlockEntity.java -@@ -36,19 +_,19 @@ - public static final int MAX_SIZE_PER_AXIS = 48; - public static final String AUTHOR_TAG = "author"; - private ResourceLocation structureName; -- private String author = ""; -- private String metaData = ""; -- private BlockPos structurePos = new BlockPos(0, 1, 0); -- private Vec3i structureSize = Vec3i.ZERO; -- private Mirror mirror = Mirror.NONE; -- private Rotation rotation = Rotation.NONE; -- private StructureMode mode; -- private boolean ignoreEntities = true; -+ public String author = ""; -+ public String metaData = ""; -+ public BlockPos structurePos = new BlockPos(0, 1, 0); -+ public Vec3i structureSize = Vec3i.ZERO; -+ public Mirror mirror = Mirror.NONE; -+ public Rotation rotation = Rotation.NONE; -+ public StructureMode mode; -+ public boolean ignoreEntities = true; - private boolean powered; -- private boolean showAir; -- private boolean showBoundingBox = true; -- private float integrity = 1.0F; -- private long seed; -+ public boolean showAir; -+ public boolean showBoundingBox = true; -+ public float integrity = 1.0F; -+ public long seed; - - public StructureBlockEntity(BlockPos p_155779_, BlockState p_155780_) { - super(BlockEntityType.STRUCTURE_BLOCK, p_155779_, p_155780_); diff --git a/patches/minecraft/net/minecraft/world/level/block/state/properties/IntegerProperty.java.patch b/patches/minecraft/net/minecraft/world/level/block/state/properties/IntegerProperty.java.patch deleted file mode 100644 index 16dd25c2c0..0000000000 --- a/patches/minecraft/net/minecraft/world/level/block/state/properties/IntegerProperty.java.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/net/minecraft/world/level/block/state/properties/IntegerProperty.java -+++ b/net/minecraft/world/level/block/state/properties/IntegerProperty.java -@@ -8,8 +_,8 @@ - - public class IntegerProperty extends Property { - private final ImmutableSet values; -- private final int min; -- private final int max; -+ public final int min; -+ public final int max; - - protected IntegerProperty(String p_61623_, int p_61624_, int p_61625_) { - super(p_61623_, Integer.class); diff --git a/patches/minecraft/net/minecraft/world/level/chunk/ChunkGenerator.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/ChunkGenerator.java.patch index 0b8ec5dd31..5943b87da3 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/ChunkGenerator.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/ChunkGenerator.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/level/chunk/ChunkGenerator.java +++ b/net/minecraft/world/level/chunk/ChunkGenerator.java -@@ -77,7 +_,7 @@ - - public abstract class ChunkGenerator { - public static final Codec CODEC = BuiltInRegistries.CHUNK_GENERATOR.byNameCodec().dispatchStable(ChunkGenerator::codec, Function.identity()); -- public BiomeSource biomeSource; -+ protected BiomeSource biomeSource; //Ketting - not final - private final Supplier> featuresPerStep; - public final Function, BiomeGenerationSettings> generationSettingsGetter; - @@ -97,9 +_,17 @@ }); } diff --git a/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch index f48f12fb37..eac8daf15c 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch @@ -58,30 +58,19 @@ } public TickContainerAccess getBlockTicks() { -@@ -208,7 +_,30 @@ +@@ -208,7 +_,19 @@ } } - @Nullable + // CraftBukkit start + //Ketting start - reverse delegation -+ private boolean setBlockState$doPlace = true; -+ -+ public void prepareSetBlockState(boolean doPlace){ -+ setBlockState$doPlace = doPlace; -+ } -+ public void resetSetBlockState(){ -+ setBlockState$doPlace = true; -+ } ++ public final java.util.concurrent.atomic.AtomicBoolean ketting$setBlockState$doPlace = new java.util.concurrent.atomic.AtomicBoolean(true); + + @Nullable + public BlockState setBlockState(BlockPos p_62865_, BlockState p_62866_, boolean p_62867_, boolean doPlace) { -+ setBlockState$doPlace = doPlace; -+ try{ -+ return setBlockState(p_62865_, p_62866_, p_62867_); -+ }finally { -+ setBlockState$doPlace = true; //default -+ } ++ ketting$setBlockState$doPlace.set(doPlace); ++ return setBlockState(p_62865_, p_62866_, p_62867_); + } + //Ketting end + // CraftBukkit end @@ -104,8 +93,8 @@ } else { - if (!this.level.isClientSide) { + // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled. -+ //Ketting - combine forge and bukkit snapshot caoture -+ if (!this.level.isClientSide && setBlockState$doPlace && (!this.level.captureBlockSnapshots || (!this.level.captureBlockStates || block instanceof net.minecraft.world.level.block.BaseEntityBlock))) { ++ //Ketting - combine forge and bukkit snapshot capture. Also query doPlace first, so it always gets reset ++ if (ketting$setBlockState$doPlace.getAndSet(true) && !this.level.isClientSide && (!this.level.captureBlockSnapshots || (!this.level.captureBlockStates || block instanceof net.minecraft.world.level.block.BaseEntityBlock))) { p_62866_.onPlace(this.level, p_62865_, blockstate, p_62867_); } diff --git a/patches/minecraft/net/minecraft/world/level/chunk/storage/ChunkStorage.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/storage/ChunkStorage.java.patch index 945e3a9bf3..6c6e1577f0 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/storage/ChunkStorage.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/storage/ChunkStorage.java.patch @@ -1,5 +1,14 @@ --- a/net/minecraft/world/level/chunk/storage/ChunkStorage.java +++ b/net/minecraft/world/level/chunk/storage/ChunkStorage.java +@@ -19,6 +_,8 @@ + import net.minecraft.world.level.levelgen.structure.LegacyStructureDataHandler; + import net.minecraft.world.level.storage.DimensionDataStorage; + ++//Ketting - Todo: this whole class is a nightmare for method head and mixin compat. ++// Idk how to make it compatible, so leave it, until there's an error here. + public class ChunkStorage implements AutoCloseable { + public static final int LAST_MONOLYTH_STRUCTURE_DATA_VERSION = 1493; + private final IOWorker worker; @@ -35,8 +_,53 @@ return this.worker.isOldChunkAround(p_223452_, p_223453_); } diff --git a/patches/minecraft/net/minecraft/world/level/dimension/end/EndDragonFight.java.patch b/patches/minecraft/net/minecraft/world/level/dimension/end/EndDragonFight.java.patch index 6094845210..71179fe26d 100644 --- a/patches/minecraft/net/minecraft/world/level/dimension/end/EndDragonFight.java.patch +++ b/patches/minecraft/net/minecraft/world/level/dimension/end/EndDragonFight.java.patch @@ -1,67 +1,66 @@ --- a/net/minecraft/world/level/dimension/end/EndDragonFight.java +++ b/net/minecraft/world/level/dimension/end/EndDragonFight.java -@@ -450,6 +_,10 @@ +@@ -449,6 +_,7 @@ + return this.previouslyKilled; } ++ public boolean ketting$tryRespawn$result = false; public void tryRespawn() { -+ tryRespawnBool(); -+ } -+ -+ public boolean tryRespawnBool() { // CraftBukkit - return boolean if (this.dragonKilled && this.respawnStage == null) { BlockPos blockpos = this.portalLocation; - if (blockpos == null) { -@@ -471,19 +_,24 @@ +@@ -471,6 +_,8 @@ for(Direction direction : Direction.Plane.HORIZONTAL) { List list = this.level.getEntitiesOfClass(EndCrystal.class, new AABB(blockpos1.relative(direction, 2))); if (list.isEmpty()) { -- return; -+ return false; // CraftBukkit - return value ++ ketting$tryRespawn$result = false; ++ // CraftBukkit - return value + return; } - list1.addAll(list); - } +@@ -479,11 +_,21 @@ LOGGER.debug("Found all crystals, respawning dragon."); -- this.respawnDragon(list1); -+ this.respawnDragon(list1); // CraftBukkit - return value -+ return respawnDragon$returnValue; + this.respawnDragon(list1); ++ // CraftBukkit - return value ++ ketting$tryRespawn$result = ketting$respawnDragon$returnValue; ++ return; } -- -+ return false; // CraftBukkit - return value + ++ // CraftBukkit - return value ++ ketting$tryRespawn$result = false; ++ return; } -- private void respawnDragon(List p_64092_) { +- public void respawnDragon(List p_64092_) { + // Ketting don't change the returntype + @org.jetbrains.annotations.ApiStatus.Internal -+ public boolean respawnDragon$returnValue = false; ++ public boolean ketting$respawnDragon$returnValue = false; + // CraftBukkit - return boolean + public void respawnDragon(List p_64092_) { if (this.dragonKilled && this.respawnStage == null) { for(BlockPattern.BlockPatternMatch blockpattern$blockpatternmatch = this.findExitPortal(); blockpattern$blockpatternmatch != null; blockpattern$blockpatternmatch = this.findExitPortal()) { for(int i = 0; i < this.exitPortalPattern.getWidth(); ++i) { -@@ -502,8 +_,15 @@ +@@ -502,8 +_,16 @@ this.respawnTime = 0; this.spawnExitPortal(false); this.respawnCrystals = p_64092_; + // CraftBukkit - return value + // Ketting -+ respawnDragon$returnValue = true; ++ ketting$respawnDragon$returnValue = true; + return; } -- + + // CraftBukkit - return value + // Ketting -+ respawnDragon$returnValue = false; ++ ketting$respawnDragon$returnValue = false; + return; } public void resetSpikeCrystals() { -@@ -513,7 +_,14 @@ - endcrystal.setBeamTarget((BlockPos)null); +@@ -514,6 +_,14 @@ } } -- + + } + + public void addPlayer(ServerPlayer player) { diff --git a/patches/minecraft/net/minecraft/world/level/entity/PersistentEntitySectionManager.java.patch b/patches/minecraft/net/minecraft/world/level/entity/PersistentEntitySectionManager.java.patch index be1bf6606b..b47e92b147 100644 --- a/patches/minecraft/net/minecraft/world/level/entity/PersistentEntitySectionManager.java.patch +++ b/patches/minecraft/net/minecraft/world/level/entity/PersistentEntitySectionManager.java.patch @@ -49,45 +49,50 @@ }); } -@@ -186,6 +_,12 @@ +@@ -185,6 +_,13 @@ + } - private boolean storeChunkSections(long p_157513_, Consumer p_157514_) { ++ private final java.util.concurrent.atomic.AtomicBoolean ketting$storeChunkSections$callEvent = new java.util.concurrent.atomic.AtomicBoolean(false); ++ private boolean storeChunkSections(long p_157513_, Consumer p_157514_, boolean callEvent) { ++ ketting$storeChunkSections$callEvent.set(callEvent); + // CraftBukkit start - add boolean for event call -+ return storeChunkSections(p_157513_, p_157514_, false); ++ return storeChunkSections(p_157513_, p_157514_); + } -+ -+ private boolean storeChunkSections(long p_157513_, Consumer p_157514_, boolean callEvent) { -+ // CraftBukkit end ++ + private boolean storeChunkSections(long p_157513_, Consumer p_157514_) { PersistentEntitySectionManager.ChunkLoadStatus persistententitysectionmanager$chunkloadstatus = this.chunkLoadStatuses.get(p_157513_); if (persistententitysectionmanager$chunkloadstatus == PersistentEntitySectionManager.ChunkLoadStatus.PENDING) { - return false; -@@ -195,6 +_,7 @@ +@@ -195,16 +_,20 @@ }).collect(Collectors.toList()); if (list.isEmpty()) { if (persistententitysectionmanager$chunkloadstatus == PersistentEntitySectionManager.ChunkLoadStatus.LOADED) { -+ if (callEvent) org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntitiesUnloadEvent(((net.minecraft.world.level.chunk.storage.EntityStorage) permanentStorage).level, new ChunkPos(p_157513_), ImmutableList.of()); // CraftBukkit ++ if (ketting$storeChunkSections$callEvent.get()) org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntitiesUnloadEvent(((net.minecraft.world.level.chunk.storage.EntityStorage) permanentStorage).level, new ChunkPos(p_157513_), ImmutableList.of()); // CraftBukkit this.permanentStorage.storeEntities(new ChunkEntities<>(new ChunkPos(p_157513_), ImmutableList.of())); } - -@@ -203,6 +_,7 @@ +- ++ ketting$storeChunkSections$callEvent.set(false); + return true; + } else if (persistententitysectionmanager$chunkloadstatus == PersistentEntitySectionManager.ChunkLoadStatus.FRESH) { ++ ketting$storeChunkSections$callEvent.set(false); this.requestChunkLoad(p_157513_); return false; } else { -+ if (callEvent) org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntitiesUnloadEvent(((net.minecraft.world.level.chunk.storage.EntityStorage) permanentStorage).level, new ChunkPos(p_157513_), list.stream().map(entity -> (Entity) entity).collect(Collectors.toList())); // CraftBukkit ++ if (ketting$storeChunkSections$callEvent.get()) org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntitiesUnloadEvent(((net.minecraft.world.level.chunk.storage.EntityStorage) permanentStorage).level, new ChunkPos(p_157513_), list.stream().map(entity -> (Entity) entity).collect(Collectors.toList())); // CraftBukkit this.permanentStorage.storeEntities(new ChunkEntities<>(new ChunkPos(p_157513_), list)); list.forEach(p_157514_); ++ ketting$storeChunkSections$callEvent.set(false); return true; -@@ -222,7 +_,8 @@ + } + } +@@ -220,6 +_,7 @@ + } + private boolean processChunkUnload(long p_157569_) { ++ ketting$storeChunkSections$callEvent.set(true); boolean flag = this.storeChunkSections(p_157569_, (p_157595_) -> { p_157595_.getPassengersAndSelf().forEach(this::unloadEntity); -- }); -+ }, true); // CraftBukkit - add boolean for event call -+ - if (!flag) { - return false; - } else { + }); @@ -247,8 +_,13 @@ while((chunkentities = this.loadingInbox.poll()) != null) { chunkentities.getEntities().forEach((p_157593_) -> { @@ -102,22 +107,22 @@ } } -@@ -300,7 +_,14 @@ +@@ -299,7 +_,15 @@ + this.permanentStorage.flush(true); } - public void close() throws IOException { -- this.saveAll(); -+ // CraftBukkit start - add save boolean -+ close(true); -+ } -+ ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicBoolean ketting$close$save = new java.util.concurrent.atomic.AtomicBoolean(true); + public void close(boolean save) throws IOException { -+ if (save) -+ this.saveAll(); -+ // CraftBukkit end ++ ketting$close$save.set(save); ++ close(); ++ } + public void close() throws IOException { ++ if(ketting$close$save.getAndSet(true)) ++ //Ketting end + this.saveAll(); this.permanentStorage.close(); } - @@ -349,11 +_,13 @@ class Callback implements EntityInLevelCallback { diff --git a/patches/minecraft/net/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler.java.patch b/patches/minecraft/net/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler.java.patch index 4e869cf8be..58a50224a5 100644 --- a/patches/minecraft/net/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler.java.patch +++ b/patches/minecraft/net/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler.java.patch @@ -1,11 +1,14 @@ --- a/net/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler.java +++ b/net/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler.java -@@ -202,13 +_,13 @@ +@@ -202,13 +_,16 @@ } } - public static LegacyStructureDataHandler getLegacyStructureHandler(ResourceKey p_71332_, @Nullable DimensionDataStorage p_71333_) { - if (p_71332_ == Level.OVERWORLD) { ++ //Ketting - Todo: yes, this is a potential mixin inject error. ++ // Patching this out seems to be hard, though. ++ // For now we'll just hope nobody needs the mixin into the original method. + public static LegacyStructureDataHandler getLegacyStructureHandler(ResourceKey p_71332_, @Nullable DimensionDataStorage p_71333_) { // CraftBukkit + if (p_71332_ == net.minecraft.world.level.dimension.LevelStem.OVERWORLD) { // CraftBukkit return new LegacyStructureDataHandler(p_71333_, ImmutableList.of("Monument", "Stronghold", "Village", "Mineshaft", "Temple", "Mansion"), ImmutableList.of("Village", "Mineshaft", "Mansion", "Igloo", "Desert_Pyramid", "Jungle_Pyramid", "Swamp_Hut", "Stronghold", "Monument")); diff --git a/patches/minecraft/net/minecraft/world/level/levelgen/structure/StructurePiece.java.patch b/patches/minecraft/net/minecraft/world/level/levelgen/structure/StructurePiece.java.patch index 863e1331cc..c758c6d31a 100644 --- a/patches/minecraft/net/minecraft/world/level/levelgen/structure/StructurePiece.java.patch +++ b/patches/minecraft/net/minecraft/world/level/levelgen/structure/StructurePiece.java.patch @@ -10,12 +10,3 @@ CompoundTag compoundtag = new CompoundTag(); compoundtag.putString("id", BuiltInRegistries.STRUCTURE_PIECE.getKey(this.getType()).toString()); BoundingBox.CODEC.encodeStart(NbtOps.INSTANCE, this.boundingBox).resultOrPartial(LOGGER::error).ifPresent((p_163579_) -> { -@@ -385,7 +_,7 @@ - } - - protected boolean createDispenser(WorldGenLevel p_226820_, BoundingBox p_226821_, RandomSource p_226822_, int p_226823_, int p_226824_, int p_226825_, Direction p_226826_, ResourceLocation p_226827_) { -- BlockPos blockpos = this.getWorldPos(p_226823_, p_226824_, p_226825_); -+ BlockPos.MutableBlockPos blockpos = this.getWorldPos(p_226823_, p_226824_, p_226825_); - if (p_226821_.isInside(blockpos) && !p_226820_.getBlockState(blockpos).is(Blocks.DISPENSER)) { - this.placeBlock(p_226820_, Blocks.DISPENSER.defaultBlockState().setValue(DispenserBlock.FACING, p_226826_), p_226823_, p_226824_, p_226825_, p_226821_); - BlockEntity blockentity = p_226820_.getBlockEntity(blockpos); diff --git a/patches/minecraft/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java.patch b/patches/minecraft/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java.patch deleted file mode 100644 index 15f17ffb5b..0000000000 --- a/patches/minecraft/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java -+++ b/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java -@@ -21,11 +_,11 @@ - public abstract class StructurePlacement { - public static final Codec CODEC = BuiltInRegistries.STRUCTURE_PLACEMENT.byNameCodec().dispatch(StructurePlacement::type, StructurePlacementType::codec); - private static final int HIGHLY_ARBITRARY_RANDOM_SALT = 10387320; -- private final Vec3i locateOffset; -- private final StructurePlacement.FrequencyReductionMethod frequencyReductionMethod; -- private final float frequency; -- private final int salt; -- private final Optional exclusionZone; -+ public final Vec3i locateOffset; -+ public final StructurePlacement.FrequencyReductionMethod frequencyReductionMethod; -+ public final float frequency; -+ public final int salt; -+ public final Optional exclusionZone; - - protected static Products.P5, Vec3i, StructurePlacement.FrequencyReductionMethod, Float, Integer, Optional> placementCodec(RecordCodecBuilder.Instance p_227042_) { - return p_227042_.group(Vec3i.offsetCodec(16).optionalFieldOf("locate_offset", Vec3i.ZERO).forGetter(StructurePlacement::locateOffset), StructurePlacement.FrequencyReductionMethod.CODEC.optionalFieldOf("frequency_reduction_method", StructurePlacement.FrequencyReductionMethod.DEFAULT).forGetter(StructurePlacement::frequencyReductionMethod), Codec.floatRange(0.0F, 1.0F).optionalFieldOf("frequency", 1.0F).forGetter(StructurePlacement::frequency), ExtraCodecs.NON_NEGATIVE_INT.fieldOf("salt").forGetter(StructurePlacement::salt), StructurePlacement.ExclusionZone.CODEC.optionalFieldOf("exclusion_zone").forGetter(StructurePlacement::exclusionZone)); diff --git a/patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/MineshaftPieces.java.patch b/patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/MineshaftPieces.java.patch deleted file mode 100644 index c51d3905bc..0000000000 --- a/patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/MineshaftPieces.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/levelgen/structure/structures/MineshaftPieces.java -+++ b/net/minecraft/world/level/levelgen/structure/structures/MineshaftPieces.java -@@ -270,7 +_,7 @@ - if (this.spiderCorridor && !this.hasPlacedSpider) { - int l1 = 1; - int i2 = k1 - 1 + p_227746_.nextInt(3); -- BlockPos blockpos = this.getWorldPos(1, 0, i2); -+ BlockPos.MutableBlockPos blockpos = this.getWorldPos(1, 0, i2); - if (p_227747_.isInside(blockpos) && this.isInterior(p_227743_, 1, 0, i2, p_227747_)) { - this.hasPlacedSpider = true; - p_227743_.setBlock(blockpos, Blocks.SPAWNER.defaultBlockState(), 2); diff --git a/patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces.java.patch b/patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces.java.patch deleted file mode 100644 index 8d3f77814c..0000000000 --- a/patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces.java -+++ b/net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces.java -@@ -871,7 +_,7 @@ - this.placeBlock(p_228362_, blockstate, 3, 8, 8, p_228366_); - this.placeBlock(p_228362_, Blocks.NETHER_BRICK_FENCE.defaultBlockState().setValue(FenceBlock.WEST, Boolean.valueOf(true)), 4, 8, 8, p_228366_); - if (!this.hasPlacedSpawner) { -- BlockPos blockpos = this.getWorldPos(3, 5, 5); -+ BlockPos.MutableBlockPos blockpos = this.getWorldPos(3, 5, 5); - if (p_228366_.isInside(blockpos)) { - this.hasPlacedSpawner = true; - p_228362_.setBlock(blockpos, Blocks.SPAWNER.defaultBlockState(), 2); diff --git a/patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/StrongholdPieces.java.patch b/patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/StrongholdPieces.java.patch deleted file mode 100644 index 2a45278148..0000000000 --- a/patches/minecraft/net/minecraft/world/level/levelgen/structure/structures/StrongholdPieces.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/levelgen/structure/structures/StrongholdPieces.java -+++ b/net/minecraft/world/level/levelgen/structure/structures/StrongholdPieces.java -@@ -703,7 +_,7 @@ - } - - if (!this.hasPlacedSpawner) { -- BlockPos blockpos = this.getWorldPos(5, 3, 6); -+ BlockPos.MutableBlockPos blockpos = this.getWorldPos(5, 3, 6); - if (p_229639_.isInside(blockpos)) { - this.hasPlacedSpawner = true; - p_229635_.setBlock(blockpos, Blocks.SPAWNER.defaultBlockState(), 2); diff --git a/patches/minecraft/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java.patch b/patches/minecraft/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java.patch index d307b555d4..802e1218cd 100644 --- a/patches/minecraft/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java.patch +++ b/patches/minecraft/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java.patch @@ -1,13 +1,6 @@ --- a/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java +++ b/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java -@@ -64,11 +_,16 @@ - public static final String ENTITY_TAG_BLOCKPOS = "blockPos"; - public static final String ENTITY_TAG_NBT = "nbt"; - public static final String SIZE_TAG = "size"; -- private final List palettes = Lists.newArrayList(); -- private final List entityInfoList = Lists.newArrayList(); -+ public final List palettes = Lists.newArrayList(); -+ public final List entityInfoList = Lists.newArrayList(); +@@ -69,6 +_,11 @@ private Vec3i size = Vec3i.ZERO; private String author = "?"; diff --git a/patches/minecraft/net/minecraft/world/level/portal/PortalForcer.java.patch b/patches/minecraft/net/minecraft/world/level/portal/PortalForcer.java.patch index ceb40fc208..11f3c0f4c9 100644 --- a/patches/minecraft/net/minecraft/world/level/portal/PortalForcer.java.patch +++ b/patches/minecraft/net/minecraft/world/level/portal/PortalForcer.java.patch @@ -9,46 +9,53 @@ private static final int TICKET_RADIUS = 3; private static final int SEARCH_RADIUS = 128; private static final int CREATE_RADIUS = 16; -@@ -40,8 +_,15 @@ +@@ -39,9 +_,18 @@ + this.level = p_77650_; } - public Optional findPortalAround(BlockPos p_192986_, boolean p_192987_, WorldBorder p_192988_) { -+ // CraftBukkit start -+ return this.findPortalAround(p_192986_, p_192988_, p_192987_ ? 16 : 128); // Search Radius -+ } -+ ++ //Ketting start ++ private final java.util.concurrent.atomic.AtomicReference> ketting$findPortalAround$i = new java.util.concurrent.atomic.AtomicReference<>(Optional.empty()); + public Optional findPortalAround(BlockPos p_192986_, WorldBorder p_192988_, int i) { ++ ketting$findPortalAround$i.set(Optional.of(i)); ++ return this.findPortalAround(p_192986_, true, p_192988_); // Search Radius ++ } ++ + public Optional findPortalAround(BlockPos p_192986_, boolean p_192987_, WorldBorder p_192988_) { PoiManager poimanager = this.level.getPoiManager(); - int i = p_192987_ ? 16 : 128; -+ // int i = p_192987_ ? 16 : 128; -+ // CraftBukkit end ++ int i = ketting$findPortalAround$i.getAndSet(Optional.empty()).orElse(p_192987_ ? 16 : 128); ++ //Ketting end + poimanager.ensureLoadedAndValid(this.level, p_192986_, i); Optional optional = poimanager.getInSquare((p_230634_) -> { return p_230634_.is(PoiTypes.NETHER_PORTAL); -@@ -65,6 +_,12 @@ +@@ -64,6 +_,16 @@ + }); } - public Optional createPortal(BlockPos p_77667_, Direction.Axis p_77668_) { ++ //Ketting start ++ private final java.util.concurrent.atomic.AtomicReference ketting$createPortal$entity = new java.util.concurrent.atomic.AtomicReference<>(null); ++ private final java.util.concurrent.atomic.AtomicInteger ketting$createPortal$createRadius = new java.util.concurrent.atomic.AtomicInteger(16); ++ public Optional createPortal(BlockPos p_77667_, Direction.Axis p_77668_, net.minecraft.world.entity.Entity entity, int createRadius) { ++ ketting$createPortal$entity.set(entity); ++ ketting$createPortal$createRadius.set(createRadius); + // CraftBukkit start -+ return this.createPortal(p_77667_, p_77668_, null, 16); ++ return this.createPortal(p_77667_, p_77668_); + } + -+ public Optional createPortal(BlockPos p_77667_, Direction.Axis p_77668_, net.minecraft.world.entity.Entity entity, int createRadius) { -+ // CraftBukkit end + public Optional createPortal(BlockPos p_77667_, Direction.Axis p_77668_) { Direction direction = Direction.get(Direction.AxisDirection.POSITIVE, p_77668_); double d0 = -1.0D; - BlockPos blockpos = null; @@ -74,7 +_,7 @@ int i = Math.min(this.level.getMaxBuildHeight(), this.level.getMinBuildHeight() + this.level.getLogicalHeight()) - 1; BlockPos.MutableBlockPos blockpos$mutableblockpos = p_77667_.mutable(); - for(BlockPos.MutableBlockPos blockpos$mutableblockpos1 : BlockPos.spiralAround(p_77667_, 16, Direction.EAST, Direction.SOUTH)) { -+ for(BlockPos.MutableBlockPos blockpos$mutableblockpos1 : BlockPos.spiralAround(p_77667_, createRadius, Direction.EAST, Direction.SOUTH)) { // CraftBukkit ++ for(BlockPos.MutableBlockPos blockpos$mutableblockpos1 : BlockPos.spiralAround(p_77667_, ketting$createPortal$createRadius.getAndSet(16), Direction.EAST, Direction.SOUTH)) { // CraftBukkit int j = Math.min(i, this.level.getHeight(Heightmap.Types.MOTION_BLOCKING, blockpos$mutableblockpos1.getX(), blockpos$mutableblockpos1.getZ())); int k = 1; if (worldborder.isWithinBounds(blockpos$mutableblockpos1) && worldborder.isWithinBounds(blockpos$mutableblockpos1.move(direction, 1))) { -@@ -115,6 +_,7 @@ +@@ -115,10 +_,12 @@ d0 = d1; } @@ -56,6 +63,11 @@ if (d0 == -1.0D) { int k1 = Math.max(this.level.getMinBuildHeight() - -1, 70); int i2 = i - 9; + if (i2 < k1) { ++ ketting$createPortal$entity.set(null); + return Optional.empty(); + } + @@ -133,7 +_,7 @@ for(int k3 = -1; k3 < 3; ++k3) { BlockState blockstate1 = k3 < 0 ? Blocks.OBSIDIAN.defaultBlockState() : Blocks.AIR.defaultBlockState(); @@ -74,7 +86,7 @@ } } } -@@ -153,10 +_,20 @@ +@@ -153,10 +_,21 @@ for(int k2 = 0; k2 < 2; ++k2) { for(int l2 = 0; l2 < 3; ++l2) { blockpos$mutableblockpos.setWithOffset(blockpos, k2 * direction.getStepX(), l2, k2 * direction.getStepZ()); @@ -85,6 +97,7 @@ + // CraftBukkit start + org.bukkit.World bworld = this.level.getWorld(); ++ net.minecraft.world.entity.Entity entity = ketting$createPortal$entity.getAndSet(null); + org.bukkit.event.world.PortalCreateEvent event = new org.bukkit.event.world.PortalCreateEvent((java.util.List)blockList.getList(), bworld, (entity == null) ? null : entity.getBukkitEntity(), org.bukkit.event.world.PortalCreateEvent.CreateReason.NETHER_PAIR); + + this.level.getCraftServer().getPluginManager().callEvent(event); diff --git a/patches/minecraft/net/minecraft/world/level/portal/PortalInfo.java.patch b/patches/minecraft/net/minecraft/world/level/portal/PortalInfo.java.patch index f015f04b81..2efe344fee 100644 --- a/patches/minecraft/net/minecraft/world/level/portal/PortalInfo.java.patch +++ b/patches/minecraft/net/minecraft/world/level/portal/PortalInfo.java.patch @@ -1,19 +1,33 @@ --- a/net/minecraft/world/level/portal/PortalInfo.java +++ b/net/minecraft/world/level/portal/PortalInfo.java -@@ -7,7 +_,16 @@ +@@ -7,11 +_,29 @@ public final Vec3 speed; public final float yRot; public final float xRot; + //Ketting start -+ public net.minecraft.server.level.ServerLevel world; -+ public org.bukkit.craftbukkit.v1_20_R1.event.CraftPortalEvent portalEventInfo; ++ public @org.jetbrains.annotations.Nullable net.minecraft.server.level.ServerLevel world; ++ public @org.jetbrains.annotations.Nullable org.bukkit.craftbukkit.v1_20_R1.event.CraftPortalEvent portalEventInfo; ++ public static @org.jetbrains.annotations.Nullable net.minecraft.server.level.ServerLevel ketting$world; ++ public static @org.jetbrains.annotations.Nullable org.bukkit.craftbukkit.v1_20_R1.event.CraftPortalEvent ketting$portalEventInfo; ++ //Ketting end + public PortalInfo(Vec3 p_77681_, Vec3 p_77682_, float p_77683_, float p_77684_) { + this.pos = p_77681_; + this.speed = p_77682_; + this.yRot = p_77683_; + this.xRot = p_77684_; +- } ++ //Ketting start ++ this.world = ketting$world; ++ ketting$world = null; ++ this.portalEventInfo = ketting$portalEventInfo; ++ ketting$portalEventInfo = null; ++ } ++ + public PortalInfo(Vec3 p_77681_, Vec3 p_77682_, float p_77683_, float p_77684_, net.minecraft.server.level.ServerLevel world, org.bukkit.craftbukkit.v1_20_R1.event.CraftPortalEvent portalEventInfo) { + this(p_77681_, p_77682_, p_77683_, p_77684_); + this.world = world; + this.portalEventInfo = portalEventInfo; + } + //Ketting end - public PortalInfo(Vec3 p_77681_, Vec3 p_77682_, float p_77683_, float p_77684_) { - this.pos = p_77681_; - this.speed = p_77682_; + } diff --git a/patches/minecraft/net/minecraft/world/level/portal/PortalShape.java.patch b/patches/minecraft/net/minecraft/world/level/portal/PortalShape.java.patch index da91519b94..80d29c595b 100644 --- a/patches/minecraft/net/minecraft/world/level/portal/PortalShape.java.patch +++ b/patches/minecraft/net/minecraft/world/level/portal/PortalShape.java.patch @@ -60,14 +60,12 @@ } return 21; -@@ -166,10 +_,30 @@ +@@ -165,11 +_,29 @@ + return this.bottomLeft != null && this.width >= 2 && this.width <= 21 && this.height >= 3 && this.height <= 21; } ++ private boolean ketting$createPortalBlocks$result = false; public void createPortalBlocks() { -+ createPortalBlocksBoolean(); -+ } -+ // CraftBukkit start - return boolean -+ public boolean createPortalBlocksBoolean() { + org.bukkit.World bworld = this.level.getMinecraftWorld().getWorld(); + + // Copy below for loop @@ -81,32 +79,35 @@ + this.level.getMinecraftWorld().getServer().server.getPluginManager().callEvent(event); + + if (event.isCancelled()) { -+ return false; ++ ketting$createPortalBlocks$result = false; ++ return; + } + // CraftBukkit end BlockPos.betweenClosed(this.bottomLeft, this.bottomLeft.relative(Direction.UP, this.height - 1).relative(this.rightDir, this.width - 1)).forEach((p_77725_) -> { this.level.setBlock(p_77725_, blockstate, 18); }); -+ return true; // CraftBukkit ++ ketting$createPortalBlocks$result = true; // CraftBukkit } public boolean isComplete() { -@@ -202,6 +_,9 @@ +@@ -201,6 +_,11 @@ + return new Vec3(d2, d4, d3); } - public static PortalInfo createPortalInfo(ServerLevel p_259301_, BlockUtil.FoundRectangle p_259931_, Direction.Axis p_259901_, Vec3 p_259630_, Entity p_259166_, Vec3 p_260043_, float p_259853_, float p_259667_) { -+ return createPortalInfo(p_259301_, p_259931_, p_259901_, p_259630_, p_259166_, p_260043_, p_259853_, p_259667_, null); -+ } ++ private static final java.util.concurrent.atomic.AtomicReference ketting$createPortalInfo$portalEventInfo = new java.util.concurrent.atomic.AtomicReference<>(null); + public static PortalInfo createPortalInfo(ServerLevel p_259301_, BlockUtil.FoundRectangle p_259931_, Direction.Axis p_259901_, Vec3 p_259630_, Entity p_259166_, Vec3 p_260043_, float p_259853_, float p_259667_, org.bukkit.craftbukkit.v1_20_R1.event.CraftPortalEvent portalEventInfo) { // CraftBukkit ++ ketting$createPortalInfo$portalEventInfo.set(portalEventInfo); ++ return createPortalInfo(p_259301_, p_259931_, p_259901_, p_259630_, p_259166_, p_260043_, p_259853_, p_259667_); ++ } + public static PortalInfo createPortalInfo(ServerLevel p_259301_, BlockUtil.FoundRectangle p_259931_, Direction.Axis p_259901_, Vec3 p_259630_, Entity p_259166_, Vec3 p_260043_, float p_259853_, float p_259667_) { BlockPos blockpos = p_259931_.minCorner; BlockState blockstate = p_259301_.getBlockState(blockpos); - Direction.Axis direction$axis = blockstate.getOptionalValue(BlockStateProperties.HORIZONTAL_AXIS).orElse(Direction.Axis.X); -@@ -216,7 +_,7 @@ +@@ -216,6 +_,8 @@ boolean flag = direction$axis == Direction.Axis.X; Vec3 vec31 = new Vec3((double)blockpos.getX() + (flag ? d2 : d4), (double)blockpos.getY() + d3, (double)blockpos.getZ() + (flag ? d4 : d2)); Vec3 vec32 = findCollisionFreePosition(vec31, p_259301_, p_259166_, entitydimensions); -- return new PortalInfo(vec32, vec3, p_259853_ + (float)i, p_259667_); -+ return new PortalInfo(vec32, vec3, p_259853_ + (float)i, p_259667_, p_259301_, portalEventInfo); // CraftBukkit); ++ PortalInfo.ketting$portalEventInfo = ketting$createPortalInfo$portalEventInfo.getAndSet(null); //Ketting - pass CB values ++ PortalInfo.ketting$world = p_259301_; //Ketting - pass CB values + return new PortalInfo(vec32, vec3, p_259853_ + (float)i, p_259667_); } - private static Vec3 findCollisionFreePosition(Vec3 p_260315_, ServerLevel p_259704_, Entity p_259626_, EntityDimensions p_259816_) { diff --git a/patches/minecraft/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java.patch b/patches/minecraft/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java.patch index c762cae85c..3634999240 100644 --- a/patches/minecraft/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java.patch +++ b/patches/minecraft/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java.patch @@ -80,25 +80,26 @@ p_77956_.putInt("xCenter", this.centerX); p_77956_.putInt("zCenter", this.centerZ); p_77956_.putByte("scale", this.scale); -@@ -448,7 +_,7 @@ - this.player = p_77970_; +@@ -464,20 +_,47 @@ + return new MapItemSavedData.MapPatch(i, j, k, l, abyte); } -- private MapItemSavedData.MapPatch createPatch() { + private MapItemSavedData.MapPatch createPatch(byte[] buffer) { // CraftBukkit - int i = this.minDirtyX; - int j = this.minDirtyY; - int k = this.maxDirtyX + 1 - this.minDirtyX; -@@ -457,7 +_,7 @@ - - for(int i1 = 0; i1 < k; ++i1) { - for(int j1 = 0; j1 < l; ++j1) { -- abyte[i1 + j1 * k] = MapItemSavedData.this.colors[i + i1 + (j + j1) * 128]; ++ int i = this.minDirtyX; ++ int j = this.minDirtyY; ++ int k = this.maxDirtyX + 1 - this.minDirtyX; ++ int l = this.maxDirtyY + 1 - this.minDirtyY; ++ byte[] abyte = new byte[k * l]; ++ ++ for(int i1 = 0; i1 < k; ++i1) { ++ for(int j1 = 0; j1 < l; ++j1) { + abyte[i1 + j1 * k] = buffer[i + i1 + (j + j1) * 128]; // CraftBukkit - } - } - -@@ -467,17 +_,28 @@ ++ } ++ } ++ ++ return new MapItemSavedData.MapPatch(i, j, k, l, abyte); ++ } ++ @Nullable Packet nextUpdatePacket(int p_164816_) { MapItemSavedData.MapPatch mapitemsaveddata$mappatch; diff --git a/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch b/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch index e79cd34dc2..749ba99245 100644 --- a/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch +++ b/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch @@ -9,41 +9,50 @@ return Pair.of(primaryleveldata, worlddimensions$complete); }; } -@@ -334,24 +_,52 @@ +@@ -333,18 +_,42 @@ + return this.backupDir; } - public LevelStorageSource.LevelStorageAccess validateAndCreateAccess(String p_289980_) throws IOException, ContentValidationException { -+ return this.validateAndCreateAccess(p_289980_, null); ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference> ketting$validateAndCreateAccess$dimensionType = new java.util.concurrent.atomic.AtomicReference<>(null); ++ public LevelStorageSource.LevelStorageAccess validateAndCreateAccess(String p_289980_, ResourceKey dimensionType) throws IOException, ContentValidationException { ++ ketting$validateAndCreateAccess$dimensionType.set(dimensionType); ++ return validateAndCreateAccess(p_289980_); + } ++ //Ketting end + -+ public LevelStorageSource.LevelStorageAccess validateAndCreateAccess(String p_289980_, ResourceKey dimensionType) throws IOException, ContentValidationException { // CraftBukkit + public LevelStorageSource.LevelStorageAccess validateAndCreateAccess(String p_289980_) throws IOException, ContentValidationException { Path path = this.getLevelPath(p_289980_); List list = this.worldDirValidator.validateSave(path, true); if (!list.isEmpty()) { throw new ContentValidationException(path, list); } else { -- return new LevelStorageSource.LevelStorageAccess(p_289980_, path); -+ return new LevelStorageSource.LevelStorageAccess(p_289980_, path, dimensionType); // CraftBukkit ++ LevelStorageAccess.ketting$dimensionType = ketting$validateAndCreateAccess$dimensionType.getAndSet(null); + return new LevelStorageSource.LevelStorageAccess(p_289980_, path); } } -+ + + //Ketting start - try merging both world systems + public LevelStorageSource.LevelStorageAccess deriveFromSource(LevelStorageSource.LevelStorageAccess source, ResourceKey dimensionType) throws IOException { + return new LevelStorageSource.LevelStorageAccess(source, dimensionType); + } -+ //Ketting end - - public LevelStorageSource.LevelStorageAccess createAccess(String p_78261_) throws IOException { -+ return this.createAccess(p_78261_, null); -+ } + ++ public final java.util.concurrent.atomic.AtomicReference> ketting$createAccess$dimensionType = new java.util.concurrent.atomic.AtomicReference<>(null); ++ ++ @SuppressWarnings("unused") //Ketting - CB compat + public LevelStorageSource.LevelStorageAccess createAccess(String p_78261_, ResourceKey dimensionType) throws IOException { // CraftBukkit ++ ketting$createAccess$dimensionType.set(dimensionType); ++ return this.createAccess(p_78261_); ++ } ++ //Ketting end ++ + public LevelStorageSource.LevelStorageAccess createAccess(String p_78261_) throws IOException { Path path = this.getLevelPath(p_78261_); -- return new LevelStorageSource.LevelStorageAccess(p_78261_, path); -+ return new LevelStorageSource.LevelStorageAccess(p_78261_, path, dimensionType); // CraftBukkit ++ LevelStorageAccess.ketting$dimensionType = ketting$createAccess$dimensionType.getAndSet(null); //Ketting + return new LevelStorageSource.LevelStorageAccess(p_78261_, path); } - public DirectoryValidator getWorldDirValidator() { +@@ -352,6 +_,20 @@ return this.worldDirValidator; } @@ -64,23 +73,33 @@ public static record LevelCandidates(List levels) implements Iterable { public boolean isEmpty() { return this.levels.isEmpty(); -@@ -397,9 +_,34 @@ +@@ -397,12 +_,45 @@ public final LevelStorageSource.LevelDirectory levelDirectory; private final String levelId; private final Map resources = Maps.newHashMap(); -- -- LevelStorageAccess(String p_289967_, Path p_289988_) throws IOException { + // CraftBukkit start -+ public ResourceKey dimensionType; ++ public @Nullable ResourceKey dimensionType; + + //Ketting start ++ public static @Nullable ResourceKey ketting$dimensionType; + public final Path dimensionPath; + + public void setDimensionType(ResourceKey dimensionType) { + this.dimensionType = dimensionType; + } + //Ketting end -+ + + LevelStorageAccess(String p_289967_, Path p_289988_) throws IOException { + this.levelId = p_289967_; + this.levelDirectory = new LevelStorageSource.LevelDirectory(p_289988_); + this.lock = DirectoryLock.create(p_289988_); +- } ++ //Ketting start ++ this.dimensionPath = p_289988_; ++ this.dimensionType = ketting$dimensionType; ++ ketting$dimensionType = null; ++ } ++ + //Ketting start + LevelStorageAccess(LevelStorageAccess original, ResourceKey dimensionType) { + this.dimensionType = dimensionType; @@ -91,16 +110,16 @@ + this.lock = original.lock; + this.resources.putAll(original.resources); + } -+ //Ketting end -+ ++ @SuppressWarnings("unused") //Ketting - keep for CB compat + LevelStorageAccess(String p_289967_, Path p_289988_, ResourceKey dimensionType) throws IOException { ++ this(p_289967_, p_289988_); + this.dimensionType = dimensionType; -+ // CraftBukkit end - this.levelId = p_289967_; -+ this.dimensionPath = p_289988_; //Ketting - this.levelDirectory = new LevelStorageSource.LevelDirectory(p_289988_); - this.lock = DirectoryLock.create(p_289988_); - } ++ } ++ //Ketting end ++ + + public String getLevelId() { + return this.levelId; @@ -413,7 +_,7 @@ } diff --git a/patches/minecraft/net/minecraft/world/level/storage/loot/LootTable.java.patch b/patches/minecraft/net/minecraft/world/level/storage/loot/LootTable.java.patch index 8c8c9fd0a6..07723fe841 100644 --- a/patches/minecraft/net/minecraft/world/level/storage/loot/LootTable.java.patch +++ b/patches/minecraft/net/minecraft/world/level/storage/loot/LootTable.java.patch @@ -71,28 +71,31 @@ } for(int j = 0; j < this.functions.length; ++j) { -@@ -132,9 +_,24 @@ +@@ -131,10 +_,27 @@ + } - public void fill(Container p_287662_, LootParams p_287743_, long p_287585_) { -+ // CraftBukkit start -+ this.fillInventory(p_287662_, p_287743_, p_287585_, false); -+ } -+ ++ private final java.util.concurrent.atomic.AtomicBoolean ketting$fill$plugin = new java.util.concurrent.atomic.AtomicBoolean(false); + public void fillInventory(Container p_287662_, LootParams p_287743_, long p_287585_, boolean plugin) { -+ // CraftBukkit end ++ ketting$fill$plugin.set(plugin); ++ fill(p_287662_, p_287743_, p_287585_); ++ } + public void fill(Container p_287662_, LootParams p_287743_, long p_287585_) { LootContext lootcontext = (new LootContext.Builder(p_287743_)).withOptionalRandomSeed(p_287585_).create(this.randomSequence); ObjectArrayList objectarraylist = this.getRandomItems(lootcontext); RandomSource randomsource = lootcontext.getRandom(); + if (!p_287743_.empty) { //Ketting - don't fire event if empty + // CraftBukkit start -+ org.bukkit.event.world.LootGenerateEvent event = org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callLootGenerateEvent(p_287662_, this, lootcontext, objectarraylist, plugin); ++ org.bukkit.event.world.LootGenerateEvent event = org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callLootGenerateEvent(p_287662_, this, lootcontext, objectarraylist, ketting$fill$plugin.getAndSet(false)); + if (event.isCancelled()) { + return; + } + objectarraylist = event.getLoot().stream().map(org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack::asNMSCopy).collect(ObjectArrayList.toList()); + // CraftBukkit end -+ } //Ketting ++ } else { ++ ketting$fill$plugin.set(false); //don't skip reset ++ } ++ //Ketting List list = this.getAvailableSlots(p_287662_, randomsource); this.shuffleAndSplitItems(objectarraylist, list.size(), randomsource); diff --git a/patches/minecraft/net/minecraft/world/level/storage/loot/predicates/LootItemRandomChanceWithLootingCondition.java.patch b/patches/minecraft/net/minecraft/world/level/storage/loot/predicates/LootItemRandomChanceWithLootingCondition.java.patch index 86b7f3f028..6051f5acbc 100644 --- a/patches/minecraft/net/minecraft/world/level/storage/loot/predicates/LootItemRandomChanceWithLootingCondition.java.patch +++ b/patches/minecraft/net/minecraft/world/level/storage/loot/predicates/LootItemRandomChanceWithLootingCondition.java.patch @@ -1,22 +1,16 @@ --- a/net/minecraft/world/level/storage/loot/predicates/LootItemRandomChanceWithLootingCondition.java +++ b/net/minecraft/world/level/storage/loot/predicates/LootItemRandomChanceWithLootingCondition.java -@@ -31,11 +_,16 @@ - } - - public boolean test(LootContext p_81967_) { -- Entity entity = p_81967_.getParamOrNull(LootContextParams.KILLER_ENTITY); -+ Entity entity = (Entity) p_81967_.getParamOrNull(LootContextParams.KILLER_ENTITY); - int i = 0; +@@ -36,6 +_,13 @@ if (entity instanceof LivingEntity) { -- i = EnchantmentHelper.getMobLooting((LivingEntity)entity); -- } -+ i = EnchantmentHelper.getMobLooting((LivingEntity) entity); -+ } + i = EnchantmentHelper.getMobLooting((LivingEntity)entity); + } + // CraftBukkit start - only use lootingModifier if set by Bukkit + if (p_81967_.hasParam(LootContextParams.LOOTING_MOD)) { + i = p_81967_.getParamOrNull(LootContextParams.LOOTING_MOD); + } + // CraftBukkit end ++ //Todo: this doesn't match forge. There's not much we can do about it though. ++ // Either we make it correct for CB or for Forge. return p_81967_.getRandom().nextFloat() < this.percent + (float)i * this.lootingMultiplier; } diff --git a/src/main/java/org/bukkit/craftbukkit/v1_20_R1/boss/CraftDragonBattle.java b/src/main/java/org/bukkit/craftbukkit/v1_20_R1/boss/CraftDragonBattle.java index b8c72efd7c..9db237cf78 100644 --- a/src/main/java/org/bukkit/craftbukkit/v1_20_R1/boss/CraftDragonBattle.java +++ b/src/main/java/org/bukkit/craftbukkit/v1_20_R1/boss/CraftDragonBattle.java @@ -89,7 +89,7 @@ public boolean initiateRespawn(Collection list) { }); this.handle.respawnDragon(list.stream().map(enderCrystal -> ((CraftEnderCrystal) enderCrystal).getHandle()).collect(Collectors.toList())); - return this.handle.respawnDragon$returnValue; + return this.handle.ketting$respawnDragon$returnValue; } return false; } diff --git a/src/main/java/org/bukkit/craftbukkit/v1_20_R1/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/v1_20_R1/event/CraftEventFactory.java index 42794f2134..3acfc7083e 100644 --- a/src/main/java/org/bukkit/craftbukkit/v1_20_R1/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/v1_20_R1/event/CraftEventFactory.java @@ -842,6 +842,7 @@ public static boolean handleBlockSpreadEvent(Level world, BlockPos source, Block public static AtomicBoolean handleBlockSpreadUpdate = new AtomicBoolean(true); // Ketting public static boolean handleBlockSpreadEvent(LevelAccessor world, BlockPos source, BlockPos target, net.minecraft.world.level.block.state.BlockState block, int flag) { + if (source == null) return true; //Ketting // Suppress during worldgen if (!(world instanceof Level)) { world.setBlock(target, block, flag); @@ -1256,6 +1257,7 @@ public static boolean callHorseJumpEvent(Entity horse, float power) { } public static boolean callEntityChangeBlockEvent(Entity entity, BlockPos position, net.minecraft.world.level.block.state.BlockState newBlock) { + if (entity == null) return true; //Ketting return callEntityChangeBlockEvent(entity, position, newBlock, false); } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 1f803c3d8b..1b9838bfa3 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -678,7 +678,7 @@ public net.minecraft.world.level.dimension.end.EndDragonFight m_64087_(Lnet/mine public net.minecraft.world.level.dimension.end.EndDragonFight m_64105_()Lnet/minecraft/world/level/block/state/pattern/BlockPattern$BlockPatternMatch; # findExitPortal public net.minecraft.world.level.dimension.end.EndDragonFight m_64093_(Z)V # spawnExitPortal public net.minecraft.world.level.biome.Biome m_47505_(Lnet/minecraft/core/BlockPos;)F # getTemperature -public-f net.minecraft.world.level.chunk.ChunkGenerator f_62137_ # biomeSource +protected-f net.minecraft.world.level.chunk.ChunkGenerator f_62137_ # biomeSource public net.minecraft.world.level.chunk.ChunkAccess f_187608_ # heightmaps public net.minecraft.world.level.chunk.ChunkAccess f_187610_ # blockEntities public net.minecraft.world.level.chunk.storage.ChunkSerializer f_188227_ # BLOCK_STATE_CODEC @@ -973,4 +973,49 @@ public net.minecraft.network.Connection f_129469_ # address public net.minecraft.world.CompoundContainer f_18910_ # container1 public net.minecraft.world.CompoundContainer f_18911_ # container2 + +default net.minecraft.world.level.LevelAccessor m_186482_(Lnet/minecraft/core/BlockPos;Ljava/lang/Object;ILnet/minecraft/world/ticks/TickPriority;)Lnet/minecraft/world/ticks/ScheduledTick; # createTick +default net.minecraft.world.level.LevelAccessor m_186478_(Lnet/minecraft/core/BlockPos;Ljava/lang/Object;I)Lnet/minecraft/world/ticks/ScheduledTick; # createTick +public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager m_230404_(Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate; # readStructure +public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate f_74482_ # palettes +public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate f_74483_ # entityInfoList + +public net.minecraft.world.level.levelgen.structure.placement.StructurePlacement f_227022_ # locateOffset +public net.minecraft.world.level.levelgen.structure.placement.StructurePlacement f_227023_ # frequencyReductionMethod +public net.minecraft.world.level.levelgen.structure.placement.StructurePlacement f_227024_ # frequency +public net.minecraft.world.level.levelgen.structure.placement.StructurePlacement f_227025_ # salt +public net.minecraft.world.level.levelgen.structure.placement.StructurePlacement f_227026_ # exclusionZone + +public net.minecraft.world.level.dimension.end.EndDragonFight m_64091_(Ljava/util/List;)V # respawnDragon + +public net.minecraft.world.level.block.DispenserBlock f_52661_ # DISPENSER_REGISTRY + +public net.minecraft.world.level.block.state.properties.IntegerProperty f_223000_ # min +public net.minecraft.world.level.block.state.properties.IntegerProperty f_223001_ # max + +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59813_ # author +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59814_ # metaData +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59815_ # structurePos +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59816_ # structureSize +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59817_ # mirror +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59818_ # rotation +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59819_ # mode +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59820_ # ignoreEntities +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59822_ # showAir +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59823_ # showBoundingBox +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59824_ # integrity +public net.minecraft.world.level.block.entity.StructureBlockEntity f_59825_ # seed + +public net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity f_59605_ # lootTable +public net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity f_59606_ # lootTableSeed + +public net.minecraft.world.level.block.entity.JukeboxBlockEntity f_238695_ # tickCount +public net.minecraft.world.level.block.entity.JukeboxBlockEntity f_238572_ # recordStartedTick +public net.minecraft.world.level.block.entity.JukeboxBlockEntity f_238637_ # isPlaying + +public net.minecraft.world.level.block.entity.CampfireBlockEntity f_59043_ # cookingProgress +public net.minecraft.world.level.block.entity.CampfireBlockEntity f_59044_ # cookingTime + +public net.minecraft.world.level.block.entity.BellBlockEntity f_58818_ # resonating +public net.minecraft.world.level.block.entity.BellBlockEntity f_58819_ # resonationTicks #endgroup KETTING \ No newline at end of file From f9496ce4e3e4786c95d46d432d2bbefd9ae16fa3 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Tue, 19 Mar 2024 07:35:17 +0100 Subject: [PATCH 10/21] Rewrite net/minecraft/level/item --- .../world/item/DebugStickItem.java.patch | 6 +-- .../minecraft/world/item/LeadItem.java.patch | 39 ++++++++++--------- .../crafting/StonecutterRecipe.java.patch | 12 ------ .../item/trading/MerchantOffer.java.patch | 28 ++----------- .../level/block/MultifaceSpreader.java.patch | 5 ++- .../v1_20_R1/event/CraftEventFactory.java | 1 + .../resources/META-INF/accesstransformer.cfg | 12 ++++++ 7 files changed, 44 insertions(+), 59 deletions(-) diff --git a/patches/minecraft/net/minecraft/world/item/DebugStickItem.java.patch b/patches/minecraft/net/minecraft/world/item/DebugStickItem.java.patch index 142f61e0f4..43acb06c18 100644 --- a/patches/minecraft/net/minecraft/world/item/DebugStickItem.java.patch +++ b/patches/minecraft/net/minecraft/world/item/DebugStickItem.java.patch @@ -1,12 +1,10 @@ --- a/net/minecraft/world/item/DebugStickItem.java +++ b/net/minecraft/world/item/DebugStickItem.java -@@ -49,8 +_,8 @@ - return InteractionResult.sidedSuccess(level.isClientSide); +@@ -50,7 +_,7 @@ } -- private boolean handleInteraction(Player p_150803_, BlockState p_150804_, LevelAccessor p_150805_, BlockPos p_150806_, boolean p_150807_, ItemStack p_150808_) { + public boolean handleInteraction(Player p_150803_, BlockState p_150804_, LevelAccessor p_150805_, BlockPos p_150806_, boolean p_150807_, ItemStack p_150808_) { - if (!p_150803_.canUseGameMasterBlocks()) { -+ public boolean handleInteraction(Player p_150803_, BlockState p_150804_, LevelAccessor p_150805_, BlockPos p_150806_, boolean p_150807_, ItemStack p_150808_) { + if (!p_150803_.canUseGameMasterBlocks() && !(p_150803_.getAbilities().instabuild && p_150803_.getBukkitEntity().hasPermission("minecraft.debugstick")) && !p_150803_.getBukkitEntity().hasPermission("minecraft.debugstick.always")) { // Spigot return false; } else { diff --git a/patches/minecraft/net/minecraft/world/item/LeadItem.java.patch b/patches/minecraft/net/minecraft/world/item/LeadItem.java.patch index 8bdddcb393..0e95ab2019 100644 --- a/patches/minecraft/net/minecraft/world/item/LeadItem.java.patch +++ b/patches/minecraft/net/minecraft/world/item/LeadItem.java.patch @@ -1,35 +1,41 @@ --- a/net/minecraft/world/item/LeadItem.java +++ b/net/minecraft/world/item/LeadItem.java -@@ -24,7 +_,7 @@ +@@ -24,6 +_,7 @@ if (blockstate.is(BlockTags.FENCES)) { Player player = p_42834_.getPlayer(); if (!level.isClientSide && player != null) { -- bindPlayerMobs(player, level, blockpos); -+ bindPlayerMobs(player, level, blockpos, p_42834_.getHand()); // CraftBukkit - Pass hand ++ ketting$bindPlayerMobs$interactionHand.set(p_42834_.getHand());// Ketting - CraftBukkit - Pass hand + bindPlayerMobs(player, level, blockpos); } - return InteractionResult.sidedSuccess(level.isClientSide); -@@ -33,7 +_,7 @@ +@@ -33,6 +_,14 @@ } } -- public static InteractionResult bindPlayerMobs(Player p_42830_, Level p_42831_, BlockPos p_42832_) { -+ public static InteractionResult bindPlayerMobs(Player p_42830_, Level p_42831_, BlockPos p_42832_, net.minecraft.world.InteractionHand interactionHand) { // CraftBukkit - Add InteractionHand ++ //Ketting start ++ public static final java.util.concurrent.atomic.AtomicReference ketting$bindPlayerMobs$interactionHand = new java.util.concurrent.atomic.AtomicReference<>(net.minecraft.world.InteractionHand.MAIN_HAND); ++ @SuppressWarnings("unused") //Ketting - CB compat ++ public static InteractionResult bindPlayerMobs(Player p_42830_, Level p_42831_, BlockPos p_42832_, net.minecraft.world.InteractionHand interactionHand) { ++ ketting$bindPlayerMobs$interactionHand.set(interactionHand); ++ return bindPlayerMobs(p_42830_, p_42831_, p_42832_); ++ } ++ //Ketting end + public static InteractionResult bindPlayerMobs(Player p_42830_, Level p_42831_, BlockPos p_42832_) { LeashFenceKnotEntity leashfenceknotentity = null; boolean flag = false; - double d0 = 7.0D; -@@ -45,9 +_,26 @@ +@@ -45,9 +_,27 @@ if (mob.getLeashHolder() == p_42830_) { if (leashfenceknotentity == null) { leashfenceknotentity = LeashFenceKnotEntity.getOrCreateKnot(p_42831_, p_42832_); + + // CraftBukkit start - fire HangingPlaceEvent -+ org.bukkit.inventory.EquipmentSlot hand = org.bukkit.craftbukkit.v1_20_R1.CraftEquipmentSlot.getHand(interactionHand); ++ org.bukkit.inventory.EquipmentSlot hand = org.bukkit.craftbukkit.v1_20_R1.CraftEquipmentSlot.getHand(ketting$bindPlayerMobs$interactionHand.get());//Ketting + org.bukkit.event.hanging.HangingPlaceEvent event = new org.bukkit.event.hanging.HangingPlaceEvent((org.bukkit.entity.Hanging) leashfenceknotentity.getBukkitEntity(), p_42830_ != null ? (org.bukkit.entity.Player) p_42830_.getBukkitEntity() : null, p_42831_.getWorld().getBlockAt(i, j, k), org.bukkit.block.BlockFace.SELF, hand); + p_42831_.getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + leashfenceknotentity.discard(); ++ ketting$bindPlayerMobs$interactionHand.set(null); + return InteractionResult.PASS; + } + // CraftBukkit end @@ -37,7 +43,7 @@ } + // CraftBukkit start -+ if (org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callPlayerLeashEntityEvent(mob, leashfenceknotentity, p_42830_, interactionHand).isCancelled()) { ++ if (org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callPlayerLeashEntityEvent(mob, leashfenceknotentity, p_42830_, ketting$bindPlayerMobs$interactionHand.get()).isCancelled()) { + continue; + } + // CraftBukkit end @@ -45,14 +51,11 @@ mob.setLeashedTo(leashfenceknotentity, true); flag = true; } -@@ -59,4 +_,10 @@ +@@ -57,6 +_,7 @@ + p_42831_.gameEvent(GameEvent.BLOCK_ATTACH, p_42832_, GameEvent.Context.of(p_42830_)); + } ++ ketting$bindPlayerMobs$interactionHand.set(net.minecraft.world.InteractionHand.MAIN_HAND); //Ketting return flag ? InteractionResult.SUCCESS : InteractionResult.PASS; } -+ -+ // CraftBukkit start -+ public static InteractionResult bindPlayerMobs(Player p_42830_, Level p_42831_, BlockPos p_42832_) { -+ return bindPlayerMobs(p_42830_, p_42831_, p_42832_, net.minecraft.world.InteractionHand.MAIN_HAND); -+ } -+ // CraftBukkit end } diff --git a/patches/minecraft/net/minecraft/world/item/crafting/StonecutterRecipe.java.patch b/patches/minecraft/net/minecraft/world/item/crafting/StonecutterRecipe.java.patch index 6a2bbade69..602b9068c0 100644 --- a/patches/minecraft/net/minecraft/world/item/crafting/StonecutterRecipe.java.patch +++ b/patches/minecraft/net/minecraft/world/item/crafting/StonecutterRecipe.java.patch @@ -1,17 +1,5 @@ --- a/net/minecraft/world/item/crafting/StonecutterRecipe.java +++ b/net/minecraft/world/item/crafting/StonecutterRecipe.java -@@ -7,9 +_,11 @@ - import net.minecraft.world.level.block.Blocks; - - public class StonecutterRecipe extends SingleItemRecipe { -+ //Ketting start - public StonecutterRecipe(ResourceLocation p_44478_, String p_44479_, Ingredient p_44480_, ItemStack p_44481_) { - super(RecipeType.STONECUTTING, RecipeSerializer.STONECUTTER, p_44478_, p_44479_, p_44480_, p_44481_); - } -+ //Ketting end - - public boolean matches(Container p_44483_, Level p_44484_) { - return this.ingredient.test(p_44483_.getItem(0)); @@ -18,4 +_,16 @@ public ItemStack getToastSymbol() { return new ItemStack(Blocks.STONECUTTER); diff --git a/patches/minecraft/net/minecraft/world/item/trading/MerchantOffer.java.patch b/patches/minecraft/net/minecraft/world/item/trading/MerchantOffer.java.patch index f330c737c0..e0014951a5 100644 --- a/patches/minecraft/net/minecraft/world/item/trading/MerchantOffer.java.patch +++ b/patches/minecraft/net/minecraft/world/item/trading/MerchantOffer.java.patch @@ -1,29 +1,9 @@ --- a/net/minecraft/world/item/trading/MerchantOffer.java +++ b/net/minecraft/world/item/trading/MerchantOffer.java -@@ -6,16 +_,32 @@ - import net.minecraft.world.item.ItemStack; - - public class MerchantOffer { -- private final ItemStack baseCostA; -- private final ItemStack costB; -- private final ItemStack result; -- private int uses; -- private final int maxUses; -- private boolean rewardExp = true; -- private int specialPriceDiff; -- private int demand; -- private float priceMultiplier; -- private int xp = 1; -+ public ItemStack baseCostA; -+ public ItemStack costB; -+ public final ItemStack result; -+ public int uses; -+ public int maxUses; -+ public boolean rewardExp = true; -+ public int specialPriceDiff; -+ public int demand; -+ public float priceMultiplier; -+ public int xp = 1; +@@ -16,6 +_,22 @@ + public int demand; + public float priceMultiplier; + public int xp = 1; + // CraftBukkit start + private org.bukkit.craftbukkit.v1_20_R1.inventory.CraftMerchantRecipe bukkitHandle; + diff --git a/patches/minecraft/net/minecraft/world/level/block/MultifaceSpreader.java.patch b/patches/minecraft/net/minecraft/world/level/block/MultifaceSpreader.java.patch index 12f0eae166..cd8084118b 100644 --- a/patches/minecraft/net/minecraft/world/level/block/MultifaceSpreader.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/MultifaceSpreader.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/MultifaceSpreader.java +++ b/net/minecraft/world/level/block/MultifaceSpreader.java -@@ -136,14 +_,16 @@ +@@ -136,14 +_,19 @@ p_221702_.getChunk(p_221703_.pos()).markPosForPostprocessing(p_221703_.pos()); } @@ -16,6 +16,9 @@ - public static record SpreadPos(BlockPos pos, Direction face) { + //Ketting - Todo: How do we fix this? Let's wait for an error to come around. + public static record SpreadPos(BlockPos pos, Direction face, BlockPos source) { // CraftBukkit ++ public SpreadPos(BlockPos pos, Direction face){ ++ this(pos, face, null); ++ } } @FunctionalInterface diff --git a/src/main/java/org/bukkit/craftbukkit/v1_20_R1/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/v1_20_R1/event/CraftEventFactory.java index 3acfc7083e..54e6bf77e4 100644 --- a/src/main/java/org/bukkit/craftbukkit/v1_20_R1/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/v1_20_R1/event/CraftEventFactory.java @@ -1493,6 +1493,7 @@ public static PlayerUnleashEntityEvent callPlayerUnleashEntityEvent(Mob entity, public static PlayerLeashEntityEvent callPlayerLeashEntityEvent(Mob entity, Entity leashHolder, net.minecraft.world.entity.player.Player player, InteractionHand enumhand) { PlayerLeashEntityEvent event = new PlayerLeashEntityEvent(entity.getBukkitEntity(), leashHolder.getBukkitEntity(), (Player) player.getBukkitEntity(), CraftEquipmentSlot.getHand(enumhand)); + if (enumhand != null) //Ketting entity.level().getCraftServer().getPluginManager().callEvent(event); return event; } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 1b9838bfa3..2571228625 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1018,4 +1018,16 @@ public net.minecraft.world.level.block.entity.CampfireBlockEntity f_59044_ # coo public net.minecraft.world.level.block.entity.BellBlockEntity f_58818_ # resonating public net.minecraft.world.level.block.entity.BellBlockEntity f_58819_ # resonationTicks +public net.minecraft.world.item.DebugStickItem m_150802_(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;ZLnet/minecraft/world/item/ItemStack;)Z # handleInteraction + +public-f net.minecraft.world.item.trading.MerchantOffer f_45310_ # baseCostA +public-f net.minecraft.world.item.trading.MerchantOffer f_45311_ # costB +public net.minecraft.world.item.trading.MerchantOffer f_45312_ # result +public net.minecraft.world.item.trading.MerchantOffer f_45313_ # uses +public-f net.minecraft.world.item.trading.MerchantOffer f_45314_ # maxUses +public net.minecraft.world.item.trading.MerchantOffer f_45315_ # rewardExp +public net.minecraft.world.item.trading.MerchantOffer f_45316_ # specialPriceDiff +public net.minecraft.world.item.trading.MerchantOffer f_45317_ # demand +public net.minecraft.world.item.trading.MerchantOffer f_45318_ # priceMultiplier +public net.minecraft.world.item.trading.MerchantOffer f_45319_ # xp #endgroup KETTING \ No newline at end of file From 4e076ca05d1675ddbb3f5091c5deb9f971e321ff Mon Sep 17 00:00:00 2001 From: JustRed23 Date: Tue, 19 Mar 2024 12:05:12 +0100 Subject: [PATCH 11/21] Finish world conversion system --- .../server/MinecraftServer.java.patch | 16 +++-- .../storage/LevelStorageSource.java.patch | 70 +++++++++++++++++-- .../ketting/config/KettingConfig.java | 2 +- .../ketting/utils/WorldSystemConverter.java | 70 +++++++++++++++++++ 4 files changed, 145 insertions(+), 13 deletions(-) create mode 100644 src/main/java/org/kettingpowered/ketting/utils/WorldSystemConverter.java diff --git a/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch b/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch index 99ff8457fe..9dadd78827 100644 --- a/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch +++ b/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch @@ -139,7 +139,7 @@ if (!serverleveldata.isInitialized()) { try { setInitialSpawn(serverlevel, serverleveldata, worldoptions.generateBonusChest(), flag); -@@ -373,9 +_,57 @@ +@@ -373,9 +_,63 @@ if (resourcekey != LevelStem.OVERWORLD) { ResourceKey resourcekey1 = ResourceKey.create(Registries.DIMENSION, resourcekey.location()); DerivedLevelData derivedleveldata = new DerivedLevelData(this.worldData, serverleveldata); @@ -172,10 +172,16 @@ + + LevelStorageSource.LevelStorageAccess source; + try { -+ if (org.kettingpowered.ketting.config.KettingConfig.getInstance().MERGE_WORLD_SYSTEMS.getValue()) -+ source = this.storageSource.reference.deriveFromSource(this.storageSource, resourcekey); -+ else -+ source = LevelStorageSource.createDefault(server.getWorldContainer().toPath()).validateAndCreateAccess(name, resourcekey); ++ source = LevelStorageSource.createDefault(server.getWorldContainer().toPath()).validateAndCreateAccess(name, resourcekey); ++ ++ if (org.kettingpowered.ketting.config.KettingConfig.getInstance().MERGE_WORLD_SYSTEMS.getValue()) { ++ LevelStorageSource.LevelStorageAccess newSource = this.storageSource.reference.deriveFromSource(this.storageSource, resourcekey); ++ ++ if (org.kettingpowered.ketting.utils.WorldSystemConverter.needsConversion(source, resourcekey1)) ++ org.kettingpowered.ketting.utils.WorldSystemConverter.convert(source, newSource, resourcekey1); ++ ++ source = newSource; ++ } + } catch (IOException | net.minecraft.world.level.validation.ContentValidationException e) { + throw new RuntimeException(e); + } diff --git a/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch b/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch index 749ba99245..ae30318e3a 100644 --- a/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch +++ b/patches/minecraft/net/minecraft/world/level/storage/LevelStorageSource.java.patch @@ -73,7 +73,7 @@ public static record LevelCandidates(List levels) implements Iterable { public boolean isEmpty() { return this.levels.isEmpty(); -@@ -397,12 +_,45 @@ +@@ -397,12 +_,42 @@ public final LevelStorageSource.LevelDirectory levelDirectory; private final String levelId; private final Map resources = Maps.newHashMap(); @@ -82,7 +82,6 @@ + + //Ketting start + public static @Nullable ResourceKey ketting$dimensionType; -+ public final Path dimensionPath; + + public void setDimensionType(ResourceKey dimensionType) { + this.dimensionType = dimensionType; @@ -95,7 +94,6 @@ this.lock = DirectoryLock.create(p_289988_); - } + //Ketting start -+ this.dimensionPath = p_289988_; + this.dimensionType = ketting$dimensionType; + ketting$dimensionType = null; + } @@ -105,7 +103,6 @@ + this.dimensionType = dimensionType; + + this.levelId = original.levelId; -+ this.dimensionPath = original.dimensionPath; + this.levelDirectory = original.levelDirectory; + this.lock = original.lock; + this.resources.putAll(original.resources); @@ -169,16 +166,75 @@ public void deleteLevel() throws IOException { this.checkLock(); final Path path = this.levelDirectory.lockFile(); -@@ -569,6 +_,12 @@ +@@ -521,6 +_,58 @@ + } + ++ //Ketting start ++ public void deleteLevelSilent() throws IOException { ++ this.checkLock(); ++ final Path path = this.levelDirectory.lockFile(); ++ LevelStorageSource.LOGGER.debug("Deleting level {}", (Object)this.levelId); ++ ++ for(int i = 1; i <= 5; ++i) { ++ LevelStorageSource.LOGGER.debug("Attempt {}...", (int)i); ++ ++ try { ++ Files.walkFileTree(this.levelDirectory.path(), new SimpleFileVisitor() { ++ public FileVisitResult visitFile(Path p_78323_, BasicFileAttributes p_78324_) throws IOException { ++ if (!p_78323_.equals(path)) { ++ LevelStorageSource.LOGGER.debug("Deleting {}", (Object)p_78323_); ++ Files.delete(p_78323_); ++ } ++ ++ return FileVisitResult.CONTINUE; ++ } ++ ++ public FileVisitResult postVisitDirectory(Path p_78320_, @Nullable IOException p_78321_) throws IOException { ++ if (p_78321_ != null) { ++ throw p_78321_; ++ } else { ++ if (p_78320_.equals(LevelStorageAccess.this.levelDirectory.path())) { ++ LevelStorageAccess.this.lock.close(); ++ Files.deleteIfExists(path); ++ } ++ ++ Files.delete(p_78320_); ++ return FileVisitResult.CONTINUE; ++ } ++ } ++ }); ++ break; ++ } catch (IOException ioexception) { ++ if (i >= 5) { ++ throw ioexception; ++ } ++ ++ LevelStorageSource.LOGGER.debug("Failed to delete {}", this.levelDirectory.path(), ioexception); ++ ++ try { ++ Thread.sleep(500L); ++ } catch (InterruptedException interruptedexception) { ++ } ++ } ++ } ++ ++ } ++ //Ketting end ++ + public void renameLevel(String p_78298_) throws IOException { + this.checkLock(); + Path path = this.levelDirectory.dataFile(); +@@ -570,5 +_,12 @@ public void close() throws IOException { this.lock.close(); -+ } + } + + //Ketting start + public @Nullable LevelStorageSource reference; + public void setReference(LevelStorageSource levelstoragesource) { + this.reference = levelstoragesource; - } ++ } ++ //Ketting end } } diff --git a/src/main/java/org/kettingpowered/ketting/config/KettingConfig.java b/src/main/java/org/kettingpowered/ketting/config/KettingConfig.java index 9f9c685481..125ed4681d 100644 --- a/src/main/java/org/kettingpowered/ketting/config/KettingConfig.java +++ b/src/main/java/org/kettingpowered/ketting/config/KettingConfig.java @@ -41,6 +41,6 @@ public KettingConfig(@NotNull String fileName) { public final BooleanValue OVERWRITE_FORGE_PERMISSIONS = new BooleanValue("forge.overwrite_forge_permissions", false, "--- WARNING - THIS WILL COMPLETELY DISABLE FORGE PERMISSION CHECKS --- Overwrite Forge permissions with Bukkit permissions, makes it possible to use a permission manager plugin for modded commands. If true, Forge permissions will be set to 'forge.command.MODDEDCOMMAND' where MODDEDCOMMAND is the name of the modded command."); - public final BooleanValue MERGE_WORLD_SYSTEMS = new BooleanValue("ketting.merge_world_systems", false, "--- WARNING - THIS WILL BREAK EXISTING WORLDS --- If true, this will attempt to merge both the Forge and Bukkit world system into one, making dimensions exist in the world folder, and Bukkit worlds in their own folder."); + public final BooleanValue MERGE_WORLD_SYSTEMS = new BooleanValue("ketting.merge_world_systems", false, "If true, this will attempt to merge both the Forge and Bukkit world system into one, making dimensions exist in the world folder, and Bukkit worlds in their own folder."); //End of config values } diff --git a/src/main/java/org/kettingpowered/ketting/utils/WorldSystemConverter.java b/src/main/java/org/kettingpowered/ketting/utils/WorldSystemConverter.java new file mode 100644 index 0000000000..86e345a225 --- /dev/null +++ b/src/main/java/org/kettingpowered/ketting/utils/WorldSystemConverter.java @@ -0,0 +1,70 @@ +package org.kettingpowered.ketting.utils; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.LevelStorageSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; + +public final class WorldSystemConverter { + + private static final Logger LOGGER = LoggerFactory.getLogger(WorldSystemConverter.class); + + public static boolean needsConversion(LevelStorageSource.LevelStorageAccess oldSource, ResourceKey key) { + boolean ldExists = Files.exists(oldSource.levelDirectory.path(), LinkOption.NOFOLLOW_LINKS); + if (!ldExists) //Should always be true if the session lock exists, but just in case + return false; + + boolean dimExists = Files.exists(oldSource.getDimensionPath(key), LinkOption.NOFOLLOW_LINKS); + if (!dimExists) deleteOldWorld(oldSource); + + return dimExists; + } + + public static void convert(LevelStorageSource.LevelStorageAccess oldSource, LevelStorageSource.LevelStorageAccess newSource, ResourceKey key) { + LOGGER.warn("Converting world from old system to new system"); + + final Path oldSrc = oldSource.getDimensionPath(key); + final Path newSrc = newSource.getDimensionPath(key); + + LOGGER.debug("Old source: " + oldSrc); + LOGGER.debug("New source: " + newSrc); + + if (exists(newSource.levelDirectory.path()) && exists(newSrc)) { + LOGGER.warn("A dimension at '{}' already exists, aborting conversion", newSrc); + return; + } + + try { + if (!exists(newSrc.getParent())) + Files.createDirectories(newSrc.getParent()); + + Files.move(oldSrc, newSrc); + } catch (IOException e) { + LOGGER.error("Failed to move old world to new world", e); + return; + } + + deleteOldWorld(oldSource); + LOGGER.info("World conversion complete"); + } + + private static boolean exists(Path path) { + return Files.exists(path, LinkOption.NOFOLLOW_LINKS); + } + + private static void deleteOldWorld(LevelStorageSource.LevelStorageAccess oldSource) { + final String worldName = oldSource.getLevelId(); + try { + LOGGER.debug("Deleting old world '{}'", worldName); + oldSource.deleteLevelSilent(); + } catch (IOException e) { + LOGGER.error("Failed to delete old world, this error can be ignored... just manually delete '{}' in your server folder", worldName, e); + } + } +} From a01b7edecc6b522c2844e39367e91ed851388160 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Tue, 19 Mar 2024 07:57:50 +0100 Subject: [PATCH 12/21] Rewrite all of net/minecraft/level except entity --- .../world/effect/MobEffectUtil.java.patch | 18 +++++++------ .../entity/monster/ElderGuardian.java.patch | 7 +++--- .../entity/monster/warden/Warden.java.patch | 5 ++-- .../minecraft/world/food/FoodData.java.patch | 20 +++++---------- .../world/inventory/AnvilMenu.java.patch | 11 -------- .../inventory/FurnaceResultSlot.java.patch | 7 +++--- .../world/inventory/LecternMenu.java.patch | 8 ------ .../PlayerEnderChestContainer.java.patch | 4 +-- .../AbstractFurnaceBlockEntity.java.patch | 25 +++++++++++++------ .../resources/META-INF/accesstransformer.cfg | 7 ++++++ 10 files changed, 54 insertions(+), 58 deletions(-) diff --git a/patches/minecraft/net/minecraft/world/effect/MobEffectUtil.java.patch b/patches/minecraft/net/minecraft/world/effect/MobEffectUtil.java.patch index a2a929cb96..45a71cc755 100644 --- a/patches/minecraft/net/minecraft/world/effect/MobEffectUtil.java.patch +++ b/patches/minecraft/net/minecraft/world/effect/MobEffectUtil.java.patch @@ -1,21 +1,25 @@ --- a/net/minecraft/world/effect/MobEffectUtil.java +++ b/net/minecraft/world/effect/MobEffectUtil.java -@@ -44,11 +_,18 @@ +@@ -43,12 +_,22 @@ + return p_19589_.hasEffect(MobEffects.WATER_BREATHING) || p_19589_.hasEffect(MobEffects.CONDUIT_POWER); } - public static List addEffectToPlayersAround(ServerLevel p_216947_, @Nullable Entity p_216948_, Vec3 p_216949_, double p_216950_, MobEffectInstance p_216951_, int p_216952_) { -+ // CraftBukkit start -+ return addEffectToPlayersAround(p_216947_, p_216948_, p_216949_, p_216950_, p_216951_, p_216952_, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN); ++ //Ketting start ++ public static final java.util.concurrent.atomic.AtomicReference ketting$addEffectToPlayersAround$cause = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN); ++ @SuppressWarnings("unused") //Ketting - CB compat ++ public static List addEffectToPlayersAround(ServerLevel p_216947_, @Nullable Entity p_216948_, Vec3 p_216949_, double p_216950_, MobEffectInstance p_216951_, int p_216952_, org.bukkit.event.entity.EntityPotionEffectEvent.Cause cause) { ++ ketting$addEffectToPlayersAround$cause.set(cause); ++ return addEffectToPlayersAround(p_216947_, p_216948_, p_216949_, p_216950_, p_216951_, p_216952_); + } ++ //Ketting end + -+ public static List addEffectToPlayersAround(ServerLevel p_216947_, @Nullable Entity p_216948_, Vec3 p_216949_, double p_216950_, MobEffectInstance p_216951_, int p_216952_, org.bukkit.event.entity.EntityPotionEffectEvent.Cause cause) { -+ // CraftBukkit end + public static List addEffectToPlayersAround(ServerLevel p_216947_, @Nullable Entity p_216948_, Vec3 p_216949_, double p_216950_, MobEffectInstance p_216951_, int p_216952_) { MobEffect mobeffect = p_216951_.getEffect(); List list = p_216947_.getPlayers((p_267925_) -> { return p_267925_.gameMode.isSurvival() && (p_216948_ == null || !p_216948_.isAlliedTo(p_267925_)) && p_216949_.closerThan(p_267925_.position(), p_216950_) && (!p_267925_.hasEffect(mobeffect) || p_267925_.getEffect(mobeffect).getAmplifier() < p_216951_.getAmplifier() || p_267925_.getEffect(mobeffect).endsWithin(p_216952_ - 1)); }); list.forEach((p_238232_) -> { -+ p_238232_.prepareAddEffect(cause); //Ketting ++ p_238232_.prepareAddEffect(ketting$addEffectToPlayersAround$cause.getAndSet(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN)); //Ketting p_238232_.addEffect(new MobEffectInstance(p_216951_), p_216948_); }); return list; diff --git a/patches/minecraft/net/minecraft/world/entity/monster/ElderGuardian.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/ElderGuardian.java.patch index 4c55ff9035..97b61287d8 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/ElderGuardian.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/ElderGuardian.java.patch @@ -1,11 +1,10 @@ --- a/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/net/minecraft/world/entity/monster/ElderGuardian.java -@@ -60,7 +_,7 @@ +@@ -60,6 +_,7 @@ super.customServerAiStep(); if ((this.tickCount + this.getId()) % 1200 == 0) { MobEffectInstance mobeffectinstance = new MobEffectInstance(MobEffects.DIG_SLOWDOWN, 6000, 2); -- List list = MobEffectUtil.addEffectToPlayersAround((ServerLevel)this.level(), this, this.position(), 50.0D, mobeffectinstance, 1200); -+ List list = MobEffectUtil.addEffectToPlayersAround((ServerLevel)this.level(), this, this.position(), 50.0D, mobeffectinstance, 1200, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit ++ MobEffectUtil.ketting$addEffectToPlayersAround$cause.set(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // Ketting - CraftBukkit + List list = MobEffectUtil.addEffectToPlayersAround((ServerLevel)this.level(), this, this.position(), 50.0D, mobeffectinstance, 1200); list.forEach((p_289459_) -> { p_289459_.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.GUARDIAN_ELDER_EFFECT, this.isSilent() ? 0.0F : 1.0F)); - }); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/warden/Warden.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/warden/Warden.java.patch index 7fa915ac3c..5970397870 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/warden/Warden.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/warden/Warden.java.patch @@ -1,11 +1,12 @@ --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java -@@ -370,7 +_,7 @@ +@@ -370,7 +_,8 @@ public static void applyDarknessAround(ServerLevel p_219376_, Vec3 p_219377_, @Nullable Entity p_219378_, int p_219379_) { MobEffectInstance mobeffectinstance = new MobEffectInstance(MobEffects.DARKNESS, 260, 0, false, false); - MobEffectUtil.addEffectToPlayersAround(p_219376_, p_219378_, p_219377_, (double)p_219379_, mobeffectinstance, 200); -+ MobEffectUtil.addEffectToPlayersAround(p_219376_, p_219378_, p_219377_, (double)p_219379_, mobeffectinstance, 200, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.WARDEN); // CraftBukkit - Add EntityPotionEffectEvent.Cause ++ MobEffectUtil.ketting$addEffectToPlayersAround$cause.set(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.WARDEN); // Ketting - CraftBukkit - Add EntityPotionEffectEvent.Cause ++ MobEffectUtil.addEffectToPlayersAround(p_219376_, p_219378_, p_219377_, (double)p_219379_, mobeffectinstance, 200); } public void addAdditionalSaveData(CompoundTag p_219434_) { diff --git a/patches/minecraft/net/minecraft/world/food/FoodData.java.patch b/patches/minecraft/net/minecraft/world/food/FoodData.java.patch index c1b0d51f7e..95c111ff39 100644 --- a/patches/minecraft/net/minecraft/world/food/FoodData.java.patch +++ b/patches/minecraft/net/minecraft/world/food/FoodData.java.patch @@ -1,15 +1,8 @@ --- a/net/minecraft/world/food/FoodData.java +++ b/net/minecraft/world/food/FoodData.java -@@ -8,25 +_,60 @@ - import net.minecraft.world.level.GameRules; - - public class FoodData { -- private int foodLevel = 20; -- private float saturationLevel; -- private float exhaustionLevel; -+ public int foodLevel = 20; -+ public float saturationLevel = 5.0F; //Ketting - moved from constructor -+ public float exhaustionLevel; +@@ -12,21 +_,57 @@ + public float saturationLevel; + public float exhaustionLevel; private int tickTimer; + // CraftBukkit start + private @org.jetbrains.annotations.Nullable Player entityhuman; //Ketting - nullable @@ -20,15 +13,14 @@ private int lastFoodLevel = 20; public FoodData() { -- this.saturationLevel = 5.0F; -- } + this(null); //Ketting + } + + // CraftBukkit start - added EntityHuman constructor -+ public FoodData(Player entityhuman) { ++ public FoodData(@org.jetbrains.annotations.Nullable Player entityhuman) { + this.saturationLevel = 5.0F; + this.entityhuman = entityhuman; -+ } + } + // CraftBukkit end public void eat(int p_38708_, float p_38709_) { diff --git a/patches/minecraft/net/minecraft/world/inventory/AnvilMenu.java.patch b/patches/minecraft/net/minecraft/world/inventory/AnvilMenu.java.patch index c01d30d138..2eef1170fa 100644 --- a/patches/minecraft/net/minecraft/world/inventory/AnvilMenu.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/AnvilMenu.java.patch @@ -1,16 +1,5 @@ --- a/net/minecraft/world/inventory/AnvilMenu.java +++ b/net/minecraft/world/inventory/AnvilMenu.java -@@ -27,8 +_,8 @@ - public static final int MAX_NAME_LENGTH = 50; - public int repairItemCountCost; - @Nullable -- private String itemName; -- private final DataSlot cost = DataSlot.standalone(); -+ public String itemName; -+ public final DataSlot cost = DataSlot.standalone(); - private static final int COST_FAIL = 0; - private static final int COST_BASE = 1; - private static final int COST_ADDED_BASE = 1; @@ -40,6 +_,11 @@ private static final int ADDITIONAL_SLOT_X_PLACEMENT = 76; private static final int RESULT_SLOT_X_PLACEMENT = 134; diff --git a/patches/minecraft/net/minecraft/world/inventory/FurnaceResultSlot.java.patch b/patches/minecraft/net/minecraft/world/inventory/FurnaceResultSlot.java.patch index 1b7ba83280..b0669e2061 100644 --- a/patches/minecraft/net/minecraft/world/inventory/FurnaceResultSlot.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/FurnaceResultSlot.java.patch @@ -1,11 +1,12 @@ --- a/net/minecraft/world/inventory/FurnaceResultSlot.java +++ b/net/minecraft/world/inventory/FurnaceResultSlot.java -@@ -43,10 +_,11 @@ +@@ -43,10 +_,13 @@ if (player instanceof ServerPlayer serverplayer) { Container container = this.container; if (container instanceof AbstractFurnaceBlockEntity abstractfurnaceblockentity) { -- abstractfurnaceblockentity.awardUsedRecipesAndPopExperience(serverplayer); -+ abstractfurnaceblockentity.awardUsedRecipesAndPopExperience(serverplayer, p_39558_, this.removeCount); // CraftBukkit ++ abstractfurnaceblockentity.ketting$awardUsedRecipesAndPopExperience$itemstack.set(p_39558_); ++ abstractfurnaceblockentity.ketting$awardUsedRecipesAndPopExperience$amount.set(this.removeCount); + abstractfurnaceblockentity.awardUsedRecipesAndPopExperience(serverplayer); } } diff --git a/patches/minecraft/net/minecraft/world/inventory/LecternMenu.java.patch b/patches/minecraft/net/minecraft/world/inventory/LecternMenu.java.patch index 5c706a99a6..6cde130ac6 100644 --- a/patches/minecraft/net/minecraft/world/inventory/LecternMenu.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/LecternMenu.java.patch @@ -25,14 +25,6 @@ private static final int DATA_COUNT = 1; private static final int SLOT_COUNT = 1; public static final int BUTTON_PREV_PAGE = 1; -@@ -20,6 +_,7 @@ - } - - public LecternMenu(int p_39824_, Container p_39825_, ContainerData p_39826_) { -+ // CraftBukkit end - super(MenuType.LECTERN, p_39824_); - checkContainerSize(p_39825_, 1); - checkContainerDataCount(p_39826_, 1); @@ -54,6 +_,13 @@ return false; } diff --git a/patches/minecraft/net/minecraft/world/inventory/PlayerEnderChestContainer.java.patch b/patches/minecraft/net/minecraft/world/inventory/PlayerEnderChestContainer.java.patch index e3637abb3b..f54d42d9a8 100644 --- a/patches/minecraft/net/minecraft/world/inventory/PlayerEnderChestContainer.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/PlayerEnderChestContainer.java.patch @@ -21,9 +21,9 @@ public PlayerEnderChestContainer() { + this(null);//Ketting - keep compat + } -+ public PlayerEnderChestContainer(Player owner) { ++ public PlayerEnderChestContainer(@Nullable Player owner) { super(27); -+ this.owner = owner; ++ this.owner = owner==null?org.kettingpowered.ketting.utils.InventoryViewHelper.getContainerOwner():owner; //Ketting - idk rn, if the InventoryViewHelper.getContainerOwner() is really correct rn. + // CraftBukkit end } diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch index b94cff2616..620ab68ae5 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch @@ -246,19 +246,29 @@ } } -@@ -453,8 +_,9 @@ +@@ -453,7 +_,21 @@ public void awardUsedRecipes(Player p_58396_, List p_282202_) { } -- public void awardUsedRecipesAndPopExperience(ServerPlayer p_155004_) { -- List> list = this.getRecipesToAwardAndPopExperience(p_155004_.serverLevel(), p_155004_.position()); -+ public void awardUsedRecipesAndPopExperience(ServerPlayer p_155004_) {} ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$awardUsedRecipesAndPopExperience$itemstack = new java.util.concurrent.atomic.AtomicReference<>(null); ++ public final java.util.concurrent.atomic.AtomicInteger ketting$awardUsedRecipesAndPopExperience$amount = new java.util.concurrent.atomic.AtomicInteger(0); ++ @SuppressWarnings("unused") //Ketting - CB compat + public void awardUsedRecipesAndPopExperience(ServerPlayer p_155004_, ItemStack itemstack, int amount) { // CraftBukkit -+ List> list = this.getRecipesToAwardAndPopExperience(p_155004_.serverLevel(), p_155004_.position(), this.worldPosition, p_155004_, itemstack, amount); // CraftBukkit ++ ketting$awardUsedRecipesAndPopExperience$itemstack.set(itemstack); ++ ketting$awardUsedRecipesAndPopExperience$amount.set(amount); ++ awardUsedRecipesAndPopExperience(p_155004_); ++ } + public void awardUsedRecipesAndPopExperience(ServerPlayer p_155004_) { ++ ketting$getRecipesToAwardAndPopExperience$blockposition.set(this.worldPosition); ++ ketting$getRecipesToAwardAndPopExperience$entityplayer.set(p_155004_); ++ ketting$getRecipesToAwardAndPopExperience$itemstack.set(ketting$awardUsedRecipesAndPopExperience$itemstack.getAndSet(null)); ++ ketting$getRecipesToAwardAndPopExperience$amount.set(ketting$awardUsedRecipesAndPopExperience$amount.getAndSet(0)); ++ //Ketting end + List> list = this.getRecipesToAwardAndPopExperience(p_155004_.serverLevel(), p_155004_.position()); p_155004_.awardRecipes(list); - for(Recipe recipe : list) { -@@ -466,13 +_,33 @@ +@@ -466,13 +_,34 @@ this.recipesUsed.clear(); } @@ -267,6 +277,7 @@ + public final java.util.concurrent.atomic.AtomicReference ketting$getRecipesToAwardAndPopExperience$entityplayer = new java.util.concurrent.atomic.AtomicReference<>(null); + public final java.util.concurrent.atomic.AtomicReference ketting$getRecipesToAwardAndPopExperience$itemstack = new java.util.concurrent.atomic.AtomicReference<>(null); + public final java.util.concurrent.atomic.AtomicInteger ketting$getRecipesToAwardAndPopExperience$amount = new java.util.concurrent.atomic.AtomicInteger(0); ++ @SuppressWarnings("unused") //Ketting - CB Compat + public List> getRecipesToAwardAndPopExperience(ServerLevel p_154996_, Vec3 p_154997_, BlockPos blockposition, ServerPlayer entityplayer, ItemStack itemstack, int amount) { + ketting$getRecipesToAwardAndPopExperience$blockposition.set(blockposition); + ketting$getRecipesToAwardAndPopExperience$entityplayer.set(entityplayer); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 2571228625..08b6464527 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1030,4 +1030,11 @@ public net.minecraft.world.item.trading.MerchantOffer f_45316_ # specialPriceDif public net.minecraft.world.item.trading.MerchantOffer f_45317_ # demand public net.minecraft.world.item.trading.MerchantOffer f_45318_ # priceMultiplier public net.minecraft.world.item.trading.MerchantOffer f_45319_ # xp + +public net.minecraft.world.inventory.AnvilMenu f_39001_ # itemName +public net.minecraft.world.inventory.AnvilMenu f_39002_ # cost + +public net.minecraft.world.food.FoodData f_38696_ # foodLevel +public net.minecraft.world.food.FoodData f_38697_ # saturationLevel +public net.minecraft.world.food.FoodData f_38698_ # exhaustionLevel #endgroup KETTING \ No newline at end of file From 30a30acfcfb37a3d09157533b03350012aa20106 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Tue, 19 Mar 2024 16:10:44 +0100 Subject: [PATCH 13/21] Complete Rewrite of net/minecraft/level(/entity) --- .../minecraft/world/entity/Entity.java.patch | 77 +++++---- .../world/entity/EntityType.java.patch | 87 ++++------ .../world/entity/LivingEntity.java.patch | 122 ++++++------- .../net/minecraft/world/entity/Mob.java.patch | 160 ++++++------------ .../ai/attributes/RangedAttribute.java.patch | 11 -- .../world/entity/animal/Animal.java.patch | 30 ++-- .../entity/animal/allay/Allay.java.patch | 27 ++- .../animal/horse/SkeletonTrapGoal.java.patch | 73 +++----- .../decoration/HangingEntity.java.patch | 10 +- .../entity/item/FallingBlockEntity.java.patch | 15 -- .../world/entity/item/ItemEntity.java.patch | 6 +- .../world/entity/monster/Creeper.java.patch | 11 +- .../world/entity/monster/EnderMan.java.patch | 3 +- .../world/entity/monster/Skeleton.java.patch | 9 +- .../world/entity/monster/Zombie.java.patch | 12 +- .../entity/monster/ZombieVillager.java.patch | 13 +- .../monster/piglin/AbstractPiglin.java.patch | 12 +- .../entity/monster/piglin/Piglin.java.patch | 10 +- .../entity/monster/piglin/PiglinAi.java.patch | 20 ++- .../world/entity/npc/Villager.java.patch | 9 - .../world/entity/player/Abilities.java.patch | 13 -- .../world/entity/player/Player.java.patch | 33 ++-- .../projectile/AbstractArrow.java.patch | 5 +- .../entity/projectile/EyeOfEnder.java.patch | 17 -- .../projectile/SmallFireball.java.patch | 5 +- .../ThrowableItemProjectile.java.patch | 6 +- .../AbstractMinecartContainer.java.patch | 15 +- .../world/item/MilkBucketItem.java.patch | 7 +- .../level/block/BaseFireBlock.java.patch | 5 +- .../v1_20_R1/entity/CraftAllay.java | 4 +- .../resources/META-INF/accesstransformer.cfg | 25 +++ 31 files changed, 356 insertions(+), 496 deletions(-) delete mode 100644 patches/minecraft/net/minecraft/world/entity/ai/attributes/RangedAttribute.java.patch delete mode 100644 patches/minecraft/net/minecraft/world/entity/player/Abilities.java.patch diff --git a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch index 5b546f3160..00bda89274 100644 --- a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch @@ -193,15 +193,14 @@ public void baseTick() { this.level().getProfiler().push("entityBaseTick"); this.feetBlockState = null; -@@ -427,7 +_,7 @@ +@@ -427,6 +_,7 @@ this.walkDistO = this.walkDist; this.xRotO = this.getXRot(); this.yRotO = this.getYRot(); -- this.handleNetherPortal(); -+ if (this instanceof ServerPlayer) this.handleNetherPortal(); // CraftBukkit - // Moved up to postTick ++ if (this instanceof ServerPlayer) // CraftBukkit - // Moved up to postTick + this.handleNetherPortal(); if (this.canSpawnSprintParticle()) { this.spawnSprintParticle(); - } @@ -461,7 +_,11 @@ if (this.isInLava()) { @@ -215,7 +214,7 @@ } this.checkBelowWorld(); -@@ -513,15 +_,48 @@ +@@ -513,15 +_,55 @@ public void lavaHurt() { if (!this.fireImmune()) { @@ -229,11 +228,13 @@ + this.level.getCraftServer().getPluginManager().callEvent(combustEvent); + + if (!combustEvent.isCancelled()) { -+ this.setSecondsOnFire(combustEvent.getDuration(), false); ++ ketting$setSecondsOnFire$callEvent.set(false); ++ this.setSecondsOnFire(combustEvent.getDuration()); + } + } else { + // This will be called every single tick the entity is in lava, so don't throw an event -+ this.setSecondsOnFire(15, false); ++ ketting$setSecondsOnFire$callEvent.set(false); ++ this.setSecondsOnFire(15); + } + org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.blockDamage = (lastLavaContact) == null ? null : org.bukkit.craftbukkit.v1_20_R1.block.CraftBlock.at(level, lastLavaContact); if (this.hurt(this.damageSources().lava(), 4.0F)) { @@ -243,15 +244,20 @@ + // CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls } - } - - public void setSecondsOnFire(int p_20255_) { -+ // CraftBukkit start -+ this.setSecondsOnFire(p_20255_, true); + } + ++ //Ketting start ++ public java.util.concurrent.atomic.AtomicBoolean ketting$setSecondsOnFire$callEvent = new java.util.concurrent.atomic.AtomicBoolean(true); ++ @SuppressWarnings("unused") //Ketting - CB compat ++ + public void setSecondsOnFire(int p_20255_, boolean callEvent) { -+ if (callEvent) { ++ ketting$setSecondsOnFire$callEvent.set(callEvent); ++ this.setSecondsOnFire(p_20255_); + } + + public void setSecondsOnFire(int p_20255_) { ++ if (ketting$setSecondsOnFire$callEvent.getAndSet(true)) { ++ //Ketting end + org.bukkit.event.entity.EntityCombustEvent event = new org.bukkit.event.entity.EntityCombustEvent(this.getBukkitEntity(), p_20255_); + this.level.getCraftServer().getPluginManager().callEvent(event); + @@ -739,24 +745,23 @@ if (this.isPassenger()) { this.stopRiding(); } -@@ -1915,8 +_,9 @@ +@@ -1915,8 +_,10 @@ public void removeVehicle() { if (this.vehicle != null) { Entity entity = this.vehicle; + if (!net.minecraftforge.event.ForgeEventFactory.canMountEntity(this, entity, false)) return; this.vehicle = null; -- entity.removePassenger(this); -+ if (!entity.removePassengerBool(this)) this.vehicle = entity; // CraftBukkit + entity.removePassenger(this); ++ if (!ketting$removePassenger$returnValue) this.vehicle = entity; // CraftBukkit } } -@@ -1947,9 +_,41 @@ +@@ -1946,10 +_,42 @@ + } } ++ public boolean ketting$removePassenger$returnValue = false; protected void removePassenger(Entity p_20352_) { -+ removePassengerBool(p_20352_); -+ } -+ protected boolean removePassengerBool(Entity p_20352_) { // CraftBukkit if (p_20352_.getVehicle() == this) { throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)"); } else { @@ -775,7 +780,8 @@ + org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity craftn = (org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity) p_20352_.getBukkitEntity().getVehicle(); + Entity n = craftn == null ? null : craftn.getHandle(); + if (event.isCancelled() || n != orig) { -+ return false; ++ ketting$removePassenger$returnValue = false; ++ return; + } + } + // CraftBukkit end @@ -786,17 +792,19 @@ + org.bukkit.Bukkit.getPluginManager().callEvent(event); + } + if (event.isCancelled()) { -+ return false; ++ ketting$removePassenger$returnValue = false; ++ return; + } + // Spigot end if (this.passengers.size() == 1 && this.passengers.get(0) == p_20352_) { this.passengers = ImmutableList.of(); } else { -@@ -1961,12 +_,15 @@ +@@ -1961,12 +_,16 @@ p_20352_.boardingCooldown = 60; this.gameEvent(GameEvent.ENTITY_DISMOUNT, p_20352_); } -+ return true; // CraftBukkit ++ ketting$removePassenger$returnValue = true; ++ return; // CraftBukkit } protected boolean canAddPassenger(Entity p_20354_) { @@ -894,7 +902,7 @@ } public int getTicksFrozen() { -@@ -2254,11 +_,41 @@ +@@ -2254,11 +_,42 @@ public void thunderHit(ServerLevel p_19927_, LightningBolt p_19928_) { this.setRemainingFireTicks(this.remainingFireTicks + 1); @@ -913,7 +921,8 @@ + org.bukkit.event.entity.EntityCombustByEntityEvent entityCombustEvent = new org.bukkit.event.entity.EntityCombustByEntityEvent(stormBukkitEntity, thisBukkitEntity, 8); + pluginManager.callEvent(entityCombustEvent); + if (!entityCombustEvent.isCancelled()) { -+ this.setSecondsOnFire(entityCombustEvent.getDuration(), false); ++ ketting$setSecondsOnFire$callEvent.set(false); ++ this.setSecondsOnFire(entityCombustEvent.getDuration()); + } + // CraftBukkit end + } @@ -949,13 +958,10 @@ } public boolean is(Entity p_20356_) { -@@ -2410,36 +_,86 @@ +@@ -2408,38 +_,88 @@ + this.portalEntrancePos = p_20362_.portalEntrancePos; + } - @Nullable - public Entity changeDimension(ServerLevel p_20118_) { -+ return this.changeDimension(p_20118_, p_20118_.getPortalForcer()); -+ } -+ + //Ketting start - bukkit function + private Vec3 teleportTo$location; + @Nullable @@ -967,7 +973,11 @@ + this.teleportTo$location = null; + } + } -+ //Ketting end ++ + @Nullable + public Entity changeDimension(ServerLevel p_20118_) { ++ return changeDimension(p_20118_, p_20118_.getPortalForcer()); ++ } + + @Nullable + public Entity changeDimension(ServerLevel p_20118_, net.minecraftforge.common.util.ITeleporter teleporter) { @@ -976,6 +986,7 @@ this.level().getProfiler().push("changeDimension"); - this.unRide(); + // CraftBukkit start ++ if (teleporter == null) teleporter = p_20118_.getPortalForcer(); + // this.unRide(); + if (p_20118_ == null) { + return null; diff --git a/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch b/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch index e593c8ef61..62402cd7ad 100644 --- a/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch @@ -21,63 +21,41 @@ private static EntityType register(String p_20635_, EntityType.Builder p_20636_) { return Registry.register(BuiltInRegistries.ENTITY_TYPE, p_20635_, p_20636_.build(p_20635_)); } -@@ -320,21 +_,34 @@ +@@ -320,6 +_,9 @@ } public EntityType(EntityType.EntityFactory p_273268_, MobCategory p_272918_, boolean p_273417_, boolean p_273389_, boolean p_273556_, boolean p_272654_, ImmutableSet p_273631_, EntityDimensions p_272946_, int p_272895_, int p_273451_, FeatureFlagSet p_273518_) { -- this.factory = p_273268_; -- this.category = p_272918_; -- this.canSpawnFarFromPlayer = p_272654_; -- this.serialize = p_273417_; -- this.summon = p_273389_; -- this.fireImmune = p_273556_; -- this.immuneTo = p_273631_; -- this.dimensions = p_272946_; -- this.clientTrackingRange = p_272895_; -- this.updateInterval = p_273451_; -- this.requiredFeatures = p_273518_; + this(p_273268_, p_272918_, p_273417_, p_273389_, p_273556_, p_272654_, p_273631_, p_272946_, p_272895_, p_273451_, p_273518_, EntityType::defaultVelocitySupplier, EntityType::defaultTrackingRangeSupplier, EntityType::defaultUpdateIntervalSupplier, null); + } -+ public EntityType(EntityType.EntityFactory p_251402_, MobCategory p_251431_, boolean p_251439_, boolean p_251973_, boolean p_252007_, boolean p_250908_, ImmutableSet p_250201_, EntityDimensions p_251742_, int p_250479_, int p_249249_, FeatureFlagSet p_250427_, final java.util.function.Predicate> velocityUpdateSupplier, final java.util.function.ToIntFunction> trackingRangeSupplier, final java.util.function.ToIntFunction> updateIntervalSupplier, final java.util.function.BiFunction customClientFactory) { -+ this.factory = p_251402_; -+ this.category = p_251431_; -+ this.canSpawnFarFromPlayer = p_250908_; -+ this.serialize = p_251439_; -+ this.summon = p_251973_; -+ this.fireImmune = p_252007_; -+ this.immuneTo = p_250201_; -+ this.dimensions = p_251742_; -+ this.clientTrackingRange = p_250479_; -+ this.updateInterval = p_249249_; -+ this.requiredFeatures = p_250427_; ++ public EntityType(EntityType.EntityFactory p_273268_, MobCategory p_272918_, boolean p_273417_, boolean p_273389_, boolean p_273556_, boolean p_272654_, ImmutableSet p_273631_, EntityDimensions p_272946_, int p_272895_, int p_273451_, FeatureFlagSet p_273518_, final java.util.function.Predicate> velocityUpdateSupplier, final java.util.function.ToIntFunction> trackingRangeSupplier, final java.util.function.ToIntFunction> updateIntervalSupplier, final java.util.function.BiFunction customClientFactory) { + this.factory = p_273268_; + this.category = p_272918_; + this.canSpawnFarFromPlayer = p_272654_; +@@ -331,10 +_,23 @@ + this.clientTrackingRange = p_272895_; + this.updateInterval = p_273451_; + this.requiredFeatures = p_273518_; + this.velocityUpdateSupplier = velocityUpdateSupplier; + this.trackingRangeSupplier = trackingRangeSupplier; + this.updateIntervalSupplier = updateIntervalSupplier; + this.customClientFactory = customClientFactory; - } - -- @Nullable - public T spawn(ServerLevel p_20593_, @Nullable ItemStack p_20594_, @Nullable Player p_20595_, BlockPos p_20596_, MobSpawnType p_20597_, boolean p_20598_, boolean p_20599_) { -+ // CraftBukkit start -+ return this.spawn(p_20593_, p_20594_, p_20595_, p_20596_, p_20597_, p_20598_, p_20599_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); + } + -+ @Nullable ++ //Ketting start ++ @Nullable + public T spawn(ServerLevel p_20593_, @Nullable ItemStack p_20594_, @Nullable Player p_20595_, BlockPos p_20596_, MobSpawnType p_20597_, boolean p_20598_, boolean p_20599_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ // CraftBukkit end ++ ketting$spawn$spawnReason.set(spawnReason); ++ return this.spawn(p_20593_, p_20594_, p_20595_, p_20596_, p_20597_, p_20598_, p_20599_); + } + + @Nullable + public T spawn(ServerLevel p_20593_, @Nullable ItemStack p_20594_, @Nullable Player p_20595_, BlockPos p_20596_, MobSpawnType p_20597_, boolean p_20598_, boolean p_20599_) { ++ ketting$spawn$spawnReason.compareAndSet(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); ++ //Ketting end Consumer consumer; CompoundTag compoundtag; if (p_20594_ != null) { -@@ -346,7 +_,7 @@ - compoundtag = null; - } - -- return this.spawn(p_20593_, compoundtag, consumer, p_20596_, p_20597_, p_20598_, p_20599_); -+ return this.spawn(p_20593_, compoundtag, consumer, p_20596_, p_20597_, p_20598_, p_20599_, spawnReason); // CraftBukkit end - } - - public static Consumer createDefaultStackConfig(ServerLevel p_263583_, ItemStack p_263568_, @Nullable Player p_263575_) { -@@ -367,20 +_,38 @@ +@@ -367,20 +_,40 @@ public static Consumer appendCustomEntityStackConfig(Consumer p_263579_, ServerLevel p_263571_, ItemStack p_263582_, @Nullable Player p_263574_) { CompoundTag compoundtag = p_263582_.getTag(); return compoundtag != null ? p_263579_.andThen((p_262558_) -> { @@ -90,26 +68,29 @@ @Nullable public T spawn(ServerLevel p_262634_, BlockPos p_262707_, MobSpawnType p_262597_) { - return this.spawn(p_262634_, (CompoundTag)null, (Consumer)null, p_262707_, p_262597_, false, false); -+ // CraftBukkit start -+ return this.spawn(p_262634_, p_262707_, p_262597_, ketting$spawn$spawnReason.getAndSet(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT)); +- } ++ return this.spawn(p_262634_, (CompoundTag) null, null, p_262707_, p_262597_, false, false); + } + ++ // CraftBukkit start + @Nullable -+ public T spawn(ServerLevel worldserver, BlockPos blockposition, MobSpawnType enummobspawn, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ return this.spawn(worldserver, (CompoundTag) null, null, blockposition, enummobspawn, false, false, spawnReason); // CraftBukkit - decompile error -+ // CraftBukkit end - } - - @Nullable - public T spawn(ServerLevel p_262704_, @Nullable CompoundTag p_262603_, @Nullable Consumer p_262621_, BlockPos p_262672_, MobSpawnType p_262644_, boolean p_262690_, boolean p_262590_) { -+ // CraftBukkit start -+ return this.spawn(p_262704_, p_262603_, p_262621_, p_262672_, p_262644_, p_262690_, p_262590_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); ++ public T spawn(ServerLevel p_262634_, BlockPos p_262707_, MobSpawnType p_262597_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { ++ ketting$spawn$spawnReason.set(spawnReason); ++ return this.spawn(p_262634_, p_262707_, p_262597_); + } + + @Nullable + public T spawn(ServerLevel p_262704_, @Nullable CompoundTag p_262603_, @Nullable Consumer p_262621_, BlockPos p_262672_, MobSpawnType p_262644_, boolean p_262690_, boolean p_262590_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { ++ ketting$spawn$spawnReason.set(spawnReason); ++ return this.spawn(p_262704_, p_262603_, p_262621_, p_262672_, p_262644_, p_262690_, p_262590_); ++ } ++ // CraftBukkit end + + @Nullable + public T spawn(ServerLevel p_262704_, @Nullable CompoundTag p_262603_, @Nullable Consumer p_262621_, BlockPos p_262672_, MobSpawnType p_262644_, boolean p_262690_, boolean p_262590_) { + // CraftBukkit end T t = this.create(p_262704_, p_262603_, p_262621_, p_262672_, p_262644_, p_262690_, p_262590_); ++ org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason = ketting$spawn$spawnReason.getAndSet(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); if (t != null) { + p_262704_.prepareAddFreshEntityWithPassengers(spawnReason); p_262704_.addFreshEntityWithPassengers(t); diff --git a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch index f8c1655f5a..40f33f70a8 100644 --- a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch @@ -264,20 +264,22 @@ return d0; } -@@ -871,7 +_,13 @@ +@@ -871,6 +_,15 @@ this.entityData.set(DATA_EFFECT_COLOR_ID, 0); } -+ // CraftBukkit start - public boolean removeAllEffects() { -+ return removeAllEffects(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN); ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$removeAllEffects$cause = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN); ++ ++ public boolean removeAllEffects(org.bukkit.event.entity.EntityPotionEffectEvent.Cause cause) { ++ ketting$removeAllEffects$cause.set(cause); ++ return removeAllEffects(); + } ++ //Ketting end + -+ public boolean removeAllEffects(org.bukkit.event.entity.EntityPotionEffectEvent.Cause cause) { -+ // CraftBukkit end + public boolean removeAllEffects() { if (this.level().isClientSide) { return false; - } else { @@ -879,7 +_,15 @@ boolean flag; @@ -286,7 +288,7 @@ + MobEffectInstance effect = iterator.next(); + if(net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.living.MobEffectEvent.Remove(this, effect))) continue; + // CraftBukkit start -+ org.bukkit.event.entity.EntityPotionEffectEvent event = org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, org.bukkit.event.entity.EntityPotionEffectEvent.Action.CLEARED); ++ org.bukkit.event.entity.EntityPotionEffectEvent event = org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, ketting$removeAllEffects$cause.getAndSet(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN), org.bukkit.event.entity.EntityPotionEffectEvent.Action.CLEARED); + if (event.isCancelled()) { + continue; + } @@ -310,18 +312,6 @@ } public boolean addEffect(MobEffectInstance p_147208_, @Nullable Entity p_147209_) { -- if (!this.canBeAffected(p_147208_)) { -- return false; -- } else { -- MobEffectInstance mobeffectinstance = this.activeEffects.get(p_147208_.getEffect()); -- if (mobeffectinstance == null) { -- this.activeEffects.put(p_147208_.getEffect(), p_147208_); -- this.onEffectAdded(p_147208_, p_147209_); -- return true; -- } else if (mobeffectinstance.update(p_147208_)) { -- this.onEffectUpdated(mobeffectinstance, true, p_147209_); -- return true; -- } else { + try { + org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot + if (isTickingEffects) { @@ -329,10 +319,10 @@ + return true; + } + -+ if (!this.canBeAffected(p_147208_)) { - return false; -+ } else { -+ MobEffectInstance mobeffectinstance = this.activeEffects.get(p_147208_.getEffect()); + if (!this.canBeAffected(p_147208_)) { + return false; + } else { + MobEffectInstance mobeffectinstance = this.activeEffects.get(p_147208_.getEffect()); + + // CraftBukkit start + boolean override = false; @@ -347,20 +337,21 @@ + // CraftBukkit end + + net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.living.MobEffectEvent.Added(this, mobeffectinstance, p_147208_, p_147209_)); -+ if (mobeffectinstance == null) { -+ this.activeEffects.put(p_147208_.getEffect(), p_147208_); -+ this.onEffectAdded(p_147208_, p_147209_); -+ return true; + if (mobeffectinstance == null) { + this.activeEffects.put(p_147208_.getEffect(), p_147208_); + this.onEffectAdded(p_147208_, p_147209_); + return true; +- } else if (mobeffectinstance.update(p_147208_)) { + // CraftBukkit start + } else if (event.isOverride()) { + mobeffectinstance.update(p_147208_); -+ this.onEffectUpdated(mobeffectinstance, true, p_147209_); + // CraftBukkit end -+ return true; -+ } else { -+ return false; -+ } + this.onEffectUpdated(mobeffectinstance, true, p_147209_); + return true; + } else { + return false; } ++ } + } finally { + this.addEffect$cause = org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN; } @@ -386,73 +377,81 @@ if (this.getMobType() == MobType.UNDEAD) { MobEffect mobeffect = p_21197_.getEffect(); if (mobeffect == MobEffects.REGENERATION || mobeffect == MobEffects.POISON) { -@@ -953,13 +_,40 @@ +@@ -953,12 +_,51 @@ return this.getMobType() == MobType.UNDEAD; } ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$removeEffectNoUpdate$cause = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN); + // CraftBukkit start - @Nullable - public MobEffectInstance removeEffectNoUpdate(@Nullable MobEffect p_21164_) { -- return this.activeEffects.remove(p_21164_); -+ return removeEffectNoUpdate(p_21164_, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN); ++ @SuppressWarnings("unused") //Ketting - CB compat ++ public @Nullable MobEffectInstance removeEffectNoUpdate(@Nullable MobEffect mobeffect, org.bukkit.event.entity.EntityPotionEffectEvent.Cause cause) { ++ ketting$removeEffectNoUpdate$cause.set(cause); ++ return removeEffectNoUpdate(mobeffect); + } ++ //Ketting end + -+ @Nullable -+ public MobEffectInstance removeEffectNoUpdate(@Nullable MobEffect mobeffect, org.bukkit.event.entity.EntityPotionEffectEvent.Cause cause) { + @Nullable + public MobEffectInstance removeEffectNoUpdate(@Nullable MobEffect p_21164_) { + if (isTickingEffects) { -+ effectsToProcess.add(new ProcessableEffect(mobeffect, cause)); ++ effectsToProcess.add(new ProcessableEffect(p_21164_, ketting$removeEffectNoUpdate$cause.getAndSet(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN))); //ketting + return null; + } + -+ MobEffectInstance effect = this.activeEffects.get(mobeffect); ++ MobEffectInstance effect = this.activeEffects.get(p_21164_); + if (effect == null) { ++ ketting$removeEffectNoUpdate$cause.set(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN);//ketting + return null; + } + -+ org.bukkit.event.entity.EntityPotionEffectEvent event = org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause); ++ org.bukkit.event.entity.EntityPotionEffectEvent event = org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, ketting$removeEffectNoUpdate$cause.getAndSet(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN)); + if (event.isCancelled()) { + return null; + } + -+ return this.activeEffects.remove(mobeffect); + return this.activeEffects.remove(p_21164_); } - public boolean removeEffect(MobEffect p_21196_) { -- MobEffectInstance mobeffectinstance = this.removeEffectNoUpdate(p_21196_); -+ return removeEffect(p_21196_, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN); -+ } ++ public final java.util.concurrent.atomic.AtomicReference ketting$removeEffect$cause = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN); + + public boolean removeEffect(MobEffect p_21196_, org.bukkit.event.entity.EntityPotionEffectEvent.Cause cause) { -+ if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.living.MobEffectEvent.Remove(this, p_21196_))) return false; -+ MobEffectInstance mobeffectinstance = this.removeEffectNoUpdate(p_21196_, cause); ++ ketting$removeEffect$cause.set(cause); ++ return removeEffect(p_21196_); ++ } ++ + public boolean removeEffect(MobEffect p_21196_) { ++ if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.living.MobEffectEvent.Remove(this, p_21196_))) { ++ ketting$removeEffect$cause.set(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN); ++ return false; ++ } ++ ketting$removeEffectNoUpdate$cause.set(ketting$removeEffect$cause.getAndSet(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN)); + // CraftBukkit end + MobEffectInstance mobeffectinstance = this.removeEffectNoUpdate(p_21196_); if (mobeffectinstance != null) { this.onEffectRemoved(mobeffectinstance); - return true; @@ -1015,19 +_,63 @@ } -- public void heal(float p_21116_) { + // CraftBukkit start - Delegate so we can handle providing a reason for health being regained + // Ketting - reverse that delegation, because mixins -+ private @Nullable org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason heal$regainReason = null; ++ public @Nullable org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason ketting$heal$regainReason = null; + public void heal(float p_21116_, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason regainReason){ + try{ -+ heal$regainReason = regainReason; ++ ketting$heal$regainReason = regainReason; + heal(p_21116_); + }finally { -+ heal$regainReason = null; ++ ketting$heal$regainReason = null; + } + } -+ public void heal(float p_21116_) { + public void heal(float p_21116_) { + p_21116_ = net.minecraftforge.event.ForgeEventFactory.onLivingHeal(this, p_21116_); + if (p_21116_ <= 0) return; + float f = this.getHealth(); if (f > 0.0F) { - this.setHealth(f + p_21116_); -+ org.bukkit.event.entity.EntityRegainHealthEvent event = new org.bukkit.event.entity.EntityRegainHealthEvent(this.getBukkitEntity(), p_21116_, heal$regainReason); ++ org.bukkit.event.entity.EntityRegainHealthEvent event = new org.bukkit.event.entity.EntityRegainHealthEvent(this.getBukkitEntity(), p_21116_, ketting$heal$regainReason); + // Suppress during worldgen + if (this.valid) { + this.level().getCraftServer().getPluginManager().callEvent(event); @@ -1313,15 +1312,6 @@ super.tick(); this.updatingUsingItem(); this.updateSwimAmount(); -@@ -2235,7 +_,7 @@ - } - } - -- this.detectEquipmentUpdates(); -+ this.detectEquipmentUpdates(); // CraftBukkit - if (this.tickCount % 20 == 0) { - this.getCombatTracker().recheckStatus(); - } @@ -2246,7 +_,9 @@ } diff --git a/patches/minecraft/net/minecraft/world/entity/Mob.java.patch b/patches/minecraft/net/minecraft/world/entity/Mob.java.patch index ffc27858fc..ef91edc5dd 100644 --- a/patches/minecraft/net/minecraft/world/entity/Mob.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Mob.java.patch @@ -164,34 +164,37 @@ for(ItemEntity itementity : this.level().getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double)vec3i.getX(), (double)vec3i.getY(), (double)vec3i.getZ()))) { if (!itementity.isRemoved() && !itementity.getItem().isEmpty() && !itementity.hasPickUpDelay() && this.wantsToPickUp(itementity.getItem())) { this.pickUpItem(itementity); -@@ -537,7 +_,7 @@ +@@ -537,6 +_,7 @@ protected void pickUpItem(ItemEntity p_21471_) { ItemStack itemstack = p_21471_.getItem(); -- ItemStack itemstack1 = this.equipItemIfPossible(itemstack.copy()); -+ ItemStack itemstack1 = this.equipItemIfPossible(itemstack.copy(), p_21471_); // CraftBukkit - add item ++ ketting$equipItemIfPossible$entity.set(p_21471_); // Ketting - CraftBukkit - add item + ItemStack itemstack1 = this.equipItemIfPossible(itemstack.copy()); if (!itemstack1.isEmpty()) { this.onItemPickup(p_21471_); - this.take(p_21471_, itemstack1.getCount()); -@@ -550,6 +_,12 @@ +@@ -549,6 +_,15 @@ + } - public ItemStack equipItemIfPossible(ItemStack p_255842_) { -+ // CraftBukkit start - add item -+ return this.equipItemIfPossible(p_255842_, null); ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$equipItemIfPossible$entity = new java.util.concurrent.atomic.AtomicReference<>(null); ++ @SuppressWarnings("unused") //Ketting - CB compat ++ public ItemStack equipItemIfPossible(ItemStack p_255842_, ItemEntity entity) { ++ ketting$equipItemIfPossible$entity.set(entity); ++ return this.equipItemIfPossible(p_255842_); + } ++ //Ketting end + -+ public ItemStack equipItemIfPossible(ItemStack p_255842_, ItemEntity entity) { -+ // CraftBukkit end + public ItemStack equipItemIfPossible(ItemStack p_255842_) { EquipmentSlot equipmentslot = getEquipmentSlotForItem(p_255842_); ItemStack itemstack = this.getItemBySlot(equipmentslot); - boolean flag = this.canReplaceCurrentItem(p_255842_, itemstack); -@@ -559,10 +_,18 @@ +@@ -559,10 +_,19 @@ flag = itemstack.isEmpty(); } - if (flag && this.canHoldItem(p_255842_)) { + // CraftBukkit start ++ ItemEntity entity = ketting$equipItemIfPossible$entity.getAndSet(null); + boolean canPickup = flag && this.canHoldItem(p_255842_); + if (entity != null) { + canPickup = !org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntityPickupItemEvent(this, entity, 0, !canPickup).isCancelled(); @@ -290,121 +293,57 @@ this.setLeashedTo(p_21500_, true); itemstack.shrink(1); return InteractionResult.sidedSuccess(this.level().isClientSide); -@@ -1165,52 +_,76 @@ +@@ -1165,13 +_,21 @@ return this.restrictRadius != -1.0F; } + // CraftBukkit start + //Ketting start - move back to original method -+ private org.bukkit.event.entity.EntityTransformEvent.TransformReason convertTo$transformReason = org.bukkit.event.entity.EntityTransformEvent.TransformReason.UNKNOWN; -+ private org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason convertTo$spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; ++ public final java.util.concurrent.atomic.AtomicReference ketting$convertTo$transformReason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.EntityTransformEvent.TransformReason.UNKNOWN); ++ public final java.util.concurrent.atomic.AtomicReference ketting$convertTo$spawnReason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); @Nullable public T convertTo(EntityType p_21407_, boolean p_21408_) { -- if (this.isRemoved()) { -- return (T)null; -- } else { -- T t = p_21407_.create(this.level()); -- if (t == null) { -- return (T)null; -+ try { -+ if (this.isRemoved()) { -+ return (T) null; + if (this.isRemoved()) { ++ ketting$convertTo$transformReason.set(org.bukkit.event.entity.EntityTransformEvent.TransformReason.UNKNOWN); ++ ketting$convertTo$spawnReason.set(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); + return (T)null; + } else { + T t = p_21407_.create(this.level()); + if (t == null) { ++ ketting$convertTo$transformReason.set(org.bukkit.event.entity.EntityTransformEvent.TransformReason.UNKNOWN); ++ ketting$convertTo$spawnReason.set(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); + return (T)null; } else { -- t.copyPosition(this); -- t.setBaby(this.isBaby()); -- t.setNoAi(this.isNoAi()); -- if (this.hasCustomName()) { -- t.setCustomName(this.getCustomName()); -- t.setCustomNameVisible(this.isCustomNameVisible()); -- } -- -- if (this.isPersistenceRequired()) { -- t.setPersistenceRequired(); -- } -- -- t.setInvulnerable(this.isInvulnerable()); -- if (p_21408_) { -- t.setCanPickUpLoot(this.canPickUpLoot()); -- -- for(EquipmentSlot equipmentslot : EquipmentSlot.values()) { -- ItemStack itemstack = this.getItemBySlot(equipmentslot); -- if (!itemstack.isEmpty()) { -- t.setItemSlot(equipmentslot, itemstack.copyAndClear()); -- t.setDropChance(equipmentslot, this.getEquipmentDropChance(equipmentslot)); -+ T t = p_21407_.create(this.level()); -+ if (t == null) { -+ return (T) null; -+ } else { -+ t.copyPosition(this); -+ t.setBaby(this.isBaby()); -+ t.setNoAi(this.isNoAi()); -+ if (this.hasCustomName()) { -+ t.setCustomName(this.getCustomName()); -+ t.setCustomNameVisible(this.isCustomNameVisible()); -+ } -+ -+ if (this.isPersistenceRequired()) { -+ t.setPersistenceRequired(); -+ } -+ -+ t.setInvulnerable(this.isInvulnerable()); -+ if (p_21408_) { -+ t.setCanPickUpLoot(this.canPickUpLoot()); -+ -+ for (EquipmentSlot equipmentslot : EquipmentSlot.values()) { -+ ItemStack itemstack = this.getItemBySlot(equipmentslot); -+ if (!itemstack.isEmpty()) { -+ t.setItemSlot(equipmentslot, itemstack.copyAndClear()); -+ t.setDropChance(equipmentslot, this.getEquipmentDropChance(equipmentslot)); -+ } - } + t.copyPosition(this); +@@ -1199,6 +_,13 @@ } -- } -- -- this.level().addFreshEntity(t); -- if (this.isPassenger()) { -- Entity entity = this.getVehicle(); -- this.stopRiding(); -- t.startRiding(entity, true); -- } -- -- this.discard(); -- return t; -+ -+ // CraftBukkit start -+ if (org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntityTransformEvent(this, t, convertTo$transformReason).isCancelled()) { -+ return null; -+ } -+ // CraftBukkit end -+ this.level().prepareAddFreshEntity(convertTo$spawnReason); -+ this.level().addFreshEntity(t); -+ if (this.isPassenger()) { -+ Entity entity = this.getVehicle(); -+ this.stopRiding(); -+ t.startRiding(entity, true); -+ } -+ -+ this.discard(); -+ return t; + } + ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callEntityTransformEvent(this, t, ketting$convertTo$transformReason.getAndSet(org.bukkit.event.entity.EntityTransformEvent.TransformReason.UNKNOWN)).isCancelled()) { ++ ketting$convertTo$spawnReason.set(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); ++ return null; + } - } -+ } finally { -+ //reset -+ convertTo$transformReason = org.bukkit.event.entity.EntityTransformEvent.TransformReason.UNKNOWN; -+ convertTo$spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; ++ // CraftBukkit end ++ this.level().prepareAddFreshEntity(ketting$convertTo$spawnReason.getAndSet(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT)); + this.level().addFreshEntity(t); + if (this.isPassenger()) { + Entity entity = this.getVehicle(); +@@ -1212,6 +_,14 @@ } } -+ + + @Nullable + public T convertTo(EntityType p_21407_, boolean p_21408_, org.bukkit.event.entity.EntityTransformEvent.TransformReason transformReason, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ convertTo$spawnReason = spawnReason; -+ convertTo$transformReason = transformReason; ++ ketting$convertTo$spawnReason.set(spawnReason); ++ ketting$convertTo$transformReason.set(transformReason); + return convertTo(p_21407_, p_21408_); + } + //Ketting end - ++ protected void tickLeash() { if (this.leashInfoTag != null) { + this.restoreLeashFromSave(); @@ -1219,6 +_,7 @@ if (this.leashHolder != null) { @@ -441,7 +380,7 @@ this.leashInfoTag = null; } } -@@ -1368,6 +_,14 @@ +@@ -1368,6 +_,15 @@ int i = EnchantmentHelper.getFireAspect(this); if (i > 0) { @@ -450,7 +389,8 @@ + org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); + + if (!combustEvent.isCancelled()) { -+ p_21372_.setSecondsOnFire(combustEvent.getDuration(), false); ++ p_21372_.ketting$setSecondsOnFire$callEvent.set(false); ++ p_21372_.setSecondsOnFire(combustEvent.getDuration()); + } + // CraftBukkit end p_21372_.setSecondsOnFire(i * 4); diff --git a/patches/minecraft/net/minecraft/world/entity/ai/attributes/RangedAttribute.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/attributes/RangedAttribute.java.patch deleted file mode 100644 index 98e09b68c2..0000000000 --- a/patches/minecraft/net/minecraft/world/entity/ai/attributes/RangedAttribute.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/entity/ai/attributes/RangedAttribute.java -+++ b/net/minecraft/world/entity/ai/attributes/RangedAttribute.java -@@ -4,7 +_,7 @@ - - public class RangedAttribute extends Attribute { - private final double minValue; -- private final double maxValue; -+ public double maxValue; - - public RangedAttribute(String p_22310_, double p_22311_, double p_22312_, double p_22313_) { - super(p_22310_, p_22311_); diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Animal.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Animal.java.patch index 531c3c41b7..522b54a728 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Animal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Animal.java.patch @@ -42,7 +42,7 @@ } this.level().broadcastEntityEvent(this, (byte)18); -@@ -206,15 +_,48 @@ +@@ -206,13 +_,50 @@ public void spawnChildFromBreeding(ServerLevel p_27564_, Animal p_27565_) { AgeableMob ageablemob = this.getBreedOffspring(p_27564_, p_27565_); @@ -60,7 +60,6 @@ if (ageablemob != null) { ageablemob.setBaby(true); ageablemob.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); -- this.finalizeSpawnChildFromBreeding(p_27564_, p_27565_, ageablemob); + // CraftBukkit start - call EntityBreedEvent + ServerPlayer breeder = Optional.ofNullable(this.getLoveCause()).or(() -> { + return Optional.ofNullable(p_27565_.getLoveCause()); @@ -71,7 +70,8 @@ + return; + } + experience = entityBreedEvent.getExperience(); -+ this.finalizeSpawnChildFromBreeding(p_27564_, p_27565_, ageablemob, experience); ++ ketting$finalizeSpawnChildFromBreeding$experience.set(experience); + this.finalizeSpawnChildFromBreeding(p_27564_, p_27565_, ageablemob); + p_27564_.prepareAddFreshEntityWithPassengers(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); + //Ketting start - force drops, resolves issue with chicken nerf reforged + this.forceDrops = true; @@ -81,26 +81,28 @@ + // CraftBukkit end } } - - public void finalizeSpawnChildFromBreeding(ServerLevel p_277963_, Animal p_277357_, @Nullable AgeableMob p_277516_) { -+ // CraftBukkit start -+ this.finalizeSpawnChildFromBreeding(p_277963_, p_277357_, p_277516_, this.getRandom().nextInt(7) + 1); -+ } + ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicInteger ketting$finalizeSpawnChildFromBreeding$experience = new java.util.concurrent.atomic.AtomicInteger(this.getRandom().nextInt(7) + 1); ++ @SuppressWarnings("unused") //Ketting - CB compat + public void finalizeSpawnChildFromBreeding(ServerLevel p_277963_, Animal p_277357_, @Nullable AgeableMob p_277516_, int experience) { -+ // CraftBukkit end ++ ketting$finalizeSpawnChildFromBreeding$experience.set(experience); ++ this.finalizeSpawnChildFromBreeding(p_277963_, p_277357_, p_277516_); ++ } ++ //Ketting end + + public void finalizeSpawnChildFromBreeding(ServerLevel p_277963_, Animal p_277357_, @Nullable AgeableMob p_277516_) { Optional.ofNullable(this.getLoveCause()).or(() -> { - return Optional.ofNullable(p_277357_.getLoveCause()); - }).ifPresent((p_277486_) -> { -@@ -227,7 +_,11 @@ +@@ -227,7 +_,12 @@ p_277357_.resetLove(); p_277963_.broadcastEntityEvent(this, (byte)18); if (p_277963_.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { - p_277963_.addFreshEntity(new ExperienceOrb(p_277963_, this.getX(), this.getY(), this.getZ(), this.getRandom().nextInt(7) + 1)); + // CraftBukkit start - use event experience -+ if (experience > 0) { -+ p_277963_.addFreshEntity(new ExperienceOrb(p_277963_, this.getX(), this.getY(), this.getZ(), experience)); ++ if (ketting$finalizeSpawnChildFromBreeding$experience.get() > 0) { ++ p_277963_.addFreshEntity(new ExperienceOrb(p_277963_, this.getX(), this.getY(), this.getZ(), ketting$finalizeSpawnChildFromBreeding$experience.get())); + } ++ ketting$finalizeSpawnChildFromBreeding$experience.set(this.getRandom().nextInt(7) + 1); + // CraftBukkit end } diff --git a/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch index c6508546fe..ba2c949654 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch @@ -21,22 +21,21 @@ protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); } -@@ -207,7 +_,7 @@ +@@ -207,6 +_,7 @@ public void aiStep() { super.aiStep(); if (!this.level().isClientSide && this.isAlive() && this.tickCount % 10 == 0) { -- this.heal(1.0F); -+ this.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit ++ ketting$heal$regainReason = org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.REGEN; + this.heal(1.0F); } - if (this.isDancing() && this.shouldStopDancing() && this.tickCount % 20 == 0) { -@@ -272,7 +_,12 @@ - ItemStack itemstack = p_218361_.getItemInHand(p_218362_); +@@ -273,6 +_,13 @@ ItemStack itemstack1 = this.getItemInHand(InteractionHand.MAIN_HAND); if (this.isDancing() && this.isDuplicationItem(itemstack) && this.canDuplicate()) { -- this.duplicateAllay(); + this.duplicateAllay(); + // CraftBukkit start - handle cancel duplication -+ Allay allay = this.duplicateAllay(); ++ Allay allay = ketting$duplicateAllay$returnValue; ++ ketting$duplicateAllay$returnValue = null; + if (allay == null) { + return InteractionResult.SUCCESS; + } @@ -61,23 +60,23 @@ return this.jukeboxPos == null || !this.jukeboxPos.closerToCenterThan(this.position(), (double)GameEvent.JUKEBOX_PLAY.getNotificationRadius()) || !this.level().getBlockState(this.jukeboxPos).is(Blocks.JUKEBOX); } -@@ -463,16 +_,17 @@ +@@ -463,6 +_,7 @@ return DUPLICATION_ITEM.test(p_239736_); } -- private void duplicateAllay() { -+ public Allay duplicateAllay() { // CraftBukkit - return allay ++ public @Nullable Allay ketting$duplicateAllay$returnValue = null; + public void duplicateAllay() { Allay allay = EntityType.ALLAY.create(this.level()); if (allay != null) { - allay.moveTo(this.position()); +@@ -470,9 +_,11 @@ allay.setPersistenceRequired(); allay.resetDuplicationCooldown(); this.resetDuplicationCooldown(); + this.level().prepareAddFreshEntity(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DUPLICATION); this.level().addFreshEntity(allay); } -- -+ return allay; // CraftBukkit + ++ ketting$duplicateAllay$returnValue = allay; } public void resetDuplicationCooldown() { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java.patch index 526242ba5f..b664affaf6 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java.patch @@ -1,66 +1,43 @@ --- a/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java +++ b/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java -@@ -28,34 +_,41 @@ +@@ -28,6 +_,10 @@ public void tick() { ServerLevel serverlevel = (ServerLevel)this.horse.level(); -- DifficultyInstance difficultyinstance = serverlevel.getCurrentDifficultyAt(this.horse.blockPosition()); -- this.horse.setTrap(false); -- this.horse.setTamed(true); -- this.horse.setAge(0); -- LightningBolt lightningbolt = EntityType.LIGHTNING_BOLT.create(serverlevel); -- if (lightningbolt != null) { -- lightningbolt.moveTo(this.horse.getX(), this.horse.getY(), this.horse.getZ()); -- lightningbolt.setVisualOnly(true); -- serverlevel.addFreshEntity(lightningbolt); -- Skeleton skeleton = this.createSkeleton(difficultyinstance, this.horse); -- if (skeleton != null) { -- skeleton.startRiding(this.horse); -- serverlevel.addFreshEntityWithPassengers(skeleton); + // Forge: Trigger the trap in a tick task to avoid crashes when mods add goals to skeleton horses + // (MC-206338/Forge PR #7509) + serverlevel.getServer().tell(new net.minecraft.server.TickTask(serverlevel.getServer().getTickCount(), () -> { + if (!this.horse.isAlive()) return; -+ DifficultyInstance difficultyinstance = serverlevel.getCurrentDifficultyAt(this.horse.blockPosition()); -+ this.horse.setTrap(false); -+ this.horse.setTamed(true); -+ this.horse.setAge(0); -+ LightningBolt lightningbolt = EntityType.LIGHTNING_BOLT.create(serverlevel); -+ if (lightningbolt != null) { -+ lightningbolt.moveTo(this.horse.getX(), this.horse.getY(), this.horse.getZ()); -+ lightningbolt.setVisualOnly(true); -+ serverlevel.strikeLightning(lightningbolt, org.bukkit.event.weather.LightningStrikeEvent.Cause.TRAP); // CraftBukkit -+ Skeleton skeleton = this.createSkeleton(difficultyinstance, this.horse); -+ if (skeleton != null) { -+ skeleton.startRiding(this.horse); -+ serverlevel.prepareAddFreshEntityWithPassengers(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.TRAP); -+ serverlevel.addFreshEntityWithPassengers(skeleton); + DifficultyInstance difficultyinstance = serverlevel.getCurrentDifficultyAt(this.horse.blockPosition()); + this.horse.setTrap(false); + this.horse.setTamed(true); +@@ -36,10 +_,11 @@ + if (lightningbolt != null) { + lightningbolt.moveTo(this.horse.getX(), this.horse.getY(), this.horse.getZ()); + lightningbolt.setVisualOnly(true); +- serverlevel.addFreshEntity(lightningbolt); ++ serverlevel.strikeLightning(lightningbolt, org.bukkit.event.weather.LightningStrikeEvent.Cause.TRAP); // CraftBukkit + Skeleton skeleton = this.createSkeleton(difficultyinstance, this.horse); + if (skeleton != null) { + skeleton.startRiding(this.horse); ++ serverlevel.prepareAddFreshEntityWithPassengers(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.TRAP); + serverlevel.addFreshEntityWithPassengers(skeleton); -- for(int i = 0; i < 3; ++i) { -- AbstractHorse abstracthorse = this.createHorse(difficultyinstance); -- if (abstracthorse != null) { -- Skeleton skeleton1 = this.createSkeleton(difficultyinstance, abstracthorse); -- if (skeleton1 != null) { -- skeleton1.startRiding(abstracthorse); -- abstracthorse.push(this.horse.getRandom().triangle(0.0D, 1.1485D), 0.0D, this.horse.getRandom().triangle(0.0D, 1.1485D)); -- serverlevel.addFreshEntityWithPassengers(abstracthorse); -+ for(int i = 0; i < 3; ++i) { -+ AbstractHorse abstracthorse = this.createHorse(difficultyinstance); -+ if (abstracthorse != null) { -+ Skeleton skeleton1 = this.createSkeleton(difficultyinstance, abstracthorse); -+ if (skeleton1 != null) { -+ skeleton1.startRiding(abstracthorse); -+ abstracthorse.push(this.horse.getRandom().triangle(0.0D, 1.1485D), 0.0D, this.horse.getRandom().triangle(0.0D, 1.1485D)); -+ serverlevel.prepareAddFreshEntityWithPassengers(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.JOCKEY); -+ serverlevel.addFreshEntityWithPassengers(abstracthorse); -+ } + for(int i = 0; i < 3; ++i) { +@@ -49,13 +_,16 @@ + if (skeleton1 != null) { + skeleton1.startRiding(abstracthorse); + abstracthorse.push(this.horse.getRandom().triangle(0.0D, 1.1485D), 0.0D, this.horse.getRandom().triangle(0.0D, 1.1485D)); ++ serverlevel.prepareAddFreshEntityWithPassengers(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.JOCKEY); + serverlevel.addFreshEntityWithPassengers(abstracthorse); } ++ } } } } -- } -+ })); + } ++ )); } @Nullable diff --git a/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch index b991a57fb8..ae556b8a17 100644 --- a/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/decoration/HangingEntity.java +++ b/net/minecraft/world/entity/decoration/HangingEntity.java -@@ -58,36 +_,47 @@ +@@ -58,34 +_,45 @@ protected void recalculateBoundingBox() { if (this.direction != null) { @@ -32,8 +32,6 @@ - this.setBoundingBox(new AABB(d0 - d6, d1 - d7, d2 - d8, d0 + d6, d1 + d7, d2 + d8)); - } - } -- -- private double offs(int p_31710_) { + // CraftBukkit start code moved in to calculateBoundingBox + this.setBoundingBox(calculateBoundingBox(this, this.pos, this.direction, this.getWidth(), this.getHeight())); + // CraftBukkit end @@ -73,11 +71,9 @@ + return new AABB(d0 - d6, d1 - d7, d2 - d8, d0 + d6, d1 + d7, d2 + d8); + } + // CraftBukkit end -+ -+ private static double offs(int p_31710_) { // CraftBukkit - static - return p_31710_ % 32 == 0 ? 0.5D : 0.0D; - } + private double offs(int p_31710_) { + return p_31710_ % 32 == 0 ? 0.5D : 0.0D; @@ -97,6 +_,24 @@ if (this.checkInterval++ == 100) { this.checkInterval = 0; diff --git a/patches/minecraft/net/minecraft/world/entity/item/FallingBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/item/FallingBlockEntity.java.patch index 71c706fd41..f2b4d1379e 100644 --- a/patches/minecraft/net/minecraft/world/entity/item/FallingBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/item/FallingBlockEntity.java.patch @@ -1,20 +1,5 @@ --- a/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/net/minecraft/world/entity/item/FallingBlockEntity.java -@@ -51,10 +_,10 @@ - private BlockState blockState = Blocks.SAND.defaultBlockState(); - public int time; - public boolean dropItem = true; -- private boolean cancelDrop; -- private boolean hurtEntities; -- private int fallDamageMax = 40; -- private float fallDamagePerDistance; -+ public boolean cancelDrop; -+ public boolean hurtEntities; -+ public int fallDamageMax = 40; -+ public float fallDamagePerDistance; - @Nullable - public CompoundTag blockData; - protected static final EntityDataAccessor DATA_START_POS = SynchedEntityData.defineId(FallingBlockEntity.class, EntityDataSerializers.BLOCK_POS); @@ -75,11 +_,23 @@ this.setStartPos(this.blockPosition()); } diff --git a/patches/minecraft/net/minecraft/world/entity/item/ItemEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/item/ItemEntity.java.patch index d23dc4f5f5..30456d8509 100644 --- a/patches/minecraft/net/minecraft/world/entity/item/ItemEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/item/ItemEntity.java.patch @@ -83,9 +83,9 @@ - ++this.age; - } + /* CraftBukkit start - moved up -+ if (this.age != -32768) { -+ ++this.age; -+ } ++ if (this.age != -32768) { ++ ++this.age; ++ } + // CraftBukkit end */ this.hasImpulse |= this.updateInWaterStateAndDoFluidPushing(); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Creeper.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Creeper.java.patch index dde7f630ae..c3f3613e52 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Creeper.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Creeper.java.patch @@ -25,19 +25,16 @@ public void explodeCreeper() { if (!this.level().isClientSide) { float f = this.isPowered() ? 2.0F : 1.0F; -- this.dead = true; -- this.level().explode(this, this.getX(), this.getY(), this.getZ(), (float)this.explosionRadius * f, Level.ExplosionInteraction.MOB); -- this.discard(); -- this.spawnLingeringCloud(); + // CraftBukkit start + org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callExplosionPrimeEvent(this, this.explosionRadius * f, false); + if (!event.isCancelled()) { + this.dead = true; +- this.level().explode(this, this.getX(), this.getY(), this.getZ(), (float)this.explosionRadius * f, Level.ExplosionInteraction.MOB); + // CraftBukkit end -+ this.dead = true; + this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB); // CraftBukkit -+ this.discard(); -+ this.spawnLingeringCloud(); + // CraftBukkit start + this.discard(); + this.spawnLingeringCloud(); + } else { + swell = 0; + } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch index be465f8e85..c8f70127ec 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch @@ -4,9 +4,8 @@ return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 40.0D).add(Attributes.MOVEMENT_SPEED, (double)0.3F).add(Attributes.ATTACK_DAMAGE, 7.0D).add(Attributes.FOLLOW_RANGE, 64.0D); } -- public void setTarget(@Nullable LivingEntity p_32537_) { + @Override -+ public void setTarget(LivingEntity p_32537_) { + public void setTarget(@Nullable LivingEntity p_32537_) { super.setTarget(p_32537_); + if (!ketting$setTarget$result) { + ketting$setTarget$result = false; diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch index 98f7a4656d..e18462c7a0 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch @@ -1,11 +1,12 @@ --- a/net/minecraft/world/entity/monster/Skeleton.java +++ b/net/minecraft/world/entity/monster/Skeleton.java -@@ -83,7 +_,7 @@ +@@ -83,6 +_,9 @@ } protected void doFreezeConversion() { -- this.convertTo(EntityType.STRAY, true); -+ this.convertTo(EntityType.STRAY, true, org.bukkit.event.entity.EntityTransformEvent.TransformReason.FROZEN, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.FROZEN); // CraftBukkit - add spawn and transform reasons ++ // CraftBukkit - add spawn and transform reasons ++ ketting$convertTo$transformReason.set(org.bukkit.event.entity.EntityTransformEvent.TransformReason.FROZEN); //Ketting ++ ketting$convertTo$spawnReason.set(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.FROZEN); //Ketting + this.convertTo(EntityType.STRAY, true); if (!this.isSilent()) { this.level().levelEvent((Player)null, 1048, this.blockPosition(), 0); - } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch index a70953aa33..a17935e749 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch @@ -47,12 +47,13 @@ this.conversionTime = p_34279_; this.getEntityData().set(DATA_DROWNED_CONVERSION_ID, true); } -@@ -250,10 +_,15 @@ +@@ -250,10 +_,17 @@ } protected void convertToZombieType(EntityType p_34311_) { -- Zombie zombie = this.convertTo(p_34311_, true); -+ Zombie zombie = this.convertTo(p_34311_, true, org.bukkit.event.entity.EntityTransformEvent.TransformReason.DROWNED, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DROWNED); ++ ketting$convertTo$transformReason.set(org.bukkit.event.entity.EntityTransformEvent.TransformReason.DROWNED); //Ketting - CraftBukkit ++ ketting$convertTo$spawnReason.set(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DROWNED); //Ketting - CraftBukkit + Zombie zombie = this.convertTo(p_34311_, true); if (zombie != null) { zombie.handleAttributes(zombie.level().getCurrentDifficultyAt(zombie.blockPosition()).getSpecialMultiplier()); zombie.setCanBreakDoors(zombie.supportsBreakDoorGoal() && this.canBreakDoors()); @@ -96,7 +97,7 @@ serverlevel.addFreshEntityWithPassengers(zombie); this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).addPermanentModifier(new AttributeModifier("Zombie reinforcement caller charge", (double)-0.05F, AttributeModifier.Operation.ADDITION)); zombie.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).addPermanentModifier(new AttributeModifier("Zombie reinforcement callee charge", (double)-0.05F, AttributeModifier.Operation.ADDITION)); -@@ -310,7 +_,14 @@ +@@ -310,7 +_,15 @@ if (flag) { float f = this.level().getCurrentDifficultyAt(this.blockPosition()).getEffectiveDifficulty(); if (this.getMainHandItem().isEmpty() && this.isOnFire() && this.random.nextFloat() < f * 0.3F) { @@ -106,7 +107,8 @@ + this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { -+ p_34276_.setSecondsOnFire(event.getDuration(), false); ++ p_34276_.ketting$setSecondsOnFire$callEvent.set(false); ++ p_34276_.setSecondsOnFire(event.getDuration()); + } + // CraftBukkit end } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/ZombieVillager.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/ZombieVillager.java.patch index 6b026a3f7e..4f6423a9c9 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/ZombieVillager.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/ZombieVillager.java.patch @@ -28,26 +28,27 @@ } public InteractionResult mobInteract(Player p_34394_, InteractionHand p_34395_) { -@@ -171,8 +_,11 @@ +@@ -171,8 +_,12 @@ this.conversionStarter = p_34384_; this.villagerConversionTime = p_34385_; this.getEntityData().set(DATA_CONVERTING_ID, true); -- this.removeEffect(MobEffects.WEAKNESS); ++ ketting$removeEffect$cause.set(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION); //Ketting - CraftBukkit + this.removeEffect(MobEffects.WEAKNESS); + // CraftBukkit start -+ this.removeEffect(MobEffects.WEAKNESS, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION); + this.prepareAddEffect(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION); //Ketting this.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, p_34385_, Math.min(this.level().getDifficulty().getId() - 1, 0))); + // CraftBukkit end this.level().broadcastEntityEvent(this, (byte)16); } -@@ -188,7 +_,13 @@ +@@ -188,7 +_,15 @@ } private void finishConversion(ServerLevel p_34399_) { -- Villager villager = this.convertTo(EntityType.VILLAGER, false); ++ ketting$convertTo$transformReason.set(org.bukkit.event.entity.EntityTransformEvent.TransformReason.CURED); //Ketting - CraftBukkit ++ ketting$convertTo$spawnReason.set(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CURED); //Ketting - CraftBukkit + Villager villager = this.convertTo(EntityType.VILLAGER, false); + // CraftBukkit start -+ Villager villager = (Villager) this.convertTo(EntityType.VILLAGER, false, org.bukkit.event.entity.EntityTransformEvent.TransformReason.CURED, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CURED); + if (villager == null) { + ((org.bukkit.entity.ZombieVillager) getBukkitEntity()).setConversionTime(-1); // SPIGOT-5208: End conversion to stop event spam + return; diff --git a/patches/minecraft/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java.patch index d9f19e8f3b..a21a04fa51 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java.patch @@ -1,10 +1,7 @@ --- a/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java +++ b/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java -@@ -87,9 +_,10 @@ - ++this.timeInOverworld; - } else { +@@ -89,7 +_,7 @@ this.timeInOverworld = 0; -+ this.timeInOverworld = 0; } - if (this.timeInOverworld > 300) { @@ -12,12 +9,13 @@ this.playConvertedSound(); this.finishConversion((ServerLevel)this.level()); } -@@ -101,9 +_,10 @@ +@@ -101,9 +_,12 @@ } protected void finishConversion(ServerLevel p_34663_) { -- ZombifiedPiglin zombifiedpiglin = this.convertTo(EntityType.ZOMBIFIED_PIGLIN, true); -+ ZombifiedPiglin zombifiedpiglin = this.convertTo(EntityType.ZOMBIFIED_PIGLIN, true, org.bukkit.event.entity.EntityTransformEvent.TransformReason.PIGLIN_ZOMBIFIED, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.PIGLIN_ZOMBIFIED); // CraftBukkit - add spawn and transform reasons ++ ketting$convertTo$transformReason.set(org.bukkit.event.entity.EntityTransformEvent.TransformReason.PIGLIN_ZOMBIFIED); // Ketting ++ ketting$convertTo$spawnReason.set(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.PIGLIN_ZOMBIFIED); // Ketting + ZombifiedPiglin zombifiedpiglin = this.convertTo(EntityType.ZOMBIFIED_PIGLIN, true); if (zombifiedpiglin != null) { zombifiedpiglin.addEffect(new MobEffectInstance(MobEffects.CONFUSION, 200, 0)); + net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, zombifiedpiglin); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch index bc60517b0f..1b00a003ef 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch @@ -1,13 +1,7 @@ --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -70,10 +_,14 @@ - private static final float PROBABILITY_OF_SPAWNING_AS_BABY = 0.2F; - private static final float BABY_EYE_HEIGHT_ADJUSTMENT = 0.82F; - private static final double PROBABILITY_OF_SPAWNING_WITH_CROSSBOW_INSTEAD_OF_SWORD = 0.5D; -- private final SimpleContainer inventory = new SimpleContainer(8); -- private boolean cannotHunt; -+ public final SimpleContainer inventory = new SimpleContainer(8); -+ public boolean cannotHunt; +@@ -74,6 +_,10 @@ + public boolean cannotHunt; protected static final ImmutableList>> SENSOR_TYPES = ImmutableList.of(SensorType.NEAREST_LIVING_ENTITIES, SensorType.NEAREST_PLAYERS, SensorType.NEAREST_ITEMS, SensorType.HURT_BY, SensorType.PIGLIN_SPECIFIC_SENSOR); protected static final ImmutableList> MEMORY_TYPES = ImmutableList.of(MemoryModuleType.LOOK_TARGET, MemoryModuleType.DOORS_TO_CLOSE, MemoryModuleType.NEAREST_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_PLAYER, MemoryModuleType.NEAREST_VISIBLE_ATTACKABLE_PLAYER, MemoryModuleType.NEAREST_VISIBLE_ADULT_PIGLINS, MemoryModuleType.NEARBY_ADULT_PIGLINS, MemoryModuleType.NEAREST_VISIBLE_WANTED_ITEM, MemoryModuleType.ITEM_PICKUP_COOLDOWN_TICKS, MemoryModuleType.HURT_BY, MemoryModuleType.HURT_BY_ENTITY, MemoryModuleType.WALK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.ATTACK_TARGET, MemoryModuleType.ATTACK_COOLING_DOWN, MemoryModuleType.INTERACTION_TARGET, MemoryModuleType.PATH, MemoryModuleType.ANGRY_AT, MemoryModuleType.UNIVERSAL_ANGER, MemoryModuleType.AVOID_TARGET, MemoryModuleType.ADMIRING_ITEM, MemoryModuleType.TIME_TRYING_TO_REACH_ADMIRE_ITEM, MemoryModuleType.ADMIRING_DISABLED, MemoryModuleType.DISABLE_WALK_TO_ADMIRE_ITEM, MemoryModuleType.CELEBRATE_LOCATION, MemoryModuleType.DANCING, MemoryModuleType.HUNTED_RECENTLY, MemoryModuleType.NEAREST_VISIBLE_BABY_HOGLIN, MemoryModuleType.NEAREST_VISIBLE_NEMESIS, MemoryModuleType.NEAREST_VISIBLE_ZOMBIFIED, MemoryModuleType.RIDE_TARGET, MemoryModuleType.VISIBLE_ADULT_PIGLIN_COUNT, MemoryModuleType.VISIBLE_ADULT_HOGLIN_COUNT, MemoryModuleType.NEAREST_VISIBLE_HUNTABLE_HOGLIN, MemoryModuleType.NEAREST_TARGETABLE_PLAYER_NOT_WEARING_GOLD, MemoryModuleType.NEAREST_PLAYER_HOLDING_WANTED_ITEM, MemoryModuleType.ATE_RECENTLY, MemoryModuleType.NEAREST_REPELLENT); + // CraftBukkit start - Custom bartering and interest list diff --git a/patches/minecraft/net/minecraft/world/entity/monster/piglin/PiglinAi.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/piglin/PiglinAi.java.patch index 0c6327d538..a3dde0c0a1 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/piglin/PiglinAi.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/piglin/PiglinAi.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/piglin/PiglinAi.java +++ b/net/minecraft/world/entity/monster/piglin/PiglinAi.java -@@ -221,23 +_,27 @@ +@@ -221,22 +_,27 @@ protected static void pickUpItem(Piglin p_34844_, ItemEntity p_34845_) { stopWalking(p_34844_); ItemStack itemstack; @@ -27,11 +27,10 @@ } else if (isFood(itemstack) && !hasEatenRecently(p_34844_)) { eat(p_34844_); } else { -- boolean flag = !p_34844_.equipItemIfPossible(itemstack).equals(ItemStack.EMPTY); -+ boolean flag = !p_34844_.equipItemIfPossible(itemstack, p_34845_).equals(ItemStack.EMPTY); // CraftBukkit ++ p_34844_.ketting$equipItemIfPossible$entity.set(p_34845_); //Ketting - CraftBukkit + boolean flag = !p_34844_.equipItemIfPossible(itemstack).equals(ItemStack.EMPTY); if (!flag) { putInInventory(p_34844_, itemstack); - } @@ -268,9 +_,14 @@ ItemStack itemstack = p_34868_.getItemInHand(InteractionHand.OFF_HAND); p_34868_.setItemInHand(InteractionHand.OFF_HAND, ItemStack.EMPTY); @@ -107,19 +106,26 @@ } private static void admireGoldItem(LivingEntity p_34939_) { -@@ -714,6 +_,12 @@ +@@ -714,8 +_,18 @@ return p_35021_.getBrain().hasMemoryValue(MemoryModuleType.ADMIRING_ITEM); } ++ //Ketting start ++ public static final java.util.concurrent.atomic.AtomicReference> ketting$isBarterCurrency$piglin = new java.util.concurrent.atomic.AtomicReference<>(java.util.Collections.emptySet()); + // CraftBukkit start - Changes to allow custom payment for bartering + private static boolean isBarterCurrency(ItemStack itemstack, Piglin piglin) { -+ return isBarterCurrency(itemstack) || piglin.allowedBarterItems.contains(itemstack.getItem()); ++ ketting$isBarterCurrency$piglin.set(piglin.allowedBarterItems); ++ return isBarterCurrency(itemstack); + } + // CraftBukkit end + private static boolean isBarterCurrency(ItemStack p_149968_) { - return p_149968_.is(BARTERING_ITEM); +- return p_149968_.is(BARTERING_ITEM); ++ return p_149968_.is(BARTERING_ITEM) || ketting$isBarterCurrency$piglin.getAndSet(java.util.Collections.emptySet()).contains(p_149968_.getItem()); ++ //Ketting end } + + private static boolean isFood(ItemStack p_149970_) { @@ -751,7 +_,7 @@ } diff --git a/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch b/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch index 02f6d1c590..30c109f32f 100644 --- a/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java -@@ -144,7 +_,7 @@ - } - - public Brain getBrain() { -- return (Brain)super.getBrain(); -+ return (Brain) super.getBrain(); // CraftBukkit - decompile error - } - - protected Brain.Provider brainProvider() { @@ -204,6 +_,17 @@ return this.assignProfessionWhenSpawned; } diff --git a/patches/minecraft/net/minecraft/world/entity/player/Abilities.java.patch b/patches/minecraft/net/minecraft/world/entity/player/Abilities.java.patch deleted file mode 100644 index 892a1b3cdd..0000000000 --- a/patches/minecraft/net/minecraft/world/entity/player/Abilities.java.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/net/minecraft/world/entity/player/Abilities.java -+++ b/net/minecraft/world/entity/player/Abilities.java -@@ -8,8 +_,8 @@ - public boolean mayfly; - public boolean instabuild; - public boolean mayBuild = true; -- private float flyingSpeed = 0.05F; -- private float walkingSpeed = 0.1F; -+ public float flyingSpeed = 0.05F; -+ public float walkingSpeed = 0.1F; - - public void addSaveData(CompoundTag p_35946_) { - CompoundTag compoundtag = new CompoundTag(); diff --git a/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch b/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch index 3738c73cab..0da5eb8498 100644 --- a/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch @@ -139,31 +139,38 @@ super.die(p_36152_); this.reapplyPosition(); if (!this.isSpectator()) { -@@ -622,11 +_,17 @@ +@@ -622,12 +_,23 @@ @Nullable public ItemEntity drop(ItemStack p_36177_, boolean p_36178_) { - return this.drop(p_36177_, false, p_36178_); +- } + return net.minecraftforge.common.ForgeHooks.onPlayerTossEvent(this, p_36177_, p_36178_); - } - - @Nullable - public ItemEntity drop(ItemStack p_36179_, boolean p_36180_, boolean p_36181_) { -+ // CraftBukkit start - SPIGOT-2942: Add boolean to call event -+ return drop(p_36179_, p_36180_, p_36181_, true); + } + ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicBoolean ketting$drop$callEvent = new java.util.concurrent.atomic.AtomicBoolean(true); + @Nullable + public ItemEntity drop(ItemStack p_36179_, boolean p_36180_, boolean p_36181_, boolean callEvent) { ++ ketting$drop$callEvent.set(callEvent); ++ // CraftBukkit start - SPIGOT-2942: Add boolean to call event ++ return drop(p_36179_, p_36180_, p_36181_); ++ } ++ //Ketting end + + @Nullable + public ItemEntity drop(ItemStack p_36179_, boolean p_36180_, boolean p_36181_) { if (p_36179_.isEmpty()) { ++ ketting$drop$callEvent.set(true); return null; } else { + if (this.level().isClientSide) { @@ -656,11 +_,43 @@ itementity.setDeltaMovement((double)(-f3 * f2 * 0.3F) + Math.cos((double)f5) * (double)f6, (double)(-f8 * 0.3F + 0.1F + (this.random.nextFloat() - this.random.nextFloat()) * 0.1F), (double)(f4 * f2 * 0.3F) + Math.sin((double)f5) * (double)f6); } + // CraftBukkit start - fire PlayerDropItemEvent -+ if (!callEvent) { // SPIGOT-2942: Add boolean to call event ++ if (!ketting$drop$callEvent.getAndSet(true)) { // SPIGOT-2942: Add boolean to call event + return itementity; + } + org.bukkit.entity.Player player = (org.bukkit.entity.Player) this.getBukkitEntity(); @@ -437,7 +444,7 @@ } float f4 = 0.0F; -@@ -1099,8 +_,15 @@ +@@ -1099,8 +_,16 @@ if (p_36347_ instanceof LivingEntity) { f4 = ((LivingEntity)p_36347_).getHealth(); if (j > 0 && !p_36347_.isOnFire()) { @@ -449,7 +456,8 @@ + + if (!combustEvent.isCancelled()) { + flag4 = true; -+ p_36347_.setSecondsOnFire(combustEvent.getDuration(), false); ++ p_36347_.ketting$setSecondsOnFire$callEvent.set(false); ++ p_36347_.setSecondsOnFire(combustEvent.getDuration()); + } + // CraftBukkit end } @@ -522,7 +530,7 @@ this.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); } } -@@ -1178,7 +_,14 @@ +@@ -1178,7 +_,15 @@ float f5 = f4 - ((LivingEntity)p_36347_).getHealth(); this.awardStat(Stats.DAMAGE_DEALT, Math.round(f5 * 10.0F)); if (j > 0) { @@ -532,7 +540,8 @@ + org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); + + if (!combustEvent.isCancelled()) { -+ entity.setSecondsOnFire(combustEvent.getDuration(), false); ++ entity.ketting$setSecondsOnFire$callEvent.set(false); ++ entity.setSecondsOnFire(combustEvent.getDuration()); + } + // CraftBukkit end } diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch index c46a3ab480..3b96241b7a 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch @@ -81,7 +81,7 @@ this.discard(); } -@@ -322,7 +_,14 @@ +@@ -322,7 +_,15 @@ boolean flag = entity.getType() == EntityType.ENDERMAN; int k = entity.getRemainingFireTicks(); if (this.isOnFire() && !flag) { @@ -90,7 +90,8 @@ + org.bukkit.event.entity.EntityCombustByEntityEvent combustEvent = new org.bukkit.event.entity.EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 5); + org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); + if (!combustEvent.isCancelled()) { -+ entity.setSecondsOnFire(combustEvent.getDuration(), false); ++ entity.ketting$setSecondsOnFire$callEvent.set(false); ++ entity.setSecondsOnFire(combustEvent.getDuration()); + } + // CraftBukkit end + diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/EyeOfEnder.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/EyeOfEnder.java.patch index 8308c74fc0..c151b7d82e 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/EyeOfEnder.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/EyeOfEnder.java.patch @@ -1,22 +1,5 @@ --- a/net/minecraft/world/entity/projectile/EyeOfEnder.java +++ b/net/minecraft/world/entity/projectile/EyeOfEnder.java -@@ -18,11 +_,11 @@ - - public class EyeOfEnder extends Entity implements ItemSupplier { - private static final EntityDataAccessor DATA_ITEM_STACK = SynchedEntityData.defineId(EyeOfEnder.class, EntityDataSerializers.ITEM_STACK); -- private double tx; -- private double ty; -- private double tz; -- private int life; -- private boolean surviveAfterDeath; -+ public double tx; -+ public double ty; -+ public double tz; -+ public int life; -+ public boolean surviveAfterDeath; - - public EyeOfEnder(EntityType p_36957_, Level p_36958_) { - super(p_36957_, p_36958_); @@ -34,7 +_,7 @@ } diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/SmallFireball.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/SmallFireball.java.patch index b92e455221..b13a8a5eb2 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/SmallFireball.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/SmallFireball.java.patch @@ -12,7 +12,7 @@ } public SmallFireball(Level p_37367_, double p_37368_, double p_37369_, double p_37370_, double p_37371_, double p_37372_, double p_37373_) { -@@ -32,7 +_,14 @@ +@@ -32,7 +_,15 @@ Entity entity = p_37386_.getEntity(); Entity entity1 = this.getOwner(); int i = entity.getRemainingFireTicks(); @@ -22,7 +22,8 @@ + entity.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { -+ entity.setSecondsOnFire(event.getDuration(), false); ++ entity.ketting$setSecondsOnFire$callEvent.set(false); ++ entity.setSecondsOnFire(event.getDuration()); + } + // CraftBukkit end if (!entity.hurt(this.damageSources().fireball(this, entity1), 5.0F)) { diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/ThrowableItemProjectile.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/ThrowableItemProjectile.java.patch index aa3d59fa0a..3d496c22f0 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/ThrowableItemProjectile.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/ThrowableItemProjectile.java.patch @@ -1,16 +1,14 @@ --- a/net/minecraft/world/entity/projectile/ThrowableItemProjectile.java +++ b/net/minecraft/world/entity/projectile/ThrowableItemProjectile.java -@@ -34,7 +_,12 @@ +@@ -34,6 +_,11 @@ protected abstract Item getDefaultItem(); -- protected ItemStack getItemRaw() { + // CraftBukkit start + public Item getDefaultItemPublic() { + return getDefaultItem(); + } + // CraftBukkit end -+ public ItemStack getItemRaw() { + public ItemStack getItemRaw() { return this.getEntityData().get(DATA_ITEM_STACK); } - diff --git a/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java.patch b/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java.patch index 63564b108f..7bd25396ca 100644 --- a/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java.patch @@ -1,14 +1,9 @@ --- a/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java +++ b/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java -@@ -20,15 +_,58 @@ - public abstract class AbstractMinecartContainer extends AbstractMinecart implements ContainerEntity { - private NonNullList itemStacks = NonNullList.withSize(36, ItemStack.EMPTY); - @Nullable -- private ResourceLocation lootTable; -- private long lootTableSeed; -+ public ResourceLocation lootTable; -+ public long lootTableSeed; -+ +@@ -23,12 +_,55 @@ + public ResourceLocation lootTable; + public long lootTableSeed; + + // CraftBukkit start + public java.util.List transaction = new java.util.ArrayList(); + private int maxStack = MAX_STACK; @@ -49,7 +44,7 @@ + return getBukkitEntity().getLocation(); + } + // CraftBukkit end - ++ protected AbstractMinecartContainer(EntityType p_38213_, Level p_38214_) { super(p_38213_, p_38214_); + this.itemStacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); // CraftBukkit - SPIGOT-3513 diff --git a/patches/minecraft/net/minecraft/world/item/MilkBucketItem.java.patch b/patches/minecraft/net/minecraft/world/item/MilkBucketItem.java.patch index 5e5c711ee5..a8970539da 100644 --- a/patches/minecraft/net/minecraft/world/item/MilkBucketItem.java.patch +++ b/patches/minecraft/net/minecraft/world/item/MilkBucketItem.java.patch @@ -8,15 +8,14 @@ if (p_42925_ instanceof ServerPlayer serverplayer) { CriteriaTriggers.CONSUME_ITEM.trigger(serverplayer, p_42923_); serverplayer.awardStat(Stats.ITEM_USED.get(this)); -@@ -27,7 +_,7 @@ +@@ -27,6 +_,7 @@ } if (!p_42924_.isClientSide) { -- p_42925_.removeAllEffects(); -+ p_42925_.removeAllEffects(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.MILK); // CraftBukkit ++ p_42925_.ketting$removeAllEffects$cause.set(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.MILK); // Ketting - CraftBukkit + p_42925_.removeAllEffects(); } - return p_42923_.isEmpty() ? new ItemStack(Items.BUCKET) : p_42923_; @@ -43,5 +_,10 @@ public InteractionResultHolder use(Level p_42927_, Player p_42928_, InteractionHand p_42929_) { diff --git a/patches/minecraft/net/minecraft/world/level/block/BaseFireBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/BaseFireBlock.java.patch index 44ee365deb..b750c71a97 100644 --- a/patches/minecraft/net/minecraft/world/level/block/BaseFireBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/BaseFireBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BaseFireBlock.java +++ b/net/minecraft/world/level/block/BaseFireBlock.java -@@ -112,7 +_,14 @@ +@@ -112,7 +_,15 @@ if (!p_49263_.fireImmune()) { p_49263_.setRemainingFireTicks(p_49263_.getRemainingFireTicks() + 1); if (p_49263_.getRemainingFireTicks() == 0) { @@ -10,7 +10,8 @@ + p_49261_.getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { -+ p_49263_.setSecondsOnFire(event.getDuration(), false); ++ p_49263_.ketting$setSecondsOnFire$callEvent.set(false); ++ p_49263_.setSecondsOnFire(event.getDuration()); + } + // CraftBukkit end } diff --git a/src/main/java/org/bukkit/craftbukkit/v1_20_R1/entity/CraftAllay.java b/src/main/java/org/bukkit/craftbukkit/v1_20_R1/entity/CraftAllay.java index 38b09f627d..436c92ba41 100644 --- a/src/main/java/org/bukkit/craftbukkit/v1_20_R1/entity/CraftAllay.java +++ b/src/main/java/org/bukkit/craftbukkit/v1_20_R1/entity/CraftAllay.java @@ -83,7 +83,9 @@ public void stopDancing() { @Override public org.bukkit.entity.Allay duplicateAllay() { - Allay nmsAllay = getHandle().duplicateAllay(); + getHandle().duplicateAllay(); + Allay nmsAllay = getHandle().ketting$duplicateAllay$returnValue; + getHandle().ketting$duplicateAllay$returnValue = null; return (nmsAllay != null) ? (org.bukkit.entity.Allay) nmsAllay.getBukkitEntity() : null; } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 08b6464527..b468a43768 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1037,4 +1037,29 @@ public net.minecraft.world.inventory.AnvilMenu f_39002_ # cost public net.minecraft.world.food.FoodData f_38696_ # foodLevel public net.minecraft.world.food.FoodData f_38697_ # saturationLevel public net.minecraft.world.food.FoodData f_38698_ # exhaustionLevel + +public net.minecraft.world.entity.vehicle.AbstractMinecartContainer f_38204_ # lootTable +public net.minecraft.world.entity.vehicle.AbstractMinecartContainer f_38205_ # lootTableSeed + +public net.minecraft.world.entity.projectile.ThrowableItemProjectile m_37454_()Lnet/minecraft/world/item/ItemStack; # getItemRaw + +public net.minecraft.world.entity.projectile.EyeOfEnder f_36950_ # tx +public net.minecraft.world.entity.projectile.EyeOfEnder f_36951_ # ty +public net.minecraft.world.entity.projectile.EyeOfEnder f_36952_ # tz +public net.minecraft.world.entity.projectile.EyeOfEnder f_36953_ # life +public net.minecraft.world.entity.projectile.EyeOfEnder f_36954_ # surviveAfterDeath + +public net.minecraft.world.entity.player.Abilities f_35939_ # flyingSpeed +public net.minecraft.world.entity.player.Abilities f_35940_ # walkingSpeed + +public net.minecraft.world.entity.monster.piglin.Piglin f_34678_ # inventory +public net.minecraft.world.entity.monster.piglin.Piglin f_34679_ # cannotHunt + +public net.minecraft.world.entity.item.FallingBlockEntity f_31947_ # cancelDrop +public net.minecraft.world.entity.item.FallingBlockEntity f_31939_ # hurtEntities +public net.minecraft.world.entity.item.FallingBlockEntity f_31940_ # fallDamageMax +public net.minecraft.world.entity.item.FallingBlockEntity f_149641_ # fallDamagePerDistance + +public net.minecraft.world.entity.animal.allay.Allay m_218376_()V # duplicateAllay +public-f net.minecraft.world.entity.ai.attributes.RangedAttribute f_22308_ # maxValue #endgroup KETTING \ No newline at end of file From 97b815e22a695f2af53e8915b2d7d1ca57117ce5 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Tue, 19 Mar 2024 16:17:03 +0100 Subject: [PATCH 14/21] Complete Rewrite of everything, except net/minecraft/server --- .../minecraft/util/datafix/fixes/ItemIdFix.java.patch | 11 ----------- .../util/datafix/fixes/ItemStackMapIdFix.java.patch | 7 +++---- .../fixes/ItemStackTheFlatteningFix.java.patch | 5 +++-- src/main/resources/META-INF/accesstransformer.cfg | 2 ++ 4 files changed, 8 insertions(+), 17 deletions(-) delete mode 100644 patches/minecraft/net/minecraft/util/datafix/fixes/ItemIdFix.java.patch diff --git a/patches/minecraft/net/minecraft/util/datafix/fixes/ItemIdFix.java.patch b/patches/minecraft/net/minecraft/util/datafix/fixes/ItemIdFix.java.patch deleted file mode 100644 index 68dc3c0203..0000000000 --- a/patches/minecraft/net/minecraft/util/datafix/fixes/ItemIdFix.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/util/datafix/fixes/ItemIdFix.java -+++ b/net/minecraft/util/datafix/fixes/ItemIdFix.java -@@ -14,7 +_,7 @@ - import net.minecraft.util.datafix.schemas.NamespacedSchema; - - public class ItemIdFix extends DataFix { -- private static final Int2ObjectMap ITEM_NAMES = DataFixUtils.make(new Int2ObjectOpenHashMap<>(), (p_15953_) -> { -+ public static final Int2ObjectMap ITEM_NAMES = DataFixUtils.make(new Int2ObjectOpenHashMap<>(), (p_15953_) -> { - p_15953_.put(1, "minecraft:stone"); - p_15953_.put(2, "minecraft:grass"); - p_15953_.put(3, "minecraft:dirt"); diff --git a/patches/minecraft/net/minecraft/util/datafix/fixes/ItemStackMapIdFix.java.patch b/patches/minecraft/net/minecraft/util/datafix/fixes/ItemStackMapIdFix.java.patch index 8c5a7caa7a..5cdd0e1122 100644 --- a/patches/minecraft/net/minecraft/util/datafix/fixes/ItemStackMapIdFix.java.patch +++ b/patches/minecraft/net/minecraft/util/datafix/fixes/ItemStackMapIdFix.java.patch @@ -1,11 +1,10 @@ --- a/net/minecraft/util/datafix/fixes/ItemStackMapIdFix.java +++ b/net/minecraft/util/datafix/fixes/ItemStackMapIdFix.java -@@ -28,7 +_,7 @@ +@@ -28,6 +_,7 @@ Dynamic dynamic = p_16093_.get(DSL.remainderFinder()); Typed typed = p_16093_.getOrCreateTyped(opticfinder1); Dynamic dynamic1 = typed.get(DSL.remainderFinder()); -- dynamic1 = dynamic1.set("map", dynamic1.createInt(dynamic.get("Damage").asInt(0))); -+ if (!dynamic1.getElement("map").result().isPresent()) dynamic1 = dynamic1.set("map", dynamic1.createInt(dynamic.get("Damage").asInt(0))); // CraftBukkit ++ if (!dynamic1.getElement("map").result().isPresent())// CraftBukkit + dynamic1 = dynamic1.set("map", dynamic1.createInt(dynamic.get("Damage").asInt(0))); return p_16093_.set(opticfinder1, typed.set(DSL.remainderFinder(), dynamic1)); } else { - return p_16093_; diff --git a/patches/minecraft/net/minecraft/util/datafix/fixes/ItemStackTheFlatteningFix.java.patch b/patches/minecraft/net/minecraft/util/datafix/fixes/ItemStackTheFlatteningFix.java.patch index 77f575939b..2b032b5d21 100644 --- a/patches/minecraft/net/minecraft/util/datafix/fixes/ItemStackTheFlatteningFix.java.patch +++ b/patches/minecraft/net/minecraft/util/datafix/fixes/ItemStackTheFlatteningFix.java.patch @@ -1,11 +1,12 @@ --- a/net/minecraft/util/datafix/fixes/ItemStackTheFlatteningFix.java +++ b/net/minecraft/util/datafix/fixes/ItemStackTheFlatteningFix.java -@@ -371,7 +_,7 @@ +@@ -371,7 +_,8 @@ if (DAMAGE_IDS.contains(optional.get().getSecond())) { Typed typed1 = p_16119_.getOrCreateTyped(opticfinder1); Dynamic dynamic1 = typed1.get(DSL.remainderFinder()); - dynamic1 = dynamic1.set("Damage", dynamic1.createInt(i)); -+ if (i != 0) dynamic1 = dynamic1.set("Damage", dynamic1.createInt(i)); // CraftBukkit ++ if (i != 0)// CraftBukkit ++ dynamic1 = dynamic1.set("Damage", dynamic1.createInt(i)); typed = typed.set(opticfinder1, typed1.set(DSL.remainderFinder(), dynamic1)); } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index b468a43768..63912b2f8d 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1062,4 +1062,6 @@ public net.minecraft.world.entity.item.FallingBlockEntity f_149641_ # fallDamage public net.minecraft.world.entity.animal.allay.Allay m_218376_()V # duplicateAllay public-f net.minecraft.world.entity.ai.attributes.RangedAttribute f_22308_ # maxValue + +public net.minecraft.util.datafix.fixes.ItemIdFix f_15937_ # ITEM_NAMES #endgroup KETTING \ No newline at end of file From 3b829eeca84b1b7d2be7f91df4a84d1e67496538 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Tue, 19 Mar 2024 19:33:40 +0100 Subject: [PATCH 15/21] Complete Rewrite of everything --- .../server/MinecraftServer.java.patch | 6 +- .../ReloadableServerResources.java.patch | 2 +- .../server/commands/GiveCommand.java.patch | 5 +- .../commands/SetSpawnCommand.java.patch | 7 +- .../server/commands/SummonCommand.java.patch | 7 +- .../DedicatedServerProperties.java.patch | 36 +--- .../server/level/ChunkMap.java.patch | 51 ++--- .../server/level/DistanceManager.java.patch | 63 +++---- .../server/level/ServerChunkCache.java.patch | 32 ++-- .../server/level/ServerLevel.java.patch | 22 +-- .../server/level/ServerPlayer.java.patch | 48 ++--- .../level/ServerPlayerGameMode.java.patch | 178 +++++++----------- .../server/level/TicketType.java.patch | 9 - .../ServerGamePacketListenerImpl.java.patch | 62 +++--- .../server/players/PlayerList.java.patch | 142 +++++++------- .../minecraft/world/entity/Entity.java.patch | 12 +- .../world/entity/LivingEntity.java.patch | 6 +- .../event/player/PlayerRespawnEvent.java | 6 +- .../resources/META-INF/accesstransformer.cfg | 7 + 19 files changed, 313 insertions(+), 388 deletions(-) diff --git a/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch b/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch index 9dadd78827..c6e5d1304e 100644 --- a/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch +++ b/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch @@ -82,11 +82,10 @@ } private void readScoreboard(DimensionDataStorage p_129842_) { -@@ -297,7 +_,19 @@ +@@ -297,6 +_,18 @@ protected abstract boolean initServer() throws IOException; -- protected void loadLevel() { + //Ketting start + private String loadLevel$worldName; + protected void prepareLoadLevel(String worldName) { @@ -99,10 +98,9 @@ + } + //Ketting end + -+ protected void loadLevel() { // CraftBukkit + protected void loadLevel() { if (!JvmProfiler.INSTANCE.isRunning()) { } - @@ -308,6 +_,13 @@ this.createLevels(chunkprogresslistener); this.forceDifficulty(); diff --git a/patches/minecraft/net/minecraft/server/ReloadableServerResources.java.patch b/patches/minecraft/net/minecraft/server/ReloadableServerResources.java.patch index ebb5db7171..7bc65b69fd 100644 --- a/patches/minecraft/net/minecraft/server/ReloadableServerResources.java.patch +++ b/patches/minecraft/net/minecraft/server/ReloadableServerResources.java.patch @@ -4,7 +4,7 @@ private static final Logger LOGGER = LogUtils.getLogger(); private static final CompletableFuture DATA_RELOAD_INITIAL_TASK = CompletableFuture.completedFuture(Unit.INSTANCE); private final CommandBuildContext.Configurable commandBuildContext; -- private final Commands commands; +- public final Commands commands; - private final RecipeManager recipes = new RecipeManager(); + public Commands commands; + private final RecipeManager recipes; diff --git a/patches/minecraft/net/minecraft/server/commands/GiveCommand.java.patch b/patches/minecraft/net/minecraft/server/commands/GiveCommand.java.patch index a65a7ef926..1f5073a7e4 100644 --- a/patches/minecraft/net/minecraft/server/commands/GiveCommand.java.patch +++ b/patches/minecraft/net/minecraft/server/commands/GiveCommand.java.patch @@ -1,11 +1,12 @@ --- a/net/minecraft/server/commands/GiveCommand.java +++ b/net/minecraft/server/commands/GiveCommand.java -@@ -49,7 +_,7 @@ +@@ -49,7 +_,8 @@ boolean flag = serverplayer.getInventory().add(itemstack1); if (flag && itemstack1.isEmpty()) { itemstack1.setCount(1); - ItemEntity itementity1 = serverplayer.drop(itemstack1, false); -+ ItemEntity itementity1 = serverplayer.drop(itemstack1, false, false, false); // SPIGOT-2942: Add boolean to call event ++ serverplayer.ketting$drop$callEvent.set(false); // Ketting - SPIGOT-2942: Add boolean to call event ++ ItemEntity itementity1 = serverplayer.drop(itemstack1, false, false); if (itementity1 != null) { itementity1.makeFakeItem(); } diff --git a/patches/minecraft/net/minecraft/server/commands/SetSpawnCommand.java.patch b/patches/minecraft/net/minecraft/server/commands/SetSpawnCommand.java.patch index 5bf1776ca8..b23f86d8fa 100644 --- a/patches/minecraft/net/minecraft/server/commands/SetSpawnCommand.java.patch +++ b/patches/minecraft/net/minecraft/server/commands/SetSpawnCommand.java.patch @@ -1,11 +1,10 @@ --- a/net/minecraft/server/commands/SetSpawnCommand.java +++ b/net/minecraft/server/commands/SetSpawnCommand.java -@@ -33,7 +_,7 @@ +@@ -33,6 +_,7 @@ ResourceKey resourcekey = p_138650_.getLevel().dimension(); for(ServerPlayer serverplayer : p_138651_) { -- serverplayer.setRespawnPosition(resourcekey, p_138652_, p_138653_, true, false); -+ serverplayer.setRespawnPosition(resourcekey, p_138652_, p_138653_, true, false, org.bukkit.event.player.PlayerSpawnChangeEvent.Cause.COMMAND); // CraftBukkit ++ serverplayer.ketting$respawnPositionCause.set(org.bukkit.event.player.PlayerSpawnChangeEvent.Cause.COMMAND); // Ketting - CraftBukkit + serverplayer.setRespawnPosition(resourcekey, p_138652_, p_138653_, true, false); } - String s = resourcekey.location().toString(); diff --git a/patches/minecraft/net/minecraft/server/commands/SummonCommand.java.patch b/patches/minecraft/net/minecraft/server/commands/SummonCommand.java.patch index 674065ad6d..21ad3a16f5 100644 --- a/patches/minecraft/net/minecraft/server/commands/SummonCommand.java.patch +++ b/patches/minecraft/net/minecraft/server/commands/SummonCommand.java.patch @@ -1,11 +1,10 @@ --- a/net/minecraft/server/commands/SummonCommand.java +++ b/net/minecraft/server/commands/SummonCommand.java -@@ -60,7 +_,7 @@ +@@ -60,6 +_,7 @@ ((Mob)entity).finalizeSpawn(p_270582_.getLevel(), p_270582_.getLevel().getCurrentDifficultyAt(entity.blockPosition()), MobSpawnType.COMMAND, (SpawnGroupData)null, (CompoundTag)null); } -- if (!serverlevel.tryAddFreshEntityWithPassengers(entity)) { -+ if (!serverlevel.tryAddFreshEntityWithPassengers(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.COMMAND)) { // CraftBukkit - pass a spawn reason of "COMMAND" ++ serverlevel.ketting$tryAddFreshEntityWithPassengers$spawnReason.set(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.COMMAND); // Ketting - CraftBukkit - pass a spawn reason of "COMMAND" + if (!serverlevel.tryAddFreshEntityWithPassengers(entity)) { throw ERROR_DUPLICATE_UUID.create(); } else { - return entity; diff --git a/patches/minecraft/net/minecraft/server/dedicated/DedicatedServerProperties.java.patch b/patches/minecraft/net/minecraft/server/dedicated/DedicatedServerProperties.java.patch index 90c8ea7e85..bff5ab73b2 100644 --- a/patches/minecraft/net/minecraft/server/dedicated/DedicatedServerProperties.java.patch +++ b/patches/minecraft/net/minecraft/server/dedicated/DedicatedServerProperties.java.patch @@ -8,25 +8,10 @@ public final boolean onlineMode = this.get("online-mode", true); public final boolean preventProxyConnections = this.get("prevent-proxy-connections", false); public final String serverIp = this.get("server-ip", ""); -@@ -103,27 +_,46 @@ - private final DedicatedServerProperties.WorldDimensionData worldDimensionData; - public final WorldOptions worldOptions; +@@ -118,12 +_,31 @@ + this.initialDataPackConfiguration = getDatapackConfig(this.get("initial-enabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getEnabled())), this.get("initial-disabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getDisabled()))); + } -- public DedicatedServerProperties(Properties p_180926_) { -- super(p_180926_); -- String s = this.get("level-seed", ""); -- boolean flag = this.get("generate-structures", true); -- long i = WorldOptions.parseSeed(s).orElse(WorldOptions.randomSeed()); -- this.worldOptions = new WorldOptions(i, flag, false); -- this.worldDimensionData = new DedicatedServerProperties.WorldDimensionData(this.get("generator-settings", (p_211543_) -> { -- return GsonHelper.parse(!p_211543_.isEmpty() ? p_211543_ : "{}"); -- }, new JsonObject()), this.get("level-type", (p_211541_) -> { -- return p_211541_.toLowerCase(Locale.ROOT); -- }, WorldPresets.NORMAL.location().toString())); -- this.serverResourcePackInfo = getServerPackInfo(this.get("resource-pack", ""), this.get("resource-pack-sha1", ""), this.getLegacyString("resource-pack-hash"), this.get("require-resource-pack", false), this.get("resource-pack-prompt", "")); -- this.initialDataPackConfiguration = getDatapackConfig(this.get("initial-enabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getEnabled())), this.get("initial-disabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getDisabled()))); -- } -- - public static DedicatedServerProperties fromFile(Path p_180930_) { - return new DedicatedServerProperties(loadFromFile(p_180930_)); - } @@ -50,21 +35,6 @@ + this.initialDataPackConfiguration = getDatapackConfig(this.get("initial-enabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getEnabled())), this.get("initial-disabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getDisabled()))); + } + -+ public DedicatedServerProperties(Properties properties) { -+ super(properties); -+ String s = this.get("level-seed", ""); -+ boolean flag = this.get("generate-structures", true); -+ long i = WorldOptions.parseSeed(s).orElse(WorldOptions.randomSeed()); -+ this.worldOptions = new WorldOptions(i, flag, false); -+ this.worldDimensionData = new DedicatedServerProperties.WorldDimensionData(this.get("generator-settings", (p_211543_) -> { -+ return GsonHelper.parse(!p_211543_.isEmpty() ? p_211543_ : "{}"); -+ }, new JsonObject()), this.get("level-type", (p_211541_) -> { -+ return p_211541_.toLowerCase(Locale.ROOT); -+ }, WorldPresets.NORMAL.location().toString())); -+ this.serverResourcePackInfo = getServerPackInfo(this.get("resource-pack", ""), this.get("resource-pack-sha1", ""), this.getLegacyString("resource-pack-hash"), this.get("require-resource-pack", false), this.get("resource-pack-prompt", "")); -+ this.initialDataPackConfiguration = getDatapackConfig(this.get("initial-enabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getEnabled())), this.get("initial-disabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getDisabled()))); -+ } -+ + // CraftBukkit start + public static DedicatedServerProperties fromFile(Path p_180930_, joptsimple.OptionSet optionset) { + return new DedicatedServerProperties(loadFromFile(p_180930_), optionset); diff --git a/patches/minecraft/net/minecraft/server/level/ChunkMap.java.patch b/patches/minecraft/net/minecraft/server/level/ChunkMap.java.patch index 5682d20cab..99f767065b 100644 --- a/patches/minecraft/net/minecraft/server/level/ChunkMap.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ChunkMap.java.patch @@ -135,7 +135,7 @@ } } -@@ -946,21 +_,39 @@ +@@ -946,21 +_,48 @@ private CompletableFuture> readChunk(ChunkPos p_214964_) { return this.read(p_214964_).thenApplyAsync((p_214907_) -> { @@ -149,25 +149,34 @@ }, Util.backgroundExecutor()); } -- private CompoundTag upgradeChunkTag(CompoundTag p_214948_) { -- return this.upgradeChunkTag(this.level.dimension(), this.overworldDataStorage, p_214948_, this.generator.getTypeNameForDataFixer()); + // CraftBukkit start ++ public java.util.concurrent.atomic.AtomicReference ketting$upgradeChunkTag$pos = new java.util.concurrent.atomic.AtomicReference<>(null); + private CompoundTag upgradeChunkTag(CompoundTag p_214948_, ChunkPos pos) { -+ return this.upgradeChunkTag(Registries.levelToLevelStem(this.level.dimension()), this.overworldDataStorage, p_214948_, this.generator.getTypeNameForDataFixer(), pos, level); ++ ketting$upgradeChunkTag$pos.set(pos); ++ return upgradeChunkTag(p_214948_); ++ } + private CompoundTag upgradeChunkTag(CompoundTag p_214948_) { +- return this.upgradeChunkTag(this.level.dimension(), this.overworldDataStorage, p_214948_, this.generator.getTypeNameForDataFixer()); +- } ++ return this.upgradeChunkTag(Registries.levelToLevelStem(this.level.dimension()), this.overworldDataStorage, p_214948_, this.generator.getTypeNameForDataFixer(), ketting$upgradeChunkTag$pos.getAndSet(null), level); + // CraftBukkit end - } - - boolean anyPlayerCloseEnoughForSpawning(ChunkPos p_183880_) { -+ // Spigot start -+ return anyPlayerCloseEnoughForSpawning(p_183880_, false); + } + ++ //Ketting start ++ public java.util.concurrent.atomic.AtomicBoolean ketting$anyPlayerCloseEnoughForSpawning$reducedRange = new java.util.concurrent.atomic.AtomicBoolean(false); + boolean anyPlayerCloseEnoughForSpawning(ChunkPos p_183880_, boolean reducedRange) { ++ ketting$anyPlayerCloseEnoughForSpawning$reducedRange.set(reducedRange); ++ // Spigot start ++ return anyPlayerCloseEnoughForSpawning(p_183880_); ++ } ++ //Ketting end + + boolean anyPlayerCloseEnoughForSpawning(ChunkPos p_183880_) { + int chunkRange = level.spigotConfig.mobSpawnRange; + chunkRange = (chunkRange > level.spigotConfig.viewDistance) ? (byte) level.spigotConfig.viewDistance : chunkRange; + chunkRange = (chunkRange > 8) ? 8 : chunkRange; + -+ double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; ++ double blockRange = (ketting$anyPlayerCloseEnoughForSpawning$reducedRange.getAndSet(false)) ? Math.pow(chunkRange << 4, 2) : 16384.0D; + // Spigot end long i = p_183880_.toLong(); if (!this.distanceManager.hasPlayersNearby(i)) { @@ -179,27 +188,23 @@ return true; } } -@@ -977,7 +_,7 @@ - ImmutableList.Builder builder = ImmutableList.builder(); - - for(ServerPlayer serverplayer : this.playerMap.getPlayers(i)) { -- if (this.playerIsCloseEnoughForSpawning(serverplayer, p_183889_)) { -+ if (this.playerIsCloseEnoughForSpawning(serverplayer, p_183889_, 16384.0D)) { - builder.add(serverplayer); - } - } -@@ -986,12 +_,12 @@ +@@ -986,12 +_,18 @@ } } -- private boolean playerIsCloseEnoughForSpawning(ServerPlayer p_183752_, ChunkPos p_183753_) { -+ private boolean playerIsCloseEnoughForSpawning(ServerPlayer p_183752_, ChunkPos p_183753_, double range) { // Spigot ++ public final java.util.concurrent.atomic.AtomicReference ketting$playerIsCloseEnoughForSpawning$range = new java.util.concurrent.atomic.AtomicReference<>(16384.0D); ++ private boolean playerIsCloseEnoughForSpawning(ServerPlayer p_183752_, ChunkPos p_183753_, double range) { ++ ketting$playerIsCloseEnoughForSpawning$range.set(range); ++ return playerIsCloseEnoughForSpawning(p_183752_, p_183753_); ++ } + private boolean playerIsCloseEnoughForSpawning(ServerPlayer p_183752_, ChunkPos p_183753_) { if (p_183752_.isSpectator()) { ++ ketting$playerIsCloseEnoughForSpawning$range.set(16384.0D); return false; } else { double d0 = euclideanDistanceSquared(p_183753_, p_183752_); - return d0 < 16384.0D; -+ return d0 < range; // Spigot ++ return d0 < java.util.Objects.requireNonNullElse(ketting$playerIsCloseEnoughForSpawning$range.getAndSet(16384.0D), 16384.0D); // Ketting - Spigot } } diff --git a/patches/minecraft/net/minecraft/server/level/DistanceManager.java.patch b/patches/minecraft/net/minecraft/server/level/DistanceManager.java.patch index 49aeac0bc3..be7e5deb49 100644 --- a/patches/minecraft/net/minecraft/server/level/DistanceManager.java.patch +++ b/patches/minecraft/net/minecraft/server/level/DistanceManager.java.patch @@ -42,16 +42,15 @@ return true; } else { if (!this.ticketsToRelease.isEmpty()) { -@@ -150,7 +_,7 @@ +@@ -150,6 +_,7 @@ } } -- void addTicket(long p_140785_, Ticket p_140786_) { -+ boolean addTicket(long p_140785_, Ticket p_140786_) { // CraftBukkit - void -> boolean ++ public boolean ketting$addTicket$returnValue = false; + void addTicket(long p_140785_, Ticket p_140786_) { SortedArraySet> sortedarrayset = this.getTickets(p_140785_); int i = getTicketLevelAt(sortedarrayset); - Ticket ticket = sortedarrayset.addOrGet(p_140786_); -@@ -159,11 +_,20 @@ +@@ -159,11 +_,21 @@ this.ticketTracker.update(p_140785_, p_140786_.getTicketLevel(), true); } @@ -60,11 +59,11 @@ + tickets.addOrGet(ticket); + } + -+ return p_140786_ == ticket; // CraftBukkit ++ ketting$addTicket$returnValue = (p_140786_ == ticket); // CraftBukkit } -- void removeTicket(long p_140819_, Ticket p_140820_) { -+ boolean removeTicket(long p_140819_, Ticket p_140820_) { // CraftBukkit - void -> boolean ++ public boolean ketting$removeTicket$returnValue = false; + void removeTicket(long p_140819_, Ticket p_140820_) { SortedArraySet> sortedarrayset = this.getTickets(p_140819_); + + boolean removed = false; // CraftBukkit @@ -86,7 +85,7 @@ + } + } + -+ return removed; // CraftBukkit ++ ketting$removeTicket$returnValue = removed; // CraftBukkit } public void addTicket(TicketType p_140793_, ChunkPos p_140794_, int p_140795_, T p_140796_) { @@ -94,58 +93,52 @@ this.removeTicket(p_140825_.toLong(), ticket); } -+ private boolean addRegionTicket$forceTicks; //Ketting ++ public boolean ketting$addRegionTicket$forceTicks; //Ketting public void addRegionTicket(TicketType p_140841_, ChunkPos p_140842_, int p_140843_, T p_140844_) { - Ticket ticket = new Ticket<>(p_140841_, ChunkLevel.byStatus(FullChunkStatus.FULL) - p_140843_, p_140844_); -- long i = p_140842_.toLong(); -- this.addTicket(i, ticket); -- this.tickingTicketsTracker.addTicket(i, ticket); -- } -- + // CraftBukkit start + addRegionTicketAtDistance(p_140841_, p_140842_, p_140843_, p_140844_); + } + -+ public boolean addRegionTicketAtDistance(TicketType tickettype, ChunkPos chunkcoordintpair, int i, T t0) { ++ public boolean addRegionTicketAtDistance(TicketType p_140841_, ChunkPos p_140842_, int p_140843_, T p_140844_) { + // CraftBukkit end -+ Ticket ticket = new Ticket<>(tickettype, ChunkLevel.byStatus(FullChunkStatus.FULL) - i, t0, addRegionTicket$forceTicks); //Ketting -+ long j = chunkcoordintpair.toLong(); -+ -+ boolean added = this.addTicket(j, ticket); // CraftBukkit -+ this.tickingTicketsTracker.addTicket(j, ticket); ++ Ticket ticket = new Ticket<>(p_140841_, ChunkLevel.byStatus(FullChunkStatus.FULL) - p_140843_, p_140844_, ketting$addRegionTicket$forceTicks); //Ketting + long i = p_140842_.toLong(); + this.addTicket(i, ticket); ++ boolean added = ketting$addTicket$returnValue; + this.tickingTicketsTracker.addTicket(i, ticket); +- } +- + return added; // CraftBukkit + } + + public void addRegionTicket(TicketType p_140841_, ChunkPos p_140842_, int p_140843_, T p_140844_, boolean forceTicks) { -+ addRegionTicket$forceTicks = forceTicks; //Ketting ++ ketting$addRegionTicket$forceTicks = forceTicks; //Ketting + addRegionTicket(p_140841_, p_140842_, p_140843_, p_140844_); -+ addRegionTicket$forceTicks = false; //Ketting ++ ketting$addRegionTicket$forceTicks = false; //Ketting + } + -+ private boolean removeRegionTicket$forceTicks; //Ketting ++ public boolean ketting$removeRegionTicket$forceTicks; //Ketting public void removeRegionTicket(TicketType p_140850_, ChunkPos p_140851_, int p_140852_, T p_140853_) { - Ticket ticket = new Ticket<>(p_140850_, ChunkLevel.byStatus(FullChunkStatus.FULL) - p_140852_, p_140853_); -- long i = p_140851_.toLong(); -- this.removeTicket(i, ticket); -- this.tickingTicketsTracker.removeTicket(i, ticket); + // CraftBukkit start + removeRegionTicketAtDistance(p_140850_, p_140851_, p_140852_, p_140853_); + } + -+ public boolean removeRegionTicketAtDistance(TicketType tickettype, ChunkPos chunkcoordintpair, int i, T t0) { ++ public boolean removeRegionTicketAtDistance(TicketType p_140850_, ChunkPos p_140851_, int p_140852_, T p_140853_) { + // CraftBukkit end -+ Ticket ticket = new Ticket<>(tickettype, ChunkLevel.byStatus(FullChunkStatus.FULL) - i, t0, removeRegionTicket$forceTicks); //Ketting -+ long j = chunkcoordintpair.toLong(); -+ -+ boolean removed = this.removeTicket(j, ticket); // CraftBukkit -+ this.tickingTicketsTracker.removeTicket(j, ticket); ++ Ticket ticket = new Ticket<>(p_140850_, ChunkLevel.byStatus(FullChunkStatus.FULL) - p_140852_, p_140853_, ketting$removeRegionTicket$forceTicks); //Ketting + long i = p_140851_.toLong(); + this.removeTicket(i, ticket); ++ boolean removed = ketting$removeTicket$returnValue; + this.tickingTicketsTracker.removeTicket(i, ticket); + return removed; // CraftBukkit + } + + public void removeRegionTicket(TicketType p_140850_, ChunkPos p_140851_, int p_140852_, T p_140853_, boolean forceTicks) { -+ removeRegionTicket$forceTicks = forceTicks; //Ketting ++ ketting$removeRegionTicket$forceTicks = forceTicks; //Ketting + removeRegionTicket(p_140850_, p_140851_, p_140852_, p_140853_); -+ removeRegionTicket$forceTicks = false; //Ketting ++ ketting$removeRegionTicket$forceTicks = false; //Ketting } private SortedArraySet> getTickets(long p_140858_) { diff --git a/patches/minecraft/net/minecraft/server/level/ServerChunkCache.java.patch b/patches/minecraft/net/minecraft/server/level/ServerChunkCache.java.patch index 2d59988d83..9dfcd3a6bb 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerChunkCache.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerChunkCache.java.patch @@ -181,27 +181,35 @@ } } -@@ -432,11 +_,18 @@ +@@ -431,11 +_,28 @@ + }); } - public void addRegionTicket(TicketType p_8388_, ChunkPos p_8389_, int p_8390_, T p_8391_) { -- this.distanceManager.addRegionTicket(p_8388_, p_8389_, p_8390_, p_8391_); -+ addRegionTicket(p_8388_, p_8389_, p_8390_, p_8391_, false); ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicBoolean ketting$addRegionTicket$forceTicks = new java.util.concurrent.atomic.AtomicBoolean(false); ++ public void addRegionTicket(TicketType p_8388_, ChunkPos p_8389_, int p_8390_, T p_8391_, boolean forceTicks) { ++ ketting$addRegionTicket$forceTicks.set(forceTicks); ++ addRegionTicket(p_8388_, p_8389_, p_8390_, p_8391_); + } ++ //Ketting end + -+ public void addRegionTicket(TicketType p_8388_, ChunkPos p_8389_, int p_8390_, T p_8391_, boolean forceTicks) { -+ this.distanceManager.addRegionTicket(p_8388_, p_8389_, p_8390_, p_8391_, forceTicks); + public void addRegionTicket(TicketType p_8388_, ChunkPos p_8389_, int p_8390_, T p_8391_) { ++ this.distanceManager.ketting$addRegionTicket$forceTicks = ketting$addRegionTicket$forceTicks.getAndSet(false); //Ketting + this.distanceManager.addRegionTicket(p_8388_, p_8389_, p_8390_, p_8391_); } - public void removeRegionTicket(TicketType p_8439_, ChunkPos p_8440_, int p_8441_, T p_8442_) { -- this.distanceManager.removeRegionTicket(p_8439_, p_8440_, p_8441_, p_8442_); -+ removeRegionTicket(p_8439_, p_8440_, p_8441_, p_8442_, false); -+ } ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicBoolean ketting$removeRegionTicket$forceTicks = new java.util.concurrent.atomic.AtomicBoolean(false); + public void removeRegionTicket(TicketType p_8439_, ChunkPos p_8440_, int p_8441_, T p_8442_, boolean forceTicks) { -+ this.distanceManager.removeRegionTicket(p_8439_, p_8440_, p_8441_, p_8442_, forceTicks); ++ ketting$removeRegionTicket$forceTicks.set(forceTicks); ++ removeRegionTicket(p_8439_, p_8440_, p_8441_, p_8442_); ++ } ++ //Ketting end + public void removeRegionTicket(TicketType p_8439_, ChunkPos p_8440_, int p_8441_, T p_8442_) { ++ this.distanceManager.ketting$removeRegionTicket$forceTicks = ketting$removeRegionTicket$forceTicks.getAndSet(false); //Ketting + this.distanceManager.removeRegionTicket(p_8439_, p_8440_, p_8441_, p_8442_); } - public void updateChunkForced(ChunkPos p_8400_, boolean p_8401_) { @@ -534,13 +_,19 @@ super.doRunTask(p_8502_); } diff --git a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch index adc526d017..9a2172f51c 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch @@ -533,7 +533,7 @@ } + //Ketting start -+ private final java.util.concurrent.atomic.AtomicReference ketting$tryAddFreshEntityWithPassengers$spawnReason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); ++ public final java.util.concurrent.atomic.AtomicReference ketting$tryAddFreshEntityWithPassengers$spawnReason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); + public boolean tryAddFreshEntityWithPassengers(Entity p_8861_, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { + ketting$tryAddFreshEntityWithPassengers$spawnReason.set(reason); + return tryAddFreshEntityWithPassengers(p_8861_); @@ -780,21 +780,17 @@ int i = blockpos.getX(); int j = blockpos.getY() - 2; int k = blockpos.getZ(); -- BlockPos.betweenClosed(i - 2, j + 1, k - 2, i + 2, j + 3, k + 2).forEach((p_207578_) -> { -- p_8618_.setBlockAndUpdate(p_207578_, Blocks.AIR.defaultBlockState()); -- }); -- BlockPos.betweenClosed(i - 2, j, k - 2, i + 2, j, k + 2).forEach((p_184101_) -> { -- p_8618_.setBlockAndUpdate(p_184101_, Blocks.OBSIDIAN.defaultBlockState()); -- }); + + // CraftBukkit start + org.bukkit.craftbukkit.v1_20_R1.util.BlockStateListPopulator blockList = new org.bukkit.craftbukkit.v1_20_R1.util.BlockStateListPopulator(p_8618_); -+ BlockPos.betweenClosed(i - 2, j + 1, k - 2, i + 2, j + 3, k + 2).forEach((blockposition1) -> { -+ blockList.setBlock(blockposition1, Blocks.AIR.defaultBlockState(), 3); -+ }); -+ BlockPos.betweenClosed(i - 2, j, k - 2, i + 2, j, k + 2).forEach((blockposition1) -> { -+ blockList.setBlock(blockposition1, Blocks.OBSIDIAN.defaultBlockState(), 3); -+ }); + BlockPos.betweenClosed(i - 2, j + 1, k - 2, i + 2, j + 3, k + 2).forEach((p_207578_) -> { +- p_8618_.setBlockAndUpdate(p_207578_, Blocks.AIR.defaultBlockState()); ++ blockList.setBlock(p_207578_, Blocks.AIR.defaultBlockState(), 3); + }); + BlockPos.betweenClosed(i - 2, j, k - 2, i + 2, j, k + 2).forEach((p_184101_) -> { +- p_8618_.setBlockAndUpdate(p_184101_, Blocks.OBSIDIAN.defaultBlockState()); ++ blockList.setBlock(p_184101_, Blocks.OBSIDIAN.defaultBlockState(), 3); + }); + org.bukkit.World bworld = p_8618_.getWorld(); + Entity entity = ketting$makeObsidianPlatform$entity.getAndSet(null); + org.bukkit.event.world.PortalCreateEvent portalEvent = new org.bukkit.event.world.PortalCreateEvent((List) (List) blockList.getList(), bworld, (entity == null) ? null : entity.getBukkitEntity(), org.bukkit.event.world.PortalCreateEvent.CreateReason.END_PLATFORM); diff --git a/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch b/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch index 4007658eef..af045a9a9f 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch @@ -753,7 +753,7 @@ return this.isReachableBedBlock(p_9117_) || this.isReachableBedBlock(p_9117_.relative(p_9118_.getOpposite())); } -@@ -892,13 +_,31 @@ +@@ -892,12 +_,31 @@ } public void stopSleepInBed(boolean p_9165_, boolean p_9166_) { @@ -781,11 +781,10 @@ super.stopSleepInBed(p_9165_, p_9166_); if (this.connection != null) { -- this.connection.teleport(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); -+ this.connection.teleport(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot(), org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.EXIT_BED); // CraftBukkit ++ this.connection.ketting$teleport$reason.set(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.EXIT_BED);// Ketting - CraftBukkit + this.connection.teleport(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); } - } @@ -939,16 +_,47 @@ this.containerCounter = this.containerCounter % 100 + 1; } @@ -976,31 +975,17 @@ } protected void onEffectAdded(MobEffectInstance p_143393_, @Nullable Entity p_143394_) { -@@ -1173,6 +_,12 @@ - } - - public boolean teleportTo(ServerLevel p_265564_, double p_265424_, double p_265680_, double p_265312_, Set p_265192_, float p_265059_, float p_265266_) { -+ // CraftBukkit start -+ return teleportTo(p_265564_, p_265424_, p_265680_, p_265312_, p_265192_, p_265059_, p_265266_, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN); -+ } -+ -+ public boolean teleportTo(ServerLevel p_265564_, double p_265424_, double p_265680_, double p_265312_, Set p_265192_, float p_265059_, float p_265266_, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) { -+ // CraftBukkit end - ChunkPos chunkpos = new ChunkPos(BlockPos.containing(p_265424_, p_265680_, p_265312_)); - p_265564_.getChunkSource().addRegionTicket(TicketType.POST_TELEPORT, chunkpos, 1, this.getId()); - this.stopRiding(); -@@ -1181,9 +_,9 @@ +@@ -1181,8 +_,10 @@ } if (p_265564_ == this.level()) { -- this.connection.teleport(p_265424_, p_265680_, p_265312_, p_265059_, p_265266_, p_265192_); -+ this.connection.teleport(p_265424_, p_265680_, p_265312_, p_265059_, p_265266_, p_265192_, cause); // CraftBukkit ++ this.connection.ketting$teleport$reason.set(ketting$teleportTo$cause.getAndSet(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN)); // CraftBukkit + this.connection.teleport(p_265424_, p_265680_, p_265312_, p_265059_, p_265266_, p_265192_); } else { -- this.teleportTo(p_265564_, p_265424_, p_265680_, p_265312_, p_265059_, p_265266_); -+ this.teleportTo(p_265564_, p_265424_, p_265680_, p_265312_, p_265059_, p_265266_, cause); // CraftBukkit ++ ketting$ServerPlayer$teleportTo$cause.set(ketting$teleportTo$cause.getAndSet(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN)); + this.teleportTo(p_265564_, p_265424_, p_265680_, p_265312_, p_265059_, p_265266_); } - this.setYHeadRot(p_265059_); @@ -1215,6 +_,8 @@ } @@ -1062,16 +1047,21 @@ } public void swing(InteractionHand p_9031_) { -@@ -1400,27 +_,39 @@ +@@ -1400,27 +_,44 @@ return this.advancements; } ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$ServerPlayer$teleportTo$cause = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN); + // CraftBukkit start - public void teleportTo(ServerLevel p_9000_, double p_9001_, double p_9002_, double p_9003_, float p_9004_, float p_9005_) { -+ this.teleportTo(p_9000_, p_9001_, p_9002_, p_9003_, p_9004_, p_9005_, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN); ++ public void teleportTo(ServerLevel p_9000_, double p_9001_, double p_9002_, double p_9003_, float p_9004_, float p_9005_, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) { ++ ketting$ServerPlayer$teleportTo$cause.set(cause); ++ this.teleportTo(p_9000_, p_9001_, p_9002_, p_9003_, p_9004_, p_9005_); + } ++ // CraftBukkit end ++ //Ketting end + -+ public void teleportTo(ServerLevel p_9000_, double p_9001_, double p_9002_, double p_9003_, float p_9004_, float p_9005_, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) { + public void teleportTo(ServerLevel p_9000_, double p_9001_, double p_9002_, double p_9003_, float p_9004_, float p_9005_) { + // CraftBukkit end this.setCamera(this); this.stopRiding(); @@ -1100,7 +1090,7 @@ + net.minecraftforge.event.ForgeEventFactory.firePlayerChangedDimensionEvent(this, serverlevel.dimension(), p_9000_.dimension()); } + */ -+ this.getBukkitEntity().teleport(new org.bukkit.Location(p_9000_.getWorld(), p_9001_, p_9002_, p_9003_, p_9004_, p_9005_), cause); ++ this.getBukkitEntity().teleport(new org.bukkit.Location(p_9000_.getWorld(), p_9001_, p_9002_, p_9003_, p_9004_, p_9005_), ketting$ServerPlayer$teleportTo$cause.getAndSet(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN)); + // CraftBukkit end } @@ -1115,7 +1105,7 @@ + this.setRespawnPosition(p_9159_, p_9160_, p_9161_, p_9162_, p_9163_); + } + -+ private final java.util.concurrent.atomic.AtomicReference ketting$respawnPositionCause = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.player.PlayerSpawnChangeEvent.Cause.UNKNOWN); ++ public final java.util.concurrent.atomic.AtomicReference ketting$respawnPositionCause = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.player.PlayerSpawnChangeEvent.Cause.UNKNOWN); public void setRespawnPosition(ResourceKey p_9159_, @Nullable BlockPos p_9160_, float p_9161_, boolean p_9162_, boolean p_9163_) { + if (net.minecraftforge.event.ForgeEventFactory.onPlayerSpawnSet(this, p_9160_ == null ? Level.OVERWORLD : p_9159_, p_9160_, p_9162_)) return; + diff --git a/patches/minecraft/net/minecraft/server/level/ServerPlayerGameMode.java.patch b/patches/minecraft/net/minecraft/server/level/ServerPlayerGameMode.java.patch index 596460549a..f0e3ef86de 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerPlayerGameMode.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerPlayerGameMode.java.patch @@ -336,7 +336,7 @@ int i = p_9264_.getCount(); int j = p_9264_.getDamageValue(); InteractionResultHolder interactionresultholder = p_9264_.use(p_9263_, p_9262_, p_9265_); -@@ -294,52 +_,124 @@ +@@ -294,24 +_,71 @@ } } @@ -354,127 +354,87 @@ + private org.bukkit.event.player.PlayerInteractEvent useItemOn$event = null; + //Ketting end public InteractionResult useItemOn(ServerPlayer p_9266_, Level p_9267_, ItemStack p_9268_, InteractionHand p_9269_, BlockHitResult p_9270_) { -- BlockPos blockpos = p_9270_.getBlockPos(); -- BlockState blockstate = p_9267_.getBlockState(blockpos); -- if (!blockstate.getBlock().isEnabled(p_9267_.enabledFeatures())) { -- return InteractionResult.FAIL; -- } else if (this.gameModeForPlayer == GameType.SPECTATOR) { -- MenuProvider menuprovider = blockstate.getMenuProvider(p_9267_, blockpos); -- if (menuprovider != null) { -- p_9266_.openMenu(menuprovider); -- return InteractionResult.SUCCESS; -- } else { -- return InteractionResult.PASS; -- } -- } else { -- boolean flag = !p_9266_.getMainHandItem().isEmpty() || !p_9266_.getOffhandItem().isEmpty(); -- boolean flag1 = p_9266_.isSecondaryUseActive() && flag; -- ItemStack itemstack = p_9268_.copy(); -- if (!flag1) { -- InteractionResult interactionresult = blockstate.use(p_9267_, p_9266_, p_9269_, p_9270_); -- if (interactionresult.consumesAction()) { -- CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(p_9266_, blockpos, itemstack); -- return interactionresult; + try { -+ BlockPos blockpos = p_9270_.getBlockPos(); -+ BlockState blockstate = p_9267_.getBlockState(blockpos); + BlockPos blockpos = p_9270_.getBlockPos(); + BlockState blockstate = p_9267_.getBlockState(blockpos); + if (!blockstate.getBlock().isEnabled(p_9267_.enabledFeatures())) { + return InteractionResult.FAIL; ++ } ++ net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock event = net.minecraftforge.common.ForgeHooks.onRightClickBlock(p_9266_, p_9269_, blockpos, p_9270_); ++ if (event.isCanceled()) return event.getCancellationResult(); + -+ if (!blockstate.getBlock().isEnabled(p_9267_.enabledFeatures())) { -+ return InteractionResult.FAIL; -+ } -+ net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock event = net.minecraftforge.common.ForgeHooks.onRightClickBlock(p_9266_, p_9269_, blockpos, p_9270_); -+ if (event.isCanceled()) return event.getCancellationResult(); ++ if (!blockstate.getBlock().isEnabled(p_9267_.enabledFeatures())) { ++ return InteractionResult.FAIL; ++ } + -+ if (!blockstate.getBlock().isEnabled(p_9267_.enabledFeatures())) { -+ return InteractionResult.FAIL; -+ } ++ if (this.gameModeForPlayer == GameType.SPECTATOR) { ++ MenuProvider itileinventory = blockstate.getMenuProvider(p_9267_, blockpos); ++ useItemOn$cancelled = !(itileinventory instanceof MenuProvider); ++ } + -+ if (this.gameModeForPlayer == GameType.SPECTATOR) { -+ MenuProvider itileinventory = blockstate.getMenuProvider(p_9267_, blockpos); -+ useItemOn$cancelled = !(itileinventory instanceof MenuProvider); -+ } ++ if (p_9266_.getCooldowns().isOnCooldown(p_9268_.getItem())) { ++ useItemOn$cancelled = true; ++ } + -+ if (p_9266_.getCooldowns().isOnCooldown(p_9268_.getItem())) { -+ useItemOn$cancelled = true; ++ useItemOn$event = org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callPlayerInteractEvent(p_9266_, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, blockpos, p_9270_.getDirection(), p_9268_, useItemOn$cancelled, p_9269_, p_9270_.getLocation()); ++ firedInteract = true; ++ interactResult = useItemOn$event.useItemInHand() == org.bukkit.event.Event.Result.DENY; ++ interactPosition = blockpos.immutable(); ++ interactHand = p_9269_; ++ interactItemStack = p_9268_.copy(); ++ if (useItemOn$event.useInteractedBlock() == org.bukkit.event.Event.Result.DENY) { ++ useItemOn$result = denyInteraction(p_9266_, p_9267_, blockstate, blockpos, p_9270_); + } else if (this.gameModeForPlayer == GameType.SPECTATOR) { +- MenuProvider menuprovider = blockstate.getMenuProvider(p_9267_, blockpos); +- if (menuprovider != null) { +- p_9266_.openMenu(menuprovider); ++ MenuProvider itileinventory = blockstate.getMenuProvider(p_9267_, blockpos); ++ ++ if (itileinventory != null) { ++ p_9266_.openMenu(itileinventory); + return InteractionResult.SUCCESS; + } else { + return InteractionResult.PASS; + } + } else { ++ UseOnContext useoncontext = new UseOnContext(p_9266_, p_9269_, p_9270_); ++ if (event.getUseItem() != net.minecraftforge.eventbus.api.Event.Result.DENY) { ++ InteractionResult result = p_9268_.onItemUseFirst(useoncontext); ++ if (result != InteractionResult.PASS) return result; + } + -+ useItemOn$event = org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory.callPlayerInteractEvent(p_9266_, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, blockpos, p_9270_.getDirection(), p_9268_, useItemOn$cancelled, p_9269_, p_9270_.getLocation()); -+ firedInteract = true; -+ interactResult = useItemOn$event.useItemInHand() == org.bukkit.event.Event.Result.DENY; -+ interactPosition = blockpos.immutable(); -+ interactHand = p_9269_; -+ interactItemStack = p_9268_.copy(); -+ if (useItemOn$event.useInteractedBlock() == org.bukkit.event.Event.Result.DENY) { -+ useItemOn$result = denyInteraction(p_9266_, p_9267_, blockstate, blockpos, p_9270_); -+ } else if (this.gameModeForPlayer == GameType.SPECTATOR) { -+ MenuProvider itileinventory = blockstate.getMenuProvider(p_9267_, blockpos); -+ -+ if (itileinventory != null) { -+ p_9266_.openMenu(itileinventory); -+ return InteractionResult.SUCCESS; -+ } else { -+ return InteractionResult.PASS; + boolean flag = !p_9266_.getMainHandItem().isEmpty() || !p_9266_.getOffhandItem().isEmpty(); +- boolean flag1 = p_9266_.isSecondaryUseActive() && flag; ++ boolean flag1 = (p_9266_.isSecondaryUseActive() && flag) && !(p_9266_.getMainHandItem().doesSneakBypassUse(p_9267_, blockpos, p_9266_) && p_9266_.getOffhandItem().doesSneakBypassUse(p_9267_, blockpos, p_9266_)); + ItemStack itemstack = p_9268_.copy(); +- if (!flag1) { ++ ++ if (event.getUseBlock() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (event.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY && !flag1)) { + InteractionResult interactionresult = blockstate.use(p_9267_, p_9266_, p_9269_, p_9270_); + if (interactionresult.consumesAction()) { + CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(p_9266_, blockpos, itemstack); +@@ -319,8 +_,8 @@ } -- } -- + } + - if (!p_9268_.isEmpty() && !p_9266_.getCooldowns().isOnCooldown(p_9268_.getItem())) { -+ } else { - UseOnContext useoncontext = new UseOnContext(p_9266_, p_9269_, p_9270_); -- InteractionResult interactionresult1; -- if (this.isCreative()) { -- int i = p_9268_.getCount(); -- interactionresult1 = p_9268_.useOn(useoncontext); -- p_9268_.setCount(i); -- } else { -- interactionresult1 = p_9268_.useOn(useoncontext); -- } -- -- if (interactionresult1.consumesAction()) { -- CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(p_9266_, blockpos, itemstack); -- } -- -- return interactionresult1; +- UseOnContext useoncontext = new UseOnContext(p_9266_, p_9269_, p_9270_); ++ if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (!p_9268_.isEmpty() && !p_9266_.getCooldowns().isOnCooldown(p_9268_.getItem()) && !interactResult)) { // add !interactResult SPIGOT-764 ++ if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY) return InteractionResult.PASS; + InteractionResult interactionresult1; + if (this.isCreative()) { + int i = p_9268_.getCount(); +@@ -335,11 +_,35 @@ + } + + return interactionresult1; - } else { - return InteractionResult.PASS; -+ if (event.getUseItem() != net.minecraftforge.eventbus.api.Event.Result.DENY) { -+ InteractionResult result = p_9268_.onItemUseFirst(useoncontext); -+ if (result != InteractionResult.PASS) return result; -+ } -+ -+ boolean flag = !p_9266_.getMainHandItem().isEmpty() || !p_9266_.getOffhandItem().isEmpty(); -+ boolean flag1 = (p_9266_.isSecondaryUseActive() && flag) && !(p_9266_.getMainHandItem().doesSneakBypassUse(p_9267_, blockpos, p_9266_) && p_9266_.getOffhandItem().doesSneakBypassUse(p_9267_, blockpos, p_9266_)); -+ ItemStack itemstack = p_9268_.copy(); -+ -+ if (event.getUseBlock() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (event.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY && !flag1)) { -+ InteractionResult interactionresult = blockstate.use(p_9267_, p_9266_, p_9269_, p_9270_); -+ if (interactionresult.consumesAction()) { -+ CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(p_9266_, blockpos, itemstack); -+ return interactionresult; -+ } -+ } -+ -+ if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (!p_9268_.isEmpty() && !p_9266_.getCooldowns().isOnCooldown(p_9268_.getItem()) && !interactResult)) { // add !interactResult SPIGOT-764 -+ if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY) return InteractionResult.PASS; -+ InteractionResult interactionresult1; -+ if (this.isCreative()) { -+ int i = p_9268_.getCount(); -+ interactionresult1 = p_9268_.useOn(useoncontext); -+ p_9268_.setCount(i); -+ } else { -+ interactionresult1 = p_9268_.useOn(useoncontext); -+ } -+ -+ if (interactionresult1.consumesAction()) { -+ CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(p_9266_, blockpos, itemstack); -+ } -+ -+ return interactionresult1; -+ } } -- } + } - } -+ return useItemOn$result; -+ //CraftBukkit end ++ return useItemOn$result; ++ //CraftBukkit end + } finally { + useItemOn$result = InteractionResult.PASS; + useItemOn$cancelled = false; diff --git a/patches/minecraft/net/minecraft/server/level/TicketType.java.patch b/patches/minecraft/net/minecraft/server/level/TicketType.java.patch index e2289c75e3..2aad2ac4a6 100644 --- a/patches/minecraft/net/minecraft/server/level/TicketType.java.patch +++ b/patches/minecraft/net/minecraft/server/level/TicketType.java.patch @@ -1,14 +1,5 @@ --- a/net/minecraft/server/level/TicketType.java +++ b/net/minecraft/server/level/TicketType.java -@@ -9,7 +_,7 @@ - public class TicketType { - private final String name; - private final Comparator comparator; -- private final long timeout; -+ public long timeout; - public static final TicketType START = create("start", (p_9471_, p_9472_) -> { - return 0; - }); @@ -22,6 +_,8 @@ public static final TicketType PORTAL = create("portal", Vec3i::compareTo, 300); public static final TicketType POST_TELEPORT = create("post_teleport", Integer::compareTo, 5); diff --git a/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index d5703b5222..e7fcd28da8 100644 --- a/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -623,51 +623,57 @@ this.player.doCheckFallDamage(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5, p_9874_.isOnGround()); } } -@@ -954,11 +_,62 @@ +@@ -954,11 +_,69 @@ return false; } -+ // CraftBukkit start - Delegate to teleport(org.bukkit.Location) - public void teleport(double p_9775_, double p_9776_, double p_9777_, float p_9778_, float p_9779_) { -- this.teleport(p_9775_, p_9776_, p_9777_, p_9778_, p_9779_, Collections.emptySet()); -+ this.teleport(p_9775_, p_9776_, p_9777_, p_9778_, p_9779_, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN); ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$teleport$reason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN); ++ public boolean ketting$teleport$result = false; ++ @SuppressWarnings("unused") //Ketting - CB compat ++ public void teleport(double p_9775_, double p_9776_, double p_9777_, float p_9778_, float p_9779_, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) { ++ ketting$teleport$reason.set(cause); ++ this.teleport(p_9775_, p_9776_, p_9777_, p_9778_, p_9779_); + } -+ -+ public void teleport(double d0, double d1, double d2, float f, float f1, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) { -+ this.teleport(d0, d1, d2, f, f1, Collections.emptySet(), cause); ++ @SuppressWarnings("unused") //Ketting - CB compat ++ public void teleport(double p_9781_, double p_9782_, double p_9783_, float p_9784_, float p_9785_, Set p_9786_, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) { ++ ketting$teleport$reason.set(cause); ++ this.teleport(p_9781_, p_9782_, p_9783_, p_9784_, p_9785_, p_9786_); ++ } ++ //Ketting end + public void teleport(double p_9775_, double p_9776_, double p_9777_, float p_9778_, float p_9779_) { + this.teleport(p_9775_, p_9776_, p_9777_, p_9778_, p_9779_, Collections.emptySet()); } public void teleport(double p_9781_, double p_9782_, double p_9783_, float p_9784_, float p_9785_, Set p_9786_) { -+ this.teleport(p_9781_, p_9782_, p_9783_, p_9784_, p_9785_, p_9786_, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN); -+ } -+ -+ public boolean teleport(double d0, double d1, double d2, float f, float f1, Set set, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) { // CraftBukkit - Return event status + org.bukkit.entity.Player player = this.getCraftPlayer(); + org.bukkit.Location from = player.getLocation(); -+ double x = d0; -+ double y = d1; -+ double z = d2; -+ float yaw = f; -+ float pitch = f1; ++ double x = p_9781_; ++ double y = p_9782_; ++ double z = p_9783_; ++ float yaw = p_9784_; ++ float pitch = p_9785_; + org.bukkit.Location to = new org.bukkit.Location(this.getCraftPlayer().getWorld(), x, y, z, yaw, pitch); + // SPIGOT-5171: Triggered on join + if (from.equals(to)) { -+ this.internalTeleport(d0, d1, d2, f, f1, set); -+ return false; // CraftBukkit - Return event status ++ this.internalTeleport(p_9781_, p_9782_, p_9783_, p_9784_, p_9785_, p_9786_); ++ ketting$teleport$result = false; // Ketting - CraftBukkit - Return event status ++ return; + } -+ org.bukkit.event.player.PlayerTeleportEvent event = new org.bukkit.event.player.PlayerTeleportEvent(player, from.clone(), to.clone(), cause); ++ org.bukkit.event.player.PlayerTeleportEvent event = new org.bukkit.event.player.PlayerTeleportEvent(player, from.clone(), to.clone(), ketting$teleport$reason.getAndSet(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN)); + this.cserver.getPluginManager().callEvent(event); + if (event.isCancelled() || !to.equals(event.getTo())) { -+ set.clear(); // Can't relative teleport ++ p_9786_.clear(); // Can't relative teleport + to = event.isCancelled() ? event.getFrom() : event.getTo(); -+ d0 = to.getX(); -+ d1 = to.getY(); -+ d2 = to.getZ(); -+ f = to.getYaw(); -+ f1 = to.getPitch(); ++ p_9781_ = to.getX(); ++ p_9782_ = to.getY(); ++ p_9783_ = to.getZ(); ++ p_9784_ = to.getYaw(); ++ p_9785_ = to.getPitch(); + } -+ this.internalTeleport(d0, d1, d2, f, f1, set); -+ return event.isCancelled(); // CraftBukkit - Return event status ++ this.internalTeleport(p_9781_, p_9782_, p_9783_, p_9784_, p_9785_, p_9786_); ++ ketting$teleport$result = event.isCancelled(); // Ketting - CraftBukkit - Return event status ++ return; + } + + public void teleport(org.bukkit.Location dest) { diff --git a/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch b/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch index 9402f9078c..42ea184f3a 100644 --- a/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch +++ b/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch @@ -4,19 +4,12 @@ private static final int SEND_PLAYER_INFO_INTERVAL = 600; private static final SimpleDateFormat BAN_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); private final MinecraftServer server; -- private final List players = Lists.newArrayList(); +- public final List players = Lists.newArrayList(); + public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - java.util.ArrayList -> CopyOnWriteArrayList: java.util.Iterator safety private final Map playersByUUID = Maps.newHashMap(); private final UserBanList bans = new UserBanList(USERBANLIST_FILE); private final IpBanList ipBans = new IpBanList(IPBANLIST_FILE); -@@ -126,14 +_,24 @@ - private boolean doWhiteList; - private final LayeredRegistryAccess registries; - private final RegistryAccess.Frozen synchronizedRegistries; -- protected final int maxPlayers; -+ public int maxPlayers; - private int viewDistance; - private int simulationDistance; +@@ -132,8 +_,18 @@ private boolean allowCheatsForAllPlayers; private static final boolean ALLOW_LOGOUTIVATOR = false; private int sendAllPlayerInfoIn; @@ -246,7 +239,7 @@ } else { compoundtag1 = this.playerIo.load(p_11225_); } -@@ -323,13 +_,15 @@ +@@ -323,22 +_,44 @@ } protected void save(ServerPlayer p_11277_) { @@ -264,13 +257,15 @@ if (playeradvancements != null) { playeradvancements.save(); } -@@ -337,8 +_,26 @@ + } - public void remove(ServerPlayer p_11287_) { -+ removeString(p_11287_); -+ } ++ public String ketting$remove$returnValue = ""; + public String removeString(ServerPlayer p_11287_) { // CraftBukkit - return string ++ remove(p_11287_); ++ return ketting$remove$returnValue; ++ } + public void remove(ServerPlayer p_11287_) { + net.minecraftforge.event.ForgeEventFactory.firePlayerLoggedOut(p_11287_); ServerLevel serverlevel = p_11287_.serverLevel(); p_11287_.awardStat(Stats.LEAVE_GAME); @@ -325,7 +320,7 @@ + cserver.getScoreboardManager().removePlayer(p_11287_.getBukkitEntity()); + // CraftBukkit end + -+ return playerQuitEvent.getQuitMessage(); // CraftBukkit ++ ketting$remove$returnValue = playerQuitEvent.getQuitMessage(); // CraftBukkit } - @Nullable @@ -414,7 +409,7 @@ public ServerPlayer getPlayerForLogin(GameProfile p_215625_) { UUID uuid = UUIDUtil.getOrCreatePlayerUUID(p_215625_); List list = Lists.newArrayList(); -@@ -409,6 +_,7 @@ +@@ -409,28 +_,60 @@ } for(ServerPlayer serverplayer1 : list) { @@ -422,62 +417,62 @@ serverplayer1.connection.disconnect(Component.translatable("multiplayer.disconnect.duplicate_login")); } -@@ -416,71 +_,160 @@ + return new ServerPlayer(this.server, this.server.overworld(), p_215625_); } - public ServerPlayer respawn(ServerPlayer p_11237_, boolean p_11238_) { -- this.players.remove(p_11237_); -- p_11237_.serverLevel().removePlayerImmediately(p_11237_, Entity.RemovalReason.DISCARDED); -- BlockPos blockpos = p_11237_.getRespawnPosition(); -- float f = p_11237_.getRespawnAngle(); -- boolean flag = p_11237_.isRespawnForced(); -- ServerLevel serverlevel = this.server.getLevel(p_11237_.getRespawnDimension()); -+ return respawn(p_11237_, p_11238_, org.bukkit.event.player.PlayerRespawnEvent.RespawnReason.PLUGIN); //Ketting todo: this should ideally be other -+ } ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$respawn$reason = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.player.PlayerRespawnEvent.RespawnReason.OTHER); ++ public final java.util.concurrent.atomic.AtomicReference ketting$respawn$location = new java.util.concurrent.atomic.AtomicReference<>(null); ++ public final java.util.concurrent.atomic.AtomicReference ketting$respawn$level = new java.util.concurrent.atomic.AtomicReference<>(null); ++ public final java.util.concurrent.atomic.AtomicBoolean ketting$respawn$avoidSuffocation = new java.util.concurrent.atomic.AtomicBoolean(true); + public ServerPlayer respawn(ServerPlayer p_11237_, boolean p_11238_, org.bukkit.event.player.PlayerRespawnEvent.RespawnReason reason) { -+ return this.respawn(p_11237_, this.server.getLevel(p_11237_.getRespawnDimension()), p_11238_, null, true, reason); ++ ketting$respawn$reason.set(reason); ++ return respawn(p_11237_, p_11238_); + } -+ + public ServerPlayer respawn(ServerPlayer player, ServerLevel level, boolean flag, org.bukkit.Location location, boolean avoidSuffocation, org.bukkit.event.player.PlayerRespawnEvent.RespawnReason reason) { -+ player.stopRiding(); // CraftBukkit -+ this.players.remove(player); -+ this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot -+ player.serverLevel().removePlayerImmediately(player, Entity.RemovalReason.DISCARDED); -+ BlockPos blockpos = player.getRespawnPosition(); -+ float f = player.getRespawnAngle(); -+ boolean flag1 = player.isRespawnForced(); ++ ketting$respawn$reason.set(reason); ++ return respawn(player, level, flag, location, avoidSuffocation); ++ } ++ public ServerPlayer respawn(ServerPlayer p_11237_, ServerLevel level, boolean p_11238_, org.bukkit.Location location, boolean avoidSuffocation) { ++ ketting$respawn$location.set(location); ++ ketting$respawn$level.set(level); ++ ketting$respawn$avoidSuffocation.set(avoidSuffocation); ++ return this.respawn(p_11237_, p_11238_); ++ } ++ //Ketting end + public ServerPlayer respawn(ServerPlayer p_11237_, boolean p_11238_) { ++ ServerLevel level = ketting$respawn$level.getAndSet(null); ++ if (level == null) level = this.server.getLevel(p_11237_.getRespawnDimension()); ++ p_11237_.stopRiding(); // CraftBukkit + this.players.remove(p_11237_); ++ this.playersByName.remove(p_11237_.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot + p_11237_.serverLevel().removePlayerImmediately(p_11237_, Entity.RemovalReason.DISCARDED); + BlockPos blockpos = p_11237_.getRespawnPosition(); + float f = p_11237_.getRespawnAngle(); +- boolean flag = p_11237_.isRespawnForced(); ++ boolean flag1 = p_11237_.isRespawnForced(); + /* CraftBukkit start -+ ServerLevel serverlevel = this.server.getLevel(player.getRespawnDimension()); + ServerLevel serverlevel = this.server.getLevel(p_11237_.getRespawnDimension()); Optional optional; if (serverlevel != null && blockpos != null) { - optional = Player.findRespawnPositionAndUseSpawnBlock(serverlevel, blockpos, f, flag, p_11238_); -+ optional = Player.findRespawnPositionAndUseSpawnBlock(serverlevel, blockpos, f, flag1, flag); ++ optional = Player.findRespawnPositionAndUseSpawnBlock(serverlevel, blockpos, f, flag1, p_11238_); } else { optional = Optional.empty(); } ServerLevel serverlevel1 = serverlevel != null && optional.isPresent() ? serverlevel : this.server.overworld(); -- ServerPlayer serverplayer = new ServerPlayer(this.server, serverlevel1, p_11237_.getGameProfile()); -- serverplayer.connection = p_11237_.connection; -- serverplayer.restoreFrom(p_11237_, p_11238_); -- serverplayer.setId(p_11237_.getId()); -- serverplayer.setMainArm(p_11237_.getMainArm()); -- -- for(String s : p_11237_.getTags()) { -+ ServerPlayer serverplayer = new ServerPlayer(this.server, serverlevel1, player.getGameProfile(), player.clientInformation()); + ServerPlayer serverplayer = new ServerPlayer(this.server, serverlevel1, p_11237_.getGameProfile()); + */ + -+ ServerPlayer serverplayer = player; -+ org.bukkit.World fromWorld = player.getBukkitEntity().getWorld(); ++ ServerPlayer serverplayer = p_11237_; ++ org.bukkit.World fromWorld = p_11237_.getBukkitEntity().getWorld(); + serverplayer.wonGame = false; + -+ serverplayer.connection = player.connection; -+ serverplayer.restoreFrom(player, flag); -+ serverplayer.setId(player.getId()); -+ serverplayer.setMainArm(player.getMainArm()); -+ -+ for(String s : player.getTags()) { - serverplayer.addTag(s); + serverplayer.connection = p_11237_.connection; + serverplayer.restoreFrom(p_11237_, p_11238_); + serverplayer.setId(p_11237_.getId()); +@@ -441,46 +_,123 @@ } boolean flag2 = false; @@ -500,14 +495,15 @@ - serverplayer.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F)); + + // CraftBukkit start - fire PlayerRespawnEvent ++ org.bukkit.Location location = ketting$respawn$location.getAndSet(null); + if (location == null) { + boolean isBedSpawn = false; -+ ServerLevel worldserver1 = this.server.getLevel(player.getRespawnDimension()); ++ ServerLevel worldserver1 = this.server.getLevel(p_11237_.getRespawnDimension()); + if (worldserver1 != null) { + Optional optional; + + if (blockpos != null) { -+ optional = Player.findRespawnPositionAndUseSpawnBlock(worldserver1, blockpos, f, flag1, flag); ++ optional = Player.findRespawnPositionAndUseSpawnBlock(worldserver1, blockpos, f, flag1, p_11238_); + } else { + optional = Optional.empty(); + } @@ -527,7 +523,7 @@ + } + + // entityplayer1.setRespawnPosition(worldserver1.dimension(), blockposition, f, flag1, false); // CraftBukkit - not required, just copies old location into reused entity -+ flag2 = !flag && flag3; ++ flag2 = !p_11238_ && flag3; + isBedSpawn = true; + location = org.bukkit.craftbukkit.v1_20_R1.util.CraftLocation.toBukkit(vec3d, worldserver1.getWorld(), f1, 0.0F); + } else if (blockpos != null) { @@ -543,17 +539,19 @@ + } + + org.bukkit.entity.Player respawnPlayer = serverplayer.getBukkitEntity(); -+ org.bukkit.event.player.PlayerRespawnEvent respawnEvent = new org.bukkit.event.player.PlayerRespawnEvent(respawnPlayer, location, isBedSpawn && !flag2, flag2, reason); ++ org.bukkit.event.player.PlayerRespawnEvent respawnEvent = new org.bukkit.event.player.PlayerRespawnEvent(respawnPlayer, location, isBedSpawn && !flag2, flag2, ketting$respawn$reason.getAndSet(org.bukkit.event.player.PlayerRespawnEvent.RespawnReason.OTHER)); + cserver.getPluginManager().callEvent(respawnEvent); + // Spigot Start -+ if (player.connection.isDisconnected()) { -+ return player; ++ if (p_11237_.connection.isDisconnected()) { ++ ketting$respawn$avoidSuffocation.set(true); ++ return p_11237_; + } + // Spigot End + + location = respawnEvent.getRespawnLocation(); -+ if (!flag) player.reset(); // SPIGOT-4785 ++ if (!p_11238_) p_11237_.reset(); // SPIGOT-4785 + } else { ++ ketting$respawn$reason.set(org.bukkit.event.player.PlayerRespawnEvent.RespawnReason.OTHER); + location.setWorld(level.getWorld()); } + ServerLevel serverlevel1 = ((org.bukkit.craftbukkit.v1_20_R1.CraftWorld) location.getWorld()).getHandle(); @@ -563,13 +561,13 @@ + serverplayer.forceSetPositionRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); - while(!serverlevel1.noCollision(serverplayer) && serverplayer.getY() < (double)serverlevel1.getMaxBuildHeight()) { -+ while (avoidSuffocation && !level.noCollision((Entity) serverplayer) && serverplayer.getY() < (double) serverlevel1.getMaxBuildHeight()) { ++ while (ketting$respawn$avoidSuffocation.get() && !level.noCollision((Entity) serverplayer) && serverplayer.getY() < (double) serverlevel1.getMaxBuildHeight()) { + // CraftBukkit end serverplayer.setPos(serverplayer.getX(), serverplayer.getY() + 1.0D, serverplayer.getZ()); } ++ ketting$respawn$avoidSuffocation.set(true); -- byte b0 = (byte)(p_11238_ ? 1 : 0); -+ byte b0 = (byte)(flag ? 1 : 0); + byte b0 = (byte)(p_11238_ ? 1 : 0); LevelData leveldata = serverplayer.level().getLevelData(); serverplayer.connection.send(new ClientboundRespawnPacket(serverplayer.level().dimensionTypeId(), serverplayer.level().dimension(), BiomeManager.obfuscateSeed(serverplayer.serverLevel().getSeed()), serverplayer.gameMode.getGameModeForPlayer(), serverplayer.gameMode.getPreviousGameModeForPlayer(), serverplayer.level().isDebug(), serverplayer.serverLevel().isFlat(), b0, serverplayer.getLastDeathLocation(), serverplayer.getPortalCooldown())); - serverplayer.connection.teleport(serverplayer.getX(), serverplayer.getY(), serverplayer.getZ(), serverplayer.getYRot(), serverplayer.getXRot()); @@ -585,12 +583,12 @@ - this.players.add(serverplayer); - this.playersByUUID.put(serverplayer.getUUID(), serverplayer); - serverplayer.initInventoryMenu(); -+ if (!player.connection.isDisconnected()) { ++ if (!p_11237_.connection.isDisconnected()) { + serverlevel1.addRespawnedPlayer(serverplayer); + this.players.add(serverplayer); + this.playersByName.put(serverplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT), serverplayer); // Spigot + this.playersByUUID.put(serverplayer.getUUID(), serverplayer); -+ net.minecraftforge.event.ForgeEventFactory.firePlayerRespawnEvent(serverplayer, flag); ++ net.minecraftforge.event.ForgeEventFactory.firePlayerRespawnEvent(serverplayer, p_11238_); + } + // serverplayer.initInventoryMenu(); serverplayer.setHealth(serverplayer.getHealth()); @@ -613,7 +611,7 @@ + server.server.getPluginManager().callEvent(event); + } + -+ // Save player file again if they were disconnected ++ // Save p_11237_ file again if they were disconnected + if (serverplayer.connection.isDisconnected()) { + this.save(serverplayer); + } @@ -621,7 +619,7 @@ return serverplayer; } -@@ -493,19 +_,46 @@ +@@ -493,7 +_,18 @@ public void tick() { if (++this.sendAllPlayerInfoIn > 600) { @@ -641,13 +639,7 @@ this.sendAllPlayerInfoIn = 0; } - } - - public void broadcastAll(Packet p_11269_) { -- for(ServerPlayer serverplayer : this.players) { -+ for (ServerPlayer serverplayer : this.players) { - serverplayer.connection.send(p_11269_); - } +@@ -506,6 +_,22 @@ } diff --git a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch index 00bda89274..511e8a7d4a 100644 --- a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch @@ -1166,19 +1166,25 @@ public boolean isPushedByFluid() { return true; } -@@ -2605,6 +_,12 @@ +@@ -2605,7 +_,18 @@ } } ++ //Ketting start ++ public final java.util.concurrent.atomic.AtomicReference ketting$teleportTo$cause = new java.util.concurrent.atomic.AtomicReference<>(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN); + // CraftBukkit start -+ public boolean teleportTo(ServerLevel worldserver, double d0, double d1, double d2, Set set, float f, float f1, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) { -+ return this.teleportTo(worldserver, d0, d1, d2, set, f, f1); ++ public boolean teleportTo(ServerLevel p_265257_, double p_265407_, double p_265727_, double p_265410_, Set p_265083_, float p_265573_, float p_265094_, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) { ++ ketting$teleportTo$cause.set(cause); ++ return this.teleportTo(p_265257_, p_265407_, p_265727_, p_265410_, p_265083_, p_265573_, p_265094_); + } + // CraftBukkit end ++ //Ketting end + public boolean teleportTo(ServerLevel p_265257_, double p_265407_, double p_265727_, double p_265410_, Set p_265083_, float p_265573_, float p_265094_) { ++ ketting$teleportTo$cause.set(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN); float f = Mth.clamp(p_265094_, -90.0F, 90.0F); if (p_265257_ == this.level()) { + this.moveTo(p_265407_, p_265727_, p_265410_, p_265573_, f); @@ -2679,8 +_,10 @@ EntityDimensions entitydimensions = this.dimensions; Pose pose = this.getPose(); diff --git a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch index 40f33f70a8..eb2716dd9c 100644 --- a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch @@ -1561,7 +1561,7 @@ return false; } else { return item.getUseDuration(this.useItem) - this.useItemRemaining >= 5; -@@ -3050,15 +_,43 @@ +@@ -3050,15 +_,45 @@ } if (flag1) { @@ -1590,7 +1590,9 @@ + } + } else { + // player teleport event is called in the underlining code -+ if (((ServerPlayer) this).connection.teleport(p_20985_, d3, p_20987_, this.getYRot(), this.getXRot(), java.util.Collections.emptySet(), this.ketting$teleportCause.getAndSet(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN))) { ++ ((ServerPlayer) this).connection.ketting$teleport$reason.set(this.ketting$teleportCause.getAndSet(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN)); ++ ((ServerPlayer) this).connection.teleport(p_20985_, d3, p_20987_, this.getYRot(), this.getXRot(), java.util.Collections.emptySet()); ++ if (((ServerPlayer) this).connection.ketting$teleport$result) { + this.ketting$randomTeleportCB = Optional.empty(); // CraftBukkit // Ketting + return false; + } diff --git a/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java b/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java index 48bdaa2c09..33685ea392 100644 --- a/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java +++ b/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java @@ -111,7 +111,9 @@ public enum RespawnReason { /** * When a plugin respawns the player. */ - PLUGIN; - //Todo: add a Other reason for use in PlayerList.respawn compat method + PLUGIN, + //Ketting start + OTHER; + //Ketting end } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 63912b2f8d..2be6151bd9 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1064,4 +1064,11 @@ public net.minecraft.world.entity.animal.allay.Allay m_218376_()V # duplicateAll public-f net.minecraft.world.entity.ai.attributes.RangedAttribute f_22308_ # maxValue public net.minecraft.util.datafix.fixes.ItemIdFix f_15937_ # ITEM_NAMES + +public net.minecraft.server.ReloadableServerResources f_206847_ # commands + +public net.minecraft.server.players.PlayerList f_11196_ # players +public-f net.minecraft.server.players.PlayerList f_11193_ # maxPlayers + +public-f net.minecraft.server.level.TicketType f_9452_ # timeout #endgroup KETTING \ No newline at end of file From 1c15f16ba167424b7c7af09907779eee41601148 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Tue, 19 Mar 2024 19:37:10 +0100 Subject: [PATCH 16/21] fix compile #1 --- .../world/entity/decoration/HangingEntity.java.patch | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch index ae556b8a17..2adcc13d61 100644 --- a/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/decoration/HangingEntity.java +++ b/net/minecraft/world/entity/decoration/HangingEntity.java -@@ -58,34 +_,45 @@ +@@ -58,36 +_,47 @@ protected void recalculateBoundingBox() { if (this.direction != null) { @@ -32,6 +32,8 @@ - this.setBoundingBox(new AABB(d0 - d6, d1 - d7, d2 - d8, d0 + d6, d1 + d7, d2 + d8)); - } - } +- +- private double offs(int p_31710_) { + // CraftBukkit start code moved in to calculateBoundingBox + this.setBoundingBox(calculateBoundingBox(this, this.pos, this.direction, this.getWidth(), this.getHeight())); + // CraftBukkit end @@ -71,9 +73,11 @@ + return new AABB(d0 - d6, d1 - d7, d2 - d8, d0 + d6, d1 + d7, d2 + d8); + } + // CraftBukkit end - - private double offs(int p_31710_) { ++ ++ private static double offs(int p_31710_) { return p_31710_ % 32 == 0 ? 0.5D : 0.0D; + } + @@ -97,6 +_,24 @@ if (this.checkInterval++ == 100) { this.checkInterval = 0; From bcac5091a1e8eaf23034edf6b28524e50d7ff1dc Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Wed, 20 Mar 2024 06:18:58 +0100 Subject: [PATCH 17/21] Fixes: #189 --- .../server/level/ServerPlayer.java.patch | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch b/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch index af045a9a9f..d2659f4733 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch @@ -1047,7 +1047,7 @@ } public void swing(InteractionHand p_9031_) { -@@ -1400,27 +_,44 @@ +@@ -1400,27 +_,46 @@ return this.advancements; } @@ -1065,15 +1065,16 @@ + // CraftBukkit end this.setCamera(this); this.stopRiding(); -+ /* CraftBukkit start - replace with bukkit handling for multi-world ++ // /* CraftBukkit start - replace with bukkit handling for multi-world ++ // Ketting - disabling causes inv desync on dimension changes. ++ // https://github.com/kettingpowered/Ketting-1-20-x/issues/189 if (p_9000_ == this.level()) { this.connection.teleport(p_9001_, p_9002_, p_9003_, p_9004_, p_9005_); - } else { -+ } else if (!net.minecraftforge.event.ForgeEventFactory.onTravelToDimension(this, p_9000_.dimension())) { ++ } else if (net.minecraftforge.common.ForgeHooks.onTravelToDimension(this, p_9000_.dimension())) { ServerLevel serverlevel = this.serverLevel(); LevelData leveldata = p_9000_.getLevelData(); -- this.connection.send(new ClientboundRespawnPacket(p_9000_.dimensionTypeId(), p_9000_.dimension(), BiomeManager.obfuscateSeed(p_9000_.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), p_9000_.isDebug(), p_9000_.isFlat(), (byte)3, this.getLastDeathLocation(), this.getPortalCooldown())); -+ this.connection.send(new ClientboundRespawnPacket(this.createCommonSpawnInfo(p_9000_), (byte)3)); + this.connection.send(new ClientboundRespawnPacket(p_9000_.dimensionTypeId(), p_9000_.dimension(), BiomeManager.obfuscateSeed(p_9000_.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), p_9000_.isDebug(), p_9000_.isFlat(), (byte)3, this.getLastDeathLocation(), this.getPortalCooldown())); this.connection.send(new ClientboundChangeDifficultyPacket(leveldata.getDifficulty(), leveldata.isDifficultyLocked())); this.server.getPlayerList().sendPlayerPermissionLevel(this); serverlevel.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); @@ -1089,8 +1090,8 @@ this.server.getPlayerList().sendAllPlayerInfo(this); + net.minecraftforge.event.ForgeEventFactory.firePlayerChangedDimensionEvent(this, serverlevel.dimension(), p_9000_.dimension()); } -+ */ -+ this.getBukkitEntity().teleport(new org.bukkit.Location(p_9000_.getWorld(), p_9001_, p_9002_, p_9003_, p_9004_, p_9005_), ketting$ServerPlayer$teleportTo$cause.getAndSet(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN)); ++ //*/ ++ //this.getBukkitEntity().teleport(new org.bukkit.Location(p_9000_.getWorld(), p_9001_, p_9002_, p_9003_, p_9004_, p_9005_), ketting$ServerPlayer$teleportTo$cause.getAndSet(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN), false); + // CraftBukkit end } From 0466b7a18c07863f7f88437cd52ed3b703a9ba0c Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:07:23 +0100 Subject: [PATCH 18/21] Add some stacktraces for setting bad EntityDataAccessor values. Fixes: #141 (doesn't technically fix it, but it's the best we can do from our side) --- .../network/syncher/SynchedEntityData.java.patch | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/patches/minecraft/net/minecraft/network/syncher/SynchedEntityData.java.patch b/patches/minecraft/net/minecraft/network/syncher/SynchedEntityData.java.patch index 6176c67d04..3c6afa81c0 100644 --- a/patches/minecraft/net/minecraft/network/syncher/SynchedEntityData.java.patch +++ b/patches/minecraft/net/minecraft/network/syncher/SynchedEntityData.java.patch @@ -26,6 +26,17 @@ int i = p_135373_.getId(); if (i > 254) { throw new IllegalArgumentException("Data value id is too big with " + i + "! (Max is 254)"); +@@ -124,6 +_,10 @@ + + public void set(EntityDataAccessor p_276368_, T p_276363_, boolean p_276370_) { + SynchedEntityData.DataItem dataitem = this.getItem(p_276368_); ++ if (!dataitem.getValue().getClass().isAssignableFrom(p_276363_.getClass())){ ++ org.kettingpowered.ketting.core.Ketting.LOGGER.error("Bad set of EntityDataAccessor value. Ignoring", new IllegalStateException()); ++ return; ++ } + if (p_276370_ || ObjectUtils.notEqual(p_276363_, dataitem.getValue())) { + dataitem.setValue(p_276363_); + this.entity.onSyncedDataUpdated(p_276368_); @@ -133,6 +_,13 @@ } From 72ce36885b105d10da3ea6226bea83c7920e7639 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:40:23 +0100 Subject: [PATCH 19/21] Capabilities remained invalid, after respawn Fixes: #134, #190, #194, #195 --- .../server/players/PlayerList.java.patch | 93 +++++++------------ 1 file changed, 33 insertions(+), 60 deletions(-) diff --git a/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch b/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch index 42ea184f3a..e66b396a56 100644 --- a/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch +++ b/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch @@ -409,7 +409,7 @@ public ServerPlayer getPlayerForLogin(GameProfile p_215625_) { UUID uuid = UUIDUtil.getOrCreatePlayerUUID(p_215625_); List list = Lists.newArrayList(); -@@ -409,28 +_,60 @@ +@@ -409,18 +_,44 @@ } for(ServerPlayer serverplayer1 : list) { @@ -449,17 +449,12 @@ p_11237_.serverLevel().removePlayerImmediately(p_11237_, Entity.RemovalReason.DISCARDED); BlockPos blockpos = p_11237_.getRespawnPosition(); float f = p_11237_.getRespawnAngle(); -- boolean flag = p_11237_.isRespawnForced(); -+ boolean flag1 = p_11237_.isRespawnForced(); + boolean flag = p_11237_.isRespawnForced(); + /* CraftBukkit start ServerLevel serverlevel = this.server.getLevel(p_11237_.getRespawnDimension()); Optional optional; if (serverlevel != null && blockpos != null) { -- optional = Player.findRespawnPositionAndUseSpawnBlock(serverlevel, blockpos, f, flag, p_11238_); -+ optional = Player.findRespawnPositionAndUseSpawnBlock(serverlevel, blockpos, f, flag1, p_11238_); - } else { - optional = Optional.empty(); - } +@@ -431,8 +_,15 @@ ServerLevel serverlevel1 = serverlevel != null && optional.isPresent() ? serverlevel : this.server.overworld(); ServerPlayer serverplayer = new ServerPlayer(this.server, serverlevel1, p_11237_.getGameProfile()); @@ -471,71 +466,52 @@ + serverplayer.connection = p_11237_.connection; serverplayer.restoreFrom(p_11237_, p_11238_); ++ serverplayer.reviveCaps(); serverplayer.setId(p_11237_.getId()); -@@ -441,46 +_,123 @@ + serverplayer.setMainArm(p_11237_.getMainArm()); + +@@ -441,6 +_,21 @@ } boolean flag2 = false; -- if (optional.isPresent()) { -- BlockState blockstate = serverlevel1.getBlockState(blockpos); -- boolean flag1 = blockstate.is(Blocks.RESPAWN_ANCHOR); -- Vec3 vec3 = optional.get(); -- float f1; -- if (!blockstate.is(BlockTags.BEDS) && !flag1) { -- f1 = f; -- } else { -- Vec3 vec31 = Vec3.atBottomCenterOf(blockpos).subtract(vec3).normalize(); -- f1 = (float)Mth.wrapDegrees(Mth.atan2(vec31.z, vec31.x) * (double)(180F / (float)Math.PI) - 90.0D); -- } -- -- serverplayer.moveTo(vec3.x, vec3.y, vec3.z, f1, 0.0F); -- serverplayer.setRespawnPosition(serverlevel1.dimension(), blockpos, f, flag, false); -- flag2 = !p_11238_ && flag1; -- } else if (blockpos != null) { -- serverplayer.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F)); + + // CraftBukkit start - fire PlayerRespawnEvent + org.bukkit.Location location = ketting$respawn$location.getAndSet(null); + if (location == null) { + boolean isBedSpawn = false; -+ ServerLevel worldserver1 = this.server.getLevel(p_11237_.getRespawnDimension()); -+ if (worldserver1 != null) { -+ Optional optional; ++ ServerLevel serverlevel1 = this.server.getLevel(p_11237_.getRespawnDimension()); ++ if (serverlevel1 != null) { ++ Optional optional; + + if (blockpos != null) { -+ optional = Player.findRespawnPositionAndUseSpawnBlock(worldserver1, blockpos, f, flag1, p_11238_); ++ optional = Player.findRespawnPositionAndUseSpawnBlock(serverlevel1, blockpos, f, flag, p_11238_); + } else { + optional = Optional.empty(); + } + -+ if (optional.isPresent()) { -+ BlockState iblockdata = worldserver1.getBlockState(blockpos); -+ boolean flag3 = iblockdata.is(Blocks.RESPAWN_ANCHOR); -+ Vec3 vec3d = (Vec3) optional.get(); -+ float f1; -+ -+ if (!iblockdata.is(BlockTags.BEDS) && !flag3) { -+ f1 = f; -+ } else { -+ Vec3 vec3d1 = Vec3.atBottomCenterOf(blockpos).subtract(vec3d).normalize(); -+ -+ f1 = (float) Mth.wrapDegrees(Mth.atan2(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D); -+ } -+ -+ // entityplayer1.setRespawnPosition(worldserver1.dimension(), blockposition, f, flag1, false); // CraftBukkit - not required, just copies old location into reused entity -+ flag2 = !p_11238_ && flag3; -+ isBedSpawn = true; -+ location = org.bukkit.craftbukkit.v1_20_R1.util.CraftLocation.toBukkit(vec3d, worldserver1.getWorld(), f1, 0.0F); -+ } else if (blockpos != null) { -+ serverplayer.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F)); + if (optional.isPresent()) { + BlockState blockstate = serverlevel1.getBlockState(blockpos); + boolean flag1 = blockstate.is(Blocks.RESPAWN_ANCHOR); +@@ -453,34 +_,94 @@ + f1 = (float)Mth.wrapDegrees(Mth.atan2(vec31.z, vec31.x) * (double)(180F / (float)Math.PI) - 90.0D); + } + +- serverplayer.moveTo(vec3.x, vec3.y, vec3.z, f1, 0.0F); +- serverplayer.setRespawnPosition(serverlevel1.dimension(), blockpos, f, flag, false); ++ // entityplayer1.setRespawnPosition(serverlevel1.dimension(), blockposition, f, flag, false); // CraftBukkit - not required, just copies old location into reused entity + flag2 = !p_11238_ && flag1; ++ isBedSpawn = true; ++ location = org.bukkit.craftbukkit.v1_20_R1.util.CraftLocation.toBukkit(vec3, serverlevel1.getWorld(), f1, 0.0F); + } else if (blockpos != null) { + serverplayer.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F)); + serverplayer.setRespawnPosition(null, null, 0f, false, false, org.bukkit.event.player.PlayerSpawnChangeEvent.Cause.RESET); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed + } + } + + if (location == null) { -+ worldserver1 = this.server.overworld(); -+ blockpos = serverplayer.getSpawnPoint(worldserver1); -+ location = org.bukkit.craftbukkit.v1_20_R1.util.CraftLocation.toBukkit(blockpos, worldserver1.getWorld()).add(0.5F, 0.1F, 0.5F); ++ serverlevel1 = this.server.overworld(); ++ blockpos = serverplayer.getSpawnPoint(serverlevel1); ++ location = org.bukkit.craftbukkit.v1_20_R1.util.CraftLocation.toBukkit(blockpos, serverlevel1.getWorld()).add(0.5F, 0.1F, 0.5F); + } + + org.bukkit.entity.Player respawnPlayer = serverplayer.getBukkitEntity(); @@ -579,15 +555,12 @@ serverplayer.connection.send(new ClientboundSetExperiencePacket(serverplayer.experienceProgress, serverplayer.totalExperience, serverplayer.experienceLevel)); this.sendLevelInfo(serverplayer, serverlevel1); this.sendPlayerPermissionLevel(serverplayer); -- serverlevel1.addRespawnedPlayer(serverplayer); -- this.players.add(serverplayer); -- this.playersByUUID.put(serverplayer.getUUID(), serverplayer); -- serverplayer.initInventoryMenu(); + if (!p_11237_.connection.isDisconnected()) { -+ serverlevel1.addRespawnedPlayer(serverplayer); -+ this.players.add(serverplayer); + serverlevel1.addRespawnedPlayer(serverplayer); + this.players.add(serverplayer); + this.playersByName.put(serverplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT), serverplayer); // Spigot -+ this.playersByUUID.put(serverplayer.getUUID(), serverplayer); + this.playersByUUID.put(serverplayer.getUUID(), serverplayer); +- serverplayer.initInventoryMenu(); + net.minecraftforge.event.ForgeEventFactory.firePlayerRespawnEvent(serverplayer, p_11238_); + } + // serverplayer.initInventoryMenu(); From b7f27f1b80d67857f91af473a52a05110592e06a Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:40:53 +0100 Subject: [PATCH 20/21] More correct postInit for mods --- patches/minecraft/net/minecraft/world/entity/Entity.java.patch | 2 +- .../net/minecraft/world/entity/LivingEntity.java.patch | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch index 511e8a7d4a..33b0f13211 100644 --- a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch @@ -112,7 +112,7 @@ this.setPos(0.0D, 0.0D, 0.0D); - this.eyeHeight = this.getEyeHeight(Pose.STANDING, this.dimensions); + //Ketting: Move on Player init, to allow for init after the Player Constructor -+ if (!(this instanceof Player)) postInit(); ++ if (!(this instanceof LivingEntity)) postInit(); + } + protected void postInit(){ + var sizeEvent = net.minecraftforge.event.ForgeEventFactory.getEntitySizeForge(this, Pose.STANDING, this.dimensions, this.getEyeHeight(Pose.STANDING, this.dimensions)); diff --git a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch index eb2716dd9c..73a404c592 100644 --- a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch @@ -56,7 +56,7 @@ this.yHeadRot = this.getYRot(); this.setMaxUpStep(0.6F); + this.entityData.set(DATA_HEALTH_ID, (float) this.getAttributeBaseValue(Attributes.MAX_HEALTH)); -+ if (!(this instanceof org.bukkit.entity.Player)) postInit(); ++ if (!(this instanceof net.minecraft.world.entity.player.Player)) postInit(); + } + @Override + protected void postInit(){ From 5385195c6db055d0cbdc5ac337c30c8e1dae6030 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:47:05 +0100 Subject: [PATCH 21/21] Version 0.2.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f336c66fd3..eb5e87f146 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.daemon=false JAVA_VERSION=17 MC_VERSION=1.20.1 FORGE_VERSION=47.2.20 -KETTING_VERSION=0.1.55 +KETTING_VERSION=0.2.0 MC_NEXT_VERSION=1.21 MCP_VERSION=20230612.114412 MAPPING_CHANNEL=official