P3NG3R Tárgy flag ellenőrzés

Indította TheSLESH, 2019-06-06, 13:04:31

[spoiler][quote author=[VIP]P3NG3R link=topic=198615.msg1052438#msg1052438 date=1497722195]
Mivel kliensben az uiinventory.py fájl nem a valós flag értéket vizsgálva dönti el, hogy egy  tárgy használható-e a másik tárggyal vagy sem, hanem egy a fájlban előállított szám alapján, ami szinte mindenhol így van. A publikus dump_proto-k tartalmaznak olyan flag értékeket, amiket se a szerver, se a kliens nem használ, még csak definiálva sincs egyikben se, így a dump_proto a legtöbb tárgy flagját elrontja. Sőt! Még a proto bontók is ezekkel a hamis flag értékekkel lettek megírva, feltételezem a konvertáló programok is.

Itt a flag lista a dump_proto forrásából:
[code] string arFlag[] = {
"ITEM_TUNABLE",
"ITEM_SAVE",
"ITEM_STACKABLE",
"COUNT_PER_1GOLD",
"ITEM_SLOW_QUERY",
"ITEM_UNIQUE",
"ITEM_MAKECOUNT",
"ITEM_IRREMOVABLE",
"CONFIRM_WHEN_USE",
"QUEST_USE",
"QUEST_USE_MULTIPLE",
"QUEST_GIVE",
"ITEM_QUEST",
"LOG",
"STACKABLE",
"SLOW_QUERY",
"REFINEABLE",
"IRREMOVABLE",
"ITEM_APPLICABLE"
};


Ebből az ITEM_QUEST, STACKABLE, SLOW_QUERY, REFINEABLE és az IRREMOVABLE mind duplikátumok, false értékek, amik eltolják az ITEM_APPLICABLE flag valódi értékét így az uiInventory.py fájlban megnevezett lokális változóban már nem azonos azzal, ami az item_proto-ban szerepel.

Ehhez hasonló elágazás van a kliens uiInventory.py fájljában mint ez:
elif player.GetItemFlags(srcSlotPos) & item.ITEM_FLAG_APPLICABLE) == item.ITEM_FLAG_APPLICABLE:
return True

Elméletileg három helyen:
__DropSrcItemToDestItemInInventory
__CanUseSrcItemToDstItem
__IsUsableItemToItem

Ez az én kliensemből való, látható, hogy nem egy lokális változó szerint vizsgálja a tárgy flagját, hanem a modul egy konstans értéke alapján, ami ennyi:
PyModule_AddIntConstant(poModule, "ITEM_FLAG_APPLICABLE", CItemData::ITEM_FLAG_APPLICABLE);


Azért ajánlott így használni akár ezt, akár más területen az efféle kódokat, mert ha kerül be egy új érték -isten tudja miért- a felsorolás közepébe, akkor nem lesz belőle baj, mert a lekérdezés a valódi értéket adja vissza, viszont ha lokálisan van megnevezve az egyik érték, aminek valójában már megnőtt az értéke, akkor már gond van, ha csak nem aktualizálod magadnak.

Erre az egész item_proto-s dologra is kell némi logikus gondolkodásmód, mi hogy és miért működik úgy ahogy. A leltár szintúgy, alapból egy ótvar az egész, de mindennek megvan a maga szerepe, még ha azt a szerver nem is használja az adott időben.

No persze, mint mindenre úgy erre is több megoldás lehetséges, én gyökerestül irtottam ki a férgesét ;D.
Bár érthetetlen miért nem folytatták azon elvet, hogy ha már ITEM_USE a tárgy akkor miért nem kapott külön subtype-ot? Ez is olyan fej/írás módszer, egyszer ez, egyszer az és kész is bughalom :o.
[/quote][/code][/spoiler]

Szóval, a 6-7 bónuszok, csak akkor működnek, ha nem egyezik a flag (Szerverben SPECIAL, kliens oldalon pedig ADD_ATTRIBUTE)
Hogyan tudom ezt kiküszöbölni pontosan, hogy ne kelljen külön-külön item_proto?
Az ember csak fiatalon találhat ki igazán új dolgokat. Utána már túl tapasztalt, túl híres (...) és túl ostoba.