我的世界MC mod开发日志-玩家经验处理
视频https://space.bilibili.com/55964508
Q群528864733
我的世界MC mod开发日志-玩家经验处理
//代码放在特定物品模板的代码里, 比如经验书...; public class ItemExperienceBox extends Item //特定物品右键事件 public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); if (!world.isRemote) { if (player.isSneaking()) { if (boolIsAir) absorbAllLevelExpFromPlayer(stack, player); else absorbOneLevelExpFromPlayer(stack, player); } else { if (boolIsAir) giveAllLevelExpToPlayer(stack, player); else giveOneLevelExpToPlayer(stack, player); } } return new ActionResult(EnumActionResult.SUCCESS, stack); } public void gatherVariants(@Nonnull Int2ObjectMap<String> variants) { variants.put(0, "type=experiencetome"); } public void giveOneLevelExpToPlayer(ItemStack stack, EntityPlayer player) { float progress = player.experience; int expToNext = getExperienceForNextLevel(player.experienceLevel);//下一级需要的经验 int neededExp = (int) Math.ceil((1.0F - progress) * expToNext); float containedExp = (float) getStoredExperience(stack); if (containedExp < 1 ) return; if (containedExp >= neededExp) { setStoredExperience(stack, containedExp - neededExp); addPlayerXP(player, neededExp); if (player.experienceLevel % 5 == 0) { //每5级发出声音 float f = player.experienceLevel > 30 ? 1.0F : player.experienceLevel / 30.0F; player.getEntityWorld().playSound(null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_LEVELUP, player.getSoundCategory(), f * 0.75F, 1.0F); } } } public void absorbOneLevelExpFromPlayer(ItemStack stack, EntityPlayer player) { float progress = player.experience; if (progress > 0.0F) { int expDeduction = (int) getExperienceAcquiredToNext(player); //当前一级持有的经验 if (expDeduction > 0) { addPlayerXP(player, -expDeduction); addExperience(stack, expDeduction); } } else if ((progress == 0.0F) && (player.experienceLevel > 0)) { int expDeduction = getExperienceForNextLevel(player.experienceLevel - 1); addPlayerXP(player, -expDeduction); addExperience(stack, expDeduction); } }
public static int getPlayerXP(EntityPlayer player) {
return (int) (getExperienceForLevel(player.experienceLevel) + player.experience * player.xpBarCap());
}
public static void addPlayerXP(EntityPlayer player, int amount) {
int experience = Math.max(0, getPlayerXP(player) + amount);
player.experienceTotal = experience;
player.experienceLevel = getLevelForExperience(experience);
int expForLevel = getExperienceForLevel(player.experienceLevel);
player.experience = ((experience - expForLevel) / player.xpBarCap());
}
posted on 2019-03-03 21:48 nq17656721 阅读(225) 评论(0) 收藏 举报
浙公网安备 33010602011771号