Skip to content

Commit

Permalink
Add visualizations of regions, borders and chunks
Browse files Browse the repository at this point in the history
  • Loading branch information
rlf committed Jun 19, 2016
1 parent 59468e0 commit 437b606
Show file tree
Hide file tree
Showing 27 changed files with 350 additions and 482 deletions.
2 changes: 1 addition & 1 deletion bukkit-utils/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>dk.lockfuglsang.minecraft</groupId>
<artifactId>bukkit-utils</artifactId>
<version>1.4</version>
<version>1.5</version>

<properties>
<GITHUB_TOKEN>invalid</GITHUB_TOKEN>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package dk.lockfuglsang.minecraft.animation;

import org.bukkit.entity.Player;

/**
* Common interface for animations
*/
public interface Animation {
boolean show();

boolean hide();

Player getPlayer();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package dk.lockfuglsang.minecraft.animation;

import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;

import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
* Handles particles and per-player block-animations
*/
public class AnimationHandler {
private final Map<UUID, Set<Animation>> animations = new ConcurrentHashMap<>();
private final Plugin plugin;
private AnimationTask animationTask;

private int animTick;

public AnimationHandler(Plugin plugin) {
this.plugin = plugin;
animTick = plugin.getConfig().getInt("animations.tick", 20);
}

public void setAnimTick(int animTick) {
this.animTick = animTick;
plugin.getConfig().set("animations.tick", animTick);
}

public synchronized void addAnimation(Animation animation) {
if (!animations.containsKey(animation.getPlayer().getUniqueId())) {
animations.put(animation.getPlayer().getUniqueId(), new HashSet<Animation>());
}
animations.get(animation.getPlayer().getUniqueId()).add(animation);
start();
}

public synchronized boolean removeAnimations(Player player) {
Set<Animation> animSet = animations.remove(player.getUniqueId());
if (animSet == null) {
return false;
}
for (Animation animation : animSet) {
animation.hide();
}
return true;
}

public synchronized void start() {
if (animationTask == null && !animations.isEmpty()) {
animationTask = new AnimationTask();
animationTask.runTaskTimerAsynchronously(plugin, 0, animTick);
}
}

public synchronized void stop() {
if (animationTask != null) {
animationTask.cancel();
animationTask = null;
}
Collection<Set<Animation>> anims = animations.values();
for (Set<Animation> animSet : anims) {
for (Animation animation : animSet) {
animation.hide();
}
}
}

private class AnimationTask extends BukkitRunnable {
@Override
public void run() {
Collection<Set<Animation>> anims = animations.values();
for (Set<Animation> animSet : anims) {
for (Animation animation : animSet) {
if (!animation.show()) {
UUID uuid = animation.getPlayer().getUniqueId();
animations.get(uuid).remove(animation);
if (animations.get(uuid).isEmpty()) {
animations.remove(uuid);
}
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package dk.lockfuglsang.minecraft.animation;

import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;

import java.util.List;

/**
* Sends (bogus) block-info to the player
*/
public class BlockAnimation implements Animation {
private final Player player;
private final List<Location> points;
private final Material material;
private final byte data;
private volatile boolean shown;

public BlockAnimation(Player player, List<Location> points, Material material, byte data) {
this.player = player;
this.points = points;
this.material = material;
this.data = data;
shown = false;
}

@Override
public boolean show() {
if (!player.isOnline()) {
return false;
}
if (shown) {
return true;
}
for (Location loc : points) {
if (!PlayerHandler.sendBlockChange(player, loc, material, data)) {
return false;
}
}
shown = true;
return true;
}

@Override
public boolean hide() {
try {
if (shown) {
for (Location loc : points) {
if (!PlayerHandler.sendBlockChange(player, loc, loc.getBlock().getType(), loc.getBlock().getData())) {
return false;
}
}
return true;
}
return false;
} finally {
shown = false;
}
}

@Override
public Player getPlayer() {
return player;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package dk.lockfuglsang.minecraft.animation;

import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.entity.Player;

import java.util.List;

/**
* An animation using particles (requires refreshes).
*/
public class ParticleAnimation implements Animation {
private final Player player;
private final Particle particle;
private final List<Location> points;
private final int animCount;

public ParticleAnimation(Player player, List<Location> points, Particle particle, int animCount) {
this.player = player;
this.particle = particle;
this.points = points;
this.animCount = animCount;
}

@Override
public boolean show() {
if (!player.isOnline()) {
return false;
}
for (Location loc : points) {
if (!PlayerHandler.spawnParticle(player, particle, loc, animCount)) {
return false;
}
}
return true;
}

@Override
public boolean hide() {
return true;
}

@Override
public Player getPlayer() {
return player;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package us.talabrek.ultimateskyblock.handler;
package dk.lockfuglsang.minecraft.animation;

import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.entity.Player;

Expand All @@ -10,10 +11,10 @@
import java.util.logging.Logger;

/**
* Common handler across servers for sending particles to a player.
* Common handler across servers for sending particles and other packages to a player.
*/
public enum ParticleHandler {;
private static final Logger log = Logger.getLogger(ParticleHandler.class.getName());
public enum PlayerHandler {;
private static final Logger log = Logger.getLogger(PlayerHandler.class.getName());

public static boolean spawnParticle(Player player, Particle particle, Location loc, int count) {
try {
Expand All @@ -23,7 +24,20 @@ public static boolean spawnParticle(Player player, Particle particle, Location l
return true;
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
log.finest("Unable to playEffect for player " + player + ": " + e);
log.finest("Unable to spawnParticle for player " + player + ": " + e);
}
return false;
}

public static boolean sendBlockChange(Player player, Location location, Material material, byte data) {
try {
Method method = getMethod(player, "sendBlockChange", new Class<?>[]{Location.class, Material.class, Byte.TYPE});
if (method != null) {
method.invoke(player, location, material, data);
return true;
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
log.finest("Unable to sendBlockChange to player " + player + ": " + e);
}
return false;
}
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

<properties>
<api.version>2.7.0</api.version>
<bukkit-utils.version>1.4</bukkit-utils.version>
<bukkit-utils.version>1.5</bukkit-utils.version>
<po-utils.version>1.2</po-utils.version>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import dk.lockfuglsang.minecraft.po.I18nUtil;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import dk.lockfuglsang.minecraft.animation.AnimationHandler;
import us.talabrek.ultimateskyblock.command.admin.*;
import us.talabrek.ultimateskyblock.command.completion.AllPlayerTabCompleter;
import us.talabrek.ultimateskyblock.command.completion.BiomeTabCompleter;
Expand All @@ -19,7 +20,7 @@
* The new admin command, alias /usb
*/
public class AdminCommand extends AbstractCommandExecutor {
public AdminCommand(final uSkyBlock plugin, ConfirmHandler confirmHandler) {
public AdminCommand(final uSkyBlock plugin, ConfirmHandler confirmHandler, AnimationHandler animationHandler) {
super("usb", "usb.admin", I18nUtil.tr("Ultimate SkyBlock Admin"));
OnlinePlayerTabCompleter playerCompleter = new OnlinePlayerTabCompleter();
TabCompleter challengeCompleter = new ChallengeTabCompleter();
Expand Down Expand Up @@ -58,6 +59,6 @@ protected void doExecute(CommandSender sender, PlayerInfo playerInfo) {
add(new JobsCommand(plugin));
add(new ConfigGUICommand(plugin));
add(new DocumentCommand(plugin, "doc", "usb.admin.doc"));
add(new RegionCommand(plugin));
add(new RegionCommand(plugin, animationHandler));
}
}
Loading

0 comments on commit 437b606

Please sign in to comment.