Dieser Commit ist enthalten in:
Ursprung
c06c094d41
Commit
7a2f653928
@ -1,155 +0,0 @@
|
|||||||
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.Location;
|
|
||||||
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() || entityPlayer == null) {
|
|
||||||
replayRunnable.cancel();
|
|
||||||
replayRunnable = null;
|
|
||||||
if (entityServer != null) {
|
|
||||||
entityServer.close();
|
|
||||||
}
|
|
||||||
entityServer = null;
|
|
||||||
entityPlayer = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Location location = iterator.next().toLocation(player.getWorld());
|
|
||||||
if (player.getLocation().distanceSquared(location) < 25) {
|
|
||||||
location.add(0, 1000, 0);
|
|
||||||
}
|
|
||||||
entityPlayer.move(location);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
@ -26,7 +26,6 @@ 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_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 = "||||||||||||||||||||||||||||||";
|
||||||
|
|
||||||
@ -37,9 +36,6 @@ public class JumpAndRun extends BasicListener {
|
|||||||
private static final Map<Player, Long> START = new HashMap<>();
|
private static final Map<Player, Long> START = new HashMap<>();
|
||||||
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);
|
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);
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -83,11 +79,6 @@ public class JumpAndRun extends BasicListener {
|
|||||||
LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_PROGRESS", player, ChatMessageType.ACTION_BAR, index + 1, points.size(), FAILS.get(player), parsed.substring(0, parsed.length() - 2));
|
LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_PROGRESS", player, ChatMessageType.ACTION_BAR, index + 1, points.size(), FAILS.get(player), parsed.substring(0, parsed.length() - 2));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
toReset.forEach(player -> {
|
|
||||||
GHOSTS.get(player).stop();
|
|
||||||
reset(player);
|
|
||||||
player.teleport(Bukkit.getWorlds().get(0).getSpawnLocation().clone().add(0.5, 0, 0.5));
|
|
||||||
});
|
|
||||||
}, 1, 1);
|
}, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,35 +117,21 @@ 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) {
|
||||||
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);
|
String jumpAndRunTimeConfig = UserConfig.getConfig(player.getUniqueId(), JUMP_AND_RUN_CONFIG);
|
||||||
if (jumpAndRunTimeConfig == null) {
|
if (jumpAndRunTimeConfig == null) {
|
||||||
UserConfig.updatePlayerConfig(player.getUniqueId(), JUMP_AND_RUN_CONFIG, 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) {
|
||||||
@ -162,10 +139,6 @@ public class JumpAndRun extends BasicListener {
|
|||||||
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_CONFIG, time + "");
|
UserConfig.updatePlayerConfig(player.getUniqueId(), JUMP_AND_RUN_CONFIG, time + "");
|
||||||
if (needsSave) {
|
|
||||||
GHOSTS.get(player).saveBestTime();
|
|
||||||
GHOSTS.get(player).saveToDB();
|
|
||||||
}
|
|
||||||
LEADERBOARD.update();
|
LEADERBOARD.update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -174,7 +147,6 @@ public class JumpAndRun extends BasicListener {
|
|||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
GHOSTS.put(player, new GhostJumpAndRun(player));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
@ -185,7 +157,6 @@ public class JumpAndRun extends BasicListener {
|
|||||||
FAILS.remove(player);
|
FAILS.remove(player);
|
||||||
CLICKED.remove(player);
|
CLICKED.remove(player);
|
||||||
CLICKED_COUNT.remove(player);
|
CLICKED_COUNT.remove(player);
|
||||||
GHOSTS.remove(player);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren