SteamWar/BauSystem2.0
Archiviert
12
0

Add basic TNT
Einige Prüfungen sind fehlgeschlagen
SteamWarCI Build failed

Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
yoyosource 2023-03-19 20:23:16 +01:00
Ursprung 36532ccd5d
Commit a68f45d824
5 geänderte Dateien mit 454 neuen und 0 gelöschten Zeilen

Datei anzeigen

@ -0,0 +1,23 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2023 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.features.simulator;
public class Simulator15 implements Simulator {
}

Datei anzeigen

@ -0,0 +1,37 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2023 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.features.simulator;
import org.bukkit.Bukkit;
import org.bukkit.World;
public class Simulator19 implements Simulator {
public static final World WORLD = Bukkit.getWorlds().get(0);
@Override
public void run() {
TNT tnt = new TNT(0, 120, 0);
do {
System.out.println(tnt);
} while (!tnt.tick());
System.out.println(tnt);
}
}

Datei anzeigen

@ -0,0 +1,327 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2023 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.features.simulator;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.core.EnumDirection;
import net.minecraft.world.level.RayTrace;
import net.minecraft.world.phys.AxisAlignedBB;
import net.minecraft.world.phys.MovingObjectPosition;
import net.minecraft.world.phys.Vec3D;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.phys.shapes.VoxelShapes;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Bed;
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.entity.CraftEntity;
import org.bukkit.entity.Entity;
import org.bukkit.util.Vector;
import java.util.List;
import java.util.Random;
@Getter
@Setter
public class TNT {
private static final Random R = new Random();
// Bottom left corner
private double x;
private double y;
private double z;
private double vx;
private double vy;
private double vz;
private int fuse;
private boolean onGround = false;
private float fallDistance = 0;
private boolean horizontalCollision = false;
private boolean verticalCollision = false;
private Vector movementMultiplier = new Vector(0, 0, 0);
public TNT(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
double seed = R.nextDouble() * 6.2831854820251465;
this.vx = -Math.sin(seed) * 0.02;
this.vy = 0.20000000298023224;
this.vz = -Math.cos(seed) * 0.02;
this.fuse = 80;
}
public boolean tick() {
this.vy -= 0.04;
move(new Vector(this.vx, this.vy, this.vz));
this.vx *= 0.98;
this.vy *= 0.98;
this.vz *= 0.98;
this.fuse--;
if (this.fuse <= 0) {
// TODO: Add explosion
return true;
}
return false;
}
private void move(Vector movement) {
if (movement.lengthSquared() > 1.0E-7) {
movement.multiply(movementMultiplier);
movementMultiplier = new Vector(0, 0, 0);
vx = 0;
vy = 0;
vz = 0;
}
Vector vec3d = adjustMovementForCollisions(movement);
double lengthSquared = vec3d.lengthSquared();
if (lengthSquared > 1.0E-7) {
if (fallDistance != 0.0F) {
// TODO: This could be wrong
MovingObjectPosition movingObjectPosition = ((CraftWorld) Simulator19.WORLD).getHandle().a(new RayTrace(new Vec3D(x, y, z), new Vec3D(x + vx, y + vy, z + vz), RayTrace.BlockCollisionOption.d, RayTrace.FluidCollisionOption.d, null));
if (movingObjectPosition.c() != MovingObjectPosition.EnumMovingObjectType.a) {
onLanding();
}
}
this.x += movement.getX();
this.y += movement.getY();
this.z += movement.getZ();
}
boolean bl = !approximatelyEquals(movement.getX(), vec3d.getX());
boolean bl2 = !approximatelyEquals(movement.getZ(), vec3d.getZ());
this.horizontalCollision = bl || bl2;
this.verticalCollision = movement.getY() != vec3d.getY();
this.onGround = this.verticalCollision && movement.getY() < 0.0D;
Vector blockPos = getLandingPos();
Block block = Simulator19.WORLD.getBlockAt(blockPos.getBlockX(), blockPos.getBlockY(), blockPos.getBlockZ());
fall(vec3d.getX(), onGround, block, blockPos);
if (horizontalCollision) {
this.vx = bl ? 0.0 : this.vx;
this.vz = bl2 ? 0.0 : this.vz;
}
if (movement.getY() != vec3d.getY()) {
if (block.getType() == Material.SLIME_BLOCK) {
if (this.vy < 0.0) {
this.vy = -this.vy * 0.8;
}
}
if (block.getBlockData() instanceof Bed) {
if (this.vy < 0.0) {
this.vy = -this.vy * 0.6600000262260437 * 0.8;
}
}
}
if (onGround) {
if (block.getType() == Material.SLIME_BLOCK) {
double cy = Math.abs(this.vy);
if (cy < 0.1) {
double cy2 = 0.4 + cy * 0.2;
this.vx = vy * cy2;
this.vz = vz * cy2;
}
}
}
checkBlockCollision();
float j = this.getVelocityMultiplier();
this.vy *= j;
this.vx *= j;
}
private Vector adjustMovementForCollisions(Vector movement) {
AxisAlignedBB boundingBox = new AxisAlignedBB(x, y, z, x + 0.98, y + 0.98, z + 0.98);
return movement.lengthSquared() == 0.0 ? movement : adjustMovementForCollisions(null, movement, boundingBox, Simulator19.WORLD);
}
public static Vector adjustMovementForCollisions(Entity entity, Vector movement, AxisAlignedBB entityBoundingBox, World world) {
Iterable<VoxelShape> voxelShapes = ((CraftWorld) world).getHandle().d(((CraftEntity) entity).getHandle(), entityBoundingBox);
List<VoxelShape> collisions = new java.util.ArrayList<>();
voxelShapes.forEach(collisions::add);
return adjustMovementForCollisions(movement, entityBoundingBox, collisions);
}
private static Vector adjustMovementForCollisions(Vector movement, AxisAlignedBB entityBoundingBox, List<VoxelShape> collisions) {
if (collisions.isEmpty()) {
return movement;
} else {
double d = movement.getX();
double e = movement.getY();
double f = movement.getZ();
if (e != 0.0) {
e = VoxelShapes.a(EnumDirection.EnumAxis.b, entityBoundingBox, collisions, e);
if (e != 0.0) {
entityBoundingBox = entityBoundingBox.c(0.0, e, 0.0);
}
}
boolean bl = Math.abs(d) < Math.abs(f);
if (bl && f != 0.0) {
f = VoxelShapes.a(EnumDirection.EnumAxis.c, entityBoundingBox, collisions, f);
if (f != 0.0) {
entityBoundingBox = entityBoundingBox.c(0.0, 0.0, f);
}
}
if (d != 0.0) {
d = VoxelShapes.a(EnumDirection.EnumAxis.a, entityBoundingBox, collisions, d);
if (!bl && d != 0.0) {
entityBoundingBox = entityBoundingBox.c(d, 0.0, 0.0);
}
}
if (!bl && f != 0.0) {
f = VoxelShapes.a(EnumDirection.EnumAxis.c, entityBoundingBox, collisions, f);
}
return new Vector(d, e, f);
}
}
private boolean approximatelyEquals(double a, double b) {
return Math.abs(b - a) < 9.999999747378752E-6;
}
private int floor(double value) {
int i = (int)value;
return value < (double)i ? i - 1 : i;
}
private Vector getLandingPos() {
int x = floor(this.x);
int y = floor(this.y - 0.2F);
int z = floor(this.z);
if (Simulator19.WORLD.getBlockAt(x, y, z).isEmpty()) {
Block block = Simulator19.WORLD.getBlockAt(x, y - 1, z);
BlockData blockData = block.getBlockData();
if (blockData instanceof Fence || blockData instanceof Wall || blockData instanceof Gate) {
return new Vector(x, y - 1, z);
}
}
return new Vector(x, y, z);
}
private void fall(double heightDifference, boolean onGround, Block state, Vector landedPosition) {
if (onGround) {
if (this.fallDistance > 0.0F) {
state.getBlock().onLandedUpon(this.world, state, landedPosition, this, this.fallDistance);
}
this.onLanding();
} else if (heightDifference < 0.0) {
this.fallDistance -= (float)heightDifference;
}
}
private void checkBlockCollision() {
int x1 = floor(x + 1.0E-7);
int y1 = floor(y + 1.0E-7);
int z1 = floor(z + 1.0E-7);
int x2 = floor(x + 0.98 - 1.0E-7);
int y2 = floor(y + 0.98 - 1.0E-7);
int z2 = floor(z + 0.98 - 1.0E-7);
for (int x = x1; x <= x2; x++) {
for (int y = y1; y <= y2; y++) {
for (int z = z1; z <= z2; z++) {
Block block = Simulator19.WORLD.getBlockAt(x, y, z);
if (block.getType() == Material.POWDER_SNOW) {
slowMovement(new Vector(0.8999999761581421, 1.5, 0.8999999761581421));
} else if (block.getType() == Material.HONEY_BLOCK) {
if (isSliding(new Vector(x, y, z))) {
updateSlidingVelocity();
}
} else if (block.getType() == Material.COBWEB) {
slowMovement(new Vector(0.25, 0.05000000074505806, 0.25));
} else if (block.getType() == Material.BUBBLE_COLUMN) {
// TODO: Bubble column
}
}
}
}
}
private void slowMovement(Vector movementMultiplier) {
onLanding();
this.movementMultiplier = movementMultiplier;
}
private void updateSlidingVelocity() {
if (vy < -0.13) {
double d = -0.05 / vy;
vx *= d;
vz *= d;
}
vy = -0.05;
onLanding();
}
private boolean isSliding(Vector pos) {
if (onGround) return false;
if (y > pos.getY() + 0.9375 - 1.0E-7) return false;
if (vy >= -0.08) return false;
double d = Math.abs(pos.getX() + 0.5 - x);
double e = Math.abs(pos.getZ() + 0.5 - z);
double f = 0.4375 + 0.98 / 2.0;
return d + 1.0E-7 > f || e + 1.0E-7 > f;
}
private void onLanding() {
this.fallDistance = 0.0F;
}
@Override
public String toString() {
return "TNT{" +
"x=" + x +
", y=" + y +
", z=" + z +
", vx=" + vx +
", vy=" + vy +
", vz=" + vz +
", fuse=" + fuse +
'}';
}
}

Datei anzeigen

@ -0,0 +1,30 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2023 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.features.simulator;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.core.VersionDependent;
public interface Simulator {
Simulator impl = VersionDependent.getVersionImpl(BauSystem.getInstance());
default void run() {
}
}

Datei anzeigen

@ -0,0 +1,37 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2023 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.features.simulator;
import de.steamwar.command.SWCommand;
import de.steamwar.linkage.Linked;
import org.bukkit.entity.Player;
@Linked
public class TestCommand extends SWCommand {
public TestCommand() {
super("test");
}
@Register
public void genericCommand(Player player) {
Simulator.impl.run();
}
}