Forge map modding

Discussion about modding Halo 3.
User avatar
rocket360gs





Posts: 44
Joined: Tue Apr 29, 2008 6:07 pm

Post by rocket360gs »

I do have a basic understanding of hex, just not when applied to Halo modding. If I shouldn't start with the forge maps: fine, but tell me where I SHOULD start. I'm getting a little tired of people telling me to just give up and not even try without offering a single suggestion on where to start or how to learn. You are wasting my time and your own.
User avatar
Tural




Conceptionist Acolyte Bloodhound Recreator
Socialist Connoisseur Droplet Scorched Earth
Grunge

Posts: 15628
Joined: Thu Jun 16, 2005 3:44 pm
Location: Lincoln, NE
Contact:

Post by Tural »

There isn't really a place to start. There isn't a tutorial to teach you. People learn by doing, trial and error combined with knowledge of the formats. There really isn't somewhere you can just go to learn. You kinda have to figure it out for yourself.
User avatar
rocket360gs





Posts: 44
Joined: Tue Apr 29, 2008 6:07 pm

Post by rocket360gs »

OK, I was half expecting a ton of links to "Hexadecimal" on Wikipedia :lol:. But at least someone knows I'm above that. Shade gave me some good suggestions in a PM which I will post here if he is OK with it.

EDIT: After comparing several things in the maps I managed to isolate the spawn info for a hornet.
User avatar
shade45




Translator Artisan Enthraller Logistician
Stylist Wave Firestorm New Age

Posts: 2270
Joined: Fri Apr 01, 2005 1:04 pm

Post by shade45 »

No its cool... I told him the best way to map the format of a file is to make a change in game then compare it to an unmodified version of the same file to find the offset of the change.
User avatar
miinaturvat
Readers Club





Posts: 75
Joined: Thu Apr 10, 2008 10:04 am

Post by miinaturvat »

I think i've figured out how the forge variant works...

The forge variant is stored somewhere in the CON file.

Part of the forge variant tells the map what to spawn.

It does this by storing the 4 byte object tag, then 8 bytes after it. Part of these 8 bytes are a 2 byte pointer to somewhere else in the forge map that stores the attributes of the object that is going to be spawned.

This sequence always starts at offset 0x1B494 on every forge variant i have tested.

The 4 byte object tag can be found by opening a map in johnson or engineer.

The 8 bytes after it are as follows:


1st byte = Always 00

2nd and 3rd byte = Both the same, Just the number of that item there are on the map.

4th byte = Sets the maximum amount of this item there can be.

5th and 6th byte = A pointer to another part of the forge map that holds the attributes of the object (i.e co-ordinates, rotation, etc.)

7th and 8th byte = Both are always 00


If i am wrong in any way, or anyone else knows anything else about the forge variants, please correct me because i really want to find how this really works.

Sorry if it's a little hard to understand :?

Hope this helps :D
User avatar
shade45




Translator Artisan Enthraller Logistician
Stylist Wave Firestorm New Age

Posts: 2270
Joined: Fri Apr 01, 2005 1:04 pm

Post by shade45 »

Nice, you got most of that correct :D

Heres the layout of that section taken from my white paper so you can fill in your unknowns.

Code: Select all

public class Tag_Index_Entry : Chunk
    {
        [Ident(IdentType.ID)]
        public TagReference Tag; //0
        public byte Run_Time_Minimun; //4
        public byte Run_Time_Maximun; //5
        public byte Number_On_Map; //6
        public byte Design_Time_Maximun; //7
        public float Total_Cost; //8
    }
Patrickssj6




Pi Collaborator

Posts: 5426
Joined: Sat Jul 24, 2004 12:12 pm
Location: I'm a Paranoid
Contact:

Post by Patrickssj6 »

shade45 wrote:Nice, you got most of that correct :D

Heres the layout of that section taken from my white paper so you can fill in your unknowns.

Code: Select all

public class Tag_Index_Entry : Chunk
    {
        [Ident(IdentType.ID)]
        public TagReference Tag; //0
        public byte Run_Time_Minimun; //4
        public byte Run_Time_Maximun; //5
        public byte Number_On_Map; //6
        public byte Design_Time_Maximun; //7
        public float Total_Cost; //8
    }
Almost matches the class inside your sig :P
...left for good
User avatar
Tural




Conceptionist Acolyte Bloodhound Recreator
Socialist Connoisseur Droplet Scorched Earth
Grunge

Posts: 15628
Joined: Thu Jun 16, 2005 3:44 pm
Location: Lincoln, NE
Contact:

Post by Tural »

