Atijaf
-
Posts
198 -
Joined
-
Last visited
Posts posted by Atijaf
-
-
Perhaps I can use the chunk's hashCode to obtain a unique Identifier?
Or... I can make a matches method that compares the x and z coords and return true if... Yeah..
Would you happen to know the max and min x and z position of chunks?
-
Do chunks have an ID associated with them, or just the x,z coords?
I need to store information into a list about a block that exists inside a certain chunk. Hard to explain...
I am saving data to the world and would only like to access NBT data if needed. That's where the chunk ID would come to play. I would check to see if NBT has a tag associated with the ID of the chunk so that I may load it's data into memory.
If there is no such thing as a chunk ID, what are some alternatives I can do?
Thank you!
-
Thanks! That's exactly what I needed to get started.
I would like to read the data as needed. Is there a way to determine what chunks are loaded and when readingFromNBT I can read the data that's useful?
-
I would like to store data for blocks that have been placed by a player. I could make this based on the BlockPos and then accessing a HashMap... Which ties to the question.
I would think that this data would be stored server side, to the world, and then whenever a player enters a new location, check with the server to see if there is any data about player placed blocks and send the player data. Is my logic sound?
Also, should I store this information to disk, then load the information that is relative to the part of the world that is "active"? Is that even possible?
And for the last bit, what would you recommend I store the information in? I would only store BlockPos locations (Or is there something I should use instead) that were placed by players, so just by data existing means that the block was placed by a player.
Thank you!
-
Would detectAndSendChanges() do the trick? I want it to update on game load, so probably not. And you're definitely correct about it saving serverside. Sorry about that
-
The setting
Prior to saving and quitting, it is working properly.
But when I load the game..
When the TE is linked, it displays particles above it.
Also, when the inventory is opened, text is displayed saying whether or not it is linked. It says it isn't.
While debugging, I notice that #world.isRemote is always false while reading from nbt.
But here is the interesting part. When I open one of the TE's, it still doesn't work. But when I open the second TE, (The one that it's suppose to be linked to) everything goes back into motion and particles are displayed on both blocks, as well as a message saying they are linked.
Edit: worldObj is now null. Maybe I misread. So now I can't really tell. I'm guessing that is is being run on the server side, because #readFromNBT is being called twice
-
There is something severely wrong with your code if that's the case.
You are most likely correct...
Main tile entity class -- EnergyTE
Teleporter Tile Entity class -- the one with the issue, but I'm sure it's related to the main TE class
Teleporter Container -- Not sure if needed, but just in case
Yikes! I always get so nervous when I share my code. All I know is i'm super happy it's not the code it use to be. The previous code would give everyone a heart attack -- (Wrote code, caused problems, wrote more code to solve problems, caused more problems and so on... haha)
Thanks for helping!
Edit: Noticed #markDirty() was called every tick. Fixed it
-
I'm not sure I quite understand. I Notice that it's only saving nbt on the client side.
Is that correct?
Why is it that when I load back into the game, the server still doesn't update it's data. (Client data is correct, server data isn't)
-
I have a boolean called isLinked.
That determines a number of things, which is whether or not the player can use it and if the block should have particles.
It saves everything just fine, but is there something I'm missing, because when I debug, it isn't updated server side when reading.
Do I need to send a packet to the server, or is there something that I can implement in my class that'll take care of it?
-
Reevaluated and redid much of the code. Works
By redoing the code, i removed a TON of nonsense, but the best part is that I didn't even have to use packets. I overrid #markDirty() and it synced for both sides. Thanks to all that helped!
Instead of one tile entity determining a few variables of the other tile entity, I have them act independently (ALMOST!)
I use to use a boolean to determine if they needed updating, but that caused a ton of resources being used (Called markdirty every tick... AND IT ALSO DIDN'T WORK)
I now use an int. It'll return 0 if player placed item and 1 if player removed item from inventory. (That takes care of the source tile entity)
Now.. It'll return 2 if nothing has changed and then it'll check if it's linked. If so, double check to see if it is truly linked (Do some of the math), and if it isn't truly linked (Target TE isn't correct), set linked to false and a few other variables...
I know I didn't have to write that, but I wasn't even sure if I quite understood it:p Mainly just excited after the many hours spent on it, and after redoing it, figuring it out after a few hours was just thrilling.
THANKS A TON!
-
Everything is done server side and only the required information is send to the client. Though, I'm not in the container when i edit the itemstack's nbt. I think I'm going to send a packet to the client side. If that doesn't work, I'm going to reevaluate and redo the code with the now better understanding I have.
Thanks again:)
I'm sure I'll be back...
-
Thanks! Gosh I keep running into bugs and this last one stumped me.
I have an item that is stored within a TE. The itemstack, it is associated with, contains NBT int and whenever the block is right clicked, that int is reduced by 20. (I say right click just to simplify. I actually do something else, but the point stays the same) The action is only done serverSide and I thought that setting nbt data syncs between server and client, regardless of what side the nbt data was set.
The reason I know it isn't syncing on client side is when I open my gui, i step through the process, check the inventory slot for that itemstack, and the int hasn't changed. If i'm on the server side, it has changed.
Does itemstack NBT data sync automatically if it's not in the player's inventory? I'll figure out what I'm doing wrong, but just need to understand that.
Thanks for all the help!
-
Currently working on it now. Thanks:) I believe this is exactly what I needed to know.
One more thing. Is #setInventorySlotContents called when the game loads the world?
.. Two more things. If I use #markDirty() on server side, must I do that on client as well?
-
I have a two Tile Entities that links with one another when the correct coordinate item is placed inside.
The item holds the block pos location.
TileEntity1 - the item inside points to TileEntity2
TileEntity2 - the item inside points to TileEntity1
They have to point to each other for them to be linked.
So the question... I need to update TileEntity2 when I remove TileEntity1's item so that they aren't linked anymore, but I can't access TileEntity2's location when TileEntity1's item doesn't exist. (the item that points to TileEntity2)
Can I instead use Container#slotClick to obtain the item the player removed and update TileEntity2?
Or should I avoid using the container to do this?
Hope this makes sense...
-
Lets get the setting. I am in a class that extends TileEntity and implements both IInventory and ITickable. CordeCache is a class that extends Item. I use it to store ItemStack nbt data, BlockPos position.
I have debugged, and stepped through each method.
On client side, the te is found.
On Server side, the te is not found and equals null.
It uses the same blockpos postions.
Is there a reason the the server side cannot find it?
Thank you for the great amount of help from this forum. I would have never gotten this far without it.
-
BlockPos pos = new BlockPos(); this.worldObj.getTileEntity(pos);
Umm... great, let's take "unknown" x/y/z and ask for TE. I belive not defined BlockPos has x/y/z = 0/0/0 so yeah...
Obviously my second question was not heard. Will create new topic so it's easy to follow. Also, you don't know at all whether or not i have a tile entity at 0, 0, 0. That was not the point I was trying to make. I said the location definitely has a te, so lets go with that? It was obviously a typo, I did not copy and paste, but if you'd like, I will. I was merely trying to make it more simple and direct to the question at hand.
Thanks for the help. I really should have just created another topic...
-
Would there be a reason #worldObj.getTileEntity(pos) would return null, even though there is for a fact, a te at pos.
I have null checks and all, but removed them to show my example
// Extends TileEntity implements IInventory, ITickable @Override public void update() { ItemStack stack = getStackInSlot(1); CordeCacheItem item = (CordeCacheItem)stack.getItem(); item.getPos(cacheStack); BlockPos pos = new BlockPos(); this.worldObj.getTileEntity(pos); //There is, for a fact, a te here, but returns null only on server side. }
-
For this instance, it was an item in my gui that needed syncing when the game reloaded. Syncing to the server solved this one, but you're definitely right about running mostly everything on the server. Thanks!
-
When using player.worldObj.getTileEntity(pos), it returns null. is that because not all te's are loaded upon start?
I need to sync a boolean value on both Te's. The first te has a blockpos to the second te and vice versa. They are linked.
On the client side, I check if the first blockpos contains a tile entity (it does)
It then checks if if the second tile entity is pointing back at the first tile entity (it does)
So isLinked = true;
It then attempts to find a tile entity on the server side, but it finds nothing.
I'm in the process of writing a packet to the server, but am unsure if this'll work if the server can't find a tile entity.
-
DERP! Forgot to override #updateProgressBar. Thanks everyone!
-
@Override public void detectAndSendChanges() { // TODO Auto-generated method stub super.detectAndSendChanges(); //I Understand I need to loop through all of these for each player, just not yet ICrafting icrafting = (ICrafting)this.crafters.get(0); if(this.tileentitycharge != this.te.getField(0)){ /** this, id, the TileEntity variable */ icrafting.sendProgressBarUpdate(this, 0, this.te.getField(0)); } this.tileentitycharge = this.te.getField(0); }
@Override public int getField(int id) { switch(id){ case(0): return this.TileEntityCharge; } return 0; } @Override public void setField(int id, int value) { switch(id){ case(0): this.TileEntityCharge = value; break; } } @Override public int getFieldCount() { return 1; }
did this, but it's still not updating the gui screen variables after restarting the game. Have I missed something?
-
- You will need to sync the data that is visible in your GUI in your Container. You can look at e.g. ContainerFurnace for a vanilla example.
- Why on earth are you storing all your data in the Items list? You can have more than one top-level entry in your NBT data (like you already do with the custom name).
Would it be the method "detectAndSendChanges()"?
I'll try it when I get back home.
Thanks
-
I had this same problem. Simply call the super for #writeToNBT, and #readFromNBT in your TileEntity class.
Unfortunately, I've already done that.
I probably should have included that code. I've edited my previous post and have added it.
-
After a long while, I have gotten my tile entity to work just the way I want it to...
I just want to add a couple lines of text that display information about what the Tile Entity contains, such as it's current amount of "Energy" and "Energy Rate"
Pictures and explanations
Adding the power source
https://gyazo.com/aca0d76b0da029cde249ea9bfb6530f0
outcome - Current Energy is moving down at 200 per tick and placed into block on right
https://gyazo.com/b507219e38d945e31c87e633e5c6991c
When Block is removed from right, Current Energy is no longer being removed
https://gyazo.com/295bcd0fbb7a112fb36e9a87206da346
After saving and quiting - (The problem occurs)
https://gyazo.com/763bfcc8b670eb25c9113b47fca69663
The TileEntity still has the data inside. I've debugged and saw that, but one of the tile Entities, (The one displaying the screen) is the incorrect one... I think, but am unsure as to how to obtain the correct one.
Shows it still works, but doesn't update "Current Energy" or "Energy Rate"
https://gyazo.com/1ae5981a764581560e31845a156f439e
I Believe the problem begins with the creation of a new TileEntity
When I start up the game, I notice that the method "createNewTileEntity" is called
BlockKineticRelocator: -- (When activated, passes TileEntity it obtains from a location. Somehow, it isn't correct?)
GuiKineticRelocator -- (Information here is correct until restart)
KineticRelocatorTileEntity
As in the last gif, it's obvious a Tile Entity has the data I'm looking for, but I'm unsure how to find it. Everytime I use the method, "World.getTileEntity(pos)" , it returns a tileEntity but it doesn't have the correct information. (The data I'm looking for are all 0)
While T300kCapsule is being charged, if I debug and set breakpoints in the tile entity that takes care of that, it shows the data correctly.
I know this is a lot to take in, but hopefully it's just something silly that's happening...
Thanks a bunch for anyone that helps
[1.8.9] WorldSavedData
in Modder Support
Posted
WorldData extends WorldSavedData
When overriding writeToNBT(NBTTagCompound nbt), does the nbt that is passed store the information I once have written to it?
Reason being is that I don't want to overwrite data that was previously there and was wondering if I can obtain the data from within #writeToNBT(...).