diff --git a/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerSleepListener.java b/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerSleepListener.java index cc050462d..37c470be2 100644 --- a/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerSleepListener.java +++ b/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerSleepListener.java @@ -3,6 +3,7 @@ import fr.openmc.core.OMCPlugin; import fr.openmc.core.features.dream.DreamManager; import fr.openmc.core.features.dream.models.db.DBDreamPlayer; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -35,8 +36,6 @@ public void onPlayerSleep(PlayerBedEnterEvent event) { if (randomValue < DreamManager.calculateDreamProbability(player)) return; - DBDreamPlayer dbDreamPlayer = DreamManager.getCacheDreamPlayer(player); - player.addPotionEffect(new PotionEffect( PotionEffectType.NAUSEA, 20 * 10, @@ -46,20 +45,26 @@ public void onPlayerSleep(PlayerBedEnterEvent event) { false )); - new BukkitRunnable() { - @Override - public void run() { - if (dbDreamPlayer == null || (dbDreamPlayer.getDreamX() == null || dbDreamPlayer.getDreamY() == null || dbDreamPlayer.getDreamZ() == null)) { - DreamManager.tpPlayerDream(player); - } else { - DreamManager.tpPlayerToLastDreamLocation(player); - } - } - }.runTaskLater(OMCPlugin.getInstance(), 20L * 5); } @EventHandler public void onNightSkip(TimeSkipEvent event) { + + for (UUID uuid : playersDreaming) { + Player player = Bukkit.getPlayer(uuid); + if (player == null) continue; + DBDreamPlayer dbDreamPlayer = DreamManager.getCacheDreamPlayer(player); + new BukkitRunnable() { + @Override + public void run() { + if (dbDreamPlayer == null || (dbDreamPlayer.getDreamX() == null || dbDreamPlayer.getDreamY() == null || dbDreamPlayer.getDreamZ() == null)) { + DreamManager.tpPlayerDream(player); + } else { + DreamManager.tpPlayerToLastDreamLocation(player); + } + } + }.runTaskLater(OMCPlugin.getInstance(), 20L * 5); + } if (event.getSkipReason() == TimeSkipEvent.SkipReason.NIGHT_SKIP) playersDreaming.clear(); } } diff --git a/src/main/java/fr/openmc/core/features/dream/listeners/registry/DreamMobLootListener.java b/src/main/java/fr/openmc/core/features/dream/listeners/registry/DreamMobLootListener.java index 02fc9dd0b..f5e4a9602 100644 --- a/src/main/java/fr/openmc/core/features/dream/listeners/registry/DreamMobLootListener.java +++ b/src/main/java/fr/openmc/core/features/dream/listeners/registry/DreamMobLootListener.java @@ -29,6 +29,8 @@ public void onEntityDeath(EntityDeathEvent event) { DreamMob dreamMob = DreamMobsRegistry.getFromEntity(entity); if (dreamMob == null) return; + if (dreamMob.getDreamLoots() == null) return; + for (DreamLoot loot : dreamMob.getDreamLoots()) { if (Math.random() >= loot.chance()) return; diff --git a/src/main/java/fr/openmc/core/features/dream/registries/mobs/Soul.java b/src/main/java/fr/openmc/core/features/dream/registries/mobs/Soul.java index 42816772e..9d4a1130f 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/mobs/Soul.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/mobs/Soul.java @@ -18,6 +18,7 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataType; import org.bukkit.scheduler.BukkitRunnable; @@ -33,12 +34,7 @@ public Soul() { 3L, RandomUtils.randomBetween(0.4, 0.5), RandomUtils.randomBetween(0.7, 0.9), - List.of(new DreamLoot( - DreamItemRegistry.getByName("omc_dream:soul"), - 0.70, - 2, - 3 - )) + null ); } @@ -96,6 +92,13 @@ public LivingEntity spawn(Location location) { return vex; } + private final List loots = List.of(new DreamLoot( + DreamItemRegistry.getByName("omc_dream:soul"), + 0.70, + 1, + 2 + )); + private void registerSoulLink(Vex vex, ArmorStand stand) { Bukkit.getPluginManager().registerEvent(EntityDamageEvent.class, new Listener() { }, EventPriority.NORMAL, (listener, event) -> { @@ -118,8 +121,22 @@ private void registerSoulLink(Vex vex, ArmorStand stand) { Entity dead = e.getEntity(); if (dead.equals(vex) && stand.isValid()) { stand.remove(); + for (DreamLoot loot : loots) { + if (Math.random() >= loot.chance()) return; + + int amount = loot.minAmount() + (int) (Math.random() * (loot.maxAmount() - loot.minAmount() + 1)); + ItemStack drop = loot.item().getBest().asQuantity(amount); + dead.getWorld().dropItemNaturally(dead.getLocation(), drop); + } } else if (dead.equals(stand) && vex.isValid()) { vex.remove(); + for (DreamLoot loot : loots) { + if (Math.random() >= loot.chance()) return; + + int amount = loot.minAmount() + (int) (Math.random() * (loot.maxAmount() - loot.minAmount() + 1)); + ItemStack drop = loot.item().getBest().asQuantity(amount); + dead.getWorld().dropItemNaturally(dead.getLocation(), drop); + } } }, OMCPlugin.getInstance());