Compare commits

...

10 Commits

14 changed files with 432 additions and 84 deletions

View File

@@ -5,9 +5,6 @@ apply plugin: 'java'
group = 'net.rawmod'
version = '0.1.5'
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
repositories {
mavenCentral()
maven {

View File

@@ -50,7 +50,7 @@ public class BeastMasterClass extends MineClassImpl {
}
@Override
public Map<PotionEffectType, Integer> getPotionEffects() {
public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return potionEffects;
}
@@ -64,21 +64,26 @@ public class BeastMasterClass extends MineClassImpl {
return "beast_master";
}
@Override
public String getName() {
return "Beast master";
}
@Override
public void giveItems(Player player) {
if (!player.getInventory().contains(Material.BONE)) {
ItemStack itemStack = new ItemStack(Material.BONE, 1);
enchantItem(itemStack);
enchantItem(itemStack, player);
player.getInventory().addItem(itemStack);
}
if (!player.getInventory().contains(Material.SALMON)) {
ItemStack itemStack = new ItemStack(Material.SALMON, 1);
enchantItem(itemStack);
enchantItem(itemStack, player);
player.getInventory().addItem(itemStack);
}
if (!player.getInventory().contains(Material.SADDLE)) {
ItemStack itemStack = new ItemStack(Material.SADDLE, 1);
enchantItem(itemStack);
enchantItem(itemStack, player);
player.getInventory().addItem(itemStack);
}
}

View File

@@ -79,7 +79,7 @@ public class DwarfClass extends MineClassImpl {
}
@Override
public Map<PotionEffectType, Integer> getPotionEffects() {
public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return potionEffects;
}
@@ -93,6 +93,11 @@ public class DwarfClass extends MineClassImpl {
return "dwarf";
}
@Override
public String getName() {
return "Dwarf";
}
@Override
public void giveItems(Player player) {}
}

View File

@@ -49,7 +49,8 @@ public class ElfClass extends MineClassImpl {
Material.BOW,
Arrays.asList(
new Pair<>(Enchantment.ARROW_INFINITE, 1),
new Pair<>(Enchantment.ARROW_DAMAGE, 8))))
new Pair<>(Enchantment.ARROW_DAMAGE, 8),
new Pair<>(Enchantment.KNOCKBACK, 1))))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
@Override
@@ -58,7 +59,7 @@ public class ElfClass extends MineClassImpl {
}
@Override
public Map<PotionEffectType, Integer> getPotionEffects() {
public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return potionEffects;
}
@@ -72,6 +73,11 @@ public class ElfClass extends MineClassImpl {
return "elf";
}
@Override
public String getName() {
return "Elf";
}
@Override
public void giveItems(Player player) {}
}

View File

@@ -64,7 +64,7 @@ public class EnderElfClass extends MineClassImpl {
}
@Override
public Map<PotionEffectType, Integer> getPotionEffects() {
public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return potionEffects;
}
@@ -78,13 +78,21 @@ public class EnderElfClass extends MineClassImpl {
return "ender_elf";
}
@Override
public String getName() {
return "Ender elf";
}
@Override
public void reapplyEffects(Player player) {
super.reapplyEffects(player);
if (player.getWorld().getEnvironment().equals(World.Environment.THE_END)) {
PotionEffect saturation =
new PotionEffect(PotionEffectType.SATURATION, Integer.MAX_VALUE, 9, false, false);
player.addPotionEffect(saturation);
player.addPotionEffect(
new PotionEffect(PotionEffectType.SATURATION, Integer.MAX_VALUE, 0, false, false));
player.addPotionEffect(
new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 0, false, false));
player.addPotionEffect(
new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, Integer.MAX_VALUE, 0, false, false));
}
}
@@ -92,7 +100,7 @@ public class EnderElfClass extends MineClassImpl {
public void giveItems(Player player) {
if (!player.getInventory().contains(Material.ENDER_PEARL)) {
ItemStack itemStack = new ItemStack(Material.ENDER_PEARL, 2);
enchantItem(itemStack);
enchantItem(itemStack, player);
player.getInventory().addItem(itemStack);
}
}

View File

@@ -2,8 +2,10 @@ package net.rawmod.mineclass.classes;
import net.rawmod.mineclass.utils.Pair;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.util.*;
@@ -88,13 +90,26 @@ public class FireDwarfClass extends MineClassImpl {
Material.FLINT_AND_STEEL, new ArrayList<Pair<Enchantment, Integer>>()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
@Override
public void reapplyEffects(Player player) {
super.reapplyEffects(player);
if (player.getWorld().getEnvironment().equals(World.Environment.NETHER)) {
player.addPotionEffect(
new PotionEffect(PotionEffectType.SATURATION, Integer.MAX_VALUE, 0, false, false));
player.addPotionEffect(
new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 0, false, false));
player.addPotionEffect(
new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, Integer.MAX_VALUE, 0, false, false));
}
}
@Override
public Set<Material> getForbiddenItems() {
return forbiddenItems;
}
@Override
public Map<PotionEffectType, Integer> getPotionEffects() {
public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return potionEffects;
}
@@ -108,6 +123,11 @@ public class FireDwarfClass extends MineClassImpl {
return "fire_dwarf";
}
@Override
public String getName() {
return "Fire dwarf";
}
@Override
public void giveItems(Player player) {}
}

