FallingBlock #144
@ -24,50 +24,32 @@ import org.bukkit.Bukkit;
|
|||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity;
|
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity;
|
||||||
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
|
||||||
|
import org.bukkit.entity.FallingBlock;
|
||||||
import org.bukkit.entity.TNTPrimed;
|
import org.bukkit.entity.TNTPrimed;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
class TPSLimit_12 {
|
class TPSLimit_12 {
|
||||||
|
|
||||||
private static Set<PacketPlayOutEntityVelocity> velocityPackets = new HashSet<>();
|
private static List<Packet<?>> packets = new ArrayList<>();
|
||||||
|
|
||||||
static void createVelocityPacketCache(World world) {
|
static void createTickCache(World world) {
|
||||||
velocityPackets.clear();
|
packets.clear();
|
||||||
world.getEntitiesByClasses(TNTPrimed.class).forEach(entity -> {
|
world.getEntitiesByClasses(TNTPrimed.class, FallingBlock.class).forEach(entity -> {
|
||||||
velocityPackets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), 0, 0, 0));
|
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), 0, 0, 0));
|
||||||
});
|
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
||||||
}
|
|
||||||
|
|
||||||
static void sendVelocityPackets() {
|
if (entity instanceof TNTPrimed) {
|
||||||
sendPacketsToPlayer(velocityPackets);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sendTntMetaData(World world) {
|
|
||||||
Set<Packet<?>> packets = new HashSet<>();
|
|
||||||
|
|
||||||
world.getEntitiesByClasses(TNTPrimed.class).forEach(entity -> {
|
|
||||||
net.minecraft.server.v1_12_R1.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
net.minecraft.server.v1_12_R1.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
||||||
|
|
||||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.getId(), serverEntity.getDataWatcher(), true));
|
packets.add(new PacketPlayOutEntityMetadata(serverEntity.getId(), serverEntity.getDataWatcher(), true));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
sendPacketsToPlayer(packets);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sendTntData(World world) {
|
static void sendTickPackets() {
|
||||||
Set<Packet<?>> packets = new HashSet<>();
|
|
||||||
|
|
||||||
world.getEntitiesByClasses(TNTPrimed.class).forEach(entity -> {
|
|
||||||
net.minecraft.server.v1_12_R1.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
|
||||||
packets.add(new PacketPlayOutEntityTeleport(serverEntity));
|
|
||||||
});
|
|
||||||
|
|
||||||
sendPacketsToPlayer(packets);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sendPacketsToPlayer(Set<? extends Packet<?>> packets) {
|
|
||||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||||
PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection;
|
PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection;
|
||||||
for (Packet<?> p : packets) {
|
for (Packet<?> p : packets) {
|
||||||
|
@ -24,51 +24,32 @@ import org.bukkit.Bukkit;
|
|||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity;
|
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity;
|
||||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
||||||
|
import org.bukkit.entity.FallingBlock;
|
||||||
import org.bukkit.entity.TNTPrimed;
|
import org.bukkit.entity.TNTPrimed;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
class TPSLimit_15 {
|
class TPSLimit_15 {
|
||||||
|
|
||||||
private static Set<PacketPlayOutEntityVelocity> velocityPackets = new HashSet<>();
|
private static List<Packet<?>> packets = new ArrayList<>();
|
||||||
private static final Vec3D noMotion = new Vec3D(0, 0, 0);
|
private static final Vec3D noMotion = new Vec3D(0, 0, 0);
|
||||||
|
|
||||||
static void createVelocityPacketCache(World world) {
|
static void createTickCache(World world) {
|
||||||
velocityPackets.clear();
|
packets.clear();
|
||||||
world.getEntitiesByClasses(TNTPrimed.class).forEach(entity -> {
|
world.getEntitiesByClasses(TNTPrimed.class, FallingBlock.class).forEach(entity -> {
|
||||||
velocityPackets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion));
|
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion));
|
||||||
});
|
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
||||||
}
|
|
||||||
|
|
||||||
static void sendVelocityPackets() {
|
if (entity instanceof TNTPrimed) {
|
||||||
sendPacketsToPlayer(velocityPackets);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sendTntMetaData(World world) {
|
|
||||||
Set<Packet<?>> packets = new HashSet<>();
|
|
||||||
|
|
||||||
world.getEntitiesByClasses(TNTPrimed.class).forEach(entity -> {
|
|
||||||
net.minecraft.server.v1_15_R1.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
net.minecraft.server.v1_15_R1.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
||||||
|
|
||||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.getId(), serverEntity.getDataWatcher(), true));
|
packets.add(new PacketPlayOutEntityMetadata(serverEntity.getId(), serverEntity.getDataWatcher(), true));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
sendPacketsToPlayer(packets);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sendTntData(World world) {
|
static void sendTickPackets() {
|
||||||
Set<Packet<?>> packets = new HashSet<>();
|
|
||||||
|
|
||||||
world.getEntitiesByClasses(TNTPrimed.class).forEach(entity -> {
|
|
||||||
net.minecraft.server.v1_15_R1.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
|
||||||
packets.add(new PacketPlayOutEntityTeleport(serverEntity));
|
|
||||||
});
|
|
||||||
|
|
||||||
sendPacketsToPlayer(packets);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sendPacketsToPlayer(Set<? extends Packet<?>> packets) {
|
|
||||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||||
PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection;
|
PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection;
|
||||||
for (Packet<?> p : packets) {
|
for (Packet<?> p : packets) {
|
||||||
|
@ -22,7 +22,7 @@ package de.steamwar.bausystem.commands;
|
|||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.Permission;
|
import de.steamwar.bausystem.Permission;
|
||||||
import de.steamwar.bausystem.world.Welt;
|
import de.steamwar.bausystem.world.Welt;
|
||||||
import de.steamwar.core.Core;
|
import de.steamwar.core.VersionedRunnable;
|
||||||
import net.md_5.bungee.api.ChatMessageType;
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
import net.md_5.bungee.api.chat.TextComponent;
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@ -35,7 +35,7 @@ import org.bukkit.scheduler.BukkitTask;
|
|||||||
|
|
||||||
public class CommandTPSLimiter implements CommandExecutor {
|
public class CommandTPSLimiter implements CommandExecutor {
|
||||||
|
|
||||||
private static int currentTPSLimit = 20;
|
private static double currentTPSLimit = 20;
|
||||||
private static World world = Bukkit.getWorlds().get(0);
|
private static World world = Bukkit.getWorlds().get(0);
|
||||||
private long lastTime = System.nanoTime();
|
private long lastTime = System.nanoTime();
|
||||||
private long currentTime = System.nanoTime();
|
private long currentTime = System.nanoTime();
|
||||||
@ -71,12 +71,12 @@ public class CommandTPSLimiter implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
int tpsLimitInt = Integer.parseInt(tpsLimit);
|
double tpsLimitDouble = Double.parseDouble(tpsLimit.replace(',', '.'));
|
||||||
if (tpsLimitInt < 1 || tpsLimitInt > 20) {
|
if (tpsLimitDouble < 0.5 || tpsLimitDouble > 20) {
|
||||||
|
|||||||
sendInvalidArgumentMessage(player);
|
sendInvalidArgumentMessage(player);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
currentTPSLimit = tpsLimitInt;
|
currentTPSLimit = tpsLimitDouble;
|
||||||
Lixfel
hat
Was machst du hier verwirrendes, warum machst du den Double zum int? ist doch vollkommen unnötig. Wenn die Leute krumme TPS-Werte wollen, lass sie doch einfach krumme TPS-Werte haben! Was machst du hier verwirrendes, warum machst du den Double zum int? ist doch vollkommen unnötig. Wenn die Leute krumme TPS-Werte wollen, lass sie doch einfach krumme TPS-Werte haben!
YoyoNow
hat
Nein dies geht nicht, da wenn du 10.5 TPS haben möchtest du dann aber nur 9.9 hast. Deswegen habe ich da sowas reingemacht nur bei Werten unter 1 TPS funktioniert dies gescheit! Nein dies geht nicht, da wenn du 10.5 TPS haben möchtest du dann aber nur 9.9 hast. Deswegen habe ich da sowas reingemacht nur bei Werten unter 1 TPS funktioniert dies gescheit!
Lixfel
hat
Wenn du 10.5 haben möchtest, dann aber nur 9.9 bekommst, sieht das für mich eher nach einem Bug aus... Ansonsten: Hat man dann halt 9.9 TPS bei gewünschten 10.5 TPS.... Wen juckts :) Wenn du 10.5 haben möchtest, dann aber nur 9.9 bekommst, sieht das für mich eher nach einem Bug aus... Ansonsten: Hat man dann halt 9.9 TPS bei gewünschten 10.5 TPS.... Wen juckts :)
YoyoNow
hat
Das Problem ist weiter unten das Thread.sleep() was nur Millisekunden nimmt und mit den nano Sekunden eher weniger was anfangen würde. Das Problem ist weiter unten das Thread.sleep() was nur Millisekunden nimmt und mit den nano Sekunden eher weniger was anfangen würde.
Lixfel
hat
Juckt doch eigentlich keinen, ob das dann so auf die Kommastelle genau ist. Juckt doch eigentlich keinen, ob das dann so auf die Kommastelle genau ist.
YoyoNow
hat
Also soll ich das einfach rausnehmen? Also soll ich das einfach rausnehmen?
Lixfel
hat
Ja. Ja.
YoyoNow
hat
Hab ich gemacht! Hab ich gemacht!
|
|||||||
sendNewTPSLimitMessage();
|
sendNewTPSLimitMessage();
|
||||||
tpsLimiter();
|
tpsLimiter();
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
@ -91,7 +91,7 @@ public class CommandTPSLimiter implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void sendInvalidArgumentMessage(Player player) {
|
private void sendInvalidArgumentMessage(Player player) {
|
||||||
player.sendMessage(BauSystem.PREFIX + "§cNur Zahlen zwischen 1 und 20, und 'default' erlaubt.");
|
player.sendMessage(BauSystem.PREFIX + "§cNur Zahlen zwischen 0,5 und 20, und 'default' erlaubt.");
|
||||||
Lixfel
hat
Fehlerhaftes Kommata. Fehlerhaftes Kommata.
|
|||||||
}
|
}
|
||||||
|
|
||||||
Lixfel
hat
Vollkommend verwirrend für den User, bitte umformulieren. Vollkommend verwirrend für den User, bitte umformulieren.
Lixfel
hat
Was interessiert den User der Umbruch bei 1? Was interessiert den User der Umbruch bei 1?
|
|||||||
private void tpsLimiter() {
|
private void tpsLimiter() {
|
||||||
@ -102,13 +102,12 @@ public class CommandTPSLimiter implements CommandExecutor {
|
|||||||
} else {
|
} else {
|
||||||
if (tpsLimiter != null) return;
|
if (tpsLimiter != null) return;
|
||||||
tpsLimiter = Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), () -> {
|
tpsLimiter = Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), () -> {
|
||||||
sendTntMetaData();
|
VersionedRunnable.call(new VersionedRunnable(() -> TPSLimit_12.createTickCache(world), 8),
|
||||||
Lixfel
hat
ist noch nicht master, wird also noch nicht gemergt. ist noch nicht master, wird also noch nicht gemergt.
YoyoNow
hat
wie meinst du das? Meinst du damit die Sache aus dem SpigotCore? wie meinst du das? Meinst du damit die Sache aus dem SpigotCore?
|
|||||||
|
new VersionedRunnable(() -> TPSLimit_15.createTickCache(world), 14));
|
||||||
createVelocityData();
|
|
||||||
for (int i = 0; i < (20 / currentTPSLimit); i++) {
|
for (int i = 0; i < (20 / currentTPSLimit); i++) {
|
||||||
sleepUntilNextTick();
|
sleepUntilNextTick();
|
||||||
sendTntData();
|
VersionedRunnable.call(new VersionedRunnable(TPSLimit_12::sendTickPackets, 8),
|
||||||
sendVelocityData();
|
new VersionedRunnable(TPSLimit_15::sendTickPackets, 14));
|
||||||
}
|
}
|
||||||
}, 0, 1);
|
}, 0, 1);
|
||||||
}
|
}
|
||||||
@ -133,47 +132,7 @@ public class CommandTPSLimiter implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createVelocityData() {
|
public static double getCurrentTPSLimit() {
|
||||||
switch (Core.getVersion()) {
|
|
||||||
case 15:
|
|
||||||
TPSLimit_15.createVelocityPacketCache(world);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
TPSLimit_12.createVelocityPacketCache(world);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendVelocityData() {
|
|
||||||
switch (Core.getVersion()) {
|
|
||||||
case 15:
|
|
||||||
TPSLimit_15.sendVelocityPackets();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
TPSLimit_12.sendVelocityPackets();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendTntMetaData() {
|
|
||||||
switch (Core.getVersion()) {
|
|
||||||
case 15:
|
|
||||||
TPSLimit_15.sendTntMetaData(world);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
TPSLimit_12.sendTntMetaData(world);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendTntData() {
|
|
||||||
switch (Core.getVersion()) {
|
|
||||||
case 15:
|
|
||||||
TPSLimit_15.sendTntData(world);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
TPSLimit_12.sendTntData(world);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getCurrentTPSLimit() {
|
|
||||||
return currentTPSLimit;
|
return currentTPSLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
Lixfel
hat
Diese Lösung finde ich großartig, evtl. finden wir eine Möglichkeit, dies noch weiter zu generalisieren. Diese Lösung finde ich großartig, evtl. finden wir eine Möglichkeit, dies noch weiter zu generalisieren.
YoyoNow
hat
Man könnte dies noch in den SpigotCore machen, womit du dann sowas wie, versionDependantCall für 2 Versionen hast und halt den gleichen call für das FightSystem mit allen verschiedenen Versionen. Könnte den Code Umfang definitiv kleiner machen. Man könnte dies noch in den SpigotCore machen, womit du dann sowas wie, versionDependantCall für 2 Versionen hast und halt den gleichen call für das FightSystem mit allen verschiedenen Versionen. Könnte den Code Umfang definitiv kleiner machen.
YoyoNow
hat
Ich gucke mal ob ich mir dazu was nettes ausdenken kann. Ich gucke mal ob ich mir dazu was nettes ausdenken kann.
|
|||||||
|
Hast du das mit 0,5 getestet? Fliegst du dabei nicht vom Bau? Wenn ja, brauchst du das hier mir drunter nicht zu antworten.
Also ja ich habe es getestet für eine längere Zeit und bin nicht vom Bau geflogen.