/** * Begins an experience gain. The amount will be affected by skill modifiers, global rate, perks, * and may be shared with the party * * @param skill Skill being used * @param xp Experience amount to process */ public void beginXpGain(SkillType skill, float xp, XPGainReason xpGainReason) { Validate.isTrue(xp >= 0.0, "XP gained should be greater than or equal to zero."); if (xp <= 0.0) { return; } if (skill.isChildSkill()) { Set<SkillType> parentSkills = FamilyTree.getParents(skill); float splitXp = xp / parentSkills.size(); for (SkillType parentSkill : parentSkills) { if (parentSkill.getPermissions(player)) { beginXpGain(parentSkill, splitXp, xpGainReason); } } return; } // Return if the experience has been shared if (party != null && ShareHandler.handleXpShare( xp, this, skill, ShareHandler.getSharedXpGainReason(xpGainReason))) { return; } beginUnsharedXpGain(skill, xp, xpGainReason); }
public static boolean handleVampirismEvent( Player killer, Player victim, HashMap<String, Integer> levelChanged, HashMap<String, Float> experienceChanged) { McMMOPlayerVampirismEvent eventKiller = new McMMOPlayerVampirismEvent(killer, false, levelChanged, experienceChanged); McMMOPlayerVampirismEvent eventVictim = new McMMOPlayerVampirismEvent(victim, true, levelChanged, experienceChanged); mcMMO.p.getServer().getPluginManager().callEvent(eventKiller); mcMMO.p.getServer().getPluginManager().callEvent(eventVictim); boolean isCancelled = eventKiller.isCancelled() || eventVictim.isCancelled(); if (!isCancelled) { HashMap<String, Integer> levelChangedKiller = eventKiller.getLevelChanged(); HashMap<String, Float> experienceChangedKiller = eventKiller.getExperienceChanged(); HashMap<String, Integer> levelChangedVictim = eventVictim.getLevelChanged(); HashMap<String, Float> experienceChangedVictim = eventVictim.getExperienceChanged(); McMMOPlayer killerPlayer = UserManager.getPlayer(killer); PlayerProfile victimProfile = UserManager.getPlayer(victim).getProfile(); for (SkillType skillType : SkillType.NON_CHILD_SKILLS) { String skillName = skillType.toString(); int victimSkillLevel = victimProfile.getSkillLevel(skillType); killerPlayer.addLevels(skillType, levelChangedKiller.get(skillName)); killerPlayer.beginUnsharedXpGain( skillType, experienceChangedKiller.get(skillName), XPGainReason.VAMPIRISM); victimProfile.modifySkill(skillType, victimSkillLevel - levelChangedVictim.get(skillName)); victimProfile.removeXp(skillType, experienceChangedVictim.get(skillName)); if (victimProfile.getSkillXpLevel(skillType) < 0) { victimProfile.setSkillXpLevel(skillType, 0); } if (victimProfile.getSkillLevel(skillType) < 0) { victimProfile.modifySkill(skillType, 0); } } } return !isCancelled; }