SteamWar/FightSystem
Archiviert
13
1

Improved Pathplanning (less suffocating)
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful

Signed-off-by: Lixfel <agga-games@gmx.de>
Dieser Commit ist enthalten in:
Lixfel 2023-09-02 23:19:07 +02:00
Ursprung 5a0614974e
Commit efb2537097
3 geänderte Dateien mit 70 neuen und 24 gelöschten Zeilen

Datei anzeigen

@ -27,6 +27,7 @@ import de.steamwar.sql.SteamwarUser;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
@ -58,6 +59,10 @@ public class LixfelAI extends AI {
cannons.add(new Cannon(new Vector(12,18,11), 13,17,15, 13,17,16, 13,18,16, 13,18,14, 14,18,14, 14,17,15, 14,17,16, 14,18,16, 13,17,14, 14,17,14, 13,18,15, 14,18,15)); cannons.add(new Cannon(new Vector(12,18,11), 13,17,15, 13,17,16, 13,18,16, 13,18,14, 14,18,14, 14,17,15, 14,17,16, 14,18,16, 13,17,14, 14,17,14, 13,18,15, 14,18,15));
cannons.add(new Cannon(new Vector(38,18,11), 37,18,14, 36,18,14, 36,17,15, 37,17,15, 37,18,15, 36,18,15, 36,17,14, 37,17,14, 36,17,16, 37,17,16, 36,18,16, 37,18,16)); cannons.add(new Cannon(new Vector(38,18,11), 37,18,14, 36,18,14, 36,17,15, 37,17,15, 37,18,15, 36,18,15, 36,17,14, 37,17,14, 36,17,16, 37,17,16, 36,18,16, 37,18,16));
cannons.add(new Cannon(new Vector(8,9,16), 10,11,17, 10,8,19, 10,8,17, 11,8,19, 11,8,15, 10,8,15, 12,8,15, 10,10,15, 12,7,19, 11,10,15, 12,8,19, 12,7,15, 11,7,15, 10,9,17, 11,9,19, 12,9,19, 10,9,19, 10,7,17, 11,7,19, 10,7,15, 10,7,19, 10,10,17, 12,9,15, 10,9,15, 11,9,15, 12,10,19, 11,10,19, 12,10,15, 10,6,17, 10,10,19)); cannons.add(new Cannon(new Vector(8,9,16), 10,11,17, 10,8,19, 10,8,17, 11,8,19, 11,8,15, 10,8,15, 12,8,15, 10,10,15, 12,7,19, 11,10,15, 12,8,19, 12,7,15, 11,7,15, 10,9,17, 11,9,19, 12,9,19, 10,9,19, 10,7,17, 11,7,19, 10,7,15, 10,7,19, 10,10,17, 12,9,15, 10,9,15, 11,9,15, 12,10,19, 11,10,19, 12,10,15, 10,6,17, 10,10,19));
//cannons.add(new Cannon(null, 23,5,9, 23,6,9, 23,7,9, 23,8,9));
//cannons.add(new Cannon(null, 27,5,9, 27,6,9, 27,7,9, 27,8,9));
cannons.add(new Cannon(null, 23,5,9, 23,6,9, 23,7,9, 23,8,9, 27,5,9, 27,6,9, 27,7,9, 27,8,9, 23,5,9, 23,6,9, 23,7,9, 23,8,9, 27,5,9, 27,6,9, 27,7,9, 27,8,9, 23,5,9, 23,6,9, 23,7,9, 23,8,9, 27,5,9, 27,6,9, 27,7,9, 27,8,9, 23,5,9, 23,6,9, 23,7,9, 23,8,9, 27,5,9, 27,6,9, 27,7,9, 27,8,9));
Collections.shuffle(cannons);
return schem; return schem;
} }

Datei anzeigen

