Jump to content

Refresh Content in Written Book(?)


jayxo

Recommended Posts

Hello! I have a book that writes down a players life information. I.e. how long they’ve been living, and when they die on that life, how long they lasted and what they died from.

My question is, is it possible to update content in a written book when it’s opened? Becuase the way it works now, you have to get the book with a command instead of it refreshing it’s content automatically.

Any help would be extremely helpful! Thank you.

Here’s a pastebin of the current class that writes in the book: https://pastebin.com/s6X05Nzz

Link to comment
Share on other sites

  • 2 weeks later...

I'm assuming that it is just a vanilla book with custom NBT, not your own custom item?

If that is the case you could listen to the use item event (sorry, I can't remember the name of it off the top of my head), check for the book being used (opened) and sync the data with the item.

Edited by Alpvax
Link to comment
Share on other sites

  • 2 weeks later...
On 9/27/2021 at 7:21 AM, Alpvax said:

No, I actually meant PlayerInteractEvent.RightClickItem, books don't count as being "used" I don't think

sorry for such a late response! i actually tried that before, but it would always show the player who opened it info. like i would open your book, and it would display my players capability information instead of yours.

https://pastebin.com/3qpwP8BF

Edited by jayxo
Link to comment
Share on other sites

On 10/11/2021 at 4:21 PM, jayxo said:

it would always show the player who opened it info.

https://pastebin.com/3qpwP8BF

I assumed that was what you wanted. Currently you get the capability of the player opening the book:

@SubscribeEvent
public void onUse(PlayerInteractEvent.RightClickItem event) {
    PlayerEntity player = event.getPlayer();
    ...

You need to use the player who "owns" the book instead. So store the "owner's" id in the book somehow (NBT/capablility), then when the book is opened, get the player from the id (they may not exist/be offline, in which case you can't reasonably update), then update the data.

It might be a better idea to change to a level (overworld) capability / saveddata if you need to access the data for offline players, then retrieve that data for displaying in your book.

As die7 says, it will probably be better to create a custom gui (based on the vanilla book screen, you can possibly subclass it, although I'm not sure), then retrieve the latest data on demand, rather than updating the item nbt each time.

Link to comment
Share on other sites

1 hour ago, Alpvax said:

I assumed that was what you wanted. Currently you get the capability of the player opening the book

this was actually what one of the issues i had was, i wanted to be able to look at any players book without it always showing my capability information.

1 hour ago, Alpvax said:

You need to use the player who "owns" the book instead. So store the "owner's" id in the book somehow (NBT/capablility), then when the book is opened, get the player from the id (they may not exist/be offline, in which case you can't reasonably update), then update the data.

i actually do have a bit that adds a “owner” nbt data in the book! it stores the players uuid if that would work? i just didn’t know how i would check if it’s connected to the players capability.

in response to the level/world capability, how would i actually do that? im not sure if it’s useful, also eventually wanted to be able to use a command to get a players book even if they’re offline.

Link to comment
Share on other sites

18 minutes ago, jayxo said:

it stores the players uuid if that would work?

Yes, I think that is linked to the player's GameProfile, so should never change.

13 minutes ago, jayxo said:

in response to the level/world capability, how would i actually do that? im not sure if it’s useful, also eventually wanted to be able to use a command to get a players book even if they’re offline.

The same way you attach the capability to the player, but just attach a capability with a Map<player id, your current player capability data> to the overworld Level instead of attaching the data to the player directly. Then when you want to modify the data, get the capability from the overworld (which is always loaded) and get the data for the player with the given id.

Alternatively, you could use Saved Data (which used to be WorldSavedData), again using the overworld to access the player data.

That way it doesn't matter if the player is offline, because the data is saved to the overworld, so you just need to look up the data for the player by player id.

  • Thanks 1
Link to comment
Share on other sites

this has actually helped out a lot! I definitely think the best option is using WorldSavedData.

On 10/13/2021 at 8:45 AM, Alpvax said:

Map<player id, your current player capability data>

I've now gotten Map<UUID, *>, but for the players capability data, what kind of information would I put there?

Link to comment
Share on other sites

Ohh alright! I've gotten a .dat file to load into a world, but I'm not sure where to go from here.

public class StatsManager extends WorldSavedData implements Supplier {
    public Map<UUID, DefaultStatsCapability> players = new HashMap<>();
    public PlayerEntity player = Minecraft.getInstance().player;

    public StatsManager() {
        super(XLife.MOD_ID);
    }

    public void load(CompoundNBT nbt) {
        players.put(player.getUUID(), StatsCapabilityProvider.stats);
    }

    public CompoundNBT save(CompoundNBT nbt) {
        ListNBT listNBT = new ListNBT();

        for (DefaultStatsCapability stats : players.values()) {
            stats.save(nbt);
            listNBT.add(nbt);
        }

        nbt.put("Players", listNBT);
        return nbt;
    }

    public static StatsManager onWorld(ServerWorld world) {
        DimensionSavedDataManager storage = world.getDataStorage();
        StatsManager sup = new StatsManager();
        StatsManager saver = (StatsManager) storage.computeIfAbsent(sup, XLife.MOD_ID);

        storage.set(saver);

        return saver;
    }

    public static void onSaved(WorldEvent.Save event) {
        if (!event.getWorld().isClientSide() && event.getWorld() instanceof ServerWorld) {
            StatsManager saver = StatsManager.onWorld((ServerWorld) event.getWorld());

            saver.setDirty();
        }
    }

    @Override
    public Object get() {
        return this;
    }

}

I've used RaidManager as somewhat of a template for this, and the forge forums you linked.

Link to comment
Share on other sites

On 10/15/2021 at 3:55 PM, jayxo said:
public class StatsManager extends WorldSavedData implements Supplier

Why are you implementing Supplier? (Also, you should include the generic type of Supplier).

You probably want to add a getter for a specific player. something like the following:

public DefaultStatsCapability getStats(UUID playerID) {
    // Bear in mind this can return null if the player stats have not been added yet.
    // You might want to use computeIfAbsent instead.
    return players.get(playerID);
}

Then wherever you need the DefaultStatsCapability (for example in your book update function), get your instance of StatsManager, then get the DSC from it using the new getter.

On 10/15/2021 at 3:55 PM, jayxo said:
public PlayerEntity player = Minecraft.getInstance().player;

A) This will crash on servers (which is where loading and saving of data occurs)

B) What is this for? All the players should be saved in the map.

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

    • I made my investment with the wrong platform and ended up losing both my capital investment and the profits I had made through my trade with them over the few months we had partnered together, it was such a very pathetic experience for me as I have never found myself in a situation so critical as this. I became depressed for months and almost lost my mind facing all these scenarios alone. at some point, I was having some suicidal thoughts.. but thanks so much to my therapist who helped me to set and maintain my healthy boundaries, it was she Who also advised me to look for a specialist who could help to recover back my funds from the scammers. that one piece of advice from her did well for me as I had gone online in search of help from experts and I got referred to the Fastfund Recovery and their services. I reached out to their contact detail that were provided by individuals testifying about their good work email ( Fastfundrecovery AT Gmail Dot Com ) and filed a complaint, I was well responded to and we had a deep conversation on how I lost my money to the fake investment platform, everything seems so unbelievable while they assured me of getting everything I have lost, I was asked questions on my mode of payment and evidence that shows a transaction occurred between both parties and if any agreement was breached or stated, after all these, just within the next 48hours or thereabouts I got all my lost investment together with my profits back in my wallet, these guys are amazing. you can get them also on Telegram( at fastfundsrecovery )if you need their help.
    • Etumax Royal Honey Price In Pakistan - Get Free Delivery Shop Today Online With Online Shopping in Pakistan Etumax Royal Honey Available At Our Store Online Shopping in Pakistan, 
    • I want to make a tree decorator that will generate a beehive under branches of my tree. I have no idea how to check for branches and make beehives generate because TreeDecorator.Context.logs() is just a block pos and i dont understand how it works. i hope ill get an answer here.
    • Imagine this: you've painstakingly accumulated $97,000 worth of Bitcoin, only to see it vanish into the digital abyss at the hands of cunning scammers. It's a devastating blow, leaving you feeling helpless and betrayed. But fear not, for Lee Ultimate Hacker is here to turn the tide in your favor. After conducting extensive research on cryptocurrency recovery options, I stumbled upon Lee Ultimate Hacker, and it proved to be the most suitable choice for the daunting task at hand. Despite my initial skepticism, they shattered my doubts by successfully retrieving $92,000 of the lost Bitcoin—a feat I once deemed impossible. From the moment I reached out to Lee Ultimate Hacker and provided them with all the pertinent information about the fraudulent transaction, they sprang into action with unwavering determination. True to their word, they delivered on their promise to recover the lost Bitcoin within an impressive timeframe of 24 to 72 hours. Their professionalism, expertise, and commitment to their clients were truly commendable, transforming what seemed like an insurmountable ordeal into a resounding triumph. In my eyes, the investment of both time and money was more than justified by the remarkable outcome achieved by Lee Ultimate Hacker. So, if you've fallen victim to cryptocurrency scams and are grappling with the anguish of lost funds, don't despair. Reach out to Lee Ultimate Hacker and let them work their magic. Their track record of success speaks for itself, and with their assistance, you can reclaim what's rightfully yours and emerge stronger than ever before. Don't let the darkness of cybercrime overshadow your financial future. Take a stand against fraudsters with the help of Lee Ultimate Hacker, and witness the transformation from despair to triumph. Your journey to recovery starts here. LEEULTIMATEHACKER@ AOL. COM or Support @ leeultimatehacker . com. telegram:LEEULTIMATE or wh@tsapp +1  (715) 314  -  9248 https://leeultimatehacker.com Thank you.
    • There's a scheme I got into where they promised to trade Bitcoin for me and take a cut as a commission. Seemed like a good idea at the time. But then, things went south real fast. They ended up transferring   $190,000 worth of my Bitcoin. I was devastated and felt completely helpless. That's when I stumbled upon the Wizard Web Recovery Tool. It was like a beacon of hope amid chaos. With this tool, I could finally start digging into what went wrong and hopefully get my Bitcoin back. Using Wizard Web was surprisingly easy. I just had to plug in some details about my Bitcoin account and let it do its thing. It started scanning the internet, looking for any clues about what happened to my Bitcoin. It felt like having a detective on my side, searching for answers. And guess what? Wizard Web found some leads. It uncovered evidence of the scheme's shady dealings and helped me track down the people responsible for losing my Bitcoin. Armed with this information, I took the case to court. After a long and hard-fought legal battle, the court ruled in my favor. The perpetrators were held accountable for their actions and faced criminal charges for their involvement in the scheme. It was a victory not just for me, but for anyone who's been taken advantage of by these kinds of scams. Thanks to Wizard Web Recovery, I was able to get justice and reclaim what was rightfully mine. It showed me that even in the face of adversity, there's always a way to fight back. And with the right tools and determination, anything is possible.   The following is the contact information for Wizard Web Recovery.   Email: wizard web recovery((@))programmer . net
  • Topics

×
×
  • Create New...

Important Information

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