mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2025-06-28 03:34:43 +02:00
Added McMMOPlayerPreDeathPenaltyEvent and McMMOPlayerStatLossEvent
McMMOPlayerPreDeathPenaltyEvent is fired before hardcore calculations take place, use this if you want to cancel hardcore penalties. Use McMMOPlayerVampirismEvent and McMMOPlayerStatLossEvent when you want to know how many levels or experience the player lost or if you want to modify this.
This commit is contained in:
@ -1,5 +1,6 @@
|
||||
package com.gmail.nossr50.util;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
@ -27,8 +28,9 @@ import com.gmail.nossr50.events.fake.FakeBlockBreakEvent;
|
||||
import com.gmail.nossr50.events.fake.FakeBlockDamageEvent;
|
||||
import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
|
||||
import com.gmail.nossr50.events.fake.FakePlayerFishEvent;
|
||||
import com.gmail.nossr50.events.hardcore.McMMOPlayerDeathPenaltyEvent;
|
||||
import com.gmail.nossr50.events.hardcore.McMMOPlayerVampirismPenaltyEvent;
|
||||
import com.gmail.nossr50.events.hardcore.McMMOPlayerPreDeathPenaltyEvent;
|
||||
import com.gmail.nossr50.events.hardcore.McMMOPlayerStatLossEvent;
|
||||
import com.gmail.nossr50.events.hardcore.McMMOPlayerVampirismEvent;
|
||||
import com.gmail.nossr50.events.party.McMMOPartyLevelUpEvent;
|
||||
import com.gmail.nossr50.events.party.McMMOPartyTeleportEvent;
|
||||
import com.gmail.nossr50.events.party.McMMOPartyXpGainEvent;
|
||||
@ -164,32 +166,72 @@ public class EventUtils {
|
||||
return !isCancelled;
|
||||
}
|
||||
|
||||
public static boolean handleVampirismEvent(Player killer, Player victim, SkillType skillType, int levelsStolen, int xpStolen) {
|
||||
McMMOPlayerVampirismPenaltyEvent eventKiller = new McMMOPlayerVampirismPenaltyEvent(killer, skillType, levelsStolen, xpStolen);
|
||||
McMMOPlayerVampirismPenaltyEvent eventVictim = new McMMOPlayerVampirismPenaltyEvent(victim, skillType, -levelsStolen, -xpStolen);
|
||||
public static boolean handleStatsLossEvent(Player player, HashMap<String, Integer> levelChanged, HashMap<String, Float> experienceChanged) {
|
||||
McMMOPlayerStatLossEvent event = new McMMOPlayerStatLossEvent(player, levelChanged, experienceChanged);
|
||||
mcMMO.p.getServer().getPluginManager().callEvent(event);
|
||||
|
||||
boolean isCancelled = event.isCancelled();
|
||||
|
||||
if (!isCancelled) {
|
||||
levelChanged = event.getLevelChanged();
|
||||
experienceChanged = event.getExperienceChanged();
|
||||
PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile();
|
||||
|
||||
for (SkillType skillType : SkillType.NON_CHILD_SKILLS) {
|
||||
String skillName = skillType.toString();
|
||||
int playerSkillLevel = playerProfile.getSkillLevel(skillType);
|
||||
|
||||
playerProfile.modifySkill(skillType, playerSkillLevel - levelChanged.get(skillName));
|
||||
playerProfile.removeXp(skillType, experienceChanged.get(skillName));
|
||||
|
||||
if (playerProfile.getSkillXpLevel(skillType) < 0) {
|
||||
playerProfile.setSkillXpLevel(skillType, 0);
|
||||
}
|
||||
|
||||
if (playerProfile.getSkillLevel(skillType) < 0) {
|
||||
playerProfile.modifySkill(skillType, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return !isCancelled;
|
||||
}
|
||||
|
||||
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();
|
||||
int victimSkillLevel = victimProfile.getSkillLevel(skillType);
|
||||
|
||||
killerPlayer.addLevels(skillType, eventKiller.getLevelChanged());
|
||||
killerPlayer.beginUnsharedXpGain(skillType, eventKiller.getExperienceChanged(), XPGainReason.VAMPIRISM);
|
||||
for (SkillType skillType : SkillType.NON_CHILD_SKILLS) {
|
||||
String skillName = skillType.toString();
|
||||
int victimSkillLevel = victimProfile.getSkillLevel(skillType);
|
||||
|
||||
// For victims McMMOPlayerVampirismPenaltyEvent is fired with negative levels changed and XP changed
|
||||
victimProfile.modifySkill(skillType, victimSkillLevel + eventVictim.getLevelChanged());
|
||||
victimProfile.removeXp(skillType, (int) - eventVictim.getExperienceChanged());
|
||||
killerPlayer.addLevels(skillType, levelChangedKiller.get(skillName));
|
||||
killerPlayer.beginUnsharedXpGain(skillType, experienceChangedKiller.get(skillName), XPGainReason.VAMPIRISM);
|
||||
|
||||
if (victimProfile.getSkillXpLevel(skillType) < 0) {
|
||||
victimProfile.setSkillXpLevel(skillType, 0);
|
||||
}
|
||||
victimProfile.modifySkill(skillType, victimSkillLevel - levelChangedVictim.get(skillName));
|
||||
victimProfile.removeXp(skillType, experienceChangedVictim.get(skillName));
|
||||
|
||||
if (victimProfile.getSkillLevel(skillType) < 0) {
|
||||
victimProfile.modifySkill(skillType, 0);
|
||||
if (victimProfile.getSkillXpLevel(skillType) < 0) {
|
||||
victimProfile.setSkillXpLevel(skillType, 0);
|
||||
}
|
||||
|
||||
if (victimProfile.getSkillLevel(skillType) < 0) {
|
||||
victimProfile.modifySkill(skillType, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -224,8 +266,8 @@ public class EventUtils {
|
||||
return event;
|
||||
}
|
||||
|
||||
public static McMMOPlayerDeathPenaltyEvent callDeathPenaltyEvent(Player player, SkillType skill) {
|
||||
McMMOPlayerDeathPenaltyEvent event = new McMMOPlayerDeathPenaltyEvent(player, skill);
|
||||
public static McMMOPlayerPreDeathPenaltyEvent callPreDeathPenaltyEvent(Player player) {
|
||||
McMMOPlayerPreDeathPenaltyEvent event = new McMMOPlayerPreDeathPenaltyEvent(player);
|
||||
mcMMO.p.getServer().getPluginManager().callEvent(event);
|
||||
|
||||
return event;
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.gmail.nossr50.util;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.gmail.nossr50.config.Config;
|
||||
@ -18,6 +20,9 @@ public final class HardcoreManager {
|
||||
PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile();
|
||||
int totalLevelsLost = 0;
|
||||
|
||||
HashMap<String, Integer> levelChanged = new HashMap<String, Integer>();
|
||||
HashMap<String, Float> experienceChanged = new HashMap<String, Float>();
|
||||
|
||||
for (SkillType skillType : SkillType.NON_CHILD_SKILLS) {
|
||||
if (!skillType.getHardcoreStatLossEnabled()) {
|
||||
break;
|
||||
@ -33,19 +38,14 @@ public final class HardcoreManager {
|
||||
double statsLost = playerSkillLevel * (statLossPercentage * 0.01D);
|
||||
int levelsLost = (int) statsLost;
|
||||
int xpLost = (int) Math.floor(playerSkillXpLevel * (statsLost - levelsLost));
|
||||
levelChanged.put(skillType.toString(), levelsLost);
|
||||
experienceChanged.put(skillType.toString(), (float) xpLost);
|
||||
|
||||
totalLevelsLost += levelsLost;
|
||||
}
|
||||
|
||||
playerProfile.modifySkill(skillType, playerSkillLevel - levelsLost);
|
||||
playerProfile.removeXp(skillType, xpLost);
|
||||
|
||||
if (playerProfile.getSkillXpLevel(skillType) < 0) {
|
||||
playerProfile.setSkillXpLevel(skillType, 0);
|
||||
}
|
||||
|
||||
if (playerProfile.getSkillLevel(skillType) < 0) {
|
||||
playerProfile.modifySkill(skillType, 0);
|
||||
}
|
||||
if (!EventUtils.handleStatsLossEvent(player, levelChanged, experienceChanged)) {
|
||||
return;
|
||||
}
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Hardcore.DeathStatLoss.PlayerDeath", totalLevelsLost));
|
||||
@ -59,6 +59,9 @@ public final class HardcoreManager {
|
||||
PlayerProfile victimProfile = UserManager.getPlayer(victim).getProfile();
|
||||
int totalLevelsStolen = 0;
|
||||
|
||||
HashMap<String, Integer> levelChanged = new HashMap<String, Integer>();
|
||||
HashMap<String, Float> experienceChanged = new HashMap<String, Float>();
|
||||
|
||||
for (SkillType skillType : SkillType.NON_CHILD_SKILLS) {
|
||||
if (!skillType.getHardcoreVampirismEnabled()) {
|
||||
break;
|
||||
@ -76,10 +79,14 @@ public final class HardcoreManager {
|
||||
double statsStolen = victimSkillLevel * (vampirismStatLeechPercentage * 0.01D);
|
||||
int levelsStolen = (int) statsStolen;
|
||||
int xpStolen = (int) Math.floor(victimSkillXpLevel * (statsStolen - levelsStolen));
|
||||
levelChanged.put(skillType.toString(), levelsStolen);
|
||||
experienceChanged.put(skillType.toString(), (float) xpStolen);
|
||||
|
||||
if (EventUtils.handleVampirismEvent(killer, victim, skillType, levelsStolen, xpStolen)) {
|
||||
totalLevelsStolen += levelsStolen;
|
||||
}
|
||||
totalLevelsStolen += levelsStolen;
|
||||
}
|
||||
|
||||
if (!EventUtils.handleVampirismEvent(killer, victim, levelChanged, experienceChanged)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (totalLevelsStolen > 0) {
|
||||
|
Reference in New Issue
Block a user