HUGE Bug - Attuneable items don't work
I just discovered that Attuneable items revert to dropeable state as soon as you zone after been attuned.
this is realy bad. my entire server is build on attuneable items actualy becomign no drop - as they should - as global part fo server economy, in order for whoel thing to function. could you guys look into this please? |
Off the top of my head, because making a specific item NODROP where the global item is not, it would require something being defined, probably in the inventory table in the database, that says so.
Checking the Wiki for the inventory table, there is a column called instnodrop: Quote:
|
I don't think attuneable items work at all. They will attune, but once you zone, it's not attuned anymore. It doesn't appear to set the "instnodrop" field in the inventory table when you attune the item. Even manually setting the field doesn't seem to do anything .. unless it's supposed to be some odd value that I didn't try.
I can't find anything about attuneable items in the opcodes, so either it's called something else, or it's not there at all. |
Well, it looks like it was added into the source:
Quote:
common/patches/Titanium.cpp common/Item.h common/Item.cpp common/shareddb.cpp Looking at all of that, it seems the main issue is that SetInstNodrop() is never called anywhere, but it seems like the client sets it, which is probably why it shows as nodrop until you zone. I have a feeling this probably is related to a missing OpCode or some other packet telling the server it's now nodrop. |
BUMP!
So guys- any new info on this one? :cool: |
Here's a start on getting attuneable items working. Items are flagged as No Trade and remain No Trade when zoning
and logging off. This is with rev 361 compiled Windows XP. Set the instnodrop flag when an item is placed into a gear slot that has it's attuneable flag set. (This probably needs to be done somewhere else). In zone\inventory.cpp around line 901 change Code:
// Not dealing with charges - just do direct swap Code:
// Not dealing with charges - just do direct swap Then, move the instnodrop field in the item serialization code a couple spots over in the Titanium patch file. In patches\Titanium.cpp near line 871, change Code:
MakeAnyLenString(&instance, Code:
MakeAnyLenString(&instance, - When items are autoequipped from loot, it bypasses the "Attune" popup that happens when you manually equip stuff. Need to at least put a check on startup to flag the items. I'm not sure of the popup behaviour on Live though. - I didn't look into the other client serializations because I can't test them. I thought ChaosSlayer might want to test it out now though. |
Thank you for this submission Theeper
Unfortunately I can't realy test any new code myself at this time due to number of reasons, So I am hopping that Trev, Cavedude or KLS can try this fix and hopefuly it will work :cool: |
After looking through the nodrop checks, it looks like in most places, it's just reading the pointer to the base item flag directly.
It seems like it would make sense to create an IsNoDrop() function inside the ItemInst class to check both flags. Then replace all the existing nodrop checks throughout ... as opposed to adding an instance no drop check each time a normal no drop check is done. Also, any thoughts on how it worked when you looted an attuneable item on Live ? .. If the item auto equipped, did the "Are you sure you want to attune?" popup window work? It seems like there was some odd issue with attuneable items back then, but It's been too long. As usual, there's probably a function somewhere I missed and KLS will rewrite the whole thing in one line. |
as far as I can tell on LIVE attuneable item did not tried to auto-equip itself - it went directly into your bags
|
Good point. Here is a simple change to make them not auto equip.
In zone\inventory.cpp around line 381 Change Code:
// #1: Try to auto equip Code:
// #1: Try to auto equip And this will set the instnodrop flag upon zoning if the item was equipped somehow (like with MQ) and bypasses the popup window. in common\shareddb.cpp around line 483 Change Code:
if (item) { Code:
if (item) { |
I just tested this out, attuneable items do persist over zoning/camping and no longer auto-loot. However, they lose their no drop flag when you loot the item off your corpse. We're probably losing the flag when it gets transferred to the corpse.
Also, I confirmed that you can trade them to NPCs, however you can't sell them in bazaar. Since they are no drop, they won't appear in your item list after placing in the trader's satchel. So, all that needs to be done is put in a NPC trade check, and correct the transfer to corpses and back then this will be 100%. |
Have not tested this, but this should work hopefully. I probably messed it up but something along the lines of this should work, heh.
PlayerCorpse.cpp Code:
void Corpse::MoveItemToCorpse(Client *client, ItemInst *item, sint16 equipslot) |
Thanks guys, I'll try to get the NPC trade thing and the corpse flag done when I get home tonite.
Secrets, this doesn't look proper though. You're setting a flag that is already set. Code:
if(interior_item->IsInstNoDrop) Code:
if(item->IsInstNoDrop()) |
The PlayerCorpse change is a bad, bad change! :) I accidentally put it up on TGC without testing and it caused players to lose all but 1 bag in their top inventory slot when they died, and caused a zone crash. That'll teach me to upload files when I am half asleep. Good thing we keep daily backups.
Theeper: Yes, if the change was good that's the syntax you'd use. |
Quote:
I guess that doesn't work, then. Back to the drawing board! |
All times are GMT -4. The time now is 03:41 AM. |
Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.