Class Bitmask

EQ2Emulator Development forum.

Moderator: Team Members

Post Reply
User avatar
Gangrenous
Posts: 812
Joined: Sun Apr 24, 2016 6:54 am
Characters: Dinsmoor

Class Bitmask

Post by Gangrenous » Thu Jun 30, 2016 7:30 am

I am guessing at some point the item class structure changed? I am seeing references in places about a table that is now missing. Does anyone have a bitmask list for item classes and can someone verify this did change in the past?
Resident Dirty Hippy

User avatar
Gangrenous
Posts: 812
Joined: Sun Apr 24, 2016 6:54 am
Characters: Dinsmoor

Re: Class Bitmask

Post by Gangrenous » Thu Jun 30, 2016 9:56 am

Pretty sure this is it, if not I will correct it. I generated this today and it appears to be accurate. If it indeed is, I will put it on my wiki.

Code: Select all

        COMMONER        =	1,
        FIGHTER         =	2,
        WARRIOR         =	4,
        GUARDIAN        =	8,
        BERSERKER       =	16,
        BRAWLER         =	32,
        MONK            =	64,
        BRUISER         =	128,
        CRUSADER        =	256,
        SHADOWKNIGHT    =	512,
        PALADIN         =	1024,
        PRIEST          =	2048,
        CLERIC          =	4096,
        TEMPLAR         =	8192,
        INQUISITOR      =	16384,
        DRUID           =	32768,
        WARDEN          =	65536,
        FURY            =	131072,
        SHAMAN          =	262144,
        MYSTIC          =	524288,
        DEFILER         =	1048576,
        MAGE            =	2097152,
        SORCERER        =	4194304,
        WIZARD          =	8388608,
        WARLOCK         =	16777216,
        ENCHANTER       =	33554432,
        ILLUSIONIST     =	67108864,
        COERCER         =	134217728,
        SUMMONER        =	268435456,
        CONJUROR        =	536870912,
        NECROMANCER     =	1073741824,
        SCOUT           =	2147483648,
        ROGUE           =	4294967296,
        SWASHBUCKLER    =	8589934592,
        BRIGAND         =	17179869184,
        BARD            =	34359738368,
        TROUBADOR       =	68719476736,
        DIRGE           =	137438953472,
        PREDATOR        =	274877906944,
        RANGER          =	549755813888,
        ASSASSIN        =	1099511627776,
        ANIMALIST       =	2199023255552,
        BEASTLORD       =	4398046511104,
        SHAPER          =   8796093022208,
        CHANNELER       =   17592186044416
Resident Dirty Hippy

Jabantiz
Lead Developer
Posts: 2912
Joined: Wed Jul 25, 2007 2:52 pm
Location: California

Re: Class Bitmask

Post by Jabantiz » Thu Jun 30, 2016 5:25 pm

Yea it has changed over time due to the addition of classes, therefore older clients can interpret the value different then new clients.

I believe commoner was suppose to be 0 with fighter as 1, really it was 2^(class id - 1) with class id being defined in classes.h

User avatar
Gangrenous
Posts: 812
Joined: Sun Apr 24, 2016 6:54 am
Characters: Dinsmoor

Re: Class Bitmask

Post by Gangrenous » Fri Jul 01, 2016 1:32 pm

Hey Jabantiz, maybe you can figure this out. It appears C# enum cannot handle doing bitmask on this long of a number, as high as our class mask. What happens is when you get into the higher numbers, it rolls back into negative and then starts back over in the positive range. Even if I do the enum as long, when you try to check against the mask it is treating it as a int32. Thoughts? There are plenty of threads regarding the problem but not much of a clean resultion.

http://stackoverflow.com/questions/1060 ... -too-large
Resident Dirty Hippy

Jabantiz
Lead Developer
Posts: 2912
Joined: Wed Jul 25, 2007 2:52 pm
Location: California

Re: Class Bitmask

Post by Jabantiz » Fri Jul 01, 2016 3:09 pm

For this you should be using an unsigned int64 as the numbers get so large, you want to make sure it is unsigned as the value will never be negative for us so this will essentially double the range. int64 is a "long long" in c++, I am not sure if c# has a special type or not for it though.

When you check the values I assume you are just putting in a number like "8", when you put just a number the code treats it as a signed int32, you will probably need to tell it the number is an unsigned int64 for it to be accurate that would simply be "(int64)8"

EDIT: Just looked up the c# type and it is long for an int64 (really wish types where the same across languages), so you will want to use ulong for an unsigned int64 and put (ulong) in front of any hardcoded numbers you are using to check values.

User avatar
Gangrenous
Posts: 812
Joined: Sun Apr 24, 2016 6:54 am
Characters: Dinsmoor

Re: Class Bitmask

Post by Gangrenous » Tue Jul 05, 2016 7:15 am

Nothing I did seemed to help, it appears enum is not designed for it. It was a much simpler solution to do it via a MySQL query, in fact it took less code and was simpler to read.
Resident Dirty Hippy

Post Reply

Who is online

Users browsing this forum: No registered users and 0 guests