Heh.
User avatar
neodos
Readers Club




Artisan Miner

Posts: 1394
Joined: Thu Aug 12, 2004 11:57 am

Post by neodos »

What the hell are you guys playing?
User avatar
miinaturvat
Readers Club





Posts: 75
Joined: Thu Apr 10, 2008 10:04 am

Post by miinaturvat »

Ah.

I misunderstood bits of it then :D

can i ask what "Design_Time_Maximun" is?


Also, since you have the layouts for that part of the file, would it be possible for me to obtain the layouts of the rest of the file to aid my research please?

Possibly through PM?

It would be greatly appreciated. :)
Image
User avatar
shade45




Translator Artisan Enthraller Logistician
Stylist Wave Firestorm New Age

Posts: 2270
Joined: Fri Apr 01, 2005 1:04 pm

Post by shade45 »

miinaturvat wrote:Ah.

I misunderstood bits of it then :D

can i ask what "Design_Time_Maximun" is?


Also, since you have the layouts for that part of the file, would it be possible for me to obtain the layouts of the rest of the file to aid my research please?

Possibly through PM?

It would be greatly appreciated. :)
Its the max amount of that item that can be spawned in forge while making a map. Runtime min/max determines how many of that item can be spawned simultaneously while the map is being played.

I'm not ready to give anyone the whole format yet. But if you or anyone else need confirmation on values you find in your own research I can do that.
User avatar
neodos
Readers Club




Artisan Miner

Posts: 1394
Joined: Thu Aug 12, 2004 11:57 am

Post by neodos »

Why aren't you ready to release the research information?
We are not asking for an app but the research would be useful, like not wasting our time researching when it's already been done :/

I'll do my research then, but anyway thanks for helping a bit, but what is the reson to not release that?
User avatar
Veegie




Socialist Architect Coroner Golden Age
Mad Hatter Acolyte Translator New Age
ONI

Posts: 3638
Joined: Wed Nov 26, 2003 2:28 pm
Location: Redmond, WA

Post by Veegie »

neodos wrote:Why aren't you ready to release the research information?
We are not asking for an app but the research would be useful, like not wasting our time researching when it's already been done :/

I'll do my research then, but anyway thanks for helping a bit, but what is the reson to not release that?
Because if you can't bring yourself to research the most simple of things(usermap layout), than what worth do you prove for yourself in future instances?
There's no point in helping a fat kid win a foot race if all he ever wanted to do was to go to Burger King.
Image
Hijikata wrote:The fact you love Jesus doesn't change the fact you're a *** mental patient. It just means you're a mental patient with a great imaginary friend.
User avatar
shade45




Translator Artisan Enthraller Logistician
Stylist Wave Firestorm New Age

Posts: 2270
Joined: Fri Apr 01, 2005 1:04 pm

Post by shade45 »

neodos wrote:Why aren't you ready to release the research information?
We are not asking for an app but the research would be useful, like not wasting our time researching when it's already been done :/

I'll do my research then, but anyway thanks for helping a bit, but what is the reson to not release that?
I said I'd help out... Plus like Veegie just stated, there's no point in me just giving everyone the white paper without them at least putting some effort into trying to understand it for themselves.

For example miinaturvat showed some initiative and took it upon himself to try and figure out some of the format. He didn't have it completely correct but I saw that he was trying and thought he deserved a little help.
User avatar
rocket360gs





Posts: 44
Joined: Tue Apr 29, 2008 6:07 pm

Post by rocket360gs »

Miinaturvat and Shade, thank you both!

