Adding Spectate ArenaMode + first classes
Signed-off-by: Lixfel <agga-games@gmx.de>
Dieser Commit ist enthalten in:
Ursprung
3bdc61fac8
Commit
ebfdaa783d
@ -29,7 +29,8 @@ public enum ArenaMode {
|
|||||||
EVENT,
|
EVENT,
|
||||||
TEST,
|
TEST,
|
||||||
CHECK,
|
CHECK,
|
||||||
PREPARE;
|
PREPARE,
|
||||||
|
SPECTATE;
|
||||||
|
|
||||||
public static final Set<ArenaMode> All = Collections.unmodifiableSet(EnumSet.allOf(ArenaMode.class));
|
public static final Set<ArenaMode> All = Collections.unmodifiableSet(EnumSet.allOf(ArenaMode.class));
|
||||||
|
|
||||||
@ -39,14 +40,15 @@ public enum ArenaMode {
|
|||||||
public static final Set<ArenaMode> Test = Collections.unmodifiableSet(EnumSet.of(TEST, CHECK));
|
public static final Set<ArenaMode> Test = Collections.unmodifiableSet(EnumSet.of(TEST, CHECK));
|
||||||
public static final Set<ArenaMode> Ranked = Collections.unmodifiableSet(EnumSet.of(RANKED));
|
public static final Set<ArenaMode> Ranked = Collections.unmodifiableSet(EnumSet.of(RANKED));
|
||||||
public static final Set<ArenaMode> Prepare = Collections.unmodifiableSet(EnumSet.of(PREPARE));
|
public static final Set<ArenaMode> Prepare = Collections.unmodifiableSet(EnumSet.of(PREPARE));
|
||||||
|
public static final Set<ArenaMode> Spectate = Collections.unmodifiableSet(EnumSet.of(SPECTATE));
|
||||||
|
|
||||||
|
public static final Set<ArenaMode> AntiSpectate = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(SPECTATE)));
|
||||||
public static final Set<ArenaMode> AntiTest = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(TEST, CHECK)));
|
public static final Set<ArenaMode> AntiTest = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(TEST, CHECK)));
|
||||||
public static final Set<ArenaMode> AntiEvent = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(EVENT)));
|
public static final Set<ArenaMode> AntiEvent = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(EVENT)));
|
||||||
public static final Set<ArenaMode> AntiPrepare = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(PREPARE)));
|
public static final Set<ArenaMode> AntiPrepare = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(PREPARE)));
|
||||||
public static final Set<ArenaMode> VariableTeams = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(RANKED, EVENT)));
|
public static final Set<ArenaMode> VariableTeams = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(RANKED, EVENT, SPECTATE)));
|
||||||
public static final Set<ArenaMode> RankedEvent = Collections.unmodifiableSet(EnumSet.of(RANKED, EVENT));
|
public static final Set<ArenaMode> RankedEvent = Collections.unmodifiableSet(EnumSet.of(RANKED, EVENT));
|
||||||
public static final Set<ArenaMode> Restartable = Collections.unmodifiableSet(EnumSet.of(NORMAL, RANKED));
|
public static final Set<ArenaMode> Restartable = Collections.unmodifiableSet(EnumSet.of(NORMAL, RANKED));
|
||||||
public static final Set<ArenaMode> Fight = Collections.unmodifiableSet(EnumSet.of(NORMAL, RANKED, EVENT));
|
|
||||||
public static final Set<ArenaMode> SoloLeader = Collections.unmodifiableSet(EnumSet.of(TEST, CHECK, PREPARE));
|
public static final Set<ArenaMode> SoloLeader = Collections.unmodifiableSet(EnumSet.of(TEST, CHECK, PREPARE));
|
||||||
public static final Set<ArenaMode> NotOnBau = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(TEST, CHECK, PREPARE)));
|
public static final Set<ArenaMode> NotOnBau = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(TEST, CHECK, PREPARE)));
|
||||||
}
|
}
|
||||||
|
@ -127,8 +127,8 @@ public class FightSystem extends JavaPlugin {
|
|||||||
new SkipCommand();
|
new SkipCommand();
|
||||||
new WinCommand();
|
new WinCommand();
|
||||||
|
|
||||||
new OneShotStateDependent(ArenaMode.All, FightState.PreRunning, () -> Bukkit.broadcastMessage(PREFIX + "§aDer Kampf beginnt!"));
|
new OneShotStateDependent(ArenaMode.AntiSpectate, FightState.PreRunning, () -> Bukkit.broadcastMessage(PREFIX + "§aDer Kampf beginnt!"));
|
||||||
new OneShotStateDependent(ArenaMode.All, FightState.Running, () -> Bukkit.broadcastMessage(PREFIX + "§aArena freigegeben!"));
|
new OneShotStateDependent(ArenaMode.AntiSpectate, FightState.Running, () -> Bukkit.broadcastMessage(PREFIX + "§aArena freigegeben!"));
|
||||||
new OneShotStateDependent(ArenaMode.AntiTest, FightState.Running, FightStatistics::start);
|
new OneShotStateDependent(ArenaMode.AntiTest, FightState.Running, FightStatistics::start);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -30,7 +30,7 @@ import org.bukkit.entity.Player;
|
|||||||
public class KitCommand implements CommandExecutor {
|
public class KitCommand implements CommandExecutor {
|
||||||
|
|
||||||
public KitCommand() {
|
public KitCommand() {
|
||||||
new StateDependentCommand(ArenaMode.All, FightState.Setup, "kit", this);
|
new StateDependentCommand(ArenaMode.AntiSpectate, FightState.Setup, "kit", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -30,7 +30,7 @@ import org.bukkit.entity.Player;
|
|||||||
public class LeaveCommand implements CommandExecutor {
|
public class LeaveCommand implements CommandExecutor {
|
||||||
|
|
||||||
public LeaveCommand() {
|
public LeaveCommand() {
|
||||||
new StateDependentCommand(ArenaMode.All, FightState.Setup, "leave", this);
|
new StateDependentCommand(ArenaMode.AntiSpectate, FightState.Setup, "leave", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -37,7 +37,7 @@ import org.bukkit.entity.Player;
|
|||||||
public class LockschemCommand implements CommandExecutor {
|
public class LockschemCommand implements CommandExecutor {
|
||||||
|
|
||||||
public LockschemCommand() {
|
public LockschemCommand() {
|
||||||
new StateDependentCommand(ArenaMode.All, FightState.All, "lockschem", this);
|
new StateDependentCommand(ArenaMode.AntiSpectate, FightState.All, "lockschem", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -34,8 +34,8 @@ public class NoPlayersOnlineCountdown extends Countdown implements Listener {
|
|||||||
public NoPlayersOnlineCountdown() {
|
public NoPlayersOnlineCountdown() {
|
||||||
super(Config.NoPlayerOnlineDuration, null, false);
|
super(Config.NoPlayerOnlineDuration, null, false);
|
||||||
|
|
||||||
new StateDependentListener(ArenaMode.All, FightState.PreLeaderSetup, this);
|
new StateDependentListener(ArenaMode.AntiSpectate, FightState.PreLeaderSetup, this);
|
||||||
new StateDependentCountdown(ArenaMode.All, FightState.PreLeaderSetup, this){
|
new StateDependentCountdown(ArenaMode.AntiSpectate, FightState.PreLeaderSetup, this){
|
||||||
@Override
|
@Override
|
||||||
public void enable() {
|
public void enable() {
|
||||||
if(Bukkit.getOnlinePlayers().isEmpty())
|
if(Bukkit.getOnlinePlayers().isEmpty())
|
||||||
|
@ -29,7 +29,7 @@ public class PreRunningCountdown extends Countdown {
|
|||||||
|
|
||||||
public PreRunningCountdown() {
|
public PreRunningCountdown() {
|
||||||
super(Config.PreFightDuration, SWSound.BLOCK_NOTE_PLING, true);
|
super(Config.PreFightDuration, SWSound.BLOCK_NOTE_PLING, true);
|
||||||
new StateDependentCountdown(ArenaMode.All, FightState.PreRunning, this);
|
new StateDependentCountdown(ArenaMode.AntiSpectate, FightState.PreRunning, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -29,7 +29,7 @@ public class PreSchemCountdown extends Countdown {
|
|||||||
|
|
||||||
public PreSchemCountdown() {
|
public PreSchemCountdown() {
|
||||||
super(Config.PreSchemPasteDuration, SWSound.BLOCK_NOTE_PLING, false);
|
super(Config.PreSchemPasteDuration, SWSound.BLOCK_NOTE_PLING, false);
|
||||||
new StateDependentCountdown(ArenaMode.All, FightState.PreSchemSetup, this);
|
new StateDependentCountdown(ArenaMode.AntiSpectate, FightState.PreSchemSetup, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -56,7 +56,7 @@ public class FightSchematic extends StateDependent {
|
|||||||
private int schematic = 0;
|
private int schematic = 0;
|
||||||
|
|
||||||
public FightSchematic(FightTeam team, boolean rotate) {
|
public FightSchematic(FightTeam team, boolean rotate) {
|
||||||
super(ArenaMode.All, FightState.PostSchemSetup);
|
super(ArenaMode.AntiSpectate, FightState.PostSchemSetup);
|
||||||
this.team = team;
|
this.team = team;
|
||||||
this.region = team.getSchemRegion();
|
this.region = team.getSchemRegion();
|
||||||
this.rotate = rotate;
|
this.rotate = rotate;
|
||||||
|
@ -394,7 +394,7 @@ public class FightTeam implements IFightTeam{
|
|||||||
|
|
||||||
private class KitLoader extends StateDependent {
|
private class KitLoader extends StateDependent {
|
||||||
private KitLoader() {
|
private KitLoader() {
|
||||||
super(ArenaMode.All, FightState.Ingame);
|
super(ArenaMode.AntiSpectate, FightState.Ingame);
|
||||||
register();
|
register();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -419,7 +419,7 @@ public class FightTeam implements IFightTeam{
|
|||||||
|
|
||||||
private class SpectateHandler extends StateDependent {
|
private class SpectateHandler extends StateDependent {
|
||||||
private SpectateHandler() {
|
private SpectateHandler() {
|
||||||
super(ArenaMode.All, FightState.Spectate);
|
super(ArenaMode.AntiSpectate, FightState.Spectate);
|
||||||
register();
|
register();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,8 +55,8 @@ public class FightScoreboard implements Listener, ScoreboardCallback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public FightScoreboard(){
|
public FightScoreboard(){
|
||||||
new StateDependentListener(ArenaMode.All, FightState.All, this);
|
new StateDependentListener(ArenaMode.AntiSpectate, FightState.All, this);
|
||||||
new StateDependentTask(ArenaMode.All, FightState.All, this::updateScoreboard, 0, 20);
|
new StateDependentTask(ArenaMode.AntiSpectate, FightState.All, this::updateScoreboard, 0, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
@ -35,7 +35,7 @@ import org.bukkit.inventory.meta.ItemMeta;
|
|||||||
public class HotbarGUI implements Listener {
|
public class HotbarGUI implements Listener {
|
||||||
|
|
||||||
public HotbarGUI() {
|
public HotbarGUI() {
|
||||||
new StateDependentListener(ArenaMode.All, FightState.Setup, this);
|
new StateDependentListener(ArenaMode.AntiSpectate, FightState.Setup, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
@ -36,7 +36,7 @@ import java.util.Objects;
|
|||||||
public class InFightDamage implements Listener {
|
public class InFightDamage implements Listener {
|
||||||
|
|
||||||
public InFightDamage() {
|
public InFightDamage() {
|
||||||
new StateDependentListener(ArenaMode.All, FightState.Running, this);
|
new StateDependentListener(ArenaMode.AntiSpectate, FightState.Running, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
@ -39,7 +39,7 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
public class InFightInventory implements Listener {
|
public class InFightInventory implements Listener {
|
||||||
|
|
||||||
public InFightInventory() {
|
public InFightInventory() {
|
||||||
new StateDependentListener(ArenaMode.All, FightState.Running, this);
|
new StateDependentListener(ArenaMode.AntiSpectate, FightState.Running, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
@ -40,7 +40,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
|
|||||||
public class IngameDeath implements Listener {
|
public class IngameDeath implements Listener {
|
||||||
|
|
||||||
public IngameDeath() {
|
public IngameDeath() {
|
||||||
new StateDependentListener(ArenaMode.All, FightState.Ingame, this);
|
new StateDependentListener(ArenaMode.AntiSpectate, FightState.Ingame, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH)
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
|
@ -32,7 +32,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
|
|||||||
public class SetupQuit implements Listener {
|
public class SetupQuit implements Listener {
|
||||||
|
|
||||||
public SetupQuit(){
|
public SetupQuit(){
|
||||||
new StateDependentListener(ArenaMode.All, FightState.Setup, this);
|
new StateDependentListener(ArenaMode.AntiSpectate, FightState.Setup, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
73
FightSystem_Main/src/de/steamwar/fightsystem/listener/Spectate.java
Normale Datei
73
FightSystem_Main/src/de/steamwar/fightsystem/listener/Spectate.java
Normale Datei
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
This file is a part of the SteamWar software.
|
||||||
|
|
||||||
|
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.fightsystem.listener;
|
||||||
|
|
||||||
|
import de.steamwar.fightsystem.ArenaMode;
|
||||||
|
import de.steamwar.fightsystem.states.FightState;
|
||||||
|
import de.steamwar.fightsystem.states.StateDependentListener;
|
||||||
|
import de.steamwar.sql.SteamwarUser;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.BlockExplodeEvent;
|
||||||
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.event.player.PlayerLoginEvent;
|
||||||
|
import org.bukkit.event.player.PlayerSwapHandItemsEvent;
|
||||||
|
|
||||||
|
public class Spectate implements Listener {
|
||||||
|
|
||||||
|
public Spectate(){
|
||||||
|
new StateDependentListener(ArenaMode.Spectate, FightState.All, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onLogin(PlayerLoginEvent e){
|
||||||
|
Player player = e.getPlayer();
|
||||||
|
|
||||||
|
if(InspectCommand.inspecting){
|
||||||
|
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
||||||
|
if(!SpectateSystem.allowedGroups.contains(user.getUserGroup())){
|
||||||
|
e.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, "§eSteam§8War» §cDerzeit ist das Zuschauen nicht gestattet.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPhysics(BlockPhysicsEvent event) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBlockExplosion(BlockExplodeEvent e){
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void handlePlayerSwapHandItemsEvent(PlayerSwapHandItemsEvent event) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
|
public void handlePlayerInteract(PlayerInteractEvent event) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
@ -35,7 +35,7 @@ public class WaterRemover implements Listener {
|
|||||||
private static final int MIN_Y = Config.BluePasteRegion.getMinY() + Config.WaterDepth;
|
private static final int MIN_Y = Config.BluePasteRegion.getMinY() + Config.WaterDepth;
|
||||||
|
|
||||||
public WaterRemover() {
|
public WaterRemover() {
|
||||||
new StateDependentListener(ArenaMode.All, FightState.Running, this);
|
new StateDependentListener(ArenaMode.AntiSpectate, FightState.Running, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
423
FightSystem_Main/src/de/steamwar/fightsystem/record/PacketProcessor.java
Normale Datei
423
FightSystem_Main/src/de/steamwar/fightsystem/record/PacketProcessor.java
Normale Datei
@ -0,0 +1,423 @@
|
|||||||
|
/*
|
||||||
|
This file is a part of the SteamWar software.
|
||||||
|
|
||||||
|
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.fightsystem.record;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.EditSession;
|
||||||
|
import de.steamwar.fightsystem.FightSystem;
|
||||||
|
import de.steamwar.sql.NoClipboardException;
|
||||||
|
import de.steamwar.sql.Schematic;
|
||||||
|
import de.steamwar.sql.SteamwarUser;
|
||||||
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
|
import net.md_5.bungee.api.chat.BaseComponent;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
import org.bukkit.*;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
|
import java.io.EOFException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
class PacketProcessor {
|
||||||
|
|
||||||
|
private static final World world = Bukkit.getWorlds().get(0);
|
||||||
|
private final Map<Byte, Integer> packetCounter = new HashMap<>();
|
||||||
|
|
||||||
|
private final PacketSource source;
|
||||||
|
private final BukkitTask task;
|
||||||
|
private final LinkedList<Runnable> syncList = new LinkedList<>();
|
||||||
|
|
||||||
|
|
||||||
|
public PacketProcessor(PacketSource source){
|
||||||
|
this.source = source;
|
||||||
|
if(source.async()) {
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(FightSystem.getPlugin(), this::process);
|
||||||
|
task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::runSync, 1, 1);
|
||||||
|
}else
|
||||||
|
task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::process, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runSync() {
|
||||||
|
synchronized (syncList) {
|
||||||
|
for(Runnable runnable : syncList) {
|
||||||
|
try{
|
||||||
|
runnable.run();
|
||||||
|
}catch (Exception e) {
|
||||||
|
Bukkit.getLogger().log(Level.WARNING, "Failed to execute packet", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
syncList.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void execSync(Runnable runnable){
|
||||||
|
if (!source.async()) {
|
||||||
|
runnable.run();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
synchronized (syncList) {
|
||||||
|
syncList.add(runnable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void playerJoins() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
int userId = source.rInt();
|
||||||
|
SteamwarUser user = SteamwarUser.get(userId);
|
||||||
|
if(user == null)
|
||||||
|
throw new IOException("Unknown user " + userId);
|
||||||
|
|
||||||
|
execSync(() -> new RPlayer(user.getUUID(), user.getUserName(), entityId));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void entityMoves() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
double locX = source.rDouble();
|
||||||
|
double locY = source.rDouble();
|
||||||
|
double locZ = source.rDouble();
|
||||||
|
float pitch = source.rFloat();
|
||||||
|
float yaw = source.rFloat();
|
||||||
|
byte headYaw = source.rByte();
|
||||||
|
|
||||||
|
execSync(() -> REntity.getEntity(entityId).move(locX, locY, locZ, yaw, pitch, headYaw));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void entityDespawns() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
|
||||||
|
execSync(() -> REntity.getEntity(entityId).remove());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void entitySneak() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
boolean sneaking = source.rBoolean();
|
||||||
|
|
||||||
|
execSync(() -> REntity.getEntity(entityId).sneak(sneaking));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void entityAnimation() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
byte animation = source.rByte();
|
||||||
|
|
||||||
|
execSync(() -> REntity.getEntity(entityId).animation(animation));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tntSpawn() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
|
||||||
|
execSync(() -> new RTnT(entityId));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void entityVelocity() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
|
||||||
|
double dX = source.rDouble();
|
||||||
|
double dY = source.rDouble();
|
||||||
|
double dZ = source.rDouble();
|
||||||
|
|
||||||
|
execSync(() -> {
|
||||||
|
REntity entity = REntity.getEntity(entityId);
|
||||||
|
if(entity != null)
|
||||||
|
entity.setMotion(dX, dY, dZ);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void playerItem() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
String item = source.rString();
|
||||||
|
boolean enchanted = source.rBoolean();
|
||||||
|
String slot = source.rString();
|
||||||
|
|
||||||
|
execSync(() -> ((RPlayer)REntity.getEntity(entityId)).setItem(item, enchanted, slot));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void arrowSpawn() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
|
||||||
|
execSync(() -> new RArrow(entityId));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fireballSpawn() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
|
||||||
|
execSync(() -> new RFireball(entityId));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void send(ChatMessageType type) throws IOException {
|
||||||
|
String message = source.rString();
|
||||||
|
|
||||||
|
BaseComponent[] text = TextComponent.fromLegacyText(message);
|
||||||
|
Bukkit.getOnlinePlayers().forEach(p -> p.spigot().sendMessage(type, text));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void shortBlock() throws IOException {
|
||||||
|
int x = Byte.toUnsignedInt(source.rByte()) + Config.ArenaMinX;
|
||||||
|
int y = Byte.toUnsignedInt(source.rByte());
|
||||||
|
int z = Byte.toUnsignedInt(source.rByte()) + Config.ArenaMinZ;
|
||||||
|
int blockState = source.rShort();
|
||||||
|
|
||||||
|
setBlock(x, y, z, blockState);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void block() throws IOException {
|
||||||
|
int x = source.rInt();
|
||||||
|
int y = Byte.toUnsignedInt(source.rByte());
|
||||||
|
int z = source.rInt();
|
||||||
|
int blockState = source.rInt();
|
||||||
|
|
||||||
|
setBlock(x, y, z, blockState);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setBlock(int x, int y, int z, int blockState){
|
||||||
|
if(Config.ArenaMinX > x || Config.ArenaMaxX < x || Config.ArenaMinZ > z || Config.ArenaMaxZ < z)
|
||||||
|
return; //Outside of the arena
|
||||||
|
|
||||||
|
if (!InspectCommand.inspecting && Config.TechhiderActive && Config.HiddenBlocks.contains(blockState)) {
|
||||||
|
blockState = Config.ObfuscateWith;
|
||||||
|
}
|
||||||
|
IBlockData blockData = Objects.requireNonNull(Block.REGISTRY_ID.fromId(blockState));
|
||||||
|
execSync(() -> {
|
||||||
|
WorldServer cworld = ((CraftWorld)world).getHandle();
|
||||||
|
BlockPosition pos = new BlockPosition(x, y, z);
|
||||||
|
cworld.removeTileEntity(pos);
|
||||||
|
cworld.setTypeAndData(pos, blockData, 1042);
|
||||||
|
cworld.getChunkProvider().flagDirty(pos);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void particle() throws IOException {
|
||||||
|
double x = source.rDouble();
|
||||||
|
double y = source.rDouble();
|
||||||
|
double z = source.rDouble();
|
||||||
|
|
||||||
|
String particleName = source.rString();
|
||||||
|
|
||||||
|
execSync(() -> world.spawnParticle(Particle.valueOf(particleName), x, y, z, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sound() throws IOException {
|
||||||
|
int x = source.rInt();
|
||||||
|
int y = source.rInt();
|
||||||
|
int z = source.rInt();
|
||||||
|
|
||||||
|
String soundName = source.rString();
|
||||||
|
String soundCategory = source.rString();
|
||||||
|
|
||||||
|
float volume = source.rFloat();
|
||||||
|
float pitch = source.rFloat();
|
||||||
|
|
||||||
|
Sound sound = Sound.valueOf(soundName);
|
||||||
|
SoundCategory sCategory = SoundCategory.valueOf(soundCategory);
|
||||||
|
|
||||||
|
execSync(() -> world.playSound(new Location(world, x, y, z), sound, sCategory, volume, pitch));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void soundAtPlayer() throws IOException {
|
||||||
|
String soundName = source.rString();
|
||||||
|
|
||||||
|
float volume = source.rFloat();
|
||||||
|
float pitch = source.rFloat();
|
||||||
|
|
||||||
|
Sound sound = Sound.valueOf(soundName);
|
||||||
|
|
||||||
|
execSync(() -> {
|
||||||
|
for(Player player : Bukkit.getOnlinePlayers()){
|
||||||
|
player.playSound(player.getLocation(), sound, volume, pitch);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pasteSchem(int pasteX, int cornerY, int pasteZ, int cornerX, int cornerZ, boolean rotate, String prefix) throws IOException {
|
||||||
|
int schemId = source.rInt();
|
||||||
|
|
||||||
|
Schematic schem = Schematic.getSchemFromDB(schemId);
|
||||||
|
DyeColor c = ColorConverter.chat2dye(ChatColor.getByChar(ChatColor.getLastColors(prefix).replace("§", "")));
|
||||||
|
execSync(() -> {
|
||||||
|
try {
|
||||||
|
EditSession e = Paster.pasteSchematic(schem, pasteX, cornerY, pasteZ, rotate);
|
||||||
|
Paster.replaceTeamColor(e, c, cornerX, cornerY, cornerZ);
|
||||||
|
} catch (NoClipboardException | IOException e) {
|
||||||
|
throw new SecurityException("Could not load Clipboard", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void teams() throws IOException {
|
||||||
|
int blueId = source.rInt();
|
||||||
|
int redId = source.rInt();
|
||||||
|
|
||||||
|
execSync(() -> BlockTextCreator.pasteTeamNames(blueId, redId));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scoreboardTitle() throws IOException {
|
||||||
|
String title = source.rString();
|
||||||
|
|
||||||
|
SpectateSystem.getScoreboard().setTitle(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scoreboardData() throws IOException {
|
||||||
|
String key = source.rString();
|
||||||
|
int value = source.rInt();
|
||||||
|
|
||||||
|
SpectateSystem.getScoreboard().addValue(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void endSpectating(){
|
||||||
|
WorldLoader.reloadWorld();
|
||||||
|
SpectateSystem.getScoreboard().setTitle("§eKein Kampf");
|
||||||
|
|
||||||
|
for(Map.Entry<Byte, Integer> entry : packetCounter.entrySet()){
|
||||||
|
System.out.println(Integer.toHexString(entry.getKey()) + " " + entry.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
packetCounter.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void bow() {
|
||||||
|
//TODO implement Bow
|
||||||
|
}
|
||||||
|
|
||||||
|
private void damage() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
|
||||||
|
execSync(() -> REntity.getEntity(entityId).damage());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fireTick() throws IOException {
|
||||||
|
int entityId = source.rInt();
|
||||||
|
|
||||||
|
execSync(() -> REntity.getEntity(entityId).setOnFire());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void process(){
|
||||||
|
|
||||||
|
try{
|
||||||
|
boolean tickFinished = false;
|
||||||
|
while(!source.isClosed() && !tickFinished){
|
||||||
|
byte packetType = source.rByte();
|
||||||
|
packetCounter.compute(packetType, (key, value) -> value != null ? value + 1 : 1);
|
||||||
|
switch(packetType){
|
||||||
|
case 0x00:
|
||||||
|
playerJoins();
|
||||||
|
break;
|
||||||
|
case 0x01:
|
||||||
|
entityMoves();
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
entityDespawns();
|
||||||
|
break;
|
||||||
|
case 0x03:
|
||||||
|
entitySneak();
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
entityAnimation();
|
||||||
|
break;
|
||||||
|
case 0x05:
|
||||||
|
tntSpawn();
|
||||||
|
break;
|
||||||
|
case 0x06:
|
||||||
|
entityVelocity();
|
||||||
|
break;
|
||||||
|
case 0x07:
|
||||||
|
playerItem();
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
arrowSpawn();
|
||||||
|
break;
|
||||||
|
case 0x09:
|
||||||
|
fireballSpawn();
|
||||||
|
break;
|
||||||
|
case 0x0A:
|
||||||
|
case 0x0B:
|
||||||
|
damage();
|
||||||
|
case 0x0C:
|
||||||
|
fireTick();
|
||||||
|
case 0x30:
|
||||||
|
block();
|
||||||
|
break;
|
||||||
|
case 0x31:
|
||||||
|
particle();
|
||||||
|
break;
|
||||||
|
case 0x32:
|
||||||
|
sound();
|
||||||
|
break;
|
||||||
|
case 0x33:
|
||||||
|
shortBlock();
|
||||||
|
break;
|
||||||
|
case 0x34:
|
||||||
|
soundAtPlayer();
|
||||||
|
break;
|
||||||
|
case (byte) 0xA0:
|
||||||
|
send(ChatMessageType.CHAT);
|
||||||
|
break;
|
||||||
|
case (byte) 0xA1:
|
||||||
|
send(ChatMessageType.ACTION_BAR);
|
||||||
|
break;
|
||||||
|
case (byte) 0xA2:
|
||||||
|
send(ChatMessageType.SYSTEM);
|
||||||
|
break;
|
||||||
|
case (byte) 0xB0:
|
||||||
|
pasteSchem(Config.TeamBluePasteX, Config.TeamBlueCornerY, Config.TeamBluePasteZ, Config.TeamBlueCornerX, Config.TeamBlueCornerZ, Config.TeamBlueRotate, Config.TeamBluePrefix);
|
||||||
|
break;
|
||||||
|
case (byte) 0xB1:
|
||||||
|
pasteSchem(Config.TeamRedPasteX, Config.TeamRedCornerY, Config.TeamRedPasteZ, Config.TeamRedCornerX, Config.TeamRedCornerZ, Config.TeamRedRotate, Config.TeamRedPrefix);
|
||||||
|
break;
|
||||||
|
case (byte) 0xB2:
|
||||||
|
teams();
|
||||||
|
break;
|
||||||
|
case (byte) 0xC0:
|
||||||
|
scoreboardTitle();
|
||||||
|
break;
|
||||||
|
case (byte) 0xC1:
|
||||||
|
scoreboardData();
|
||||||
|
break;
|
||||||
|
case (byte) 0xEF:
|
||||||
|
// Comment
|
||||||
|
source.rString();
|
||||||
|
break;
|
||||||
|
case (byte) 0xFF:
|
||||||
|
//Tick
|
||||||
|
if(!source.async())
|
||||||
|
tickFinished = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Bukkit.getLogger().log(Level.SEVERE, "Unknown packet recieved, closing: " + packetType);
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (EOFException e) {
|
||||||
|
Bukkit.getLogger().log(Level.INFO, "The FightServer is offline");
|
||||||
|
source.close();
|
||||||
|
} catch(IOException e){
|
||||||
|
Bukkit.getLogger().log(Level.WARNING, "Could not recieve packet", e);
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(source.isClosed()){
|
||||||
|
Bukkit.getScheduler().runTask(FightSystem.getPlugin(), this::endSpectating);
|
||||||
|
task.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
This file is a part of the SteamWar software.
|
||||||
|
|
||||||
|
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.fightsystem.record;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
public abstract class PacketSource {
|
||||||
|
|
||||||
|
protected final DataInputStream inputStream;
|
||||||
|
|
||||||
|
protected PacketSource(DataInputStream inputStream){
|
||||||
|
this.inputStream = inputStream;
|
||||||
|
new PacketProcessor(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte rByte() throws IOException {
|
||||||
|
return inputStream.readByte();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean rBoolean() throws IOException {
|
||||||
|
return inputStream.readBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
|
public short rShort() throws IOException {
|
||||||
|
return inputStream.readShort();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int rInt() throws IOException {
|
||||||
|
return inputStream.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long rLong() throws IOException {
|
||||||
|
return inputStream.readLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
public float rFloat() throws IOException {
|
||||||
|
return inputStream.readFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double rDouble() throws IOException {
|
||||||
|
return inputStream.readDouble();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String rString() throws IOException {
|
||||||
|
return inputStream.readUTF();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close(){
|
||||||
|
try {
|
||||||
|
inputStream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Bukkit.getLogger().log(Level.SEVERE, "IOException on close", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract boolean isClosed();
|
||||||
|
abstract boolean async();
|
||||||
|
}
|
In neuem Issue referenzieren
Einen Benutzer sperren