Jump to content

Linking Tile Entities together


Flenix

Recommended Posts

Hey guys,

 

I want to do some linking of Tile Entities for the shop part of my economy system.

 

The way I figured I'd do the shop is with three separate Tile Entities;

 

The "Shelf" block. which is the point of sale. It shows the item, and a buyer can click the item to buy it.

The shelf also changes it's GUI depending on whether the owner is interacting or not - If the owner opens it, they can edit things, whereas the buyer can only buy or sell, so I probably need to transmit data between the tile entity and the GUI to write text from the TE onto the GUI, eg price of the item.

 

The "Storage" block. Effectively a glamorized chest, but the Shelf ties into it. The Shelf gets it's stock from here.

Only the owner can open this, but I think that'd be quite easy to do; just detect who placed it, write their username to NBT then check on right click? (Or is there a better way?)

 

The "Cash Register" block. This is where the money taken from the player will go.

 

Now, I need to connect these without them actually being next to one another. Also, I want the storage to only accept one shelf at a time, but the cash register needs unlimited. Finally I don't want an unlimited range; I'll say 64 blocks to allow for large shops.

 

Anyone got any advice on how I'd do something like this? Maybe someone knows an example of something vaguely similar? Any help is great, not quite sure where to start!

 

 

Finally, I know I could do all this within one block, but I'm going for realism.

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Link to comment
Share on other sites

Hi

 

I'd say it shouldn't be too hard, you just need to figure out a way for the TileEntities to keep track of each other, keeping in mind that depending on where the players are standing, some of the chunks might not be loaded (so the TileEntities might be absent).

 

Some random thoughts that might help-

Perhaps the linkages between TileEntities might best be stored in the world NBT data (WorldInfo.getAdditionalProperty), eg each "shop" in the world has a structure that lists all the shelves, storage blocks, and cash register blocks.  Updated whenever you create or destroy one of the components.  Whenever a TileEntity needs to know about one of the others it is linked to, it consults the world NBT data.

 

How will you decide which shelves are linked to which blocks, and how will the user decide which items are placed where on which shelves?  Likewise cash registers?  Can you link to any within the same shop, or the nearest?  How do you designate a "shop"? unique typed-in name?  unique player? 

 

Will your shelf be like a chest?  or will it "show" the item like an item frame does?

 

Important design decision to be made up front I think.

 

I'd recommend you test this with something really simple before leaping straight in with the full design since I reckon this will probably need a couple of prototypes before you hit on the best approach :-)

 

-TGG

 

Link to comment
Share on other sites

Hi

 

I'd say it shouldn't be too hard, you just need to figure out a way for the TileEntities to keep track of each other, keeping in mind that depending on where the players are standing, some of the chunks might not be loaded (so the TileEntities might be absent).

 

Some random thoughts that might help-

Perhaps the linkages between TileEntities might best be stored in the world NBT data (WorldInfo.getAdditionalProperty), eg each "shop" in the world has a structure that lists all the shelves, storage blocks, and cash register blocks.  Updated whenever you create or destroy one of the components.  Whenever a TileEntity needs to know about one of the others it is linked to, it consults the world NBT data.

 

How will you decide which shelves are linked to which blocks, and how will the user decide which items are placed where on which shelves?  Likewise cash registers?  Can you link to any within the same shop, or the nearest?  How do you designate a "shop"? unique typed-in name?  unique player? 

 

Will your shelf be like a chest?  or will it "show" the item like an item frame does?

 

Important design decision to be made up front I think.

 

I'd recommend you test this with something really simple before leaping straight in with the full design since I reckon this will probably need a couple of prototypes before you hit on the best approach :-)

 

-TGG

 

Thanks for the ideas.

 

There's not going to be anything in the code which defines an actual "shop", as in a network. I'll just have one shelf, connected to one chest - but multiple shelves can connect to the cash register.

 

The shelf is kind of like a fancy item frame with a GUI I suppose. Deciding how to link them is something I'm still unsure of... I figured the easiest way might be to have the user place everything as they want it, then have a linking wand which stores the location of the shelf as NBT, and adds it to the NBT of whichever storage block & cash register they choose. From there, the storage block would only use the latest value, whereas the cash register would have a list.

 

My 64 block range limit means the chunks wouldn't matter, chunks within 64 blocks of the player should always be loaded because that's only a 4 chunk radius. I suppose a check for the server view distance wouldn't hurt though (I believe servers can set it as low as 3, in which case a maximum distance setup wouldn't work)

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

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

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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