SteamWar/BauSystem2.0
Archiviert
12
0

Update TNT and cache of Block and BlockData for faster get
Einige Prüfungen sind fehlgeschlagen
SteamWarCI Build failed

Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
yoyosource 2023-03-19 21:09:34 +01:00
Ursprung a68f45d824
Commit 89ee198968
2 geänderte Dateien mit 83 neuen und 23 gelöschten Zeilen

Datei anzeigen

@ -20,18 +20,46 @@
package de.steamwar.bausystem.features.simulator; package de.steamwar.bausystem.features.simulator;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.Vector;
import java.util.HashMap;
import java.util.Map;
public class Simulator19 implements Simulator { public class Simulator19 implements Simulator {
public static final World WORLD = Bukkit.getWorlds().get(0); private static final World WORLD = Bukkit.getWorlds().get(0);
private static final Map<Vector, Material> BLOCK_TYPES_MAP = new HashMap<>();
private static final Map<Vector, BlockData> BLOCK_DATA_MAP = new HashMap<>();
@Override @Override
public void run() { public synchronized void run() {
TNT tnt = new TNT(0, 120, 0); TNT tnt = new TNT(0, 120, 0);
do { do {
System.out.println(tnt); System.out.println(tnt);
} while (!tnt.tick()); } while (!tnt.tick());
System.out.println(tnt); System.out.println(tnt);
BLOCK_TYPES_MAP.clear();
BLOCK_DATA_MAP.clear();
}
public static Material getBlockType(int x, int y, int z) {
Vector vector = new Vector(x, y, z);
return BLOCK_TYPES_MAP.computeIfAbsent(vector, v -> WORLD.getBlockAt(v.getBlockX(), v.getBlockY(), v.getBlockZ()).getType());
}
public static BlockData getBlockData(int x, int y, int z) {
Vector vector = new Vector(x, y, z);
return BLOCK_DATA_MAP.computeIfAbsent(vector, v -> WORLD.getBlockAt(v.getBlockX(), v.getBlockY(), v.getBlockZ()).getBlockData());
}
public static void setBlock(int x, int y, int z, Material material) {
Vector vector = new Vector(x, y, z);
BLOCK_TYPES_MAP.put(vector, material);
BLOCK_DATA_MAP.put(vector, material.createBlockData());
} }
} }

Datei anzeigen

