diff --git a/src/main/java/fr/openmc/core/features/dream/registries/mobs/CrazyFrog.java b/src/main/java/fr/openmc/core/features/dream/registries/mobs/CrazyFrog.java index 70dedb983..16b84f56b 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/mobs/CrazyFrog.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/mobs/CrazyFrog.java @@ -1,15 +1,37 @@ package fr.openmc.core.features.dream.registries.mobs; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.OMCRegistry; import fr.openmc.core.features.dream.models.registry.DreamMob; import fr.openmc.core.features.dream.registries.DreamItemRegistry; import fr.openmc.core.registry.loottable.CustomLoot; import fr.openmc.core.utils.RandomUtils; +import fr.openmc.core.utils.world.LocationUtils; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Frog; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; +import java.util.HashMap; import java.util.List; -public class CrazyFrog extends DreamMob { +/** + * Ring ding ding daa baa + * Baa aramba baa bom baa barooumba + * Wh-wha-what′s going on-on? + * Ding, ding + * This is the Crazy Frog + * Ding, ding + * Bem bem! + */ +public class CrazyFrog extends DreamMob implements Listener { + + private static final HashMap jumpTasks = new HashMap<>(); public CrazyFrog(String id) { super(id, @@ -37,4 +59,42 @@ public Frog spawn(Location location) { return frog; } + + @EventHandler + public void onHit(EntityDamageByEntityEvent event) { + if (!(OMCRegistry.CUSTOM_MOBS.getMob(event.getEntity()) instanceof CrazyFrog)) return; + if (!(event.getEntity() instanceof Frog frog)) return; + + if (jumpTasks.containsKey(frog)) { + cancelJumps(frog); + } + + jumpTasks.put(frog, Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { + jump(frog, RandomUtils.randomBetween(14, 15)); + for (int i = 0; i <= 3; i++) { + Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { + jump(frog, RandomUtils.randomBetween(9, 13)); + }, 40L * i); + }},5L)); + } + + private void jump(LivingEntity entity, double distance) { + Location to = LocationUtils.randomLocation(entity.getLocation(), distance); + Location from = entity.getLocation(); + + double dx = to.getX() - from.getX(); + double dz = to.getZ() - from.getZ(); + + double vy = 0.85; + double tick = (vy / 0.08) / 2; + double vx = dx / tick; + double vz = dz / tick; + + entity.setVelocity(new Vector(vx, vy, vz)); + } + + private void cancelJumps(Frog frog) { + BukkitTask task = jumpTasks.remove(frog); + if (task != null) task.cancel(); + } } diff --git a/src/main/java/fr/openmc/core/utils/world/LocationUtils.java b/src/main/java/fr/openmc/core/utils/world/LocationUtils.java index 1bc4b56ab..8d8fc52c0 100644 --- a/src/main/java/fr/openmc/core/utils/world/LocationUtils.java +++ b/src/main/java/fr/openmc/core/utils/world/LocationUtils.java @@ -9,6 +9,16 @@ import java.util.Random; public class LocationUtils { + public static Location randomLocation(Location origin, double distance) { + double angle = Math.random() * 2 * Math.PI; + + double x = origin.getX() + Math.cos(angle) * distance; + double z = origin.getZ() + Math.sin(angle) * distance; + + Location target = new Location(origin.getWorld(), x, origin.getY(), z); + return target.getWorld().getHighestBlockAt(target).getLocation().add(0, 1, 0); + } + public static Location getSafeNearbySurface(Location location, int radius) { World world = location.getWorld(); int baseY = location.getBlockY(); diff --git a/src/main/resources/datapacks/omc_dream/data/minecraft/tags/block/snow_layer_cannot_survive_on.json b/src/main/resources/datapacks/omc_dream/data/minecraft/tags/block/cannot_support_snow_layer.json similarity index 100% rename from src/main/resources/datapacks/omc_dream/data/minecraft/tags/block/snow_layer_cannot_survive_on.json rename to src/main/resources/datapacks/omc_dream/data/minecraft/tags/block/cannot_support_snow_layer.json