SteamWar/BauSystem
Archiviert
13
0

Tracer-entity #147

Manuell gemergt
YoyoNow hat 47 Commits von Tracer-entity nach master 2020-12-27 22:16:04 +01:00 zusammengeführt
16 geänderte Dateien mit 99 neuen und 426 gelöschten Zeilen
Nur Änderungen aus Commit 2ecd71baeb werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -0,0 +1,24 @@
package de.steamwar.bausystem.tracer;
import net.minecraft.server.v1_12_R1.*;
public class TNTEntity_12 extends EntityFallingBlock {
private TNTPosition position;
public TNTEntity_12(World world, TNTPosition position) {
super(world, position.getLocation().getX(), position.getLocation().getY(), position.getLocation().getZ(), Blocks.TNT.getBlockData());
this.position = position;
this.setNoGravity(true);
this.ticksLived = -12000;
this.dropItem = false;
this.setCustomNameVisible(true);
}
@Override
public void move(EnumMoveType enummovetype, double dx, double dy, double dz) {
}
}

Datei anzeigen

@ -1,53 +0,0 @@
package de.steamwar.bausystem.tracer;
import net.minecraft.server.v1_12_R1.PacketPlayOutEntityDestroy;
import net.minecraft.server.v1_12_R1.PacketPlayOutSpawnEntity;
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import java.util.UUID;
public class TraceTNT_12 {
// public PacketPlayOutSpawnEntity(Entity var1, int var2, int var3) {
// this.a = var1.getId();
// this.b = var1.getUniqueID();
// this.c = var1.locX;
// this.d = var1.locY;
// this.e = var1.locZ;
// this.i = MathHelper.d(var1.pitch * 256.0F / 360.0F);
// this.j = MathHelper.d(var1.yaw * 256.0F / 360.0F);
// this.k = var2;
// this.l = var3;
// double var4 = 3.9D;
// this.f = (int)(MathHelper.a(var1.motX, -3.9D, 3.9D) * 8000.0D);
// this.g = (int)(MathHelper.a(var1.motY, -3.9D, 3.9D) * 8000.0D);
// this.h = (int)(MathHelper.a(var1.motZ, -3.9D, 3.9D) * 8000.0D);
// }
static void showTNT(int entityID, Player player, float... position) {
PacketPlayOutSpawnEntity spawnEntity = new PacketPlayOutSpawnEntity();
ReflectionsUtils.setField("a", spawnEntity, entityID);
ReflectionsUtils.setField("b", spawnEntity, UUID.randomUUID());
ReflectionsUtils.setField("c", spawnEntity, position[0]);
ReflectionsUtils.setField("d", spawnEntity, position[1]);
ReflectionsUtils.setField("e", spawnEntity, position[2]);
ReflectionsUtils.setField("i", spawnEntity, 0);
ReflectionsUtils.setField("j", spawnEntity, 0);
// EntityType
ReflectionsUtils.setField("k", spawnEntity, 0);
ReflectionsUtils.setField("l", spawnEntity, 0);
ReflectionsUtils.setField("f", spawnEntity, 0);
ReflectionsUtils.setField("g", spawnEntity, 0);
ReflectionsUtils.setField("h", spawnEntity, 0);
((CraftPlayer) player).getHandle().playerConnection.sendPacket(spawnEntity);
}
static void hideTNT(int entityID, Player player, float... position) {
PacketPlayOutEntityDestroy deleteEntity = new PacketPlayOutEntityDestroy(entityID);
((CraftPlayer) player).getHandle().playerConnection.sendPacket(deleteEntity);
}
}

Datei anzeigen

@ -0,0 +1,24 @@
package de.steamwar.bausystem.tracer;
import net.minecraft.server.v1_15_R1.*;
public class TNTEntity_15 extends EntityFallingBlock {
private TNTPosition position;
public TNTEntity_15(World world, TNTPosition position) {
super(world, position.getLocation().getX(), position.getLocation().getY(), position.getLocation().getZ(), Blocks.TNT.getBlockData());
this.position = position;
this.setNoGravity(true);
this.ticksLived = -12000;
this.dropItem = false;
this.setCustomNameVisible(true);
}
@Override
public void move(EnumMoveType enummovetype, Vec3D vec3d) {
}
}