I have been doing some of my own research and have come up with some offsets that seemed to be about what I was looking for (and I tried to MSN IM you shade to confirm), but this really helps!
miinaturvat wrote: The forge variant is stored somewhere in the CON file.
Yes, the halo-related info begins at offset 0x0000E000 in every forge variant I have seen.
miinaturvat wrote: 5th and 6th byte = A pointer to another part of the forge map that holds the attributes of the object (i.e co-ordinates, rotation, etc.)
I found this as well (sounds like it's actually the first three bytes instead). This is the part (the attributes) which needs the most further researching (since you pretty much mapped out the first part 100%). The best I have been able to tell, the attributes are around offset 0x000164BC and begin with the data "830000FFFFFFFFFFFFFFFF0000000241..." and are usually fairly lengthy. If anyone can confirm this that would be great.

Keep up the good work! :D

EDIT: Once this gets fully mapped I move that we make an app to streamline it. Thoughts?
User avatar
neodos
Readers Club




Artisan Miner

Posts: 1394
Joined: Thu Aug 12, 2004 11:57 am

Post by neodos »

shade45 wrote:
neodos wrote:Why aren't you ready to release the research information?
We are not asking for an app but the research would be useful, like not wasting our time researching when it's already been done :/

I'll do my research then, but anyway thanks for helping a bit, but what is the reson to not release that?
I said I'd help out... Plus like Veegie just stated, there's no point in me just giving everyone the white paper without them at least putting some effort into trying to understand it for themselves.
And what is the point of a forum that you can't even call anymore a community?

Veegie Veegie? who did the research? since when Veegie control what you do?
since when this is just a place where people come show what they can do and others cannot?

I though this was a place to share knowledge to evolve, to progress, faster and better and finnaly enjoing modding and sharing mods to play em all together.

But no, it seems that this has just become a sort of place where sciencits come show what they can and do because of their so good work(indeed) they have so big ego that they doesn't even dare to share it if you are not part of this sciencits group.

There is here a lot of persons that have already proven their modding skills and developing research as well for Halo 1 than for Halo 2.










You know what doesn't make sense?

When all started for halo 3:
http://forums.halomods.com/viewtopic.php?t=69721

That are research thread right, what happens when "noobs" at research want to help - "no this is for l33t get out of here"

And then there is:

Q: how can i mod?
A: no you can't.
Q: Why?
A:Because You can't.


Then those who can mod showing pictures of their mods and then people replying and asking about it, and the creators of the mods get pissed of because "meeeehhhh y people asking questions, they pisssssssss me offfffffffff" cry baby cry >_>


And now you pretend to let these noobs the l33t group rejected to do the same research as you did, great, good job, that's the spirit of the community :roll:

Or is that just you let Veegie decide for you?

You guys think more about doign and re-doign the research than modding?

WTF


The point of all of this is to mod!

Veegie said.no.

*Prepare for moderator flaming*

Also this doesn't deserve an RC it isn't against the rules, thanks.
User avatar
shade45




Translator Artisan Enthraller Logistician
Stylist Wave Firestorm New Age

Posts: 2270
Joined: Fri Apr 01, 2005 1:04 pm

Post by shade45 »

Veegie did not make my decision for me. This I just don't feel like sharing at the moment. I don't see any reason for me to have to justify it.

Just so you know I my previous post was not directed towards you. I know that you are pretty skilled and we've been on good terms since I've known you. Lets keep it that way I don't want start another one of these retarded halomods beefs that happen all the time because those are what really tears this community apart.
rocket360gs wrote:Miinaturvat and Shade, thank you both!

I have been doing some of my own research and have come up with some offsets that seemed to be about what I was looking for (and I tried to MSN IM you shade to confirm), but this really helps!
miinaturvat wrote: The forge variant is stored somewhere in the CON file.
Yes, the halo-related info begins at offset 0x0000E000 in every forge variant I have seen.
Yes that is true.. most of the time. Once in awhile the usermap will begin at 0xD000 it all depends of the structure of the of the CON file its in.
rocket360gs wrote:
miinaturvat wrote: 5th and 6th byte = A pointer to another part of the forge map that holds the attributes of the object (i.e co-ordinates, rotation, etc.)
I found this as well (sounds like it's actually the first three bytes instead). This is the part (the attributes) which needs the most further researching (since you pretty much mapped out the first part 100%). The best I have been able to tell, the attributes are around offset 0x000164BC and begin with the data "830000FFFFFFFFFFFFFFFF0000000241..." and are usually fairly lengthy. If anyone can confirm this that would be great.
Lol you know what, screw it I'm just gonna give u guys the paper(I know sudden change of heart :P)


Halo 3 Usermap Whitepaper v0.5

Author: shade45

Thanks:

-Anthony: Helped map out some of the format(when he wasn't working on other cool stuff :P) and most of all for giving me the ability to test my findings
-Veegie: Testing
-TheMainDude: Testing
-Detox: Testing

Code: Select all

    public class BLF_Header : Chunk //48 Bytes
    {
    }

    public class CHDR_Header : Chunk //264 Bytes
    {
    }

    public class Header : Chunk //264 Bytes
    {
        [Size(4)]
        public char[] MapV;
        public int Size;
        public short Unknown_8;
        public short Unknown_10;
        [Size(12)]
        public byte[] Unknown_12;
        [String(StringType.Unicode, 16)]
        public string Varient_Name;
        [String(128)]
        public string Varient_Description;
        [String(16)]
        public string Varient_Author;
        public int Unknown_200;
        public int Unknown_204;
        public int Unknown_208;
        public int Unknown_212;
        public int Unknown_216;
        public int Entry_Size;
        public int CON_File_Name_1;
        public int CON_FIle_Name_2;
        public int Unknown_232;
        public int NULL;
        public int Map_ID;
        public int Unknown_244;
        public int NULL_2;
        public short NULL_3;
        [Size(10)]
        public byte[] Unknown_254;
    }

    public class Unknown_Block_1 : Chunk //56 Bytes
    {
        public short Unknown;
        public short Unknown_2;
        public byte Unknown_4;
        public byte Spawned_Object_Count;
        public short Unknown_6;
        public int Map_ID;
        public float World_Bounds_X_Min;
        public float World_Bounds_X_Max;
        public float World_Bounds_Y_Min;
        public float World_Bounds_Y_Max;
        public float World_Bounds_Z_Min;
        public float World_Bounds_Z_Max;
        public int Unknown_36;
        public float Maximum_Budget;
        public float Current_Budget;
        public int Unknown_48;
        public int Unknown_52;
    }

    public class Placement_Block : Chunk //84 Bytes * 640
    {

        public enum BlockType : short
        {
            Player_Spawn = 9,
            Reserved = 41,
            Added = 131,
            Original = 137,
            Edited = 139,
            NULL = 0,
        }

        public int Block_Type; //0
        #region Unused Data
        [Size(8)]
        public byte[] Unused_4; //4
        #endregion
        public int Tags_Index; //12
        public float X; //16
        public float Y; //20
        public float Z; //24
        public float Yaw; //28
        public float Pitch; //32
        public float Roll; //36
        public float Unknown_Rot_1; //40
        public float Unknown_Rot_2; //44
        public float Unknown_Rot_3; //48
        #region Unused Data
        [Size(8)]
        public byte[] Unused_52; //52
        #endregion
        public byte Unknown_60; //60 
        public byte Unknown_61; //61   
        [Options(new string[] 
        {
            "Unknown",
            "Place At Start",
            "Asymmetrical",
            "Symmetrical",
            #region Unused Flags
            "Unused",
            "Unused",
            "Unused",
            "Unused",
            #endregion
        })]
        public Bitmask8 Flags; //62
        public byte Team; //63
        public byte Spare_Clips/Teleporter_Channel; //64
        public byte Respawn_Time; //65
        public short Unknown66; //66
        #region Unused Data
        [Size(16)]
        public byte[] Unused_68; //68
        #endregion
    }

    public class Unknown_Block_2 : Chunk //28 Bytes
    {
        public short Unknown;
        public short Unknown_2;
        public short Unknown_4;
        public short Unknown_6;
        public short Unknown_8;
        public short Unknown_10;
        public short Unknown_12;
        public short Unknown_14;
        public short Unknown_16;
        public short Unknown_18;
        public short Unknown_20;
        public short Unknown_22;
        public short Unknown_24;
        public short Unknown_26;
    }

    public class Tag_Index_Entry : Chunk //12 Bytes * 256
    {
        [Ident(IdentType.ID)]
        public TagReference Tag;
        public byte Run_Time_Minimun;
        public byte Run_Time_Maximun;
        public byte Number_On_Map;
        public byte Design_Time_Maximun;
        public float Cost_of_Item;
    }
    
    public class Unknown_Block_3 : Chunk //4 Bytes * 
    {
        public short Unknown;
        public short Unknown_2;
    }
Do with it what you want. I just hope everyone can learn from this ;)
Last edited by shade45 on Wed May 07, 2008 12:18 am, edited 1 time in total.
User avatar
neodos
Readers Club




Artisan Miner

Posts: 1394
Joined: Thu Aug 12, 2004 11:57 am

Post by neodos »

Wahh amazing!!!!!! THANK YOU VERY MUCH!!!!!!!!!!!!!!!!!!!!!!!!!!!

And GOOD JOB!!!!!!!!!!

I'll try to label all the unknowns!!


Thank you very very much!
User avatar
miinaturvat
Readers Club





Posts: 75
Joined: Thu Apr 10, 2008 10:04 am

Post by miinaturvat »

Thanks for the layout :D
Image
User avatar
miinaturvat
Readers Club





Posts: 75
Joined: Thu Apr 10, 2008 10:04 am

Post by miinaturvat »

Also, i was reading over your layout thingy when i spotted something that didn't seem right.

Maybe i'm just thick and don't get it, or maybe this is actually incorrect.

The following image has a "Tag_Index_Entry" for 3 mongooses (or is it mongi? :D ) on the pit.

Image

Please explain :D
Image
Post Reply