Jump to content

Entity or TileEntity?


xilef11

Recommended Posts

Hello

 

I need to create a TileEntity in a block that already contains one. I've seen a SuperTile/subtile approach in some mods, but it wouldn't work for me since the parent tile is not ticking while the child tile is.

 

A solution I came up with would be creating a normal entity and making it completely unmovable and indestructible, but I'm not sure how to do that (or if it would work).

 

Any advice?

Link to comment
Share on other sites

Could you replace the existing TE instance with one of your own? Your replacement would need to do all of the work of the original plus whatever data and logic you want to add (hopefully by extending the class). The trick would be to extract the data from the original TE before it's trashed. The risk is that something somewhere else will cough up a lung because the TE class isn't quite what it expected to see there.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Link to comment
Share on other sites

Because we still don't know what are you trying to do - I will encolse the idea in few words: TileEntity is a VERY simple idea - a list of objects in world assigned to some x/y/z where each tick, the world calls onUpdate() on TE that need it and save/load the list to/from memory on unload/load.

 

If you really must (and there is no other way, because some stuff can be done on without any big tricks) you can reinvent the wheel and simply add second "TileEntity" layer with your own implementation.

 

Can be done with WorldSaveData, Server/ClientTickEvent and some smart packet system.

 

Been there, done that. So just saying as a last resort.

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

The answer depends on whether this block is added by your mod or not.

The original TE/Block is added by my mod, but the "new" entity may be defined by my mod or by addons (it will have a known interface)

 

Could you replace the existing TE instance with one of your own? Your replacement would need to do all of the work of the original plus whatever data and logic you want to add (hopefully by extending the class). The trick would be to extract the data from the original TE before it's trashed. The risk is that something somewhere else will cough up a lung because the TE class isn't quite what it expected to see there.

 

That is pretty much what I was talking about with the parent/child TE. I want to keep the "logic" (ticking/new) TE as simple as possible, which would be hard in this case. Of course, I could replace it by a third TE that does the work of both the old one and the one I want to add, but that sounds like a bad idea.

 

Because we still don't know what are you trying to do

Basically, I have an inventory and want to create an object that does "stuff" when the container is activated with a certain pattern of items inside. Note that the container TE is provided by my mod, but the "object that does stuff" may be implemented by something else, extending an abstract class I define. Also that object may or may not be visible.

 

Is there something wrong with using an Entity (and making it invulnerable, unmovable and never despawn on its own) instead of a TE?

 

 

Link to comment
Share on other sites

You need to make a new interface then which can be implemented by you or other mods and then have a registration for instances of that interface somewhere (possibly on individual TileEntity instances or globally). Then make calls into the interface methods when needed.

 

Thing is, I would like to keep the "logic" object as flexible as possible, which is why I thought of a TileEntity, leading to the problem that I already have a TE at the position where that object would need to exist, and I can't think of a reasonably simple way of making them coexist.

 

I currently have an interface which supplies the pattern to check for in the container, as well as the class (currently an abstract TE, this is the one I'm thinking of changing to an Entity) of the "logic" object.

 

It would be unnecessarily complex and have some overhead that is not needed.

I'd like to know a few things about the differences...

[*]Is it possible for an Entity to do all the things a TileEntity can do (I'm guessing yes)

[*]What are the things an Entity can do that a TileEntity can't (other than moving :P)

[*]What things must be considered when making an Entity but not a TileEntity (the "unnecessarily complex" part)

[*]Same as previous, but specifically for making an Entity that dosen't move or despawn

[*]Is an Entity (much) slower than a TileEntity

[*]What about rendering (or lack thereof)

 

Link to comment
Share on other sites

I see that a TileEntity is the most appropriate thing to use, but it leaves two issues:

 

a) having more than one TE at a single BlockPos dosen't seem practical

b) creating a TE (is it always necessary to register them) without an associated Block

Link to comment
Share on other sites

The problem is that the TileEntity for my block isn't updating/ticking, and I don't want it to be because it can be used for decoration, and there may be a lot of them around that may not be "active".

 

Also, wouldn't that reduce flexibility compared to a TE (unless the interface defines all functions of a TE)?

Link to comment
Share on other sites

There isn't really a way out of this except to apply a different metadata (block state in 1.8) when there is ticking needed and thereby replace the TE with a ticking version.

 

Can't I just replace the TE in the world (without changing the blockstate)?

Link to comment
Share on other sites

Can't I just replace the TE in the world (without changing the blockstate)?

 

TileEntity is assigned to block (e.g Furnace has TileEntityFurnace), you can't replace it without breaking stuff.

 

I seriously don't understand your worrying about performance... Just make TileEntity handle additional interfaces. If you need separation between static and ticking ones - just make two of them.

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

TileEntity is assigned to block (e.g Furnace has TileEntityFurnace), you can't replace it without breaking stuff.

But can I replace an existing TileEntityFurnace by something that extends TileEntityFurnace without changing the block at that position (i.e using world.setTileEntity)?

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

    • Add the crash-report or latest.log (logs-folder) with sites like https://mclo.gs/ and paste the link to it here  
    • Add the ful lcrash-report or latest.log (logs-folder) with sites like https://mclo.gs/ and paste the link to it here
    • I cant craft any of the epic fight mod weapons. I try using the recipes in the crafting table but nothing is working. and when i click on the epic fight weapon in jei there is no recipe at all.
    • Hello All! Started a MC Eternal 1.6.2.2 server on Shockbyte hosting. The only other mod I added was betterfarmland v0.0.8BETA. Server is 16GB and Shockbyte wont tell me how many CPU cores i have.  We are having problems now when players log in it seems to crash the server. At other times it seems fine and we can have 3 people playing for hours at a time. Usually always when it does crash it is when someone logs in. Crash Reports Below. To the person who can post the fix I will reward $100 via Paypal.   ---- Minecraft Crash Report ---- // This is a token for 1 free hug. Redeem at your nearest Mojangsta: [~~HUG~~] Time: 2024-09-19 21:04:58 UTC Description: Exception in server tick loop java.lang.StackOverflowError     at net.minecraft.advancements.PlayerAdvancements.hasCompletedChildrenOrSelf(PlayerAdvancements.java:451)     at net.minecraft.advancements.PlayerAdvancements.shouldBeVisible(PlayerAdvancements.java:419)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:385)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:406)     at net.minecraft.advancements.PlayerAdvancements.ensureVisibility(PlayerAdvancements.java:411)     at net.minecraft.advancements.P  
  • Topics

×
×
  • Create New...

Important Information

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