Valhalla Legends Forums Archive | BnetDocs Research and Discussion | [D2GS] 0xAC NewMonster

AuthorMessageTime
Insolence
[code]// regular minionexp
//                    [uid]  [    monster id      ]  [    x  ]  [    y  ]  [HP]      [len]  [  unk  ]  [  uniq monst code  ] [???-->
//byte[] data = {0xac, 0x99, 0x1e, 0x74, 0x9b, 0xc5, 0x01, 0x8b, 0x0e, 0xc7, 0x13, 0x80, 0x17, 0x11, 0x20, 0x40, 0x64, 0xc0, 0x51, 0x00, 0x00, 0x00, 0x00};
//byte[] data = {0xac, 0x31, 0x93, 0x87, 0x4e, 0xc5, 0x01, 0x90, 0x0e, 0xc6, 0x13, 0x80, 0x17, 0x11, 0x08, 0x40, 0x64, 0xc0, 0x51, 0x00, 0x00, 0x00, 0x00};

// eldritch
//                                                                                                                    should be: extra fast, stone skin, extra strong, immune to cold
byte[] data = {0xac, 0x28, 0xa6, 0xf4, 0xd0, 0xc5, 0x01, 0x91, 0x0e, 0xc3, 0x13, 0x80, 0x1b, 0x11, 0x08, 0x40, 0x13, 0x03, 0x10, 0x60, 0xc0, 0x51, 0x60, 0x01, 0x50, 0x43, 0x00};

// pindle
//                                                                                                                    should be: fire enchanted, stone skin, lightning enchanted, immune to physical, immune to poison
//byte[] data = {0xac, 0x5a, 0x1d, 0x0b, 0x4c, 0xb8, 0x01, 0x4a, 0x27, 0x9f, 0x33, 0x80, 0x1b, 0x31, 0x60, 0xa0, 0xa1, 0x01, 0x10, 0x49, 0xe0, 0x88, 0xb0, 0x00, 0x60, 0xae, 0x04 };

// mephisto
//byte[] data = {0xac, 0x20, 0x0b, 0x3d, 0x98, 0xf2, 0x00, 0x87, 0x44, 0x82, 0x1f, 0x80, 0x19, 0xa1, 0xb0, 0x00, 0x00, 0x00, 0x60, 0x17, 0x0f, 0x69, 0x3c, 0xfc, 0x07};

/*
[1] (BYTE) ID
[5] (DWORD) Monster/NPC ID
[7] (WORD) Location X
[9] (WORD) Location Y
[11](BYTE) Life %          // not sure?
[12](BYTE) Packet Length
(WORD) Unknown
(DWORD) A0 A1 01 10 - Always for pindle, unique boss code
(BYTE) Status codes - varies on how much each boss has, most I've seen is 3, so if a boss has 3 status codes, you'll have 3 bytes extra in the packet
(BYTE) B0 - This tells us that the status codes come to an end.
(BYTE) 00 - Always, unknown
(WORD) Unknown
(BYTE) 00 to 06 - always.
*/

NPC npc = new NPC();

npc.UID = BitConverter.ToUInt32(data, 1);
npc.ID = (NPCCode)BitConverter.ToUInt16(data, 5);
npc.X = BitConverter.ToUInt16(data, 7);
npc.Y = BitConverter.ToUInt16(data, 9);
npc.Life = data[10];
//int length = data[12];
//data[14]  = unknown
uint ChampionID = BitConverter.ToUInt32(data, 18);
int mod1 = data[19];
int mod2 = data[20];
int mod3 = data[21];
int mod4 = data[22];[/code]

I'm trying to make sense of the packet after the 18th byte (also life % would be nice to know--or is it 0-128?).

I found a couple old documents (I believe Ringo did) about this, but they seem to be for 1.10 or at least only have 1.10 values:
[code]    public enum MonsterAttribute
    {
        ExtraStrong = 0x28,
        ExtraFast = 0x30,
        Cursed = 0x38,
        MagicResistance = 0x40,
        FireEnhanced = 0x49,       
        LightningEnhanced = 0x88, 
        ColdEnhanced = 0x90,
        ImmuneToPosion = 0xB8,
        Thief = 0xC0,
        ManaBurn = 0xC8,
        Teleportation = 0xD0,
        Specialhit = 0xD8,
        StoneSkin = 0xE0,         
        MultipleShot = 0xE8,
        AuraEnhanced = 0xF0
    }[/code]

Thanks for any replies/suggestions :)

