Spaces:
Build error
Build error
File size: 7,589 Bytes
d46f4a3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
package net.minecraft.world.effect;
import com.mojang.serialization.Codec;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Map.Entry;
import java.util.function.BiConsumer;
import java.util.function.Function;
import javax.annotation.Nullable;
import net.minecraft.Util;
import net.minecraft.core.Holder;
import net.minecraft.core.particles.ColorParticleOption;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.ARGB;
import net.minecraft.util.Mth;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeInstance;
import net.minecraft.world.entity.ai.attributes.AttributeMap;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.flag.FeatureElement;
import net.minecraft.world.flag.FeatureFlag;
import net.minecraft.world.flag.FeatureFlagSet;
import net.minecraft.world.flag.FeatureFlags;
public class MobEffect implements FeatureElement {
public static final Codec<Holder<MobEffect>> CODEC = BuiltInRegistries.MOB_EFFECT.holderByNameCodec();
public static final StreamCodec<RegistryFriendlyByteBuf, Holder<MobEffect>> STREAM_CODEC = ByteBufCodecs.holderRegistry(Registries.MOB_EFFECT);
private static final int AMBIENT_ALPHA = Mth.floor(38.25F);
private final Map<Holder<Attribute>, MobEffect.AttributeTemplate> attributeModifiers = new Object2ObjectOpenHashMap<>();
private final MobEffectCategory category;
private final int color;
private final Function<MobEffectInstance, ParticleOptions> particleFactory;
@Nullable
private String descriptionId;
private int blendDurationTicks;
private Optional<SoundEvent> soundOnAdded = Optional.empty();
private FeatureFlagSet requiredFeatures = FeatureFlags.VANILLA_SET;
protected MobEffect(MobEffectCategory p_19451_, int p_19452_) {
this.category = p_19451_;
this.color = p_19452_;
this.particleFactory = p_358853_ -> {
int i = p_358853_.isAmbient() ? AMBIENT_ALPHA : 255;
return ColorParticleOption.create(ParticleTypes.ENTITY_EFFECT, ARGB.color(i, p_19452_));
};
}
protected MobEffect(MobEffectCategory p_335432_, int p_334901_, ParticleOptions p_331136_) {
this.category = p_335432_;
this.color = p_334901_;
this.particleFactory = p_326745_ -> p_331136_;
}
public int getBlendDurationTicks() {
return this.blendDurationTicks;
}
public boolean applyEffectTick(ServerLevel p_361900_, LivingEntity p_333541_, int p_333570_) {
return true;
}
public void applyInstantenousEffect(ServerLevel p_369379_, @Nullable Entity p_19462_, @Nullable Entity p_19463_, LivingEntity p_19464_, int p_19465_, double p_19466_) {
this.applyEffectTick(p_369379_, p_19464_, p_19465_);
}
public boolean shouldApplyEffectTickThisTick(int p_297908_, int p_301085_) {
return false;
}
public void onEffectStarted(LivingEntity p_299085_, int p_297449_) {
}
public void onEffectAdded(LivingEntity p_335100_, int p_336309_) {
this.soundOnAdded
.ifPresent(
p_374927_ -> p_335100_.level()
.playSound(null, p_335100_.getX(), p_335100_.getY(), p_335100_.getZ(), p_374927_, p_335100_.getSoundSource(), 1.0F, 1.0F)
);
}
public void onMobRemoved(ServerLevel p_368376_, LivingEntity p_335815_, int p_328980_, Entity.RemovalReason p_328413_) {
}
public void onMobHurt(ServerLevel p_367917_, LivingEntity p_19467_, int p_19468_, DamageSource p_334111_, float p_330556_) {
}
public boolean isInstantenous() {
return false;
}
protected String getOrCreateDescriptionId() {
if (this.descriptionId == null) {
this.descriptionId = Util.makeDescriptionId("effect", BuiltInRegistries.MOB_EFFECT.getKey(this));
}
return this.descriptionId;
}
public String getDescriptionId() {
return this.getOrCreateDescriptionId();
}
public Component getDisplayName() {
return Component.translatable(this.getDescriptionId());
}
public MobEffectCategory getCategory() {
return this.category;
}
public int getColor() {
return this.color;
}
public MobEffect addAttributeModifier(Holder<Attribute> p_332101_, ResourceLocation p_342976_, double p_19475_, AttributeModifier.Operation p_19476_) {
this.attributeModifiers.put(p_332101_, new MobEffect.AttributeTemplate(p_342976_, p_19475_, p_19476_));
return this;
}
public MobEffect setBlendDuration(int p_328727_) {
this.blendDurationTicks = p_328727_;
return this;
}
public void createModifiers(int p_334564_, BiConsumer<Holder<Attribute>, AttributeModifier> p_333602_) {
this.attributeModifiers.forEach((p_341255_, p_341256_) -> p_333602_.accept((Holder<Attribute>)p_341255_, p_341256_.create(p_334564_)));
}
public void removeAttributeModifiers(AttributeMap p_19470_) {
for (Entry<Holder<Attribute>, MobEffect.AttributeTemplate> entry : this.attributeModifiers.entrySet()) {
AttributeInstance attributeinstance = p_19470_.getInstance(entry.getKey());
if (attributeinstance != null) {
attributeinstance.removeModifier(entry.getValue().id());
}
}
}
public void addAttributeModifiers(AttributeMap p_19479_, int p_19480_) {
for (Entry<Holder<Attribute>, MobEffect.AttributeTemplate> entry : this.attributeModifiers.entrySet()) {
AttributeInstance attributeinstance = p_19479_.getInstance(entry.getKey());
if (attributeinstance != null) {
attributeinstance.removeModifier(entry.getValue().id());
attributeinstance.addPermanentModifier(entry.getValue().create(p_19480_));
}
}
}
public boolean isBeneficial() {
return this.category == MobEffectCategory.BENEFICIAL;
}
public ParticleOptions createParticleOptions(MobEffectInstance p_332465_) {
return this.particleFactory.apply(p_332465_);
}
public MobEffect withSoundOnAdded(SoundEvent p_329951_) {
this.soundOnAdded = Optional.of(p_329951_);
return this;
}
public MobEffect requiredFeatures(FeatureFlag... p_329270_) {
this.requiredFeatures = FeatureFlags.REGISTRY.subset(p_329270_);
return this;
}
@Override
public FeatureFlagSet requiredFeatures() {
return this.requiredFeatures;
}
static record AttributeTemplate(ResourceLocation id, double amount, AttributeModifier.Operation operation) {
public AttributeModifier create(int p_332230_) {
return new AttributeModifier(this.id, this.amount * (double)(p_332230_ + 1), this.operation);
}
}
} |