Source ZombieVillagerInfo - Spiderman31807/Mob_Selector_Mod GitHub Wiki
package playasmob;
import net.minecraft.world.item.trading.MerchantOffers;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.npc.VillagerType;
import net.minecraft.world.entity.npc.VillagerProfession;
import net.minecraft.world.entity.npc.VillagerDataHolder;
import net.minecraft.world.entity.npc.VillagerData;
import net.minecraft.world.entity.monster.ZombieVillager;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.nbt.Tag;
import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.client.renderer.entity.state.ZombieVillagerRenderState;
import net.minecraft.client.renderer.entity.state.EntityRenderState;
import net.minecraft.client.renderer.entity.ZombieVillagerRenderer;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.Util;
import com.mojang.serialization.Dynamic;
import com.mojang.serialization.DataResult;
public class ZombieVillagerInfo extends CurableZombieInfo implements VillagerDataHolder {
public static final Synched villagerData = Synched.VillagerData;
public Tag gossips;
public MerchantOffers tradeOffers;
public int villagerXp;
public ZombieVillagerInfo(Player player, CompoundTag compound) {
super(EntityType.ZOMBIE_VILLAGER, ZombieVillager.class, player, compound);
}
public ZombieVillagerInfo(Player player) {
this(player, null);
}
public ZombieVillagerInfo() {
this(null);
}
// Custom Code
@Override
public void reset() {
super.reset();
this.gossips = null;
this.tradeOffers = null;
this.villagerXp = 0;
this.reset(villagerData);
}
@Override
public EntityRenderer getRenderer() {
return new ZombieVillagerRenderer(Utils.getContext());
}
@Override
public EntityRenderState createState() {
return new ZombieVillagerRenderState();
}
@Override
public void modifyState(EntityRenderState state) {
super.modifyState(state);
if (state instanceof ZombieVillagerRenderState zombieState)
zombieState.villagerData = this.getVillagerData();
}
// ZombieVillager.class Code
@Override
public CompoundTag saveData() {
CompoundTag compound = super.saveData();
VillagerData.CODEC.encodeStart(NbtOps.INSTANCE, this.getVillagerData()).resultOrPartial(logger::error).ifPresent(saveData -> compound.put("VillagerData", saveData));
if (this.tradeOffers != null)
compound.put("Offers", MerchantOffers.CODEC.encodeStart(this.registryAccess().createSerializationContext(NbtOps.INSTANCE), this.tradeOffers).getOrThrow());
if (this.gossips != null)
compound.put("Gossips", this.gossips);
compound.putInt("Xp", this.villagerXp);
return compound;
}
@Override
public void loadData(CompoundTag compound) {
super.loadData(compound);
if (compound.contains("VillagerData", 10)) {
DataResult<VillagerData> dataresult = VillagerData.CODEC.parse(new Dynamic<>(NbtOps.INSTANCE, compound.get("VillagerData")));
dataresult.resultOrPartial(logger::error).ifPresent(this::setVillagerData);
}
if (compound.contains("Offers")) {
MerchantOffers.CODEC.parse(this.registryAccess().createSerializationContext(NbtOps.INSTANCE), compound.get("Offers")).resultOrPartial(Util.prefix("Failed to load offers: ", logger::warn)).ifPresent(offers -> this.tradeOffers = offers);
}
if (compound.contains("Gossips", 9))
this.gossips = compound.getList("Gossips", 10);
if (compound.contains("Xp", 3))
this.villagerXp = compound.getInt("Xp");
}
@Override
public boolean convertsInWater() {
return false;
}
@Override
public void finishConversion(ServerLevel server) {
this.changeInfo(EntityType.VILLAGER, true);
}
@Override
public float getVoicePitch(float original) {
return this.isBaby() ? (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 2.0F : (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F;
}
@Override
public SoundEvent getAmbientSound() {
return SoundEvents.ZOMBIE_VILLAGER_AMBIENT;
}
@Override
public SoundEvent getHurtSound(SoundEvent original, DamageSource source) {
return SoundEvents.ZOMBIE_VILLAGER_HURT;
}
@Override
public SoundEvent getDeathSound(SoundEvent original) {
return SoundEvents.ZOMBIE_VILLAGER_DEATH;
}
@Override
public SoundEvent getStepSound() {
return SoundEvents.ZOMBIE_VILLAGER_STEP;
}
@Override
public ItemStack getSkull() {
return ItemStack.EMPTY;
}
public void setTradeOffers(MerchantOffers offers) {
this.tradeOffers = offers;
}
public void setGossips(Tag gossip) {
this.gossips = gossip;
}
@Override
public void init() {
super.init();
if (this.level() instanceof ServerLevel server)
this.setVillagerData(this.getVillagerData().setType(VillagerType.byBiome(server.getBiome(this.blockPosition()))));
BuiltInRegistries.VILLAGER_PROFESSION.getRandom(this.random).ifPresent(work -> this.setVillagerData(this.getVillagerData().setProfession(work.value())));
}
@Override
public void setVillagerData(VillagerData data) {
this.set(villagerData, data);
}
@Override
public VillagerData getVillagerData() {
return this.get(villagerData);
}
public int getVillagerXp() {
return this.villagerXp;
}
public void setVillagerXp(int xp) {
this.villagerXp = xp;
}
}