Merge branch 'main' into TNTLeague/finish

This commit is contained in:
2024-12-03 17:07:56 +01:00
74 changed files with 1177 additions and 248 deletions
@@ -46,14 +46,9 @@ public class PlayerMovementWrapper15 implements PlayerMovementWrapper {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object); PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
Object packet = Reflection.newInstance(teleportPacket); Object packet = Reflection.newInstance(teleportPacket);
teleportEntity.set(packet, player.getEntityId()); teleportEntity.set(packet, player.getEntityId());
teleportPosition.set(packet, packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0)); teleportPosition.set(packet, packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0),
if (Float.isNaN(packetPlayInFlying.a(Float.NaN))) { Float.isNaN(packetPlayInFlying.a(Float.NaN)) ? player.getLocation().getYaw() : packetPlayInFlying.a(0.0F),
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw())); Float.isNaN(packetPlayInFlying.b(Float.NaN)) ? player.getLocation().getPitch() : packetPlayInFlying.b(0.0F));
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
} else {
teleportYaw.set(packet, rotToByte(packetPlayInFlying.a(0.0F)));
teleportPitch.set(packet, rotToByte(packetPlayInFlying.b(0.0F)));
}
return packet; return packet;
} }
} }
@@ -44,14 +44,9 @@ public class PlayerMovementWrapper18 implements PlayerMovementWrapper {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object); PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
Object packet = Reflection.newInstance(teleportPacket); Object packet = Reflection.newInstance(teleportPacket);
teleportEntity.set(packet, player.getEntityId()); teleportEntity.set(packet, player.getEntityId());
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c); teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c,
if (packetPlayInFlying.h) { packetPlayInFlying.h ? player.getLocation().getYaw() : packetPlayInFlying.d,
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw())); packetPlayInFlying.h ? player.getLocation().getPitch() : packetPlayInFlying.e);
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
} else {
teleportYaw.set(packet, rotToByte(packetPlayInFlying.d));
teleportPitch.set(packet, rotToByte(packetPlayInFlying.e));
}
return packet; return packet;
} }
} }
@@ -48,14 +48,9 @@ public class PlayerMovementWrapper19 implements PlayerMovementWrapper {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object); PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
Object packet = Reflection.newInstance(teleportPacket); Object packet = Reflection.newInstance(teleportPacket);
teleportEntity.set(packet, player.getEntityId()); teleportEntity.set(packet, player.getEntityId());
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c); teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c,
if (packetPlayInFlying.h) { packetPlayInFlying.h ? player.getLocation().getYaw() : packetPlayInFlying.d,
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw())); packetPlayInFlying.h ? player.getLocation().getPitch() : packetPlayInFlying.e);
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
} else {
teleportYaw.set(packet, rotToByte(packetPlayInFlying.d));
teleportPitch.set(packet, rotToByte(packetPlayInFlying.e));
}
return packet; return packet;
} }
} }
@@ -49,14 +49,9 @@ public class PlayerMovementWrapper20 implements PlayerMovementWrapper {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object); PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
Object packet = Reflection.newInstance(teleportPacket); Object packet = Reflection.newInstance(teleportPacket);
teleportEntity.set(packet, player.getEntityId()); teleportEntity.set(packet, player.getEntityId());
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c); teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c,
if (packetPlayInFlying.h) { packetPlayInFlying.h ? player.getLocation().getYaw() : packetPlayInFlying.d,
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw())); packetPlayInFlying.h ? player.getLocation().getPitch() : packetPlayInFlying.e);
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
} else {
teleportYaw.set(packet, rotToByte(packetPlayInFlying.d));
teleportPitch.set(packet, rotToByte(packetPlayInFlying.e));
}
return packet; return packet;
} }
} }
+17
View File
@@ -0,0 +1,17 @@
plugins {
steamwar.java
}
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
dependencies {
compileOnly(project(":BauSystem:BauSystem_Main", "default"))
compileOnly(project(":SpigotCore", "default"))
compileOnly(libs.paperapi21)
compileOnly(libs.nms21)
}
@@ -0,0 +1,141 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.bausystem.utils;
import com.comphenix.tinyprotocol.Reflection;
import de.steamwar.bausystem.features.util.NoClipCommand;
import net.minecraft.core.component.DataComponents;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.protocol.game.PacketPlayInSetCreativeSlot;
import net.minecraft.network.protocol.game.PacketPlayOutExplosion;
import net.minecraft.network.protocol.game.PacketPlayOutGameStateChange;
import net.minecraft.server.level.EntityPlayer;
import net.minecraft.server.level.PlayerInteractManager;
import net.minecraft.world.entity.player.EntityHuman;
import net.minecraft.world.entity.player.PlayerAbilities;
import net.minecraft.world.item.component.CustomData;
import net.minecraft.world.level.EnumGamemode;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.Optional;
public class NMSWrapper21 implements NMSWrapper {
private static final Reflection.FieldAccessor<PlayerInteractManager> playerInteractManager = Reflection.getField(EntityPlayer.class, null, PlayerInteractManager.class);
@Override
public void setInternalGameMode(Player player, GameMode gameMode) {
playerInteractManager.get(((CraftPlayer) player).getHandle()).a(EnumGamemode.a(gameMode.getValue()));
}
@Override
public void setSlotToItemStack(Player player, Object o) {
PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
int index = packetPlayInSetCreativeSlot.b();
if (index >= 36 && index <= 44) {
index -= 36;
} else if (index > 44) {
index -= 5;
} else if (index <= 8) {
index = index - 8 + 36;
}
player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.e()));
if (index < 9) player.getInventory().setHeldItemSlot(index);
player.updateInventory();
}
private static final Reflection.FieldAccessor<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
@Override
public void setGameStateChangeReason(Object packet) {
gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d);
}
private static final Reflection.FieldAccessor<PlayerAbilities> playerAbilities = Reflection.getField(EntityHuman.class, null, PlayerAbilities.class);
@Override
public void setPlayerBuildAbilities(Player player) {
PlayerAbilities abilities = playerAbilities.get(((CraftPlayer) player).getHandle());
abilities.d = true;
abilities.e = true;
}
@Override
public Material pathMaterial() {
return Material.DIRT_PATH;
}
private static final int threshold = 2048;
@Override
public boolean checkItemStack(ItemStack item) {
net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
NBTTagCompound tag = nmsItem.a(DataComponents.b, CustomData.a).c();
if (tag.e("BlockEntityTag")) {
NBTTagCompound blockTag = tag.p("BlockEntityTag");
if (blockTag.e("Items")) {
return drillDown(blockTag.c("Items", 10), 0, 0) > threshold;
}
}
return false;
}
private int drillDown(NBTTagList items, int layer, int start) {
if (layer > 2) return start + threshold;
int invalid = start;
for (NBTBase nbtBase : items) {
if (!(nbtBase instanceof NBTTagCompound slot))
continue;
if (slot.e("tag")) {
invalid += slot.f("Count");
NBTTagCompound iTag = slot.p("tag");
if (iTag.e("BlockEntityTag")) {
NBTTagCompound blockTag = iTag.p("BlockEntityTag");
if (blockTag.e("Items")) {
invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid);
}
}
}
if (invalid > threshold)
break;
}
return invalid;
}
@Override
public Object resetExplosionKnockback(Object packet) {
PacketPlayOutExplosion explosion = (PacketPlayOutExplosion) packet;
return new PacketPlayOutExplosion(
explosion.b(),
Optional.empty(),
explosion.f(),
explosion.g()
);
}
}
@@ -40,7 +40,6 @@ dependencies {
compileOnly(libs.authlib) compileOnly(libs.authlib)
compileOnly(libs.viaapi) compileOnly(libs.viaapi)
compileOnly(libs.nms20)
compileOnly(libs.fawe18) compileOnly(libs.fawe18)
implementation(libs.luaj) implementation(libs.luaj)
@@ -22,6 +22,7 @@ package de.steamwar.bausystem.features.gui.editor;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.features.gui.BauGUI; import de.steamwar.bausystem.features.gui.BauGUI;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.specific.BauGuiItem;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import de.steamwar.inventory.SWListInv; import de.steamwar.inventory.SWListInv;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
@@ -72,7 +73,7 @@ public class BauGuiEditor implements Listener {
inv.setItem(mapping.getSize() + 5, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_TRASH", p), Arrays.asList(BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_TRASH_LORE", p)), false, clickType -> { inv.setItem(mapping.getSize() + 5, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_TRASH", p), Arrays.asList(BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_TRASH_LORE", p)), false, clickType -> {
}).getItemStack()); }).getItemStack());
inv.setItem(mapping.getSize() + 6, new SWItem(Material.SCUTE, BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_MORE", p)).getItemStack()); inv.setItem(mapping.getSize() + 6, new SWItem(TrickyTrialsWrapper.impl.getTurtleScute(), BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_MORE", p)).getItemStack());
inv.setItem(mapping.getSize() + 8, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_CLOSE", p)).getItemStack()); inv.setItem(mapping.getSize() + 8, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_CLOSE", p)).getItemStack());
p.openInventory(inv); p.openInventory(inv);
@@ -20,6 +20,7 @@
package de.steamwar.bausystem.features.loadtimer; package de.steamwar.bausystem.features.loadtimer;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@@ -57,7 +58,7 @@ public class LoadtimerListener implements Listener {
@EventHandler @EventHandler
public void onEntitySpawn(EntitySpawnEvent event) { public void onEntitySpawn(EntitySpawnEvent event) {
if (!getTimers().isEmpty() && event.getEntityType() == EntityType.PRIMED_TNT) { if (!getTimers().isEmpty() && event.getEntityType() == TrickyTrialsWrapper.impl.getTntEntityType()) {
Region r = Region.getRegion(event.getLocation()); Region r = Region.getRegion(event.getLocation());
if (hasTimer(r)) { if (hasTimer(r)) {
getTimer(r).onTntSpawn(); getTimer(r).onTntSpawn();
@@ -67,7 +68,7 @@ public class LoadtimerListener implements Listener {
@EventHandler @EventHandler
public void onEntityExplode(EntityExplodeEvent event) { public void onEntityExplode(EntityExplodeEvent event) {
if (!getTimers().isEmpty() && event.getEntityType() == EntityType.PRIMED_TNT) { if (!getTimers().isEmpty() && event.getEntityType() == TrickyTrialsWrapper.impl.getTntEntityType()) {
Region r = Region.getRegion(event.getLocation()); Region r = Region.getRegion(event.getLocation());
if (hasTimer(r)) { if (hasTimer(r)) {
getTimer(r).onTntExplode(event); getTimer(r).onTntExplode(event);
@@ -6,6 +6,7 @@ import de.steamwar.bausystem.region.flags.Flag;
import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode;
import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.bausystem.utils.ScoreboardElement;
import de.steamwar.core.Core; import de.steamwar.core.Core;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
@@ -31,7 +32,7 @@ public class FreezeListener implements Listener, ScoreboardElement {
return; return;
} }
e.setCancelled(true); e.setCancelled(true);
if (e.getEntityType() == EntityType.PRIMED_TNT) { if (e.getEntityType() == TrickyTrialsWrapper.impl.getTntEntityType()) {
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
e.getLocation().getBlock().setType(Material.TNT, false); e.getLocation().getBlock().setType(Material.TNT, false);
}, 1L); }, 1L);
@@ -28,6 +28,7 @@ import de.steamwar.bausystem.features.tpslimit.TPSUtils;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.utils.RegionExtensionType; import de.steamwar.bausystem.region.utils.RegionExtensionType;
import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.region.utils.RegionType;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
@@ -146,7 +147,7 @@ public class EventListener implements Listener {
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onEntitySpawn(EntitySpawnEvent event) { public void onEntitySpawn(EntitySpawnEvent event) {
if (event.getEntityType() != EntityType.PRIMED_TNT) { if (event.getEntityType() != TrickyTrialsWrapper.impl.getTntEntityType()) {
return; return;
} }
Region tntRegion = Region.getRegion(event.getLocation()); Region tntRegion = Region.getRegion(event.getLocation());
@@ -161,7 +162,7 @@ public class EventListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onEntityExplode(EntityExplodeEvent event) { public void onEntityExplode(EntityExplodeEvent event) {
if (event.getEntityType() != EntityType.PRIMED_TNT) { if (event.getEntityType() != TrickyTrialsWrapper.impl.getTntEntityType()) {
return; return;
} }
Region tntRegion = Region.getRegion(event.getLocation()); Region tntRegion = Region.getRegion(event.getLocation());
@@ -22,6 +22,7 @@ package de.steamwar.bausystem.features.simulator.gui.base;
import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.SimulatorWatcher;
import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.Simulator;
import de.steamwar.core.Core; import de.steamwar.core.Core;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWInventory;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -69,7 +70,7 @@ public abstract class SimulatorBaseGui {
return; return;
} }
player.getOpenInventory().close(); player.closeInventory();
inventory = new SWInventory(player, () -> { inventory = new SWInventory(player, () -> {
inv = Bukkit.createInventory(null, size, title()); inv = Bukkit.createInventory(null, size, title());
@@ -23,6 +23,8 @@ import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Point;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.region.utils.RegionType;
import de.steamwar.core.TrickyParticleWrapper;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Particle; import org.bukkit.Particle;
@@ -56,7 +58,7 @@ public class BoundaryViewer implements Listener {
} }
private void showRegion(Region region, Player player) { private void showRegion(Region region, Player player) {
drawCuboid(player, Particle.VILLAGER_HAPPY, region.getMinPoint(), region.getMaxPoint()); drawCuboid(player, TrickyParticleWrapper.impl.getVillagerHappy(), region.getMinPoint(), region.getMaxPoint());
if (region.hasType(RegionType.TESTBLOCK)) { if (region.hasType(RegionType.TESTBLOCK)) {
drawCuboid(player, Particle.END_ROD, region.getMinPointTestblockExtension(), region.getMaxPointTestblockExtension()); drawCuboid(player, Particle.END_ROD, region.getMinPointTestblockExtension(), region.getMaxPointTestblockExtension());
} }
@@ -142,17 +142,18 @@ public class TraceManager implements Listener {
* *
* @param trace the trace to be removed * @param trace the trace to be removed
*/ */
public boolean remove(Trace trace) { public void remove(Trace trace) {
Map<Integer, Trace> traces = tracesByRegion.getOrDefault(trace.getRegion(), Collections.emptyMap()); Map<Integer, Trace> traces = tracesByRegion.getOrDefault(trace.getRegion(), Collections.emptyMap());
Integer traceId = traces.entrySet().stream() Integer traceId = traces.entrySet().stream()
.filter(entry -> entry.getValue() == trace) .filter(entry -> entry.getValue() == trace)
.map(Map.Entry::getKey) .map(Map.Entry::getKey)
.findFirst() .findFirst()
.orElse(null); .orElse(null);
if (traceId == null) return false; if (traceId == null) throw new RuntimeException("Trace not found while trying to remove see (c978eb98-b0b2-4009-91d8-acfa34e2831a)");
traces.remove(traceId); traces.remove(traceId);
trace.hide(); trace.hide();
return true; trace.getMetadataSaveFile().delete();
trace.getRecordsSaveFile().delete();
} }
/** /**
@@ -171,8 +172,8 @@ public class TraceManager implements Listener {
tracesByRegion.getOrDefault(region, new HashMap<>()) tracesByRegion.getOrDefault(region, new HashMap<>())
.forEach((i, trace) -> { .forEach((i, trace) -> {
if (trace.getRegion() != region) return; if (trace.getRegion() != region) return;
trace.getMetadataSaveFile().deleteOnExit(); trace.getMetadataSaveFile().delete();
trace.getRecordsSaveFile().deleteOnExit(); trace.getRecordsSaveFile().delete();
}); });
tracesByRegion.getOrDefault(region, new HashMap<>()).clear(); tracesByRegion.getOrDefault(region, new HashMap<>()).clear();
} }
@@ -47,7 +47,6 @@ public class NightVisionBauGuiItem extends BauGuiItem {
PotionMeta meta = (PotionMeta) itemStack.getItemMeta(); PotionMeta meta = (PotionMeta) itemStack.getItemMeta();
meta.setColor(PotionEffectType.NIGHT_VISION.getColor()); meta.setColor(PotionEffectType.NIGHT_VISION.getColor());
meta.setDisplayName(BauSystem.MESSAGE.parse("NIGHT_VISION_ITEM_ON", player)); meta.setDisplayName(BauSystem.MESSAGE.parse("NIGHT_VISION_ITEM_ON", player));
meta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
meta.setCustomModelData(1); meta.setCustomModelData(1);
itemStack.setItemMeta(meta); itemStack.setItemMeta(meta);
return itemStack; return itemStack;
@@ -24,21 +24,16 @@ import de.steamwar.bausystem.BauSystem;
import de.steamwar.core.BountifulWrapper; import de.steamwar.core.BountifulWrapper;
import de.steamwar.core.Core; import de.steamwar.core.Core;
import de.steamwar.core.VersionDependent; import de.steamwar.core.VersionDependent;
import de.steamwar.entity.REntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public interface PlayerMovementWrapper { public interface PlayerMovementWrapper {
Class<?> teleportPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntityTeleport"); Class<?> teleportPacket = REntity.teleportPacket;
Reflection.FieldAccessor<Integer> teleportEntity = Reflection.getField(teleportPacket, Integer.TYPE, 0); Reflection.FieldAccessor<Integer> teleportEntity = REntity.teleportEntity;
BountifulWrapper.PositionSetter teleportPosition = BountifulWrapper.impl.getPositionSetter(teleportPacket, Core.getVersion() == 8 ? 1 : 0); BountifulWrapper.PositionSetter teleportPosition = REntity.teleportPosition;
Reflection.FieldAccessor<Byte> teleportYaw = Reflection.getField(teleportPacket, Byte.TYPE, 0);
Reflection.FieldAccessor<Byte> teleportPitch = Reflection.getField(teleportPacket, Byte.TYPE, 1);
PlayerMovementWrapper impl = VersionDependent.getVersionImpl(BauSystem.getInstance()); PlayerMovementWrapper impl = VersionDependent.getVersionImpl(BauSystem.getInstance());
void setPosition(Player player, Object object); void setPosition(Player player, Object object);
Object convertToOut(Player player, Object object); Object convertToOut(Player player, Object object);
default byte rotToByte(float rot) {
return (byte)((int)(rot * 256.0F / 360.0F));
}
} }
+1
View File
@@ -32,4 +32,5 @@ dependencies {
implementation(project(":BauSystem:BauSystem_18")) implementation(project(":BauSystem:BauSystem_18"))
implementation(project(":BauSystem:BauSystem_19")) implementation(project(":BauSystem:BauSystem_19"))
implementation(project(":BauSystem:BauSystem_20")) implementation(project(":BauSystem:BauSystem_20"))
implementation(project(":BauSystem:BauSystem_21"))
} }
@@ -0,0 +1,43 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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/>.
*/
plugins {
steamwar.java
}
dependencies {
compileOnly(project(":FightSystem:FightSystem_Core", "default"))
compileOnly(project(":FightSystem:FightSystem_18", "default"))
compileOnly(libs.paperapi21) {
attributes {
// Very Hacky, but it works
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 21)
}
}
compileOnly(libs.nms21) {
attributes {
// Very Hacky, but it works
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 21)
}
}
compileOnly(libs.fastutil)
}
@@ -0,0 +1,30 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.utils;
import org.bukkit.entity.Entity;
public class CraftbukkitWrapper21 extends CraftbukkitWrapper18 {
@Override
public float headRotation(Entity e) {
return getEntity(e).bS();
}
}
@@ -19,6 +19,7 @@
package de.steamwar.fightsystem.event; package de.steamwar.fightsystem.event;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.countdown.Countdown; import de.steamwar.fightsystem.countdown.Countdown;
@@ -97,13 +98,13 @@ public class HellsBells {
currentDropping = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), () -> { currentDropping = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), () -> {
for (int w = 0; w < width; w++) { for (int w = 0; w < width; w++) {
if (direction.isNorthOrWest()) { if (direction.isNorthOrWest()) {
Config.world.spawnEntity(redStart.addAndToLocation(Config.world, -1 * (direction.dx * length.get() + w * direction.other().dx), 0, -1 * (direction.dz * length.get() + w * direction.other().dz)), EntityType.PRIMED_TNT); Config.world.spawnEntity(redStart.addAndToLocation(Config.world, -1 * (direction.dx * length.get() + w * direction.other().dx), 0, -1 * (direction.dz * length.get() + w * direction.other().dz)), TrickyTrialsWrapper.impl.getTntEntityType());
Config.world.spawnEntity(blueStart.addAndToLocation(Config.world, direction.dx * length.get() + w * direction.other().dx, 0, direction.dz * length.get() + w * direction.other().dz), EntityType.PRIMED_TNT); Config.world.spawnEntity(blueStart.addAndToLocation(Config.world, direction.dx * length.get() + w * direction.other().dx, 0, direction.dz * length.get() + w * direction.other().dz), TrickyTrialsWrapper.impl.getTntEntityType());
} else { } else {
Config.world.spawnEntity(redStart.addAndToLocation(Config.world, direction.dx * length.get() + w * direction.other().dx, 0, direction.dz * length.get() + w * direction.other().dz), EntityType.PRIMED_TNT); Config.world.spawnEntity(redStart.addAndToLocation(Config.world, direction.dx * length.get() + w * direction.other().dx, 0, direction.dz * length.get() + w * direction.other().dz), TrickyTrialsWrapper.impl.getTntEntityType());
Config.world.spawnEntity(blueStart.addAndToLocation(Config.world, -1 * (direction.dx * length.get() + w * direction.other().dx), 0, -1 * (direction.dz * length.get() + w * direction.other().dz)), EntityType.PRIMED_TNT); Config.world.spawnEntity(blueStart.addAndToLocation(Config.world, -1 * (direction.dx * length.get() + w * direction.other().dx), 0, -1 * (direction.dz * length.get() + w * direction.other().dz)), TrickyTrialsWrapper.impl.getTntEntityType());
} }
} }
if (length.addAndGet(-2) <= 0) { if (length.addAndGet(-2) <= 0) {
@@ -21,6 +21,7 @@ package de.steamwar.fightsystem.listener;
import com.comphenix.tinyprotocol.Reflection; import com.comphenix.tinyprotocol.Reflection;
import com.comphenix.tinyprotocol.TinyProtocol; import com.comphenix.tinyprotocol.TinyProtocol;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.fightsystem.ArenaMode; import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.events.TeamDeathEvent; import de.steamwar.fightsystem.events.TeamDeathEvent;
@@ -221,7 +222,7 @@ public class Recording implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onTNTSpawn(EntitySpawnEvent e){ public void onTNTSpawn(EntitySpawnEvent e){
if(e.getEntityType() != EntityType.PRIMED_TNT) if(e.getEntityType() != TrickyTrialsWrapper.impl.getTntEntityType())
return; return;
GlobalRecorder.getInstance().tntSpawn(e.getEntity()); GlobalRecorder.getInstance().tntSpawn(e.getEntity());
@@ -229,7 +230,7 @@ public class Recording implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onExplosion(EntityExplodeEvent e){ public void onExplosion(EntityExplodeEvent e){
if(e.getEntityType() != EntityType.PRIMED_TNT) if(e.getEntityType() != TrickyTrialsWrapper.impl.getTntEntityType())
return; return;
Location loc = e.getLocation(); Location loc = e.getLocation();
@@ -19,6 +19,7 @@
package de.steamwar.fightsystem.listener; package de.steamwar.fightsystem.listener;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.fightsystem.ArenaMode; import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.Fight;
@@ -56,7 +57,7 @@ public class WaterRemover implements Listener {
@EventHandler @EventHandler
public void handleEntitySpawn(EntitySpawnEvent event) { public void handleEntitySpawn(EntitySpawnEvent event) {
if(event.getEntityType() != EntityType.PRIMED_TNT) if(event.getEntityType() != TrickyTrialsWrapper.impl.getTntEntityType())
return; return;
Location location = event.getLocation(); Location location = event.getLocation();
@@ -21,6 +21,7 @@ package de.steamwar.fightsystem.record;
import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard;
import de.steamwar.core.Core; import de.steamwar.core.Core;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.entity.REntity; import de.steamwar.entity.REntity;
import de.steamwar.entity.REntityServer; import de.steamwar.entity.REntityServer;
import de.steamwar.entity.RPlayer; import de.steamwar.entity.RPlayer;
@@ -298,7 +299,7 @@ public class PacketProcessor implements Listener {
private void tntSpawn() throws IOException { private void tntSpawn() throws IOException {
int entityId = source.readInt(); int entityId = source.readInt();
execSync(() -> addREntity(entityId, new REntity(entityServer, EntityType.PRIMED_TNT, Config.SpecSpawn))); execSync(() -> addREntity(entityId, new REntity(entityServer, TrickyTrialsWrapper.impl.getTntEntityType(), Config.SpecSpawn)));
} }
private void entityVelocity() throws IOException { private void entityVelocity() throws IOException {
@@ -19,6 +19,7 @@
package de.steamwar.fightsystem.winconditions; package de.steamwar.fightsystem.winconditions;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.fightsystem.countdown.Countdown; import de.steamwar.fightsystem.countdown.Countdown;
import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.fight.FightTeam;
@@ -70,7 +71,7 @@ public class WinconditionTimeTechKO extends Wincondition implements Listener {
@EventHandler @EventHandler
public void onSpawn(EntitySpawnEvent e) { public void onSpawn(EntitySpawnEvent e) {
if(e.getEntityType() != EntityType.PRIMED_TNT) if(e.getEntityType() != TrickyTrialsWrapper.impl.getTntEntityType())
return; return;
Location location = e.getLocation(); Location location = e.getLocation();
@@ -84,7 +85,7 @@ public class WinconditionTimeTechKO extends Wincondition implements Listener {
@EventHandler @EventHandler
public void onExplode(EntityExplodeEvent e) { public void onExplode(EntityExplodeEvent e) {
if(e.getEntityType() != EntityType.PRIMED_TNT) if(e.getEntityType() != TrickyTrialsWrapper.impl.getTntEntityType())
return; return;
FightTeam spawn = spawnLocations.remove(e.getEntity().getEntityId()); FightTeam spawn = spawnLocations.remove(e.getEntity().getEntityId());
+1
View File
@@ -37,4 +37,5 @@ dependencies {
implementation(project(":FightSystem:FightSystem_18")) implementation(project(":FightSystem:FightSystem_18"))
implementation(project(":FightSystem:FightSystem_19")) implementation(project(":FightSystem:FightSystem_19"))
implementation(project(":FightSystem:FightSystem_20")) implementation(project(":FightSystem:FightSystem_20"))
implementation(project(":FightSystem:FightSystem_21"))
} }
@@ -1,4 +1,4 @@
PREFIX = §eLobby§8System§8» PREFIX = §eLobby§8System§8»§7
TIME = HH:mm:ss TIME = HH:mm:ss
DATE=........ DATE=........
COMMAND_HELP_HEAD=§7---=== (§e{0}§7) ===--- COMMAND_HELP_HEAD=§7---=== (§e{0}§7) ===---
@@ -7,9 +7,9 @@ COMMAND_HELP_HEAD=§7---=== (§e{0}§7) ===---
NPC_CHAT_0 = §fHello, I''m {0} and I''m a(n) {1}§f. NPC_CHAT_0 = §fHello, I''m {0} and I''m a(n) {1}§f.
NPC_CHAT_1 = §fWelcome on §eSteam§8War§f, have fun. NPC_CHAT_1 = §fWelcome on §eSteam§8War§f, have fun.
NPC_CHAT_2 = §eSteam§8War§f was established in 2019. NPC_CHAT_2 = §eSteam§8War§f was established in 2019.
NPC_CHAT_3 = &fBecome a part of our team by applying via our Discord server (https://steamwar.de/discord). NPC_CHAT_3 = §fBecome a part of our team by applying via our Discord server (https://steamwar.de/discord).
NPC_CHAT_4 = &fYou can develop your own buildserver features with our Lua script system. NPC_CHAT_4 = §fYou can develop your own buildserver features with our Lua script system.
NPC_CHAT_5 = &fThere are many secrets to discover in this lobby. NPC_CHAT_5 = §fThere are many secrets to discover in this lobby.
# Portal Command # Portal Command
PORTAL_COMMAND_LIST_HELP = §8/§7portal §elist §8- §7Lists all portals PORTAL_COMMAND_LIST_HELP = §8/§7portal §elist §8- §7Lists all portals
@@ -7,9 +7,9 @@ COMMAND_HELP_HEAD=§7---=== (§e{0}§7) ===---
NPC_CHAT_0 = §fHallo, ich bin {0} und bin ein {1}§f. NPC_CHAT_0 = §fHallo, ich bin {0} und bin ein {1}§f.
NPC_CHAT_1 = §fWillkommen auf §eSteam§8War§f, viel Spaß dir. NPC_CHAT_1 = §fWillkommen auf §eSteam§8War§f, viel Spaß dir.
NPC_CHAT_2 = §eSteam§8War§f gibt es seit 2019. NPC_CHAT_2 = §eSteam§8War§f gibt es seit 2019.
NPC_CHAT_3 = &fBewerbe dich gerne für unser Team über unseren Discord-Server (https://steamwar.de/discord). NPC_CHAT_3 = §fBewerbe dich gerne für unser Team über unseren Discord-Server (https://steamwar.de/discord).
NPC_CHAT_4 = &fDu kannst mit unserm Lua Script-System deine eigenen Bau Features programmieren. NPC_CHAT_4 = §fDu kannst mit unserm Lua Script-System deine eigenen Bau Features programmieren.
NPC_CHAT_5 = &fAuf dieser Lobby sind so einige secrets versteckt. NPC_CHAT_5 = §fAuf dieser Lobby sind so einige secrets versteckt.
# Portal Command # Portal Command
PORTAL_COMMAND_LIST_HELP = §8/§7portal §elist §8- §7Listet alle Portale auf PORTAL_COMMAND_LIST_HELP = §8/§7portal §elist §8- §7Listet alle Portale auf
@@ -97,13 +97,18 @@ public class CustomMap implements Listener {
for (Entity entity : event.getChunk().getEntities()) { for (Entity entity : event.getChunk().getEntities()) {
if (!(entity instanceof ItemFrame)) continue; if (!(entity instanceof ItemFrame)) continue;
ItemFrame itemFrame = (ItemFrame) entity; ItemFrame itemFrame = (ItemFrame) entity;
ItemStack itemStack = itemFrame.getItem();
if (itemStack.getType() != Material.FILLED_MAP) continue;
Vector vector = itemFrame.getLocation().getBlock().getLocation().toVector(); Vector vector = itemFrame.getLocation().getBlock().getLocation().toVector();
if (itemFrameIndex.containsKey(vector)) { if (itemFrameIndex.containsKey(vector)) {
if (itemFrames[itemFrameIndex.get(vector)] != null) continue; if (itemFrames[itemFrameIndex.get(vector)] != null) continue;
itemFrames[itemFrameIndex.get(vector)] = itemFrame; itemFrames[itemFrameIndex.get(vector)] = itemFrame;
lastModified = 0; lastModified = 0;
ItemStack itemStack = new ItemStack(Material.FILLED_MAP, 1);
MapMeta mapMeta = (MapMeta) itemStack.getItemMeta();
mapMeta.setMapView(Bukkit.createMap(itemFrame.getWorld()));
itemStack.setItemMeta(mapMeta);
itemFrame.setItem(itemStack);
MapView mapView = ((MapMeta) itemFrame.getItem().getItemMeta()).getMapView(); MapView mapView = ((MapMeta) itemFrame.getItem().getItemMeta()).getMapView();
new ArrayList<>(mapView.getRenderers()).forEach(mapView::removeRenderer); new ArrayList<>(mapView.getRenderers()).forEach(mapView::removeRenderer);
mapView.addRenderer(new MapRenderer() { mapView.addRenderer(new MapRenderer() {
@@ -25,6 +25,7 @@ import de.steamwar.inventory.SWItem;
import de.steamwar.inventory.SWListInv; import de.steamwar.inventory.SWListInv;
import de.steamwar.lobby.LobbySystem; import de.steamwar.lobby.LobbySystem;
import de.steamwar.sql.NodeMember; import de.steamwar.sql.NodeMember;
import de.steamwar.sql.SchematicNode;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -72,6 +73,7 @@ public class AdventCommand extends SWCommand {
item = SWItem.getPlayerSkull(random.nextBoolean() ? "MHF_Present1" : "MHF_Present2"); item = SWItem.getPlayerSkull(random.nextBoolean() ? "MHF_Present1" : "MHF_Present2");
} else { } else {
item = new SWItem(Material.CHEST, ""); item = new SWItem(Material.CHEST, "");
item.setLore(List.of("§e>>>§7 " + SchematicNode.getSchematicNode(present.getSchematicId()).getName()));
} }
item.setName(LobbySystem.getMessage().parse("ADVENT_CALENDAR_DAY", player, present.getDay())); item.setName(LobbySystem.getMessage().parse("ADVENT_CALENDAR_DAY", player, present.getDay()));
itemList.add(new SWListInv.SWListEntry<>(item, present)); itemList.add(new SWListInv.SWListEntry<>(item, present));
@@ -145,7 +145,7 @@ public class TeamPlayer extends BasicListener {
return; return;
} }
String message = "NPC_Chat_" + random.nextInt(6); String message = "NPC_CHAT_" + random.nextInt(6);
SteamwarUser user = SteamwarUser.get(event.getRightClicked().getName()); SteamwarUser user = SteamwarUser.get(event.getRightClicked().getName());
UserPerm.Prefix prefix = user.prefix(); UserPerm.Prefix prefix = user.prefix();
LobbySystem.getMessage().send(message, event.getPlayer(), event.getRightClicked().getName(), prefix.getColorCode() + prefix.getChatPrefix()); LobbySystem.getMessage().send(message, event.getPlayer(), event.getRightClicked().getName(), prefix.getColorCode() + prefix.getChatPrefix());
@@ -19,6 +19,7 @@
package de.steamwar.schematicsystem.autocheck; package de.steamwar.schematicsystem.autocheck;
import de.steamwar.core.Core;
import de.steamwar.schematicsystem.CheckSchemType; import de.steamwar.schematicsystem.CheckSchemType;
import de.steamwar.schematicsystem.SchematicSystem; import de.steamwar.schematicsystem.SchematicSystem;
import lombok.Builder; import lombok.Builder;
@@ -143,13 +144,15 @@ public class AutoCheckerResult {
blockScanResult.getDefunctNbt().forEach(blockVector3 -> { blockScanResult.getDefunctNbt().forEach(blockVector3 -> {
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_DEFUNCT_NBT", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ()); SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_DEFUNCT_NBT", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ());
}); });
blockScanResult.getDesignBlocks().forEach((material, poss) -> { if(Core.getVersion() > 12) {
if(material.getBlastResistance() > type.getMaxBlastResistance()) { blockScanResult.getDesignBlocks().forEach((material, poss) -> {
poss.forEach(pos -> { if(material.getBlastResistance() > type.getMaxBlastResistance()) {
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_DESIGN_BLOCK", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(pos), material.name(), pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()); poss.forEach(pos -> {
}); SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_DESIGN_BLOCK", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(pos), material.name(), pos.getBlockX(), pos.getBlockY(), pos.getBlockZ());
} });
}); }
});
}
entities.forEach(blockPos -> { entities.forEach(blockPos -> {
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_ENTITY", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockPos), blockPos.getX(), blockPos.getY(), blockPos.getZ()); SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_ENTITY", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockPos), blockPos.getX(), blockPos.getY(), blockPos.getZ());
}); });
@@ -232,9 +232,9 @@ public class FlatteningWrapper14 implements FlatteningWrapper.IFlatteningWrapper
scoreboardName.set(packet, ChatWrapper.impl.stringToChatComponent(title)); scoreboardName.set(packet, ChatWrapper.impl.stringToChatComponent(title));
} }
private static final Class<?> scoreActionEnum = Reflection.getClass("{nms.server}.ScoreboardServer$Action"); private static final Class<?> scoreActionEnum = Core.getVersion() < 21 ? Reflection.getClass("{nms.server}.ScoreboardServer$Action") : null;
private static final Reflection.FieldAccessor<?> scoreAction = Reflection.getField(FlatteningWrapper.scoreboardScore, scoreActionEnum, 0); private static final Reflection.FieldAccessor<?> scoreAction = Core.getVersion() < 21 ? Reflection.getField(FlatteningWrapper.scoreboardScore, scoreActionEnum, 0) : null;
private static final Object scoreActionChange = scoreActionEnum.getEnumConstants()[0]; private static final Object scoreActionChange = Core.getVersion() < 21 ? scoreActionEnum.getEnumConstants()[0] : null;
@Override @Override
public void setScoreAction(Object packet) { public void setScoreAction(Object packet) {
@@ -0,0 +1,30 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import org.bukkit.Material;
public class TrickyTrialsWrapper14 extends TrickyTrialsWrapper8 {
@Override
public Material getTurtleScute() {
return Material.SCUTE;
}
}
@@ -35,6 +35,8 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.*; import com.sk89q.worldedit.extent.clipboard.io.*;
import com.sk89q.worldedit.extent.clipboard.io.legacycompat.*; import com.sk89q.worldedit.extent.clipboard.io.legacycompat.*;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.session.ClipboardHolder;
@@ -44,6 +46,7 @@ import com.sk89q.worldedit.world.block.BlockTypes;
import com.sk89q.worldedit.world.registry.LegacyMapper; import com.sk89q.worldedit.world.registry.LegacyMapper;
import de.steamwar.sql.NoClipboardException; import de.steamwar.sql.NoClipboardException;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
@@ -52,54 +55,22 @@ import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
public class WorldEditWrapper14 implements WorldEditWrapper.IWorldEditWrapper { public class WorldEditWrapper14 implements WorldEditWrapper {
private static final ClipboardFormat SCHEMATIC = ClipboardFormats.findByAlias("schematic"); private static final ClipboardFormat SCHEMATIC = BuiltInClipboardFormat.MCEDIT_SCHEMATIC;
private static final ClipboardFormat SCHEM = ClipboardFormats.findByAlias("schem"); private static final ClipboardFormat SCHEM = BuiltInClipboardFormat.SPONGE_SCHEMATIC;
@Override @Override
public InputStream getPlayerClipboard(Player player, boolean schemFormat) { public InputStream getPlayerClipboard(Player player, boolean schemFormat) {
ClipboardHolder clipboardHolder; return WorldEditWrapper.getPlayerClipboard(player, schemFormat, (outputStream, clipboard, clipboardHolder) -> {
try { if(schemFormat){
clipboardHolder = WorldEditWrapper.getWorldEditPlugin().getSession(player).getClipboard(); ClipboardWriter writer = SCHEM.getWriter(outputStream);
} catch (EmptyClipboardException e) { writer.write(clipboard);
throw new NoClipboardException(); writer.close();
} }else{
SCHEMATIC.getWriter(outputStream).write(clipboard);
Clipboard clipboard = clipboardHolder.getClipboard();
if(clipboard == null)
throw new NoClipboardException();
PipedOutputStream outputStream = new PipedOutputStream();
PipedInputStream inputStream;
try {
inputStream = new PipedInputStream(outputStream, 4096);
}catch(NullPointerException e){
throw new RuntimeException(e.getMessage(), new IOException(e));
} catch (IOException e) {
throw new SecurityException("Could not init piped input stream", e);
}
new Thread(() -> {
try{
if(schemFormat){
ClipboardWriter writer = SCHEM.getWriter(outputStream);
writer.write(clipboard);
writer.close();
}else{
SCHEMATIC.getWriter(outputStream).write(clipboard);
}
}catch(NullPointerException | IOException e) {
Core.getInstance().getLogger().log(Level.SEVERE, "Could not write schematic", e);
} }
try { });
outputStream.close();
} catch (IOException e) {
Core.getInstance().getLogger().log(Level.SEVERE, "Could not close schem writer", e);
}
}, "SchemWriter").start();
return inputStream;
} }
@Override @Override
@@ -131,6 +102,28 @@ public class WorldEditWrapper14 implements WorldEditWrapper.IWorldEditWrapper {
} }
} }
@Override
public org.bukkit.util.Vector getOrigin(Clipboard clipboard) {
return new org.bukkit.util.Vector(clipboard.getOrigin().getX(), clipboard.getOrigin().getY(), clipboard.getOrigin().getZ());
}
@Override
public Vector getMinimum(Region region) {
return new Vector(region.getMinimumPoint().getX(), region.getMinimumPoint().getY(), region.getMinimumPoint().getZ());
}
@Override
public Vector getMaximum(Region region) {
return new Vector(region.getMaximumPoint().getX(), region.getMaximumPoint().getY(), region.getMaximumPoint().getZ());
}
@Override
public Vector applyTransform(Vector vector, Transform transform) {
Vector3 v = Vector3.at(vector.getX(), vector.getY(), vector.getZ());
v = transform.apply(v);
return new org.bukkit.util.Vector(v.getX(), v.getY(), v.getZ());
}
private static class MCEditSchematicReader extends NBTSchematicReader { private static class MCEditSchematicReader extends NBTSchematicReader {
private final NBTInputStream inputStream; private final NBTInputStream inputStream;
@@ -21,8 +21,7 @@ package de.steamwar.core;
import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTInputStream;
import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.MCEditSchematicReader; import com.sk89q.worldedit.extent.clipboard.io.*;
import com.sk89q.worldedit.extent.clipboard.io.SpongeSchematicReader;
import de.steamwar.sql.NoClipboardException; import de.steamwar.sql.NoClipboardException;
import java.io.IOException; import java.io.IOException;
@@ -33,8 +32,8 @@ public class WorldEditWrapper18 extends WorldEditWrapper14 {
@Override @Override
@SuppressWarnings("removal") @SuppressWarnings("removal")
public Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException { public Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException {
//Use FAWE reader due to FAWE capability of reading corrupt FAWE schems
NBTInputStream nbtStream = new NBTInputStream(is); NBTInputStream nbtStream = new NBTInputStream(is);
//Use FAWE reader due to FAWE capability of reading corrupt FAWE schems
try { try {
return (schemFormat ? new SpongeSchematicReader(nbtStream) : new MCEditSchematicReader(nbtStream)).read(); return (schemFormat ? new SpongeSchematicReader(nbtStream) : new MCEditSchematicReader(nbtStream)).read();
} catch (NullPointerException e) { } catch (NullPointerException e) {
+11
View File
@@ -23,6 +23,11 @@ plugins {
dependencies { dependencies {
compileOnly(project(":SpigotCore:SpigotCore_Main", "default")) compileOnly(project(":SpigotCore:SpigotCore_Main", "default"))
compileOnly(project(":SpigotCore:SpigotCore_18", "default"))
compileOnly(project(":SpigotCore:SpigotCore_14", "default"))
compileOnly(project(":SpigotCore:SpigotCore_9", "default"))
compileOnly(libs.fawe21)
compileOnly(libs.paperapi21) { compileOnly(libs.paperapi21) {
attributes { attributes {
@@ -30,4 +35,10 @@ dependencies {
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 21) attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 21)
} }
} }
compileOnly(libs.nms21) {
attributes {
// Very Hacky, but it works
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 21)
}
}
} }
@@ -0,0 +1,42 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import com.comphenix.tinyprotocol.Reflection;
import net.minecraft.world.entity.PositionMoveRotation;
import net.minecraft.world.phys.Vec3D;
public class BountifulWrapper21 extends BountifulWrapper9 {
@Override
public BountifulWrapper.PositionSetter getPositionSetter(Class<?> packetClass, int fieldOffset) {
try {
Reflection.FieldAccessor<PositionMoveRotation> field = Reflection.getField(packetClass, PositionMoveRotation.class, 0);
return (packet, x, y, z, pitch, yaw) -> {
PositionMoveRotation pos = field.get(packet);
field.set(packet, new PositionMoveRotation(new Vec3D(x, y, z), pos.b(), pitch, yaw));
};
} catch (IllegalArgumentException e) {
return super.getPositionSetter(packetClass, fieldOffset);
}
}
}
@@ -0,0 +1,44 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import net.minecraft.network.chat.IChatMutableComponent;
import net.minecraft.network.chat.contents.LiteralContents;
import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata;
import net.minecraft.network.syncher.DataWatcher;
import java.util.ArrayList;
public class ChatWrapper21 implements ChatWrapper {
@Override
public Object stringToChatComponent(String text) {
return IChatMutableComponent.a(LiteralContents.a(text));
}
@Override
public Object getDataWatcherPacket(int entityId, Object... dataWatcherKeyValues) {
ArrayList<DataWatcher.c<?>> nativeWatchers = new ArrayList<>(1);
for(int i = 0; i < dataWatcherKeyValues.length; i+=2) {
nativeWatchers.add(((DataWatcher.Item<?>) BountifulWrapper.impl.getDataWatcherItem(dataWatcherKeyValues[i], dataWatcherKeyValues[i+1])).e());
}
return new PacketPlayOutEntityMetadata(entityId, nativeWatchers);
}
}
@@ -0,0 +1,41 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import com.comphenix.tinyprotocol.Reflection;
import com.comphenix.tinyprotocol.TinyProtocol;
import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket;
import net.minecraft.world.level.World;
import net.minecraft.world.level.chunk.Chunk;
import net.minecraft.world.level.chunk.status.ChunkStatus;
import net.minecraft.world.level.lighting.LevelLightEngine;
import org.bukkit.entity.Player;
public class CraftbukkitWrapper21 implements CraftbukkitWrapper.ICraftbukkitWrapper {
private static final Reflection.MethodInvoker getHandle = Reflection.getMethod("{obc}.CraftChunk", "getHandle", ChunkStatus.class);
private static final Reflection.MethodInvoker getLightEngine = Reflection.getTypedMethod(World.class, null, LevelLightEngine.class);
@Override
public void sendChunk(Player p, int chunkX, int chunkZ) {
Chunk chunk = (Chunk) getHandle.invoke(p.getWorld().getChunkAt(chunkX, chunkZ), ChunkStatus.n);
TinyProtocol.instance.sendPacket(p, new ClientboundLevelChunkWithLightPacket(chunk, (LevelLightEngine) getLightEngine.invoke(chunk.r), null, null, true));
}
}
@@ -0,0 +1,29 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import org.bukkit.Particle;
public class TrickyParticleWrapper21 implements TrickyParticleWrapper {
@Override
public Particle getVillagerHappy() {
return Particle.HAPPY_VILLAGER;
}
}
@@ -0,0 +1,43 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
public class TrickyTrialsWrapper21 implements TrickyTrialsWrapper {
@Override
public EntityType getTntEntityType() {
return EntityType.TNT;
}
@Override
public Enchantment getUnbreakingEnchantment() {
return Enchantment.UNBREAKING;
}
@Override
public Material getTurtleScute() {
return Material.TURTLE_SCUTE;
}
}
@@ -0,0 +1,125 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV2;
import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV3;
import com.sk89q.jnbt.NBTInputStream;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter;
import com.sk89q.worldedit.extent.clipboard.io.MCEditSchematicReader;
import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV1Reader;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.session.ClipboardHolder;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import org.enginehub.linbus.stream.LinBinaryIO;
import org.enginehub.linbus.stream.LinStream;
import org.enginehub.linbus.tree.LinCompoundTag;
import org.enginehub.linbus.tree.LinRootEntry;
import org.enginehub.linbus.tree.LinTagType;
import java.io.*;
public class WorldEditWrapper21 implements WorldEditWrapper {
@Override
public InputStream getPlayerClipboard(Player player, boolean schemFormat) {
return WorldEditWrapper.getPlayerClipboard(player, schemFormat, (outputStream, clipboard, clipboardHolder) -> {
ClipboardWriter writer = BuiltInClipboardFormat.FAST_V3.getWriter(outputStream);
writer.write(clipboard);
writer.close();
});
}
@Override
public void setPlayerClipboard(Player player, InputStream is, boolean schemFormat) {
Clipboard clipboard = null;
try {
clipboard = getClipboard(is, schemFormat);
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
if (clipboard == null)
throw new SecurityException("Clipboard is null");
Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player);
WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard));
}
@Override
public Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException {
if (!schemFormat) {
return new MCEditSchematicReader(new NBTInputStream(is)).read();
} else {
BufferedInputStream bis = new BufferedInputStream(is);
bis.mark(Integer.MAX_VALUE);
LinStream linStream = LinBinaryIO.read(new DataInputStream(bis));
LinCompoundTag entry = LinRootEntry.readFrom(linStream).value();
if (entry.value().size() == 1) {
entry = entry.getTag("Schematic", LinTagType.compoundTag());
}
bis.reset();
switch (entry.getTag("Version", LinTagType.intTag()).valueAsInt()) {
case 1:
return new SpongeSchematicV1Reader(entry.linStream()).read();
case 2:
return new FastSchematicReaderV2(new NBTInputStream(bis)).read();
case 3:
return new FastSchematicReaderV3(bis).read();
default:
throw new IOException("Unknown schematic version");
}
}
}
@Override
public org.bukkit.util.Vector getOrigin(Clipboard clipboard) {
return new org.bukkit.util.Vector(clipboard.getOrigin().x(), clipboard.getOrigin().y(), clipboard.getOrigin().z());
}
@Override
public Vector getMinimum(Region region) {
return new Vector(region.getMinimumPoint().x(), region.getMinimumPoint().y(), region.getMinimumPoint().z());
}
@Override
public Vector getMaximum(Region region) {
return new Vector(region.getMaximumPoint().x(), region.getMaximumPoint().y(), region.getMaximumPoint().z());
}
@Override
public Vector applyTransform(Vector vector, Transform transform) {
Vector3 v = Vector3.at(vector.getX(), vector.getY(), vector.getZ());
v = transform.apply(v);
return new org.bukkit.util.Vector(v.x(), v.y(), v.z());
}
}
@@ -25,6 +25,7 @@ import net.md_5.bungee.api.chat.BaseComponent;
import net.minecraft.server.v1_8_R3.ChatComponentText; import net.minecraft.server.v1_8_R3.ChatComponentText;
import net.minecraft.server.v1_8_R3.MathHelper; import net.minecraft.server.v1_8_R3.MathHelper;
import net.minecraft.server.v1_8_R3.PacketPlayOutChat; import net.minecraft.server.v1_8_R3.PacketPlayOutChat;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityTeleport;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -70,11 +71,15 @@ public class BountifulWrapper8 implements BountifulWrapper.IBountifulWrapper {
Reflection.FieldAccessor<Integer> posX = Reflection.getField(packetClass, int.class, fieldOffset); Reflection.FieldAccessor<Integer> posX = Reflection.getField(packetClass, int.class, fieldOffset);
Reflection.FieldAccessor<Integer> posY = Reflection.getField(packetClass, int.class, fieldOffset +1); Reflection.FieldAccessor<Integer> posY = Reflection.getField(packetClass, int.class, fieldOffset +1);
Reflection.FieldAccessor<Integer> posZ = Reflection.getField(packetClass, int.class, fieldOffset +2); Reflection.FieldAccessor<Integer> posZ = Reflection.getField(packetClass, int.class, fieldOffset +2);
Reflection.FieldAccessor<Byte> lookPitch = Reflection.getField(packetClass, byte.class, 0);
Reflection.FieldAccessor<Byte> lookYaw = Reflection.getField(packetClass, byte.class, 1);
return (packet, x, y, z) -> { return (packet, x, y, z, pitch, yaw) -> {
posX.set(packet, MathHelper.floor(x * 32)); posX.set(packet, MathHelper.floor(x * 32));
posY.set(packet, MathHelper.floor(y * 32)); posY.set(packet, MathHelper.floor(y * 32));
posZ.set(packet, MathHelper.floor(z * 32)); posZ.set(packet, MathHelper.floor(z * 32));
lookPitch.set(packet, (byte)(pitch * 256 / 360));
lookYaw.set(packet, (byte)(yaw * 256 / 360));
}; };
} }
@@ -83,11 +88,15 @@ public class BountifulWrapper8 implements BountifulWrapper.IBountifulWrapper {
Reflection.FieldAccessor<?> moveX = Reflection.getField(packetClass, "b", byte.class); Reflection.FieldAccessor<?> moveX = Reflection.getField(packetClass, "b", byte.class);
Reflection.FieldAccessor<?> moveY = Reflection.getField(packetClass, "c", byte.class); Reflection.FieldAccessor<?> moveY = Reflection.getField(packetClass, "c", byte.class);
Reflection.FieldAccessor<?> moveZ = Reflection.getField(packetClass, "d", byte.class); Reflection.FieldAccessor<?> moveZ = Reflection.getField(packetClass, "d", byte.class);
Reflection.FieldAccessor<Byte> lookYaw = Reflection.getField(packetClass, "e", byte.class);
Reflection.FieldAccessor<Byte> lookPitch = Reflection.getField(packetClass, "f", byte.class);
return (packet, x, y, z) -> { return (packet, x, y, z, pitch, yaw) -> {
moveX.set(packet, (byte)(x*32)); moveX.set(packet, (byte)(x*32));
moveY.set(packet, (byte)(y*32)); moveY.set(packet, (byte)(y*32));
moveZ.set(packet, (byte)(z*32)); moveZ.set(packet, (byte)(z*32));
lookYaw.set(packet, (byte)(yaw*256/360));
lookPitch.set(packet, (byte)(pitch*256/360));
}; };
} }
@@ -96,7 +96,7 @@ public class FlatteningWrapper8 implements FlatteningWrapper.IFlatteningWrapper
private static final Reflection.FieldAccessor<Integer> spawnLivingType = Reflection.getField(ProtocolWrapper.spawnLivingPacket, int.class, 1); private static final Reflection.FieldAccessor<Integer> spawnLivingType = Reflection.getField(ProtocolWrapper.spawnLivingPacket, int.class, 1);
private static final Map<EntityType, Object> types = new HashMap<>(); private static final Map<EntityType, Object> types = new HashMap<>();
static { static {
types.put(EntityType.PRIMED_TNT, 50); types.put(TrickyTrialsWrapper.impl.getTntEntityType(), 50);
types.put(EntityType.ARMOR_STAND, 30); types.put(EntityType.ARMOR_STAND, 30);
types.put(EntityType.ARROW, 60); types.put(EntityType.ARROW, 60);
types.put(EntityType.FIREBALL, 63); types.put(EntityType.FIREBALL, 63);
@@ -0,0 +1,43 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
public class TrickyTrialsWrapper8 implements TrickyTrialsWrapper {
@Override
public EntityType getTntEntityType() {
return EntityType.PRIMED_TNT;
}
@Override
public Enchantment getUnbreakingEnchantment() {
return Enchantment.DURABILITY;
}
@Override
public Material getTurtleScute() {
return Material.STONE;
}
}
@@ -23,7 +23,6 @@ import com.google.common.base.Preconditions;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.sk89q.jnbt.*; import com.sk89q.jnbt.*;
import com.sk89q.worldedit.*; import com.sk89q.worldedit.*;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.bukkit.BukkitWorld;
import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.input.ParserContext;
@@ -33,54 +32,27 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader; import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader;
import com.sk89q.worldedit.extent.clipboard.io.SchematicReader; import com.sk89q.worldedit.extent.clipboard.io.SchematicReader;
import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.world.registry.WorldData; import com.sk89q.worldedit.world.registry.WorldData;
import de.steamwar.sql.NoClipboardException;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.io.*; import java.io.IOException;
import java.util.*; import java.io.InputStream;
import java.util.logging.Level; import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class WorldEditWrapper8 implements WorldEditWrapper.IWorldEditWrapper { public class WorldEditWrapper8 implements WorldEditWrapper {
@Override @Override
public InputStream getPlayerClipboard(Player player, boolean schemFormat) { public InputStream getPlayerClipboard(Player player, boolean schemFormat) {
ClipboardHolder clipboardHolder; return WorldEditWrapper.getPlayerClipboard(player, schemFormat, (outputStream, clipboard, clipboardHolder) ->
try { ClipboardFormat.SCHEMATIC.getWriter(outputStream).write(clipboard, clipboardHolder.getWorldData()));
clipboardHolder = WorldEditWrapper.getWorldEditPlugin().getSession(player).getClipboard();
} catch (EmptyClipboardException e) {
throw new NoClipboardException();
}
Clipboard clipboard = clipboardHolder.getClipboard();
if(clipboard == null)
throw new NoClipboardException();
PipedOutputStream outputStream = new PipedOutputStream();
PipedInputStream inputStream;
try {
inputStream = new PipedInputStream(outputStream, 4096);
} catch (IOException e) {
throw new SecurityException("Could not init piped input stream", e);
}
new Thread(() -> {
try {
ClipboardFormat.SCHEMATIC.getWriter(outputStream).write(clipboard, clipboardHolder.getWorldData());
} catch (IOException e) {
Core.getInstance().getLogger().log(Level.SEVERE, "Could not write schematic", e);
}
try {
outputStream.close();
} catch (IOException e) {
Core.getInstance().getLogger().log(Level.SEVERE, "Could not close schem writer", e);
}
}, "SchemWriter").start();
return inputStream;
} }
@Override @Override
@@ -105,6 +77,28 @@ public class WorldEditWrapper8 implements WorldEditWrapper.IWorldEditWrapper {
return new SchematicReader(new NBTInputStream(is)).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData()); return new SchematicReader(new NBTInputStream(is)).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData());
} }
@Override
public org.bukkit.util.Vector getOrigin(Clipboard clipboard) {
return new org.bukkit.util.Vector(clipboard.getOrigin().getX(), clipboard.getOrigin().getY(), clipboard.getOrigin().getZ());
}
@Override
public org.bukkit.util.Vector getMinimum(Region region) {
return new org.bukkit.util.Vector(region.getMinimumPoint().getX(), region.getMinimumPoint().getY(), region.getMinimumPoint().getZ());
}
@Override
public org.bukkit.util.Vector getMaximum(Region region) {
return new org.bukkit.util.Vector(region.getMaximumPoint().getX(), region.getMaximumPoint().getY(), region.getMaximumPoint().getZ());
}
@Override
public org.bukkit.util.Vector applyTransform(org.bukkit.util.Vector vector, Transform transform) {
Vector v = new Vector(vector.getX(), vector.getY(), vector.getZ());
v = transform.apply(v);
return new org.bukkit.util.Vector(v.getX(), v.getY(), v.getZ());
}
private static class SpongeSchematicReader implements ClipboardReader { private static class SpongeSchematicReader implements ClipboardReader {
private final NBTInputStream inputStream; private final NBTInputStream inputStream;
@@ -23,6 +23,7 @@ import com.comphenix.tinyprotocol.Reflection;
import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.Via;
import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.BaseComponent;
import net.minecraft.server.v1_9_R2.PacketPlayOutEntity;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -64,11 +65,22 @@ public class BountifulWrapper9 implements BountifulWrapper.IBountifulWrapper {
Reflection.FieldAccessor<Double> posX = Reflection.getField(packetClass, double.class, fieldOffset); Reflection.FieldAccessor<Double> posX = Reflection.getField(packetClass, double.class, fieldOffset);
Reflection.FieldAccessor<Double> posY = Reflection.getField(packetClass, double.class, fieldOffset+1); Reflection.FieldAccessor<Double> posY = Reflection.getField(packetClass, double.class, fieldOffset+1);
Reflection.FieldAccessor<Double> posZ = Reflection.getField(packetClass, double.class, fieldOffset+2); Reflection.FieldAccessor<Double> posZ = Reflection.getField(packetClass, double.class, fieldOffset+2);
boolean isByteClass = packetClass.getSimpleName().contains("PacketPlayOutEntityTeleport") || packetClass.getSimpleName().contains("PacketPlayOutNamedEntitySpawn");
Class<?> pitchYawType = isByteClass ? byte.class : int.class;
Reflection.FieldAccessor<?> lookPitch = Reflection.getField(packetClass, pitchYawType, isByteClass ? 0 : 1);
Reflection.FieldAccessor<?> lookYaw = Reflection.getField(packetClass, pitchYawType, isByteClass ? 1 : 2);
return (packet, x, y, z) -> { return (packet, x, y, z, pitch, yaw) -> {
posX.set(packet, x); posX.set(packet, x);
posY.set(packet, y); posY.set(packet, y);
posZ.set(packet, z); posZ.set(packet, z);
if (isByteClass) {
lookPitch.set(packet, (byte) (pitch*256/360));
lookYaw.set(packet, (byte) (yaw*256/360));
} else {
lookPitch.set(packet, (int) (pitch*256/360));
lookYaw.set(packet, (int) (yaw*256/360));
}
}; };
} }
@@ -78,11 +90,15 @@ public class BountifulWrapper9 implements BountifulWrapper.IBountifulWrapper {
Reflection.FieldAccessor<?> moveX = Reflection.getField(packetClass, "b", type); Reflection.FieldAccessor<?> moveX = Reflection.getField(packetClass, "b", type);
Reflection.FieldAccessor<?> moveY = Reflection.getField(packetClass, "c", type); Reflection.FieldAccessor<?> moveY = Reflection.getField(packetClass, "c", type);
Reflection.FieldAccessor<?> moveZ = Reflection.getField(packetClass, "d", type); Reflection.FieldAccessor<?> moveZ = Reflection.getField(packetClass, "d", type);
Reflection.FieldAccessor<Byte> movePitch = Reflection.getField(packetClass, "e", byte.class);
Reflection.FieldAccessor<Byte> moveYaw = Reflection.getField(packetClass, "f", byte.class);
return (packet, x, y, z) -> { return (packet, x, y, z, pitch, yaw) -> {
moveX.set(packet, (short)(x*4096)); moveX.set(packet, (short)(x*4096));
moveY.set(packet, (short)(y*4096)); moveY.set(packet, (short)(y*4096));
moveZ.set(packet, (short)(z*4096)); moveZ.set(packet, (short)(z*4096));
movePitch.set(packet, (byte)(pitch*256/360));
moveYaw.set(packet, (byte)(yaw*256/360));
}; };
} }
@@ -0,0 +1,29 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import org.bukkit.Particle;
public class TrickyParticleWrapper9 implements TrickyParticleWrapper {
@Override
public Particle getVillagerHappy() {
return Particle.VILLAGER_HAPPY;
}
}
@@ -44,7 +44,7 @@ public class BountifulWrapper {
} }
public interface PositionSetter { public interface PositionSetter {
void set(Object packet, double x, double y, double z); void set(Object packet, double x, double y, double z, float pitch, float yaw);
} }
public interface UUIDSetter { public interface UUIDSetter {
@@ -106,6 +106,9 @@ public class Core extends JavaPlugin{
if(Core.getVersion() >= 19) if(Core.getVersion() >= 19)
new ServerDataHandler(); new ServerDataHandler();
if(Core.getVersion() > 8 && Bukkit.getPluginManager().getPlugin("WorldEdit") != null)
new WorldEditRenderer();
Bukkit.getScheduler().runTaskTimer(this, TabCompletionCache::invalidateOldEntries, 20, 20); Bukkit.getScheduler().runTaskTimer(this, TabCompletionCache::invalidateOldEntries, 20, 20);
Bukkit.getScheduler().runTaskTimer(Core.getInstance(), SteamwarUser::clear, 72000, 72000); Bukkit.getScheduler().runTaskTimer(Core.getInstance(), SteamwarUser::clear, 72000, 72000);
Bukkit.getScheduler().runTaskTimer(Core.getInstance(), SchematicNode::clear, 20L * 30, 20L * 30); Bukkit.getScheduler().runTaskTimer(Core.getInstance(), SchematicNode::clear, 20L * 30, 20L * 30);
@@ -0,0 +1,28 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import org.bukkit.Particle;
public interface TrickyParticleWrapper {
public TrickyParticleWrapper impl = VersionDependent.getVersionImpl(Core.getInstance());
Particle getVillagerHappy();
}
@@ -0,0 +1,36 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
public interface TrickyTrialsWrapper {
TrickyTrialsWrapper impl = VersionDependent.getVersionImpl(Core.getInstance());
EntityType getTntEntityType();
Enchantment getUnbreakingEnchantment();
Material getTurtleScute();
}
@@ -0,0 +1,126 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.core;
import com.sk89q.worldedit.EmptyClipboardException;
import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.world.World;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
public class WorldEditRenderer {
private static final int VIEW_DISTANCE = 64;
private static final int SQ_VIEW_DISTANCE = VIEW_DISTANCE * VIEW_DISTANCE;
private static final double STEP_SIZE = 0.5;
private static final Vector ONES = new Vector(1, 1, 1);
private static final Material WAND = FlatteningWrapper.impl.getMaterial("WOOD_AXE");
private final WorldEditPlugin we;
public WorldEditRenderer() {
we = WorldEditWrapper.getWorldEditPlugin();
Bukkit.getScheduler().runTaskTimer(Core.getInstance(), this::render, 20, 20);
}
private void render() {
for(Player player : Bukkit.getOnlinePlayers()) {
//noinspection deprecation
if(player.getItemInHand().getType() != WAND)
continue;
LocalSession session = we.getSession(player);
try {
Clipboard clipboard = session.getClipboard().getClipboard();
Vector pos = player.getLocation().toVector();
Region region = clipboard.getRegion();
Transform transform = session.getClipboard().getTransform();
Vector a = WorldEditWrapper.impl.applyTransform(WorldEditWrapper.impl.getMinimum(region).subtract(WorldEditWrapper.impl.getOrigin(clipboard)), transform).add(pos);
Vector b = WorldEditWrapper.impl.applyTransform(WorldEditWrapper.impl.getMaximum(region).subtract(WorldEditWrapper.impl.getOrigin(clipboard)), transform).add(pos);
drawCuboid(Vector.getMinimum(a, b), Vector.getMaximum(a, b), TrickyParticleWrapper.impl.getVillagerHappy(), player);
} catch (EmptyClipboardException e) {
//ignore
}
World world = session.getSelectionWorld();
if(world != null) {
RegionSelector regionSelector = session.getRegionSelector(world);
try {
Region region = regionSelector.getRegion();
drawCuboid(WorldEditWrapper.impl.getMinimum(region), WorldEditWrapper.impl.getMaximum(region), Particle.DRAGON_BREATH, player);
} catch (IncompleteRegionException e) {
//ignore
}
}
}
}
private void drawCuboid(Vector min, Vector max, Particle particle, Player owner) {
max.add(ONES);
for(double x = min.getBlockX(); x <= max.getBlockX(); x += STEP_SIZE) {
draw(x, min.getBlockY(), min.getBlockZ(), particle, owner);
draw(x, min.getBlockY(), max.getBlockZ(), particle, owner);
draw(x, max.getBlockY(), min.getBlockZ(), particle, owner);
draw(x, max.getBlockY(), max.getBlockZ(), particle, owner);
}
for(double y = min.getBlockY() + STEP_SIZE; y <= max.getBlockY() - STEP_SIZE; y += STEP_SIZE) {
draw(min.getBlockX(), y, min.getBlockZ(), particle, owner);
draw(min.getBlockX(), y, max.getBlockZ(), particle, owner);
draw(max.getBlockX(), y, min.getBlockZ(), particle, owner);
draw(max.getBlockX(), y, max.getBlockZ(), particle, owner);
}
for(double z = min.getBlockZ() + STEP_SIZE; z <= max.getBlockZ() - STEP_SIZE; z += STEP_SIZE) {
draw(min.getBlockX(), min.getBlockY(), z, particle, owner);
draw(min.getBlockX(), max.getBlockY(), z, particle, owner);
draw(max.getBlockX(), min.getBlockY(), z, particle, owner);
draw(max.getBlockX(), max.getBlockY(), z, particle, owner);
}
}
private void draw(double x, double y, double z, Particle particle, Player owner) {
for(Player player : Bukkit.getOnlinePlayers()) {
Location location = player.getLocation();
double dx = x - location.getX();
double dy = y - location.getY();
double dz = z - location.getZ();
if(dx*dx + dy*dy + dz*dz > SQ_VIEW_DISTANCE)
continue;
player.spawnParticle(player == owner ? particle : Particle.TOWN_AURA, x, y, z, 1, 0.0, 0.0, 0.0, 0.0);
}
}
}
@@ -19,26 +19,73 @@
package de.steamwar.core; package de.steamwar.core;
import com.sk89q.worldedit.EmptyClipboardException;
import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.session.ClipboardHolder;
import de.steamwar.sql.NoClipboardException;
import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.regions.Region;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import java.io.IOException; import java.io.*;
import java.io.InputStream; import java.util.logging.Level;
public class WorldEditWrapper { public interface WorldEditWrapper {
private WorldEditWrapper() {} WorldEditWrapper impl = VersionDependent.getVersionImpl(Core.getInstance());
public static final IWorldEditWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); InputStream getPlayerClipboard(Player player, boolean schemFormat);
void setPlayerClipboard(Player player, InputStream is, boolean schemFormat);
Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException;
public interface IWorldEditWrapper { Vector getOrigin(Clipboard clipboard);
InputStream getPlayerClipboard(Player player, boolean schemFormat); Vector getMinimum(Region region);
void setPlayerClipboard(Player player, InputStream is, boolean schemFormat); Vector getMaximum(Region region);
Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException; Vector applyTransform(Vector vector, Transform transform);
}
public static WorldEditPlugin getWorldEditPlugin() { static WorldEditPlugin getWorldEditPlugin() {
return (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"); return (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit");
} }
public static InputStream getPlayerClipboard(Player player, boolean schemFormat, SchematicWriter consumer) {
ClipboardHolder clipboardHolder;
try {
clipboardHolder = WorldEditWrapper.getWorldEditPlugin().getSession(player).getClipboard();
} catch (EmptyClipboardException e) {
throw new NoClipboardException();
}
Clipboard clipboard = clipboardHolder.getClipboard();
if(clipboard == null)
throw new NoClipboardException();
PipedOutputStream outputStream = new PipedOutputStream();
PipedInputStream inputStream;
try {
inputStream = new PipedInputStream(outputStream, 4096);
} catch (IOException e) {
throw new SecurityException("Could not init piped input stream", e);
}
new Thread(() -> {
try {
consumer.write(outputStream, clipboard, clipboardHolder);
} catch (Exception e) {
Core.getInstance().getLogger().log(Level.SEVERE, "Could not write schematic", e);
}
try {
outputStream.close();
} catch (IOException e) {
Core.getInstance().getLogger().log(Level.SEVERE, "Could not close schem writer", e);
}
}, "SchemWriter").start();
return inputStream;
}
public static interface SchematicWriter {
void write(OutputStream outputStream, Clipboard clipboard, ClipboardHolder holder) throws IOException;
}
} }
@@ -393,25 +393,19 @@ public class REntity {
return ChatWrapper.impl.getDataWatcherPacket(entityId, dataWatcherKeyValues); return ChatWrapper.impl.getDataWatcherPacket(entityId, dataWatcherKeyValues);
} }
private static final Class<?> teleportPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntityTeleport"); public static final Class<?> teleportPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntityTeleport");
private static final Reflection.FieldAccessor<Integer> teleportEntity = Reflection.getField(teleportPacket, int.class, 0); public static final Reflection.FieldAccessor<Integer> teleportEntity = Reflection.getField(teleportPacket, int.class, 0);
private static final BountifulWrapper.PositionSetter teleportPosition = BountifulWrapper.impl.getPositionSetter(teleportPacket, Core.getVersion() == 8 ? 1 : 0); public static final BountifulWrapper.PositionSetter teleportPosition = BountifulWrapper.impl.getPositionSetter(teleportPacket, Core.getVersion() == 8 ? 1 : 0);
private static final Reflection.FieldAccessor<Byte> teleportYaw = Reflection.getField(teleportPacket, byte.class, 0);
private static final Reflection.FieldAccessor<Byte> teleportPitch = Reflection.getField(teleportPacket, byte.class, 1);
private Object getTeleportPacket(){ private Object getTeleportPacket(){
Object packet = Reflection.newInstance(teleportPacket); Object packet = Reflection.newInstance(teleportPacket);
teleportEntity.set(packet, entityId); teleportEntity.set(packet, entityId);
teleportPosition.set(packet, x, y, z); teleportPosition.set(packet, x, y, z, pitch, yaw);
teleportYaw.set(packet, yaw);
teleportPitch.set(packet, pitch);
return packet; return packet;
} }
private static final Class<?> entityPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntity"); private static final Class<?> entityPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntity");
private static final Reflection.FieldAccessor<Integer> moveEntityId = Reflection.getField(entityPacket, int.class, 0); private static final Reflection.FieldAccessor<Integer> moveEntityId = Reflection.getField(entityPacket, int.class, 0);
private static final BountifulWrapper.PositionSetter movePosition = BountifulWrapper.impl.getRelMoveSetter(entityPacket); private static final BountifulWrapper.PositionSetter movePosition = BountifulWrapper.impl.getRelMoveSetter(entityPacket);
private static final Reflection.FieldAccessor<Byte> lookYaw = Reflection.getField(entityPacket, "e", byte.class);
private static final Reflection.FieldAccessor<Byte> lookPitch = Reflection.getField(entityPacket, "f", byte.class);
private static final Class<?> lookPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntity$PacketPlayOutEntityLook"); private static final Class<?> lookPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntity$PacketPlayOutEntityLook");
private static final Class<?> movePacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntity$PacketPlayOutRelEntityMove"); private static final Class<?> movePacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntity$PacketPlayOutRelEntityMove");
private static final Class<?> moveLookPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntity$PacketPlayOutRelEntityMoveLook"); private static final Class<?> moveLookPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutEntity$PacketPlayOutRelEntityMoveLook");
@@ -430,9 +424,7 @@ public class REntity {
Object packet = Reflection.newInstance(clazz); Object packet = Reflection.newInstance(clazz);
moveEntityId.set(packet, entityId); moveEntityId.set(packet, entityId);
movePosition.set(packet, diffX, diffY, diffZ); movePosition.set(packet, diffX, diffY, diffZ, pitch, yaw);
lookYaw.set(packet, yaw);
lookPitch.set(packet, pitch);
return packet; return packet;
} }
@@ -476,7 +468,7 @@ public class REntity {
return entity -> { return entity -> {
Object packet = Reflection.newInstance(spawnPacket); Object packet = Reflection.newInstance(spawnPacket);
entityId.set(packet, entity.entityId); entityId.set(packet, entity.entityId);
position.set(packet, entity.x, entity.y, entity.z); position.set(packet, entity.x, entity.y, entity.z, entity.pitch, entity.yaw);
return packet; return packet;
}; };
} }
@@ -20,6 +20,7 @@
package de.steamwar.inventory; package de.steamwar.inventory;
import de.steamwar.core.Core; import de.steamwar.core.Core;
import de.steamwar.core.TrickyTrialsWrapper;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -21,7 +21,10 @@ package de.steamwar.inventory;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import de.steamwar.core.Core;
import de.steamwar.core.FlatteningWrapper; import de.steamwar.core.FlatteningWrapper;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.core.VersionDependent;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
@@ -30,6 +33,8 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List; import java.util.List;
public class SWItem { public class SWItem {
@@ -107,7 +112,7 @@ public class SWItem {
itemMeta.setDisplayName(name); itemMeta.setDisplayName(name);
if (lore != null && !lore.isEmpty()) itemMeta.setLore(lore); if (lore != null && !lore.isEmpty()) itemMeta.setLore(lore);
if (enchanted) itemMeta.addEnchant(Enchantment.DURABILITY , 10, true); if (enchanted) itemMeta.addEnchant(TrickyTrialsWrapper.impl.getUnbreakingEnchantment(), 10, true);
itemStack.setItemMeta(itemMeta); itemStack.setItemMeta(itemMeta);
} }
callback = c; callback = c;
@@ -144,12 +149,9 @@ public class SWItem {
private void hideAttributes() { private void hideAttributes() {
if (itemMeta == null) return; if (itemMeta == null) return;
itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); for (ItemFlag flag : EnumSet.allOf(ItemFlag.class)) {
itemMeta.addItemFlags(ItemFlag.HIDE_DESTROYS); itemMeta.addItemFlags(flag);
itemMeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); }
itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
itemMeta.addItemFlags(ItemFlag.HIDE_PLACED_ON);
itemMeta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
} }
public ItemStack getItemStack() { public ItemStack getItemStack() {
@@ -192,9 +194,9 @@ public class SWItem {
public void setEnchanted(boolean enchanted) { public void setEnchanted(boolean enchanted) {
if (enchanted){ if (enchanted){
itemMeta.addEnchant(Enchantment.DURABILITY , 10, true); itemMeta.addEnchant(TrickyTrialsWrapper.impl.getUnbreakingEnchantment() , 10, true);
} else { } else {
itemMeta.removeEnchant(Enchantment.DURABILITY); itemMeta.removeEnchant(TrickyTrialsWrapper.impl.getUnbreakingEnchantment());
} }
itemStack.setItemMeta(itemMeta); itemStack.setItemMeta(itemMeta);
} }
@@ -21,7 +21,8 @@ package de.steamwar.inventory;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.internal.Streams;
import com.google.gson.stream.JsonReader;
import de.steamwar.core.Core; import de.steamwar.core.Core;
import de.steamwar.sql.*; import de.steamwar.sql.*;
import lombok.*; import lombok.*;
@@ -29,6 +30,7 @@ import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.io.StringReader;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@@ -381,7 +383,7 @@ public class SchematicSelector {
String cfg = UserConfig.getConfig(user.getId(), "selector:filters"); String cfg = UserConfig.getConfig(user.getId(), "selector:filters");
if (cfg != null) { if (cfg != null) {
JsonArray array = JsonParser.parseString(cfg).getAsJsonArray(); JsonArray array = Streams.parse(new JsonReader(new StringReader(cfg))).getAsJsonArray();
for (int i = 0; i < array.size(); i++) { for (int i = 0; i < array.size(); i++) {
JsonObject object = array.get(i).getAsJsonObject(); JsonObject object = array.get(i).getAsJsonObject();
filterCache.get(player)[i] = new SelectorFilter(object); filterCache.get(player)[i] = new SelectorFilter(object);
@@ -20,6 +20,7 @@
package de.steamwar.teamserver.listener; package de.steamwar.teamserver.listener;
import de.steamwar.core.Core; import de.steamwar.core.Core;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.teamserver.Builder; import de.steamwar.teamserver.Builder;
import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.BaseComponent;
@@ -55,7 +56,7 @@ public class FreezeListener implements Listener {
public void onEntitySpawn(EntitySpawnEvent e) { public void onEntitySpawn(EntitySpawnEvent e) {
if (!freeze) return; if (!freeze) return;
e.setCancelled(true); e.setCancelled(true);
if (e.getEntityType() == EntityType.PRIMED_TNT) { if (e.getEntityType() == TrickyTrialsWrapper.impl.getTntEntityType()) {
Bukkit.getScheduler().runTaskLater(Builder.getInstance(), () -> { Bukkit.getScheduler().runTaskLater(Builder.getInstance(), () -> {
e.getLocation().getBlock().setType(Material.TNT, false); e.getLocation().getBlock().setType(Material.TNT, false);
}, 1L); }, 1L);
@@ -29,6 +29,7 @@ import de.steamwar.towerrun.state.GameStates;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
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.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
@@ -83,14 +84,16 @@ public class IngameListener extends GameStateBukkitListener {
.min(Comparator.comparing(Function.identity())) .min(Comparator.comparing(Function.identity()))
.orElse(0.0); .orElse(0.0);
List<Player> toDamage = new ArrayList<>();
TowerRunGame.PLAYERS_ALIVE.forEach(towerRunPlayer -> { TowerRunGame.PLAYERS_ALIVE.forEach(towerRunPlayer -> {
if (towerRunPlayer.player().getLocation().getY() - minY > 20) { if (towerRunPlayer.player().getLocation().getY() - minY > 20) {
towerRunPlayer.player().sendTitle("§a", TowerRun.getMessage().parse("CATCH_UP_WARNING", towerRunPlayer.player()), 5, 30, 5); towerRunPlayer.player().sendTitle("§a", TowerRun.getMessage().parse("CATCH_UP_WARNING", towerRunPlayer.player()), 5, 30, 5);
} }
if (towerRunPlayer.player().getLocation().getY() - minY > 30) { if (towerRunPlayer.player().getLocation().getY() - minY > 30) {
towerRunPlayer.player().damage(1.0); toDamage.add(towerRunPlayer.player());
} }
}); });
toDamage.forEach(p -> p.damage(1.0));
} }
}; };
antiCampRunnable.runTaskTimer(TowerRun.getInstance(), 100, 100); antiCampRunnable.runTaskTimer(TowerRun.getInstance(), 100, 100);
@@ -26,9 +26,9 @@ import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.ServerConnection;
import de.steamwar.persistent.Servertype; import de.steamwar.persistent.Servertype;
import de.steamwar.persistent.Subserver; import de.steamwar.persistent.Subserver;
import de.steamwar.velocitycore.VelocityCore;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserPerm; import de.steamwar.sql.UserPerm;
import de.steamwar.velocitycore.VelocityCore;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.event.HoverEvent;
@@ -47,6 +47,7 @@ import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
public interface Chatter { public interface Chatter {
LegacyComponentSerializer SERIALIZER = LegacyComponentSerializer.builder().extractUrls().build();
static Stream<Player> allPlayers() { static Stream<Player> allPlayers() {
return VelocityCore.getProxy().getAllPlayers().stream(); return VelocityCore.getProxy().getAllPlayers().stream();
@@ -138,7 +139,7 @@ public interface Chatter {
} }
default String parseToLegacy(Message message) { default String parseToLegacy(Message message) {
return LegacyComponentSerializer.legacySection().serialize(parse(message)); return SERIALIZER.serialize(parse(message));
} }
default Component parse(String format, Object... params) { default Component parse(String format, Object... params) {
@@ -178,7 +179,7 @@ public interface Chatter {
params[i] = func.apply(this); params[i] = func.apply(this);
} }
} }
return LegacyComponentSerializer.legacySection().deserialize(format.format(params)); return SERIALIZER.deserialize(format.format(params));
} }
static PlayerChatter of(Player player) { static PlayerChatter of(Player player) {
@@ -31,11 +31,16 @@ public enum ServerVersion {
SPIGOT_12("spigot-1.12.2.jar", 12), SPIGOT_12("spigot-1.12.2.jar", 12),
SPIGOT_15("spigot-1.15.2.jar", 15), SPIGOT_15("spigot-1.15.2.jar", 15),
PAPER_19("paper-1.19.3.jar", 19), PAPER_19("paper-1.19.3.jar", 19),
PAPER_20("paper-1.20.1.jar", 20); PAPER_20("paper-1.20.1.jar", 20),
PAPER_21("paper-1.21.jar", 21);
private static final Map<String, ServerVersion> chatMap = new HashMap<>(); private static final Map<String, ServerVersion> chatMap = new HashMap<>();
static { static {
chatMap.put("21", ServerVersion.PAPER_21);
chatMap.put("1.21", ServerVersion.PAPER_21);
chatMap.put("1.21.3", ServerVersion.PAPER_21);
chatMap.put("20", ServerVersion.PAPER_20); chatMap.put("20", ServerVersion.PAPER_20);
chatMap.put("1.20", ServerVersion.PAPER_20); chatMap.put("1.20", ServerVersion.PAPER_20);
chatMap.put("1.20.1", ServerVersion.PAPER_20); chatMap.put("1.20.1", ServerVersion.PAPER_20);
@@ -47,7 +47,7 @@ public class SubserverSystem {
Chatter o = Chatter.of(owner); Chatter o = Chatter.of(owner);
o.system("SERVER_ADD_MEMBER", p); o.system("SERVER_ADD_MEMBER", p);
o.prefixless("SERVER_ADD_MESSAGE", new Message("SERVER_ADD_MESSAGE_HOVER"), ClickEvent.runCommand("/bau addmember " + p.user().getUserName())); o.prefixless("SERVER_ADD_MESSAGE", new Message("SERVER_ADD_MESSAGE_HOVER", p.user().getUserName()), ClickEvent.runCommand("/bau addmember " + p.user().getUserName()));
} }
public static void sendPlayer(Subserver subserver, Player player) { public static void sendPlayer(Subserver subserver, Player player) {
@@ -272,12 +272,13 @@ public class CheckCommand extends SWCommand {
} }
private boolean concludeCheckSession(String reason, SchematicType type) { private boolean concludeCheckSession(String reason, SchematicType type) {
if(SchematicNode.getSchematicNode(schematic.getId()) == null) // Schematic was deleted boolean exists = SchematicNode.getSchematicNode(schematic.getId()) != null;
return false;
CheckedSchematic.create(schematic, checker.user().getId(), startTime, Timestamp.from(Instant.now()), reason); if(exists) {
if(type != null) CheckedSchematic.create(schematic, checker.user().getId(), startTime, Timestamp.from(Instant.now()), reason);
schematic.setSchemtype(type); if(type != null)
schematic.setSchemtype(type);
}
remove(); remove();
VelocityCore.schedule(() -> { VelocityCore.schedule(() -> {
@@ -285,7 +286,7 @@ public class CheckCommand extends SWCommand {
if(subserver != null) if(subserver != null)
subserver.stop(); subserver.stop();
}).schedule(); }).schedule();
return true; return exists;
} }
private void remove() { private void remove() {
@@ -70,7 +70,7 @@ public class SendCommand extends SWCommand {
public RegisteredServer map(Chatter sender, PreviousArguments previousArguments, String s) { public RegisteredServer map(Chatter sender, PreviousArguments previousArguments, String s) {
SteamwarUser user = sender.user(); SteamwarUser user = sender.user();
for (RegisteredServer registeredServer : VelocityCore.getProxy().getAllServers()) { for (RegisteredServer registeredServer : VelocityCore.getProxy().getAllServers()) {
if (check(user, registeredServer)) { if (registeredServer.getServerInfo().getName().equalsIgnoreCase(s) && check(user, registeredServer)) {
return registeredServer; return registeredServer;
} }
} }
@@ -20,18 +20,17 @@
package de.steamwar.velocitycore.mods; package de.steamwar.velocitycore.mods;
import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.Player;
import de.steamwar.sql.Punishment;
import de.steamwar.velocitycore.VelocityCore;
import de.steamwar.velocitycore.commands.PunishmentCommand;
import de.steamwar.messages.Chatter; import de.steamwar.messages.Chatter;
import de.steamwar.sql.Mod; import de.steamwar.sql.Mod;
import de.steamwar.sql.Mod.ModType; import de.steamwar.sql.Mod.ModType;
import de.steamwar.sql.Punishment;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserPerm; import de.steamwar.sql.UserPerm;
import de.steamwar.velocitycore.VelocityCore;
import de.steamwar.velocitycore.commands.PunishmentCommand;
import lombok.Getter; import lombok.Getter;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.Instant; import java.time.Instant;
@@ -88,7 +87,7 @@ public class ModUtils {
VelocityCore.getLogger().log(Level.SEVERE, "%s %s wurde automatisch wegen der Mods %s gebannt.".formatted(user.getUserName(), user.getId(), modList)); VelocityCore.getLogger().log(Level.SEVERE, "%s %s wurde automatisch wegen der Mods %s gebannt.".formatted(user.getUserName(), user.getId(), modList));
} }
disconnect.accept(LegacyComponentSerializer.legacySection().deserialize(message)); disconnect.accept(Chatter.SERIALIZER.deserialize(message));
return false; return false;
} }
} }
@@ -20,6 +20,7 @@
package de.steamwar.velocitycore.network.handlers; package de.steamwar.velocitycore.network.handlers;
import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.Player;
import de.steamwar.messages.Chatter;
import de.steamwar.network.packets.PacketHandler; import de.steamwar.network.packets.PacketHandler;
import de.steamwar.network.packets.common.FightEndsPacket; import de.steamwar.network.packets.common.FightEndsPacket;
import de.steamwar.sql.SchematicType; import de.steamwar.sql.SchematicType;
@@ -29,7 +30,6 @@ import de.steamwar.velocitycore.ArenaMode;
import de.steamwar.velocitycore.VelocityCore; import de.steamwar.velocitycore.VelocityCore;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.kyori.adventure.title.Title; import net.kyori.adventure.title.Title;
import java.time.Duration; import java.time.Duration;
@@ -186,10 +186,10 @@ public class EloPlayerHandler extends PacketHandler {
double eloStep = eloGain / 40.0; double eloStep = eloGain / 40.0;
for (int i = 0; i < 40; i++) { for (int i = 0; i < 40; i++) {
Component eloGainComponent = LegacyComponentSerializer.legacySection().deserialize(color + (int) (eloStep * (i + 1))); Component eloGainComponent = Chatter.SERIALIZER.deserialize(color + (int) (eloStep * (i + 1)));
int finalI = i; int finalI = i;
VelocityCore.schedule(() -> player.showTitle(Title.title( VelocityCore.schedule(() -> player.showTitle(Title.title(
LegacyComponentSerializer.legacySection().deserialize(getRankup.apply(finalI)), Chatter.SERIALIZER.deserialize(getRankup.apply(finalI)),
eloGainComponent, eloGainComponent,
Title.Times.times(Duration.ofMillis(finalI == 0 ? 250 : 0), Duration.ofSeconds(2), Duration.ofMillis(finalI == 39 ? 250 : 0)) Title.Times.times(Duration.ofMillis(finalI == 0 ? 250 : 0), Duration.ofSeconds(2), Duration.ofMillis(finalI == 39 ? 250 : 0))
))).delay(i * 50L, TimeUnit.MILLISECONDS).schedule(); ))).delay(i * 50L, TimeUnit.MILLISECONDS).schedule();
@@ -142,8 +142,10 @@ public class Tablist extends ChannelInboundHandlerAdapter {
} }
public void onServerPostSwitch() { public void onServerPostSwitch() {
if(player.getProtocolVersion().greaterThan(ProtocolVersion.MINECRAFT_1_20)) { if(player.getProtocolVersion().noLessThan(ProtocolVersion.MINECRAFT_1_20)) {
current.clear(); if(player.getProtocolVersion().greaterThan(ProtocolVersion.MINECRAFT_1_20))
current.clear();
sendPacket(player, createTeamPacket); sendPacket(player, createTeamPacket);
} }
} }
@@ -55,7 +55,7 @@ public class TablistManager extends BasicListener {
public TablistManager() { public TablistManager() {
VelocityCore.schedule(this::updateTablist).repeat(1, TimeUnit.SECONDS).schedule(); VelocityCore.schedule(this::updateTablist).repeat(1, TimeUnit.SECONDS).schedule();
synchronized (tablists) { synchronized (tablists) {
VelocityCore.getProxy().getAllPlayers().forEach(player -> tablists.put(player, new Tablist(player))); VelocityCore.getProxy().getAllPlayers().forEach(player -> tablists.computeIfAbsent(player, Tablist::new).onServerSwitch());
} }
} }
@@ -65,7 +65,7 @@ public class TablistManager extends BasicListener {
tablists.computeIfAbsent(event.getPlayer(), Tablist::new).onServerSwitch(); tablists.computeIfAbsent(event.getPlayer(), Tablist::new).onServerSwitch();
} }
if(event.getPlayer().getProtocolVersion().noGreaterThan(ProtocolVersion.MINECRAFT_1_20)) if(event.getPlayer().getProtocolVersion().lessThan(ProtocolVersion.MINECRAFT_1_20))
Tablist.sendPacket(event.getPlayer(), Tablist.createTeamPacket); Tablist.sendPacket(event.getPlayer(), Tablist.createTeamPacket);
} }
@@ -26,7 +26,6 @@ import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserPerm; import de.steamwar.sql.UserPerm;
import lombok.Getter; import lombok.Getter;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@@ -43,7 +42,7 @@ public interface TablistPart {
public Item(UUID uuid, String displayName, List<GameProfile.Property> properties) { public Item(UUID uuid, String displayName, List<GameProfile.Property> properties) {
this.uuid = uuid; this.uuid = uuid;
this.displayName = LegacyComponentSerializer.legacySection().deserialize(displayName); this.displayName = Chatter.SERIALIZER.deserialize(displayName);
this.properties = properties; this.properties = properties;
} }
@@ -55,9 +54,9 @@ public interface TablistPart {
this.uuid = player.getUniqueId(); this.uuid = player.getUniqueId();
UserPerm.Prefix prefix = SteamwarUser.get(player.getUniqueId()).prefix(); UserPerm.Prefix prefix = SteamwarUser.get(player.getUniqueId()).prefix();
if (prefix == UserPerm.emptyPrefix && sameTeam) { if (prefix == UserPerm.emptyPrefix && sameTeam) {
this.displayName = LegacyComponentSerializer.legacySection().deserialize("§f" + player.getUsername()); this.displayName = Chatter.SERIALIZER.deserialize("§f" + player.getUsername());
} else { } else {
this.displayName = LegacyComponentSerializer.legacySection().deserialize(prefix.getColorCode() + player.getUsername()); this.displayName = Chatter.SERIALIZER.deserialize(prefix.getColorCode() + player.getUsername());
} }
this.properties = player.getGameProfileProperties(); this.properties = player.getGameProfileProperties();
} }
@@ -29,6 +29,7 @@ import io.ktor.server.application.hooks.*
import io.ktor.server.auth.* import io.ktor.server.auth.*
import io.ktor.server.request.* import io.ktor.server.request.*
import io.ktor.server.response.* import io.ktor.server.response.*
import io.ktor.util.*
data class SWAuthPrincipal(val token: Token, val user: SteamwarUser) : Principal data class SWAuthPrincipal(val token: Token, val user: SteamwarUser) : Principal
@@ -104,7 +105,7 @@ Message: ${cause.message}
} }
onCallRespond { call -> onCallRespond { call ->
if (call.response.status()?.isSuccess() == true) { if ((call.response.status() ?: HttpStatusCode.OK).isSuccess()) {
return@onCallRespond return@onCallRespond
} }
@@ -120,7 +121,7 @@ Message: ${cause.message}
Headers: Headers:
${call.request.headers.entries().joinToString("\n ") { "${it.key}: ${it.value}" }} ${call.request.headers.entries().joinToString("\n ") { "${it.key}: ${it.value}" }}
Body: Body:
${call.request.receiveChannel()} ${call.request.receiveChannel().toByteArray().decodeToString()}
""".trimIndent() """.trimIndent()
SWException.log(msg, stack) SWException.log(msg, stack)
@@ -50,7 +50,7 @@ fun Application.configurePlugins() {
it.request.headers["X-Forwarded-For"] ?: it.request.local.remoteHost it.request.headers["X-Forwarded-For"] ?: it.request.local.remoteHost
} }
requestWeight { applicationCall, _ -> requestWeight { applicationCall, _ ->
if(applicationCall.request.headers["X-Forwarded-For"] != null) { if(!applicationCall.request.headers.contains("X-Forwarded-For")) {
0 0
} else { } else {
1 1
@@ -73,7 +73,7 @@ fun Route.configureDataRoutes() {
route("/admin") { route("/admin") {
install(SWPermissionCheck) { install(SWPermissionCheck) {
mustAuth = true mustAuth = true
permission = UserPerm.PREFIX_MODERATOR permission = UserPerm.MODERATION
} }
get("/users") { get("/users") {
call.respond(SteamwarUser.getAll().map { ResponseUser(it) }) call.respond(SteamwarUser.getAll().map { ResponseUser(it) })
+4 -1
View File
@@ -119,7 +119,7 @@ dependencyResolutionManagement {
library("datafixer", "com.mojang:datafixerupper:4.0.26") library("datafixer", "com.mojang:datafixerupper:4.0.26")
library("brigadier", "com.mojang:brigadier:1.0.18") library("brigadier", "com.mojang:brigadier:1.0.18")
library("viaapi", "com.viaversion:viaversion-api:4.3.1") library("viaapi", "com.viaversion:viaversion-api:4.3.1")
library("anvilgui", "net.wesjd:anvilgui:1.7.0-SNAPSHOT") library("anvilgui", "net.wesjd:anvilgui:1.10.3-SNAPSHOT")
library("nms8", "de.steamwar:spigot:1.8") library("nms8", "de.steamwar:spigot:1.8")
library("nms9", "de.steamwar:spigot:1.9") library("nms9", "de.steamwar:spigot:1.9")
@@ -136,6 +136,7 @@ dependencyResolutionManagement {
library("worldedit12", "de.steamwar:worldedit:1.12") library("worldedit12", "de.steamwar:worldedit:1.12")
library("worldedit15", "de.steamwar:worldedit:1.15") library("worldedit15", "de.steamwar:worldedit:1.15")
library("fawe18", "de.steamwar:fastasyncworldedit:1.18") library("fawe18", "de.steamwar:fastasyncworldedit:1.18")
library("fawe21", "de.steamwar:fastasyncworldedit:1.21")
library("velocity", "de.steamwar:velocity:RELEASE") library("velocity", "de.steamwar:velocity:RELEASE")
library("velocityapi", "com.velocitypowered:velocity-api:3.3.0-SNAPSHOT") library("velocityapi", "com.velocitypowered:velocity-api:3.3.0-SNAPSHOT")
@@ -174,6 +175,7 @@ include(
"BauSystem:BauSystem_18", "BauSystem:BauSystem_18",
"BauSystem:BauSystem_19", "BauSystem:BauSystem_19",
"BauSystem:BauSystem_20", "BauSystem:BauSystem_20",
"BauSystem:BauSystem_21",
"BauSystem:BauSystem_Main" "BauSystem:BauSystem_Main"
) )
@@ -196,6 +198,7 @@ include(
"FightSystem:FightSystem_18", "FightSystem:FightSystem_18",
"FightSystem:FightSystem_19", "FightSystem:FightSystem_19",
"FightSystem:FightSystem_20", "FightSystem:FightSystem_20",
"FightSystem:FightSystem_21",
"FightSystem:FightSystem_Core", "FightSystem:FightSystem_Core",
"FightSystem:FightSystem_Standalone" "FightSystem:FightSystem_Standalone"
) )