mirror of
https://github.com/taoneill/war.git
synced 2024-11-27 12:46:11 +01:00
Closes gh-326. Potion effects are cleared at respawn and saved with player state so, for example, you get re-poisonned when you exit a warzone if you entered with the effect. Thanks @mahoutsukaii for the MobEffect trick.
This commit is contained in:
parent
007344a63e
commit
0cf0024e55
132
war/src/main/java/com/tommytony/war/PotionEffect.java
Normal file
132
war/src/main/java/com/tommytony/war/PotionEffect.java
Normal file
@ -0,0 +1,132 @@
|
||||
package com.tommytony.war;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import net.minecraft.server.MobEffect;
|
||||
import net.minecraft.server.MobEffectList;
|
||||
|
||||
import org.bukkit.craftbukkit.entity.CraftPlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import bukkit.tommytony.war.War;
|
||||
|
||||
public class PotionEffect {
|
||||
|
||||
private int id;
|
||||
private int amplifier;
|
||||
private int time;
|
||||
|
||||
public PotionEffect(int id, int amplifier, int time) {
|
||||
this.setId(id);
|
||||
this.setAmplifier(amplifier);
|
||||
this.setTime(time);
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setAmplifier(int amplifier) {
|
||||
this.amplifier = amplifier;
|
||||
}
|
||||
|
||||
public int getAmplifier() {
|
||||
return amplifier;
|
||||
}
|
||||
|
||||
public void setTime(int time) {
|
||||
this.time = time;
|
||||
}
|
||||
|
||||
public int getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
public static List<PotionEffect> getCurrentPotionEffects(Player player) {
|
||||
List<PotionEffect> effects = new ArrayList<PotionEffect>();
|
||||
|
||||
for(int i = 1; i < 20; i++)
|
||||
{
|
||||
if(((CraftPlayer)player).getHandle().hasEffect(enchantIdToList(i)))
|
||||
{
|
||||
MobEffect mobEffect = ((CraftPlayer)player).getHandle().getEffect(enchantIdToList(i));
|
||||
effects.add(new PotionEffect(mobEffect.getEffectId(), mobEffect.getAmplifier(), mobEffect.getDuration()));
|
||||
War.war.log("Stored " + mobEffect.getEffectId(), Level.INFO);
|
||||
}
|
||||
}
|
||||
|
||||
return effects;
|
||||
}
|
||||
|
||||
public static void restorePotionEffects(Player player, List<PotionEffect> potionEffects) {
|
||||
clearPotionEffects(player);
|
||||
for (PotionEffect effect : potionEffects) {
|
||||
((CraftPlayer)player).getHandle().addEffect(new MobEffect(effect.getId(), effect.getTime(), effect.getAmplifier()));
|
||||
War.war.log("Restored " + effect.getId(), Level.INFO);
|
||||
}
|
||||
}
|
||||
|
||||
public static void clearPotionEffects(Player player) {
|
||||
for (int i = 1; i < 20; i++) {
|
||||
if(((CraftPlayer)player).getHandle().hasEffect(enchantIdToList(i)))
|
||||
{
|
||||
int amplifier = ((CraftPlayer)player).getHandle().getEffect(enchantIdToList(i)).getAmplifier();
|
||||
((CraftPlayer)player).getHandle().addEffect(new MobEffect(i, -1, amplifier + 1));
|
||||
|
||||
War.war.log("Cleared " + i, Level.INFO);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static MobEffectList enchantIdToList(int id) {
|
||||
switch (id) {
|
||||
case 1:
|
||||
return MobEffectList.FASTER_MOVEMENT;
|
||||
case 2:
|
||||
return MobEffectList.SLOWER_MOVEMENT;
|
||||
case 3:
|
||||
return MobEffectList.FASTER_DIG;
|
||||
case 4:
|
||||
return MobEffectList.SLOWER_DIG;
|
||||
case 5:
|
||||
return MobEffectList.INCREASE_DAMAGE;
|
||||
case 6:
|
||||
return MobEffectList.HEAL;
|
||||
case 7:
|
||||
return MobEffectList.HARM;
|
||||
case 8:
|
||||
return MobEffectList.JUMP;
|
||||
case 9:
|
||||
return MobEffectList.CONFUSION;
|
||||
case 10:
|
||||
return MobEffectList.REGENERATION;
|
||||
case 11:
|
||||
return MobEffectList.RESISTANCE;
|
||||
case 12:
|
||||
return MobEffectList.FIRE_RESISTANCE;
|
||||
case 13:
|
||||
return MobEffectList.WATER_BREATHING;
|
||||
case 14:
|
||||
return MobEffectList.INVISIBILITY;
|
||||
case 15:
|
||||
return MobEffectList.BLINDNESS;
|
||||
case 16:
|
||||
return MobEffectList.NIGHT_VISION;
|
||||
case 17:
|
||||
return MobEffectList.HUNGER;
|
||||
case 18:
|
||||
return MobEffectList.WEAKNESS;
|
||||
case 19:
|
||||
return MobEffectList.POISON;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -7,6 +7,9 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import net.minecraft.server.MobEffect;
|
||||
import net.minecraft.server.MobEffectList;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
@ -15,6 +18,7 @@ import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.craftbukkit.entity.CraftItem;
|
||||
import org.bukkit.craftbukkit.entity.CraftPlayer;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Item;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -336,6 +340,9 @@ public class Warzone {
|
||||
if (player.getGameMode() == GameMode.CREATIVE) {
|
||||
player.setGameMode(GameMode.SURVIVAL);
|
||||
}
|
||||
// clear potion effects
|
||||
PotionEffect.clearPotionEffects(player);
|
||||
|
||||
if (!this.getLoadoutSelections().keySet().contains(player.getName())) {
|
||||
this.getLoadoutSelections().put(player.getName(), new LoadoutSelection(true, 0));
|
||||
} else {
|
||||
@ -469,9 +476,11 @@ public class Warzone {
|
||||
public void keepPlayerState(Player player) {
|
||||
PlayerInventory inventory = player.getInventory();
|
||||
ItemStack[] contents = inventory.getContents();
|
||||
List<PotionEffect> potionEffects = PotionEffect.getCurrentPotionEffects(player);
|
||||
this.playerStates.put(player.getName(), new PlayerState(player.getGameMode(),
|
||||
contents, inventory.getHelmet(), inventory.getChestplate(), inventory.getLeggings(), inventory.getBoots(),
|
||||
player.getHealth(), player.getExhaustion(), player.getSaturation(), player.getFoodLevel()));
|
||||
player.getHealth(), player.getExhaustion(), player.getSaturation(),
|
||||
player.getFoodLevel(), potionEffects));
|
||||
}
|
||||
|
||||
public void restorePlayerState(Player player) {
|
||||
@ -484,6 +493,7 @@ public class Warzone {
|
||||
player.setExhaustion(originalContents.getExhaustion());
|
||||
player.setSaturation(originalContents.getSaturation());
|
||||
player.setFoodLevel(originalContents.getFoodLevel());
|
||||
PotionEffect.restorePotionEffects(player, originalContents.getPotionEffects());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,12 @@
|
||||
package com.tommytony.war.utils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import com.tommytony.war.PotionEffect;
|
||||
|
||||
public class PlayerState {
|
||||
private ItemStack[] contents;
|
||||
private ItemStack helmet;
|
||||
@ -14,14 +18,15 @@ public class PlayerState {
|
||||
private final int foodLevel;
|
||||
private final int health;
|
||||
private final GameMode gamemode;
|
||||
private final List<PotionEffect> potionEffects;
|
||||
|
||||
|
||||
public PlayerState(GameMode gamemode, ItemStack[] contents, ItemStack helmet, ItemStack chest, ItemStack legs, ItemStack feet, int health, float exhaustion, float saturation, int foodLevel) {
|
||||
public PlayerState(GameMode gamemode, ItemStack[] contents, ItemStack helmet, ItemStack chest, ItemStack legs, ItemStack feet, int health, float exhaustion, float saturation, int foodLevel, List<PotionEffect> potionEffects) {
|
||||
this.gamemode = gamemode;
|
||||
this.health = health;
|
||||
this.exhaustion = exhaustion;
|
||||
this.saturation = saturation;
|
||||
this.foodLevel = foodLevel;
|
||||
this.potionEffects = potionEffects;
|
||||
this.setContents(contents);
|
||||
this.setHelmet(helmet);
|
||||
this.setChest(chest);
|
||||
@ -89,4 +94,8 @@ public class PlayerState {
|
||||
return gamemode;
|
||||
}
|
||||
|
||||
public List<PotionEffect> getPotionEffects() {
|
||||
return potionEffects;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user