-
-
Notifications
You must be signed in to change notification settings - Fork 177
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement support for preventing effects from being removed by milk o…
…r totems
- Loading branch information
Showing
10 changed files
with
299 additions
and
38 deletions.
There are no files selected for viewing
17 changes: 17 additions & 0 deletions
17
patches/net/minecraft/world/item/component/Consumables.java.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
--- a/net/minecraft/world/item/component/Consumables.java | ||
+++ b/net/minecraft/world/item/component/Consumables.java | ||
@@ -62,7 +_,13 @@ | ||
public static final Consumable SPIDER_EYE = defaultFood() | ||
.onConsume(new ApplyStatusEffectsConsumeEffect(new MobEffectInstance(MobEffects.POISON, 100, 0))) | ||
.build(); | ||
- public static final Consumable MILK_BUCKET = defaultDrink().onConsume(ClearAllStatusEffectsConsumeEffect.INSTANCE).build(); | ||
+ public static final Consumable MILK_BUCKET = defaultDrink().onConsume(new RemoveStatusEffectsConsumeEffect(new net.neoforged.neoforge.registries.holdersets.NotHolderSet<>( | ||
+ net.minecraft.core.registries.BuiltInRegistries.MOB_EFFECT, | ||
+ new net.neoforged.neoforge.registries.holdersets.LazyNamedHolderSet<>( | ||
+ net.minecraft.core.registries.BuiltInRegistries.MOB_EFFECT, | ||
+ net.neoforged.neoforge.common.Tags.MobEffects.NOT_MILK_CURABLE | ||
+ ) | ||
+ ))).build(); | ||
public static final Consumable CHORUS_FRUIT = defaultFood().onConsume(new TeleportRandomlyConsumeEffect()).build(); | ||
|
||
public static Consumable.Builder defaultFood() { |
17 changes: 17 additions & 0 deletions
17
patches/net/minecraft/world/item/component/DeathProtection.java.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
--- a/net/minecraft/world/item/component/DeathProtection.java | ||
+++ b/net/minecraft/world/item/component/DeathProtection.java | ||
@@ -25,7 +_,13 @@ | ||
); | ||
public static final DeathProtection TOTEM_OF_UNDYING = new DeathProtection( | ||
List.of( | ||
- new ClearAllStatusEffectsConsumeEffect(), | ||
+ new net.minecraft.world.item.consume_effects.RemoveStatusEffectsConsumeEffect(new net.neoforged.neoforge.registries.holdersets.NotHolderSet<>( | ||
+ net.minecraft.core.registries.BuiltInRegistries.MOB_EFFECT, | ||
+ new net.neoforged.neoforge.registries.holdersets.LazyNamedHolderSet<>( | ||
+ net.minecraft.core.registries.BuiltInRegistries.MOB_EFFECT, | ||
+ net.neoforged.neoforge.common.Tags.MobEffects.NOT_TOTEM_CURABLE | ||
+ ) | ||
+ )), | ||
new ApplyStatusEffectsConsumeEffect( | ||
List.of( | ||
new MobEffectInstance(MobEffects.REGENERATION, 900, 1), |
3 changes: 3 additions & 0 deletions
3
src/generated/resources/data/neoforge/tags/mob_effect/not_milk_curable.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"values": [] | ||
} |
3 changes: 3 additions & 0 deletions
3
src/generated/resources/data/neoforge/tags/mob_effect/not_totem_curable.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"values": [] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 29 additions & 0 deletions
29
...main/java/net/neoforged/neoforge/common/data/internal/NeoForgeMobEffectsTagsProvider.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
/* | ||
* Copyright (c) NeoForged and contributors | ||
* SPDX-License-Identifier: LGPL-2.1-only | ||
*/ | ||
|
||
package net.neoforged.neoforge.common.data.internal; | ||
|
||
import java.util.concurrent.CompletableFuture; | ||
import net.minecraft.core.HolderLookup; | ||
import net.minecraft.core.registries.Registries; | ||
import net.minecraft.data.PackOutput; | ||
import net.minecraft.data.tags.TagsProvider; | ||
import net.minecraft.world.effect.MobEffect; | ||
import net.neoforged.neoforge.common.Tags; | ||
import net.neoforged.neoforge.common.data.ExistingFileHelper; | ||
import net.neoforged.neoforge.internal.versions.neoforge.NeoForgeVersion; | ||
import org.jetbrains.annotations.Nullable; | ||
|
||
public final class NeoForgeMobEffectsTagsProvider extends TagsProvider<MobEffect> { | ||
public NeoForgeMobEffectsTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider, @Nullable ExistingFileHelper fileHelper) { | ||
super(output, Registries.MOB_EFFECT, lookupProvider, NeoForgeVersion.MOD_ID, fileHelper); | ||
} | ||
|
||
@Override | ||
protected void addTags(HolderLookup.Provider lookupProvider) { | ||
tag(Tags.MobEffects.NOT_MILK_CURABLE); | ||
tag(Tags.MobEffects.NOT_TOTEM_CURABLE); | ||
} | ||
} |
160 changes: 160 additions & 0 deletions
160
src/main/java/net/neoforged/neoforge/registries/holdersets/LazyNamedHolderSet.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
/* | ||
* Copyright (c) NeoForged and contributors | ||
* SPDX-License-Identifier: LGPL-2.1-only | ||
*/ | ||
|
||
package net.neoforged.neoforge.registries.holdersets; | ||
|
||
import com.mojang.datafixers.util.Either; | ||
import com.mojang.serialization.Codec; | ||
import com.mojang.serialization.MapCodec; | ||
import com.mojang.serialization.codecs.RecordCodecBuilder; | ||
import io.netty.buffer.ByteBuf; | ||
import java.util.ArrayList; | ||
import java.util.Iterator; | ||
import java.util.List; | ||
import java.util.Optional; | ||
import java.util.stream.Stream; | ||
import net.minecraft.core.Holder; | ||
import net.minecraft.core.HolderLookup; | ||
import net.minecraft.core.HolderOwner; | ||
import net.minecraft.core.HolderSet; | ||
import net.minecraft.core.Registry; | ||
import net.minecraft.network.RegistryFriendlyByteBuf; | ||
import net.minecraft.network.codec.StreamCodec; | ||
import net.minecraft.resources.RegistryOps; | ||
import net.minecraft.resources.ResourceKey; | ||
import net.minecraft.tags.TagKey; | ||
import net.minecraft.util.RandomSource; | ||
import net.neoforged.neoforge.common.NeoForgeMod; | ||
import org.jetbrains.annotations.Nullable; | ||
|
||
public final class LazyNamedHolderSet<T> implements ICustomHolderSet<T> { | ||
private final List<Runnable> owners = new ArrayList<>(); | ||
private final HolderLookup.RegistryLookup<T> registryLookup; | ||
private final TagKey<T> tagKey; | ||
@Nullable | ||
private HolderSet.Named<T> resolvedSet; | ||
|
||
public LazyNamedHolderSet(HolderLookup.RegistryLookup<T> registryLookup, TagKey<T> tagKey) { | ||
this.registryLookup = registryLookup; | ||
this.tagKey = tagKey; | ||
} | ||
|
||
public HolderLookup.RegistryLookup<T> registryLookup() { | ||
return registryLookup; | ||
} | ||
|
||
public TagKey<T> tagKey() { | ||
return tagKey; | ||
} | ||
|
||
@Override | ||
public HolderSetType type() { | ||
return NeoForgeMod.LAZY_NAMED_HOLDER_SET.value(); | ||
} | ||
|
||
@Override | ||
public void addInvalidationListener(Runnable runnable) { | ||
this.owners.add(runnable); | ||
} | ||
|
||
@Override | ||
public Stream<Holder<T>> stream() { | ||
return resolve().stream(); | ||
} | ||
|
||
@Override | ||
public int size() { | ||
return resolve().size(); | ||
} | ||
|
||
@Override | ||
public boolean isBound() { | ||
return resolve().isBound(); | ||
} | ||
|
||
@Override | ||
public Either<TagKey<T>, List<Holder<T>>> unwrap() { | ||
return resolve().unwrap(); | ||
} | ||
|
||
@Override | ||
public Optional<Holder<T>> getRandomElement(RandomSource random) { | ||
return resolve().getRandomElement(random); | ||
} | ||
|
||
@Override | ||
public Holder<T> get(int idx) { | ||
return resolve().get(idx); | ||
} | ||
|
||
@Override | ||
public boolean contains(Holder<T> holder) { | ||
return resolve().contains(holder); | ||
} | ||
|
||
@Override | ||
public boolean canSerializeIn(HolderOwner<T> owner) { | ||
return resolve().canSerializeIn(owner); | ||
} | ||
|
||
@Override | ||
public Optional<TagKey<T>> unwrapKey() { | ||
return resolve().unwrapKey(); | ||
} | ||
|
||
@Override | ||
public Iterator<Holder<T>> iterator() { | ||
return resolve().iterator(); | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
return "LazyNamedHolderSet(" + this.tagKey + ")"; | ||
} | ||
|
||
private HolderSet.Named<T> resolve() { | ||
HolderSet.Named<T> resolved = this.resolvedSet; | ||
if (resolved == null) { | ||
this.resolvedSet = resolved = this.registryLookup.getOrThrow(this.tagKey); | ||
resolved.addInvalidationListener(this::invalidate); | ||
} | ||
return resolved; | ||
} | ||
|
||
private void invalidate() { | ||
this.resolvedSet = null; | ||
for (Runnable runnable : this.owners) { | ||
runnable.run(); | ||
} | ||
} | ||
|
||
public static final class Type implements HolderSetType { | ||
@Override | ||
public <T> MapCodec<? extends ICustomHolderSet<T>> makeCodec(ResourceKey<? extends Registry<T>> registryKey, Codec<Holder<T>> holderCodec, boolean forceList) { | ||
return RecordCodecBuilder.<LazyNamedHolderSet<T>>mapCodec( | ||
builder -> builder.group( | ||
RegistryOps.retrieveRegistryLookup(registryKey).forGetter(LazyNamedHolderSet::registryLookup), | ||
TagKey.hashedCodec(registryKey).fieldOf("tag").forGetter(LazyNamedHolderSet::tagKey)) | ||
.apply(builder, LazyNamedHolderSet::new)); | ||
} | ||
|
||
@Override | ||
public <T> StreamCodec<RegistryFriendlyByteBuf, LazyNamedHolderSet<T>> makeStreamCodec(ResourceKey<? extends Registry<T>> registryKey) { | ||
return new StreamCodec<>() { | ||
private final StreamCodec<ByteBuf, TagKey<T>> keyCodec = TagKey.streamCodec(registryKey); | ||
|
||
@Override | ||
public LazyNamedHolderSet<T> decode(RegistryFriendlyByteBuf buf) { | ||
return new LazyNamedHolderSet<>(buf.registryAccess().lookupOrThrow(registryKey), keyCodec.decode(buf)); | ||
} | ||
|
||
@Override | ||
public void encode(RegistryFriendlyByteBuf buf, LazyNamedHolderSet<T> set) { | ||
keyCodec.encode(buf, set.tagKey); | ||
} | ||
}; | ||
} | ||
} | ||
} |
5 changes: 5 additions & 0 deletions
5
tests/src/generated/resources/data/neoforge/tags/mob_effect/not_milk_curable.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
{ | ||
"values": [ | ||
"neotests_effect_cures:test_effect" | ||
] | ||
} |
Oops, something went wrong.