@ -19,13 +19,18 @@
package de.steamwar.fightsystem.ai; package de.steamwar.fightsystem.ai;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BaseBlock;
import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.utils.WorldeditWrapper;
import de.steamwar.sql.SchematicData; import de.steamwar.sql.SchematicData;
import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SchematicNode;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.*;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.io.IOException; import java.io.IOException;
@ -34,16 +39,40 @@ import java.util.stream.Collectors;
public class LixfelPathplanner { public class LixfelPathplanner {
private static BlockType getBlockType(Clipboard clipboard, BlockVector3 vector) { private static double blockHeight(Clipboard clipboard, BlockVector3 vector) {
return clipboard.getBlock(vector).getBlockType(); BaseBlock block = clipboard.getFullBlock(vector);
if(block.getBlockType().getMaterial().isFullCube())
return 1.0;
BlockData data = BukkitAdapter.adapt(block);
Material material = data.getMaterial();
if(material.isSolid()) {
if(material.isInteractable()) {
if(data instanceof Stairs)
return 1.0;
else if(data instanceof Fence)
return 1.5;
else if(data instanceof Bed)
return 0.5625;
} else {
if(data instanceof Slab)
return ((Slab)data).getType() == Slab.Type.BOTTOM ? 0.5 : 1.0;
else if(data instanceof Wall)
return 1.5;
else if(data instanceof GlassPane || material == Material.IRON_BARS)
return 1.0;
}
} else {
if(material == Material.LADDER || material == Material.SCAFFOLDING)
return -1.0;
else if(material.name().endsWith("_CARPET"))
return 0.0625;
}
return 0.0;
} }
private static boolean nonsolid(Clipboard clipboard, BlockVector3 vector) { private static Vector toBukkit(BlockVector3 vector, double height) {
return !getBlockType(clipboard, vector).getMaterial().isSolid(); return new Vector(vector.getX() + 0.5, vector.getY() + height, vector.getZ() + 0.5);
}
private static Vector toBukkit(BlockVector3 vector) {
return new Vector(vector.getX() + 0.5, vector.getY(), vector.getZ() + 0.5);
} }
private final List<Vector> walkable = new ArrayList<>(); private final List<Vector> walkable = new ArrayList<>();
@ -62,25 +91,33 @@ public class LixfelPathplanner {
} }
private void fillWalkable(Clipboard clipboard) { private void fillWalkable(Clipboard clipboard) {
BlockVector3 min = clipboard.getRegion().getMinimumPoint().subtract(Config.PreperationArea, 0, Config.PreperationArea); //TODO assumes nonextended Schematic with maximal size Vector clipboardToSchem = new Vector(Config.BluePasteRegion.getSizeX(), Config.BluePasteRegion.getSizeY(), Config.BluePasteRegion.getSizeZ())
.subtract(WorldeditWrapper.impl.getDimensions(clipboard))
.multiply(0.5)
.add(new Vector(Config.PreperationArea, 0, Config.PreperationArea));
BlockVector3 diff = clipboard.getRegion().getMinimumPoint().subtract(clipboardToSchem.getBlockX(), clipboardToSchem.getBlockY(), clipboardToSchem.getBlockZ());
Region region = clipboard.getRegion(); Region region = clipboard.getRegion();
clipboard.getRegion().forEach(vector -> { clipboard.getRegion().forEach(vector -> {
BlockVector3 below = vector.subtract(0, 1, 0); BlockVector3 below = vector.subtract(0, 1, 0);
if(!region.contains(below)) BlockVector3 above = vector.add(0, 1, 0);
double aboveHeight = region.contains(above) ? blockHeight(clipboard, above) : 0.0;
if(aboveHeight > 0.0)
return; return;
BlockType belowMaterial = getBlockType(clipboard, below); double belowHeight = region.contains(below) ? blockHeight(clipboard, below) : 0.0;
BlockVector3 above = vector.add(0, 1, 0); double height = blockHeight(clipboard, vector);
if(nonsolid(clipboard, vector)) { if(height == 0.0 && Math.abs(belowHeight) < 1.0)
if( return;
(belowMaterial.getMaterial().isSolid() || belowMaterial.getId().equals("minecraft:ladder")) &&
(!region.contains(above) || nonsolid(clipboard, above)) if(height >= 1.0 && region.contains(above))
) return;
walkable.add(toBukkit(vector.subtract(min)));
} else { if(height < 0.0)
if(!region.contains(above)) height = 0.0;
walkable.add(toBukkit(above.subtract(min)));
} walkable.add(toBukkit(vector.subtract(diff), height));
}); });
for(Vector vector : walkable) { for(Vector vector : walkable) {
@ -92,7 +129,7 @@ public class LixfelPathplanner {
List<Vector> moddedNearby = nearby.stream().map(n -> n.clone().subtract(new Vector(0, eyeHeight, 0))).collect(Collectors.toList()); List<Vector> moddedNearby = nearby.stream().map(n -> n.clone().subtract(new Vector(0, eyeHeight, 0))).collect(Collectors.toList());
return walkable.stream() return walkable.stream()
.filter(vector -> moddedNearby.stream() .filter(vector -> moddedNearby.stream()
.allMatch(n -> n.distance(vector) <= distance)) .allMatch(n -> n.distance(vector) <= distance && !neighbouring(n, vector)))
.findAny().orElse(null); .findAny().orElse(null);
} }

Datei anzeigen

@ -76,6 +76,10 @@ public class Region {
return maxX - minX; return maxX - minX;
} }
public int getSizeY() {
return maxY - minY;
}
public int getSizeZ() { public int getSizeZ() {
return maxZ - minZ; return maxZ - minZ;
} }