Dieser Commit ist enthalten in:
Ursprung
9d5ff317ea
Commit
b466d7fbff
148
src/de/steamwar/lobby/jumpandrun/GhostJumpAndRun.java
Normale Datei
148
src/de/steamwar/lobby/jumpandrun/GhostJumpAndRun.java
Normale Datei
@ -0,0 +1,148 @@
|
|||||||
|
package de.steamwar.lobby.jumpandrun;
|
||||||
|
|
||||||
|
import de.steamwar.entity.REntityServer;
|
||||||
|
import de.steamwar.entity.RPlayer;
|
||||||
|
import de.steamwar.lobby.LobbySystem;
|
||||||
|
import de.steamwar.sql.UserConfig;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static de.steamwar.lobby.jumpandrun.JumpAndRun.JUMP_AND_RUN_REPLAY_CONFIG;
|
||||||
|
|
||||||
|
public class GhostJumpAndRun implements Listener {
|
||||||
|
|
||||||
|
private Player player;
|
||||||
|
|
||||||
|
private BukkitRunnable recordingRunnable;
|
||||||
|
private List<Vector> recordingList = new ArrayList<>();
|
||||||
|
|
||||||
|
private BukkitRunnable replayRunnable;
|
||||||
|
private List<Vector> replayList = new ArrayList<>();
|
||||||
|
private REntityServer entityServer;
|
||||||
|
private RPlayer entityPlayer;
|
||||||
|
|
||||||
|
public GhostJumpAndRun(Player player) {
|
||||||
|
this.player = player;
|
||||||
|
|
||||||
|
String s = UserConfig.getConfig(player.getUniqueId(), JUMP_AND_RUN_REPLAY_CONFIG);
|
||||||
|
if (s == null) return;
|
||||||
|
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(Base64.getDecoder().decode(s));
|
||||||
|
while (byteArrayInputStream.available() > 0) {
|
||||||
|
int x = byteArrayInputStream.read() << 24;
|
||||||
|
x |= byteArrayInputStream.read() << 16;
|
||||||
|
x |= byteArrayInputStream.read() << 8;
|
||||||
|
x |= byteArrayInputStream.read();
|
||||||
|
int y = byteArrayInputStream.read() << 24;
|
||||||
|
y |= byteArrayInputStream.read() << 16;
|
||||||
|
y |= byteArrayInputStream.read() << 8;
|
||||||
|
y |= byteArrayInputStream.read();
|
||||||
|
int z = byteArrayInputStream.read() << 24;
|
||||||
|
z |= byteArrayInputStream.read() << 16;
|
||||||
|
z |= byteArrayInputStream.read() << 8;
|
||||||
|
z |= byteArrayInputStream.read();
|
||||||
|
replayList.add(new Vector(Float.intBitsToFloat(x), Float.intBitsToFloat(y), Float.intBitsToFloat(z)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void record() {
|
||||||
|
if (recordingRunnable != null) return;
|
||||||
|
recordingList.clear();
|
||||||
|
recordingRunnable = new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
recordingList.add(player.getLocation().toVector());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
recordingRunnable.runTaskTimer(LobbySystem.getPlugin(), 1, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
if (recordingRunnable == null) return;
|
||||||
|
recordingRunnable.cancel();
|
||||||
|
recordingRunnable = null;
|
||||||
|
if (recordingRunnable != null) {
|
||||||
|
replayRunnable.cancel();
|
||||||
|
replayRunnable = null;
|
||||||
|
}
|
||||||
|
if (entityServer != null) {
|
||||||
|
entityServer.close();
|
||||||
|
entityServer = null;
|
||||||
|
entityPlayer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveBestTime() {
|
||||||
|
replayList = recordingList;
|
||||||
|
recordingList = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveToDB() {
|
||||||
|
if (replayList.size() > 4000) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
for (Vector vector : replayList) {
|
||||||
|
int x = Float.floatToIntBits((float) vector.getX());
|
||||||
|
int y = Float.floatToIntBits((float) vector.getY());
|
||||||
|
int z = Float.floatToIntBits((float) vector.getZ());
|
||||||
|
outputStream.write(x >> 24);
|
||||||
|
outputStream.write(x >> 16);
|
||||||
|
outputStream.write(x >> 8);
|
||||||
|
outputStream.write(x);
|
||||||
|
outputStream.write(y >> 24);
|
||||||
|
outputStream.write(y >> 16);
|
||||||
|
outputStream.write(y >> 8);
|
||||||
|
outputStream.write(y);
|
||||||
|
outputStream.write(z >> 24);
|
||||||
|
outputStream.write(z >> 16);
|
||||||
|
outputStream.write(z >> 8);
|
||||||
|
outputStream.write(z);
|
||||||
|
}
|
||||||
|
String replay = Base64.getEncoder().encodeToString(outputStream.toByteArray());
|
||||||
|
UserConfig.updatePlayerConfig(player.getUniqueId(), JUMP_AND_RUN_REPLAY_CONFIG, replay);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void replay() {
|
||||||
|
if (replayRunnable != null) return;
|
||||||
|
if (replayList.isEmpty()) return;
|
||||||
|
|
||||||
|
entityServer = new REntityServer();
|
||||||
|
entityServer.addPlayer(player);
|
||||||
|
entityPlayer = new RPlayer(entityServer, UUID.randomUUID(), "Ghost", player.getLocation());
|
||||||
|
entityPlayer.setGlowing(true);
|
||||||
|
entityPlayer.setInvisible(true);
|
||||||
|
|
||||||
|
Iterator<Vector> iterator = replayList.iterator();
|
||||||
|
replayRunnable = new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (!iterator.hasNext()) {
|
||||||
|
replayRunnable.cancel();
|
||||||
|
replayRunnable = null;
|
||||||
|
entityServer.close();
|
||||||
|
entityServer = null;
|
||||||
|
entityPlayer = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
entityPlayer.move(iterator.next().toLocation(player.getWorld()));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
replayRunnable.runTaskTimer(LobbySystem.getPlugin(), 1, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
|
if (event.getPlayer() != player) return;
|
||||||
|
if (entityServer != null) entityServer.close();
|
||||||
|
if (recordingRunnable != null) recordingRunnable.cancel();
|
||||||
|
if (replayRunnable != null) replayRunnable.cancel();
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,7 @@ package de.steamwar.lobby.jumpandrun;
|
|||||||
import de.steamwar.lobby.LobbySystem;
|
import de.steamwar.lobby.LobbySystem;
|
||||||
import de.steamwar.lobby.listener.BasicListener;
|
import de.steamwar.lobby.listener.BasicListener;
|
||||||
import de.steamwar.lobby.listener.PlayerSpawn;
|
import de.steamwar.lobby.listener.PlayerSpawn;
|
||||||
|
import de.steamwar.lobby.util.Leaderboard;
|
||||||
import de.steamwar.sql.UserConfig;
|
import de.steamwar.sql.UserConfig;
|
||||||
import net.md_5.bungee.api.ChatMessageType;
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@ -13,6 +14,7 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
@ -23,6 +25,9 @@ import java.util.*;
|
|||||||
|
|
||||||
public class JumpAndRun extends BasicListener {
|
public class JumpAndRun extends BasicListener {
|
||||||
|
|
||||||
|
public static final String JUMP_AND_RUN_CONFIG = "jump_and_run";
|
||||||
|
public static final String JUMP_AND_RUN_REPLAY_CONFIG = "jump_and_run_replay";
|
||||||
|
|
||||||
private static final String BAR_EMPTY = "||||||||||||||||||||||||||||||";
|
private static final String BAR_EMPTY = "||||||||||||||||||||||||||||||";
|
||||||
|
|
||||||
public static List<Vector> points = new ArrayList<>();
|
public static List<Vector> points = new ArrayList<>();
|
||||||
@ -33,6 +38,10 @@ public class JumpAndRun extends BasicListener {
|
|||||||
private static final Map<Player, Long> CLICKED = new HashMap<>();
|
private static final Map<Player, Long> CLICKED = new HashMap<>();
|
||||||
private static final Map<Player, Integer> CLICKED_COUNT = new HashMap<>();
|
private static final Map<Player, Integer> CLICKED_COUNT = new HashMap<>();
|
||||||
|
|
||||||
|
private static final Map<Player, GhostJumpAndRun> GHOSTS = new HashMap<>();
|
||||||
|
|
||||||
|
private static final Leaderboard LEADERBOARD = new Leaderboard(LobbySystem.getEntityServer(false), JUMP_AND_RUN_CONFIG, new Location(Bukkit.getWorlds().get(0), 2338.5, 42.5, 1231.5), 5);
|
||||||
|
|
||||||
{
|
{
|
||||||
Bukkit.getScheduler().runTaskTimer(LobbySystem.getPlugin(), () -> {
|
Bukkit.getScheduler().runTaskTimer(LobbySystem.getPlugin(), () -> {
|
||||||
Set<Player> toReset = new HashSet<>();
|
Set<Player> toReset = new HashSet<>();
|
||||||
@ -75,6 +84,7 @@ public class JumpAndRun extends BasicListener {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
toReset.forEach(player -> {
|
toReset.forEach(player -> {
|
||||||
|
GHOSTS.get(player).stop();
|
||||||
reset(player);
|
reset(player);
|
||||||
player.teleport(Bukkit.getWorlds().get(0).getSpawnLocation().clone().add(0.5, 0, 0.5));
|
player.teleport(Bukkit.getWorlds().get(0).getSpawnLocation().clone().add(0.5, 0, 0.5));
|
||||||
});
|
});
|
||||||
@ -116,40 +126,66 @@ public class JumpAndRun extends BasicListener {
|
|||||||
event.getPlayer().getInventory().setItem(4, new ItemStack(Material.COMPASS, 1));
|
event.getPlayer().getInventory().setItem(4, new ItemStack(Material.COMPASS, 1));
|
||||||
FAILS.put(event.getPlayer(), 0);
|
FAILS.put(event.getPlayer(), 0);
|
||||||
START.put(event.getPlayer(), System.currentTimeMillis());
|
START.put(event.getPlayer(), System.currentTimeMillis());
|
||||||
|
GHOSTS.get(event.getPlayer()).record();
|
||||||
|
GHOSTS.get(event.getPlayer()).replay();
|
||||||
}
|
}
|
||||||
if (index == points.size() - 1) {
|
if (index == points.size() - 1) {
|
||||||
long time = System.currentTimeMillis() - START.get(event.getPlayer());
|
long time = System.currentTimeMillis() - START.get(event.getPlayer());
|
||||||
SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", event.getPlayer()), Locale.ROOT);
|
SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", event.getPlayer()), Locale.ROOT);
|
||||||
String parsed = format.format(new Date(time));
|
String parsed = format.format(new Date(time));
|
||||||
LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_FINISHED", event.getPlayer(), parsed.substring(0, parsed.length() - 2), FAILS.get(event.getPlayer()));
|
LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_FINISHED", event.getPlayer(), parsed.substring(0, parsed.length() - 2), FAILS.get(event.getPlayer()));
|
||||||
|
GHOSTS.get(event.getPlayer()).stop();
|
||||||
updateJumpAndRunTime(event.getPlayer(), time);
|
updateJumpAndRunTime(event.getPlayer(), time);
|
||||||
reset(event.getPlayer());
|
reset(event.getPlayer());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateJumpAndRunTime(Player player, long time) {
|
private void updateJumpAndRunTime(Player player, long time) {
|
||||||
String jumpAndRunTimeConfig = UserConfig.getConfig(player.getUniqueId(), "jump_and_run");
|
boolean needsSave = true;
|
||||||
|
if (UserConfig.getConfig(player.getUniqueId(), JUMP_AND_RUN_REPLAY_CONFIG) == null) {
|
||||||
|
GHOSTS.get(player).saveBestTime();
|
||||||
|
GHOSTS.get(player).saveToDB();
|
||||||
|
needsSave = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String jumpAndRunTimeConfig = UserConfig.getConfig(player.getUniqueId(), JUMP_AND_RUN_CONFIG);
|
||||||
if (jumpAndRunTimeConfig == null) {
|
if (jumpAndRunTimeConfig == null) {
|
||||||
UserConfig.updatePlayerConfig(player.getUniqueId(), "jump_and_run", time + "");
|
UserConfig.updatePlayerConfig(player.getUniqueId(), JUMP_AND_RUN_CONFIG, time + "");
|
||||||
|
if (needsSave) {
|
||||||
|
GHOSTS.get(player).saveBestTime();
|
||||||
|
GHOSTS.get(player).saveToDB();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
long jumpAndRunTime = Long.parseLong(jumpAndRunTimeConfig);
|
long jumpAndRunTime = Long.parseLong(jumpAndRunTimeConfig);
|
||||||
if (time < jumpAndRunTime) {
|
if (time < jumpAndRunTime) {
|
||||||
SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", player), Locale.ROOT);
|
SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", player), Locale.ROOT);
|
||||||
String parsed = format.format(new Date(jumpAndRunTime - time));
|
String parsed = format.format(new Date(jumpAndRunTime - time));
|
||||||
LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_PERSONAL_BEST", player, parsed);
|
LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_PERSONAL_BEST", player, parsed);
|
||||||
UserConfig.updatePlayerConfig(player.getUniqueId(), "jump_and_run", time + "");
|
UserConfig.updatePlayerConfig(player.getUniqueId(), JUMP_AND_RUN_CONFIG, time + "");
|
||||||
|
if (needsSave) {
|
||||||
|
GHOSTS.get(player).saveBestTime();
|
||||||
|
GHOSTS.get(player).saveToDB();
|
||||||
|
}
|
||||||
|
LEADERBOARD.update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
GHOSTS.put(player, new GhostJumpAndRun(player));
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
CURRENT_POS.remove(player);
|
CURRENT_POS.remove(player);
|
||||||
START.remove(player);
|
START.remove(player);
|
||||||
FAILS.remove(player);
|
FAILS.remove(player);
|
||||||
CLICKED.remove(event.getPlayer());
|
CLICKED.remove(player);
|
||||||
CLICKED_COUNT.remove(event.getPlayer());
|
CLICKED_COUNT.remove(player);
|
||||||
|
GHOSTS.remove(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren