Compare commits
10 Commits
26091142a8
...
bb7f49ed99
| Author | SHA1 | Date | |
|---|---|---|---|
| bb7f49ed99 | |||
| fdcbf027f9 | |||
| 7452aef50a | |||
| 6be08365b5 | |||
| 4b8304934f | |||
| 3a321fd49b | |||
| 9095707d77 | |||
| f89bf5a010 | |||
| 2e9f397155 | |||
| 6a089d9f66 |
@@ -5,9 +5,6 @@ apply plugin: 'java'
|
||||
group = 'net.rawmod'
|
||||
version = '0.1.5'
|
||||
|
||||
sourceCompatibility = '1.8'
|
||||
targetCompatibility = '1.8'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {}
|
||||
}
|
||||
|
||||
@@ -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) {}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
106
src/main/java/net/rawmod/mineclass/classes/NagaClass.java
Normal file
106
src/main/java/net/rawmod/mineclass/classes/NagaClass.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
|
||||
@@ -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.get().enchantItem(event.getItem().getItemStack());
|
||||
mineClass.ifPresent(it -> enchantItem(event));
|
||||
}
|
||||
}
|
||||
|
||||
@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());
|
||||
if (event.getCurrentItem() != null) {
|
||||
mineClass.ifPresent(it -> it.enchantItem(event.getCurrentItem(), player));
|
||||
}
|
||||
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.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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
14
src/main/java/net/rawmod/mineclass/utils/PlayerUtils.java
Normal file
14
src/main/java/net/rawmod/mineclass/utils/PlayerUtils.java
Normal 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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user