Unit and Monster Type menu

User Tag List

Page 1 of 3 123 LastLast
Results 1 to 15 of 40
  1. #1
    ChrisSch's Avatar Sergeant
    Reputation
    6
    Join Date
    Apr 2012
    Posts
    37
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Unit and Monster Type

    Hi, I'm searching for the RActor type and Monster type.
    I looked trough the RActor structure and its attributes.
    I've seen SNO and a lot of other stuff. But no actor type yet.
    I also searched with IDA, and there is no string reference to actor type

    With actor type i mean if its a monster, a player or a prop or something else...
    Any tips on how to find it ?

    Unit and Monster Type
  2. #2
    Nesox's Avatar ★ Elder ★
    Reputation
    1280
    Join Date
    Mar 2007
    Posts
    1,238
    Thanks G/R
    0/3
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by ChrisSch View Post
    Hi, I'm searching for the RActor type and Monster type.
    I looked trough the RActor structure and its attributes.
    I've seen SNO and a lot of other stuff. But no actor type yet.
    I also searched with IDA, and there is no string reference to actor type

    With actor type i mean if its a monster, a player or a prop or something else...
    Any tips on how to find it ?

    It's in the Actor SNO you need to write a SNO Reader, either memory or file to get that.

  3. #3
    ChrisSch's Avatar Sergeant
    Reputation
    6
    Join Date
    Apr 2012
    Posts
    37
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    The problem is mainly that my hero attacks tornados. I already check against the attribute "invincible" and "god", but they are not set for those RActors.
    I thought I could just easily read out that value and check if its a not attackable mob.

    But thank you for the tip!! I'll look into the MPQs later / when I'm more experienced.

    And does that mean UnitType is directly related to [RActor + 0x88] ?
    If so, I'd rather make a custom list of SNOs that I handle...

  4. #4
    BitHacker's Avatar Master Sergeant
    Reputation
    13
    Join Date
    May 2012
    Posts
    114
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Nesox,

    I've read this whole sub-forum and I've never seen any mention to what the R in RActor stands for?

    Also, what does the S N O stand for in SNO?

    You keep mentioning multiple times to build a SNO Reader in multiple posts thru-out this sub-forum. Is there any other information you can give us on how to build a SNO Reader. I have no idea even where to start looking. Other than the normal "How to build a SNO Reader on google." lol.

    Thanks for anyhelp.

    -Bit_Hacker

  5. #5
    ChrisSch's Avatar Sergeant
    Reputation
    6
    Join Date
    Apr 2012
    Posts
    37
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    SNO is something like a model-id I think.
    RActor is just another name for Unit, I don't know what the R stands for.

    I think a sno reader would read from the CoreData.mpq.
    I tried to find the SNO of some actors in .ACR files and .MON files, but I don't really understand the format. When searching for the SNO inside these files with a hex editor there are no results either.
    This stuff would be much easier when we would know the basic format / setup of these files formats.

    This site could be helpful:
    Diablo 3 Dev
    But unfortunately there is nearly no information about acr/mon files there.


    @nesox, how do you manage units that your bot should not attack?
    do you filter them by sno too ? Or is there an easier way?
    Last edited by ChrisSch; 05-20-2012 at 11:22 AM.

  6. #6
    Valtharak's Avatar Master Sergeant
    Reputation
    51
    Join Date
    Feb 2011
    Posts
    105
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    look at mooege actor sno format in the mpq

    then you can use GetSnoInfoFromSnoId to get the pointer to the ActorSNO structure with the actorsno from the RActor or ACD.

  7. #7
    BitHacker's Avatar Master Sergeant
    Reputation
    13
    Join Date
    May 2012
    Posts
    114
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Valtharak,

    [Edited...]

    WHAT IS SNO? What does it stand for?

    I went back and read the post again, let me check out SNO in visual studio real quick lmao...

    Can't find actor in mooege where is it?

    I think I found it:

    Code:
    /*
     * Copyright (C) 2011 - 2012 mooege project - http://www.mooege.org
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 2 of the License, or
     * (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     */
    
    using System.Collections.Generic;
    using CrystalMpq;
    using Gibbed.IO;
    using Mooege.Core.GS.Actors;
    using Mooege.Core.GS.Common.Types.Collision;
    using Mooege.Core.GS.Common.Types.Math;
    using Mooege.Core.GS.Common.Types.SNO;
    using Mooege.Common.MPQ.FileFormats.Types;
    using Mooege.Core.GS.Common.Types.TagMap;
    
    namespace Mooege.Common.MPQ.FileFormats
    {
        [FileFormat(SNOGroup.Actor)]
        public class Actor : FileFormat
        {
            public Header Header { get; private set; }
            public int Int0 { get; private set; }
    
            /// <summary>
            /// Actor Type
            /// </summary>
            public ActorType Type { get; private set; }
    
            /// <summary>
            /// SNO for Apperance
            /// </summary>
            public int ApperanceSNO { get; private set; }
    
            public int PhysMeshSNO { get; private set; }
            public AxialCylinder Cylinder { get; private set; }
            public Sphere Sphere { get; private set; }
            public AABB AABBBounds { get; private set; }
            public TagMap TagMap { get; private set; }
    
            /// <summary>
            /// SNO for actor's animset.
            /// </summary>
            public int AnimSetSNO { get; private set; }
    
            /// <summary>
            /// MonterSNO if any.
            /// </summary>
            public int MonsterSNO { get; private set; }
            public List<MsgTriggeredEvent> MsgTriggeredEvents = new List<MsgTriggeredEvent>();
    
            public int Int1 { get; private set; }
            public Vector3D V0 { get; private set; }
            public WeightedLook[] Looks { get; private set; }
            public int PhysicsSNO { get; private set; }
            public int Int2 { get; private set; }
            public int Int3 { get; private set; }
            public float Float0 { get; private set; }
            public float Float1 { get; private set; }
            public float Float2 { get; private set; }
            public ActorCollisionData ActorCollisionData { get; private set; }
            public int[] InventoryImages { get; private set; }
            public int Int4 { get; private set; }
            public string CastingNotes { get; private set; }
            public string VoiceOverRole { get; private set; }
            public int BitField0 { get; private set; }           // 25 bits - better this this would be an uint
            public int BitField1 { get; private set; }           // 25 bits - better this this would be an uint
    
            public Actor(MpqFile file)
            {
                var stream = file.Open();
                Header = new Header(stream);
    
                this.Int0 = stream.ReadValueS32();
                this.Type = (ActorType)stream.ReadValueS32();
                this.ApperanceSNO = stream.ReadValueS32();
                this.PhysMeshSNO = stream.ReadValueS32();
                this.Cylinder = new AxialCylinder(stream);
                this.Sphere = new Sphere(stream);
                this.AABBBounds = new AABB(stream);
    
                this.TagMap = stream.ReadSerializedItem<TagMap>();
                stream.Position += (2 * 4);
    
                this.AnimSetSNO = stream.ReadValueS32();
                this.MonsterSNO = stream.ReadValueS32();
    
                MsgTriggeredEvents = stream.ReadSerializedData<MsgTriggeredEvent>();
    
                this.Int1 = stream.ReadValueS32();
                stream.Position += (3 * 4);
                this.V0 = new Vector3D(stream.ReadValueF32(), stream.ReadValueF32(), stream.ReadValueF32());
    
                this.Looks = new WeightedLook[8];
                for (int i = 0; i < 8; i++)
                {
                    this.Looks[i] = new WeightedLook(stream);
                }
    
                this.PhysicsSNO = stream.ReadValueS32();
                this.Int2 = stream.ReadValueS32();
                this.Int3 = stream.ReadValueS32();
                this.Float0 = stream.ReadValueF32();
                this.Float1 = stream.ReadValueF32();
                this.Float2 = stream.ReadValueF32();
    
                this.ActorCollisionData = new ActorCollisionData(stream);
    
                this.InventoryImages = new int[10]; //Was 5*8/4 - Darklotus
                for (int i = 0; i < 10; i++)
                {
                    this.InventoryImages[i] = stream.ReadValueS32();
                }
                this.Int4 = stream.ReadValueS32();
                stream.Position += 4;
                BitField0 = stream.ReadValueS32();
                CastingNotes = stream.ReadSerializedString();
                VoiceOverRole = stream.ReadSerializedString();
    
                // Updated based on BoyC's 010 template and Moack's work. Think we just about read all data from actor now.- DarkLotus
                stream.Close();
            }
        }
        public class ActorCollisionData
        {
            public ActorCollisionFlags ColFlags { get; private set; }
            public int I0 { get; private set; }
            public AxialCylinder Cylinder { get; private set; }
            public AABB AABB { get; private set; }
            public float F0 { get; private set; }
    
            public ActorCollisionData(MpqFileStream stream)
            {
                ColFlags = new ActorCollisionFlags(stream);
                I0 = stream.ReadValueS32();
                Cylinder = new AxialCylinder(stream);
                AABB = new AABB(stream);
                F0 = stream.ReadValueF32();
                stream.ReadValueS32();// Testing - DarkLotus
            }
        }
    
        public class AxialCylinder
        {
            public Vector3D Position { get; private set; }
            public float Ax1 { get; private set; }
            public float Ax2 { get; private set; }
    
            public AxialCylinder(MpqFileStream stream)
            {
                this.Position = new Vector3D(stream.ReadValueF32(), stream.ReadValueF32(), stream.ReadValueF32());
                Ax1 = stream.ReadValueF32();
                Ax2 = stream.ReadValueF32();
            }
        }
    
        public class Sphere
        {
            public Vector3D Position { get; private set; }
            public float Radius { get; private set; }
    
            public Sphere(MpqFileStream stream)
            {
                Position = new Vector3D(stream.ReadValueF32(), stream.ReadValueF32(), stream.ReadValueF32());
                Radius = stream.ReadValueF32();
            }
        }
    
        public class WeightedLook
        {
            public string LookLink { get; private set; }
            public int Int0 { get; private set; }
    
            public WeightedLook(MpqFileStream stream)
            {
                this.LookLink = stream.ReadString(64, true);
                Int0 = stream.ReadValueS32();
            }
        }
    }


    I take it noone really does know what SNO stands for ?



    -Bit_Hacker
    Last edited by BitHacker; 05-20-2012 at 03:43 PM.

  8. #8
    BitHacker's Avatar Master Sergeant
    Reputation
    13
    Join Date
    May 2012
    Posts
    114
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    ChrisSch,

    You were right

    Here is a REFERENCE TO WHAT SNO IS .....
    Definitions - Diablo 3 Dev

    Overview

    Game asset files. Groups of SNO files are organized into folders and stored in MPQ container files. SNO files each have unique integer IDs that allow SNO files to reference each other. The file format is unique to each type of SNO file, although it appears to always be a binary format.
    Code:
    public enum SNOGroup : int
    {
        Code = -2,
        None = -1,
        Actor = 1,
        Adventure = 2,
        AiBehavior = 3,
        AiState = 4,
        AmbientSound = 5,
        Anim = 6,
        Anim2D = 7,
        AnimSet = 8,
        Appearance = 9,
        Hero = 10,
        Cloth = 11,
        Conversation = 12,
        ConversationList = 13,
        EffectGroup = 14,
        Encounter = 15,
        Explosion = 17,
        FlagSet = 18,
        Font = 19,
        GameBalance = 20,
        Globals = 21,
        LevelArea = 22,
        Light = 23,
        MarkerSet = 24,
        Monster = 25,
        Observer = 26,
        Particle = 27,
        Physics = 28,
        Power = 29,
        Quest = 31,
        Rope = 32,
        Scene = 33,
        SceneGroup = 34,
        Script = 35,
        ShaderMap = 36,
        Shaders = 37,
        Shakes = 38,
        SkillKit = 39,
        Sound = 40,
        SoundBank = 41,
        StringList = 42,
        Surface = 43,
        Textures = 44,
        Trail = 45,
        UI = 46,
        Weather = 47,
        Worlds = 48,
        Recipe = 49,
        Condition = 51,
        TreasureClass = 52,
        Account = 53,
        Conductor = 54,
        TimedEvent = 55,
        Act = 56,
        Material = 57,
        QuestRange = 58,
        Lore = 59,
        Reverb = 60,
        PhysMesh = 61,
        Music = 62,
        Tutorial = 63,
        BossEncounter = 64,
    }
    -Bit_Hacker

  9. #9
    BitHacker's Avatar Master Sergeant
    Reputation
    13
    Join Date
    May 2012
    Posts
    114
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Valtharak View Post
    look at mooege actor sno format in the mpq

    then you can use GetSnoInfoFromSnoId to get the pointer to the ActorSNO structure with the actorsno from the RActor or ACD.

    GetSnoInfoFromSnoId?

    I'm not getting it..

    I see this in Immunity... Using forum address.

    GetSnoInfoFromSnoId:
    Code:
    008D42F2   6A 00            PUSH 0                                   ; arg 2 = 00000000
    008D42F4   50               PUSH EAX                                 ; arg 1 = 00000CE5
    008D42F5   E8 16FFFBFF      CALL Diablo_I.00894210                   ; Call to GetSnoInfoFromSnoId
    008D42FA   8BF0             MOV ESI,EAX                              ; Return from GetSnoInfoFromSnoId
    Stack:
    Code:
    0018FDE0   00000CE5  å...  |Arg1 = 00000CE5
    0018FDE4   00000000  ....  \Arg2 = 00000000
    Inside:
    Code:
    00894210   55               PUSH EBP                                 ; GetSnoInfoFromSnoId
    00894211   8BEC             MOV EBP,ESP
    00894213   53               PUSH EBX
    00894214   56               PUSH ESI
    00894215   57               PUSH EDI
    00894216   8BF1             MOV ESI,ECX
    00894218   8B7E 44          MOV EDI,DWORD PTR DS:[ESI+44]
    0089421B   D1EF             SHR EDI,1
    0089421D   83E7 01          AND EDI,1
    00894220   74 05            JE SHORT Diablo_I.00894227
    00894222   E8 79BCFFFF      CALL Diablo_I.0088FEA0
    00894227   8B45 0C          MOV EAX,DWORD PTR SS:[EBP+C]
    0089422A   8B4D 08          MOV ECX,DWORD PTR SS:[EBP+8]
    0089422D   50               PUSH EAX
    0089422E   6A 00            PUSH 0
    00894230   51               PUSH ECX
    00894231   8BCE             MOV ECX,ESI
    00894233   E8 38FBFFFF      CALL Diablo_I.00893D70
    00894238   8BD8             MOV EBX,EAX
    0089423A   85FF             TEST EDI,EDI
    0089423C   74 0E            JE SHORT Diablo_I.0089424C
    0089423E   8B8E A0000000    MOV ECX,DWORD PTR DS:[ESI+A0]
    00894244   83C1 30          ADD ECX,30
    00894247   E8 54A46100      CALL Diablo_I.00EAE6A0
    0089424C   85DB             TEST EBX,EBX
    0089424E   75 09            JNZ SHORT Diablo_I.00894259
    00894250   5F               POP EDI
    00894251   5E               POP ESI
    00894252   33C0             XOR EAX,EAX
    00894254   5B               POP EBX
    00894255   5D               POP EBP
    00894256   C2 0800          RETN 8
    00894259   8B5B 0C          MOV EBX,DWORD PTR DS:[EBX+C]
    0089425C   53               PUSH EBX
    0089425D   8BCE             MOV ECX,ESI
    0089425F   E8 8CAFFFFF      CALL Diablo_I.0088F1F0
    00894264   5F               POP EDI
    00894265   5E               POP ESI
    00894266   5B               POP EBX
    00894267   5D               POP EBP
    00894268   C2 0800          RETN 8
    I'm not seeing the pointer to ActorSNO?? Any help?

    I don't see how your getting that from Actor.cs?

    -Bit_Hacker
    Last edited by BitHacker; 05-20-2012 at 07:06 PM.

  10. #10
    st0724's Avatar Member
    Reputation
    2
    Join Date
    Feb 2007
    Posts
    60
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    ChrisSch,

    ACD+0x90 is the actorSNO id. You can then use it in GetSnoInfoFromSnoId to get a pointer to the SNO in memory. actorSNO+0x10 is the unit type enum.

    Code:
          <Enum>        
            <Entry Name="Invalid" Value="0" />
            <Entry Name="Monster" Value="1" />
            <Entry Name="Gizmo" Value="2" />
            <Entry Name="Client Effect" Value="3" />
            <Entry Name="Server Prop" Value="4" />
            <Entry Name="Environment" Value="5" />
            <Entry Name="Critter" Value="6" />
            <Entry Name="Player" Value="7" />
            <Entry Name="Item" Value="8" />
            <Entry Name="Axe Symbol" Value="9" />
            <Entry Name="Projectile" Value="10" />
            <Entry Name="Custom Brain" Value="11" />
          </Enum>

  11. #11
    Valtharak's Avatar Master Sergeant
    Reputation
    51
    Join Date
    Feb 2011
    Posts
    105
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Hi Bit_Hacker

    a SNO is data from the MPQ
    SNOId is a 32 integer that is the id of so said data.

    there are many group of SNO the enum you posted few post up are those. if you look in mooege Common.MPQ.FileFormat you can see the SNO data structure from the MPQ files. if you want to use the ones from diablo memory using the GetSnoInfoFromSnoId the Header is a bit different.

    GetSnoInfoFromSnoId require 2 params. first one is the pointer to the SNOGroup memory region. second param is the SNOId .

    so for your question. a RActor or ACD has a ActorSNO value in it's structure. ( for ACD it's 0x90 offset)

    From that ActorSNO you can fetch the Actor SNO data.

    ActorSNO has a ActorType value

    public enum ActorType
    {
    Invalid = 0,
    Monster = 1,
    Gizmo = 2,
    ClientEffect = 3,
    ServerProp = 4,
    Enviroment = 5,
    Critter = 6,
    Player = 7,
    Item = 8,
    AxeSymbol = 9,
    Projectile = 10,
    CustomBrain = 11
    }

  12. #12
    BitHacker's Avatar Master Sergeant
    Reputation
    13
    Join Date
    May 2012
    Posts
    114
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Valtharak,

    So is that stack reference correct for GetSnoInfoFromSnoId?

    It says the first param is CE5 though? added to what my diablo3.exe base?

    the second param is zero?

    so 00800CE5 is my pointer to my SNOGroup? then zero is the Id?

    Doesn't sound right?

    ChrisSch,
    Clear some space out of your inbox.. Jeez... lol I can't send you a message...


    -Bit_Hacker
    Last edited by BitHacker; 05-20-2012 at 10:10 PM.

  13. #13
    st0724's Avatar Member
    Reputation
    2
    Join Date
    Feb 2007
    Posts
    60
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    GetSnoInfoFromSnoId has the __thiscall calling convention. The pointer to SNOGroup is stored in the ECX register. 0xCE5 is the actorSNO id.

  14. #14
    BitHacker's Avatar Master Sergeant
    Reputation
    13
    Join Date
    May 2012
    Posts
    114
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    st0724,

    thanks, but this call:

    008D42F2 6A 00 PUSH 0 ; arg 2 = 00000000
    008D42F4 50 PUSH EAX ; arg 1 = 00000CE5
    008D42F5 E8 16FFFBFF CALL Diablo_I.00894210 ; Call to GetSnoInfoFromSnoId
    008D42FA 8BF0 MOV ESI,EAX ; Return from GetSnoInfoFromSnoId


    Only has 2 pushes, which means it could be a stdcall. Because the clean up is inside the function. Which means the GetSnoInfoFromSnoId (<< Damn I hate that name, that can't be the real name of the function...) is not correct.

    It just means this address I got from this sub-forum is wrong for GetSnoInfoFromSnoId = 00894210...

    Anyone know the real one for the retail version?

    -Bit_Hacker
    Last edited by BitHacker; 05-20-2012 at 11:46 PM.

  15. #15
    Valtharak's Avatar Master Sergeant
    Reputation
    51
    Join Date
    Feb 2011
    Posts
    105
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    0x894210 is what we have in ida

Page 1 of 3 123 LastLast

Similar Threads

  1. ObjectFields.Type and ObjectManagerEntry.Type not matching?
    By xalcon in forum WoW Memory Editing
    Replies: 3
    Last Post: 10-10-2012, 04:48 AM
  2. [Bot] Momory ready - movement waypoints and monster position.
    By kukkuk in forum Diablo 3 Memory Editing
    Replies: 3
    Last Post: 08-31-2012, 07:54 AM
  3. [Buying] D3 Gold, mostly US normal, also buy EU normal, US hardcore and other types limitedly
    By ChiChi1857 in forum Diablo 3 Buy Sell Trade
    Replies: 11
    Last Post: 07-25-2012, 09:15 PM
  4. Crackdown on speed programs and XYZ type programs.
    By navywarrior in forum World of Warcraft Bots and Programs
    Replies: 11
    Last Post: 05-20-2009, 10:25 PM
  5. Delphi and single type
    By radegast in forum WoW Memory Editing
    Replies: 4
    Last Post: 01-31-2008, 07:13 PM
All times are GMT -5. The time now is 09:38 PM. Powered by vBulletin® Version 4.2.3
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search