EDIT: Looking through D2Smells, I just found this: [code] public enum MonsterMods
{
None = 0,
PhysicalImmune = 1,
MagicImmune = 2,
FireImmune = 4,
LightningImmune = 8,
ColdImmune = 16,
PoisonImmune = 32,
ExtraStrong = 64,
ExtraFast = 128,
Cursed = 254,
MagicResistant = 512,
FireEnchanted = 1024,
LightningEnchanted = 2048,
ColdEnchanted = 4096,
ManaBurn = 8192,
Teleportation = 16384,
SpectralHit = 32768,
StoneSkin = 65536,
MultiShot = 131072,
ConvictionAura = 262144,
MightAura = 524288,
HolyFireAura = 1048576,
BlessedAimAura = 2097152,
HolyFreezeAura = 4194304,
HolyShockAura = 8388608,
FanaticismAura = 16777216
}[/code]It appears to be "bitwise" (is that what you call them?) flags--I'll see if I can't make sense of that.

EDIT #2: Using ET's enumeration, I got 1 mod for Eldritch right:
[code]            NPC npc = new NPC();

            npc.UID = BitConverter.ToUInt32(data, 1);
            npc.ID = (NPCCode)BitConverter.ToUInt16(data, 5);
            npc.X = BitConverter.ToUInt16(data, 7);
            npc.Y = BitConverter.ToUInt16(data, 9);
            npc.Life = data[10];
            //int length = data[12];
            //data[14]  = unknown
            uint ChampionID = BitConverter.ToUInt32(data, 18);
            uint mod1 = BitConverter.ToUInt32(data, 22);

            List<MonsterMods> mods = new List<MonsterMods>();

            foreach (int mod in Enum.GetValues(typeof(MonsterMods)))
            {
                if ((mod1 & mod) == mod)
                    mods.Add((MonsterMods)mod);
            }[/code]
Produces:
[code]- mods Count = 6 System.Collections.Generic.List<D2Data.MonsterMods>
[0] None D2Data.MonsterMods
[1] PoisonImmune D2Data.MonsterMods
[2] ExtraStrong D2Data.MonsterMods
[3] HolyFireAura D2Data.MonsterMods
[4] HolyFreezeAura D2Data.MonsterMods
[5] FanaticismAura D2Data.MonsterMods[/code]
Extra Strong is the only correct mod.
June 24, 2007, 12:59 PM
Ringo
uh, I remember this being a kind of tricky one.
Btw, NPC's life (apart from in message 0x7F and maybe another) has to be devided by 1.28 to get the true percentage.
Also i think some of the higher bits in the start flag (1st word after the packets lengh) state if the NPC has a prefix/suffix/Appellation or is a Champion etc. (see UniquePrefix.txt, UniqueSuffix.txt and UniqueAppellation.txt)
Then right after the prefix's are the bonus enhancements. (the ones your trying to parse) These (I think) are stored in a byte array (8bits per code) and is null terminated (or 0xB0 terminated, one of the 2)
I cant remember what the last nibble does tho, nothing to important i dont think.

if d2 doesnt patch when the ladder resets tomorow, i will try dig up some old projects that could parse this.

hope this helps
June 24, 2007, 3:37 PM
Insolence
Thanks a lot, I really appreciate a reply from you :)

I'll look at those text files you mentioned and see if I can't do it myself before tomorrow.

EDIT: MonUMod.txt looks like what I want--I'll keep going.
June 24, 2007, 5:06 PM
Ringo
[quote author=Insolence link=topic=16816.msg170405#msg170405 date=1182704782]
Thanks a lot, I really appreciate a reply from you :)

I'll look at those text files you mentioned and see if I can't do it myself before tomorrow.

EDIT: MonUMod.txt looks like what I want--I'll keep going.
[/quote]
Sorry I didnt reply back when I said I would, I have been kinda busy (hands up, Playing new ladder :P)
I had a quick dig around but I cant seem to find the project I had in mind.
However I managed to find some old notes from back when I was trying to determin a super unique monster from the stats string.
Just reading them brought back a few memorys, so I have tryed adding what I can remember about other types of enhanced monsters that can be.


