Omni-Replay #280
@ -63,7 +63,7 @@ public class Config {
|
|||||||
|
|
||||||
private static final int BlueToRedX;
|
private static final int BlueToRedX;
|
||||||
private static final int BlueToRedY;
|
private static final int BlueToRedY;
|
||||||
public static final int BlueToRedZ;
|
private static final int BlueToRedZ;
|
||||||
|
|
||||||
public static final int PreperationArea;
|
public static final int PreperationArea;
|
||||||
public static final int WaterDepth;
|
public static final int WaterDepth;
|
||||||
@ -390,4 +390,7 @@ public class Config {
|
|||||||
public static boolean replayserver(){
|
public static boolean replayserver(){
|
||||||
return ReplayID == -1;
|
return ReplayID == -1;
|
||||||
}
|
}
|
||||||
|
public static boolean blueNegZ(){
|
||||||
|
return BlueToRedZ > 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,6 +85,11 @@ public class FightSchematic extends StateDependent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSchematic(int schemId, Clipboard clipboard) {
|
||||||
|
this.schematic = schemId;
|
||||||
|
this.clipboard = clipboard;
|
||||||
|
}
|
||||||
|
|
||||||
public void reset(){
|
public void reset(){
|
||||||
schematic = 0;
|
schematic = 0;
|
||||||
clipboard = null;
|
clipboard = null;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.fightsystem.fight;
|
package de.steamwar.fightsystem.fight;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||||
import de.steamwar.comms.packets.TablistNamePacket;
|
import de.steamwar.comms.packets.TablistNamePacket;
|
||||||
import de.steamwar.core.VersionedRunnable;
|
import de.steamwar.core.VersionedRunnable;
|
||||||
import de.steamwar.fightsystem.ArenaMode;
|
import de.steamwar.fightsystem.ArenaMode;
|
||||||
@ -299,7 +300,15 @@ public class FightTeam implements IFightTeam{
|
|||||||
|
|
||||||
public void pasteSchem(Schematic schematic){
|
public void pasteSchem(Schematic schematic){
|
||||||
setSchem(schematic);
|
setSchem(schematic);
|
||||||
|
testPasteAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pasteSchem(int schemId, Clipboard clipboard){
|
||||||
|
this.schematic.setSchematic(schemId, clipboard);
|
||||||
|
testPasteAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testPasteAction(){
|
||||||
if(Config.test())
|
if(Config.test())
|
||||||
this.schematic.enable();
|
this.schematic.enable();
|
||||||
else if(Fight.getOpposite(this).hasSchematic()){
|
else if(Fight.getOpposite(this).hasSchematic()){
|
||||||
|
@ -46,13 +46,13 @@ public class FileSource extends PacketSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public FileSource(File fightFile) throws IOException {
|
public FileSource(File fightFile) throws IOException {
|
||||||
super(new DataInputStream(new GZIPInputStream(new FileInputStream(fightFile))));
|
super(new GZIPInputStream(new FileInputStream(fightFile)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
boolean isClosed() {
|
boolean isClosed() {
|
||||||
try{
|
try{
|
||||||
return inputStream.available() == 0;
|
return available() == 0;
|
||||||
}catch (IOException e){
|
}catch (IOException e){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,6 @@ package de.steamwar.fightsystem.record;
|
|||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
@ -30,7 +29,7 @@ public class LiveSource extends PacketSource {
|
|||||||
private final Socket socket;
|
private final Socket socket;
|
||||||
|
|
||||||
protected LiveSource(Socket socket) throws IOException {
|
protected LiveSource(Socket socket) throws IOException {
|
||||||
super(new DataInputStream(socket.getInputStream()));
|
super(socket.getInputStream());
|
||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
package de.steamwar.fightsystem.record;
|
package de.steamwar.fightsystem.record;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||||
|
import de.steamwar.core.Core;
|
||||||
import de.steamwar.core.VersionedRunnable;
|
import de.steamwar.core.VersionedRunnable;
|
||||||
import de.steamwar.fightsystem.ArenaMode;
|
import de.steamwar.fightsystem.ArenaMode;
|
||||||
import de.steamwar.fightsystem.Config;
|
import de.steamwar.fightsystem.Config;
|
||||||
@ -55,6 +57,8 @@ public class PacketProcessor {
|
|||||||
|
|
||||||
private static final World world = Bukkit.getWorlds().get(0);
|
private static final World world = Bukkit.getWorlds().get(0);
|
||||||
|
|
||||||
|
private final PacketParser[] packetDecoder = new PacketParser[256];
|
||||||
|
|
||||||
private final PacketSource source;
|
private final PacketSource source;
|
||||||
private final BukkitTask task;
|
private final BukkitTask task;
|
||||||
private final LinkedList<Runnable> syncList = new LinkedList<>();
|
private final LinkedList<Runnable> syncList = new LinkedList<>();
|
||||||
@ -62,10 +66,50 @@ public class PacketProcessor {
|
|||||||
private final int obfuscateWith = TechHider.getObfuscateWith();
|
private final int obfuscateWith = TechHider.getObfuscateWith();
|
||||||
private final FreezeWorld freezer = new FreezeWorld();
|
private final FreezeWorld freezer = new FreezeWorld();
|
||||||
|
|
||||||
|
private boolean rotateZ = false;
|
||||||
|
private int arenaMinX = Config.ArenaRegion.getMinX();
|
||||||
|
private int arenaMinY = Config.BluePasteRegion.getMinY();
|
||||||
|
private int arenaMinZ = Config.ArenaRegion.getMinZ();
|
||||||
|
|
||||||
|
private boolean tickFinished = false;
|
||||||
|
|
||||||
public PacketProcessor(PacketSource source){
|
public PacketProcessor(PacketSource source){
|
||||||
this.source = source;
|
this.source = source;
|
||||||
replaying = true;
|
replaying = true;
|
||||||
|
|
||||||
|
packetDecoder[0x00] = this::playerJoins;
|
||||||
|
packetDecoder[0x01] = this::entityMoves;
|
||||||
|
packetDecoder[0x02] = this::entityDespawns;
|
||||||
|
packetDecoder[0x03] = this::entitySneak;
|
||||||
|
packetDecoder[0x04] = this::entityAnimation;
|
||||||
|
packetDecoder[0x05] = this::tntSpawn;
|
||||||
|
packetDecoder[0x06] = this::entityVelocity;
|
||||||
|
packetDecoder[0x07] = this::playerItem;
|
||||||
|
packetDecoder[0x08] = this::arrowSpawn;
|
||||||
|
packetDecoder[0x09] = this::fireballSpawn;
|
||||||
|
packetDecoder[0x0a] = this::bow;
|
||||||
|
packetDecoder[0x0b] = this::damage;
|
||||||
|
packetDecoder[0x0c] = this::fireTick;
|
||||||
|
packetDecoder[0x20] = this::arenaInfo;
|
||||||
|
packetDecoder[0x30] = this::block;
|
||||||
|
packetDecoder[0x31] = this::particle;
|
||||||
|
packetDecoder[0x32] = this::sound;
|
||||||
|
packetDecoder[0x33] = this::shortBlock;
|
||||||
|
packetDecoder[0x34] = this::soundAtPlayer;
|
||||||
|
packetDecoder[0x35] = this::shortRelativeBlock;
|
||||||
|
packetDecoder[0xa0] = () -> send(ChatMessageType.CHAT);
|
||||||
|
packetDecoder[0xa1] = () -> send(ChatMessageType.ACTION_BAR);
|
||||||
|
packetDecoder[0xa2] = () -> send(ChatMessageType.SYSTEM);
|
||||||
|
packetDecoder[0xb0] = () -> pasteSchem(Fight.getBlueTeam());
|
||||||
|
packetDecoder[0xb1] = () -> pasteSchem(Fight.getRedTeam());
|
||||||
|
packetDecoder[0xb2] = this::teams;
|
||||||
|
packetDecoder[0xb3] = () -> pasteEmbeddedSchem(Fight.getBlueTeam());
|
||||||
|
packetDecoder[0xb4] = () -> pasteEmbeddedSchem(Fight.getRedTeam());
|
||||||
|
packetDecoder[0xc0] = this::scoreboardTitle;
|
||||||
|
packetDecoder[0xc1] = this::scoreboardData;
|
||||||
|
packetDecoder[0xef] = source::readUTF;
|
||||||
|
packetDecoder[0xff] = this::tick;
|
||||||
|
|
||||||
if(source.async()) {
|
if(source.async()) {
|
||||||
Bukkit.getScheduler().runTaskAsynchronously(FightSystem.getPlugin(), this::process);
|
Bukkit.getScheduler().runTaskAsynchronously(FightSystem.getPlugin(), this::process);
|
||||||
task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::runSync, 1, 1);
|
task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::runSync, 1, 1);
|
||||||
@ -98,56 +142,59 @@ public class PacketProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void playerJoins() throws IOException {
|
private void playerJoins() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
int userId = source.rInt();
|
int userId = source.readInt();
|
||||||
|
|
||||||
execSync(() -> new REntity(entityId, userId));
|
execSync(() -> new REntity(entityId, userId));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void entityMoves() throws IOException {
|
private void entityMoves() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
double locX = source.rDouble();
|
double locX = source.readDouble() - arenaMinX + Config.ArenaRegion.getMinX();
|
||||||
double locY = source.rDouble();
|
double locY = source.readDouble() - arenaMinY + Config.BluePasteRegion.getMinY();
|
||||||
double locZ = source.rDouble();
|
double z = source.readDouble() - arenaMinZ;
|
||||||
float pitch = source.rFloat();
|
if(rotateZ)
|
||||||
float yaw = source.rFloat();
|
z = Config.ArenaRegion.getSizeZ() - z;
|
||||||
byte headYaw = source.rByte();
|
double locZ = z + Config.ArenaRegion.getMinZ();
|
||||||
|
float pitch = source.readFloat();
|
||||||
|
float yaw = source.readFloat() + (rotateZ ? 360 : 0);
|
||||||
|
byte headYaw = (byte)((source.readByte() + (rotateZ ? 128 : 0)) % 256);
|
||||||
|
|
||||||
execSync(() -> REntity.getEntity(entityId).move(locX, locY, locZ, pitch, yaw, headYaw));
|
execSync(() -> REntity.getEntity(entityId).move(locX, locY, locZ, pitch, yaw, headYaw));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void entityDespawns() throws IOException {
|
private void entityDespawns() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
|
|
||||||
execSync(() -> REntity.getEntity(entityId).die());
|
execSync(() -> REntity.getEntity(entityId).die());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void entitySneak() throws IOException {
|
private void entitySneak() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
boolean sneaking = source.rBoolean();
|
boolean sneaking = source.readBoolean();
|
||||||
|
|
||||||
execSync(() -> REntity.getEntity(entityId).sneak(sneaking));
|
execSync(() -> REntity.getEntity(entityId).sneak(sneaking));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void entityAnimation() throws IOException {
|
private void entityAnimation() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
byte animation = source.rByte();
|
byte animation = source.readByte();
|
||||||
|
|
||||||
execSync(() -> REntity.getEntity(entityId).animation(animation));
|
execSync(() -> REntity.getEntity(entityId).animation(animation));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tntSpawn() throws IOException {
|
private void tntSpawn() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
|
|
||||||
execSync(() -> new REntity(entityId, EntityType.PRIMED_TNT));
|
execSync(() -> new REntity(entityId, EntityType.PRIMED_TNT));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void entityVelocity() throws IOException {
|
private void entityVelocity() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
|
|
||||||
double dX = source.rDouble();
|
double dX = source.readDouble();
|
||||||
double dY = source.rDouble();
|
double dY = source.readDouble();
|
||||||
double dZ = source.rDouble();
|
double dZ = rotateZ ? -source.readDouble() : source.readDouble();
|
||||||
|
|
||||||
execSync(() -> {
|
execSync(() -> {
|
||||||
REntity entity = REntity.getEntity(entityId);
|
REntity entity = REntity.getEntity(entityId);
|
||||||
@ -157,49 +204,71 @@ public class PacketProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void playerItem() throws IOException {
|
private void playerItem() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
String item = source.rString();
|
String item = source.readUTF();
|
||||||
boolean enchanted = source.rBoolean();
|
boolean enchanted = source.readBoolean();
|
||||||
String slot = source.rString();
|
String slot = source.readUTF();
|
||||||
|
|
||||||
execSync(() -> REntity.getEntity(entityId).setItem(item, enchanted, slot));
|
execSync(() -> REntity.getEntity(entityId).setItem(item, enchanted, slot));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void arrowSpawn() throws IOException {
|
private void arrowSpawn() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
|
|
||||||
execSync(() -> new REntity(entityId, EntityType.ARROW));
|
execSync(() -> new REntity(entityId, EntityType.ARROW));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void fireballSpawn() throws IOException {
|
private void fireballSpawn() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
|
|
||||||
execSync(() -> new REntity(entityId, EntityType.FIREBALL));
|
execSync(() -> new REntity(entityId, EntityType.FIREBALL));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void send(ChatMessageType type) throws IOException {
|
private void send(ChatMessageType type) throws IOException {
|
||||||
String message = source.rString();
|
String message = source.readUTF();
|
||||||
|
|
||||||
BaseComponent[] text = TextComponent.fromLegacyText(message);
|
BaseComponent[] text = TextComponent.fromLegacyText(message);
|
||||||
Bukkit.getOnlinePlayers().forEach(p -> p.spigot().sendMessage(type, text));
|
Bukkit.getOnlinePlayers().forEach(p -> p.spigot().sendMessage(type, text));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void arenaInfo() throws IOException {
|
||||||
|
rotateZ = source.readBoolean() != Config.blueNegZ();
|
||||||
|
arenaMinY = Byte.toUnsignedInt(source.readByte());
|
||||||
|
arenaMinX = source.readInt();
|
||||||
|
arenaMinZ = source.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
private void shortBlock() throws IOException {
|
private void shortBlock() throws IOException {
|
||||||
int x = Byte.toUnsignedInt(source.rByte()) + Config.ArenaRegion.getMinX();
|
int x = Byte.toUnsignedInt(source.readByte()) + Config.ArenaRegion.getMinX();
|
||||||
int y = Byte.toUnsignedInt(source.rByte());
|
int y = Byte.toUnsignedInt(source.readByte());
|
||||||
int z = Byte.toUnsignedInt(source.rByte()) + Config.ArenaRegion.getMinZ();
|
int z = Byte.toUnsignedInt(source.readByte()) + Config.ArenaRegion.getMinZ();
|
||||||
int blockState = source.rShort();
|
int blockState = source.readShort();
|
||||||
|
|
||||||
setBlock(x, y, z, blockState);
|
setBlock(x, y, z, blockState);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void block() throws IOException {
|
private void shortRelativeBlock() throws IOException {
|
||||||
int x = source.rInt();
|
int x = Byte.toUnsignedInt(source.readByte());
|
||||||
int y = Byte.toUnsignedInt(source.rByte());
|
int y = Byte.toUnsignedInt(source.readByte());
|
||||||
int z = source.rInt();
|
int z = Byte.toUnsignedInt(source.readByte());
|
||||||
int blockState = source.rInt();
|
int blockState = source.readShort();
|
||||||
|
|
||||||
setBlock(x, y, z, blockState);
|
if(rotateZ)
|
||||||
|
z = Config.ArenaRegion.getSizeZ() - z;
|
||||||
|
|
||||||
|
setBlock(x + Config.ArenaRegion.getMinX(), y + Config.BluePasteRegion.getMinY(), z + Config.ArenaRegion.getMinZ(), blockState);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void block() throws IOException {
|
||||||
|
int x = source.readInt() - arenaMinX;
|
||||||
|
int y = Byte.toUnsignedInt(source.readByte()) - arenaMinY;
|
||||||
|
int z = source.readInt() - arenaMinZ;
|
||||||
|
int blockState = source.readInt();
|
||||||
|
|
||||||
|
if(rotateZ)
|
||||||
|
z = Config.ArenaRegion.getSizeZ() - z;
|
||||||
|
|
||||||
|
setBlock(x + Config.ArenaRegion.getMinX(), y + Config.BluePasteRegion.getMinY(), z + Config.ArenaRegion.getMinZ(), blockState);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setBlock(int x, int y, int z, int blockState){
|
private void setBlock(int x, int y, int z, int blockState){
|
||||||
@ -210,25 +279,25 @@ public class PacketProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void particle() throws IOException {
|
private void particle() throws IOException {
|
||||||
double x = source.rDouble();
|
double x = source.readDouble();
|
||||||
double y = source.rDouble();
|
double y = source.readDouble();
|
||||||
double z = source.rDouble();
|
double z = source.readDouble();
|
||||||
|
|
||||||
String particleName = source.rString();
|
String particleName = source.readUTF();
|
||||||
|
|
||||||
execSync(() -> world.spawnParticle(Particle.valueOf(particleName), x, y, z, 1));
|
execSync(() -> world.spawnParticle(Particle.valueOf(particleName), x, y, z, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sound() throws IOException {
|
private void sound() throws IOException {
|
||||||
int x = source.rInt();
|
int x = source.readInt();
|
||||||
int y = source.rInt();
|
int y = source.readInt();
|
||||||
int z = source.rInt();
|
int z = source.readInt();
|
||||||
|
|
||||||
String soundName = source.rString();
|
String soundName = source.readUTF();
|
||||||
String soundCategory = source.rString();
|
String soundCategory = source.readUTF();
|
||||||
|
|
||||||
float volume = source.rFloat();
|
float volume = source.readFloat();
|
||||||
float pitch = source.rFloat();
|
float pitch = source.readFloat();
|
||||||
|
|
||||||
Sound sound = Sound.valueOf(soundName);
|
Sound sound = Sound.valueOf(soundName);
|
||||||
SoundCategory sCategory = SoundCategory.valueOf(soundCategory);
|
SoundCategory sCategory = SoundCategory.valueOf(soundCategory);
|
||||||
@ -237,10 +306,10 @@ public class PacketProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void soundAtPlayer() throws IOException {
|
private void soundAtPlayer() throws IOException {
|
||||||
String soundName = source.rString();
|
String soundName = source.readUTF();
|
||||||
|
|
||||||
float volume = source.rFloat();
|
float volume = source.readFloat();
|
||||||
float pitch = source.rFloat();
|
float pitch = source.readFloat();
|
||||||
|
|
||||||
Sound sound = Sound.valueOf(soundName);
|
Sound sound = Sound.valueOf(soundName);
|
||||||
|
|
||||||
@ -252,14 +321,21 @@ public class PacketProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void pasteSchem(FightTeam team) throws IOException {
|
private void pasteSchem(FightTeam team) throws IOException {
|
||||||
int schemId = source.rInt();
|
int schemId = source.readInt();
|
||||||
|
|
||||||
execSync(() -> team.pasteSchem(Schematic.getSchemFromDB(schemId)));
|
execSync(() -> team.pasteSchem(Schematic.getSchemFromDB(schemId)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void pasteEmbeddedSchem(FightTeam team) throws IOException {
|
||||||
|
int schemId = source.readInt();
|
||||||
|
Clipboard clipboard = Schematic.clipboardFromStream(source, Core.getVersion() > 12);
|
||||||
|
|
||||||
|
execSync(() -> team.pasteSchem(schemId, clipboard));
|
||||||
|
}
|
||||||
|
|
||||||
private void teams() throws IOException {
|
private void teams() throws IOException {
|
||||||
int blueId = source.rInt();
|
int blueId = source.readInt();
|
||||||
int redId = source.rInt();
|
int redId = source.readInt();
|
||||||
|
|
||||||
execSync(() -> {
|
execSync(() -> {
|
||||||
pasteForTeam(blueId, Fight.getBlueTeam());
|
pasteForTeam(blueId, Fight.getBlueTeam());
|
||||||
@ -274,14 +350,14 @@ public class PacketProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void scoreboardTitle() throws IOException {
|
private void scoreboardTitle() throws IOException {
|
||||||
String title = source.rString();
|
String title = source.readUTF();
|
||||||
|
|
||||||
FightScoreboard.getScoreboard().setTitle(title);
|
FightScoreboard.getScoreboard().setTitle(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scoreboardData() throws IOException {
|
private void scoreboardData() throws IOException {
|
||||||
String key = source.rString();
|
String key = source.readUTF();
|
||||||
int value = source.rInt();
|
int value = source.readInt();
|
||||||
|
|
||||||
FightScoreboard.getScoreboard().addScore(key, value);
|
FightScoreboard.getScoreboard().addScore(key, value);
|
||||||
}
|
}
|
||||||
@ -299,123 +375,43 @@ public class PacketProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void bow() throws IOException {
|
private void bow() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
boolean drawn = source.rBoolean();
|
boolean drawn = source.readBoolean();
|
||||||
boolean offHand = source.rBoolean();
|
boolean offHand = source.readBoolean();
|
||||||
|
|
||||||
execSync(() -> REntity.getEntity(entityId).setBowDrawn(drawn, offHand));
|
execSync(() -> REntity.getEntity(entityId).setBowDrawn(drawn, offHand));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void damage() throws IOException {
|
private void damage() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
|
|
||||||
execSync(() -> REntity.getEntity(entityId).damage());
|
execSync(() -> REntity.getEntity(entityId).damage());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void fireTick() throws IOException {
|
private void fireTick() throws IOException {
|
||||||
int entityId = source.rInt();
|
int entityId = source.readInt();
|
||||||
boolean perma = source.rBoolean();
|
boolean perma = source.readBoolean();
|
||||||
|
|
||||||
execSync(() -> REntity.getEntity(entityId).setOnFire(perma));
|
execSync(() -> REntity.getEntity(entityId).setOnFire(perma));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void tick(){
|
||||||
|
execSync(REntity::tickFire);
|
||||||
|
if(!source.async())
|
||||||
|
tickFinished = true;
|
||||||
|
}
|
||||||
|
|
||||||
private void process(){
|
private void process(){
|
||||||
|
tickFinished = false;
|
||||||
try{
|
try{
|
||||||
boolean tickFinished = false;
|
|
||||||
while(!source.isClosed() && !tickFinished){
|
while(!source.isClosed() && !tickFinished){
|
||||||
byte packetType = source.rByte();
|
int packetType = Byte.toUnsignedInt(source.readByte());
|
||||||
switch(packetType){
|
PacketParser parser = packetDecoder[packetType];
|
||||||
case 0x00:
|
if(parser != null){
|
||||||
playerJoins();
|
parser.process();
|
||||||
break;
|
}else{
|
||||||
case 0x01:
|
Bukkit.getLogger().log(Level.SEVERE, "Unknown packet " + packetType + " recieved, closing.");
|
||||||
entityMoves();
|
source.close();
|
||||||
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:
|
|
||||||
bow();
|
|
||||||
break;
|
|
||||||
case 0x0B:
|
|
||||||
damage();
|
|
||||||
break;
|
|
||||||
case 0x0C:
|
|
||||||
fireTick();
|
|
||||||
break;
|
|
||||||
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(Fight.getBlueTeam());
|
|
||||||
break;
|
|
||||||
case (byte) 0xB1:
|
|
||||||
pasteSchem(Fight.getRedTeam());
|
|
||||||
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
|
|
||||||
execSync(REntity::tickFire);
|
|
||||||
if(!source.async())
|
|
||||||
tickFinished = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Bukkit.getLogger().log(Level.SEVERE, "Unknown packet {} recieved, closing.", packetType);
|
|
||||||
source.close();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (EOFException e) {
|
} catch (EOFException e) {
|
||||||
@ -437,4 +433,8 @@ public class PacketProcessor {
|
|||||||
new VersionedRunnable(() -> RecordSystem_14.setBlock(world, x, y, z, blockState), 14),
|
new VersionedRunnable(() -> RecordSystem_14.setBlock(world, x, y, z, blockState), 14),
|
||||||
new VersionedRunnable(() -> RecordSystem_15.setBlock(world, x, y, z, blockState), 15));
|
new VersionedRunnable(() -> RecordSystem_15.setBlock(world, x, y, z, blockState), 15));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private interface PacketParser{
|
||||||
|
void process() throws IOException;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,52 +23,20 @@ import org.bukkit.Bukkit;
|
|||||||
|
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public abstract class PacketSource {
|
public abstract class PacketSource extends DataInputStream {
|
||||||
|
|
||||||
protected final DataInputStream inputStream;
|
protected PacketSource(InputStream inputStream){
|
||||||
|
super(inputStream);
|
||||||
protected PacketSource(DataInputStream inputStream){
|
|
||||||
this.inputStream = inputStream;
|
|
||||||
new PacketProcessor(this);
|
new PacketProcessor(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte rByte() throws IOException {
|
@Override
|
||||||
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(){
|
public void close(){
|
||||||
try {
|
try {
|
||||||
inputStream.close();
|
super.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Bukkit.getLogger().log(Level.SEVERE, "IOException on disable", e);
|
Bukkit.getLogger().log(Level.SEVERE, "IOException on disable", e);
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ import de.steamwar.fightsystem.ArenaMode;
|
|||||||
import de.steamwar.fightsystem.Config;
|
import de.steamwar.fightsystem.Config;
|
||||||
import de.steamwar.fightsystem.fight.*;
|
import de.steamwar.fightsystem.fight.*;
|
||||||
import de.steamwar.fightsystem.states.FightState;
|
import de.steamwar.fightsystem.states.FightState;
|
||||||
|
import de.steamwar.sql.Schematic;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.sql.SteamwarUser;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
@ -35,6 +36,8 @@ import org.bukkit.util.Vector;
|
|||||||
|
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public interface Recorder {
|
public interface Recorder {
|
||||||
@ -47,6 +50,7 @@ public interface Recorder {
|
|||||||
teamIds(Config.EventTeamBlueID, Config.EventTeamRedID);
|
teamIds(Config.EventTeamBlueID, Config.EventTeamRedID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
arenaInfo();
|
||||||
enableTeam(Fight.getBlueTeam());
|
enableTeam(Fight.getBlueTeam());
|
||||||
enableTeam(Fight.getRedTeam());
|
enableTeam(Fight.getRedTeam());
|
||||||
}
|
}
|
||||||
@ -92,20 +96,26 @@ public interface Recorder {
|
|||||||
* PlayerDamagePacket (0x0B) + int EntityId
|
* PlayerDamagePacket (0x0B) + int EntityId
|
||||||
* SetOnFire (0x0C) + int EntityId + boolean perma
|
* SetOnFire (0x0C) + int EntityId + boolean perma
|
||||||
*
|
*
|
||||||
|
* ArenaInfo (0x20) + bool blueNegZ + byte arenaY + int arenaMinX + int arenaMinZ
|
||||||
*
|
*
|
||||||
* BlockPacket (0x30) + pos int, byte, int + int BlockState
|
* BlockPacket (0x30) + pos int, byte, int + int BlockState
|
||||||
* ParticlePacket (0x31) + double x, y, z + string particleType
|
* ParticlePacket (0x31) + double x, y, z + string particleType
|
||||||
* SoundPacket (0x32) + int x, y, z + string soundType + string soundCategory + float volume, pitch
|
* SoundPacket (0x32) + int x, y, z + string soundType + string soundCategory + float volume, pitch
|
||||||
* ShortBlockPacket (0x33) + pos relative to ArenaMinX,ArenaMinZ byte, byte, byte + short BlockState
|
* ShortBlockPacket (0x33) + pos relative to ArenaMinX,ArenaMinZ byte, byte, byte + short BlockState
|
||||||
* SoundAtPlayerPacket (0x34) + string (soundType, soundCategory) + float volume, pitch
|
* SoundAtPlayerPacket (0x34) + string (soundType, soundCategory) + float volume, pitch
|
||||||
|
* ShortBlockPacket (0x35) + pos relative to ArenaMinX,BluePasteY,ArenaMinZ byte, byte, byte + short BlockState
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* ChatPacket (0xA0) + String message
|
* ChatPacket (0xA0) + String message
|
||||||
* ActionBarPacket (0xA1) + String message
|
* ActionBarPacket (0xA1) + String message
|
||||||
* SystemPacket (0xA2) + String message
|
* SystemPacket (0xA2) + String message
|
||||||
|
*
|
||||||
* BlueSchemPacket (0xB0) + int blueSchemId
|
* BlueSchemPacket (0xB0) + int blueSchemId
|
||||||
* RedSchemPacket (0xB1) + int redSchemId
|
* RedSchemPacket (0xB1) + int redSchemId
|
||||||
* TeamIDPacket (0xB2) + int blueTeamId, redTeamId
|
* TeamIDPacket (0xB2) + int blueTeamId, redTeamId
|
||||||
|
* BlueEmbeddedSchemPacket (0xB3) + int blueSchemId + gzipt NBT blob
|
||||||
|
* RedEmbeddedSchemPacket (0xB4) + int redSchemId + gzipt NBT blob
|
||||||
|
*
|
||||||
* ScoreboardTitlePacket (0xC0) + String scoreboardTitle
|
* ScoreboardTitlePacket (0xC0) + String scoreboardTitle
|
||||||
* ScoreboardDataPacket (0xC1) + String key + int value
|
* ScoreboardDataPacket (0xC1) + String key + int value
|
||||||
*
|
*
|
||||||
@ -185,16 +195,22 @@ public interface Recorder {
|
|||||||
write(0x0c, e.getEntityId(), perma);
|
write(0x0c, e.getEntityId(), perma);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default void arenaInfo(){
|
||||||
|
write(0x20, Config.blueNegZ(), (byte)Config.BluePasteRegion.getMinY(),
|
||||||
|
Config.ArenaRegion.getMinX(), Config.ArenaRegion.getMinZ());
|
||||||
|
}
|
||||||
|
|
||||||
default void blockChange(Block block){
|
default void blockChange(Block block){
|
||||||
int blockState = VersionedCallable.call(new VersionedCallable<>(() -> RecordSystem_8.blockToId(block), 8),
|
int blockState = VersionedCallable.call(new VersionedCallable<>(() -> RecordSystem_8.blockToId(block), 8),
|
||||||
new VersionedCallable<>(() -> RecordSystem_14.blockToId(block), 14),
|
new VersionedCallable<>(() -> RecordSystem_14.blockToId(block), 14),
|
||||||
new VersionedCallable<>(() -> RecordSystem_15.blockToId(block), 15));
|
new VersionedCallable<>(() -> RecordSystem_15.blockToId(block), 15));
|
||||||
|
|
||||||
int shortX = block.getX() - Config.ArenaRegion.getMinX();
|
int shortX = block.getX() - Config.ArenaRegion.getMinX();
|
||||||
|
int shortY = block.getY() - Config.BluePasteRegion.getMinY();
|
||||||
int shortZ = block.getZ() - Config.ArenaRegion.getMinZ();
|
int shortZ = block.getZ() - Config.ArenaRegion.getMinZ();
|
||||||
if((short)blockState == blockState && shortX > 0 && shortX < 256 && shortZ > 0 && shortZ < 256){
|
if((short)blockState == blockState && shortX >= 0 && shortX < 256 && shortY >= 0 && shortZ >= 0 && shortZ < 256){
|
||||||
//Short block packet
|
//Short block packet
|
||||||
write(0x33, (byte)shortX, (byte)block.getY(), (byte)shortZ, (short)blockState);
|
write(0x35, (byte)shortX, (byte)shortY, (byte)shortZ, (short)blockState);
|
||||||
}else{
|
}else{
|
||||||
//Block packet
|
//Block packet
|
||||||
write(0x30, block.getX(), (byte)block.getY(), block.getZ(), blockState);
|
write(0x30, block.getX(), (byte)block.getY(), block.getZ(), blockState);
|
||||||
@ -225,16 +241,26 @@ public interface Recorder {
|
|||||||
write(0xa2, s);
|
write(0xa2, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default void teamIds(int blueTeamId, int redTeamId) {
|
||||||
|
write(0xb2, blueTeamId, redTeamId);
|
||||||
|
}
|
||||||
|
|
||||||
default void blueSchem(int schemId) {
|
default void blueSchem(int schemId) {
|
||||||
write(0xb0, schemId);
|
try {
|
||||||
|
write(0xb3, schemId, Schematic.getSchemFromDB(schemId).schemData());
|
||||||
|
} catch (IOException e) {
|
||||||
|
Bukkit.getLogger().log(Level.SEVERE, "Could not embed schematic", e);
|
||||||
|
write(0xb0, schemId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
default void redSchem(int schemId) {
|
default void redSchem(int schemId) {
|
||||||
write(0xb1, schemId);
|
try {
|
||||||
}
|
write(0xb4, schemId, Schematic.getSchemFromDB(schemId).schemData());
|
||||||
|
} catch (IOException e) {
|
||||||
default void teamIds(int blueTeamId, int redTeamId) {
|
Bukkit.getLogger().log(Level.SEVERE, "Could not embed schematic", e);
|
||||||
write(0xb2, blueTeamId, redTeamId);
|
write(0xb1, schemId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
default void scoreboardTitle(String title){
|
default void scoreboardTitle(String title){
|
||||||
@ -252,28 +278,28 @@ public interface Recorder {
|
|||||||
default void write(int id, Object... objects){
|
default void write(int id, Object... objects){
|
||||||
DataOutputStream stream = getStream();
|
DataOutputStream stream = getStream();
|
||||||
try {
|
try {
|
||||||
synchronized (stream) {
|
stream.writeByte(id);
|
||||||
stream.writeByte(id);
|
for(Object o : objects){
|
||||||
for(Object o : objects){
|
if(o instanceof Boolean)
|
||||||
if(o instanceof Boolean)
|
stream.writeBoolean((Boolean)o);
|
||||||
stream.writeBoolean((Boolean)o);
|
else if(o instanceof Byte)
|
||||||
else if(o instanceof Byte)
|
stream.writeByte((Byte)o);
|
||||||
stream.writeByte((Byte)o);
|
else if(o instanceof Short)
|
||||||
else if(o instanceof Short)
|
stream.writeShort((Short)o);
|
||||||
stream.writeShort((Short)o);
|
else if(o instanceof Integer)
|
||||||
else if(o instanceof Integer)
|
stream.writeInt((Integer)o);
|
||||||
stream.writeInt((Integer)o);
|
else if(o instanceof Float)
|
||||||
else if(o instanceof Float)
|
stream.writeFloat((Float)o);
|
||||||
stream.writeFloat((Float)o);
|
else if(o instanceof Double)
|
||||||
else if(o instanceof Double)
|
stream.writeDouble((Double)o);
|
||||||
stream.writeDouble((Double)o);
|
else if(o instanceof String)
|
||||||
else if(o instanceof String)
|
stream.writeUTF((String)o);
|
||||||
stream.writeUTF((String)o);
|
else if(o instanceof InputStream)
|
||||||
else
|
copy((InputStream) o, stream);
|
||||||
throw new SecurityException("Undefined write for: " + o.getClass().getName());
|
else
|
||||||
}
|
throw new SecurityException("Undefined write for: " + o.getClass().getName());
|
||||||
stream.flush();
|
|
||||||
}
|
}
|
||||||
|
stream.flush();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Bukkit.getLogger().log(Level.SEVERE, "Could not write", e);
|
Bukkit.getLogger().log(Level.SEVERE, "Could not write", e);
|
||||||
try {
|
try {
|
||||||
@ -283,4 +309,11 @@ public interface Recorder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void copy(InputStream var0, OutputStream var1) throws IOException {
|
||||||
|
int var5;
|
||||||
|
for(byte[] var4 = new byte[8192]; (var5 = var0.read(var4)) > 0;) {
|
||||||
|
var1.write(var4, 0, var5);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ public class WinconditionTimeTechKO extends Wincondition {
|
|||||||
public WinconditionTimeTechKO(){
|
public WinconditionTimeTechKO(){
|
||||||
super("TechKO");
|
super("TechKO");
|
||||||
|
|
||||||
if(Config.BlueToRedZ > 0) {
|
if(Config.blueNegZ()) {
|
||||||
smallerZteam = Fight.getBlueTeam();
|
smallerZteam = Fight.getBlueTeam();
|
||||||
biggerZteam = Fight.getRedTeam();
|
biggerZteam = Fight.getRedTeam();
|
||||||
}else{
|
}else{
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren