Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ public ExpFluidBlock(FlowingFluid fluid, Properties properties) {

@Override
public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
// 这个不触发,我没招了...
if (level.isClientSide) return;
if (!level.getFluidState(pos).isSource()) return;
if (entity instanceof Player player) {
player.giveExperiencePoints(XP_POINTS);
level.setBlock(pos, Blocks.AIR.defaultBlockState(), 3);
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/dev/dubhe/anvilcraft/init/block/ModBlocks.java
Original file line number Diff line number Diff line change
Expand Up @@ -4401,9 +4401,9 @@ private static BlockEntry<? extends PowerLevelPressurePlateBlock> registerPressu
})
.register();

public static final BlockEntry<LiquidBlock> EXP_FLUID = REGISTRATE.block(
public static final BlockEntry<ExpFluidBlock> EXP_FLUID = REGISTRATE.block(
"exp_fluid",
p -> new LiquidBlock(ModFluids.EXP_FLUID.get(), p)
p -> new ExpFluidBlock(ModFluids.EXP_FLUID.get(), p)
)
.properties(it -> it.mapColor(MapColor.COLOR_GREEN)
.replaceable()
Expand All @@ -4416,7 +4416,8 @@ private static BlockEntry<? extends PowerLevelPressurePlateBlock> registerPressu
.blockstate(ModelProviderUtil::liquid)
.register();

public static final BlockEntry<ExpFluidBlock> OIL = REGISTRATE.block("oil", p -> new ExpFluidBlock(ModFluids.OIL.get(), p))
public static final BlockEntry<LiquidBlock> OIL = REGISTRATE.block(
"oil", p -> new LiquidBlock(ModFluids.OIL.get(), p))
.properties(it -> it.mapColor(MapColor.TERRACOTTA_BLACK)
.replaceable()
.noCollission()
Expand Down
56 changes: 8 additions & 48 deletions src/main/java/dev/dubhe/anvilcraft/item/ExpGemItem.java
Original file line number Diff line number Diff line change
@@ -1,29 +1,19 @@
package dev.dubhe.anvilcraft.item;

import com.google.common.collect.Lists;
import dev.dubhe.anvilcraft.block.ExpFluidBlock;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.sounds.SoundEvents;
import dev.dubhe.anvilcraft.mixin.accessor.VillagerAccessor;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.npc.Villager;
import net.minecraft.world.entity.npc.VillagerData;
import net.minecraft.world.entity.npc.VillagerProfession;
import net.minecraft.world.entity.npc.VillagerTrades;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.flag.FeatureFlags;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.trading.MerchantOffer;
import net.minecraft.world.item.trading.MerchantOffers;
import net.minecraft.world.level.Level;

import java.util.ArrayList;

public class ExpGemItem extends Item {
public static final int VILLAGER_XP = 20;
public static final int AGE_ADDITION = 2 * 60;
Expand All @@ -41,7 +31,7 @@ public InteractionResultHolder<ItemStack> use(
ItemStack itemStack = player.getItemInHand(usedHand);
int count = player.isShiftKeyDown() ? itemStack.getCount() : 1;
player.giveExperiencePoints(ExpFluidBlock.XP_POINTS * count);
itemStack.shrink(count);
itemStack.consume(count, player);
player.getCooldowns().addCooldown(this, 5);
return InteractionResultHolder.sidedSuccess(itemStack, level.isClientSide());
}
Expand All @@ -60,53 +50,23 @@ public static InteractionResult useEntity(Player player, Entity target, ItemStac
if (!VillagerData.canLevelUp(villagerLevel)) return InteractionResult.PASS;

updateVillager(villager);
stack.shrink(1);
stack.consume(1, player);
return InteractionResult.SUCCESS;
} else {
villager.ageUp(AGE_ADDITION, true);
stack.shrink(1);
stack.consume(1, player);
return InteractionResult.SUCCESS;
}
}

public static void updateVillager(Villager villager) {
VillagerData villagerData = villager.getVillagerData();
int villagerLevel = villagerData.getLevel();
int villagerXp = villager.getVillagerXp() + VILLAGER_XP;
villager.setVillagerXp(villagerXp);
// 检测经验值是否足够,足够则升级(我好想直接用Villager::increaseMerchantCareer啊,可惜protect)
if (villagerXp >= VillagerData.getMaxXpPerLevel(villagerLevel)) {
villager.setVillagerXp(villagerXp);
++villagerLevel;
villagerData = villagerData.setLevel(villagerLevel);
villager.setVillagerData(villagerData);

villager.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 200, 0));
villager.playSound(SoundEvents.PLAYER_LEVELUP, 1.0F, 0.9f + 0.2f * villager.getRandom().nextFloat());

// 获取对应职业的交易列表
Int2ObjectMap<VillagerTrades.ItemListing[]> trades = VillagerTrades.TRADES.get(villagerData.getProfession());
if (villager.level().enabledFeatures().contains(FeatureFlags.TRADE_REBALANCE)) {
Int2ObjectMap<VillagerTrades.ItemListing[]> rebalanceTrades =
VillagerTrades.EXPERIMENTAL_TRADES.get(villagerData.getProfession());
if (rebalanceTrades != null) {
trades = rebalanceTrades;
}
}
if (trades == null || trades.isEmpty()) return;
VillagerTrades.ItemListing[] itemlisting = trades.get(villagerLevel);
if (itemlisting == null) return;
ArrayList<VillagerTrades.ItemListing> arraylist = Lists.newArrayList(itemlisting);

// 更新村民当前的交易列表(MerchantOffers)
MerchantOffers merchantoffers = villager.getOffers();
for (int i = 0; i < itemlisting.length; i++) {
if (arraylist.isEmpty() || i >= 2) break;
MerchantOffer merchantoffer = arraylist.remove(villager.getRandom().nextInt(arraylist.size()))
.getOffer(villager, villager.getRandom());
if (merchantoffer != null) {
merchantoffers.add(merchantoffer);
}
if (villager instanceof VillagerAccessor villager1) {
if (villager1.invokeShouldIncreaseLevel()) {
villager1.setUpdateMerchantTimer(40);
villager1.setIncreaseProfessionLevelOnUpdate(true);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package dev.dubhe.anvilcraft.mixin.accessor;

import net.minecraft.world.entity.npc.Villager;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker;

@Mixin(Villager.class)
public interface VillagerAccessor {

@Accessor
void setUpdateMerchantTimer(int timer);

@Accessor
void setIncreaseProfessionLevelOnUpdate(boolean flag);

@Invoker
boolean invokeShouldIncreaseLevel();
}
1 change: 1 addition & 0 deletions src/main/resources/anvilcraft.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
"accessor.ShapedRecipePatternAccessor",
"accessor.TargetingConditionsAccessor",
"accessor.VaultServerDataAccessor",
"accessor.VillagerAccessor",
"invoker.BlockBehaviourInvoker",
"invoker.BlockItemInvoker",
"piglin.AbstractPiglinMixin",
Expand Down