[code]
(DWORD) NPC ID
(WORD) NPC Code
(WORD) NPC Spawn X
(WORD) NPC Spawn Y
(BYTE) NPC Life% (LifePer / 1.28)
(BYTE) Message Lengh
~~ Stats String ~~
(BITS[4]) Effect
    0 = unknown (never is 0?)
    1 = normal
    2 = normal
    3 = get hit
    4 = shoot missile
    5 = melee punch
    6 = dodge/block attack
    7 = invisible (animation that test NPC did not support)
    8 = raise from floor
    9 = invisible (animation that test NPC did not support)
    10 = invisible (animation that test NPC did not support)
    11 = invisible (animation that test NPC did not support)
    12 = Dead on floor in pile (corpse)
    13 = stands montionless/1 frame animation (for IE, if the npc was frozen when it came inview)
    14 = normal?
    15 = normal?

(BITS[4]) BaseFlag
    if 0 then stop.
    If 1st bit then monster has extra batterys/stats up its ass?
    some combo with the 2nd, 3rd and 4th bit (somtimes 1st), can efect lengh(below)

(BITS[X]) unknown
    relates to animation effects and verys in lengh, depending on the NPC code
    normaly around 20 bits long?

(BITS[8]) MonFlag
    bit 1 = unknown?
    bit 2 = unknown?
    bit 3 = if not set, monster is normal? (effects later decodeing)
    bit 4 = Is Champion
    bit 5 = Is Super prefixed
    bit 6 = Is Super unique (bit 5 must be set, other wise normal monster?)
    bit 7 = Is Minion
    bit 8 = Is Cloaked

'For super uniques (such as eldritch) - (prefix'ed NPC's work abit like this to i think)
(BITS[13]) Super unique code
    Line number (0 based) to SuperUniques.txt
    this line number is NOT 13 bits long, its around 7 - 9 bits, the end nibble is unknown

Do Untill (Enhancments = 0) Or (Enhancments = 0xB0)
    (BITS[8]) Enhancment
        0x28 = Extra Strong
        0x30 = Extra Fast
        0x38 = Cursed
        0x40 = Magic Res
        0x48/0x49 = Fire Enhanced
        0x88 = Lightning Enhanced
        0x90 = Cold Enhanced
        0xB0 = End Of Enhancements
        0xB8 = Psn Immune
        0xC0 = Thief
        0xC8 = Mana Burn
        0xD0 = Teleportation
        0xD8 = Special Hit
        0xE0 = Stone Skin
        0xE8 = Multiple Shot
        0xF0 = Aura Enhanced
        Note, the enhancment is about 4 bits long
        The 1st few bits might be a small flag (See fire-enhanced)
        Also i think each enhancement pair/order can add a new bonus of its own here, not sure.
Loop

(BITS[8]) 0x00 (Enhancement terminator?)

(BITS[24]) unknown
[/code]
I can remember this being really time consuming, due to the lack of info printed over an NPC.
Hopefully there is enough info here for you to do what your doing (if you havent done it already), but if you want to define the lower-quality (=< prefixed) unique monsters, then it shouldnt be to hard, with a few observations.

Im not 100% sure what your aiming to do. (im guessing just grab the enhancements/super unique code so you know eldritch when you see him?)
If I have missed out any notes, just shout what your unsure about or where your trying to get to.

Hope this helps
June 27, 2007, 4:00 PM
Insolence
No problem, I've been super busy with the ladder too :D

I really appreciate you sharing this information with me; I'm basically using it to intelligently chicken.  Chicken on immune, chicken on MSLE, etc.  Also, to target monsters (not other harmless NPC's) and such.  I think using the information from this is very important in a bot.
June 28, 2007, 4:29 AM
Insolence
I couldn't figure out how to get all this stuff from packets correctly--sadly--but I figured this out using memory, finally.  I still can't get whether or not he's immune to lightning, but this is something.

MonsterData struct:
[code]    [StructLayout(LayoutKind.Explicit)]
    public struct MonsterData
    {
    [FieldOffset(0x00)] [MarshalAs(UnmanagedType.ByValArray, SizeConst=22)] public byte[] _1;
   
        // Union
[FieldOffset(0x16)] public byte  fFlags;

    [FieldOffset(0x17)] public UInt16  _2;
    [FieldOffset(0x18)] public uint    _3;
    [FieldOffset(0x1C)] [MarshalAs(UnmanagedType.ByValArray, SizeConst=9)]  public byte[] anEnchants;
    [FieldOffset(0x25)] public byte    _4;
    [FieldOffset(0x26)] public UInt16  wUniqueNo;
    [FieldOffset(0x28)] public byte    _5;

[FieldOffset(0x2C)] [MarshalAs(UnmanagedType.ByValTStr, SizeConst=28)]      public string wName;
    }[/code]

