Merge remote-tracking branch 'origin/New_master' into New_master

# Conflicts:
#	changelog
#	src/main/java/api/hbm/entity/IRadarDetectableNT.java
#	src/main/java/api/hbm/entity/RadarEntry.java
#	src/main/java/com/hbm/handler/CompatHandler.java
#	src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java
#	src/main/java/com/hbm/packet/BufPacket.java
#	src/main/java/com/hbm/packet/PacketDispatcher.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadar.java
#	src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java
#	src/main/resources/assets/hbm/textures/gui/machine/gui_radar_nt.png
This commit is contained in:
BallOfEnergy 2023-11-28 21:56:20 -06:00
commit b9f14fd471
10 changed files with 409 additions and 597 deletions

View File

@ -1,12 +1,6 @@
## Added
* Doors!
* Your favorites from 1.12, the 7 remaining doors have finally been ported
* Thanks to KoblizekXD for biting the bullet
## Changed
* Reduced the blast resistance of the large doors from absurdly high to still very but not quite as high
* Custom missiles are now launchable using the radar
* NTM's structures should no longer spawn in dimensions besides the overworld. Ores will still generate, assuming the config option is set.
* Light oil and cracked light oil can now be refomred into large quantities of aromatic hydrocarbons a well as some reformate gas
## Fixed
* Fixed ancient bug where custom missiles launched using the launch table would not use the accuracy calculation and always be pin-point accurate
* Fixed thorium bedrock ore using the wrong ore dict key, making it unable to be processed via centrifuge or acidizer
* Fixed custom machine NEI slots going out of bounds after the third slot

View File

@ -15,31 +15,8 @@ public interface IRadarDetectableNT {
public static final int TIER_AB = 10;
public static final int PLAYER = 11;
public static final int ARTY = 12;
/** Reserved type that shows a unique purple blip. Used for when nothing else applies. */
public static final int SPECIAL = 13;
/** Name use for radar display, uses I18n for lookup */
public String getUnlocalizedName();
/** The type of dot to show on the radar as well as the redstone level in tier mode */
public int getBlipLevel();
/** Whether the object can be seen by this type of radar */
public boolean canBeSeenBy(Object radar);
/** Whether the object is currently visible, as well as whether the radar's setting allow for picking this up */
public boolean paramsApplicable(RadarScanParams params);
/** Whether this radar entry should be counted for the redstone output */
public boolean suppliesRedstone(RadarScanParams params);
public static class RadarScanParams {
public boolean scanMissiles = true;
public boolean scanShells = true;
public boolean scanPlayers = true;
public boolean smartMode = true;
public RadarScanParams(boolean m, boolean s, boolean p, boolean smart) {
this.scanMissiles = m;
this.scanShells = s;
this.scanPlayers = p;
this.smartMode = smart;
}
}
}

View File

@ -7,41 +7,34 @@ import net.minecraft.entity.player.EntityPlayer;
public class RadarEntry {
/** Name use for radar display, uses I18n for lookup */
public String unlocalizedName;
/** The type of dot to show on the radar as well as the redstone level in tier mode */
public int blipLevel;
public int posX;
public int posY;
public int posZ;
public int dim;
public int entityID;
/** Whether this radar entry should be counted for the redstone output */
public boolean redstone;
public RadarEntry() { } //blank ctor for packets
public RadarEntry(String name, int level, int x, int y, int z, int dim, int entityID, boolean redstone) {
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;
this.entityID = entityID;
this.redstone = redstone;
}
public RadarEntry(IRadarDetectableNT detectable, Entity entity, boolean redstone) {
this(detectable.getUnlocalizedName(), detectable.getBlipLevel(), (int) Math.floor(entity.posX), (int) Math.floor(entity.posY), (int) Math.floor(entity.posZ), entity.dimension, entity.getEntityId(), redstone);
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, entity.getEntityId(), entity.motionY < 0);
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, player.getEntityId(), true);
this(player.getDisplayName(), IRadarDetectableNT.PLAYER, (int) Math.floor(player.posX), (int) Math.floor(player.posY), (int) Math.floor(player.posZ), player.dimension);
}
public void fromBytes(ByteBuf buf) {
@ -51,7 +44,6 @@ public class RadarEntry {
this.posY = buf.readInt();
this.posZ = buf.readInt();
this.dim = buf.readShort();
this.entityID = buf.readInt();
}
public void toBytes(ByteBuf buf) {
@ -61,6 +53,5 @@ public class RadarEntry {
buf.writeInt(this.posY);
buf.writeInt(this.posZ);
buf.writeShort(this.dim);
buf.writeInt(this.entityID);
}
}

View File

@ -10,14 +10,12 @@ import com.hbm.inventory.fluid.Fluids;
* Mostly just functions used across many TEs.
*/
public class CompatHandler {
public static Object[] steamTypeToInt(FluidType type) {
if(type == Fluids.STEAM) {return new Object[] {0};} //switches break because objects
if(type == Fluids.STEAM) {return new Object[] {0};}
else if(type == Fluids.HOTSTEAM) {return new Object[] {1};}
else if(type == Fluids.SUPERHOTSTEAM) {return new Object[] {2};}
return new Object[] {3};
}
public static FluidType intToSteamType(int arg) {
switch(arg) {
default:
@ -30,5 +28,4 @@ public class CompatHandler {
return Fluids.ULTRAHOTSTEAM;
}
}
}

View File

@ -5,33 +5,22 @@ import java.util.Arrays;
import org.lwjgl.opengl.GL11;
import com.hbm.lib.RefStrings;
import com.hbm.packet.NBTControlPacket;
import com.hbm.packet.PacketDispatcher;
import com.hbm.tileentity.machine.TileEntityMachineRadarNT;
import com.hbm.util.BobMathUtil;
import com.hbm.util.I18nUtil;
import api.hbm.entity.RadarEntry;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Vec3;
public class GUIMachineRadarNT extends GuiScreen {
public static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_radar_nt.png");
protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_radar_nt.png");
protected TileEntityMachineRadarNT radar;
protected int xSize = 216;
protected int ySize = 234;
protected int guiLeft;
protected int guiTop;
public int lastMouseX;
public int lastMouseY;
public GUIMachineRadarNT(TileEntityMachineRadarNT tile) {
this.radar = tile;
@ -44,29 +33,6 @@ public class GUIMachineRadarNT extends GuiScreen {
this.guiTop = (this.height - this.ySize) / 2;
}
@Override
protected void mouseClicked(int x, int y, int i) {
super.mouseClicked(x, y, i);
String cmd = null;
if(checkClick(x, y, -10, 88, 8, 8)) cmd = "missiles";
if(checkClick(x, y, -10, 98, 8, 8)) cmd = "shells";
if(checkClick(x, y, -10, 108, 8, 8)) cmd = "players";
if(checkClick(x, y, -10, 118, 8, 8)) cmd = "smart";
if(checkClick(x, y, -10, 128, 8, 8)) cmd = "red";
if(checkClick(x, y, -10, 138, 8, 8)) cmd = "map";
if(checkClick(x, y, -10, 158, 8, 8)) cmd = "gui1";
if(checkClick(x, y, -10, 178, 8, 8)) cmd = "clear";
if(cmd != null) {
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
NBTTagCompound data = new NBTTagCompound();
data.setBoolean(cmd, true);
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, radar.xCoord, radar.yCoord, radar.zCoord));
}
}
@Override
public void drawScreen(int mouseX, int mouseY, float f) {
this.drawDefaultBackground();
@ -74,192 +40,24 @@ public class GUIMachineRadarNT extends GuiScreen {
GL11.glDisable(GL11.GL_LIGHTING);
this.drawGuiContainerForegroundLayer(mouseX, mouseY);
GL11.glEnable(GL11.GL_LIGHTING);
this.lastMouseX = mouseX;
this.lastMouseY = mouseY;
}
private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
if(checkClick(mouseX, mouseY, 8, 221, 200, 7)) this.func_146283_a(Arrays.asList(BobMathUtil.getShortNumber(radar.power) + "/" + BobMathUtil.getShortNumber(radar.maxPower) + "HE"), mouseX, mouseY);
if(checkClick(mouseX, mouseY, -10, 88, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectMissiles")), mouseX, mouseY);
if(checkClick(mouseX, mouseY, -10, 98, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectShells")), mouseX, mouseY);
if(checkClick(mouseX, mouseY, -10, 108, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectPlayers")), mouseX, mouseY);
if(checkClick(mouseX, mouseY, -10, 118, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.smartMode")), mouseX, mouseY);
if(checkClick(mouseX, mouseY, -10, 128, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.redMode")), mouseX, mouseY);
if(checkClick(mouseX, mouseY, -10, 138, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.showMap")), mouseX, mouseY);
if(checkClick(mouseX, mouseY, -10, 158, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.toggleGui")), mouseX, mouseY);
if(checkClick(mouseX, mouseY, -10, 178, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.clearMap")), mouseX, mouseY);
if(!radar.entries.isEmpty()) {
for(RadarEntry m : radar.entries) {
int x = guiLeft + (int)((m.posX - radar.xCoord) / ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) * (200D - 8D)) + 108;
int z = guiTop + (int)((m.posZ - radar.zCoord) / ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) * (200D - 8D)) + 117;
if(mouseX + 5 > x && mouseX - 4 <= x && mouseY + 5 > z && mouseY - 4 <= z) {
String[] text = new String[] { I18nUtil.resolveKey(m.unlocalizedName), m.posX + " / " + m.posZ, "Alt.: " + m.posY };
this.func_146283_a(Arrays.asList(text), x, z);
return;
}
}
}
if(checkClick(mouseX, mouseY, 8, 17, 200, 200)) {
int tX = (int) ((lastMouseX - guiLeft - 108) * ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) / 192D + radar.xCoord);
int tZ = (int) ((lastMouseY - guiTop - 117) * ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) / 192D + radar.zCoord);
this.func_146283_a(Arrays.asList(tX + " / " + tZ), lastMouseX, lastMouseY);
}
private void drawGuiContainerForegroundLayer(int x, int y) {
if(checkClick(x, y, -10, 88, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectMissiles")), x, y);
if(checkClick(x, y, -10, 98, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectShells")), x, y);
if(checkClick(x, y, -10, 108, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectPlayers")), x, y);
if(checkClick(x, y, -10, 118, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.smartMode")), x, y);
if(checkClick(x, y, -10, 128, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.redMode")), x, y);
if(checkClick(x, y, -10, 138, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.showMap")), x, y);
}
private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) {
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
drawTexturedModalRect(guiLeft - 14, guiTop + 84, 224, 0, 14, 66);
drawTexturedModalRect(guiLeft - 14, guiTop + 154, 224, 66, 14, 36);
if(radar.power > 0) {
int i = (int) (radar.power * 200 / radar.maxPower);
drawTexturedModalRect(guiLeft + 8, guiTop + 221, 0, 234, i, 16);
}
if(radar.scanMissiles ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 88, 238, 4, 8, 8);
if(radar.scanShells ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 98, 238, 14, 8, 8);
if(radar.scanPlayers ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 108, 238, 24, 8, 8);
if(radar.smartMode ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 118, 238, 34, 8, 8);
if(radar.redMode ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 128, 238, 44, 8, 8);
if(radar.showMap ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 138, 238, 54, 8, 8);
if(radar.power < radar.consumption) return;
if(radar.jammed) {
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 5; j++) {
drawTexturedModalRect(guiLeft + 8 + i * 40, guiTop + 17 + j * 40, 216, 118 + radar.getWorldObj().rand.nextInt(81), 40, 40);
}
}
return;
}
if(radar.showMap) {
Tessellator tess = Tessellator.instance;
GL11.glDisable(GL11.GL_TEXTURE_2D);
tess.startDrawingQuads();
for(int i = 0; i < 40_000; i++) {
int iX = i % 200;
int iZ = i / 200;
byte b = radar.map[i];
if(b > 0) {
int color = ((b - 50) * 255 / 78) << 8;
tess.setColorOpaque_I(color);
tess.addVertex(guiLeft + 8 + iX, guiTop + 18 + iZ, this.zLevel);
tess.addVertex(guiLeft + 9 + iX, guiTop + 18 + iZ, this.zLevel);
tess.addVertex(guiLeft + 9 + iX, guiTop + 17 + iZ, this.zLevel);
tess.addVertex(guiLeft + 8 + iX, guiTop + 17 + iZ, this.zLevel);
}
}
tess.draw();
GL11.glEnable(GL11.GL_TEXTURE_2D);
}
Vec3 tr = Vec3.createVectorHelper(100, 0, 0);
Vec3 tl = Vec3.createVectorHelper(100, 0, 0);
Vec3 bl = Vec3.createVectorHelper(0, -5, 0);
float rot = (float) -Math.toRadians(radar.prevRotation + (radar.rotation - radar.prevRotation) * f + 180F);
tr.rotateAroundZ(rot);
tl.rotateAroundZ(rot + 0.25F);
bl.rotateAroundZ(rot);
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glDisable(GL11.GL_ALPHA_TEST);
GL11.glShadeModel(GL11.GL_SMOOTH);
Tessellator tess = Tessellator.instance;
tess.startDrawingQuads();
tess.setColorRGBA_I(0x00ff00, 0); tess.addVertex(guiLeft + 108, guiTop + 117, this.zLevel);
tess.setColorRGBA_I(0x00ff00, 255); tess.addVertex(guiLeft + 108 + tr.xCoord, guiTop + 117 + tr.yCoord, this.zLevel);
tess.setColorRGBA_I(0x00ff00, 0); tess.addVertex(guiLeft + 108 + tl.xCoord, guiTop + 117 + tl.yCoord, this.zLevel);
tess.setColorRGBA_I(0x00ff00, 0); tess.addVertex(guiLeft + 108 + bl.xCoord, guiTop + 117 + bl.yCoord, this.zLevel);
tess.draw();
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_ALPHA_TEST);
GL11.glShadeModel(GL11.GL_FLAT);
if(!radar.entries.isEmpty()) {
for(RadarEntry m : radar.entries) {
double x = (m.posX - radar.xCoord) / ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) * (200D - 8D) - 4D;
double z = (m.posZ - radar.zCoord) / ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) * (200D - 8D) - 4D;
int t = m.blipLevel;
drawTexturedModalRectDouble(guiLeft + 108 + x, guiTop + 117 + z, 216, 8 * t, 8, 8);
}
}
}
public void drawTexturedModalRectDouble(double x, double y, int sourceX, int sourceY, int sizeX, int sizeY) {
float f = 0.00390625F;
float f1 = 0.00390625F;
Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
tessellator.addVertexWithUV(x, y + sizeY, this.zLevel, (sourceX + 0) * f, (sourceY + sizeY) * f1);
tessellator.addVertexWithUV(x + sizeX, y + sizeY, this.zLevel, (sourceX + sizeX) * f, (sourceY + sizeY) * f1);
tessellator.addVertexWithUV(x + sizeX, y, this.zLevel, (sourceX + sizeX) * f, (sourceY + 0) * f1);
tessellator.addVertexWithUV(x, y, this.zLevel, (sourceX + 0) * f, (sourceY + 0) * f1);
tessellator.draw();
}
protected boolean checkClick(int x, int y, int left, int top, int sizeX, int sizeY) {
return guiLeft + left <= x && guiLeft + left + sizeX > x && guiTop + top < y && guiTop + top + sizeY >= y;
}
@Override
protected void keyTyped(char c, int key) {
if(key == 1 || key == this.mc.gameSettings.keyBindInventory.getKeyCode()) {
this.mc.thePlayer.closeScreen();
}
if(checkClick(lastMouseX, lastMouseY, 8, 17, 200, 200) && c >= '1' && c <= '8') {
int id = c - '1';
if(!radar.entries.isEmpty()) {
for(RadarEntry m : radar.entries) {
int x = guiLeft + (int) ((m.posX - radar.xCoord) / ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) * (200D - 8D)) + 108;
int z = guiTop + (int) ((m.posZ - radar.zCoord) / ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) * (200D - 8D)) + 117;
if(lastMouseX + 5 > x && lastMouseX - 4 <= x && lastMouseY + 5 > z && lastMouseY - 4 <= z) {
NBTTagCompound data = new NBTTagCompound();
data.setInteger("launchEntity", m.entityID);
data.setInteger("link", id);
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, radar.xCoord, radar.yCoord, radar.zCoord));
return;
}
}
}
int tX = (int) ((lastMouseX - guiLeft - 108) * ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) / 192D + radar.xCoord);
int tZ = (int) ((lastMouseY - guiTop - 117) * ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) / 192D + radar.zCoord);
NBTTagCompound data = new NBTTagCompound();
data.setInteger("launchPosX", tX);
data.setInteger("launchPosZ", tZ);
data.setInteger("link", id);
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, radar.xCoord, radar.yCoord, radar.zCoord));
}
}
@Override
public boolean doesGuiPauseGame() {
return false;
}
@Override
public void updateScreen() {
super.updateScreen();
if(!this.mc.thePlayer.isEntityAlive() || this.mc.thePlayer.isDead) {
this.mc.thePlayer.closeScreen();
}
}
}

View File

@ -28,17 +28,11 @@ public class BufPacket implements IMessage {
@Override
public void fromBytes(ByteBuf buf) {
this.x = buf.readInt();
this.y = buf.readInt();
this.z = buf.readInt();
this.buf = buf;
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(x);
buf.writeInt(y);
buf.writeInt(z);
this.rec.serialize(buf);
}

View File

@ -19,6 +19,10 @@ public class PacketDispatcher {
wrapper.registerMessage(TEStructurePacket.Handler.class, TEStructurePacket.class, i++, Side.CLIENT);
//Mining drill rotation for rendering
wrapper.registerMessage(TEDrillPacket.Handler.class, TEDrillPacket.class, i++, Side.CLIENT);
//Mining drill torque for sounds
wrapper.registerMessage(TEDrillSoundPacket.Handler.class, TEDrillSoundPacket.class, i++, Side.CLIENT);
//Missile type for rendering
wrapper.registerMessage(TEMissilePacket.Handler.class, TEMissilePacket.class, i++, Side.CLIENT);
//Fluid packet for GUI
wrapper.registerMessage(TEFluidPacket.Handler.class, TEFluidPacket.class, i++, Side.CLIENT);
//Sound packet that keeps client and server separated
@ -31,6 +35,8 @@ public class PacketDispatcher {
wrapper.registerMessage(TESirenPacket.Handler.class, TESirenPacket.class, i++, Side.CLIENT);
//Signals server to change ItemStacks
wrapper.registerMessage(ItemDesignatorPacket.Handler.class, ItemDesignatorPacket.class, i++, Side.SERVER);
//Siren packet for looped sounds
wrapper.registerMessage(TERadarPacket.Handler.class, TERadarPacket.class, i++, Side.CLIENT);
//Signals server to perform orbital strike, among other things
wrapper.registerMessage(SatLaserPacket.Handler.class, SatLaserPacket.class, i++, Side.SERVER);
//Universal package for sending small info packs back to server

View File

@ -0,0 +1,342 @@
package com.hbm.tileentity.machine;
import java.util.ArrayList;
import java.util.List;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.WeaponConfig;
import com.hbm.extprop.HbmLivingProps;
import com.hbm.inventory.container.ContainerMachineRadar;
import com.hbm.inventory.gui.GUIMachineRadar;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.TileEntityTickingBase;
import api.hbm.energy.IEnergyUser;
import api.hbm.entity.IRadarDetectable;
import api.hbm.entity.IRadarDetectable.RadarTargetType;
import cpw.mods.fml.common.Optional;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import li.cil.oc.api.machine.Arguments;
import li.cil.oc.api.machine.Callback;
import li.cil.oc.api.machine.Context;
import li.cil.oc.api.network.SimpleComponent;
@Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")})
public class TileEntityMachineRadar extends TileEntityTickingBase implements IEnergyUser, IGUIProvider, SimpleComponent {
public List<Entity> detectedEntities = new ArrayList();
public List<int[]> nearbyMissiles = new ArrayList();
int pingTimer = 0;
int lastPower;
final static int maxTimer = 80;
public boolean scanMissiles = true;
public boolean scanPlayers = true;
public boolean smartMode = true;
public boolean redMode = true;
public boolean jammed = false;
public float prevRotation;
public float rotation;
public long power = 0;
public static final int maxPower = 100000;
@Override
public String getInventoryName() {
return "";
}
@Override
public void updateEntity() {
if(this.yCoord < WeaponConfig.radarAltitude) return;
if(!worldObj.isRemote) {
this.updateStandardConnections(worldObj, xCoord, yCoord, zCoord);
nearbyMissiles.clear();
if(power > 0) {
allocateMissiles();
power -= 500;
if(power < 0) power = 0;
}
if(this.lastPower != getRedPower()) worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType());
sendMissileData();
lastPower = getRedPower();
if(worldObj.getBlock(xCoord, yCoord - 1, zCoord) != ModBlocks.muffler) {
pingTimer++;
if(power > 0 && pingTimer >= maxTimer) {
this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.sonarPing", 5.0F, 1.0F);
pingTimer = 0;
}
}
} else {
prevRotation = rotation;
if(power > 0) rotation += 5F;
if(rotation >= 360) {
rotation -= 360F;
prevRotation -= 360F;
}
}
}
public void handleButtonPacket(int value, int meta) {
switch(meta) {
case 0: this.scanMissiles = !this.scanMissiles; break;
case 1: this.scanPlayers = !this.scanPlayers; break;
case 2: this.smartMode = !this.smartMode; break;
case 3: this.redMode = !this.redMode; break;
}
}
private void allocateMissiles() {
nearbyMissiles.clear();
detectedEntities.clear();
jammed = false;
List<Entity> list = worldObj.getEntitiesWithinAABBExcludingEntity(null, AxisAlignedBB.getBoundingBox(xCoord + 0.5 - WeaponConfig.radarRange, 0, zCoord + 0.5 - WeaponConfig.radarRange, xCoord + 0.5 + WeaponConfig.radarRange, 5000, zCoord + 0.5 + WeaponConfig.radarRange));
for(Entity e : list) {
if(e.posY < yCoord + WeaponConfig.radarBuffer)
continue;
if(e instanceof EntityLivingBase && HbmLivingProps.getDigamma((EntityLivingBase) e) > 0.001) {
this.jammed = true;
nearbyMissiles.clear();
detectedEntities.clear();
return;
}
if(e instanceof EntityPlayer && this.scanPlayers) {
nearbyMissiles.add(new int[] { (int)e.posX, (int)e.posZ, RadarTargetType.PLAYER.ordinal(), (int)e.posY });
detectedEntities.add(e);
}
if(e instanceof IRadarDetectable && this.scanMissiles) {
nearbyMissiles.add(new int[] { (int)e.posX, (int)e.posZ, ((IRadarDetectable)e).getTargetType().ordinal(), (int)e.posY });
if(!this.smartMode || e.motionY <= 0)
detectedEntities.add(e);
}
}
}
public int getRedPower() {
if(!detectedEntities.isEmpty()) {
/// PROXIMITY ///
if(redMode) {
double maxRange = WeaponConfig.radarRange * Math.sqrt(2D);
int power = 0;
for(int i = 0; i < detectedEntities.size(); i++) {
Entity e = detectedEntities.get(i);
double dist = Math.sqrt(Math.pow(e.posX - xCoord, 2) + Math.pow(e.posZ - zCoord, 2));
int p = 15 - (int)Math.floor(dist / maxRange * 15);
if(p > power)
power = p;
}
return power;
/// TIER ///
} else {
int power = 0;
for(int i = 0; i < nearbyMissiles.size(); i++) {
if(nearbyMissiles.get(i)[2] + 1 > power) {
power = nearbyMissiles.get(i)[2] + 1;
}
}
return power;
}
}
return 0;
}
private void sendMissileData() {
NBTTagCompound data = new NBTTagCompound();
data.setLong("power", power);
data.setBoolean("scanMissiles", scanMissiles);
data.setBoolean("scanPlayers", scanPlayers);
data.setBoolean("smartMode", smartMode);
data.setBoolean("redMode", redMode);
data.setBoolean("jammed", jammed);
data.setInteger("count", this.nearbyMissiles.size());
for(int i = 0; i < this.nearbyMissiles.size(); i++) {
data.setInteger("x" + i, this.nearbyMissiles.get(i)[0]);
data.setInteger("z" + i, this.nearbyMissiles.get(i)[1]);
data.setInteger("type" + i, this.nearbyMissiles.get(i)[2]);
data.setInteger("y" + i, this.nearbyMissiles.get(i)[3]);
}
this.networkPack(data, 15);
}
public void networkUnpack(NBTTagCompound data) {
this.nearbyMissiles.clear();
this.power = data.getLong("power");
this.scanMissiles = data.getBoolean("scanMissiles");
this.scanPlayers = data.getBoolean("scanPlayers");
this.smartMode = data.getBoolean("smartMode");
this.redMode = data.getBoolean("redMode");
this.jammed = data.getBoolean("jammed");
int count = data.getInteger("count");
for(int i = 0; i < count; i++) {
int x = data.getInteger("x" + i);
int z = data.getInteger("z" + i);
int type = data.getInteger("type" + i);
int y = data.getInteger("y" + i);
this.nearbyMissiles.add(new int[] {x, z, type, y});
}
}
public long getPowerScaled(long i) {
return (power * i) / maxPower;
}
@Override
public void setPower(long i) {
power = i;
}
@Override
public long getPower() {
return power;
}
@Override
public long getMaxPower() {
return maxPower;
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
this.power = nbt.getLong("power");
this.scanMissiles = nbt.getBoolean("scanMissiles");
this.scanPlayers = nbt.getBoolean("scanPlayers");
this.smartMode = nbt.getBoolean("smartMode");
this.redMode = nbt.getBoolean("redMode");
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setLong("power", power);
nbt.setBoolean("scanMissiles", scanMissiles);
nbt.setBoolean("scanPlayers", scanPlayers);
nbt.setBoolean("smartMode", smartMode);
nbt.setBoolean("redMode", redMode);
}
@Override
public AxisAlignedBB getRenderBoundingBox() {
return TileEntity.INFINITE_EXTENT_AABB;
}
@Override
@SideOnly(Side.CLIENT)
public double getMaxRenderDistanceSquared()
{
return 65536.0D;
}
// do some opencomputer stuff
@Override
public String getComponentName() {
return "ntm_radar";
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getEnergyInfo(Context context, Arguments args) {
return new Object[] {getPower(), getMaxPower()};
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] isJammed(Context context, Arguments args) {
return new Object[] {jammed};
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getEntities(Context context, Arguments args) { //fuck fuck fuck
if(!jammed) {
List<Object> list = new ArrayList();
list.add(detectedEntities.size()); // small header of how many entities in the list
for (Entity e : detectedEntities) {
list.add(e.posX); // positions
list.add(e.posY);
list.add(e.posZ);
list.add(e.motionX);
list.add(e.motionY);
list.add(e.motionZ);
list.add(e.rotationYaw); // just do rotation so you can calculate DOT
list.add(Math.sqrt(Math.pow(e.posX - xCoord, 2) + Math.pow(e.posZ - zCoord, 2))); // distance
boolean player = e instanceof EntityPlayer;
list.add(player); // isPlayer boolean
if(!player) // missile tier
list.add(((IRadarDetectable) e).getTargetType().ordinal());
else // player name (hopefully)
list.add(((EntityPlayer) e).getDisplayName());
}
return new Object[] {list}; // long-ass list (like 9 entries per entity)
} else {
return new Object[] {"Radar jammed!"};
}
}
@Override
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new ContainerMachineRadar(player.inventory, this);
}
@Override
@SideOnly(Side.CLIENT)
public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new GUIMachineRadar(player.inventory, this);
}
}

View File

@ -7,45 +7,27 @@ import java.util.function.Function;
import com.google.gson.JsonObject;
import com.google.gson.stream.JsonWriter;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.WeaponConfig;
import com.hbm.extprop.HbmLivingProps;
import com.hbm.interfaces.IControlReceiver;
import com.hbm.inventory.container.ContainerMachineRadarNT;
import com.hbm.inventory.gui.GUIMachineRadarNT;
import com.hbm.inventory.gui.GUIMachineRadarNTSlots;
import com.hbm.items.ModItems;
import com.hbm.items.tool.ItemCoordinateBase;
import com.hbm.lib.Library;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.IConfigurableMachine;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.IRadarCommandReceiver;
import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.util.Tuple.Triplet;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.world.WorldUtil;
import com.hbm.util.Tuple.Pair;
import api.hbm.energy.IEnergyUser;
import api.hbm.entity.IRadarDetectable;
import api.hbm.entity.IRadarDetectableNT;
import api.hbm.entity.IRadarDetectableNT.RadarScanParams;
import api.hbm.entity.RadarEntry;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
@ -53,7 +35,7 @@ import net.minecraft.world.WorldServer;
* Now with SmЯt lag-free entity detection! (patent pending)
* @author hbm
*/
public class TileEntityMachineRadarNT extends TileEntityMachineBase implements IEnergyUser, IGUIProvider, IConfigurableMachine, IControlReceiver {
public class TileEntityMachineRadarNT extends TileEntityMachineBase implements IGUIProvider, IConfigurableMachine {
public boolean scanMissiles = true;
public boolean scanShells = true;
@ -68,21 +50,12 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I
public float rotation;
public long power = 0;
protected int pingTimer = 0;
protected int lastPower;
protected final static int maxTimer = 80;
public static int maxPower = 100_000;
public static int consumption = 500;
public static int radarRange = 1_000;
public static int radarBuffer = 30;
public static int radarAltitude = 55;
public static int chunkLoadCap = 10;
public static boolean generateChunks = false;
public byte[] map = new byte[40_000];
public boolean clearFlag = false;
public List<RadarEntry> entries = new ArrayList();
@ -98,8 +71,6 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I
radarRange = IConfigurableMachine.grab(obj, "I:radarRange", radarRange);
radarBuffer = IConfigurableMachine.grab(obj, "I:radarBuffer", radarBuffer);
radarAltitude = IConfigurableMachine.grab(obj, "I:radarAltitude", radarAltitude);
chunkLoadCap = IConfigurableMachine.grab(obj, "I:chunkLoadCap", chunkLoadCap);
generateChunks = IConfigurableMachine.grab(obj, "B:generateChunks", generateChunks);
}
@Override
@ -109,108 +80,65 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I
writer.name("I:radarRange").value(radarRange);
writer.name("I:radarBuffer").value(radarBuffer);
writer.name("I:radarAltitude").value(radarAltitude);
writer.name("B:generateChunks").value(generateChunks);
}
public TileEntityMachineRadarNT() {
super(10);
super(1);
}
@Override
public String getName() {
return "container.radar";
return "";
}
@Override
public void updateEntity() {
if(this.map == null || this.map.length != 40_000) this.map = new byte[40_000];
if(!worldObj.isRemote) {
this.power = Library.chargeTEFromItems(slots, 9, power, maxPower);
if(worldObj.getTotalWorldTime() % 20 == 0) this.updateStandardConnections(worldObj, xCoord, yCoord, zCoord);
this.power = Library.chargeTEFromItems(slots, 0, power, maxPower);
this.jammed = false;
allocateTargets();
if(this.lastPower != getRedPower()) {
this.markDirty();
}
lastPower = getRedPower();
this.networkPackNT(25);
}
}
protected void allocateTargets() {
this.entries.clear();
if(this.yCoord < radarAltitude) return;
if(this.power <= consumption) return;
this.power -= consumption;
int scan = this.scanRange();
for(Entity e : matchingEntities) {
if(worldObj.getBlock(xCoord, yCoord - 1, zCoord) != ModBlocks.muffler) {
if(e.dimension == worldObj.provider.dimensionId && Math.abs(e.posX - (xCoord + 0.5)) <= scan && Math.abs(e.posZ - (zCoord + 0.5)) <= scan && e.posY - yCoord < radarBuffer) {
pingTimer++;
if(power > 0 && pingTimer >= maxTimer) {
this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.sonarPing", 5.0F, 1.0F);
pingTimer = 0;
if(e instanceof EntityLivingBase && HbmLivingProps.getDigamma((EntityLivingBase) e) > 0.001) {
this.jammed = true;
entries.clear();
return;
}
}
if(this.showMap) {
int chunkLoads = 0;
for(int i = 0; i < 100; i++) {
int index = (int) (worldObj.getTotalWorldTime() % 400) * 100 + i;
int iX = (index % 200) * radarRange * 2 / 200;
int iZ = index / 200 * radarRange * 2 / 200;
for(Function<Pair<Entity, Object>, RadarEntry> converter : converters) {
int x = xCoord - radarRange + iX;
int z = zCoord - radarRange + iZ;
if(worldObj.getChunkProvider().chunkExists(x >> 4, z >> 4)) {
this.map[index] = (byte) MathHelper.clamp_int(worldObj.getHeightValue(x, z), 50, 128);
} else {
if(this.map[index] == 0 && chunkLoads < chunkLoadCap) {
if(this.generateChunks) {
worldObj.getChunkFromChunkCoords(x >> 4, z >> 4);
this.map[index] = (byte) MathHelper.clamp_int(worldObj.getHeightValue(x, z), 50, 128);
chunkLoads++;
} else {
WorldUtil.provideChunk((WorldServer) worldObj, x >> 4, z >> 4);
this.map[index] = (byte) MathHelper.clamp_int(worldObj.getHeightValue(x, z), 50, 128);
if(worldObj.getChunkProvider().chunkExists(x >> 4, z >> 4)) chunkLoads++;
}
}
RadarEntry entry = converter.apply(new Pair(e, this));
if(entry != null) {
this.entries.add(entry);
break;
}
}
}
if(slots[8] != null && slots[8].getItem() == ModItems.radar_linker) {
BlockPos pos = ItemCoordinateBase.getPosition(slots[8]);
if(pos != null) {
TileEntity tile = worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ());
if(tile instanceof TileEntityMachineRadarScreen) {
TileEntityMachineRadarScreen screen = (TileEntityMachineRadarScreen) tile;
screen.entries.clear();
screen.entries.addAll(this.entries);
screen.refX = xCoord;
screen.refY = yCoord;
screen.refZ = zCoord;
screen.linked = true;
}
}
}
this.networkPackNT(50);
if(this.clearFlag) {
this.map = new byte[40_000];
this.clearFlag = false;
}
} else {
prevRotation = rotation;
if(power > 0) rotation += 5F;
if(rotation >= 360) {
rotation -= 360F;
prevRotation -= 360F;
}
}
}
protected int scanRange() {
return radarRange;
}
@Override
public void serialize(ByteBuf buf) {
buf.writeLong(this.power);
@ -223,21 +151,6 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I
buf.writeBoolean(this.jammed);
buf.writeInt(entries.size());
for(RadarEntry entry : entries) entry.toBytes(buf);
if(this.clearFlag) {
buf.writeBoolean(true);
} else {
buf.writeBoolean(false);
if(this.showMap) {
buf.writeBoolean(true);
short index = (short) (worldObj.getTotalWorldTime() % 400);
buf.writeShort(index);
for(int i = index * 100; i < (index + 1) * 100; i++) {
buf.writeByte(this.map[i]);
}
} else {
buf.writeBoolean(false);
}
}
}
@Override
@ -251,193 +164,11 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I
this.showMap = buf.readBoolean();
this.jammed = buf.readBoolean();
int count = buf.readInt();
this.entries.clear();
for(int i = 0; i < count; i++) {
RadarEntry entry = new RadarEntry();
entry.fromBytes(buf);
this.entries.add(entry);
}
if(buf.readBoolean()) { // clear flag
this.map = new byte[40_000];
} else {
if(buf.readBoolean()) { // map enabled
int index = buf.readShort();
for(int i = index * 100; i < (index + 1) * 100; i++) {
this.map[i] = buf.readByte();
}
}
}
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
this.power = nbt.getLong("power");
this.scanMissiles = nbt.getBoolean("scanMissiles");
this.scanShells = nbt.getBoolean("scanShells");
this.scanPlayers = nbt.getBoolean("scanPlayers");
this.smartMode = nbt.getBoolean("smartMode");
this.redMode = nbt.getBoolean("redMode");
this.showMap = nbt.getBoolean("showMap");
if(nbt.hasKey("map")) this.map = nbt.getByteArray("map");
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setLong("power", power);
nbt.setBoolean("scanMissiles", scanMissiles);
nbt.setBoolean("scanShells", scanShells);
nbt.setBoolean("scanPlayers", scanPlayers);
nbt.setBoolean("smartMode", smartMode);
nbt.setBoolean("redMode", redMode);
nbt.setBoolean("showMap", showMap);
nbt.setByteArray("map", map);
}
protected void allocateTargets() {
this.entries.clear();
if(this.yCoord < radarAltitude) return;
if(this.power < consumption) return;
this.power -= consumption;
int scan = this.scanRange();
RadarScanParams params = new RadarScanParams(this.scanMissiles, this.scanShells, this.scanPlayers, this.smartMode);
for(Entity e : matchingEntities) {
if(e.dimension == worldObj.provider.dimensionId && Math.abs(e.posX - (xCoord + 0.5)) <= scan && Math.abs(e.posZ - (zCoord + 0.5)) <= scan && e.posY - yCoord > radarBuffer) {
if(e instanceof EntityLivingBase && HbmLivingProps.getDigamma((EntityLivingBase) e) > 0.001) {
this.jammed = true;
entries.clear();
return;
}
for(Function<Triplet<Entity, Object, RadarScanParams>, RadarEntry> converter : converters) {
RadarEntry entry = converter.apply(new Triplet(e, this, params));
if(entry != null) {
this.entries.add(entry);
break;
}
}
}
}
}
public int getRedPower() {
if(!entries.isEmpty()) {
/// PROXIMITY ///
if(redMode) {
double maxRange = WeaponConfig.radarRange * Math.sqrt(2D);
int power = 0;
for(int i = 0; i < entries.size(); i++) {
RadarEntry e = entries.get(i);
if(!e.redstone) continue;
double dist = Math.sqrt(Math.pow(e.posX - xCoord, 2) + Math.pow(e.posZ - zCoord, 2));
int p = 15 - (int)Math.floor(dist / maxRange * 15);
if(p > power) power = p;
}
return power;
/// TIER ///
} else {
int power = 0;
for(int i = 0; i < entries.size(); i++) {
RadarEntry e = entries.get(i);
if(!e.redstone) continue;
if(e.blipLevel + 1 > power) {
power = e.blipLevel + 1;
}
}
return power;
}
}
return 0;
}
protected int scanRange() {
return radarRange;
}
@Override
public void setPower(long i) {
power = i;
}
@Override
public long getPower() {
return power;
}
@Override
public long getMaxPower() {
return maxPower;
}
@Override
public boolean hasPermission(EntityPlayer player) {
return this.isUseableByPlayer(player);
}
@Override public void receiveControl(NBTTagCompound data) { }
@Override
public void receiveControl(EntityPlayer player, NBTTagCompound data) {
if(data.hasKey("missiles")) this.scanMissiles = !this.scanMissiles;
if(data.hasKey("shells")) this.scanShells = !this.scanShells;
if(data.hasKey("players")) this.scanPlayers = !this.scanPlayers;
if(data.hasKey("smart")) this.smartMode = !this.smartMode;
if(data.hasKey("red")) this.redMode = !this.redMode;
if(data.hasKey("map")) this.showMap = !this.showMap;
if(data.hasKey("clear")) this.clearFlag = true;
if(data.hasKey("gui1")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 1, worldObj, xCoord, yCoord, zCoord);
if(data.hasKey("link")) {
int id = data.getInteger("link");
ItemStack link = slots[id];
if(link != null && link.getItem() == ModItems.radar_linker) {
BlockPos pos = ItemCoordinateBase.getPosition(link);
if(pos != null) {
TileEntity tile = worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ());
if(tile instanceof IRadarCommandReceiver) {
IRadarCommandReceiver rec = (IRadarCommandReceiver) tile;
if(data.hasKey("launchEntity")) {
Entity entity = worldObj.getEntityByID(data.getInteger("launchEntity"));
if(entity != null) {
if(rec.sendCommandEntity(entity)) {
worldObj.playSoundAtEntity(player, "hbm:item.techBleep", 1.0F, 1.0F);
}
}
} else if(data.hasKey("launchPosX")) {
int x = data.getInteger("launchPosX");
int z = data.getInteger("launchPosZ");
if(rec.sendCommandPosition(x, yCoord, z)) {
worldObj.playSoundAtEntity(player, "hbm:item.techBleep", 1.0F, 1.0F);
}
}
}
}
}
}
}
AxisAlignedBB bb = null;
@ -461,36 +192,22 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I
@Override
@SideOnly(Side.CLIENT)
public double getMaxRenderDistanceSquared() {
public double getMaxRenderDistanceSquared()
{
return 65536.0D;
}
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) {
return false;
} else {
return player.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 128;
}
}
@Override
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
if(ID == 1) return new ContainerMachineRadarNT(player.inventory, this);
return null;
}
@Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; }
@Override
@SideOnly(Side.CLIENT)
public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
if(ID == 0) return new GUIMachineRadarNT(this);
if(ID == 1) return new GUIMachineRadarNTSlots(player.inventory, this);
return null;
return new GUIMachineRadarNT(this);
}
/** 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<Triplet<Entity, Object, RadarScanParams>, RadarEntry>> converters = new ArrayList();
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();
@ -501,7 +218,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I
public static void updateSystem() {
matchingEntities.clear();
for(WorldServer world : MinecraftServer.getServer().worldServers) {
for(WorldServer world : Minecraft.getMinecraft().getIntegratedServer().worldServers) {
for(Object entity : world.loadedEntityList) {
for(Class clazz : classes) {
if(clazz.isAssignableFrom(entity.getClass())) {
@ -524,25 +241,21 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I
public static void registerConverters() {
//IRadarDetectableNT
converters.add(x -> {
Entity e = x.getX();
Entity e = x.getKey();
if(e instanceof IRadarDetectableNT) {
IRadarDetectableNT detectable = (IRadarDetectableNT) e;
if(detectable.canBeSeenBy(x.getY()) && detectable.paramsApplicable(x.getZ())) return new RadarEntry(detectable, e, detectable.suppliesRedstone(x.getZ()));
if(detectable.canBeSeenBy(x.getValue())) return new RadarEntry(detectable, e);
}
return null;
});
//IRadarDetectable, Legacy
converters.add(x -> {
Entity e = x.getX();
RadarScanParams params = x.getZ();
if(e instanceof IRadarDetectable && params.scanMissiles) {
return new RadarEntry((IRadarDetectable) e, e);
}
if(x.getKey() instanceof IRadarDetectable) return new RadarEntry((IRadarDetectable) x.getKey(), x.getKey());
return null;
});
//Players
converters.add(x -> {
if(x.getX() instanceof EntityPlayer && x.getZ().scanPlayers) return new RadarEntry((EntityPlayer) x.getX());
if(x.getKey() instanceof EntityPlayer) return new RadarEntry((EntityPlayer) x.getKey());
return null;
});
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 21 KiB