Jump to content

Recommended Posts

Posted
//saving all tile entities
List<CompoundNBT> connectedEntities = new ArrayList<>();
CompoundNBT entity;
for (int entityInList = 0; entityInList <= this.masterEntity.connectedEntities.size();entityInList++)
{
    entity = new CompoundNBT();
    entity.putInt("x",this.masterEntity.connectedEntities.get(entityInList).pos.getX());
    entity.putInt("y",this.masterEntity.connectedEntities.get(entityInList).pos.getY());
    entity.putInt("z",this.masterEntity.connectedEntities.get(entityInList).pos.getZ());
    connectedEntities.add(entity);
}
compound.put("connectedEntities", (INBT) connectedEntities);  
 //restore saved entities
    List<CompoundNBT> connectedEntities = (List<CompoundNBT>) compound.get("connectedEntities");
    CompoundNBT entity;
   if (connectedEntities!= null){
    for (int entityInList = 0; entityInList < connectedEntities.size();entityInList++ )
{
    entity = connectedEntities.get(entityInList);
    this.masterEntity.connectedEntities.add((EngineeringBlockTileEntity)this.world.getTileEntity(new BlockPos(entity.getInt("x"),entity.getInt("y"),entity.getInt("z"))));
}}

 

So I'm trying to save list of TileEntities to a block, because the block uses the list to determine the number of blocks connected to each other. As the blocks are being placed the list expands. If I exit the world and comeback I cannot remove blocks that have already been placed.  It crashes when it attempts to remove that block from the connectedEntities list because the list is empty.

I'm trying to save it using the code above but it's not working. I just need some to be point me in the right direction.

@Override
public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) {
    EngineeringBlockTileEntity entityRemoved = (EngineeringBlockTileEntity) worldIn.getTileEntity(pos);
   entityRemoved.masterEntity.connectedEntities.remove(entityRemoved);
   entityRemoved.masterEntity.blockCount = entityRemoved.masterEntity.connectedEntities.size();
    super.onBlockHarvested(worldIn, pos, state, player);
}

 

 

Posted (edited)
  On 12/9/2020 at 2:17 PM, diesieben07 said:

Several issues:

  • For a start onBlockHarvested is not at all the right hook here. You need TileEntity#remove.
  • Your connections need to be lazy. As in: The TEs need to know only the positions and lazily query the world. During readFromNBT there is no world yet, you can't query the world for other TEs.
Expand  

Okay so I've simplified my connections a great deal. I've Overrided neighborChange. As blocks are added I pass a "masterEntity" to each block so that everyone is capable of updating this multiBlock blockCount to the masterEntity. Instead of having a list of tileEntities I opted for a list of BlockPos like you mentioned.  As I'm writing this I realize I can pass a blockCount to each block instead meaning that I could maybe remove the blockPos list (still not sure what I will do). Then I can use the NBT system to store the block count.

@Override
public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor){


        if (world.getTileEntity(neighbor) instanceof EngineeringBlockTileEntity)
        {
            //pass master from this block to the next
            EngineeringBlockTileEntity neighborEntity = (EngineeringBlockTileEntity) world.getTileEntity(neighbor);
            EngineeringBlockTileEntity thisEntity = (EngineeringBlockTileEntity)world.getTileEntity(pos);
            neighborEntity.masterEntity = thisEntity.masterEntity;
            //add neighbor block position to list of master list
            if (!thisEntity.masterEntity.connectedBlocks.contains(neighbor)) {
                neighborEntity.masterEntity.connectedBlocks.add(neighbor);
            }
            //update blockCount
            neighborEntity.masterEntity.blockCount = neighborEntity.masterEntity.connectedBlocks.size();
            System.out.println(neighborEntity.masterEntity.blockCount);
        }
   }

Then for removing blocks from the list  I used remove() as you suggested and woah simple as heck

@Override
public void remove() {

    if (this.masterEntity != null)
    {
        this.masterEntity.connectedBlocks.remove(this.getPos());
    }
    super.remove();
}

I may not have completly understood and implemented a lazy query as you suggested but I was able to get this to work using

less code because of your suggestion. I'm still trying to figure out how to have the block query around them upon reloading of a world.

 Thank you for your help it is much appreciated.

Edited by CriscoMods
Posted

Your tile entity could have a flag that starts as true at construction, then in the tick method, if(flag){flag=false;/* check for surrounding blocks */}

  • Like 1

Have you ever want the new operator to return a type that you didn't ask for? Well, now you can!

Posted (edited)
  On 12/11/2020 at 12:27 AM, Vinyarion said:

Your tile entity could have a flag that starts as true at construction, then in the tick method, if(flag){flag=false;/* check for surrounding blocks */}

Expand  

Good Idea. Works :) Ended up doing this 

 

if (this.InitializeBlocks)
{
    if (this.isMaster) {this.setMaster(); }
    this.lazyQuery();
    this.updateMasterBlockList();

}

IntializeBlocks is set to true upon initialization, but to prevent this piece of code from running in a tick when the block is placed for the first time I set it to false . The flag is also set false in function updateMasterBlockList

