diff options
Diffstat (limited to 'patch-remap/mache-spigotflower/net/minecraft/world/entity/npc/WanderingTrader.java.patch')
-rw-r--r-- | patch-remap/mache-spigotflower/net/minecraft/world/entity/npc/WanderingTrader.java.patch | 356 |
1 files changed, 356 insertions, 0 deletions
diff --git a/patch-remap/mache-spigotflower/net/minecraft/world/entity/npc/WanderingTrader.java.patch b/patch-remap/mache-spigotflower/net/minecraft/world/entity/npc/WanderingTrader.java.patch new file mode 100644 index 0000000000..1977fd62f4 --- /dev/null +++ b/patch-remap/mache-spigotflower/net/minecraft/world/entity/npc/WanderingTrader.java.patch @@ -0,0 +1,356 @@ +--- a/net/minecraft/world/entity/npc/WanderingTrader.java ++++ b/net/minecraft/world/entity/npc/WanderingTrader.java +@@ -10,7 +10,7 @@ + import net.minecraft.sounds.SoundEvent; + import net.minecraft.sounds.SoundEvents; + import net.minecraft.stats.Stats; +-import net.minecraft.world.InteractionHand; ++import net.minecraft.world.EnumHand; + import net.minecraft.world.InteractionResult; + import net.minecraft.world.damagesource.DamageSource; + import net.minecraft.world.entity.AgeableMob; +@@ -20,11 +20,11 @@ + import net.minecraft.world.entity.ai.goal.AvoidEntityGoal; + import net.minecraft.world.entity.ai.goal.FloatGoal; + import net.minecraft.world.entity.ai.goal.Goal; +-import net.minecraft.world.entity.ai.goal.InteractGoal; + import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; + import net.minecraft.world.entity.ai.goal.LookAtTradingPlayerGoal; + import net.minecraft.world.entity.ai.goal.MoveTowardsRestrictionGoal; + import net.minecraft.world.entity.ai.goal.PanicGoal; ++import net.minecraft.world.entity.ai.goal.PathfinderGoalInteract; + import net.minecraft.world.entity.ai.goal.TradeWithPlayerGoal; + import net.minecraft.world.entity.ai.goal.UseItemGoal; + import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +@@ -47,26 +47,33 @@ + import net.minecraft.world.phys.Vec3; + import org.apache.commons.lang3.tuple.Pair; + +-public class WanderingTrader extends AbstractVillager { ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.craftbukkit.inventory.CraftMerchantRecipe; ++import org.bukkit.entity.AbstractVillager; ++import org.bukkit.event.entity.VillagerAcquireTradeEvent; ++// CraftBukkit end + ++public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVillager { ++ + private static final int NUMBER_OF_TRADE_OFFERS = 5; + @Nullable + private BlockPos wanderTarget; + private int despawnDelay; + +- public WanderingTrader(EntityType<? extends WanderingTrader> entitytype, Level level) { +- super(entitytype, level); ++ public WanderingTrader(EntityType<? extends WanderingTrader> entityType, Level level) { ++ super(entityType, level); ++ this.setDespawnDelay(48000); // CraftBukkit - set default from MobSpawnerTrader + } + + @Override +- @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +- this.goalSelector.addGoal(0, new UseItemGoal<>(this, PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.INVISIBILITY), SoundEvents.WANDERING_TRADER_DISAPPEARED, (wanderingtrader) -> { +- return this.level().isNight() && !wanderingtrader.isInvisible(); ++ this.goalSelector.addGoal(0, new UseItemGoal<>(this, PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.INVISIBILITY), SoundEvents.WANDERING_TRADER_DISAPPEARED, (entityvillagertrader) -> { ++ return this.level().isNight() && !entityvillagertrader.isInvisible(); + })); +- this.goalSelector.addGoal(0, new UseItemGoal<>(this, new ItemStack(Items.MILK_BUCKET), SoundEvents.WANDERING_TRADER_REAPPEARED, (wanderingtrader) -> { +- return this.level().isDay() && wanderingtrader.isInvisible(); ++ this.goalSelector.addGoal(0, new UseItemGoal<>(this, new ItemStack(Items.MILK_BUCKET), SoundEvents.WANDERING_TRADER_REAPPEARED, (entityvillagertrader) -> { ++ return this.level().isDay() && entityvillagertrader.isInvisible(); + })); + this.goalSelector.addGoal(1, new TradeWithPlayerGoal(this)); + this.goalSelector.addGoal(1, new AvoidEntityGoal<>(this, Zombie.class, 8.0F, 0.5D, 0.5D)); +@@ -81,30 +88,27 @@ + this.goalSelector.addGoal(2, new WanderingTrader.WanderToPositionGoal(this, 2.0D, 0.35D)); + this.goalSelector.addGoal(4, new MoveTowardsRestrictionGoal(this, 0.35D)); + this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 0.35D)); +- this.goalSelector.addGoal(9, new InteractGoal(this, Player.class, 3.0F, 1.0F)); ++ this.goalSelector.addGoal(9, new PathfinderGoalInteract(this, Player.class, 3.0F, 1.0F)); + this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); + } + + @Nullable + @Override +- @Override +- public AgeableMob getBreedOffspring(ServerLevel serverlevel, AgeableMob ageablemob) { ++ public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) { + return null; + } + + @Override +- @Override + public boolean showProgressBar() { + return false; + } + + @Override +- @Override +- public InteractionResult mobInteract(Player player, InteractionHand interactionhand) { +- ItemStack itemstack = player.getItemInHand(interactionhand); ++ public InteractionResult mobInteract(Player player, EnumHand hand) { ++ ItemStack itemstack = player.getItemInHand(hand); + + if (!itemstack.is(Items.VILLAGER_SPAWN_EGG) && this.isAlive() && !this.isTrading() && !this.isBaby()) { +- if (interactionhand == InteractionHand.MAIN_HAND) { ++ if (hand == EnumHand.MAIN_HAND) { + player.awardStat(Stats.TALKED_TO_VILLAGER); + } + +@@ -119,29 +123,37 @@ + return InteractionResult.sidedSuccess(this.level().isClientSide); + } + } else { +- return super.mobInteract(player, interactionhand); ++ return super.mobInteract(player, hand); + } + } + + @Override +- @Override + protected void updateTrades() { + if (this.level().enabledFeatures().contains(FeatureFlags.TRADE_REBALANCE)) { + this.experimentalUpdateTrades(); + } else { +- VillagerTrades.ItemListing[] avillagertrades_itemlisting = (VillagerTrades.ItemListing[]) VillagerTrades.WANDERING_TRADER_TRADES.get(1); +- VillagerTrades.ItemListing[] avillagertrades_itemlisting1 = (VillagerTrades.ItemListing[]) VillagerTrades.WANDERING_TRADER_TRADES.get(2); ++ VillagerTrades.ItemListing[] avillagertrades_imerchantrecipeoption = (VillagerTrades.ItemListing[]) VillagerTrades.WANDERING_TRADER_TRADES.get(1); ++ VillagerTrades.ItemListing[] avillagertrades_imerchantrecipeoption1 = (VillagerTrades.ItemListing[]) VillagerTrades.WANDERING_TRADER_TRADES.get(2); + +- if (avillagertrades_itemlisting != null && avillagertrades_itemlisting1 != null) { +- MerchantOffers merchantoffers = this.getOffers(); ++ if (avillagertrades_imerchantrecipeoption != null && avillagertrades_imerchantrecipeoption1 != null) { ++ MerchantOffers merchantrecipelist = this.getOffers(); + +- this.addOffersFromItemListings(merchantoffers, avillagertrades_itemlisting, 5); +- int i = this.random.nextInt(avillagertrades_itemlisting1.length); +- VillagerTrades.ItemListing villagertrades_itemlisting = avillagertrades_itemlisting1[i]; +- MerchantOffer merchantoffer = villagertrades_itemlisting.getOffer(this, this.random); ++ this.addOffersFromItemListings(merchantrecipelist, avillagertrades_imerchantrecipeoption, 5); ++ int i = this.random.nextInt(avillagertrades_imerchantrecipeoption1.length); ++ VillagerTrades.ItemListing villagertrades_imerchantrecipeoption = avillagertrades_imerchantrecipeoption1[i]; ++ MerchantOffer merchantrecipe = villagertrades_imerchantrecipeoption.getOffer(this, this.random); + +- if (merchantoffer != null) { +- merchantoffers.add(merchantoffer); ++ if (merchantrecipe != null) { ++ // CraftBukkit start ++ VillagerAcquireTradeEvent event = new VillagerAcquireTradeEvent((AbstractVillager) getBukkitEntity(), merchantrecipe.asBukkit()); ++ // Suppress during worldgen ++ if (this.valid) { ++ Bukkit.getPluginManager().callEvent(event); ++ } ++ if (!event.isCancelled()) { ++ merchantrecipelist.add(CraftMerchantRecipe.fromBukkit(event.getRecipe()).toMinecraft()); ++ } ++ // CraftBukkit end + } + + } +@@ -149,54 +161,50 @@ + } + + private void experimentalUpdateTrades() { +- MerchantOffers merchantoffers = this.getOffers(); ++ MerchantOffers merchantrecipelist = this.getOffers(); + Iterator iterator = VillagerTrades.EXPERIMENTAL_WANDERING_TRADER_TRADES.iterator(); + + while (iterator.hasNext()) { + Pair<VillagerTrades.ItemListing[], Integer> pair = (Pair) iterator.next(); +- VillagerTrades.ItemListing[] avillagertrades_itemlisting = (VillagerTrades.ItemListing[]) pair.getLeft(); ++ VillagerTrades.ItemListing[] avillagertrades_imerchantrecipeoption = (VillagerTrades.ItemListing[]) pair.getLeft(); + +- this.addOffersFromItemListings(merchantoffers, avillagertrades_itemlisting, (Integer) pair.getRight()); ++ this.addOffersFromItemListings(merchantrecipelist, avillagertrades_imerchantrecipeoption, (Integer) pair.getRight()); + } + + } + + @Override +- @Override +- public void addAdditionalSaveData(CompoundTag compoundtag) { +- super.addAdditionalSaveData(compoundtag); +- compoundtag.putInt("DespawnDelay", this.despawnDelay); ++ public void addAdditionalSaveData(CompoundTag compound) { ++ super.addAdditionalSaveData(compound); ++ compound.putInt("DespawnDelay", this.despawnDelay); + if (this.wanderTarget != null) { +- compoundtag.put("WanderTarget", NbtUtils.writeBlockPos(this.wanderTarget)); ++ compound.put("WanderTarget", NbtUtils.writeBlockPos(this.wanderTarget)); + } + + } + + @Override +- @Override +- public void readAdditionalSaveData(CompoundTag compoundtag) { +- super.readAdditionalSaveData(compoundtag); +- if (compoundtag.contains("DespawnDelay", 99)) { +- this.despawnDelay = compoundtag.getInt("DespawnDelay"); ++ public void readAdditionalSaveData(CompoundTag compound) { ++ super.readAdditionalSaveData(compound); ++ if (compound.contains("DespawnDelay", 99)) { ++ this.despawnDelay = compound.getInt("DespawnDelay"); + } + +- if (compoundtag.contains("WanderTarget")) { +- this.wanderTarget = NbtUtils.readBlockPos(compoundtag.getCompound("WanderTarget")); ++ if (compound.contains("WanderTarget")) { ++ this.wanderTarget = NbtUtils.readBlockPos(compound.getCompound("WanderTarget")); + } + + this.setAge(Math.max(0, this.getAge())); + } + + @Override +- @Override +- public boolean removeWhenFarAway(double d0) { ++ public boolean removeWhenFarAway(double distanceToClosestPlayer) { + return false; + } + + @Override +- @Override +- protected void rewardTradeXp(MerchantOffer merchantoffer) { +- if (merchantoffer.shouldRewardExp()) { ++ protected void rewardTradeXp(MerchantOffer offer) { ++ if (offer.shouldRewardExp()) { + int i = 3 + this.random.nextInt(4); + + this.level().addFreshEntity(new ExperienceOrb(this.level(), this.getX(), this.getY() + 0.5D, this.getZ(), i)); +@@ -205,43 +213,37 @@ + } + + @Override +- @Override + protected SoundEvent getAmbientSound() { + return this.isTrading() ? SoundEvents.WANDERING_TRADER_TRADE : SoundEvents.WANDERING_TRADER_AMBIENT; + } + + @Override +- @Override +- protected SoundEvent getHurtSound(DamageSource damagesource) { ++ protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.WANDERING_TRADER_HURT; + } + + @Override +- @Override + protected SoundEvent getDeathSound() { + return SoundEvents.WANDERING_TRADER_DEATH; + } + + @Override +- @Override +- protected SoundEvent getDrinkingSound(ItemStack itemstack) { +- return itemstack.is(Items.MILK_BUCKET) ? SoundEvents.WANDERING_TRADER_DRINK_MILK : SoundEvents.WANDERING_TRADER_DRINK_POTION; ++ protected SoundEvent getDrinkingSound(ItemStack stack) { ++ return stack.is(Items.MILK_BUCKET) ? SoundEvents.WANDERING_TRADER_DRINK_MILK : SoundEvents.WANDERING_TRADER_DRINK_POTION; + } + + @Override +- @Override +- protected SoundEvent getTradeUpdatedSound(boolean flag) { +- return flag ? SoundEvents.WANDERING_TRADER_YES : SoundEvents.WANDERING_TRADER_NO; ++ protected SoundEvent getTradeUpdatedSound(boolean getYesSound) { ++ return getYesSound ? SoundEvents.WANDERING_TRADER_YES : SoundEvents.WANDERING_TRADER_NO; + } + + @Override +- @Override + public SoundEvent getNotifyTradeSound() { + return SoundEvents.WANDERING_TRADER_YES; + } + +- public void setDespawnDelay(int i) { +- this.despawnDelay = i; ++ public void setDespawnDelay(int despawnDelay) { ++ this.despawnDelay = despawnDelay; + } + + public int getDespawnDelay() { +@@ -249,7 +251,6 @@ + } + + @Override +- @Override + public void aiStep() { + super.aiStep(); + if (!this.level().isClientSide) { +@@ -265,8 +266,8 @@ + + } + +- public void setWanderTarget(@Nullable BlockPos blockpos) { +- this.wanderTarget = blockpos; ++ public void setWanderTarget(@Nullable BlockPos wanderTarget) { ++ this.wanderTarget = wanderTarget; + } + + @Nullable +@@ -280,48 +281,45 @@ + final double stopDistance; + final double speedModifier; + +- WanderToPositionGoal(WanderingTrader wanderingtrader, double d0, double d1) { +- this.trader = wanderingtrader; ++ WanderToPositionGoal(WanderingTrader entityvillagertrader, double d0, double d1) { ++ this.trader = entityvillagertrader; + this.stopDistance = d0; + this.speedModifier = d1; +- this.setFlags(EnumSet.of(Goal.Flag.MOVE)); ++ this.setFlags(EnumSet.of(Goal.Type.MOVE)); + } + + @Override +- @Override + public void stop() { + this.trader.setWanderTarget((BlockPos) null); + WanderingTrader.this.navigation.stop(); + } + + @Override +- @Override + public boolean canUse() { +- BlockPos blockpos = this.trader.getWanderTarget(); ++ BlockPos blockposition = this.trader.getWanderTarget(); + +- return blockpos != null && this.isTooFarAway(blockpos, this.stopDistance); ++ return blockposition != null && this.isTooFarAway(blockposition, this.stopDistance); + } + + @Override +- @Override + public void tick() { +- BlockPos blockpos = this.trader.getWanderTarget(); ++ BlockPos blockposition = this.trader.getWanderTarget(); + +- if (blockpos != null && WanderingTrader.this.navigation.isDone()) { +- if (this.isTooFarAway(blockpos, 10.0D)) { +- Vec3 vec3 = (new Vec3((double) blockpos.getX() - this.trader.getX(), (double) blockpos.getY() - this.trader.getY(), (double) blockpos.getZ() - this.trader.getZ())).normalize(); +- Vec3 vec31 = vec3.scale(10.0D).add(this.trader.getX(), this.trader.getY(), this.trader.getZ()); ++ if (blockposition != null && WanderingTrader.this.navigation.isDone()) { ++ if (this.isTooFarAway(blockposition, 10.0D)) { ++ Vec3 vec3d = (new Vec3((double) blockposition.getX() - this.trader.getX(), (double) blockposition.getY() - this.trader.getY(), (double) blockposition.getZ() - this.trader.getZ())).normalize(); ++ Vec3 vec3d1 = vec3d.scale(10.0D).add(this.trader.getX(), this.trader.getY(), this.trader.getZ()); + +- WanderingTrader.this.navigation.moveTo(vec31.x, vec31.y, vec31.z, this.speedModifier); ++ WanderingTrader.this.navigation.moveTo(vec3d1.x, vec3d1.y, vec3d1.z, this.speedModifier); + } else { +- WanderingTrader.this.navigation.moveTo((double) blockpos.getX(), (double) blockpos.getY(), (double) blockpos.getZ(), this.speedModifier); ++ WanderingTrader.this.navigation.moveTo((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), this.speedModifier); + } + } + + } + +- private boolean isTooFarAway(BlockPos blockpos, double d0) { +- return !blockpos.closerToCenterThan(this.trader.position(), d0); ++ private boolean isTooFarAway(BlockPos pos, double distance) { ++ return !pos.closerToCenterThan(this.trader.position(), distance); + } + } + } |