Merge branch 'master' into CannonSimulator
Dieser Commit ist enthalten in:
Commit
2635f98afc
@ -28,9 +28,7 @@ import org.bukkit.entity.FallingBlock;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
class TPSLimit_12 {
|
||||
|
||||
|
@ -34,4 +34,16 @@ public class TNTTracer_12 {
|
||||
return material == Material.WATER || material == Material.STATIONARY_WATER;
|
||||
}
|
||||
|
||||
public static Material getTraceShowMaterial() {
|
||||
return Material.CONCRETE;
|
||||
}
|
||||
|
||||
public static Material getTraceHideMaterial() {
|
||||
return Material.CONCRETE;
|
||||
}
|
||||
|
||||
public static Material getTraceXZMaterial() {
|
||||
return Material.STEP;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,7 +20,12 @@
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
|
||||
import net.minecraft.server.v1_12_R1.BlockPosition;
|
||||
import net.minecraft.server.v1_12_R1.PacketPlayOutOpenSignEditor;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
class RegionListener_12 {
|
||||
private RegionListener_12(){}
|
||||
@ -33,4 +38,9 @@ class RegionListener_12 {
|
||||
return ((WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit")).getWorldEdit().getPlatformManager()
|
||||
.getCommandManager().getDispatcher().get(command) != null;
|
||||
}
|
||||
|
||||
static void openSignEditor(Player player, Location location) {
|
||||
PacketPlayOutOpenSignEditor packet = new PacketPlayOutOpenSignEditor(new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()));
|
||||
((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
|
@ -50,5 +50,12 @@
|
||||
<artifactId>BauSystem_API</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>steamwar</groupId>
|
||||
<artifactId>ProtocolLib</artifactId>
|
||||
<version>4.5.0</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${main.basedir}/lib/ProtocolLib.jar</systemPath>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
@ -27,6 +27,9 @@ class CommandDebugStick_15 {
|
||||
private CommandDebugStick_15(){}
|
||||
|
||||
static void giveStick(Player player){
|
||||
player.getInventory().setItemInMainHand(new ItemStack(Material.DEBUG_STICK, 1));
|
||||
if(player.getInventory().getItemInMainHand().getType() == Material.AIR)
|
||||
player.getInventory().setItemInMainHand(new ItemStack(Material.DEBUG_STICK));
|
||||
else
|
||||
player.getInventory().addItem(new ItemStack(Material.DEBUG_STICK));
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,6 @@ import org.bukkit.entity.TNTPrimed;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
class TPSLimit_15 {
|
||||
|
||||
|
@ -44,4 +44,16 @@ public class TNTTracer_15 {
|
||||
return ((Waterlogged) data).isWaterlogged();
|
||||
}
|
||||
|
||||
public static Material getTraceShowMaterial() {
|
||||
return Material.LIME_CONCRETE;
|
||||
}
|
||||
|
||||
public static Material getTraceHideMaterial() {
|
||||
return Material.RED_CONCRETE;
|
||||
}
|
||||
|
||||
public static Material getTraceXZMaterial() {
|
||||
return Material.QUARTZ_SLAB;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,7 +19,17 @@
|
||||
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.wrappers.BlockPosition;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.logging.Level;
|
||||
|
||||
class RegionListener_15 {
|
||||
private RegionListener_15(){}
|
||||
@ -31,4 +41,14 @@ class RegionListener_15 {
|
||||
command = command.toLowerCase();
|
||||
return WorldEdit.getInstance().getPlatformManager().getPlatformCommandManager().getCommandManager().containsCommand(command);
|
||||
}
|
||||
|
||||
static void openSignEditor(Player player, Location location) {
|
||||
PacketContainer signOpen = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.OPEN_SIGN_EDITOR);
|
||||
signOpen.getBlockPositionModifier().write(0, new BlockPosition(location.toVector()));
|
||||
try {
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, signOpen);
|
||||
} catch (InvocationTargetException e) {
|
||||
Bukkit.getLogger().log(Level.SEVERE, "Invocation target exception", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
33
BauSystem_15/src/de/steamwar/bausystem/world/TPSUtils_15.java
Normale Datei
33
BauSystem_15/src/de/steamwar/bausystem/world/TPSUtils_15.java
Normale Datei
@ -0,0 +1,33 @@
|
||||
/*
|
||||
*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.SystemUtils;
|
||||
|
||||
import java.util.function.LongSupplier;
|
||||
|
||||
public class TPSUtils_15 {
|
||||
|
||||
public static void init(LongSupplier longSupplier) {
|
||||
SystemUtils.a = () -> System.nanoTime() + longSupplier.getAsLong();
|
||||
}
|
||||
|
||||
}
|
@ -83,6 +83,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
getCommand("reset").setExecutor(new CommandReset());
|
||||
getCommand("speed").setExecutor(new CommandSpeed());
|
||||
getCommand("tnt").setExecutor(new CommandTNT());
|
||||
getCommand("tnt").setTabCompleter(new CommandTNTTabComplete());
|
||||
getCommand("fire").setExecutor(new CommandFire());
|
||||
getCommand("freeze").setExecutor(new CommandFreeze());
|
||||
getCommand("testblock").setExecutor(new CommandTestblock());
|
||||
@ -109,6 +110,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
new AFKStopper();
|
||||
|
||||
autoShutdown = Bukkit.getScheduler().runTaskLater(this, Bukkit::shutdown, 1200);
|
||||
TPSUtils.init();
|
||||
}
|
||||
|
||||
public static BauSystem getPlugin() {
|
||||
|
@ -22,7 +22,7 @@ package de.steamwar.bausystem.commands;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.world.Welt;
|
||||
import de.steamwar.core.Core;
|
||||
import de.steamwar.core.VersionedRunnable;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@ -42,14 +42,8 @@ public class CommandDebugStick implements CommandExecutor {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch(Core.getVersion()){
|
||||
case 15:
|
||||
CommandDebugStick_15.giveStick(player);
|
||||
break;
|
||||
case 12:
|
||||
default:
|
||||
player.sendMessage(BauSystem.PREFIX + "§cDen Debugstick gibt es nicht in der 1.12.");
|
||||
}
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> player.sendMessage(BauSystem.PREFIX + "§cDen Debugstick gibt es nicht in der 1.12."), 8),
|
||||
new VersionedRunnable(() -> CommandDebugStick_15.giveStick(player), 15));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,7 @@ import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.world.Detonator;
|
||||
import de.steamwar.bausystem.world.Welt;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@ -62,7 +63,10 @@ public class CommandDetonator implements CommandExecutor {
|
||||
case "wand":
|
||||
case "detonator":
|
||||
case "item":
|
||||
if(player.getInventory().getItemInMainHand().getType() == Material.AIR)
|
||||
player.getInventory().setItemInMainHand(Detonator.WAND);
|
||||
else
|
||||
player.getInventory().addItem(Detonator.WAND);
|
||||
player.updateInventory();
|
||||
Detonator.getDetonator(player);
|
||||
break;
|
||||
|
@ -19,19 +19,12 @@
|
||||
|
||||
package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.world.Region;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.block.BlockBurnEvent;
|
||||
import org.bukkit.event.block.BlockSpreadEvent;
|
||||
|
||||
public class CommandFire extends ToggleCommand {
|
||||
|
||||
public CommandFire(){
|
||||
super(true);
|
||||
}
|
||||
|
||||
public static ToggleCommand getInstance(){
|
||||
return getInstance(CommandFire.class);
|
||||
}
|
||||
public class CommandFire extends RegionToggleCommand {
|
||||
|
||||
@Override
|
||||
String getNoPermMessage() {
|
||||
@ -46,14 +39,20 @@ public class CommandFire extends ToggleCommand {
|
||||
return "§aFeuerschaden aktiviert";
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean toggle(Region region) {
|
||||
region.setFire(!region.isFire());
|
||||
return region.isFire();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onFireDamage(BlockBurnEvent e) {
|
||||
e.setCancelled(true);
|
||||
if (Region.getRegion(e.getBlock().getLocation()).isFire()) e.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onFireSpread(BlockSpreadEvent e){
|
||||
e.setCancelled(true);
|
||||
if (Region.getRegion(e.getBlock().getLocation()).isFire()) e.setCancelled(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,19 +19,19 @@
|
||||
|
||||
package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.world.Region;
|
||||
import de.steamwar.core.Core;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.block.*;
|
||||
import org.bukkit.event.entity.EntityChangeBlockEvent;
|
||||
import org.bukkit.event.entity.EntitySpawnEvent;
|
||||
import org.bukkit.event.inventory.InventoryMoveItemEvent;
|
||||
|
||||
public class CommandFreeze extends ToggleCommand {
|
||||
|
||||
public CommandFreeze(){
|
||||
super(false);
|
||||
}
|
||||
|
||||
public static ToggleCommand getInstance(){
|
||||
return getInstance(CommandFreeze.class);
|
||||
}
|
||||
public class CommandFreeze extends RegionToggleCommand {
|
||||
|
||||
@Override
|
||||
String getNoPermMessage() {
|
||||
@ -46,38 +46,71 @@ public class CommandFreeze extends ToggleCommand {
|
||||
return "§aWelt aufgetaut";
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean toggle(Region region) {
|
||||
region.setFreeze(!region.isFreeze());
|
||||
return region.isFreeze();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onEntitySpawn(EntitySpawnEvent e) {
|
||||
if (!Region.getRegion(e.getLocation()).isFreeze()) return;
|
||||
e.setCancelled(true);
|
||||
if (e.getEntityType() == EntityType.PRIMED_TNT) {
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getPlugin(), () -> {
|
||||
e.getLocation().getBlock().setType(Material.TNT, false);
|
||||
}, 1L);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBlockCanBuild(BlockCanBuildEvent e) {
|
||||
if (Core.getVersion() == 12) return;
|
||||
if (!e.isBuildable()) return;
|
||||
if (!Region.getRegion(e.getBlock().getLocation()).isFreeze()) return;
|
||||
if (e.getMaterial() == Material.TNT) {
|
||||
e.setBuildable(false);
|
||||
e.getBlock().setType(Material.TNT, false);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onEntityChangeBlock(EntityChangeBlockEvent e) {
|
||||
if (Region.getRegion(e.getBlock().getLocation()).isFreeze()) e.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPhysicsEvent(BlockPhysicsEvent e){
|
||||
e.setCancelled(true);
|
||||
if (Region.getRegion(e.getBlock().getLocation()).isFreeze()) e.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPistonExtend(BlockPistonExtendEvent e){
|
||||
e.setCancelled(true);
|
||||
if (Region.getRegion(e.getBlock().getLocation()).isFreeze()) e.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPistonRetract(BlockPistonRetractEvent e){
|
||||
e.setCancelled(true);
|
||||
if (Region.getRegion(e.getBlock().getLocation()).isFreeze()) e.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBlockGrow(BlockGrowEvent e){
|
||||
e.setCancelled(true);
|
||||
if (Region.getRegion(e.getBlock().getLocation()).isFreeze()) e.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onRedstoneEvent(BlockRedstoneEvent e){
|
||||
e.setNewCurrent(e.getOldCurrent());
|
||||
if (Region.getRegion(e.getBlock().getLocation()).isFreeze()) e.setNewCurrent(e.getOldCurrent());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBlockDispense(BlockDispenseEvent e){
|
||||
e.setCancelled(true);
|
||||
if (Region.getRegion(e.getBlock().getLocation()).isFreeze()) e.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInventoryMoveEvent(InventoryMoveItemEvent e){
|
||||
e.setCancelled(true);
|
||||
if (Region.getRegion(e.getDestination().getLocation()).isFreeze()) e.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
@ -20,23 +20,32 @@
|
||||
package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.world.Region;
|
||||
import de.steamwar.bausystem.world.TPSUtils;
|
||||
import de.steamwar.core.TPSWatcher;
|
||||
import de.steamwar.sql.BauweltMember;
|
||||
import de.steamwar.sql.SteamwarUser;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static de.steamwar.bausystem.world.TPSUtils.getTps;
|
||||
|
||||
public class CommandInfo implements CommandExecutor {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (!(sender instanceof Player)) {
|
||||
return false;
|
||||
}
|
||||
Player player = (Player) sender;
|
||||
|
||||
sender.sendMessage(BauSystem.PREFIX + "Besitzer: §e" + SteamwarUser.get(BauSystem.getOwnerID()).getUserName());
|
||||
sender.sendMessage(BauSystem.PREFIX + "TNT-Schaden: " + (CommandTNT.getInstance().isOn() ? "§aAUS" : "§cAN"));
|
||||
sender.sendMessage(BauSystem.PREFIX + "Feuerschaden: " + (CommandFire.getInstance().isOn() ? "§aAUS" : "§cAN"));
|
||||
sender.sendMessage(BauSystem.PREFIX + "Eingefroren: " + (CommandFreeze.getInstance().isOn() ? "§aJA" : "§cNEIN"));
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
sender.sendMessage(BauSystem.PREFIX + "§eTNT§8: " + region.getTntMode().getName() + " §eFire§8: " + (region.isFire() ? "§aAUS" : "§cAN") + " §eFreeze§8: " + (region.isFreeze() ? "§aAN" : "§cAUS"));
|
||||
|
||||
List<BauweltMember> members = BauweltMember.getMembers(BauSystem.getOwnerID());
|
||||
StringBuilder membermessage = new StringBuilder().append(BauSystem.PREFIX).append("Mitglieder: ");
|
||||
@ -49,12 +58,17 @@ public class CommandInfo implements CommandExecutor {
|
||||
}
|
||||
sender.sendMessage(membermessage.toString());
|
||||
|
||||
sender.sendMessage(BauSystem.PREFIX + "TPS:§e" +
|
||||
" " + TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_SECOND) +
|
||||
" " + TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_SECONDS) +
|
||||
" " + TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_MINUTE) +
|
||||
" " + TPSWatcher.getTPS(TPSWatcher.TPSType.FIVE_MINUTES) +
|
||||
" " + TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_MINUTES));
|
||||
StringBuilder tpsMessage = new StringBuilder();
|
||||
tpsMessage.append(BauSystem.PREFIX).append("TPS:§e");
|
||||
tpsMessage.append(" ").append(getTps(TPSWatcher.TPSType.ONE_SECOND));
|
||||
tpsMessage.append(" ").append(getTps(TPSWatcher.TPSType.TEN_SECONDS));
|
||||
if (!TPSUtils.isWarping()) {
|
||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_MINUTE));
|
||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.FIVE_MINUTES));
|
||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_MINUTES));
|
||||
}
|
||||
sender.sendMessage(tpsMessage.toString());
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -45,8 +45,11 @@ public class CommandProtect implements CommandExecutor {
|
||||
return false;
|
||||
}
|
||||
|
||||
for(Region region : Region.getRegions()){
|
||||
if(region.inRegion(player.getLocation()) && region.hasProtection()){
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (region == null || !region.hasProtection()) {
|
||||
player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner (M)WG-Region");
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
Schematic schem = null;
|
||||
if(args.length > 0){
|
||||
@ -65,8 +68,3 @@ public class CommandProtect implements CommandExecutor {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner (M)WG-Region");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -45,8 +45,11 @@ public class CommandReset implements CommandExecutor {
|
||||
return false;
|
||||
}
|
||||
|
||||
for(Region region : Region.getRegions()){
|
||||
if(region.inRegion(player.getLocation())){
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (region == null) {
|
||||
player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner Region");
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
if(args.length > 0){
|
||||
Schematic schem = Schematic.getSchemFromDB(args[0], player.getUniqueId());
|
||||
@ -66,8 +69,3 @@ public class CommandReset implements CommandExecutor {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner Region");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@ -46,7 +47,11 @@ public class CommandSkull implements CommandExecutor {
|
||||
assert sm != null;
|
||||
sm.setDisplayName("§e" + args[0] + "§8s Kopf");
|
||||
is.setItemMeta(sm);
|
||||
if(p.getInventory().getItemInMainHand().getType() == Material.AIR)
|
||||
p.getInventory().setItemInMainHand(is);
|
||||
else
|
||||
p.getInventory().addItem(is);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -19,34 +19,133 @@
|
||||
|
||||
package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.world.Region;
|
||||
import de.steamwar.bausystem.world.Welt;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
|
||||
public class CommandTNT extends ToggleCommand {
|
||||
public class CommandTNT implements CommandExecutor, Listener {
|
||||
|
||||
public enum TNTMode {
|
||||
ON("§aan"),
|
||||
ONLY_TB("§7Kein §eBaurahmen"),
|
||||
OFF("§caus");
|
||||
|
||||
private String name;
|
||||
|
||||
TNTMode(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public CommandTNT() {
|
||||
super(true);
|
||||
Bukkit.getPluginManager().registerEvents(this, BauSystem.getPlugin());
|
||||
}
|
||||
|
||||
public static ToggleCommand getInstance(){
|
||||
return getInstance(CommandTNT.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
String getNoPermMessage() {
|
||||
return "§cDu darfst hier nicht TNT-Schaden (de-)aktivieren";
|
||||
}
|
||||
@Override
|
||||
String getEnableMessage(){
|
||||
return "§cTNT-Schaden deaktiviert";
|
||||
}
|
||||
@Override
|
||||
String getDisableMessage(){
|
||||
private String getEnableMessage() {
|
||||
return "§aTNT-Schaden aktiviert";
|
||||
}
|
||||
|
||||
private String getDisableMessage() {
|
||||
return "§cTNT-Schaden deaktiviert";
|
||||
}
|
||||
|
||||
private String getTestblockEnableMessage() {
|
||||
return "§aTNT-Schaden außerhalb Baurahmen aktiviert";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String s, String[] args) {
|
||||
if (!(sender instanceof Player)) return false;
|
||||
Player player = (Player) sender;
|
||||
|
||||
if (Welt.noPermission(player, Permission.world)) {
|
||||
player.sendMessage(BauSystem.PREFIX + "§cDu darfst hier nicht TNT-Schaden (de-)aktivieren");
|
||||
return false;
|
||||
}
|
||||
|
||||
TNTMode requestedMode = null;
|
||||
String requestedMessage = null;
|
||||
if (args.length != 0) {
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "an":
|
||||
case "on":
|
||||
requestedMode = TNTMode.ON;
|
||||
requestedMessage = getEnableMessage();
|
||||
break;
|
||||
case "aus":
|
||||
case "off":
|
||||
requestedMode = TNTMode.OFF;
|
||||
requestedMessage = getDisableMessage();
|
||||
break;
|
||||
case "testblock":
|
||||
case "tb":
|
||||
if (!Region.buildAreaEnabled()) break;
|
||||
requestedMode = TNTMode.ONLY_TB;
|
||||
requestedMessage = getTestblockEnableMessage();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
tntToggle(region, requestedMode, requestedMessage);
|
||||
return false;
|
||||
}
|
||||
|
||||
private void tntToggle(Region region, TNTMode requestedMode, String requestedMessage) {
|
||||
if (requestedMode != null && region.hasTestblock()) {
|
||||
region.setTntMode(requestedMode);
|
||||
RegionToggleCommand.actionBar(region, requestedMessage);
|
||||
return;
|
||||
}
|
||||
switch (region.getTntMode()) {
|
||||
case ON:
|
||||
case ONLY_TB:
|
||||
region.setTntMode(TNTMode.OFF);
|
||||
RegionToggleCommand.actionBar(region, getDisableMessage());
|
||||
break;
|
||||
case OFF:
|
||||
if (Region.buildAreaEnabled() && region.hasTestblock()) {
|
||||
region.setTntMode(TNTMode.ONLY_TB);
|
||||
RegionToggleCommand.actionBar(region, getTestblockEnableMessage());
|
||||
} else {
|
||||
region.setTntMode(TNTMode.ON);
|
||||
RegionToggleCommand.actionBar(region, getEnableMessage());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onExplode(EntityExplodeEvent e) {
|
||||
e.blockList().clear();
|
||||
public void onExplode(EntityExplodeEvent event) {
|
||||
event.blockList().removeIf(block -> {
|
||||
Region region = Region.getRegion(block.getLocation());
|
||||
if (region.getTntMode() == TNTMode.ON) return false;
|
||||
if (region.hasBuildRegion() && region.inBuildRegion(block.getLocation())) {
|
||||
RegionToggleCommand.actionBar(region, "§cEine Explosion hätte Blöcke im Baubereich zerstört");
|
||||
return true;
|
||||
}
|
||||
if (region.hasBuildRegion() && region.inBuildRegionExtension(block.getLocation())) {
|
||||
RegionToggleCommand.actionBar(region, "§cEine Explosion hätte Blöcke im Ausfahrbereich zerstört");
|
||||
return true;
|
||||
}
|
||||
return region.getTntMode() == TNTMode.OFF;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,67 @@
|
||||
/*
|
||||
*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
* /
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.world.Region;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class CommandTNTTabComplete implements TabCompleter {
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
|
||||
if(!(sender instanceof Player)) return new ArrayList<>();
|
||||
return tntTabComplete(args);
|
||||
}
|
||||
|
||||
private List<String> tntTabComplete(String[] args) {
|
||||
List<String> tabComplete = new ArrayList<>();
|
||||
tabComplete.add("an");
|
||||
tabComplete.add("on");
|
||||
tabComplete.add("aus");
|
||||
tabComplete.add("off");
|
||||
if (Region.buildAreaEnabled()) {
|
||||
tabComplete.add("testblock");
|
||||
tabComplete.add("tb");
|
||||
}
|
||||
|
||||
if (args.length >= 2) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return manageList(tabComplete, args, 0);
|
||||
}
|
||||
|
||||
private List<String> manageList(List<String> strings, String[] args, int index) {
|
||||
for (int i = strings.size() - 1; i >= 0; i--) {
|
||||
if (!strings.get(i).startsWith(args[index])) {
|
||||
strings.remove(i);
|
||||
}
|
||||
}
|
||||
return strings;
|
||||
}
|
||||
|
||||
}
|
@ -21,6 +21,7 @@ package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.world.TPSUtils;
|
||||
import de.steamwar.bausystem.world.Welt;
|
||||
import de.steamwar.core.VersionedRunnable;
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
@ -35,11 +36,16 @@ import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
public class CommandTPSLimiter implements CommandExecutor {
|
||||
|
||||
private static final World WORLD = Bukkit.getWorlds().get(0);
|
||||
private static double currentTPSLimit = 20;
|
||||
private static World world = Bukkit.getWorlds().get(0);
|
||||
|
||||
private long lastTime = System.nanoTime();
|
||||
private long currentTime = System.nanoTime();
|
||||
|
||||
private double delay = 0;
|
||||
private int loops = 0;
|
||||
private long sleepDelay = 0;
|
||||
|
||||
private BukkitTask tpsLimiter = null;
|
||||
|
||||
private boolean permissionCheck(Player player) {
|
||||
@ -72,7 +78,7 @@ public class CommandTPSLimiter implements CommandExecutor {
|
||||
|
||||
try {
|
||||
double tpsLimitDouble = Double.parseDouble(tpsLimit.replace(',', '.'));
|
||||
if (tpsLimitDouble < 0.5 || tpsLimitDouble > 20) {
|
||||
if (tpsLimitDouble < 0.5 || tpsLimitDouble > (TPSUtils.isWarpAllowed() ? 40 : 20)) {
|
||||
sendInvalidArgumentMessage(player);
|
||||
return false;
|
||||
}
|
||||
@ -91,21 +97,27 @@ public class CommandTPSLimiter implements CommandExecutor {
|
||||
}
|
||||
|
||||
private void sendInvalidArgumentMessage(Player player) {
|
||||
player.sendMessage(BauSystem.PREFIX + "§cNur Zahlen zwischen 0,5 und 20, und 'default' erlaubt.");
|
||||
player.sendMessage(BauSystem.PREFIX + "§cNur Zahlen zwischen 0,5 und " + (TPSUtils.isWarpAllowed() ? 40 : 20) + ", und 'default' erlaubt.");
|
||||
}
|
||||
|
||||
private void tpsLimiter() {
|
||||
if (currentTPSLimit == 20) {
|
||||
delay = 20 / currentTPSLimit;
|
||||
loops = (int)Math.ceil(delay);
|
||||
sleepDelay = (long) (50 * delay) / loops;
|
||||
|
||||
TPSUtils.setTPS(currentTPSLimit);
|
||||
if (currentTPSLimit >= 20) {
|
||||
if (tpsLimiter == null) return;
|
||||
tpsLimiter.cancel();
|
||||
tpsLimiter = null;
|
||||
} else {
|
||||
if (tpsLimiter != null) return;
|
||||
tpsLimiter = Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), () -> {
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> TPSLimit_12.createTickCache(world), 8),
|
||||
new VersionedRunnable(() -> TPSLimit_15.createTickCache(world), 14));
|
||||
for (int i = 0; i < (20 / currentTPSLimit); i++) {
|
||||
sleepUntilNextTick();
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> TPSLimit_12.createTickCache(WORLD), 8),
|
||||
new VersionedRunnable(() -> TPSLimit_15.createTickCache(WORLD), 14));
|
||||
|
||||
for (int i = 0; i < loops; i++) {
|
||||
sleepUntilNextTick(sleepDelay);
|
||||
VersionedRunnable.call(new VersionedRunnable(TPSLimit_12::sendTickPackets, 8),
|
||||
new VersionedRunnable(TPSLimit_15::sendTickPackets, 14));
|
||||
}
|
||||
@ -113,16 +125,12 @@ public class CommandTPSLimiter implements CommandExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
private void sleepUntilNextTick() {
|
||||
private void sleepUntilNextTick(long neededDelta) {
|
||||
lastTime = currentTime;
|
||||
currentTime = System.nanoTime();
|
||||
|
||||
long timeDelta = (currentTime - lastTime) / 1000000;
|
||||
long neededDelta = 50;
|
||||
|
||||
if (neededDelta - timeDelta < 0) {
|
||||
return;
|
||||
}
|
||||
if (neededDelta - timeDelta < 0) return;
|
||||
|
||||
try {
|
||||
Thread.sleep(neededDelta - timeDelta);
|
||||
@ -133,7 +141,7 @@ public class CommandTPSLimiter implements CommandExecutor {
|
||||
}
|
||||
|
||||
public static double getCurrentTPSLimit() {
|
||||
return currentTPSLimit;
|
||||
return (double)Math.round(currentTPSLimit * 10.0D) / 10.0D;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.world.TPSUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
@ -29,7 +30,11 @@ import java.util.List;
|
||||
|
||||
public class CommandTPSLimiterTabComplete implements TabCompleter {
|
||||
|
||||
private List<String> arguments = Arrays.asList("default", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20");
|
||||
private List<String> arguments = new ArrayList<>(Arrays.asList("default", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"));
|
||||
|
||||
public CommandTPSLimiterTabComplete() {
|
||||
if (TPSUtils.isWarpAllowed()) arguments.addAll(Arrays.asList("21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
|
||||
|
@ -45,8 +45,11 @@ public class CommandTestblock implements CommandExecutor {
|
||||
return false;
|
||||
}
|
||||
|
||||
for(Region region : Region.getRegions()){
|
||||
if(region.inRegion(player.getLocation()) && region.hasTestblock()){
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (region == null || !region.hasTestblock()) {
|
||||
player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner Region");
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
Schematic schem = null;
|
||||
if(args.length > 0){
|
||||
@ -65,8 +68,3 @@ public class CommandTestblock implements CommandExecutor {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner Region");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -21,12 +21,12 @@ package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.gui.GuiTraceShow;
|
||||
import de.steamwar.bausystem.tracer.record.RecordStateMachine;
|
||||
import de.steamwar.bausystem.tracer.show.ShowModeParameter;
|
||||
import de.steamwar.bausystem.tracer.show.StoredRecords;
|
||||
import de.steamwar.bausystem.tracer.show.TraceShowManager;
|
||||
import de.steamwar.bausystem.tracer.show.mode.Advanced;
|
||||
import de.steamwar.bausystem.tracer.show.mode.Basic;
|
||||
import de.steamwar.bausystem.tracer.show.mode.EntityShowMode;
|
||||
import de.steamwar.bausystem.world.Welt;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
@ -39,6 +39,7 @@ public class CommandTrace implements CommandExecutor {
|
||||
player.sendMessage("§8/§etrace start §8- §7Startet die Aufnahme aller TNT-Positionen");
|
||||
player.sendMessage("§8/§etrace stop §8- §7Stoppt den TNT-Tracer");
|
||||
player.sendMessage("§8/§etrace toggleauto §8- §7Automatischer Aufnahmenstart");
|
||||
player.sendMessage("§8/§etrace show gui §8- §7Zeigt die Trace show gui");
|
||||
player.sendMessage("§8/§etrace show §8<§edefault§8|§eadvanced§8> §8<§e-water§8|§e-interpolate-xz§8|§e-interpolate-y§8> §8- §7Zeigt alle TNT-Positionen");
|
||||
player.sendMessage("§8/§etrace hide §8- §7Versteckt alle TNT-Positionen");
|
||||
player.sendMessage("§8/§etrace delete §8- §7Löscht alle TNT-Positionen");
|
||||
@ -88,19 +89,14 @@ public class CommandTrace implements CommandExecutor {
|
||||
break;
|
||||
case "show":
|
||||
if (args.length < 2) {
|
||||
TraceShowManager.show(player, new Basic(player, new ShowModeParameter()));
|
||||
TraceShowManager.show(player, new EntityShowMode(player, new ShowModeParameter()));
|
||||
} else {
|
||||
ShowModeParameter showModeParameter = ShowModeParameter.parseArguments(args, 2);
|
||||
switch (args[1].toLowerCase()) {
|
||||
case "advanced":
|
||||
TraceShowManager.show(player, new Advanced(player, showModeParameter));
|
||||
break;
|
||||
case "basic":
|
||||
case "default":
|
||||
default:
|
||||
TraceShowManager.show(player, new Basic(player, showModeParameter));
|
||||
break;
|
||||
if (args[1].equalsIgnoreCase("gui")) {
|
||||
GuiTraceShow.openGui(player);
|
||||
return false;
|
||||
}
|
||||
ShowModeParameter showModeParameter = ShowModeParameter.parseArguments(args, 1);
|
||||
TraceShowManager.show(player, new EntityShowMode(player, showModeParameter));
|
||||
}
|
||||
player.sendMessage(BauSystem.PREFIX + "§aAlle TNT-Positionen angezeigt");
|
||||
break;
|
||||
|
@ -39,9 +39,8 @@ public class CommandTraceTabCompleter implements TabCompleter {
|
||||
tabCompletes.add(new TabComplete((player, args) -> args.length == 1 && (RecordStateMachine.getRecordStatus() == RecordStatus.IDLE || RecordStateMachine.getRecordStatus() == RecordStatus.IDLE_AUTO), "start"));
|
||||
tabCompletes.add(new TabComplete((player, args) -> args.length == 1 && (RecordStateMachine.getRecordStatus() != RecordStatus.IDLE && RecordStateMachine.getRecordStatus() != RecordStatus.IDLE_AUTO), "stop"));
|
||||
tabCompletes.add(new TabComplete((player, args) -> args.length == 1, "toggleauto", "auto", "show", "hide", "delete", "clear"));
|
||||
tabCompletes.add(new TabComplete((player, args) -> args.length == 2 && args[0].equalsIgnoreCase("show"), "basic", "advanced"));
|
||||
tabCompletes.add(new TabComplete((player, args) -> args.length > 2 && args[0].equalsIgnoreCase("show") && (args[1].equalsIgnoreCase("basic") || args[1].equalsIgnoreCase("advanced")), "-water"));
|
||||
tabCompletes.add(new TabComplete((player, args) -> args.length > 2 && args[0].equalsIgnoreCase("show") && args[1].equalsIgnoreCase("advanced"), "-interpolate-xz", "-interpolate-y"));
|
||||
tabCompletes.add(new TabComplete((player, args) -> args.length == 2 && args[0].equalsIgnoreCase("show"), "gui", "-interpolate-xz", "-interpolate-y", "-water", "-advanced", "advanced"));
|
||||
tabCompletes.add(new TabComplete((player, args) -> args.length > 2 && args[0].equalsIgnoreCase("show") && !args[1].equalsIgnoreCase("gui"), "-interpolate-xz", "-interpolate-y", "-water", "-advanced"));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -0,0 +1,80 @@
|
||||
/*
|
||||
*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
* /
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.world.Region;
|
||||
import de.steamwar.bausystem.world.Welt;
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
public abstract class RegionToggleCommand implements CommandExecutor, Listener {
|
||||
|
||||
public RegionToggleCommand() {
|
||||
Bukkit.getPluginManager().registerEvents(this, BauSystem.getPlugin());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if(!(sender instanceof Player))
|
||||
return false;
|
||||
Player player = (Player) sender;
|
||||
|
||||
if (Welt.noPermission(player, Permission.world)){
|
||||
player.sendMessage(BauSystem.PREFIX + getNoPermMessage());
|
||||
return false;
|
||||
}
|
||||
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (toggle(region)) {
|
||||
actionBar(region, getEnableMessage());
|
||||
} else {
|
||||
actionBar(region, getDisableMessage());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void actionBar(Region region, String s) {
|
||||
if (Region.GlobalRegion.isGlobalRegion(region)) {
|
||||
Bukkit.getOnlinePlayers().stream().filter(player -> Region.getRegion(player.getLocation()) == null).forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(s)));
|
||||
} else {
|
||||
Bukkit.getOnlinePlayers().stream().filter(player -> region.inRegion(player.getLocation())).forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(s)));
|
||||
}
|
||||
}
|
||||
|
||||
abstract String getNoPermMessage();
|
||||
abstract String getEnableMessage();
|
||||
abstract String getDisableMessage();
|
||||
|
||||
/**
|
||||
* {@code true} for {@link #getEnableMessage()}, {@code false} for {@link #getDisableMessage()}
|
||||
*/
|
||||
abstract boolean toggle(Region region);
|
||||
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
/*
|
||||
This file is a part of the SteamWar software.
|
||||
|
||||
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.world.Welt;
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public abstract class ToggleCommand implements CommandExecutor, Listener {
|
||||
|
||||
private static Map<Class<? extends ToggleCommand>, Boolean> enabled = new HashMap<>();
|
||||
private static Map<Class<? extends ToggleCommand>, ToggleCommand> instance = new HashMap<>();
|
||||
|
||||
ToggleCommand(boolean on){
|
||||
enabled.put(getClass(), false);
|
||||
if(on)
|
||||
toggle();
|
||||
instance.put(getClass(), this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if(!(sender instanceof Player))
|
||||
return false;
|
||||
Player player = (Player) sender;
|
||||
|
||||
if (Welt.noPermission(player, Permission.world)){
|
||||
player.sendMessage(BauSystem.PREFIX + getNoPermMessage());
|
||||
return false;
|
||||
}
|
||||
|
||||
toggle();
|
||||
return false;
|
||||
}
|
||||
|
||||
static ToggleCommand getInstance(Class<? extends ToggleCommand> clazz){
|
||||
return instance.get(clazz);
|
||||
}
|
||||
|
||||
abstract String getNoPermMessage();
|
||||
abstract String getEnableMessage();
|
||||
abstract String getDisableMessage();
|
||||
|
||||
public boolean isOn(){
|
||||
return enabled.get(getClass());
|
||||
}
|
||||
|
||||
public void toggle(){
|
||||
enabled.compute(getClass(), (clazz, value) -> !value);
|
||||
if(enabled.get(getClass())){
|
||||
Bukkit.getPluginManager().registerEvents(this, BauSystem.getPlugin());
|
||||
Bukkit.getOnlinePlayers().forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(getEnableMessage())));
|
||||
}else{
|
||||
HandlerList.unregisterAll(this);
|
||||
Bukkit.getOnlinePlayers().forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(getDisableMessage())));
|
||||
}
|
||||
}
|
||||
}
|
132
BauSystem_Main/src/de/steamwar/bausystem/gui/GuiTraceShow.java
Normale Datei
132
BauSystem_Main/src/de/steamwar/bausystem/gui/GuiTraceShow.java
Normale Datei
@ -0,0 +1,132 @@
|
||||
/*
|
||||
*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
* /
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.gui;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.tracer.TNTTracer_12;
|
||||
import de.steamwar.bausystem.tracer.TNTTracer_15;
|
||||
import de.steamwar.bausystem.tracer.show.ShowModeParameter;
|
||||
import de.steamwar.bausystem.tracer.show.TraceShowManager;
|
||||
import de.steamwar.bausystem.tracer.show.mode.EntityShowMode;
|
||||
import de.steamwar.core.VersionedCallable;
|
||||
import de.steamwar.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class GuiTraceShow {
|
||||
|
||||
private static final Map<Player, ShowModeParameter> ShowModeParameterMap = new HashMap<>();
|
||||
|
||||
private GuiTraceShow() {
|
||||
|
||||
}
|
||||
|
||||
public static void openGui(Player player) {
|
||||
ShowModeParameter playerShowMode = new ShowModeParameter();
|
||||
playerShowMode.setInterpolate_Y(false);
|
||||
playerShowMode.setInterpolate_XZ(false);
|
||||
ShowModeParameterMap.put(player, playerShowMode);
|
||||
|
||||
SWInventory swInventory = new SWInventory(player, 9, "Trace Show GUI");
|
||||
swInventory.addCloseCallback(clickType -> ShowModeParameterMap.remove(player));
|
||||
setActiveShow(player, swInventory);
|
||||
|
||||
SWItem water = new SWItem(Material.TNT, "§eWasser §7Positionen", Arrays.asList("§7Zeigt alles TNT, welches", "§7im Wasser explodiert ist."), false, clickType -> {});
|
||||
swInventory.setItem(5, water);
|
||||
swInventory.setCallback(5, clickType -> toggleHideTNTinWaterExploded(player, swInventory, water));
|
||||
|
||||
SWItem interpolateY = new SWItem(Material.QUARTZ_STAIRS, "§eInterpolation §7Y-Achse", Arrays.asList("§7Zeigt die Interpolation", "§7auf der Y-Achse."), false, clickType -> {});
|
||||
swInventory.setItem(6, interpolateY);
|
||||
swInventory.setCallback(6, clickType -> toggleInterpolateYPosition(player, swInventory, interpolateY));
|
||||
|
||||
Material xzMaterial = VersionedCallable.call(new VersionedCallable<>(TNTTracer_12::getTraceXZMaterial, 8), new VersionedCallable<>(TNTTracer_15::getTraceXZMaterial, 14));
|
||||
SWItem interpolateXZ = new SWItem(xzMaterial, (byte) 7, "§eInterpolation §7XZ-Achse", Arrays.asList("§7Zeigt die Interpolation", "§7auf der XZ-Achse."), false, clickType -> {});
|
||||
swInventory.setItem(7, interpolateXZ);
|
||||
swInventory.setCallback(7, clickType -> toggleInterpolateXZPosition(player, swInventory, interpolateXZ));
|
||||
// Water Bucket (-water)
|
||||
// TNT (-water-exploded)
|
||||
// Quartz_Stair (-interpolate-y)
|
||||
// Quartz_Slab (-interpolate-xz)
|
||||
swInventory.open();
|
||||
}
|
||||
|
||||
private static void setActiveShow(Player player, SWInventory swInventory) {
|
||||
if (TraceShowManager.hasActiveShow(player)) {
|
||||
Material showMaterial = VersionedCallable.call(new VersionedCallable<>(TNTTracer_12::getTraceShowMaterial, 8), new VersionedCallable<>(TNTTracer_15::getTraceShowMaterial, 14));
|
||||
SWItem shown = new SWItem(showMaterial, (byte) 5, "§aTraces angezeigt", new ArrayList<>(), false, clickType -> {
|
||||
TraceShowManager.hide(player);
|
||||
player.sendMessage(BauSystem.PREFIX + "§cAlle TNT-Positionen ausgeblendet");
|
||||
setActiveShow(player, swInventory);
|
||||
});
|
||||
swInventory.setItem(1, shown);
|
||||
} else {
|
||||
Material hideMaterial = VersionedCallable.call(new VersionedCallable<>(TNTTracer_12::getTraceHideMaterial, 8), new VersionedCallable<>(TNTTracer_15::getTraceHideMaterial, 14));
|
||||
SWItem hidden = new SWItem(hideMaterial, (byte) 14, "§cTraces ausgeblendet", new ArrayList<>(), false, clickType -> {
|
||||
show(player);
|
||||
player.sendMessage(BauSystem.PREFIX + "§aAlle TNT-Positionen angezeigt");
|
||||
setActiveShow(player, swInventory);
|
||||
});
|
||||
swInventory.setItem(1, hidden);
|
||||
}
|
||||
}
|
||||
|
||||
private static void toggleHideTNTinWaterExploded(Player player, SWInventory swInventory, SWItem swItem) {
|
||||
ShowModeParameter showModeParameter = ShowModeParameterMap.get(player);
|
||||
showModeParameter.setWater(!showModeParameter.isWater());
|
||||
show(player);
|
||||
|
||||
swItem.setEnchanted(showModeParameter.isWater());
|
||||
swInventory.setItem(5, swItem);
|
||||
swInventory.setCallback(5, clickType -> toggleHideTNTinWaterExploded(player, swInventory, swItem));
|
||||
}
|
||||
|
||||
private static void toggleInterpolateYPosition(Player player, SWInventory swInventory, SWItem swItem) {
|
||||
ShowModeParameter showModeParameter = ShowModeParameterMap.get(player);
|
||||
showModeParameter.setInterpolate_Y(!showModeParameter.isInterpolate_Y());
|
||||
show(player);
|
||||
|
||||
swItem.setEnchanted(showModeParameter.isInterpolate_Y());
|
||||
swInventory.setItem(6, swItem);
|
||||
swInventory.setCallback(6, clickType -> toggleInterpolateYPosition(player, swInventory, swItem));
|
||||
}
|
||||
|
||||
private static void toggleInterpolateXZPosition(Player player, SWInventory swInventory, SWItem swItem) {
|
||||
ShowModeParameter showModeParameter = ShowModeParameterMap.get(player);
|
||||
showModeParameter.setInterpolate_XZ(!showModeParameter.isInterpolate_XZ());
|
||||
show(player);
|
||||
|
||||
swItem.setEnchanted(showModeParameter.isInterpolate_XZ());
|
||||
swInventory.setItem(7, swItem);
|
||||
swInventory.setCallback(7, clickType -> toggleInterpolateXZPosition(player, swInventory, swItem));
|
||||
}
|
||||
|
||||
private static void show(Player player) {
|
||||
TraceShowManager.show(player, new EntityShowMode(player, ShowModeParameterMap.get(player)));
|
||||
}
|
||||
|
||||
}
|
@ -24,9 +24,8 @@ package de.steamwar.bausystem.tracer.show;
|
||||
public class ShowModeParameter {
|
||||
|
||||
private boolean water = false;
|
||||
private boolean interpolate_SET = false;
|
||||
private boolean interpolate_Y = true;
|
||||
private boolean interpolate_XZ = true;
|
||||
private boolean interpolate_Y = false;
|
||||
private boolean interpolate_XZ = false;
|
||||
|
||||
public ShowModeParameter() {
|
||||
|
||||
@ -44,6 +43,22 @@ public class ShowModeParameter {
|
||||
return interpolate_XZ;
|
||||
}
|
||||
|
||||
public void setWater(boolean water) {
|
||||
this.water = water;
|
||||
}
|
||||
|
||||
public void setInterpolate_Y(boolean interpolate_Y) {
|
||||
this.interpolate_Y = interpolate_Y;
|
||||
}
|
||||
|
||||
public void setInterpolate_XZ(boolean interpolate_XZ) {
|
||||
this.interpolate_XZ = interpolate_XZ;
|
||||
}
|
||||
|
||||
public boolean isAdvanced() {
|
||||
return interpolate_Y || interpolate_XZ;
|
||||
}
|
||||
|
||||
public static ShowModeParameter parseArguments(String[] args, int index) {
|
||||
ShowModeParameter showModeParameter = new ShowModeParameter();
|
||||
for (int i = index; i < args.length; i++) {
|
||||
@ -55,12 +70,7 @@ public class ShowModeParameter {
|
||||
case "-interpolate-y":
|
||||
case "-interpolate_y":
|
||||
case "-y":
|
||||
if (showModeParameter.interpolate_SET) {
|
||||
showModeParameter.interpolate_Y = true;
|
||||
} else {
|
||||
showModeParameter.interpolate_XZ = false;
|
||||
showModeParameter.interpolate_SET = true;
|
||||
}
|
||||
break;
|
||||
case "-interpolatex":
|
||||
case "-interpolate-x":
|
||||
@ -74,12 +84,15 @@ public class ShowModeParameter {
|
||||
case "-interpolate-xz":
|
||||
case "-interpolate_xz":
|
||||
case "-xz":
|
||||
if (showModeParameter.interpolate_SET) {
|
||||
showModeParameter.interpolate_XZ = true;
|
||||
} else {
|
||||
showModeParameter.interpolate_Y = false;
|
||||
showModeParameter.interpolate_SET = true;
|
||||
}
|
||||
break;
|
||||
case "advanced":
|
||||
case "-advanced":
|
||||
case "-a":
|
||||
showModeParameter.interpolate_Y = true;
|
||||
showModeParameter.interpolate_XZ = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -51,4 +51,9 @@ public class TraceShowManager implements Listener {
|
||||
public void onLeave(PlayerQuitEvent event) {
|
||||
showModes.remove(event.getPlayer());
|
||||
}
|
||||
|
||||
public static boolean hasActiveShow(Player player) {
|
||||
return showModes.containsKey(player);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,85 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
* /
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.tracer.show.mode;
|
||||
|
||||
import de.steamwar.bausystem.tracer.AbstractTraceEntity;
|
||||
import de.steamwar.bausystem.tracer.RoundedTNTPosition;
|
||||
import de.steamwar.bausystem.tracer.TNTPosition;
|
||||
import de.steamwar.bausystem.tracer.show.ShowModeParameter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Consumer;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class Advanced extends Basic {
|
||||
|
||||
private final Map<RoundedTNTPosition, AbstractTraceEntity> updateEntityMap = new HashMap<>();
|
||||
|
||||
public Advanced(Player player, ShowModeParameter showModeParameter) {
|
||||
super(player, showModeParameter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(TNTPosition position) {
|
||||
super.show(position);
|
||||
|
||||
if (!showModeParameter.isWater() && position.isExploded() && checkWater(position.getLocation())) {
|
||||
for(TNTPosition pos : position.getRecord().getPositions()){
|
||||
applyOnPosition(pos, updatePointPosition ->
|
||||
updateEntityMap.computeIfPresent(new RoundedTNTPosition(updatePointPosition), (p, point) -> point.hide(player, false) ? null : point));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
applyOnPosition(position, updatePointPosition ->
|
||||
updateEntityMap.computeIfAbsent(new RoundedTNTPosition(updatePointPosition), pos -> createEntity(updatePointPosition, false))
|
||||
.display(player, position.isExploded()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hide() {
|
||||
super.hide();
|
||||
updateEntityMap.forEach((roundedTNTPosition, abstractTraceEntity) -> abstractTraceEntity.hide(player, true));
|
||||
updateEntityMap.clear();
|
||||
}
|
||||
|
||||
private void applyOnPosition(TNTPosition position, Consumer<Vector> function){
|
||||
if (position.getPreviousLocation() == null) return;
|
||||
|
||||
if (showModeParameter.isInterpolate_Y()) {
|
||||
Vector updatePointY = position.getPreviousLocation().clone().setY(position.getLocation().getY());
|
||||
if(!position.getLocation().equals(updatePointY))
|
||||
function.accept(updatePointY);
|
||||
}
|
||||
|
||||
if (showModeParameter.isInterpolate_XZ()){
|
||||
Vector movement = position.getLocation().clone().subtract(position.getPreviousLocation());
|
||||
Vector updatePointXZ = Math.abs(movement.getX()) > Math.abs(movement.getZ())
|
||||
? position.getLocation().clone().setZ(position.getPreviousLocation().getZ())
|
||||
: position.getLocation().clone().setX(position.getPreviousLocation().getX());
|
||||
if(!position.getLocation().equals(updatePointXZ))
|
||||
function.accept(updatePointXZ);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
package de.steamwar.bausystem.tracer.show.mode;
|
||||
|
||||
import de.steamwar.bausystem.tracer.*;
|
||||
import de.steamwar.bausystem.tracer.show.ShowMode;
|
||||
import de.steamwar.bausystem.tracer.show.ShowModeParameter;
|
||||
import de.steamwar.core.VersionedCallable;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class Basic implements ShowMode {
|
||||
|
||||
protected final Player player;
|
||||
protected final ShowModeParameter showModeParameter;
|
||||
|
||||
private final Map<RoundedTNTPosition, AbstractTraceEntity> tntEntityMap = new HashMap<>();
|
||||
|
||||
public Basic(Player player, ShowModeParameter showModeParameter) {
|
||||
this.player = player;
|
||||
this.showModeParameter = showModeParameter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(TNTPosition position) {
|
||||
if (!showModeParameter.isWater() && position.isExploded() && checkWater(position.getLocation())) {
|
||||
for(TNTPosition pos : position.getRecord().getPositions()){
|
||||
RoundedTNTPosition roundedTNTPosition = new RoundedTNTPosition(pos);
|
||||
tntEntityMap.computeIfPresent(roundedTNTPosition, (p, tnt) -> tnt.hide(player, false) ? null : tnt);
|
||||
}
|
||||
return;
|
||||
}
|
||||
RoundedTNTPosition roundedTNTPosition = new RoundedTNTPosition(position);
|
||||
AbstractTraceEntity entity = tntEntityMap.computeIfAbsent(roundedTNTPosition, pos -> createEntity(position.getLocation(), true));
|
||||
entity.display(player, position.isExploded());
|
||||
}
|
||||
|
||||
protected boolean checkWater(Vector position) {
|
||||
return VersionedCallable.call(new VersionedCallable<>(() -> TNTTracer_12.inWater(player.getWorld(), position), 8),
|
||||
new VersionedCallable<>(() -> TNTTracer_15.inWater(player.getWorld(), position), 14));
|
||||
}
|
||||
|
||||
protected AbstractTraceEntity createEntity(Vector position, boolean tnt) {
|
||||
return VersionedCallable.call(new VersionedCallable<>(() -> TNTTracer_12.create(player.getWorld(), position, tnt), 8),
|
||||
new VersionedCallable<>(() -> TNTTracer_15.create(player.getWorld(), position, tnt), 14));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hide() {
|
||||
tntEntityMap.forEach((roundedTNTPosition, abstractTraceEntity) -> abstractTraceEntity.hide(player, true));
|
||||
tntEntityMap.clear();
|
||||
}
|
||||
}
|
@ -0,0 +1,119 @@
|
||||
/*
|
||||
*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
* /
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.tracer.show.mode;
|
||||
|
||||
import de.steamwar.bausystem.tracer.*;
|
||||
import de.steamwar.bausystem.tracer.show.ShowMode;
|
||||
import de.steamwar.bausystem.tracer.show.ShowModeParameter;
|
||||
import de.steamwar.core.VersionedCallable;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Consumer;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class EntityShowMode implements ShowMode {
|
||||
|
||||
protected final Player player;
|
||||
protected final ShowModeParameter showModeParameter;
|
||||
|
||||
private final Map<RoundedTNTPosition, AbstractTraceEntity> tntEntityMap = new HashMap<>();
|
||||
private final Map<RoundedTNTPosition, AbstractTraceEntity> updateEntityMap = new HashMap<>();
|
||||
|
||||
public EntityShowMode(Player player, ShowModeParameter showModeParameter) {
|
||||
this.player = player;
|
||||
this.showModeParameter = showModeParameter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(TNTPosition position) {
|
||||
if (!showModeParameter.isWater() && position.isExploded() && checkWater(position.getLocation())) {
|
||||
// Basic
|
||||
for (TNTPosition pos : position.getRecord().getPositions()) {
|
||||
RoundedTNTPosition roundedTNTPosition = new RoundedTNTPosition(pos);
|
||||
tntEntityMap.computeIfPresent(roundedTNTPosition, (p, tnt) -> {
|
||||
return tnt.hide(player, false) ? null : tnt;
|
||||
});
|
||||
}
|
||||
// Advanced
|
||||
for (TNTPosition pos : position.getRecord().getPositions()) {
|
||||
applyOnPosition(pos, updatePointPosition -> {
|
||||
updateEntityMap.computeIfPresent(new RoundedTNTPosition(updatePointPosition), (p, point) -> {
|
||||
return point.hide(player, false) ? null : point;
|
||||
});
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
RoundedTNTPosition roundedTNTPosition = new RoundedTNTPosition(position);
|
||||
AbstractTraceEntity entity = tntEntityMap.computeIfAbsent(roundedTNTPosition, pos -> createEntity(position.getLocation(), true));
|
||||
entity.display(player, position.isExploded());
|
||||
|
||||
applyOnPosition(position, updatePointPosition -> {
|
||||
updateEntityMap.computeIfAbsent(new RoundedTNTPosition(updatePointPosition), pos -> {
|
||||
return createEntity(updatePointPosition, false);
|
||||
}).display(player, position.isExploded());
|
||||
});
|
||||
}
|
||||
|
||||
private boolean checkWater(Vector position) {
|
||||
return VersionedCallable.call(new VersionedCallable<>(() -> TNTTracer_12.inWater(player.getWorld(), position), 8),
|
||||
new VersionedCallable<>(() -> TNTTracer_15.inWater(player.getWorld(), position), 14));
|
||||
}
|
||||
|
||||
private AbstractTraceEntity createEntity(Vector position, boolean tnt) {
|
||||
return VersionedCallable.call(new VersionedCallable<>(() -> TNTTracer_12.create(player.getWorld(), position, tnt), 8),
|
||||
new VersionedCallable<>(() -> TNTTracer_15.create(player.getWorld(), position, tnt), 14));
|
||||
}
|
||||
|
||||
private void applyOnPosition(TNTPosition position, Consumer<Vector> function) {
|
||||
if (position.getPreviousLocation() == null) return;
|
||||
|
||||
if (showModeParameter.isInterpolate_Y()) {
|
||||
Vector updatePointY = position.getPreviousLocation().clone().setY(position.getLocation().getY());
|
||||
if (!position.getLocation().equals(updatePointY)) {
|
||||
function.accept(updatePointY);
|
||||
}
|
||||
}
|
||||
|
||||
if (showModeParameter.isInterpolate_XZ()) {
|
||||
Vector movement = position.getLocation().clone().subtract(position.getPreviousLocation());
|
||||
Vector updatePointXZ = Math.abs(movement.getX()) > Math.abs(movement.getZ())
|
||||
? position.getLocation().clone().setZ(position.getPreviousLocation().getZ())
|
||||
: position.getLocation().clone().setX(position.getPreviousLocation().getX());
|
||||
if (!position.getLocation().equals(updatePointXZ)) {
|
||||
function.accept(updatePointXZ);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hide() {
|
||||
tntEntityMap.forEach((roundedTNTPosition, abstractTraceEntity) -> abstractTraceEntity.hide(player, true));
|
||||
tntEntityMap.clear();
|
||||
updateEntityMap.forEach((roundedTNTPosition, abstractTraceEntity) -> abstractTraceEntity.hide(player, true));
|
||||
updateEntityMap.clear();
|
||||
}
|
||||
|
||||
}
|
@ -20,7 +20,6 @@
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.core.Core;
|
||||
import de.steamwar.core.VersionedCallable;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
@ -225,12 +224,8 @@ public class AutoLoader extends IAutoLoader implements Listener {
|
||||
|
||||
@Override
|
||||
boolean setRedstone(Location location, boolean active){
|
||||
switch(Core.getVersion()){
|
||||
case 15:
|
||||
return AutoLoader_15.setRedstone(location, active);
|
||||
default:
|
||||
return AutoLoader_12.setRedstone(location, active);
|
||||
}
|
||||
return VersionedCallable.call(new VersionedCallable<>(() -> AutoLoader_12.setRedstone(location, active), 8),
|
||||
new VersionedCallable<>(() -> AutoLoader_15.setRedstone(location, active), 15));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -256,12 +251,8 @@ public class AutoLoader extends IAutoLoader implements Listener {
|
||||
|
||||
@Override
|
||||
public boolean perform() {
|
||||
switch(Core.getVersion()){
|
||||
case 15:
|
||||
return AutoLoader_15.tntPlaceActionPerform(location);
|
||||
default:
|
||||
return AutoLoader_12.tntPlaceActionPerform(location);
|
||||
}
|
||||
return VersionedCallable.call(new VersionedCallable<>(() -> AutoLoader_12.tntPlaceActionPerform(location), 8),
|
||||
new VersionedCallable<>(() -> AutoLoader_15.tntPlaceActionPerform(location), 15));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -19,8 +19,6 @@
|
||||
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
import de.steamwar.bausystem.commands.CommandFreeze;
|
||||
import de.steamwar.bausystem.commands.CommandTNT;
|
||||
import de.steamwar.bausystem.commands.CommandTPSLimiter;
|
||||
import de.steamwar.bausystem.tracer.record.RecordStateMachine;
|
||||
import de.steamwar.core.TPSWatcher;
|
||||
@ -61,8 +59,10 @@ public class BauScoreboard implements Listener {
|
||||
strings.add("§1");
|
||||
strings.add("§eUhrzeit§8: §7" + new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()));
|
||||
strings.add("§2");
|
||||
strings.add("§eTNT§8: " + (!CommandTNT.getInstance().isOn() ? "§aan" : "§caus"));
|
||||
strings.add("§eFreeze§8: " + (CommandFreeze.getInstance().isOn() ? "§aan" : "§caus"));
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
strings.add("§eTNT§8: " + region.getTntMode().getName());
|
||||
strings.add("§eFreeze§8: " + (region.isFreeze() ? "§aan" : "§caus"));
|
||||
strings.add("§eFire§8: " + (region.isFire() ? "§aaus" : "§can"));
|
||||
strings.add("§eTrace§8: " + RecordStateMachine.getRecordStatus().getName());
|
||||
strings.add("§eLoader§8: " + (AutoLoader.hasLoader(p) ? "§aan" : "§caus"));
|
||||
|
||||
@ -73,7 +73,7 @@ public class BauScoreboard implements Listener {
|
||||
}
|
||||
|
||||
strings.add("§4");
|
||||
strings.add("§eTPS§8: " + tpsColor() + TPSWatcher.getTPS() + tpsLimit());
|
||||
strings.add("§eTPS§8: " + tpsColor() + TPSUtils.getTps(TPSWatcher.TPSType.ONE_SECOND) + tpsLimit());
|
||||
|
||||
int i = strings.size();
|
||||
HashMap<String, Integer> result = new HashMap<>();
|
||||
@ -87,7 +87,7 @@ public class BauScoreboard implements Listener {
|
||||
}
|
||||
|
||||
private String tpsColor() {
|
||||
double tps = TPSWatcher.getTPS();
|
||||
double tps = TPSUtils.getTps(TPSWatcher.TPSType.ONE_SECOND);
|
||||
if (tps > CommandTPSLimiter.getCurrentTPSLimit() * 0.9) {
|
||||
return "§a";
|
||||
}
|
||||
|
@ -144,7 +144,7 @@ public class Detonator implements Listener {
|
||||
} else {
|
||||
locs.add(new Detoloader.DetonatorActivation(detoloader.getActivation(), event.getClickedBlock().getLocation()));
|
||||
}
|
||||
print(detoloader.addBack ? "§e" + detoloader.getBlock() + " getsetzt" :
|
||||
print(detoloader.addBack ? "§e" + detoloader.getBlock() + " gesetzt" :
|
||||
detoloader.getBlock(), detoloader.addBack);
|
||||
}
|
||||
break;
|
||||
|
@ -20,7 +20,8 @@
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||
import de.steamwar.core.Core;
|
||||
import de.steamwar.bausystem.commands.CommandTNT.TNTMode;
|
||||
import de.steamwar.core.VersionedRunnable;
|
||||
import de.steamwar.sql.NoClipboardException;
|
||||
import de.steamwar.sql.Schematic;
|
||||
import org.bukkit.Bukkit;
|
||||
@ -32,11 +33,13 @@ import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class Region {
|
||||
|
||||
private static final List<Region> regions = new ArrayList<>();
|
||||
private static boolean buildArea = false;
|
||||
|
||||
static{
|
||||
YamlConfiguration config = new YamlConfiguration();
|
||||
@ -59,27 +62,110 @@ public class Region {
|
||||
}
|
||||
}
|
||||
|
||||
public static List<Region> getRegions(){
|
||||
return regions;
|
||||
public static boolean buildAreaEnabled() {
|
||||
return buildArea;
|
||||
}
|
||||
|
||||
public static Region getRegion(Location location) {
|
||||
for (Region region : regions) {
|
||||
if (region.inRegion(location)) return region;
|
||||
}
|
||||
return GlobalRegion.getInstance();
|
||||
}
|
||||
|
||||
private final String name;
|
||||
private final int minX;
|
||||
private final int minY;
|
||||
private final int minZ;
|
||||
private final Prototype prototype;
|
||||
private final String optionsLinkedWith; // nullable
|
||||
private Region linkedRegion = null; // nullable
|
||||
|
||||
private TNTMode tntMode = Region.buildAreaEnabled() ? TNTMode.ONLY_TB : TNTMode.OFF;
|
||||
private boolean freeze = false;
|
||||
private boolean fire = false;
|
||||
|
||||
private Region(ConfigurationSection config){
|
||||
name = config.getName();
|
||||
minX = config.getInt("minX");
|
||||
minY = config.getInt("minY");
|
||||
minZ = config.getInt("minZ");
|
||||
prototype = Prototype.prototypes.get(config.getString("prototype"));
|
||||
optionsLinkedWith = config.getString("optionsLinkedWith", null);
|
||||
if (!hasTestblock()) tntMode = TNTMode.OFF;
|
||||
regions.add(this);
|
||||
}
|
||||
|
||||
public Region(String name) {
|
||||
this.name = name;
|
||||
this.minX = 0;
|
||||
this.minY = 0;
|
||||
this.minZ = 0;
|
||||
this.prototype = null;
|
||||
this.optionsLinkedWith = null;
|
||||
tntMode = TNTMode.OFF;
|
||||
}
|
||||
|
||||
private void setLinkedRegion(Consumer<Region> regionConsumer) {
|
||||
if (optionsLinkedWith == null) {
|
||||
return;
|
||||
}
|
||||
if (linkedRegion != null) {
|
||||
regionConsumer.accept(linkedRegion);
|
||||
return;
|
||||
}
|
||||
for (Region region : regions) {
|
||||
if (region.name.equals(name)) {
|
||||
linkedRegion = region;
|
||||
regionConsumer.accept(linkedRegion);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public TNTMode getTntMode() {
|
||||
return tntMode;
|
||||
}
|
||||
|
||||
public void setTntMode(TNTMode tntMode) {
|
||||
this.tntMode = tntMode;
|
||||
setLinkedRegion(region -> region.tntMode = tntMode);
|
||||
}
|
||||
|
||||
public boolean isFreeze() {
|
||||
return freeze;
|
||||
}
|
||||
|
||||
public void setFreeze(boolean freeze) {
|
||||
this.freeze = freeze;
|
||||
setLinkedRegion(region -> region.freeze = freeze);
|
||||
}
|
||||
|
||||
public boolean isFire() {
|
||||
return fire;
|
||||
}
|
||||
|
||||
public void setFire(boolean fire) {
|
||||
this.fire = fire;
|
||||
setLinkedRegion(region -> region.fire = fire);
|
||||
}
|
||||
|
||||
public boolean inRegion(Location l){
|
||||
return prototype.inRegion(this, l);
|
||||
}
|
||||
|
||||
public boolean hasBuildRegion() {
|
||||
return prototype.buildArea != null;
|
||||
}
|
||||
|
||||
public boolean inBuildRegion(Location l) {
|
||||
return prototype.buildArea.inRegion(this, l);
|
||||
}
|
||||
|
||||
public boolean inBuildRegionExtension(Location l) {
|
||||
return prototype.buildArea.inRegionExtension(this, l);
|
||||
}
|
||||
|
||||
public void fastreset(){
|
||||
prototype.fastreset(this);
|
||||
}
|
||||
@ -104,8 +190,45 @@ public class Region {
|
||||
prototype.protect(this, schem);
|
||||
}
|
||||
|
||||
public static class GlobalRegion extends Region {
|
||||
|
||||
private static final GlobalRegion GLOBAL_REGION = new GlobalRegion();
|
||||
|
||||
public static GlobalRegion getInstance() {
|
||||
return GLOBAL_REGION;
|
||||
}
|
||||
|
||||
public static boolean isGlobalRegion(Region region) {
|
||||
return region == GLOBAL_REGION;
|
||||
}
|
||||
|
||||
public GlobalRegion() {
|
||||
super("Global");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inRegion(Location l) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasBuildRegion() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasTestblock() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasProtection() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class Prototype{
|
||||
private static final String SECTION_PATH = "/home/minecraft/backbone/server/UserBau/";
|
||||
private static final Map<String, Prototype> prototypes = new HashMap<>();
|
||||
|
||||
private final int sizeX;
|
||||
@ -116,10 +239,17 @@ public class Region {
|
||||
private final int offsetY;
|
||||
private final int offsetZ;
|
||||
|
||||
private final int extensionPositiveZ;
|
||||
private final int extensionNegativeZ;
|
||||
private final int extensionPositiveY;
|
||||
private final int extensionAxisX;
|
||||
|
||||
private final String schematic;
|
||||
private final boolean rotate;
|
||||
|
||||
private final Prototype testblock; //nullable
|
||||
private final Prototype buildArea; //nullable
|
||||
|
||||
private final String protectSchematic; //nullable
|
||||
|
||||
private Prototype(ConfigurationSection config){
|
||||
@ -130,35 +260,46 @@ public class Region {
|
||||
offsetX = config.getInt("offsetX", 0);
|
||||
offsetY = config.getInt("offsetY", 0);
|
||||
offsetZ = config.getInt("offsetZ", 0);
|
||||
extensionPositiveZ = config.getInt("extensionPositiveZ", 0);
|
||||
extensionNegativeZ = config.getInt("extensionNegativeZ", 0);
|
||||
extensionPositiveY = config.getInt("extensionPositiveY", 0);
|
||||
extensionAxisX = config.getInt("extensionAxisX", 0);
|
||||
rotate = config.getBoolean("rotate", false);
|
||||
|
||||
ConfigurationSection testblockSection = config.getConfigurationSection("testblock");
|
||||
testblock = testblockSection != null ? new Prototype(testblockSection) : null;
|
||||
|
||||
ConfigurationSection buildAreaSection = config.getConfigurationSection("buildArea");
|
||||
buildArea = buildAreaSection != null ? new Prototype(buildAreaSection) : null;
|
||||
if (buildArea != null) {
|
||||
Region.buildArea = true;
|
||||
}
|
||||
|
||||
protectSchematic = config.getString("protection", null);
|
||||
|
||||
if(!config.getName().equals("testblock"))
|
||||
if(!config.getName().equals("testblock") && !config.getName().equals("buildArea"))
|
||||
prototypes.put(config.getName(), this);
|
||||
}
|
||||
|
||||
public boolean inRegion(Region region, Location l){
|
||||
return inRange(l.getX(), region.minX + offsetX, sizeX + offsetX) &&
|
||||
inRange(l.getY(), region.minY + offsetY, sizeY + offsetY) &&
|
||||
inRange(l.getZ(), region.minZ + offsetZ, sizeZ + offsetZ);
|
||||
return inRange(l.getX(), region.minX + offsetX, sizeX) &&
|
||||
inRange(l.getY(), region.minY + offsetY, sizeY) &&
|
||||
inRange(l.getZ(), region.minZ + offsetZ, sizeZ);
|
||||
}
|
||||
|
||||
public boolean inRegionExtension(Region region, Location l) {
|
||||
return inRange(l.getX(), region.minX + offsetX - extensionAxisX + 1, sizeX + extensionAxisX * 2 - 1) &&
|
||||
inRange(l.getY(), region.minY + offsetY, sizeY + extensionPositiveY - 1) &&
|
||||
inRange(l.getZ(), region.minZ + offsetZ - extensionNegativeZ + 1, sizeZ + extensionNegativeZ - 1 + extensionPositiveZ);
|
||||
}
|
||||
|
||||
public void fastreset(Region region){
|
||||
File file = new File(SECTION_PATH + schematic);
|
||||
File file = new File(schematic);
|
||||
int x = region.minX + offsetX + sizeX/2;
|
||||
int y = region.minY + offsetY;
|
||||
int z = region.minZ + offsetZ + sizeZ/2;
|
||||
switch(Core.getVersion()){
|
||||
case 12:
|
||||
Region_12.paste(file, x, y, z, rotate);
|
||||
break;
|
||||
case 15:
|
||||
default:
|
||||
Region_15.fastpaste(file, x, y, z, rotate);
|
||||
}
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> Region_12.paste(file, x, y, z, rotate), 8),
|
||||
new VersionedRunnable(() -> Region_15.fastpaste(file, x, y, z, rotate), 15));
|
||||
}
|
||||
|
||||
public void reset(Region region, Schematic schem) throws IOException, NoClipboardException {
|
||||
@ -166,7 +307,7 @@ public class Region {
|
||||
int y = region.minY + offsetY;
|
||||
int z = region.minZ + offsetZ + sizeZ / 2;
|
||||
if(schem == null)
|
||||
paste(new File(SECTION_PATH + schematic), x, y, z, rotate);
|
||||
paste(new File(schematic), x, y, z, rotate);
|
||||
else
|
||||
paste(schem.load(), x, y, z, rotate);
|
||||
}
|
||||
@ -180,7 +321,7 @@ public class Region {
|
||||
int y = region.minY + testblock.offsetY - 1;
|
||||
int z = region.minZ + offsetZ + sizeZ / 2;
|
||||
if(schem == null)
|
||||
paste(new File(SECTION_PATH + protectSchematic), x, y, z, rotate);
|
||||
paste(new File(protectSchematic), x, y, z, rotate);
|
||||
else
|
||||
paste(schem.load(), x, y, z, rotate);
|
||||
}
|
||||
@ -198,25 +339,13 @@ public class Region {
|
||||
}
|
||||
|
||||
private static void paste(File file, int x, int y, int z, boolean rotate){ //Type of protect
|
||||
switch(Core.getVersion()){
|
||||
case 12:
|
||||
Region_12.paste(file, x, y, z, rotate);
|
||||
break;
|
||||
case 15:
|
||||
default:
|
||||
Region_15.paste(file, x, y, z, rotate);
|
||||
}
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> Region_12.paste(file, x, y, z, rotate), 8),
|
||||
new VersionedRunnable(() -> Region_15.paste(file, x, y, z, rotate), 15));
|
||||
}
|
||||
|
||||
private static void paste(Clipboard clipboard, int x, int y, int z, boolean rotate){
|
||||
switch(Core.getVersion()){
|
||||
case 12:
|
||||
Region_12.paste(clipboard, x, y, z, rotate);
|
||||
break;
|
||||
case 15:
|
||||
default:
|
||||
Region_15.paste(clipboard, x, y, z, rotate);
|
||||
}
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> Region_12.paste(clipboard, x, y, z, rotate), 8),
|
||||
new VersionedRunnable(() -> Region_15.paste(clipboard, x, y, z, rotate), 15));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -20,18 +20,29 @@
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.events.PacketAdapter;
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.events.PacketEvent;
|
||||
import com.comphenix.protocol.wrappers.BlockPosition;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.core.Core;
|
||||
import de.steamwar.core.VersionedCallable;
|
||||
import de.steamwar.core.VersionedRunnable;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.block.SignChangeEvent;
|
||||
import org.bukkit.event.block.*;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
|
||||
public class RegionListener implements Listener {
|
||||
|
||||
@ -59,9 +70,25 @@ public class RegionListener implements Listener {
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onBlockPlace(BlockPlaceEvent e) {
|
||||
Player p = e.getPlayer();
|
||||
public void onBlockCanBuild(BlockCanBuildEvent e) {
|
||||
if (Core.getVersion() == 12) return;
|
||||
|
||||
Player p = e.getPlayer();
|
||||
try{
|
||||
if (Welt.noPermission(p, Permission.build)){
|
||||
p.sendMessage(BauSystem.PREFIX + "§cDu darfst hier keine Blöcke platzieren");
|
||||
e.setBuildable(false);
|
||||
}
|
||||
}catch(NullPointerException ex){
|
||||
//ignored, caused by worldedit brushes
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onBlockPlace(BlockPlaceEvent e) {
|
||||
if (Core.getVersion() == 15) return;
|
||||
|
||||
Player p = e.getPlayer();
|
||||
try{
|
||||
if (Welt.noPermission(p, Permission.build)){
|
||||
p.sendMessage(BauSystem.PREFIX + "§cDu darfst hier keine Blöcke platzieren");
|
||||
@ -79,13 +106,8 @@ public class RegionListener implements Listener {
|
||||
if(command.startsWith(shortcut))
|
||||
return true;
|
||||
|
||||
switch(Core.getVersion()){
|
||||
case 12:
|
||||
return RegionListener_12.isWorldEditCommand(command);
|
||||
case 15:
|
||||
default:
|
||||
return RegionListener_15.isWorldEditCommand(command);
|
||||
}
|
||||
return VersionedCallable.call(new VersionedCallable<>(() -> RegionListener_12.isWorldEditCommand(command), 8),
|
||||
new VersionedCallable<>(() -> RegionListener_15.isWorldEditCommand(command), 15));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@ -98,4 +120,49 @@ public class RegionListener implements Listener {
|
||||
event.setLine(i, line);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void editSign(PlayerInteractEvent event) {
|
||||
if(event.getAction() != Action.RIGHT_CLICK_BLOCK ||
|
||||
!event.getClickedBlock().getType().name().contains("SIGN") ||
|
||||
!event.getPlayer().isSneaking() ||
|
||||
(event.getItem() != null && event.getItem().getType() != Material.AIR))
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
Sign sign = (Sign) event.getClickedBlock().getState();
|
||||
String[] lines = sign.getLines();
|
||||
for (int i = 0; i < lines.length; i++) {
|
||||
sign.setLine(i, lines[i].replace('§', '&'));
|
||||
}
|
||||
sign.update();
|
||||
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> RegionListener_12.openSignEditor(player, event.getClickedBlock().getLocation()), 12),
|
||||
new VersionedRunnable(() -> RegionListener_15.openSignEditor(player, event.getClickedBlock().getLocation()), 15));
|
||||
|
||||
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(BauSystem.getPlugin(), PacketType.Play.Client.UPDATE_SIGN) {
|
||||
@Override
|
||||
public void onPacketReceiving(PacketEvent event) {
|
||||
if(!event.getPlayer().equals(player))
|
||||
return;
|
||||
Bukkit.getScheduler().runTask(BauSystem.getPlugin(), () -> {
|
||||
PacketContainer packetContainer = event.getPacket();
|
||||
BlockPosition position = packetContainer.getBlockPositionModifier().read(0);
|
||||
String[] lines = packetContainer.getStringArrays().read(0);
|
||||
|
||||
Block signLoc = position.toLocation(player.getWorld()).getBlock();
|
||||
if(!signLoc.getType().name().contains("SIGN"))
|
||||
return;
|
||||
|
||||
Sign sign = ((Sign) signLoc.getState());
|
||||
for (int i = 0; i < lines.length; i++) {
|
||||
sign.setLine(i, ChatColor.translateAlternateColorCodes('&', lines[i]));
|
||||
}
|
||||
sign.update();
|
||||
|
||||
ProtocolLibrary.getProtocolManager().removePacketListener(this);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -20,12 +20,10 @@
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.commands.CommandFire;
|
||||
import de.steamwar.bausystem.commands.CommandFreeze;
|
||||
import de.steamwar.bausystem.commands.CommandScript;
|
||||
import de.steamwar.bausystem.commands.CommandTNT;
|
||||
import de.steamwar.bausystem.tracer.record.RecordStateMachine;
|
||||
import de.steamwar.core.Core;
|
||||
import de.steamwar.core.VersionedCallable;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -55,7 +53,7 @@ public class ScriptListener implements Listener {
|
||||
if(item == null || isNoBook(item) || item.getItemMeta() == null)
|
||||
return;
|
||||
|
||||
if (CommandScript.BOOK.getItemMeta() != null && item.getItemMeta().getDisplayName().equals(CommandScript.BOOK.getItemMeta().getDisplayName())) {
|
||||
if (CommandScript.BOOK.getItemMeta() != null && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals(CommandScript.BOOK.getItemMeta().getDisplayName())) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -74,13 +72,8 @@ public class ScriptListener implements Listener {
|
||||
}
|
||||
|
||||
private boolean isNoBook(ItemStack item){
|
||||
switch(Core.getVersion()){
|
||||
case 12:
|
||||
return ScriptListener_12.isNoBook(item);
|
||||
case 15:
|
||||
default:
|
||||
return ScriptListener_15.isNoBook(item);
|
||||
}
|
||||
return VersionedCallable.call(new VersionedCallable<>(() -> ScriptListener_12.isNoBook(item), 8),
|
||||
new VersionedCallable<>(() -> ScriptListener_15.isNoBook(item), 15));
|
||||
}
|
||||
|
||||
private static class ScriptExecutor {
|
||||
@ -153,6 +146,8 @@ public class ScriptListener implements Listener {
|
||||
index = ifJumpIndex;
|
||||
}
|
||||
continue;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
PlayerCommandPreprocessEvent preprocessEvent = new PlayerCommandPreprocessEvent(player, "/" + command);
|
||||
@ -235,6 +230,8 @@ public class ScriptListener implements Listener {
|
||||
case "--":
|
||||
add(scriptExecutor, args[0], -1);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
setValue(scriptExecutor, args[0], args[1]);
|
||||
}
|
||||
@ -280,18 +277,20 @@ public class ScriptListener implements Listener {
|
||||
}
|
||||
|
||||
private static int getValue(ScriptExecutor scriptExecutor, String key) {
|
||||
Region region = Region.getRegion(scriptExecutor.player.getLocation());
|
||||
switch (key) {
|
||||
case "trace":
|
||||
return RecordStateMachine.getRecordStatus().isTracing() ? 1 : 0;
|
||||
case "tnt":
|
||||
return CommandTNT.getInstance().isOn() ? 1 : 0;
|
||||
return region == null || region.getTntMode() == CommandTNT.TNTMode.OFF ? 0 : 1;
|
||||
case "freeze":
|
||||
return CommandFreeze.getInstance().isOn() ? 1 : 0;
|
||||
return region == null || !region.isFreeze() ? 0 : 1;
|
||||
case "fire":
|
||||
return CommandFire.getInstance().isOn() ? 1 : 0;
|
||||
}
|
||||
return region == null || !region.isFire() ? 0 : 1;
|
||||
default:
|
||||
return scriptExecutor.variables.getOrDefault(key, 0);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isVariable(ScriptExecutor scriptExecutor, String key) {
|
||||
switch (key) {
|
||||
|
65
BauSystem_Main/src/de/steamwar/bausystem/world/TPSUtils.java
Normale Datei
65
BauSystem_Main/src/de/steamwar/bausystem/world/TPSUtils.java
Normale Datei
@ -0,0 +1,65 @@
|
||||
/*
|
||||
*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.commands.CommandTPSLimiter;
|
||||
import de.steamwar.core.TPSWatcher;
|
||||
import de.steamwar.core.VersionedRunnable;
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
public class TPSUtils {
|
||||
|
||||
private TPSUtils() {
|
||||
throw new IllegalStateException("Utility Class");
|
||||
}
|
||||
|
||||
private static boolean warp = true;
|
||||
private static long nanoOffset = 0;
|
||||
private static long nanoDOffset = 0;
|
||||
|
||||
public static void init() {
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> warp = false, 8),
|
||||
new VersionedRunnable(() -> {
|
||||
Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), () -> nanoOffset += nanoDOffset, 1, 1);
|
||||
TPSUtils_15.init(() -> nanoOffset);
|
||||
}, 15));
|
||||
}
|
||||
|
||||
public static void setTPS(double tps) {
|
||||
double d = 50 - (50 / (tps / 20.0));
|
||||
nanoDOffset = Math.max(0, Math.min((long) (d * 1000000), 25000000));
|
||||
}
|
||||
|
||||
public static boolean isWarpAllowed() {
|
||||
return warp;
|
||||
}
|
||||
|
||||
public static boolean isWarping() {
|
||||
return nanoDOffset > 0;
|
||||
}
|
||||
|
||||
public static double getTps(TPSWatcher.TPSType tpsType) {
|
||||
if (TPSUtils.isWarping()) return TPSWatcher.getTPS(tpsType, Math.max(CommandTPSLimiter.getCurrentTPSLimit(), 20));
|
||||
return TPSWatcher.getTPS(tpsType);
|
||||
}
|
||||
|
||||
}
|
@ -1,10 +1,12 @@
|
||||
name: BauSystem
|
||||
author: Lixfel
|
||||
authors: [Lixfel, YoyoNow, Chaoscaot]
|
||||
version: "1.0"
|
||||
depend: [WorldEdit, SpigotCore]
|
||||
depend: [WorldEdit, SpigotCore, ProtocolLib]
|
||||
load: POSTWORLD
|
||||
main: de.steamwar.bausystem.BauSystem
|
||||
api-version: "1.13"
|
||||
website: "https://steamwar.de"
|
||||
description: "So unseriös wie wir sind: BauSystem nur besser."
|
||||
|
||||
commands:
|
||||
debugstick:
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren