proxy tiles work with re-eval, network debugger item

This commit is contained in:
Boblet 2022-04-04 11:19:23 +02:00
parent 27b9948b2b
commit 7cb0bec184
16 changed files with 286 additions and 20 deletions

View File

@ -5,6 +5,7 @@ import java.util.HashMap;
import java.util.List;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Vec3;
import net.minecraftforge.common.util.ForgeDirection;
/**
@ -52,7 +53,7 @@ public interface IEnergyConductor extends IEnergyConnector {
* Each link has to decide what other links will join the same net.
* @param copy
*/
public default void reevaluate(HashMap<Integer, IEnergyConductor> copy) {
public default void reevaluate(HashMap<Integer, IEnergyConductor> copy, HashMap<Integer, Integer> proxies) {
for(int[] pos : getConnectionPoints()) {
int newX = pos[0];
@ -62,12 +63,37 @@ public interface IEnergyConductor extends IEnergyConnector {
IEnergyConductor neighbor = copy.get(id);
if(neighbor != null && neighbor.getPowerNet() != null && this.canReevaluate() && neighbor.canReevaluate()) {
if(neighbor == null) {
Integer newId = proxies.get(id);
if(this.getPowerNet() == null) {
neighbor.getPowerNet().joinLink(this);
if(newId != null) {
neighbor = copy.get(newId);
}
}
if(neighbor != null && this.canReevaluate() && neighbor.canReevaluate()) {
if(neighbor.getPowerNet() != null) {
//neighbor net and no self net
if(this.getPowerNet() == null) {
neighbor.getPowerNet().joinLink(this);
//neighbor net and self net
} else {
this.getPowerNet().joinNetworks(neighbor.getPowerNet());
}
//bidirectional re-eval, experimental and technically optional, only useful as a fallback
} else {
this.getPowerNet().joinNetworks(neighbor.getPowerNet());
//no neighbor net and no self net
if(this.getPowerNet() == null) {
this.setPowerNet(new PowerNet().joinLink(this));
neighbor.setPowerNet(this.getPowerNet().joinLink(neighbor));
//no neighbor net and self net
} else {
neighbor.setPowerNet(this.getPowerNet().joinLink(neighbor));
}
}
}
}
@ -114,4 +140,10 @@ public interface IEnergyConductor extends IEnergyConnector {
return this.getPowerNet().transferPower(power);
}
public default Vec3 getDebugParticlePos() {
TileEntity te = (TileEntity) this;
Vec3 vec = Vec3.createVectorHelper(te.xCoord + 0.5, te.yCoord + 1.5, te.zCoord + 0.5);
return vec;
}
}

View File

@ -1,5 +1,8 @@
package api.hbm.energy;
import java.util.ArrayList;
import java.util.List;
import com.hbm.packet.AuxParticlePacketNT;
import com.hbm.packet.PacketDispatcher;
@ -94,4 +97,20 @@ public interface IEnergyConnector extends ILoadedTile {
}
public static final boolean particleDebug = false;
/**
* Returns whether the conductor has mutliblock proxies which need to be taken into consideration for re-eval.
* @return
*/
public default boolean hasProxies() {
return false;
}
/**
* Returns the identities (position-based) of proxies which resolve into the conductor's own identity.
* @return
*/
public default List<Integer> getProxies() {
return new ArrayList();
}
}

View File

@ -15,6 +15,7 @@ public class PowerNet implements IPowerNet {
private boolean valid = true;
private HashMap<Integer, IEnergyConductor> links = new HashMap();
private HashMap<Integer, Integer> proxies = new HashMap();
private List<IEnergyConnector> subscribers = new ArrayList();
@Override
@ -42,14 +43,29 @@ public class PowerNet implements IPowerNet {
conductor.getPowerNet().leaveLink(conductor);
conductor.setPowerNet(this);
this.links.put(conductor.getIdentity(), conductor);
int identity = conductor.getIdentity();
this.links.put(identity, conductor);
if(conductor.hasProxies()) {
for(Integer i : conductor.getProxies()) {
this.proxies.put(i, identity);
}
}
return this;
}
@Override
public void leaveLink(IEnergyConductor conductor) {
conductor.setPowerNet(null);
this.links.remove(conductor.getIdentity());
int identity = conductor.getIdentity();
this.links.remove(identity);
if(conductor.hasProxies()) {
for(Integer i : conductor.getProxies()) {
this.proxies.remove(i);
}
}
}
@Override
@ -74,6 +90,11 @@ public class PowerNet implements IPowerNet {
return linkList;
}
public HashMap<Integer, Integer> getProxies() {
HashMap<Integer, Integer> proxyCopy = new HashMap(proxies);
return proxyCopy;
}
@Override
public List<IEnergyConnector> getSubscribers() {
return this.subscribers;
@ -143,8 +164,9 @@ public class PowerNet implements IPowerNet {
@Override
public void reevaluate() {
HashMap<Integer, IEnergyConductor> copy = new HashMap(links);
HashMap<Integer, Integer> proxyCopy = new HashMap(proxies);
for(IEnergyConductor link : copy.values()) {
this.leaveLink(link);
@ -153,7 +175,7 @@ public class PowerNet implements IPowerNet {
for(IEnergyConductor link : copy.values()) {
link.setPowerNet(null);
link.reevaluate(copy);
link.reevaluate(copy, proxyCopy);
if(link.getPowerNet() == null) {
link.setPowerNet(new PowerNet().joinLink(link));

View File

@ -471,6 +471,8 @@ public class ModBlocks {
public static Block fallout;
public static Block foam_layer;
public static Block sand_boron_layer;
public static Block leaves_layer;
public static Block sellafield_slaked;
public static Block sellafield_0;
@ -1677,6 +1679,7 @@ public class ModBlocks {
fallout = new BlockFallout(Material.snow).setBlockName("fallout").setStepSound(Block.soundTypeGravel).setCreativeTab(MainRegistry.blockTab).setHardness(0.1F).setLightOpacity(0).setBlockTextureName(RefStrings.MODID + ":ash");
foam_layer = new BlockLayering(Material.snow).setBlockName("foam_layer").setStepSound(Block.soundTypeSnow).setCreativeTab(MainRegistry.blockTab).setHardness(0.1F).setLightOpacity(0).setBlockTextureName(RefStrings.MODID + ":foam");
sand_boron_layer = new BlockLayering(Material.sand).setBlockName("sand_boron_layer").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.1F).setLightOpacity(0).setBlockTextureName(RefStrings.MODID + ":sand_boron");
leaves_layer = new BlockLayering(Material.leaves).setBlockName("leaves_layer").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.1F).setLightOpacity(0).setBlockTextureName(RefStrings.MODID + ":waste_leaves");
burning_earth = new WasteEarth(Material.ground, true).setBlockName("burning_earth").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":burning_earth");
tektite = new BlockGeneric(Material.sand).setBlockName("tektite").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":tektite");
@ -2707,6 +2710,7 @@ public class ModBlocks {
GameRegistry.registerBlock(fallout, fallout.getUnlocalizedName());
GameRegistry.registerBlock(foam_layer, foam_layer.getUnlocalizedName());
GameRegistry.registerBlock(sand_boron_layer, sand_boron_layer.getUnlocalizedName());
GameRegistry.registerBlock(leaves_layer, leaves_layer.getUnlocalizedName());
GameRegistry.registerBlock(burning_earth, burning_earth.getUnlocalizedName());
GameRegistry.registerBlock(tektite, tektite.getUnlocalizedName());
GameRegistry.registerBlock(ore_tektite_osmiridium, ore_tektite_osmiridium.getUnlocalizedName());

View File

@ -2,9 +2,7 @@ package com.hbm.blocks.fluid;
import java.util.Random;
import com.hbm.lib.ModDamageSource;
import com.hbm.lib.RefStrings;
import com.hbm.util.ArmorUtil;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -12,8 +10,6 @@ import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.passive.EntitySquid;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.DamageSource;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
@ -61,6 +57,7 @@ public class GenericFluidBlock extends BlockFluidClassic {
flowingIcon = register.registerIcon(RefStrings.MODID + ":" + flowingName);
}
/** Only temporary, will be moved into a subclass */
@Override
public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) {

View File

@ -1209,6 +1209,7 @@ public class ModItems {
public static Item mirror_tool;
public static Item rbmk_tool;
public static Item coltan_tool;
public static Item power_net_tool;
public static Item template_folder;
public static Item journal_pip;
@ -2388,6 +2389,7 @@ public class ModItems {
public static Item bucket_acid;
public static Item bucket_toxic;
public static Item bucket_schrabidic_acid;
public static Item bucket_sulfuric_acid;
public static Item door_metal;
public static Item door_office;
@ -4732,6 +4734,7 @@ public class ModItems {
mirror_tool = new ItemMirrorTool().setUnlocalizedName("mirror_tool").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":mirror_tool");
rbmk_tool = new ItemRBMKTool().setUnlocalizedName("rbmk_tool").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":rbmk_tool");
coltan_tool = new ItemColtanCompass().setUnlocalizedName("coltan_tool").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":coltass");
power_net_tool = new ItemPowerNetTool().setUnlocalizedName("power_net_tool").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":power_net_tool");
key = new ItemKey().setUnlocalizedName("key").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":key");
key_red = new ItemCustomLore().setUnlocalizedName("key_red").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":key_red");
@ -5472,6 +5475,7 @@ public class ModItems {
bucket_acid = new ItemModBucket(ModBlocks.acid_block).setUnlocalizedName("bucket_acid").setContainerItem(Items.bucket).setCreativeTab(MainRegistry.blockTab).setTextureName(RefStrings.MODID + ":bucket_acid");
bucket_toxic = new ItemModBucket(ModBlocks.toxic_block).setUnlocalizedName("bucket_toxic").setContainerItem(Items.bucket).setCreativeTab(MainRegistry.blockTab).setTextureName(RefStrings.MODID + ":bucket_toxic");
bucket_schrabidic_acid = new ItemModBucket(ModBlocks.schrabidic_block).setUnlocalizedName("bucket_schrabidic_acid").setContainerItem(Items.bucket).setCreativeTab(MainRegistry.blockTab).setTextureName(RefStrings.MODID + ":bucket_schrabidic_acid");
bucket_sulfuric_acid = new ItemModBucket(ModBlocks.sulfuric_acid_block).setUnlocalizedName("bucket_sulfuric_acid").setContainerItem(Items.bucket).setCreativeTab(MainRegistry.blockTab).setTextureName(RefStrings.MODID + ":bucket_sulfuric_acid");
door_metal = new ItemModDoor().setUnlocalizedName("door_metal").setCreativeTab(MainRegistry.blockTab).setTextureName(RefStrings.MODID + ":door_metal");
door_office = new ItemModDoor().setUnlocalizedName("door_office").setCreativeTab(MainRegistry.blockTab).setTextureName(RefStrings.MODID + ":door_office");
@ -5621,6 +5625,7 @@ public class ModItems {
BucketHandler.INSTANCE.buckets.put(ModBlocks.acid_block, ModItems.bucket_acid);
BucketHandler.INSTANCE.buckets.put(ModBlocks.toxic_block, ModItems.bucket_toxic);
BucketHandler.INSTANCE.buckets.put(ModBlocks.schrabidic_block, ModItems.bucket_schrabidic_acid);
BucketHandler.INSTANCE.buckets.put(ModBlocks.sulfuric_acid_block, ModItems.bucket_sulfuric_acid);
MinecraftForge.EVENT_BUS.register(BucketHandler.INSTANCE);
}
@ -6838,6 +6843,7 @@ public class ModItems {
GameRegistry.registerItem(mirror_tool, mirror_tool.getUnlocalizedName());
GameRegistry.registerItem(rbmk_tool, rbmk_tool.getUnlocalizedName());
GameRegistry.registerItem(coltan_tool, coltan_tool.getUnlocalizedName());
GameRegistry.registerItem(power_net_tool, power_net_tool.getUnlocalizedName());
GameRegistry.registerItem(dosimeter, dosimeter.getUnlocalizedName());
GameRegistry.registerItem(geiger_counter, geiger_counter.getUnlocalizedName());
GameRegistry.registerItem(digamma_diagnostic, digamma_diagnostic.getUnlocalizedName());
@ -8003,6 +8009,7 @@ public class ModItems {
GameRegistry.registerItem(bucket_acid, bucket_acid.getUnlocalizedName());
GameRegistry.registerItem(bucket_toxic, bucket_toxic.getUnlocalizedName());
GameRegistry.registerItem(bucket_schrabidic_acid, bucket_schrabidic_acid.getUnlocalizedName());
GameRegistry.registerItem(bucket_sulfuric_acid, bucket_sulfuric_acid.getUnlocalizedName());
//Door Items
GameRegistry.registerItem(door_metal, door_metal.getUnlocalizedName());

View File

@ -0,0 +1,81 @@
package com.hbm.items.tool;
import com.hbm.blocks.BlockDummyable;
import com.hbm.packet.AuxParticlePacketNT;
import com.hbm.packet.PacketDispatcher;
import com.hbm.util.ChatBuilder;
import api.hbm.energy.IEnergyConductor;
import api.hbm.energy.IPowerNet;
import api.hbm.energy.PowerNet;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
public class ItemPowerNetTool extends Item {
@Override
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float fX, float fY, float fZ) {
Block b = world.getBlock(x, y, z);
if(b instanceof BlockDummyable) {
int[] pos = ((BlockDummyable) b).findCore(world, x, y, z);
if(pos != null) {
x = pos[0];
y = pos[1];
z = pos[2];
}
}
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof IEnergyConductor))
return false;
if(world.isRemote)
return true;
IEnergyConductor con = (IEnergyConductor) te;
IPowerNet net = con.getPowerNet();
if(net == null) {
player.addChatComponentMessage(ChatBuilder.start("Error: No network found! This should be impossible!").color(EnumChatFormatting.RED).flush());
return true;
}
if(!(net instanceof PowerNet)) {
player.addChatComponentMessage(ChatBuilder.start("Error: Cannot print diagnostic for non-standard power net implementation!").color(EnumChatFormatting.RED).flush());
}
PowerNet network = (PowerNet) net;
String id = Integer.toHexString(net.hashCode());
player.addChatComponentMessage(ChatBuilder.start("Start of diagnostic for network" + id).color(EnumChatFormatting.GOLD).flush());
player.addChatComponentMessage(ChatBuilder.start("Links: " + network.getLinks().size()).color(EnumChatFormatting.YELLOW).flush());
player.addChatComponentMessage(ChatBuilder.start("Proxies: " + network.getProxies().size()).color(EnumChatFormatting.YELLOW).flush());
player.addChatComponentMessage(ChatBuilder.start("Subscribers: " + network.getSubscribers().size()).color(EnumChatFormatting.YELLOW).flush());
player.addChatComponentMessage(ChatBuilder.start("End of diagnostic for network" + id).color(EnumChatFormatting.GOLD).flush());
for(IEnergyConductor link : network.getLinks()) {
Vec3 pos = link.getDebugParticlePos();
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "text");
data.setInteger("color", 0xffff00);
data.setFloat("scale", 0.5F);
data.setString("text", id);
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord, pos.yCoord, pos.zCoord), new TargetPoint(world.provider.dimensionId, pos.xCoord, pos.yCoord, pos.zCoord, 20));
}
return true;
}
}

View File

@ -1571,6 +1571,15 @@ public class ClientProxy extends ServerProxy {
if("amat".equals(type)) {
Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleAmatFlash(world, x, y, z, data.getFloat("scale")));
}
if("debug".equals(type)) {
String t = data.getString("text");
int color = data.getInteger("color");
float scale = data.getFloat("scale");
ParticleText text = new ParticleText(world, x, y, z, color, t);
text.multipleParticleScaleBy(scale);
Minecraft.getMinecraft().effectRenderer.addEffect(text);
}
}
private HashMap<Integer, Long> vanished = new HashMap();

View File

@ -0,0 +1,64 @@
package com.hbm.particle;
import org.lwjgl.opengl.GL11;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.world.World;
public class ParticleText extends EntityFX {
int color;
String text;
public ParticleText(World world, double x, double y, double z, int color, String text) {
super(world, x, y, z);
this.particleMaxAge = 30;
this.color = color;
this.text = text;
this.motionY = 0.1D;
}
public int getFXLayer() {
return 3;
}
public void renderParticle(Tessellator tess, float interp, float x, float y, float z, float tx, float tz) {
GL11.glPushMatrix();
GL11.glDisable(GL11.GL_LIGHTING);
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.0F, 0.0F);
RenderHelper.disableStandardItemLighting();
Minecraft mc = Minecraft.getMinecraft();
FontRenderer font = mc.fontRenderer;
this.rotationYaw = -mc.thePlayer.rotationYaw;
this.rotationPitch = mc.thePlayer.rotationPitch;
float pX = (float) (this.prevPosX + (this.posX - this.prevPosX) * (double) interp - interpPosX);
float pY = (float) (this.prevPosY + (this.posY - this.prevPosY) * (double) interp - interpPosY);
float pZ = (float) (this.prevPosZ + (this.posZ - this.prevPosZ) * (double) interp - interpPosZ);
GL11.glTranslatef(pX, pY, pZ);
GL11.glRotatef(this.rotationYaw, 0.0F, 1.0F, 0.0F);
GL11.glRotatef(this.rotationPitch, 1.0F, 0.0F, 0.0F);
GL11.glScalef(-1.0F, -1.0F, 1.0F);
GL11.glScaled(particleScale, particleScale, particleScale);
font.drawStringWithShadow(text, -(int) (font.getStringWidth(text) * 0.5F), -(int) (font.FONT_HEIGHT * 0.5F), color);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glPolygonOffset(0.0F, 0.0F);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glPopMatrix();
}
}

View File

@ -1,7 +1,3 @@
package com.hbm.saveddata.satellites;
import net.minecraft.nbt.NBTTagCompound;
public class SatelliteLunarMiner extends SatelliteMiner {
}
public class SatelliteLunarMiner extends SatelliteMiner { }

View File

@ -1,5 +1,8 @@
package com.hbm.tileentity;
import java.util.ArrayList;
import java.util.List;
import api.hbm.energy.IEnergyConductor;
import api.hbm.energy.IPowerNet;
import net.minecraft.tileentity.TileEntity;
@ -68,4 +71,17 @@ public class TileEntityProxyConductor extends TileEntityProxyBase implements IEn
((IEnergyConductor)te).setPowerNet(network);
}
}
@Override
public List<int[]> getConnectionPoints() {
/*TileEntity te = this.getTE();
if(te instanceof IEnergyConductor) {
return ((IEnergyConductor)te).getConnectionPoints();
}*/
/* Proxy TE doesn't need to implement proxying here because the conductor main TE already has a network-specific proxying system */
return new ArrayList();
}
}

View File

@ -3,8 +3,6 @@ package com.hbm.tileentity.network;
import java.util.ArrayList;
import java.util.List;
import api.hbm.energy.IEnergyConductor;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Vec3;
import net.minecraftforge.common.util.ForgeDirection;

View File

@ -5,6 +5,7 @@ import java.util.List;
import com.hbm.blocks.BlockDummyable;
import api.hbm.energy.IEnergyConductor;
import net.minecraft.util.Vec3;
public class TileEntitySubstation extends TileEntityPylonBase {
@ -58,4 +59,19 @@ public class TileEntitySubstation extends TileEntityPylonBase {
pos.add(new int[] {xCoord + 1, yCoord, zCoord - 2});
return pos;
}
@Override
public boolean hasProxies() {
return true;
}
@Override
public List<Integer> getProxies() {
List<Integer> proxies = new ArrayList();
proxies.add(IEnergyConductor.getIdentityFromPos(xCoord + 1, yCoord, zCoord + 1));
proxies.add(IEnergyConductor.getIdentityFromPos(xCoord + 1, yCoord, zCoord - 1));
proxies.add(IEnergyConductor.getIdentityFromPos(xCoord - 1, yCoord, zCoord + 1));
proxies.add(IEnergyConductor.getIdentityFromPos(xCoord - 1, yCoord, zCoord - 1));
return proxies;
}
}

View File

@ -21,6 +21,11 @@ public class ChatBuilder {
return builder;
}
public static ChatBuilder startTranslation(String text) {
ChatBuilder builder = new ChatBuilder("").nextTranslation(text);
return builder;
}
public ChatBuilder next(String text) {
ChatComponentText append = new ChatComponentText(text);
this.last.appendSibling(append);

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B