Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 8 additions & 52 deletions src/main/java/fr/openmc/core/features/cube/Cube.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package fr.openmc.core.features.cube;

import fr.openmc.core.OMCPlugin;
import fr.openmc.core.features.cube.events.CubeActivateBubbleEvent;
import fr.openmc.core.features.cube.listeners.RepulseEffectListener;
import fr.openmc.core.features.cube.multiblocks.MultiBlock;
import fr.openmc.core.features.dream.DreamUtils;
import fr.openmc.core.features.cube.tasks.CorruptedBubbleTask;
import fr.openmc.core.features.cube.tasks.ReproductionTask;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
Expand Down Expand Up @@ -204,63 +206,17 @@ public void startMagneticShock() {
public final int RADIUS_BUBBLE = this.radius * 4;

public void startCorruptedBubble() {
Location center = this.getCenter();

int totalTicks = 20 * 1300;

startBubbleParticles();

if (corruptedBubbleTask != null) corruptedBubbleTask.cancel();

int intervalCorruption = 20 * 15;
corruptedBubbleTask = new BukkitRunnable() {
int elapsed = 0;

@Override
public void run() {
if (elapsed >= totalTicks) {
cancel();
corruptedBubbleTask = null;
return;
}

for (int i = 0; i < 30; i++) {
double theta = Math.random() * 2 * Math.PI;
double phi = Math.random() * Math.PI;
double r = Math.random() * RADIUS_BUBBLE;

double x = r * Math.sin(phi) * Math.cos(theta);
double y = r * Math.cos(phi);
double z = r * Math.sin(phi) * Math.sin(theta);

if (isPartOf(new Location(origin.getWorld(), x, y, z))) continue;

Location loc = center.clone().add(x, y, z);
Block block = loc.getBlock();
Material type = block.getType();

if (!DreamUtils.isDreamWorld(loc)) {
switch (type) {
case DIRT, GRASS_BLOCK, SAND, GRAVEL -> block.setType(Material.WARPED_NYLIUM);
case OAK_LOG, BIRCH_LOG, SPRUCE_LOG, JUNGLE_LOG, DARK_OAK_LOG,
ACACIA_LOG, MANGROVE_LOG -> block.setType(Material.WARPED_STEM);
case AIR, LAPIS_BLOCK -> {
}
default -> block.setType(Material.SCULK);
}
} else {
switch (type) {
case MUD -> block.setType(Material.SAND);
case AIR, LAPIS_BLOCK -> {
}
default -> block.setType(Material.GRASS_BLOCK);
}
}
}
int totalTicks = 20 * 1300;
corruptedBubbleTask = new CorruptedBubbleTask(this, RADIUS_BUBBLE, intervalCorruption, totalTicks)
.runTaskTimer(OMCPlugin.getInstance(), 0L, intervalCorruption);

elapsed += intervalCorruption;
}
}.runTaskTimer(OMCPlugin.getInstance(), 0L, intervalCorruption);
Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () ->
Bukkit.getPluginManager().callEvent(new CubeActivateBubbleEvent(this)));
}

public void startBubbleParticles() {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/fr/openmc/core/features/cube/CubeCommands.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package fr.openmc.core.features.cube;

import fr.openmc.core.OMCPlugin;
import fr.openmc.core.features.cube.events.CubeDesactivateBubbleEvent;
import fr.openmc.core.features.cube.multiblocks.MultiBlock;
import fr.openmc.core.features.cube.multiblocks.MultiBlockManager;
import fr.openmc.core.utils.text.messages.MessageType;
Expand Down Expand Up @@ -79,6 +81,8 @@ public void stopCorruptedBubble(
cube.corruptedBubbleTask.cancel();
cube.corruptedBubbleTask = null;
}
Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () ->
Bukkit.getPluginManager().callEvent(new CubeDesactivateBubbleEvent(cube)));
MessagesManager.sendMessage(player, Component.text("Bulle corrompue arreté"), Prefix.STAFF, MessageType.SUCCESS, false);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package fr.openmc.core.features.cube.events;

import fr.openmc.core.features.cube.Cube;
import lombok.Getter;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;