Datei anzeigen

@ -1,37 +0,0 @@
package de.steamwar.bausystem.tracer;
import net.minecraft.server.v1_15_R1.EntityTypes;
import net.minecraft.server.v1_15_R1.PacketPlayOutEntityDestroy;
import net.minecraft.server.v1_15_R1.PacketPlayOutSpawnEntity;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import java.util.UUID;
public class TraceTNT_15 {
static void showTNT(int entityID, Player player, float... position) {
PacketPlayOutSpawnEntity spawnEntity = new PacketPlayOutSpawnEntity();
ReflectionsUtils.setField("a", spawnEntity, entityID);
ReflectionsUtils.setField("b", spawnEntity, UUID.randomUUID());
ReflectionsUtils.setField("c", spawnEntity, position[0]);
ReflectionsUtils.setField("d", spawnEntity, position[1]);
ReflectionsUtils.setField("e", spawnEntity, position[2]);
ReflectionsUtils.setField("i", spawnEntity, 0);
ReflectionsUtils.setField("j", spawnEntity, 0);
ReflectionsUtils.setField("k", spawnEntity, EntityTypes.FALLING_BLOCK);
ReflectionsUtils.setField("l", spawnEntity, 0);
ReflectionsUtils.setField("f", spawnEntity, 0);
ReflectionsUtils.setField("g", spawnEntity, 0);
ReflectionsUtils.setField("h", spawnEntity, 0);
((CraftPlayer) player).getHandle().playerConnection.sendPacket(spawnEntity);
}
static void hideTNT(int entityID, Player player, float... position) {
PacketPlayOutEntityDestroy deleteEntity = new PacketPlayOutEntityDestroy(entityID);
((CraftPlayer) player).getHandle().playerConnection.sendPacket(deleteEntity);
}
}

Datei anzeigen

@ -1,39 +0,0 @@
package de.steamwar.bausystem.tracer;
import java.lang.reflect.Field;
import java.util.LinkedHashMap;
import java.util.Map;
public class ReflectionsUtils {
private static Map<String, Field> fieldMap = new LinkedHashMap<String, Field>() {
@Override
protected boolean removeEldestEntry(Map.Entry<String, Field> eldest) {
return size() > 100;
}
};
@SuppressWarnings({"java:S3011"})
static void setField(String fieldName, Object object, Object fieldValue) {
String cacheName = object.getClass().getTypeName() + ":" + fieldName;
Field field;
if (fieldMap.containsKey(cacheName)) {
field = fieldMap.get(cacheName);
} else {
try {
field = object.getClass().getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
return;
}
fieldMap.put(cacheName, field);
}
field.setAccessible(true);
try {
field.set(object, fieldValue);
} catch (IllegalAccessException e) {
}
}
}

Datei anzeigen

@ -0,0 +1,32 @@
package de.steamwar.bausystem.tracer;
import org.bukkit.entity.Entity;
import org.bukkit.util.Vector;
public class TNTPosition {
private Vector location;
private Vector vector;
public TNTPosition(Entity entity) {
location = entity.getLocation().toVector();
vector = entity.getVelocity();
}
public Vector getLocation() {
return location;
}
public Vector getVector() {
return vector;
}
@Override
public String toString() {
return "Position{" +
"location=" + location +
", vector=" + vector +
'}';
}
}

Datei anzeigen

@ -22,7 +22,6 @@ package de.steamwar.bausystem.commands;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.tracer.record.RecordManager;
import de.steamwar.bausystem.tracer.TraceManager;
import de.steamwar.bausystem.world.Welt;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -78,10 +77,10 @@ public class CommandTrace implements CommandExecutor {
RecordManager.commandAuto();
break;
case "show":
TraceManager.commandShow(player);
// TraceManager.commandShow(player);
break;
case "hide":
TraceManager.commandHide(player);
// TraceManager.commandHide(player);
break;
case "toggleshow":
Veraltet
Review

Idee: Zugehörige Message als Parameter eines RecordStatus. Dann musst du hier nicht switch-casen.

Idee: Zugehörige Message als Parameter eines RecordStatus. Dann musst du hier nicht switch-casen.
case "interpolate":

Datei anzeigen

@ -1,39 +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;
import de.steamwar.bausystem.tracer.record.RecordManager;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityExplodeEvent;
public class ExplodeListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
public void onEntityExplode(EntityExplodeEvent event) {
if (!(event.getEntity() instanceof TNTPrimed)) return;
RecordManager.tntExplode();
TraceManager.tntExplode((TNTPrimed) event.getEntity());
}
}