@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) {
    EngineeringBlockTileEntity thisBlock = ((EngineeringBlockTileEntity) worldIn.getTileEntity(pos));
    if (stack.hasDisplayName()) { TileEntity tile = worldIn.getTileEntity(pos);
        if (tile instanceof EngineeringBlockTileEntity) { thisBlock.setCustomName(stack.getDisplayName()); }
    }
    //don't initialize blocks upon placement
    thisBlock.InitializeBlocks = false;
    if (thisBlock.isAlone()) { thisBlock.setMaster(); System.out.println(thisBlock.isMaster);}
    super.onBlockPlacedBy(worldIn, pos, state, placer, stack);

}

 

Edited by CriscoMods

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Add the crash-report or latest.log (logs-folder) with sites like https://mclo.gs/ and paste the link to it here  
    • Cracked Launchers are not supported
    • Hi, I have a problem in minecraft java (only in forge 1.20.1), When I start the game after a moment the game crashed with code 1 this only in forge 1.20.1 , I tried to reinstall java, Upgrade java to 17, update the drivers to the latest version, downgrade the drivers to the pervious version, deleting .minecraft and reinstall it , but none of these ways working.   here is the log:   [Launcher] Launching Minecraft... I'm hiding! mods after C:\Users\Windows\AppData\Roaming\.minecraft\mods\tl_skin_cape_forge_1.20_1.20.1-1.32.jar [InnerMinecraftServersImpl]  search changers of the servers read servers from servers.dat [] [InnerMinecraftServersImpl]  prepare inner servers save servers to servers.dat [Launcher] Game skin type: TLAUNCHER [Launcher] Starting Minecraft Forge 1.20.1... [Launcher] Launching in: C:\Users\Windows\AppData\Roaming\.minecraft Starting garbage collector: 96 / 227 MB Garbage collector completed: 60 / 214 MB [Launcher] Processing post-launch actions. Assist launch: true =============================================================================================== [05:29:03] [main/INFO]: ModLauncher running: args [--username, *********, --version, Forge 1.20.1, --gameDir, C:\Users\Windows\AppData\Roaming\.minecraft, --assetsDir, C:\Users\Windows\AppData\Roaming\.minecraft\assets, --assetIndex, 5, --uuid, *************************************, --accessToken, вќ„вќ„вќ„вќ„вќ„вќ„вќ„вќ„, --clientId, null, --xuid, null, --userType, mojang, --versionType, modified, --width, 925, --height, 530, --launchTarget, forgeclient, --fml.forgeVersion, 47.3.22, --fml.mcVersion, 1.20.1, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20230612.114412] [05:29:04] [main/INFO]: ModLauncher 10.0.9+10.0.9+main.dcd20f30 starting: java version 17.0.12 by Oracle Corporation; OS Windows 10 arch amd64 version 10.0 [05:29:15] [main/INFO]: Loading ImmediateWindowProvider fmlearlywindow [05:29:24] [main/INFO]: Trying GL version 4.6 [05:29:60] [main/INFO]: Requested GL version 4.6 got version 4.6 [05:29:67] [main/INFO]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/Windows/AppData/Roaming/.minecraft/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%23100!/ Service=ModLauncher Env=CLIENT FATAL ERROR in native method: Thread[pool-2-thread-1,5,main]: No context is current or a function that is not available in the current context was called. The JVM will abort execution.     at org.lwjgl.opengl.GL11C.nglGetString(org.lwjgl.opengl@3.3.1+7/Native Method)     at org.lwjgl.opengl.GL11C.glGetString(org.lwjgl.opengl@3.3.1+7/GL11C.java:978)     at net.minecraftforge.fml.earlydisplay.DisplayWindow.initRender(fmlearlydisplay@1.20.1-47.3.22/DisplayWindow.java:209)     at net.minecraftforge.fml.earlydisplay.DisplayWindow.lambda$start$5(fmlearlydisplay@1.20.1-47.3.22/DisplayWindow.java:292)     at net.minecraftforge.fml.earlydisplay.DisplayWindow$$Lambda$437/0x000001fab120a618.run(fmlearlydisplay@1.20.1-47.3.22/Unknown Source)     at java.util.concurrent.Executors$RunnableAdapter.call(java.base@17.0.12/Executors.java:539)     at java.util.concurrent.FutureTask.run(java.base@17.0.12/FutureTask.java:264)     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(java.base@17.0.12/ScheduledThreadPoolExecutor.java:304)     at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.12/ThreadPoolExecutor.java:1136)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.12/ThreadPoolExecutor.java:635)     at java.lang.Thread.run(java.base@17.0.12/Thread.java:842) Here I am! [VersionManager] Refreshing versions locally... [VersionManager] Versions has been refreshed (6 ms) [Launcher] Launcher exited. [Launcher] Minecraft closed with exit code: 1 flush now [Launcher] [Crash] Signature "Bad video drivers" matches! [Crash] Signature "Bad video drivers" matches! [Launcher] [Crash] Crash has been recognized! [Crash] Crash has been recognized! flush now
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.