View File

@@ -15,7 +15,7 @@ public interface MineClass {
Set<Material> getForbiddenItems();
Map<PotionEffectType, Integer> getPotionEffects();
Map<PotionEffectType, Integer> getPotionEffects(Player player);
Map<Material, List<Pair<Enchantment, Integer>>> getClassEnchantments();
@@ -23,11 +23,15 @@ public interface MineClass {
boolean isItemForbidden(Material type);
void enchantItem(ItemStack itemStack);
void enchantItem(ItemStack itemStack, Player player);
void disenchantItem(ItemStack itemStack, Player player);
void giveItems(Player player);
String getCode();
String getName();
void dropForbiddenItems(Player player);
}

View File

@@ -21,6 +21,7 @@ public class MineClassFactory {
availableClasses.put("fire_dwarf", new FireDwarfClass());
availableClasses.put("ender_elf", new EnderElfClass());
availableClasses.put("beast_master", new BeastMasterClass());
availableClasses.put("naga", new NagaClass());
}
/** Point d'accès pour l'instance unique du singleton */
@@ -32,13 +33,24 @@ public class MineClassFactory {
return INSTANCE;
}
public static boolean isSoulBound(ItemStack itemStack) {
public static boolean isSimpleSoulBound(ItemStack itemStack) {
if (itemStack.getItemMeta() != null && itemStack.getItemMeta().getLore() != null) {
return itemStack.getItemMeta().getLore().contains("Soulbound");
}
return false;
}
public static boolean isSoulBound(ItemStack itemStack, Player player) {
if (itemStack.getItemMeta() != null && itemStack.getItemMeta().getLore() != null) {
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
return itemStack.getItemMeta().getLore().contains("Soulbound")
&& itemStack.getItemMeta().getLore().contains(player.getName())
&& mineClass.isPresent()
&& itemStack.getItemMeta().getLore().contains(mineClass.get().getName());
}
return false;
}
public static void clearAllClassEffects(Player player) {
for (PotionEffect activePotionEffect : player.getActivePotionEffects()) {
if (activePotionEffect.getDuration() > 32766) {
@@ -47,11 +59,41 @@ public class MineClassFactory {
}
}
public static void setUnbreakableAndSoulbound(ItemStack itemStack) {
public static void clearClassItem(Player player, ItemStack itemStack) {
ItemMeta itemMeta = itemStack.getItemMeta();
if (itemMeta != null) {
List<String> loreList = itemMeta.getLore();
if (loreList != null && loreList.contains("Soulbound")) {
String mineClassName = loreList.get(2);
System.out.println(mineClassName);
Optional<MineClass> optionalMineClass =
MineClassFactory.getInstance().findClassByName(mineClassName);
optionalMineClass.ifPresent(System.out::println);
optionalMineClass.ifPresent(mineClass -> mineClass.disenchantItem(itemStack, player));
}
}
}
public static void setUnbreakableAndSoulbound(ItemStack itemStack, Player player) {
if (itemStack.getItemMeta() != null) {
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setUnbreakable(true);
itemMeta.setLore(Collections.singletonList("Soulbound"));
List<String> loreList = new ArrayList<>();
loreList.add("Soulbound");
loreList.add(player.getName());
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
mineClass.ifPresent(aClass -> loreList.add(aClass.getName()));
itemMeta.setLore(loreList);
itemStack.setItemMeta(itemMeta);
}
}
public static void removeUnbreakableAndSoulbound(ItemStack itemStack, Player player) {
if (itemStack.getItemMeta() != null) {
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setUnbreakable(false);
List<String> loreList = new ArrayList<>();
itemMeta.setLore(loreList);
itemStack.setItemMeta(itemMeta);
}
}
@@ -82,6 +124,15 @@ public class MineClassFactory {
return Optional.empty();
}
public synchronized Optional<MineClass> findClassByName(String name) {
for (Map.Entry<String, MineClass> stringMineClassEntry : availableClasses.entrySet()) {
if (name != null && name.equals(stringMineClassEntry.getValue().getName())) {
return Optional.of(stringMineClassEntry.getValue());
}
}
return Optional.empty();
}
public void reapplyEffectsByCode(String code, Player player) {
availableClasses.get(code).reapplyEffects(player);
}

View File

@@ -12,7 +12,7 @@ public abstract class MineClassImpl implements MineClass {
@Override
public void reapplyEffects(Player player) {
MineClassFactory.clearAllClassEffects(player);
getPotionEffects()
getPotionEffects(player)
.forEach(
(key, value) -> {
if (player.hasPotionEffect(key)) {
@@ -30,7 +30,7 @@ public abstract class MineClassImpl implements MineClass {
}
@Override
public void enchantItem(ItemStack itemStack) {
public void enchantItem(ItemStack itemStack, Player player) {
if (getClassEnchantments().containsKey(itemStack.getType())) {
getClassEnchantments()
.getOrDefault(itemStack.getType(), new ArrayList<>())
@@ -38,7 +38,19 @@ public abstract class MineClassImpl implements MineClass {
enchantmentIntegerPair ->
itemStack.addUnsafeEnchantment(
enchantmentIntegerPair.getFirst(), enchantmentIntegerPair.getSecond()));
MineClassFactory.setUnbreakableAndSoulbound(itemStack);
MineClassFactory.setUnbreakableAndSoulbound(itemStack, player);
}
}
@Override
public void disenchantItem(ItemStack itemStack, Player player) {
if (getClassEnchantments().containsKey(itemStack.getType())) {
getClassEnchantments()
.getOrDefault(itemStack.getType(), new ArrayList<>())
.forEach(
enchantmentIntegerPair ->
itemStack.removeEnchantment(enchantmentIntegerPair.getFirst()));
MineClassFactory.removeUnbreakableAndSoulbound(itemStack, player);
}
}

View File

@@ -0,0 +1,106 @@
package net.rawmod.mineclass.classes;
import net.rawmod.mineclass.utils.Pair;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class NagaClass extends MineClassImpl {
private static final Set<Material> forbiddenItems =
new HashSet<>() {
{
add(Material.DIAMOND_SWORD);
add(Material.GOLDEN_SWORD);
add(Material.IRON_SWORD);
add(Material.NETHERITE_SWORD);
add(Material.DIAMOND_HOE);
add(Material.GOLDEN_HOE);
add(Material.IRON_HOE);
add(Material.NETHERITE_HOE);
add(Material.DIAMOND_AXE);
add(Material.GOLDEN_AXE);
add(Material.IRON_AXE);
add(Material.NETHERITE_AXE);
add(Material.CROSSBOW);
add(Material.BOW);
}
};
private static final Map<PotionEffectType, Integer> potionEffectsInWater =
Stream.of(
new Object[][] {
{PotionEffectType.WATER_BREATHING, 1},
{PotionEffectType.HEALTH_BOOST, 2},
{PotionEffectType.CONDUIT_POWER, 1},
{PotionEffectType.DOLPHINS_GRACE, 3},
{PotionEffectType.SATURATION, 1},
{PotionEffectType.NIGHT_VISION, 1},
{PotionEffectType.DAMAGE_RESISTANCE, 2},
{PotionEffectType.INCREASE_DAMAGE, 2},
{PotionEffectType.FAST_DIGGING, 10},
})
.collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1]));
private static final Map<PotionEffectType, Integer> potionEffectsOnEarth =
Stream.of(
new Object[][] {
{PotionEffectType.SLOW, 4},
{PotionEffectType.SLOW_DIGGING, 1},
{PotionEffectType.HUNGER, 10},
{PotionEffectType.WEAKNESS, 1},
})
.collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1]));
private static final Map<Material, List<Pair<Enchantment, Integer>>> classEnchantments =
Stream.of(
new AbstractMap.SimpleEntry<>(
Material.TRIDENT,
Arrays.asList(
new Pair<>(Enchantment.LOYALTY, 3),
new Pair<>(Enchantment.CHANNELING, 1),
new Pair<>(Enchantment.IMPALING, 5))))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
@Override
public Set<Material> getForbiddenItems() {
return forbiddenItems;
}
@Override
public Map<PotionEffectType, Integer> getPotionEffects(Player player) {
return player.isInWater() ? potionEffectsInWater : potionEffectsOnEarth;
}
@Override
public Map<Material, List<Pair<Enchantment, Integer>>> getClassEnchantments() {
return classEnchantments;
}
@Override
public String getCode() {
return "naga";
}
@Override
public String getName() {
return "Naga";
}
@Override
public void giveItems(Player player) {
if (!player.getInventory().contains(Material.TRIDENT)) {
ItemStack itemStack = new ItemStack(Material.TRIDENT, 1);
enchantItem(itemStack, player);
player.getInventory().addItem(itemStack);
}
}
}

View File

@@ -8,9 +8,13 @@ import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.util.Arrays;
import java.util.stream.Collectors;
public class CommandClass implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
@@ -40,7 +44,6 @@ public class CommandClass implements CommandExecutor {
MineClassFactory.clearAllClassEffects(player);
MineClassFactory.getInstance().reapplyEffectsByCode(args[0], player);
MineClassFactory.getInstance().giveItemsForClassByCode(args[0], player);
MineClassFactory.getInstance().dropForbiddenItemsForClassByCode(args[0], player);
MineClassFactory.getInstance().setClassCode(player, args[0]);
if (!player.hasPotionEffect(PotionEffectType.SATURATION)) {
player.addPotionEffect(new PotionEffect(PotionEffectType.SATURATION, 200, 9));

View File

@@ -14,16 +14,19 @@ import org.bukkit.event.Event;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.event.entity.*;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.player.*;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -32,6 +35,7 @@ import java.util.stream.Collectors;
public class MineClassListeners implements Listener {
private final Mineclass plugin;
private final HashMap<Player, PlayerTimerEffects> playerTimerEffectsHashMap = new HashMap<>();
public MineClassListeners(Mineclass plugin) {
this.plugin = plugin;
@@ -44,11 +48,25 @@ public class MineClassListeners implements Listener {
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent()) {
mineClass.get().reapplyEffects(player);
player.sendMessage(String.format("Reminder : You are a %s.", mineClass.get().getCode()));
player.sendMessage(String.format("Reminder, your class is : %s.", mineClass.get().getName()));
} else {
player.sendMessage(
"Hello ! The amazing MineClass mod is available on this server ! You can pick a class with the /class command.");
}
if (!playerTimerEffectsHashMap.containsKey(player)) {
PlayerTimerEffects playerTimerEffects = new PlayerTimerEffects(player);
playerTimerEffectsHashMap.put(player, playerTimerEffects);
playerTimerEffects.runTaskTimer(this.plugin, 20, 20);
} else {
playerTimerEffectsHashMap.get(player).runTaskTimer(this.plugin, 20, 20);
}
}
public void on(PlayerQuitEvent event) {
Player player = event.getPlayer();
if (playerTimerEffectsHashMap.containsKey(player)) {
playerTimerEffectsHashMap.get(player).cancel();
}
}
@EventHandler
@@ -59,24 +77,70 @@ public class MineClassListeners implements Listener {
}
@EventHandler
public void on(EntityPickupItemEvent event) {
if (event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity();
public void on(CraftItemEvent event) {
if (event.getWhoClicked() instanceof Player) {
Player player = (Player) event.getWhoClicked();
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent()) {
if (mineClass.get().isItemForbidden(event.getItem().getItemStack().getType())) {
event.setCancelled(true);
mineClass.ifPresent(it -> enchantItem(event));
}
mineClass.get().enchantItem(event.getItem().getItemStack());
}
@EventHandler
public void on(BlockDamageEvent event) {
Player player = event.getPlayer();
ItemStack itemInHand = event.getItemInHand();
applyBadEffects(player, itemInHand);
}
private boolean isItemforbidden(Player player, ItemStack itemStack) {
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
return mineClass
.map(
aClass ->
Optional.ofNullable(itemStack.getItemMeta())
.map(ItemMeta::getLore)
.map(it -> it.contains(player.getName()) && !it.contains(aClass.getName()))
.orElse(false))
.orElse(false);
}
private void applyBadEffects(Player player, ItemStack itemInHand) {
if (itemInHand == null) {
return;
}
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent() && mineClass.get().isItemForbidden(itemInHand.getType())
|| isItemforbidden(player, itemInHand)) {
player.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, 200, 0));
if (MineClassFactory.getInstance().getClassCode(player).equals("elf")) {
player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 200, 3));
} else {
player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 200, 1));
}
player.addPotionEffect(new PotionEffect(PotionEffectType.HUNGER, 200, 9));
player.setFoodLevel(Math.max(player.getFoodLevel() - 2, 0));
player.setSaturation(0);
}
}
@EventHandler
public void on(PlayerItemHeldEvent event) {
Player player = event.getPlayer();
ItemStack itemStack = player.getInventory().getItem(event.getNewSlot());
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (itemStack != null
&& (mineClass.isPresent() && mineClass.get().isItemForbidden(itemStack.getType())
|| isItemforbidden(player, itemStack))) {
player.sendMessage("Warning : You are unable to use this item efficiently.");
}
}
@EventHandler
public void on(PlayerDeathEvent event) {
Player player = event.getEntity();
List<ItemStack> itemStackList =
event.getDrops().stream()
.filter(MineClassFactory::isSoulBound)
.filter(it -> MineClassFactory.isSoulBound(it, player))
.collect(Collectors.toList());
event.getDrops().removeAll(itemStackList);
ClassItemPossessed.getInstance().addItems(event.getEntity().getName(), itemStackList);
@@ -91,41 +155,14 @@ public class MineClassListeners implements Listener {
ClassItemPossessed.getInstance().clearItems(event.getPlayer().getName());
}
@EventHandler
public void on(InventoryClickEvent event) {
if (event.getWhoClicked() instanceof Player) {
if (isForbiddenItem(event)) {
event.setCancelled(true);
return;
}
enchantItem(event);
}
}
private boolean isForbiddenItem(InventoryClickEvent event) {
private void enchantItem(CraftItemEvent event) {
Player player = (Player) event.getWhoClicked();
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent()) {
if (event.getCurrentItem() != null
&& mineClass.get().isItemForbidden(event.getCurrentItem().getType())) {
return true;
}
return event.getCursor() != null
&& mineClass.get().isItemForbidden(event.getCursor().getType());
}
return false;
}
private void enchantItem(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent()) {
if (event.getCurrentItem() != null && !MineClassFactory.isSoulBound(event.getCurrentItem())) {
mineClass.get().enchantItem(event.getCurrentItem());
}
if (event.getCursor() != null && !MineClassFactory.isSoulBound(event.getCursor())) {
mineClass.get().enchantItem(event.getCursor());
if (event.getCurrentItem() != null) {
mineClass.ifPresent(it -> it.enchantItem(event.getCurrentItem(), player));
}
if (event.getCursor() != null) {
mineClass.ifPresent(it -> it.enchantItem(event.getCursor(), player));
}
}
@@ -182,16 +219,17 @@ public class MineClassListeners implements Listener {
public void on(FoodLevelChangeEvent event) {
if (event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity();
if (MineClassFactory.getInstance().getClassCode(player).equals("elf")) {
int difference = player.getFoodLevel() - event.getFoodLevel();
if (MineClassFactory.getInstance().getClassCode(player).equals("elf")
&& player.getPotionEffect(PotionEffectType.HUNGER) == null) {
int difference = event.getFoodLevel() - player.getFoodLevel();
if (difference > 0) {
event.setCancelled(true);
event.setFoodLevel(player.getFoodLevel() + (difference * 2));
}
}
if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")) {
int difference = player.getFoodLevel() - event.getFoodLevel();
if (difference > 0) {
event.setFoodLevel(player.getFoodLevel() - (difference * 2));
event.setFoodLevel(Math.max(player.getFoodLevel() - (difference * 2), 0));
}
}
}
@@ -201,13 +239,14 @@ public class MineClassListeners implements Listener {
public void on(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Player) {
Player player = (Player) event.getDamager();
ItemStack itemInMainHand = player.getInventory().getItemInMainHand();
if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")
&& player.getInventory().getItemInMainHand().getType().equals(Material.ENDER_PEARL)) {
&& itemInMainHand.getType().equals(Material.ENDER_PEARL)) {
PlayerHitCounter.getInstance().increaseHitCount(player);
if (player.getAttackCooldown() == 1) {
// Vampirisme
if (player.getHealth() <= 19) {
player.setHealth(player.getHealth() + 1);
if (player.getHealth() < 20) {
PlayerUtils.heal(player, 1);
}
}
if (PlayerHitCounter.getInstance().getHitCounter(player) == 15) {
@@ -219,7 +258,10 @@ public class MineClassListeners implements Listener {
player.addPotionEffect(absorption);
}
// Damage
event.setDamage(event.getDamage() * (player.getAttackCooldown() * 10));
event.setDamage(Math.max(event.getDamage() * (player.getAttackCooldown() * 10), 1));
} else if (MineClassFactory.getInstance().getClassCode(player).equals("elf")
&& itemInMainHand.getType().equals(Material.BOW)) {
event.setDamage(Math.max(event.getDamage() * (player.getAttackCooldown() * 6), 1));
}
} else if (event.getDamager().hasMetadata("beastMasterWolfType")) {
event.getDamager().getMetadata("beastMasterWolfType").stream()
@@ -251,7 +293,7 @@ public class MineClassListeners implements Listener {
if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")
&& event.getEntity() instanceof EnderPearl) {
ItemStack itemStack = new ItemStack(Material.ENDER_PEARL, 1);
MineClassFactory.setUnbreakableAndSoulbound(itemStack);
MineClassFactory.setUnbreakableAndSoulbound(itemStack, player);
player.getInventory().addItem(itemStack);
}
}
@@ -268,40 +310,64 @@ public class MineClassListeners implements Listener {
@EventHandler
public void on(PlayerInteractEvent event) {
Player player = event.getPlayer();
ItemStack itemInHand = event.getItem();
boolean effect = false;
if (player.isSneaking()
&& event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
&& event.useInteractedBlock().equals(Event.Result.ALLOW)
&& MineClassFactory.getInstance().getClassCode(player).equals("beast_master")
&& event.getClickedBlock() != null
&& event.getItem() != null) {
&& itemInHand != null) {
event.setCancelled(true);
ItemStack itemStack = event.getItem();
switch (itemStack.getType()) {
switch (itemInHand.getType()) {
case SADDLE:
invokeHorse(event, player);
break;
case BONE:
try {
invokeWolf(event, player, itemStack);
invokeWolf(event, player, itemInHand);
} catch (IllegalStateException e) {
player.sendMessage(e.getMessage());
}
break;
case SALMON:
invokeCat(event, player, itemStack);
invokeCat(event, player, itemInHand);
break;
default:
break;
}
effect = true;
}
if (player.isSneaking()
&& (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
|| event.getAction().equals(Action.RIGHT_CLICK_AIR))
&& MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")
&& event.getItem() != null
&& event.getItem().getType().equals(Material.ENDER_PEARL)) {
&& itemInHand != null
&& itemInHand.getType().equals(Material.ENDER_PEARL)) {
player.openInventory(player.getEnderChest());
event.setCancelled(true);
effect = true;
}
if (player.isSneaking()
&& (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
|| event.getAction().equals(Action.RIGHT_CLICK_AIR))
&& itemInHand != null) {
System.out.println(itemInHand);
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (MineClassFactory.isSimpleSoulBound(itemInHand)) {
System.out.println("Clearing");
MineClassFactory.clearClassItem(player, itemInHand);
event.setCancelled(true);
} else {
if (mineClass.isPresent()) {
mineClass.get().enchantItem(itemInHand, player);
event.setCancelled(true);
}
}
effect = true;
}
if (!effect) {
applyBadEffects(player, itemInHand);
}
}

View File

@@ -0,0 +1,51 @@
package net.rawmod.mineclass.utils;
import net.rawmod.mineclass.classes.MineClass;
import net.rawmod.mineclass.classes.MineClassFactory;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.Optional;
public class PlayerTimerEffects extends BukkitRunnable {
private final Player player;
private boolean inWater;
public PlayerTimerEffects(Player player) {
this.player = player;
this.inWater = player.isInWater();
}
@Override
public void run() {
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
if (mineClass.isPresent() && mineClass.get().getCode().equals("naga")) {
if (!player.isInWater()) {
player.damage(1);
}
if (player.isInWater() != inWater) {
inWater = player.isInWater();
mineClass.get().reapplyEffects(player);
}
if (player.getFireTicks() > 0) {
player.damage(4);
}
}
if (mineClass.isPresent() && mineClass.get().getCode().equals("fire_dwarf")) {
if (player.getFireTicks() > 0) {
PlayerUtils.heal(player, 2);
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 40, 3));
player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 40, 1));
player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 40, 1));
}
if (player.isInWater()) {
player.damage(1);
}
}
}
}

View File

@@ -0,0 +1,14 @@
package net.rawmod.mineclass.utils;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.entity.Player;
public class PlayerUtils {
public static void heal(Player player, double amount) {
AttributeInstance maxHealh = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);
if (maxHealh != null) {
player.setHealth(Math.min(player.getHealth() + amount, maxHealh.getValue()));
}
}
}