Datei anzeigen

@ -1,51 +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;
import org.bukkit.entity.Entity;
import org.bukkit.util.Vector;
public class Position {
private Vector location;
private Vector vector;
public Position(Entity entity) {
location = entity.getLocation().toVector();
vector = entity.getVelocity();
}
public Vector getLocation() {
return location;
}
public Vector getVector() {
return vector;
}
@Override
public String toString() {
return "Position{" +
"location=" + location +
", vector=" + vector +
'}';
}
}

Datei anzeigen

@ -1,67 +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;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class TraceManager {
private static Map<TNTPrimed, TraceTNT> traceTNTMap = new HashMap<>();
private static Set<TraceTNT> traceTNTSet = new HashSet<>();
public static void recordStop() {
traceTNTMap.clear();
}
public static void tntExplode(TNTPrimed tntPrimed) {
if (!traceTNTMap.containsKey(tntPrimed)) return;
traceTNTMap.remove(tntPrimed).explosion(tntPrimed);
}
public static void tntAdd(TNTPrimed tntPrimed) {
TraceTNT traceTNT = new TraceTNT(tntPrimed);
traceTNTMap.put(tntPrimed, traceTNT);
traceTNTSet.add(traceTNT);
}
public static void commandDelete() {
traceTNTMap.clear();
traceTNTSet.clear();
}
public static int getRecordSize() {
return traceTNTMap.size();
}
public static void commandShow(Player player) {
traceTNTSet.forEach(traceTNT -> traceTNT.showTrace(player));
}
public static void commandHide(Player player) {
traceTNTSet.forEach(traceTNT -> traceTNT.hideTrace(player));
}
}

Datei anzeigen

@ -1,116 +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;
import de.steamwar.core.Core;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import java.util.function.Consumer;
public class TraceTNT {
private static int traceID = 0;
private int id = traceID++;
private float[] source = new float[3];
private float[] explosion = new float[3];
private int index = 0;
private float[] position = new float[240];
private float[] velocity = new float[240];
public TraceTNT(TNTPrimed tntPrimed) {
source[0] = (float) tntPrimed.getLocation().getX();
source[1] = (float) tntPrimed.getLocation().getY();
source[2] = (float) tntPrimed.getLocation().getZ();
}
public void explosion(TNTPrimed tntPrimed) {
explosion[0] = (float) tntPrimed.getLocation().getX();
explosion[1] = (float) tntPrimed.getLocation().getY();
explosion[2] = (float) tntPrimed.getLocation().getZ();
}
public void add(TNTPrimed tntPrimed) {
if (index > position.length) return;
position[index + 0] = (float) tntPrimed.getLocation().getX();
position[index + 1] = (float) tntPrimed.getLocation().getY();
position[index + 2] = (float) tntPrimed.getLocation().getZ();
velocity[index + 0] = (float) tntPrimed.getVelocity().getX();
velocity[index + 1] = (float) tntPrimed.getVelocity().getY();
velocity[index + 2] = (float) tntPrimed.getVelocity().getZ();
index += 3;
}
public long size() {
long size = 0;
// id:
size += 32;
// index:
size += 32;
// source:
size += source.length * 32;
// explosion:
size += explosion.length * 32;
// position:
size += position.length * 32;
// velocity:
size += velocity.length * 32;
return size;
}
public void showTrace(Player player) {
int entityID = Integer.MAX_VALUE - id * 200;
tnt(entityID, player, source, TraceTNT_15::showTNT, TraceTNT_12::showTNT);
}
public void hideTrace(Player player) {
int entityID = Integer.MAX_VALUE - id * 200;
tnt(entityID, player, source, TraceTNT_15::hideTNT, TraceTNT_12::hideTNT);
}
private void tnt(int entityID, Player player, float[] position, VersionConsumer<Integer, Player, float[]> version15, VersionConsumer<Integer, Player, float[]> versionDefault) {
if (position.length != 3) return;
switch (Core.getVersion()) {
case 15:
version15.accept(entityID, player, position);
break;
default:
versionDefault.accept(entityID, player, position);
break;
}
}
private interface VersionConsumer<K, V, S> {
void accept(K k, V v, S s);
}
}