@Getter
public class CubeActivateBubbleEvent extends Event {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Activate -> Enable

private static final HandlerList HANDLERS = new HandlerList();
private final Cube cube;

public CubeActivateBubbleEvent(Cube cube) {
this.cube = cube;
}

public static HandlerList getHandlerList() {
return HANDLERS;
}

@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package fr.openmc.core.features.cube.events;

import fr.openmc.core.features.cube.Cube;
import lombok.Getter;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;

@Getter
public class CubeDesactivateBubbleEvent extends Event {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Desactivate -> Disable

private static final HandlerList HANDLERS = new HandlerList();
private final Cube cube;

public CubeDesactivateBubbleEvent(Cube cube) {
this.cube = cube;
}

public static HandlerList getHandlerList() {
return HANDLERS;
}

@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}
}
121 changes: 78 additions & 43 deletions src/main/java/fr/openmc/core/features/cube/listeners/CubeListener.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package fr.openmc.core.features.cube.listeners;

import fr.openmc.core.features.cube.Cube;
import fr.openmc.core.features.cube.events.CubeActivateBubbleEvent;
import fr.openmc.core.features.cube.events.CubeDesactivateBubbleEvent;
import fr.openmc.core.features.cube.events.EnterCubeZoneEvent;
import fr.openmc.core.features.cube.events.ExitCubeZoneEvent;
import fr.openmc.core.features.cube.multiblocks.MultiBlock;
Expand All @@ -14,6 +16,7 @@
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.potion.PotionEffect;
Expand All @@ -38,6 +41,26 @@ public void onPlayerInteract(PlayerInteractEvent event) {
}
}

@EventHandler
public void onPlayerQuit(PlayerJoinEvent event) {
updatePlayerBubbleState(event.getPlayer());
}

@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
for (MultiBlock mb : MultiBlockManager.getMultiBlocks()) {
if (!(mb instanceof Cube cube)) continue;

Location center = cube.getCenter();
double radius = cube.RADIUS_BUBBLE;

if (!player.getWorld().equals(center.getWorld())) continue;

if (player.getLocation().distance(center) <= radius) onPlayerExitBubble(player);
}
}

