我的世界MC mod开发日志-开发

我的世界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)    收藏  举报

导航