Jump to content

Recommended Posts

Posted

Hi!

I am totally new to all this :D

First of all i want to tell you that my English is not really good. so please don't hate ;D

 

I wonder how i can check if a cable is connected to a specific block.

I don't know if there is already a way to do it or if i have to do it from scratch because i didn't found anything about this.

So maybe that doesn't make any sense but i had some ideas how i could do it:

 

I created a cable block and a method to get a list of the blocks next to it (to check if they are connected to another cable block)

So my idea was to get the blocks next to every cable block i find and add the blocks coordinates to a list.

I wanted to repeat this again and again till there are no more cable blocks connected that aren't in the list.

And then when this is done i wanted to check if one of this cables is next to the target block.

 

Does this make any sense or is there a much better and easier way to do it?

And if not how can i do the way that i explained?

 

I am happy about every help :D

 

thank you in advance

- MrFincher

Posted

Hi

 

Yes that basic idea should work.  You need to be a bit clever about it though.  When you find a cable, you need to check that you didn't find it before.  Otherwise you end up with an infinite loop.

 

This is a pretty standard flood fill algorithm and a bit of google will probably find you some efficient code you can base yours on.

 

-TGG

Posted

Hi!

I am totally new to all this :D

First of all i want to tell you that my English is not really good. so please don't hate ;D

 

I wonder how i can check if a cable is connected to a specific block.

I don't know if there is already a way to do it or if i have to do it from scratch because i didn't found anything about this.

So maybe that doesn't make any sense but i had some ideas how i could do it:

 

I created a cable block and a method to get a list of the blocks next to it (to check if they are connected to another cable block)

So my idea was to get the blocks next to every cable block i find and add the blocks coordinates to a list.

I wanted to repeat this again and again till there are no more cable blocks connected that aren't in the list.

And then when this is done i wanted to check if one of this cables is next to the target block.

 

Does this make any sense or is there a much better and easier way to do it?

And if not how can i do the way that i explained?

 

I am happy about every help :D

 

thank you in advance

- MrFincher

 

Yes, this should work, however another option commonly used is as follows:

 

1: When a cable is placed, check if there are cabled next to it.

2: If no cables are next to it, create a custom TileEntity there. This will be the master tile entity for that system. Don't proceed farther down the logic.

3: If there were cables attached, get the tile entity at that location and find it's master.

4: Create a tile entity at the location of the placed cable, and set it's master to the master of the cables that are attached.

5: If the cables have different masters, we need to combine them into one system. Choose one of the systems and set all the

 

When a cable is broken, you need to separate the cables into separate systems:

1: Iterate through the cables attached to each of the cabled next to the one that was broken, check if they are still connected to their master. If not, set them as the master of their own system, otherwise return and stop doing the next logic.

2: Iterate through the connected cables that were made into their own system and set their master to the new one.

 

To check is a block is connected to the system, get the master of the cable next to the machine and see if that tile entity has certain data.

 

The tile entity would store the following:

 

TileEntity master

boolean isMaster

int powerInSystem

etc...

 

The code would be similar to the following:

 

public void addCable(World w, int x, int y, int z)
{
    // Create your tile entity here and add it to the world
    ...
    // Rest of code
    List<TileEntityPowerSystem> systems= getConnectedWires(w, x, y, z);
    if(systems.size() == 0)
    {
        tileEntity.setIsMaster(true);
        return;
    }
    TileEntityPowerSystem master = systems.get(0).getMaster();// Select the first system as the master system
    
    tileEntity.setMaster(master)
    
    for(TileEntityPowerSystem system : systems)
    {
        if(system != master)
        {
            system.getMaster().setMaster(master);// Make the master tile entities of the other systems no longer masters
            // And set their master to the new master.
        }
    }
}

public int getPower(World w, int x, int y, int z)
{
    TileEntity te = w.getTileEntityAt(x, y, z);
    if(te instanceof TileEntityPowerSystem)
    {
        return ((TileEntityPowerSystem)te).getMaster().getPowerInSystem();
    }
    return 0;
}

 

etc...

 

This method requires using more, smaller, tile entities than one single one which holds all the information. In return it makes al operations faster, instead of having the cylce through or iterate through all the connected blocks, you can use stored data to access directly the tile entity that has been put in charge of storing the main data for the system.

 

public TileEntityPowerSystem getMaster()
{
    if(!this.master.isMaster)
    {
        this.master = this.master.getMaster();// If the blocks previous master was merged with another system, update it now
    }
    return this.master;
}

 

I don't have the development environment up atm, but this method probably isn't completely safe with chunk loading/unloading. You may want to store positions for the master instead of the actual tile entity to avoid issues, and maybe have the tile entities store a n instance of a object called System (or whatever) that stores the actual data instead of the tile entity, so that it can be access from anywhere, even if the master is unloaded.

Posted

Woow thx for the fast and helpful replies!

 

I will try the technique with the master cables but i have just one more question:

 

How does the getConnectedWires() methods work?

Posted

checks the 6 adjacent sides of the cable in question and finds any blocks that are of your cable type. If it's of your cable type then get the tile entity at that location via world.getTileEntity(x, y, z) and add it to a list.

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



×
×
  • Create New...

Important Information

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