@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer();
Expand All @@ -54,41 +77,78 @@ public void onPlayerMove(PlayerMoveEvent event) {

@EventHandler
public void onPlayerEnterAndLeaveCubeZone(PlayerMoveEvent event) {
Player player = event.getPlayer();
updatePlayerBubbleState(event.getPlayer());
}

@EventHandler
public void onCubeBubbleStart(CubeActivateBubbleEvent event) {
Cube cube = event.getCube();

Location center = cube.getCenter();
double radius = cube.RADIUS_BUBBLE;

for (Player player : Bukkit.getOnlinePlayers()) {
if (!player.getWorld().equals(center.getWorld())) continue;

if (player.getLocation().distance(center) <= radius) {
updatePlayerBubbleState(player);
}
}
}

@EventHandler
public void onCubeBubbleStop(CubeDesactivateBubbleEvent event) {
Cube cube = event.getCube();

Location center = cube.getCenter();
double radius = cube.RADIUS_BUBBLE;

for (Player player : Bukkit.getOnlinePlayers()) {
if (!player.getWorld().equals(center.getWorld())) continue;

if (player.getLocation().distance(center) <= radius) {
updatePlayerBubbleState(player);
}
}
}

public void updatePlayerBubbleState(Player player) {
if (!player.getLocation().getWorld().getName().equals("world")
&& !player.getLocation().getWorld().getName().equals(DreamDimensionManager.DIMENSION_NAME)) return;

UUID uuid = player.getUniqueId();

boolean insideAny = false;
Cube cube = null;
Cube bestCube = null;

for (MultiBlock mb : MultiBlockManager.getMultiBlocks()) {
if (!(mb instanceof Cube loopCube)) continue;
if (!(mb instanceof Cube cube)) continue;

Location center = loopCube.getCenter();
double radius = loopCube.RADIUS_BUBBLE;
if (cube.corruptedBubbleTask == null) continue;

if (!player.getWorld().equals(center.getWorld())) continue;
cube = loopCube;
if (!player.getWorld().equals(cube.getCenter().getWorld())) continue;

if (player.getLocation().distance(center) <= radius) {
double dist = player.getLocation().distance(cube.getCenter());

if (dist <= cube.RADIUS_BUBBLE) {
insideAny = true;
bestCube = cube;
break;
}
}

if (cube == null) {
throw new NullPointerException("No Cube found in world: " + player.getLocation().getWorld().getName());
}

UUID uuid = player.getUniqueId();
boolean alreadyInside = playersInBubble.contains(uuid);

if (insideAny && !playersInBubble.contains(uuid)) {
if (insideAny && !alreadyInside) {
playersInBubble.add(uuid);
Bukkit.getPluginManager().callEvent(new EnterCubeZoneEvent(player, cube));
if (cube.corruptedBubbleTask != null) onPlayerEnterBubble(player);
} else if (!insideAny && playersInBubble.contains(uuid)) {
Bukkit.getPluginManager().callEvent(new EnterCubeZoneEvent(player, bestCube));
onPlayerEnterBubble(player);
return;
}

if (!insideAny && alreadyInside) {
playersInBubble.remove(uuid);
if (cube.corruptedBubbleTask != null) onPlayerExitBubble(player);
onPlayerExitBubble(player);
Bukkit.getPluginManager().callEvent(new ExitCubeZoneEvent(player));
}
}
Expand All @@ -108,29 +168,4 @@ public void onPlayerExitBubble(Player player) {
attr.setBaseValue(0.08);
player.removePotionEffect(PotionEffectType.JUMP_BOOST);
}

@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
for (MultiBlock mb : MultiBlockManager.getMultiBlocks()) {
if (!(mb instanceof Cube cube)) continue;

if (cube.corruptedBubbleTask == null) continue;

Location center = cube.getCenter();
double radius = cube.RADIUS_BUBBLE;

if (!player.getWorld().equals(center.getWorld())) continue;

boolean inside = player.getLocation().distance(center) <= radius;

if (!inside) continue;

AttributeInstance attr = player.getAttribute(Attribute.GRAVITY);
if (attr != null) {
attr.setBaseValue(0.08);
}
player.removePotionEffect(PotionEffectType.JUMP_BOOST);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package fr.openmc.core.features.cube.tasks;

import fr.openmc.core.OMCPlugin;
import fr.openmc.core.features.cube.Cube;
import fr.openmc.core.features.cube.events.CubeDesactivateBubbleEvent;
import fr.openmc.core.features.dream.DreamUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.scheduler.BukkitRunnable;

public class CorruptedBubbleTask extends BukkitRunnable {
private final Cube cube;
private final int radiusBubble;
private final int totalTicks;
private final int interval;
private int elapsed = 0;

public CorruptedBubbleTask(Cube cube, int radiusBubble, int intervalCorruption, int totalTicks) {
this.cube = cube;
this.radiusBubble = radiusBubble;
this.totalTicks = totalTicks;
this.interval = intervalCorruption;
}

@Override
public void run() {
if (elapsed >= totalTicks) {
cancel();
cube.corruptedBubbleTask = null;
Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () ->
Bukkit.getPluginManager().callEvent(new CubeDesactivateBubbleEvent(cube)));
return;
}

for (int i = 0; i < 30; i++) {
double theta = Math.random() * 2 * Math.PI;
double phi = Math.random() * Math.PI;
double r = Math.random() * radiusBubble;

double x = r * Math.sin(phi) * Math.cos(theta);
double y = r * Math.cos(phi);
double z = r * Math.sin(phi) * Math.sin(theta);

if (cube.isPartOf(new Location(cube.getCenter().getWorld(), x, y, z))) continue;

Location loc = cube.getCenter().clone().add(x, y, z);
Block block = loc.getBlock();
Material type = block.getType();

if (!DreamUtils.isDreamWorld(loc)) {
switch (type) {
case DIRT, GRASS_BLOCK, SAND, GRAVEL -> block.setType(Material.WARPED_NYLIUM);
case OAK_LOG, BIRCH_LOG, SPRUCE_LOG, JUNGLE_LOG, DARK_OAK_LOG,
ACACIA_LOG, MANGROVE_LOG -> block.setType(Material.WARPED_STEM);
case AIR, LAPIS_BLOCK -> {
}
default -> block.setType(Material.SCULK);
}
} else {
switch (type) {
case MUD -> block.setType(Material.SAND);
case AIR, LAPIS_BLOCK -> {
}
default -> block.setType(Material.GRASS_BLOCK);
}
}
}

elapsed += interval;
}
}
Loading
Loading