Jump to content

Atijaf

Members
  • Posts

    198
  • Joined

  • Last visited

Posts posted by Atijaf

  1. 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(...).

  2. 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?

  3. 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!

  4. 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!

  5. 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

  6. There is something severely wrong with your code if that's the case.

     

    You are most likely correct...

     

    Main tile entity class -- EnergyTE

    http://pastebin.com/kwCEgV6W

     

    Teleporter Tile Entity class -- the one with the issue, but I'm sure it's related to the main TE class

    http://pastebin.com/S2tMU2qn

     

    Teleporter Container -- Not sure if needed, but just in case

    http://pastebin.com/zcXTMCYW

     

    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

  7. 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?

  8. Reevaluated and redid much of the code.  Works :D

     

    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!

  9. 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...

  10. 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!

  11. 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...

  12. 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.

     

    http://pastebin.com/KvbucNNy

     

    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.

     

  13.             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...

  14. 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.
    }
    

  15. 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.

  16. @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?

  17. - 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? :o 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

  18. 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?)

    http://pastebin.com/JzpxCrZu

     

    GuiKineticRelocator -- (Information here is correct until restart)

    http://pastebin.com/XA6AgdrY

     

    KineticRelocatorTileEntity

    http://pastebin.com/DTdX0yKy

     

    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

×
×
  • Create New...

Important Information

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