@ -30,12 +30,8 @@ import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.phys.shapes.VoxelShapes; import net.minecraft.world.phys.shapes.VoxelShapes;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Bed; import org.bukkit.block.data.type.*;
import org.bukkit.block.data.type.Fence;
import org.bukkit.block.data.type.Gate;
import org.bukkit.block.data.type.Wall;
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld; import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity; import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
@ -130,8 +126,9 @@ public class TNT {
this.onGround = this.verticalCollision && movement.getY() < 0.0D; this.onGround = this.verticalCollision && movement.getY() < 0.0D;
Vector blockPos = getLandingPos(); Vector blockPos = getLandingPos();
Block block = Simulator19.WORLD.getBlockAt(blockPos.getBlockX(), blockPos.getBlockY(), blockPos.getBlockZ()); Material material = Simulator19.getBlockType(blockPos.getBlockX(), blockPos.getBlockY(), blockPos.getBlockZ());
fall(vec3d.getX(), onGround, block, blockPos); BlockData blockData = Simulator19.getBlockData(blockPos.getBlockX(), blockPos.getBlockY(), blockPos.getBlockZ());
fall(vec3d.getX(), onGround);
if (horizontalCollision) { if (horizontalCollision) {
this.vx = bl ? 0.0 : this.vx; this.vx = bl ? 0.0 : this.vx;
@ -139,12 +136,12 @@ public class TNT {
} }
if (movement.getY() != vec3d.getY()) { if (movement.getY() != vec3d.getY()) {
if (block.getType() == Material.SLIME_BLOCK) { if (material == Material.SLIME_BLOCK) {
if (this.vy < 0.0) { if (this.vy < 0.0) {
this.vy = -this.vy * 0.8; this.vy = -this.vy * 0.8;
} }
} }
if (block.getBlockData() instanceof Bed) { if (blockData instanceof Bed) {
if (this.vy < 0.0) { if (this.vy < 0.0) {
this.vy = -this.vy * 0.6600000262260437 * 0.8; this.vy = -this.vy * 0.6600000262260437 * 0.8;
} }
@ -152,7 +149,7 @@ public class TNT {
} }
if (onGround) { if (onGround) {
if (block.getType() == Material.SLIME_BLOCK) { if (material == Material.SLIME_BLOCK) {
double cy = Math.abs(this.vy); double cy = Math.abs(this.vy);
if (cy < 0.1) { if (cy < 0.1) {
double cy2 = 0.4 + cy * 0.2; double cy2 = 0.4 + cy * 0.2;
@ -232,9 +229,8 @@ public class TNT {
int y = floor(this.y - 0.2F); int y = floor(this.y - 0.2F);
int z = floor(this.z); int z = floor(this.z);
if (Simulator19.WORLD.getBlockAt(x, y, z).isEmpty()) { if (Simulator19.getBlockType(x, y, z).isAir()) {
Block block = Simulator19.WORLD.getBlockAt(x, y - 1, z); BlockData blockData = Simulator19.getBlockData(x, y - 1, z);
BlockData blockData = block.getBlockData();
if (blockData instanceof Fence || blockData instanceof Wall || blockData instanceof Gate) { if (blockData instanceof Fence || blockData instanceof Wall || blockData instanceof Gate) {
return new Vector(x, y - 1, z); return new Vector(x, y - 1, z);
} }
@ -242,11 +238,13 @@ public class TNT {
return new Vector(x, y, z); return new Vector(x, y, z);
} }
private void fall(double heightDifference, boolean onGround, Block state, Vector landedPosition) { private void fall(double heightDifference, boolean onGround) {
if (onGround) { if (onGround) {
/*
if (this.fallDistance > 0.0F) { if (this.fallDistance > 0.0F) {
state.getBlock().onLandedUpon(this.world, state, landedPosition, this, this.fallDistance); // TODO: Is this needed?: state.getBlock().onLandedUpon(this.world, state, landedPosition, this, this.fallDistance);
} }
*/
this.onLanding(); this.onLanding();
} else if (heightDifference < 0.0) { } else if (heightDifference < 0.0) {
@ -265,18 +263,32 @@ public class TNT {
for (int x = x1; x <= x2; x++) { for (int x = x1; x <= x2; x++) {
for (int y = y1; y <= y2; y++) { for (int y = y1; y <= y2; y++) {
for (int z = z1; z <= z2; z++) { for (int z = z1; z <= z2; z++) {
Block block = Simulator19.WORLD.getBlockAt(x, y, z); Material material = Simulator19.getBlockType(x, y, z);
if (block.getType() == Material.POWDER_SNOW) { if (material == Material.POWDER_SNOW) {
slowMovement(new Vector(0.8999999761581421, 1.5, 0.8999999761581421)); slowMovement(new Vector(0.8999999761581421, 1.5, 0.8999999761581421));
} else if (block.getType() == Material.HONEY_BLOCK) { } else if (material == Material.HONEY_BLOCK) {
if (isSliding(new Vector(x, y, z))) { if (isSliding(new Vector(x, y, z))) {
updateSlidingVelocity(); updateSlidingVelocity();
} }
} else if (block.getType() == Material.COBWEB) { } else if (material == Material.COBWEB) {
slowMovement(new Vector(0.25, 0.05000000074505806, 0.25)); slowMovement(new Vector(0.25, 0.05000000074505806, 0.25));
} else if (block.getType() == Material.BUBBLE_COLUMN) { } else if (material == Material.BUBBLE_COLUMN) {
// TODO: Bubble column boolean drag = ((BubbleColumn) Simulator19.getBlockData(x, y, z)).isDrag();
if (Simulator19.getBlockType(x, y + 1, z).isAir()) {
if (drag) {
this.vy = Math.max(-0.9, vy - 0.03);
} else {
this.vy = Math.min(1.8, vy + 0.1);
}
} else {
if (drag) {
this.vy = Math.max(-0.3, vy - 0.03);
} else {
this.vy = Math.min(0.7, vy + 0.06);
}
onLanding();
}
} }
} }
} }
@ -308,6 +320,26 @@ public class TNT {
return d + 1.0E-7 > f || e + 1.0E-7 > f; return d + 1.0E-7 > f || e + 1.0E-7 > f;
} }
private float getVelocityMultiplier() {
Material material = Simulator19.getBlockType(floor(x), floor(y), floor(z));
float f = 1F;
if (material == Material.SOUL_SAND) {
f = 0.5F;
} else if (material == Material.HONEY_BLOCK) {
f = 0.4F;
}
if (material != Material.WATER && material != Material.BUBBLE_COLUMN) {
if (f != 1) return f;
material = Simulator19.getBlockType(floor(x), floor(y - 0.5000001), floor(z));
if (material == Material.SOUL_SAND) {
f = 0.5F;
} else if (material == Material.HONEY_BLOCK) {
f = 0.4F;
}
}
return f;
}
private void onLanding() { private void onLanding() {
this.fallDistance = 0.0F; this.fallDistance = 0.0F;
} }