Jump to content

Creating a Cable


mrfincher

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

    • हथियार व्यापारियों की चमक आज के समय में भारत और दुनिया के विभिन्न हिस्सों में तेजी से बढ़ रही है। स्वीडन की स्थित संस्था सिपरी की नवीनतम रिपोर्ट के अनुसार, विश्व भर में विभिन्न देश अब पूर्व कभी नहीं देखे गए हथियारों और सैन्य सामग्रियों पर धन का व्यय कर रहे हैं। वैश्विक संघर्षों के बढ़ते संकेतों के कारण, विश्व के कई हिस्सों में युद्ध की संभावनाएं बढ़ रही हैं। पश्चिमी एशिया में युद्ध की आग फैल रही है, जबकि दक्षिण चीन सागर और ताइवान में भी तनाव बढ़ रहा है। भारत-चीन सीमा पर भी स्थिति चिंताजनक है। इन घटनाओं के परिणामस्वरूप, विभिन्न देशों की प्राथमिकताएं बदल रही हैं, और हथियार व्यापारियों का धंधा आजकल चमक उठा है। सिपरी की रिपोर्ट के अनुसार, 2023 में वैश्विक सैन्य खर्च एक नया रिकॉर्ड स्थापित किया गया है। 2022 की तुलना में, 2023 में सैन्य खर्च 6.8 फीसदी बढ़कर 24.4 ट्रिलियन डॉलर पर पहुंच गया। इसके पीछे कुछ विशेष कारण हैं, जिनमें दुनिया भर में तनाव बढ़ना और अद्यतित सैन्य तैयारियों की आवश्यकता शामिल है। इस वृद्धि में, भारत जैसे देशों का योगदान भी अधिक है। भारत ने भी अपने सैन्य खर्चों में वृद्धि की है, और यह दुनिया के सबसे बड़े और सबसे प्रभावशाली राष्ट्रों में एक बन गया है। इसके अलावा, अमेरिका, चीन, और रूस भी सैन्य खर्च में वृद्धि की हैं, जिससे विश्व सुरक्षा में नए दायरे खुले हैं। संभावनाओं के इस नए मंच पर, दुनिया के सक्षम देश अब अपने सैन्य तैयारियों में ज्यादा ध्यान दे रहे हैं। यह वृद्धि विकास और प्रगति के बजट पर भी प्रभाव डाल रही है, जिससे विभिन्न देशों के आर्थिक प्रगति में बदलाव आ सकता है।   https://www.nayaindia.com/editorial-column/editorial1/arms-sales-increased-in-the-world-454072.html
    • Hello, Hi and I am making a forge 1.12.2 mod and also trying to get a custom model helmet item (I made a joker mask) and exported it to .json format and put it in the ~/namespace/models/item folder. Though, I'm struggling to get the item to render what I want it to be rendered like as I've positioned it in the 'head' window view in blockbench. How did you render out your model? I checked your code and it looks like no references to the actual model are being made. I'm new to this forge modding stuff (was a fabric modder) and I desperately need some help. Is there a way to standardly render out armor models made using blockbench? any methods that one can use? My model in JSON: ```json { "credit": "Made with Blockbench", "texture_size": [160, 160], "textures": { "0": "ydyrn:items/joker_mask_texture", "particle": "ydyrn:items/joker_mask_texture" }, "elements": [ { "from": [0, 0, 0], "to": [16, 16, 1], "faces": { "north": {"uv": [0, 1.7, 16, 14.2], "texture": "#0"}, "east": {"uv": [0, 4, 0.9, 5.6], "texture": "#0"}, "south": {"uv": [0, 5.8, 1.6, 7.4], "texture": "#0"}, "west": {"uv": [0, 1.9, 1.3, 3.5], "texture": "#0"}, "up": {"uv": [0, 3.4, 1.6, 4.2], "texture": "#0"}, "down": {"uv": [0, 9, 1.6, 9.7], "texture": "#0"} } }, { "from": [15.8, 11, 0.5], "to": [16.2, 13, 15], "faces": { "north": {"uv": [7.9, 7.9, 7.94, 8.1], "texture": "#0"}, "east": {"uv": [7.9, 7.9, 9.35, 8.1], "texture": "#0"}, "south": {"uv": [7.9, 7.9, 7.94, 8.1], "texture": "#0"}, "west": {"uv": [7.9, 7.9, 9.35, 8.1], "texture": "#0"}, "up": {"uv": [7.9, 7.9, 7.94, 9.35], "texture": "#0"}, "down": {"uv": [7.9, 7.9, 7.94, 9.35], "texture": "#0"} } }, { "from": [0.2, 11, 14.6], "to": [15.8, 13, 15], "faces": { "north": {"uv": [7.9, 7.9, 9.46, 8.1], "texture": "#0"}, "east": {"uv": [7.9, 7.9, 7.94, 8.1], "texture": "#0"}, "south": {"uv": [7.9, 7.9, 9.46, 8.1], "texture": "#0"}, "west": {"uv": [7.9, 7.9, 7.94, 8.1], "texture": "#0"}, "up": {"uv": [7.9, 7.9, 9.46, 7.94], "texture": "#0"}, "down": {"uv": [7.9, 7.9, 9.46, 7.94], "texture": "#0"} } }, { "from": [-0.2, 11, 0.5], "to": [0.2, 13, 15], "faces": { "north": {"uv": [7.9, 7.9, 7.94, 8.1], "texture": "#0"}, "east": {"uv": [7.9, 7.9, 9.35, 8.1], "texture": "#0"}, "south": {"uv": [7.9, 7.9, 7.94, 8.1], "texture": "#0"}, "west": {"uv": [7.9, 7.9, 9.35, 8.1], "texture": "#0"}, "up": {"uv": [7.9, 7.9, 7.94, 9.35], "texture": "#0"}, "down": {"uv": [7.9, 7.9, 7.94, 9.35], "texture": "#0"} } } ], "display": { "thirdperson_righthand": { "translation": [-0.25, -2.75, 0], "scale": [0.3, 0.3, 0.3] }, "thirdperson_lefthand": { "translation": [-0.25, -2.75, 0], "scale": [0.3, 0.3, 0.3] }, "firstperson_righthand": { "rotation": [-9, 115, 15], "translation": [0, 1.25, -1.75], "scale": [0.5, 0.5, 0.5] }, "firstperson_lefthand": { "rotation": [-9, 115, 15], "translation": [0, 1.25, -1.75], "scale": [0.5, 0.5, 0.5] }, "ground": { "rotation": [40, 0, 0], "translation": [0, -2.5, 0], "scale": [0.5, 0.5, 0.5] }, "gui": { "rotation": [0, 180, 0] }, "head": { "translation": [0, 0, 0.25], "scale": [0.82773, 0.73594, 0.9] }, "fixed": { "translation": [0, 0, 8.75] } }, "groups": [ 0, { "name": "straps", "origin": [0, 0, 0], "color": 0, "children": [1, 2, 3] } ] } ```
    • Add the crash-report or latest.log (logs-folder) with sites like https://paste.ee/ and paste the link to it here  
    • In your config folder, delete the sophisticatedcore-common.toml file and test it again
  • Topics

×
×
  • Create New...

Important Information

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