Cast wUniqueNo to:
[code]    public enum UniqueMonster
    {
        Bishibosh,
        Bonebreak,
        Coldcrow,
        Rakanishu,
        TreeheadWoodFist,
        Griswold,
        TheCountess,
        PitspawnFouldog,
        FlamespikeTheCrawler,
        Boneash,
        Radament,
        BloodwitchTheWild,
        Fangskin,
        Beetleburst,
        Leatherarm,
        ColdwormTheBurrower,
        FireEye,
        DarkElder,
        TheSummoner,
        AncientKaaTheSoulless,
        TheSmith,
        WebMageTheBurning,
        WitchDoctorEndugu,
        Stormtree,
        SarinaTheBattlemaid,
        IcehawkRiftwing,
        IsmailVilehand,
        GelebFlamefinger,
        BremmSparkfist,
        ToorcIcefist,
        WyandVoidfinger,
        MafferDragonhand,
        WingedDeath,
        TheTormentor,
        Taintbreeder,
        RiftwraithTheCannibal,
        InfectorofSouls,
        LordDeSeis,
        GrandVizierofChaos,
        TheCowKing,
        Corpsefire,
        TheFeatureCreep,
        SiegeBoss,
        AncientBarbarian1,
        AncientBarbarian2,
        AncientBarbarian3,
        AxeDweller,
        BonesawBreaker,
        DacFarren,
        MegaflowRectifier,
        EyebackUnleashed,
        ThreashSocket,
        Pindleskin,
        SnapchipShatter,
        AnodizedElite,
        VinvearMolech,
        SharpToothSayer,
        MagmaTorquer,
        BlazeRipper,
        Frozenstein,
        NihlathakBoss,
        BaalSubject1,
        BaalSubject2,
        BaalSubject3,
        BaalSubject4,
        BaalSubject5
    }[/code]

And the anEnchants are:
[code]    public enum Enchant
    {
        None,
        RndName,
        HpMultiply,
        Light,
        LevelAdd,
        Strong,
        Fast,
        Curse,
        Resist,
        Fire,
        PoisonDead,
        DurielDead,
        BloodRaven,
        Rage,
        SpcDamage,
        PartyDead,
        Champion,
        Lightning,
        Cold,
        Hireable,
        Scarab,
        KillSelf,
        QuestComplete,
        PoisonHit,
        Thief,
        ManaBurn,
        Teleport,
        SpectralHit,
        StoneSkin,
        MultiShot,
        Aura,
        GoBoom,
        FireSpikeExplode,
        SuicideMinionExplode,
        AiAfterDeath,
        ShatterOnDeath,
        Ghostly,
        Fanatic,
        Possessed,
        Berserk,
        WormsOnDeath,
        AlwaysRunAi,
        LightningDeath
    }[/code]