Datei anzeigen

@ -51,7 +51,6 @@ public class ExplodeListener implements Listener {
static void explode(TNTPrimed tntPrimed) {
get(tntPrimed).explode(tntPrimed);
RecordTrace recordTrace = recordTraceMap.remove(tntPrimed);
// System.out.println(recordTrace);
DataHolder.finished.add(recordTrace);
}

Datei anzeigen

@ -22,7 +22,6 @@ package de.steamwar.bausystem.tracer.record;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.commands.CommandTPSLimiter;
import de.steamwar.bausystem.tracer.RecordStatus;
import de.steamwar.bausystem.tracer.TraceManager;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.TNTPrimed;
@ -86,7 +85,8 @@ public class RecordManager {
recorder.cancel();
recorder = null;
startTime = 0;
TraceManager.recordStop();
// TODO: fix
// TraceManager.recordStop();
}
private static void recordAutoStop() {

Datei anzeigen

@ -19,7 +19,7 @@
package de.steamwar.bausystem.tracer.record;
import de.steamwar.bausystem.tracer.Position;
import de.steamwar.bausystem.tracer.TNTPosition;
import org.bukkit.entity.TNTPrimed;
import java.util.ArrayList;
@ -27,30 +27,30 @@ import java.util.List;
public class RecordTrace {
private Position startPosition;
private Position explosionPosition;
private List<Position> positionList = new ArrayList<>(160);
private TNTPosition startTNTPosition;
private TNTPosition explosionTNTPosition;
private List<TNTPosition> TNTPositionList = new ArrayList<>(160);
public RecordTrace(TNTPrimed tntPrimed) {
startPosition = new Position(tntPrimed);
startTNTPosition = new TNTPosition(tntPrimed);
}
public RecordTrace add(TNTPrimed tntPrimed) {
positionList.add(new Position(tntPrimed));
TNTPositionList.add(new TNTPosition(tntPrimed));
return this;
}
public RecordTrace explode(TNTPrimed tntPrimed) {
explosionPosition = new Position(tntPrimed);
explosionTNTPosition = new TNTPosition(tntPrimed);
return this;
}
@Override
public String toString() {
return "RecordTrace{" +
"startPosition=" + startPosition +
", explosionPosition=" + explosionPosition +
", positionList=" + positionList +
"startPosition=" + startTNTPosition +
", explosionPosition=" + explosionTNTPosition +
", positionList=" + TNTPositionList +
'}';
}

Datei anzeigen

@ -1,15 +1,15 @@
package de.steamwar.bausystem.tracer.show;
import de.steamwar.bausystem.tracer.Position;
import de.steamwar.bausystem.tracer.TNTPosition;
import net.minecraft.server.v1_15_R1.*;
public class TNTEntity extends EntityFallingBlock {
private Position position;
private TNTPosition TNTPosition;
public TNTEntity(World world, Position position) {
super(world, position.getLocation().getX(), position.getLocation().getY(), position.getLocation().getZ(), Blocks.TNT.getBlockData());
this.position = position;
public TNTEntity(World world, TNTPosition TNTPosition) {
super(world, TNTPosition.getLocation().getX(), TNTPosition.getLocation().getY(), TNTPosition.getLocation().getZ(), Blocks.TNT.getBlockData());
this.TNTPosition = TNTPosition;
this.setNoGravity(true);
this.ticksLived = -12000;

Datei anzeigen

@ -22,11 +22,8 @@ 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.DataHolder;
import de.steamwar.bausystem.tracer.record.ExplodeListener;
import de.steamwar.bausystem.tracer.record.RecordManager;
import de.steamwar.bausystem.tracer.TraceManager;
import de.steamwar.bausystem.tracer.record.RecordTrace;
import de.steamwar.core.TPSWatcher;
import de.steamwar.scoreboard.SWScoreboard;
import de.steamwar.scoreboard.ScoreboardCallback;