Content: Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Background: Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Pattern: Blank Waves Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Welcome to Xbox Chaos: Modding Evolved

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.

Lord Zedd

Modding
Campaign.map In Multiplayer

274 posts in this topic

I wouldn't call this a proper tutorial so it's being posted here instead. Also, this is not a wishlist/begging thread like other injection threads are/quickly become, and I will be deleting any posts doing that.

 

So since we got a Longsword onto Forge World via shared.map, it was always wondered why campaign.map cannot be used. At the time we ruled it as an engine issue and left it be. A build of Assembly was also created that handles all the tedious work when injecting.

 

Recently, Akarias has been teasing that he was making progress on campaign.map, so I figured I should revisit it myself. One thing that dawned on me was that the scriptless "mp" Installation 04 I made loads campaign.map just fine from multiplayer, so perhaps it wasn't the engine at all.

 

I compared the shared cache block in PLAY between ff10_prototype and forge_halo and came across a handful of simple values that were different but consistent across further maps I checked. These were:

  • byte 0x1C - (16 in mp, 24 in ff/cmp)
  • byte 0x1D - (2 in mp, 3 in ff/cmp)
  • byte 0x48 - (16 in mp, 24 in ff/cmp)
  • byte 0x49 - (2 in mp, 3 in ff/cmp)
  • byte 0x68 - (2 in mp, 3 in ff/cmp)
  • byte 0x70 - (16 in mp, 24 in ff/cmp)
  • byte 0x71 - (2 in mp, 3 in ff/cmp)
  • byte 0xDC - (1 in mp, 2 in ff/cmp)
  • byte 0xF0 - (1 in mp, 2 in ff/cmp)
  • short 0x100 - (A value specific to the map in the entry, which we've known about. "599" is campaign)

 

I fixed these values and duplicated the block to add a campaign.map entry, but the map didn't load with a grunt bitmap injected. I went to prototype.map and replaced its shared cache block with courtyard's and the map loaded fine. This only confused me further, but I figured I should try putting courtyard's block into forge_halo, and the map loaded. I reboot the game and tried again, didn't load. What the hell was going on?

 

As it turns out, there appears to be something somewhere in the map that actually says what shared caches to load. By loading a firefight map just before, campaign.map was already "set up", so when I went back to Forge World, the map worked and was able to do this:

3GjDTWf.jpg

 

For the purposes of this thread, I just went back and set the handful of values listed above like the original test, and that also worked. So stealing another map's block is not actually necessary. I OrangeMohawk also found that you do not need to start up the firefight map, just have it load 100% just pop in the FF lobby for a sec and switch to forge/whatever.

 

So I played around with injection assembly more, trying to get anything else injected. I ended up with a brute helmet and full scarab..

FGIFDqc.jpg

4Y7xs7F.jpg

 

Some tricks/things I learned about assembly:

  • Go through the to-be extracted tags and null unnecessary tags like effects, sounds, and other objects to keep the general failure rate low. This allows you to extract/inject the object tag and get everything in one go.
  • Injecting sounds is a guaranteed hard crash during the load screen (hence the above point)
  • Adding the campaign.map cache entry removes the invalid cache error during injection (duh)
  • JMAD tags are confusing. I shouldn't have been able to spawn the scarab, yet it worked without fixing any stringids. JMAD was always an issue before and is why you haven't seen a picture of a phantom from shared.map on forge world yet.
  • Before doing any work on the injected tags, simply try and load the map ingame. If you don't crash you should be golden for the most part
  • If an rmt2 tag gets injected, you must go through and find the shader which uses it and null anything that uses said shader. There is further fixing that needs to be done to rmt2 so it will only crash the game at this time.
  • It is best to replace all the injected shaders for map ones during a first test. Bring them back one by one after you know everything else works.
  • Stringids don't appear to be an issue besides it being necessary that they are defined in the plugin when exporting.
  • Have yet to get impo tags to work.
  • When in doubt, replace the coll/phmo with an existing one
  • When in more doubt, extract a new copy of base tags (mode, coll, jmad, phmo,) and inject them a second time.
  • There can be some effe tags hidden deep in hlmt, along with some sounds/effects in jmad/frms.
  • Assassinate-able enemy bipeds tend to have a spartan bipd reference deep inside jmad. Be sure to get rid of them
  • Process is the same for Halo 3

There is still much to learn, but hopefully this thread can help/inspire you guys to chip in to try and nail all this down.

 --

You think you've got the process down? Then feel free to read on about how to reference another map's local content or reference ODST in Halo 3

Share this post


Link to post
Share on other sites

very nice work! glad to see stuff can be pulled from campaign.map, even though not everything is 100% proper, with sounds and all this is still great, keep up the good work zedd, and same goes for akarias

Share this post


Link to post
Share on other sites

Very good, progress!

 

And many headaches for me...

 

Well I finished the moa, added a seat like dead showed me and now I can ride the biped :biggrin:

 

Zedd, have a go at biped injection. Animations are borked ofc but its fun!

 

 

Edit:

 

During my first tests on the preloading firefight, I started the map and force loaded the injected tags map during the load. Later found also that I only had to reload the map.

 

Fun stuff.

Edited by Akarias

Share this post


Link to post
Share on other sites

nice freaking job guys if there is anyway to help just ask ill try my best this is awesome i saw your picture it said char tgas dose that mean ai or just random bypids ?

Share this post


Link to post
Share on other sites

nice freaking job guys if there is anyway to help just ask ill try my best this is awesome i saw your picture it said char tgas dose that mean ai or just random bypids ?

I never said char, these are just objects. AI would require editing scripts which we cannot do right now.

Share this post


Link to post
Share on other sites

Zedd, have a go at biped injection. Animations are borked ofc but its fun!

I've tried a grunt and engineer so far and both crash when I attempt to spawn them.

Share this post


Link to post
Share on other sites

It should be noted that the maps that have the alternative class index that has PATG included (Installation 04, Condemned, & Highlands) have a different structure in PLAY's External Cache References, so the bytes listed in the thread are completely different values in those maps, and I'm pretty sure aren't what control if it can load from campaign.map.

Share this post


Link to post
Share on other sites

I've tried a grunt and engineer so far and both crash when I attempt to spawn them.

 

I had this issue also, a way around it is to inject the bare minimum. That means going though and editing the original biped and hlmt so that it has no PHMO, coll, sounds etc. Then use existing sounds and other assets such as the spartan coll that are allready avaliable in the target map file after injecting the biped. You will also have the Jmad issues, half the time it works but you end up with "Intresting" results.

 

Example the moonwalking grunt that I was on about. (Sorry can't get a patch for this, I was busy in the background when assembly crashed and corrupted the map file. I didant have a auto backup feature at the time. :( )

 

Edit: 

 

King, if you really want to know how; Ill write up a quick tut on compiling the injection version of assembly and how to extract and inject tags. (Basic stuff)

Edited by Akarias

Share this post


Link to post
Share on other sites

I had this issue also, a way around it is to inject the bare minimum. That means going though and editing the original biped and hlmt so that it has no PHMO, coll, sounds etc. Then use existing sounds and other assets such as the spartan coll that are allready avaliable in the target map file after injecting the biped. You will also have the Jmad issues, half the time it works but you end up with "Intresting" results.

 

Example the moonwalking grunt that I was on about. (Sorry can't get a patch for this, I was busy in the background when assembly crashed and corrupted the map file. I didant have a auto backup feature at the time. :( )

 

Edit: 

 

King, if you really want to know how; Ill write up a quick tut on compiling the injection version of assembly and how to extract and inject tags. (Basic stuff)

Ah using another coll/phmo slipped my mind...

q2qslHh.jpg

(grunt still crashed :()

Share this post


Link to post
Share on other sites

Ah using another coll/phmo slipped my mind...

-snip-

(grunt still crashed :()

 

See! It's all possible!

 

I'm looking into why using other colls etc cause the issue. I also had to revert back to the stock injection assembly because of where I messed up the build process by having another project with all the additions I had made.

 

Edit:

Atm I'm trying to get the covy anti-air cannon injected.

 

Edit2:

 

Got a way to keep the collisions and other stuff now, was not too hard to fix. But getting the fixed colls to inject is being a bitch. Keeps complaining about compression codec index.

Edited by Akarias

Share this post


Link to post
Share on other sites

Got a way to keep the collisions and other stuff now, was not too hard to fix. But getting the fixed colls to inject is being a bitch. Keeps complaining about compression codec index.

How are your plugins?

I know I recently noticed the offset of compression codec's raw field was off and as of the last update it is fixed.

Share this post


Link to post
Share on other sites

Yep, I'm running on plugins that are ancient. Lol.

 

Grabbing the latest ones now.

 

Edit; now having issues with blamite.dll when trying to inject a single player asset.

 

--> 'System.IndexOutOfRangeException' occurred in Blamite.dll

--> result.FilePath = (externalFile != -1) ? externalFiles[externalFile].Path : null;

 

Edit 2: I really don't know what I'm doing wrong now, when ever I inject a tag from w/e assembly just crashes and corrupts the map file. If I inject a tag from shared eg longsword mode its fine. Just updated plugins as well to no avail. I must be missing something out, yes the campaign.map has been added to the cache index. If I use a previous map file that I did yesterday I am able to inject anything with no issues. 

Edited by Akarias

Share this post


Link to post
Share on other sites
--> 'System.IndexOutOfRangeException' occurred in Blamite.dll

--> result.FilePath = (externalFile != -1) ? externalFiles[externalFile].Path : null;

 

That error occurs when loading page information from play and a page's shared cache index is outside the bounds of the shared caches reflexive. I'm not sure what's causing it, but you might want to check that your campaign.map entry is actually valid.

Share this post


Link to post
Share on other sites

Only thing missing now is the turret's weapon.

Does the scarab really do that though? I remember them walking a few steps in the Pillar of Autumn, which I can see in the first few seconds you start to drive it, did Bungie just loop it? So if this means Jmads are possible, can we do the Spade? 

Share this post


Link to post
Share on other sites

Does the scarab really do that though? I remember them walking a few steps in the Pillar of Autumn, which I can see in the first few seconds you start to drive it, did Bungie just loop it? So if this means Jmads are possible, can we do the Spade? 

On POA they are machines that have a set path and animation, much like the H2 scarabs.

The walking has something to do with reach's physics I think, because if you try and forge a Scarab this happens

5IuewrT.jpg

 

And I don't know about the spade, only objects\vehicles\human\civilian\pickup\pickup and objects\vehicles\human\civilian\military_truck\military_truck are in campaign.map.

Joshua1998 likes this

Share this post


Link to post
Share on other sites

On POA they are machines that have a set path and animation, much like the H2 scarabs.

The walking has something to do with reach's physics I think, because if you try and forge a Scarab this happens

-snip-

 

And I don't know about the spade, only objects\vehicles\human\civilian\pickup\pickup and objects\vehicles\human\civilian\military_truck\military_truck are in campaign.map.

From what I can tell pickup is the Spade, because it is on Tip of the Spear and Winter contingency .map files. Unless its truck_cab_large.

Share this post


Link to post
Share on other sites