July 17, 2007, 12:20 PM
warz
what's with the horribly annoying "[FieldOffset(0x17)]" stuff in your C# pastes?
July 18, 2007, 2:38 AM
Insolence
[quote author=betawarz link=topic=16816.msg171069#msg171069 date=1184726337]
what's with the horribly annoying "[FieldOffset(0x17)]" stuff in your C# pastes?
[/quote]Not sure if I needed them in that struct (could've done sequential, I think), but I'm specifying specific offsets for unmanaged memory.
July 18, 2007, 11:47 AM
warz
you mean that stuff is part of the C# compiler directives, or something? eww.
July 18, 2007, 4:20 PM
Myndfyr
[quote author=betawarz link=topic=16816.msg171078#msg171078 date=1184775650]
you mean that stuff is part of the C# compiler directives, or something? eww.
[/quote]
No.  It's not part of the compiler.
July 19, 2007, 2:01 AM
ShadowDancer
may be a day the search button get life and start eating all us.

https://davnit.net/bnet/vL/index.php?topic=15790.0

also it can success that a day u need to get the states soo u will ask for 0xaa instead of using the search button, https://davnit.net/bnet/vL/index.php?topic=16228.0

and i think that all other questions that a new botmaker can do, have been asked and replyed by the members like ringo for hundreds of times.
August 3, 2007, 9:19 AM
dRAgoN
[quote author=Insolence link=topic=16816.msg171060#msg171060 date=1184674850]
I couldn't figure out how to get all this stuff from packets correctly--sadly--but I figured this out using memory, finally.  I still can't get whether or not he's immune to lightning, but this is something.

MonsterData struct:
[code]    [StructLayout(LayoutKind.Explicit)]
    public struct MonsterData
    {
    [FieldOffset(0x00)] [MarshalAs(UnmanagedType.ByValArray, SizeConst=22)] public byte[] _1;
   
        // Union
[FieldOffset(0x16)] public byte  fFlags;

    [FieldOffset(0x17)] public UInt16   _2;
    [FieldOffset(0x18)] public uint     _3;
    [FieldOffset(0x1C)] [MarshalAs(UnmanagedType.ByValArray, SizeConst=9)]  public byte[] anEnchants;
    [FieldOffset(0x25)] public byte     _4;
    [FieldOffset(0x26)] public UInt16   wUniqueNo;
    [FieldOffset(0x28)] public byte     _5;

[FieldOffset(0x2C)] [MarshalAs(UnmanagedType.ByValTStr, SizeConst=28)]      public string wName;
    }[/code]

Cast wUniqueNo to:
[code]    public enum UniqueMonster
    {
        Bishibosh,
        Bonebreak,
        Coldcrow,
        Rakanishu,
        TreeheadWoodFist,
        Griswold,
        TheCountess,
        PitspawnFouldog,
        FlamespikeTheCrawler,
        Boneash,
        Radament,
        BloodwitchTheWild,
        Fangskin,
        Beetleburst,
        Leatherarm,
        ColdwormTheBurrower,
        FireEye,
        DarkElder,
        TheSummoner,
        AncientKaaTheSoulless,
        TheSmith,
        WebMageTheBurning,
        WitchDoctorEndugu,
        Stormtree,
        SarinaTheBattlemaid,
        IcehawkRiftwing,
        IsmailVilehand,
        GelebFlamefinger,
        BremmSparkfist,
        ToorcIcefist,
        WyandVoidfinger,
        MafferDragonhand,
        WingedDeath,
        TheTormentor,
        Taintbreeder,
        RiftwraithTheCannibal,
        InfectorofSouls,
        LordDeSeis,
        GrandVizierofChaos,
        TheCowKing,
        Corpsefire,
        TheFeatureCreep,
        SiegeBoss,
        AncientBarbarian1,
        AncientBarbarian2,
        AncientBarbarian3,
        AxeDweller,
        BonesawBreaker,
        DacFarren,
        MegaflowRectifier,
        EyebackUnleashed,
        ThreashSocket,
        Pindleskin,
        SnapchipShatter,
        AnodizedElite,
        VinvearMolech,
        SharpToothSayer,
        MagmaTorquer,
        BlazeRipper,
        Frozenstein,
        NihlathakBoss,
        BaalSubject1,
        BaalSubject2,
        BaalSubject3,
        BaalSubject4,
        BaalSubject5
    }[/code]

And the anEnchants are:
[code]    public enum Enchant
    {
        None,
        RndName,
        HpMultiply,
        Light,
        LevelAdd,
        Strong,
        Fast,
        Curse,
        Resist,
        Fire,
        PoisonDead,
        DurielDead,
        BloodRaven,
        Rage,
        SpcDamage,
        PartyDead,
        Champion,
        Lightning,
        Cold,
        Hireable,
        Scarab,
        KillSelf,
        QuestComplete,
        PoisonHit,
        Thief,
        ManaBurn,
        Teleport,
        SpectralHit,
        StoneSkin,
        MultiShot,
        Aura,
        GoBoom,
        FireSpikeExplode,
        SuicideMinionExplode,
        AiAfterDeath,
        ShatterOnDeath,
        Ghostly,
        Fanatic,
        Possessed,
        Berserk,
        WormsOnDeath,
        AlwaysRunAi,
        LightningDeath
    }[/code]
[/quote]
Why not just use the cell sheets in the MPQ's for the names and such?
If I  remember all the text data, aura info etc.. you could ever want is in them cell sheets.
August 3, 2007, 10:54 PM
Insolence
Cell sheets?  Err, you mean text files?

Which text files?
August 4, 2007, 10:31 AM
Insolence
Mega bump, I still haven't figured this out (just gave up on it) -- I was wondering if I could get a few more hints about this part:
[code](BITS[4]) BaseFlag
    if 0 then stop.
    If 1st bit then monster has extra batterys/stats up its ass?
    some combo with the 2nd, 3rd and 4th bit (somtimes 1st), can efect lengh(below)

(BITS[X]) unknown
    relates to animation effects and verys in lengh, depending on the NPC code
    normaly around 20 bits long?[/code]

Still working on it, will post what I figure out :)
June 6, 2008, 1:24 AM

Search