radar rewrite, first attempt

This commit is contained in:
Bob 2023-11-12 21:11:38 +01:00
parent d0d8f2c285
commit e13e926ae3
7 changed files with 4417 additions and 1 deletions

View File

@ -1,5 +1,6 @@
package api.hbm.entity;
@Deprecated //Use IRadarDetectableNT instead, old interface will still work though
public interface IRadarDetectable {
public static enum RadarTargetType {
@ -15,7 +16,7 @@ public interface IRadarDetectable {
MISSILE_20("Size 20 Custom Missile"), //size 20 custom missiles
MISSILE_AB("Anti-Ballistic Missile"), //anti ballistic missile
PLAYER("Player"), //airborne players
ARTILLERY("Artillery Shell"); //airborne players
ARTILLERY("Artillery Shell"); //artillery shells
public String name;

View File

@ -0,0 +1,22 @@
package api.hbm.entity;
public interface IRadarDetectableNT {
public static final int TIER0 = 0;
public static final int TIER1 = 1;
public static final int TIER2 = 2;
public static final int TIER3 = 3;
public static final int TIER4 = 4;
public static final int TIER10 = 5;
public static final int TIER10_15 = 6;
public static final int TIER15 = 7;
public static final int TIER15_20 = 8;
public static final int TIER20 = 9;
public static final int TIER_AB = 10;
public static final int PLAYER = 11;
public static final int ARTY = 12;
public String getUnlocalizedName();
public int getBlipLevel();
public boolean canBeSeenBy(Object radar);
}

View File

@ -0,0 +1,35 @@
package api.hbm.entity;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
public class RadarEntry {
public String unlocalizedName;
public int blipLevel;
public int posX;
public int posY;
public int posZ;
public int dim;
public RadarEntry(String name, int level, int x, int y, int z, int dim) {
this.unlocalizedName = name;
this.blipLevel = level;
this.posX = x;
this.posY = y;
this.posZ = z;
this.dim = dim;
}
public RadarEntry(IRadarDetectableNT detectable, Entity entity) {
this(detectable.getUnlocalizedName(), detectable.getBlipLevel(), (int) Math.floor(entity.posX), (int) Math.floor(entity.posY), (int) Math.floor(entity.posZ), entity.dimension);
}
public RadarEntry(IRadarDetectable detectable, Entity entity) {
this(detectable.getTargetType().name, detectable.getTargetType().ordinal(), (int) Math.floor(entity.posX), (int) Math.floor(entity.posY), (int) Math.floor(entity.posZ), entity.dimension);
}
public RadarEntry(EntityPlayer player) {
this(player.getDisplayName(), IRadarDetectableNT.PLAYER, (int) Math.floor(player.posX), (int) Math.floor(player.posY), (int) Math.floor(player.posZ), player.dimension);
}
}

View File

@ -0,0 +1,105 @@
package com.hbm.tileentity.machine;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.util.Tuple.Pair;
import api.hbm.entity.IRadarDetectable;
import api.hbm.entity.IRadarDetectableNT;
import api.hbm.entity.RadarEntry;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.WorldServer;
/**
* Now with SmЯt lag-free entity detection!
* @author hbm
*/
public class TileEntityMachineRadarNT extends TileEntityMachineBase {
public boolean scanMissiles = true;
public boolean scanPlayers = true;
public boolean smartMode = true;
public boolean redMode = true;
public boolean jammed = false;
public TileEntityMachineRadarNT() {
super(1);
}
@Override
public String getName() {
return "";
}
@Override
public void updateEntity() {
}
//List of lambdas that are supplied a Pair with the entity and radar in question to generate a RadarEntry
//The converters coming first have the highest priority
public static List<Function<Pair<Entity, Object>, RadarEntry>> converters = new ArrayList();
public static List<Class> classes = new ArrayList();
public static List<Entity> matchingEntities = new ArrayList();
/**
* Iterates over every entity in the world and add them to the matchingEntities list if the class is in the detectable list
* From this compiled list, radars can easily grab the required entities since we can assume that the total amount of detectable entities is comparatively low
*/
public static void updateSystem() {
matchingEntities.clear();
for(WorldServer world : Minecraft.getMinecraft().getIntegratedServer().worldServers) {
for(Object entity : world.loadedEntityList) {
for(Class clazz : classes) {
if(clazz.isAssignableFrom(entity.getClass())) {
matchingEntities.add((Entity) entity);
break;
}
}
}
}
}
/** Registers a class that if an entity inherits that class, it is picked up by the system */
public static void registerEntityClasses() {
classes.add(IRadarDetectableNT.class);
classes.add(IRadarDetectable.class);
classes.add(EntityPlayer.class);
}
/** Registers converters. Converters are used to go over the list of detected entities and turn them into a RadarEntry using the entity instance and the radar's instance. */
public static void registerConverters() {
//IRadarDetectableNT
converters.add(x -> {
Entity e = x.getKey();
if(e instanceof IRadarDetectableNT) {
IRadarDetectableNT detectable = (IRadarDetectableNT) e;
if(detectable.canBeSeenBy(x.getValue())) return new RadarEntry(detectable, e);
}
return null;
});
//IRadarDetectable, Legacy
converters.add(x -> {
Entity e = x.getKey();
if(e instanceof IRadarDetectable) {
return new RadarEntry((IRadarDetectable) e, e);
}
return null;
});
//Players
converters.add(x -> {
Entity e = x.getKey();
if(e instanceof EntityPlayer) {
return new RadarEntry((EntityPlayer) e);
}
return null;
});
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB