mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2024-11-30 00:56:47 +01:00
Added McMMOPlayerVampirismEvent
Expands API possibilities regarding death penalty features.
This commit is contained in:
parent
80d358d1fd
commit
809779e508
@ -5,11 +5,20 @@ import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.player.PlayerEvent;
|
||||
|
||||
import com.gmail.nossr50.datatypes.skills.SkillType;
|
||||
|
||||
public class McMMOPlayerDeathPenaltyEvent extends PlayerEvent implements Cancellable {
|
||||
private SkillType skill;
|
||||
private boolean cancelled;
|
||||
|
||||
@Deprecated
|
||||
public McMMOPlayerDeathPenaltyEvent(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
public McMMOPlayerDeathPenaltyEvent(Player player, SkillType skill) {
|
||||
super(player);
|
||||
this.skill = skill;
|
||||
this.cancelled = false;
|
||||
}
|
||||
|
||||
@ -35,4 +44,8 @@ public class McMMOPlayerDeathPenaltyEvent extends PlayerEvent implements Cancell
|
||||
public static HandlerList getHandlerList() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public SkillType getSkill() {
|
||||
return skill;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,32 @@
|
||||
package com.gmail.nossr50.events.hardcore;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.gmail.nossr50.datatypes.skills.SkillType;
|
||||
|
||||
public class McMMOPlayerVampirismPenaltyEvent extends McMMOPlayerDeathPenaltyEvent {
|
||||
private int levelChanged;
|
||||
private float experienceChanged;
|
||||
|
||||
public McMMOPlayerVampirismPenaltyEvent(Player player, SkillType skill, int levelChanged, float experienceChanged) {
|
||||
super(player, skill);
|
||||
this.levelChanged = levelChanged;
|
||||
this.experienceChanged = experienceChanged;
|
||||
}
|
||||
|
||||
public int getLevelChanged() {
|
||||
return levelChanged;
|
||||
}
|
||||
|
||||
public void setLevelChanged(int levelChanged) {
|
||||
this.levelChanged = levelChanged;
|
||||
}
|
||||
|
||||
public float getExperienceChanged() {
|
||||
return experienceChanged;
|
||||
}
|
||||
|
||||
public void setExperienceChanged(float experienceChanged) {
|
||||
this.experienceChanged = experienceChanged;
|
||||
}
|
||||
}
|
@ -140,9 +140,8 @@ public class PlayerListener implements Listener {
|
||||
|
||||
Player killer = killedPlayer.getKiller();
|
||||
|
||||
|
||||
if (statLossEnabled || (killer != null && vampirismEnabled)) {
|
||||
if (EventUtils.callDeathPenaltyEvent(killedPlayer).isCancelled()) {
|
||||
if (EventUtils.callDeathPenaltyEvent(killedPlayer, null).isCancelled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,7 @@ 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.party.McMMOPartyLevelUpEvent;
|
||||
import com.gmail.nossr50.events.party.McMMOPartyTeleportEvent;
|
||||
import com.gmail.nossr50.events.party.McMMOPartyXpGainEvent;
|
||||
@ -163,6 +164,38 @@ 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);
|
||||
mcMMO.p.getServer().getPluginManager().callEvent(eventKiller);
|
||||
mcMMO.p.getServer().getPluginManager().callEvent(eventVictim);
|
||||
|
||||
boolean isCancelled = eventKiller.isCancelled() || eventVictim.isCancelled();
|
||||
|
||||
if (!isCancelled) {
|
||||
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 victims McMMOPlayerVampirismPenaltyEvent is fired with negative levels changed and XP changed
|
||||
victimProfile.modifySkill(skillType, victimSkillLevel + eventVictim.getLevelChanged());
|
||||
victimProfile.removeXp(skillType, (int) - eventVictim.getExperienceChanged());
|
||||
|
||||
if (victimProfile.getSkillXpLevel(skillType) < 0) {
|
||||
victimProfile.setSkillXpLevel(skillType, 0);
|
||||
}
|
||||
|
||||
if (victimProfile.getSkillLevel(skillType) < 0) {
|
||||
victimProfile.modifySkill(skillType, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return !isCancelled;
|
||||
}
|
||||
|
||||
public static McMMOPlayerAbilityDeactivateEvent callAbilityDeactivateEvent(Player player, AbilityType ability) {
|
||||
McMMOPlayerAbilityDeactivateEvent event = new McMMOPlayerAbilityDeactivateEvent(player, SkillType.byAbility(ability));
|
||||
mcMMO.p.getServer().getPluginManager().callEvent(event);
|
||||
@ -191,8 +224,8 @@ public class EventUtils {
|
||||
return event;
|
||||
}
|
||||
|
||||
public static McMMOPlayerDeathPenaltyEvent callDeathPenaltyEvent(Player player) {
|
||||
McMMOPlayerDeathPenaltyEvent event = new McMMOPlayerDeathPenaltyEvent(player);
|
||||
public static McMMOPlayerDeathPenaltyEvent callDeathPenaltyEvent(Player player, SkillType skill) {
|
||||
McMMOPlayerDeathPenaltyEvent event = new McMMOPlayerDeathPenaltyEvent(player, skill);
|
||||
mcMMO.p.getServer().getPluginManager().callEvent(event);
|
||||
|
||||
return event;
|
||||
|
@ -3,10 +3,8 @@ package com.gmail.nossr50.util;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.gmail.nossr50.config.Config;
|
||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.datatypes.player.PlayerProfile;
|
||||
import com.gmail.nossr50.datatypes.skills.SkillType;
|
||||
import com.gmail.nossr50.datatypes.skills.XPGainReason;
|
||||
import com.gmail.nossr50.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.util.player.UserManager;
|
||||
|
||||
@ -57,8 +55,7 @@ public final class HardcoreManager {
|
||||
double vampirismStatLeechPercentage = Config.getInstance().getHardcoreVampirismStatLeechPercentage();
|
||||
int levelThreshold = Config.getInstance().getHardcoreVampirismLevelThreshold();
|
||||
|
||||
McMMOPlayer killerPlayer = UserManager.getPlayer(killer);
|
||||
PlayerProfile killerProfile = killerPlayer.getProfile();
|
||||
PlayerProfile killerProfile = UserManager.getPlayer(killer).getProfile();
|
||||
PlayerProfile victimProfile = UserManager.getPlayer(victim).getProfile();
|
||||
int totalLevelsStolen = 0;
|
||||
|
||||
@ -80,20 +77,8 @@ public final class HardcoreManager {
|
||||
int levelsStolen = (int) statsStolen;
|
||||
int xpStolen = (int) Math.floor(victimSkillXpLevel * (statsStolen - levelsStolen));
|
||||
|
||||
totalLevelsStolen += levelsStolen;
|
||||
|
||||
killerPlayer.addLevels(skillType, levelsStolen);
|
||||
killerPlayer.beginUnsharedXpGain(skillType, xpStolen, XPGainReason.VAMPIRISM);
|
||||
|
||||
victimProfile.modifySkill(skillType, victimSkillLevel - levelsStolen);
|
||||
victimProfile.removeXp(skillType, xpStolen);
|
||||
|
||||
if (victimProfile.getSkillXpLevel(skillType) < 0) {
|
||||
victimProfile.setSkillXpLevel(skillType, 0);
|
||||
}
|
||||
|
||||
if (victimProfile.getSkillLevel(skillType) < 0) {
|
||||
victimProfile.modifySkill(skillType, 0);
|
||||
if (EventUtils.handleVampirismEvent(killer, victim, skillType, levelsStolen, xpStolen)) {
|
||||
totalLevelsStolen += levelsStolen;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user