Releases: k3sra/halo-multiplayer-evolved
Release list
v0.2.8
Restart the game after this installs.
Groundwork, and a class of crash removed.
What was blocking everything
Loading a map destroys the game's front end. The mod's only way to run work on the game's own thread lived in that front end, so from the moment a map loaded the mod could not run anything at all. Everything that has to happen during a match was stuck behind this.
It now moves that route onto a part of the game that is never destroyed, so the mod keeps working once you are in a map.
Three crashes fixed on the way
All three had been in the code for a long time and only showed up once the mod started doing this.
- The mod restored a widget's internals when a screen went away. If the game had already destroyed that widget, the restore landed on whatever had taken its place and quietly corrupted it. The game then died somewhere unrelated, which is why this took four attempts to find.
- It copied a fixed amount of each widget's internals. Anything larger than expected lost its tail, and calls into the missing part crashed.
- It missed a small piece of bookkeeping that sits just before those internals, which some parts of the game read.
Still to come
You load into the same map at the same moment and cannot see each other yet. Nothing about the players crosses between machines. That is the next piece and this release is what makes it possible to work on.
Install
Copy version.dll, MultiplayerEvolved.dll and the MultiplayerEvolved folder into Halo Campaign Evolved\Meteorite\Binaries\Win64\. Everyone you play with needs the same version.
v0.2.7
Restart the game after this installs.
Two crashes, both caused by the last two releases.
Crashing when you join somebody
The mod started reading connection state directly instead of waiting to be told about it, which is what made joining fast. It handed Steam a buffer sized to one version of the Steamworks SDK, and this game ships two of them side by side. When Steam wrote more than the mod expected, it overwrote the mod's own memory, and the crash landed on whoever was joining.
It now uses a buffer several times larger than any version needs.
Crashing when you quit
Quitting from the menu or closing the window ended in a crash inside Steam every time.
Each report asks who this machine is, which reads the Steam name and id. The last report is sent while the game is closing, by which point the game has finished with Steam, so that read went into memory that had already been released. The answer is now remembered the first time it is worth remembering, so nothing is read on the way out.
Install
Copy version.dll, MultiplayerEvolved.dll and the MultiplayerEvolved folder into Halo Campaign Evolved\Meteorite\Binaries\Win64\. Everyone you play with needs the same version.
v0.2.6
Restart the game after this installs.
Groundwork for players being able to see each other. No visible change in this build.
The mod now writes down, once per launch, every part of the game's own networking machinery it can find: the types, and the functions grouped by what owns them.
This game ships co-op, which means the code that puts two people in one world, replicates their characters and applies one player's shots to another already exists and already works. Building that from scratch would be months of invented work. Driving what is already there is the same approach that made starting a match work in the first place, where the game's own entry point did in one call what a great deal of guesswork could not.
Finding it needed a map. Now there is one.
Install
Copy version.dll, MultiplayerEvolved.dll and the MultiplayerEvolved folder into Halo Campaign Evolved\Meteorite\Binaries\Win64\. Everyone you play with needs the same version.
v0.2.5
Restart the game after this installs.
Starting a match put the two players in the map at very different times. Logs from both machines showed one beginning its load 4.7 seconds after the lobby said the match was live, and the other 44.6 seconds after.
Two faults behind it.
The lobby was not actually waiting for anybody
Nobody is supposed to be released into a match until every player reports that they have loaded. The mod reported "loaded" the instant it began, so that check was passing before anyone had loaded anything. Everyone was released immediately and each machine then started its own load whenever it got round to it.
It now reports what has actually happened, so nobody is released until the map has genuinely begun loading everywhere.
The loading screen was starving the thing that runs the load
The loading screen hid the lobby behind it. The lobby was also the thing keeping the mod's work moving on the game's own thread, and hiding it stopped that. The call that starts the map load is exactly that kind of work, which is where the 4.7 and 44.6 seconds went.
The lobby now stays where it is and simply stops answering the mouse, so it keeps the work moving and the loading screen still takes every click.
Still to come
You will load into the same map at the same moment, and you still will not see each other. Nothing about the players crosses between machines yet. That is the next piece of work and it is a large one.
Install
Copy version.dll, MultiplayerEvolved.dll and the MultiplayerEvolved folder into Halo Campaign Evolved\Meteorite\Binaries\Win64\. Everyone you play with needs the same version.
v0.2.4
Restart the game after this installs.
A diagnostics release. The multiplayer behaviour is unchanged from v0.2.3.
What changed
The mod now records what it is doing in full detail rather than in summary. Every fault worth fixing so far has needed two or three machines at the same time, and a report of one of those is only as good as what was written down while it happened.
The file is MultiplayerEvolved.log in the folder you installed into, and the run before it is kept beside it as MultiplayerEvolved.previous.log. If something goes wrong, attaching that file to an issue saves a great deal of guessing.
If you would rather it stayed brief, put an empty file named quiet.on in the MultiplayerEvolved folder.
Install
Copy version.dll, MultiplayerEvolved.dll and the MultiplayerEvolved folder into Halo Campaign Evolved\Meteorite\Binaries\Win64\. Everyone you play with needs the same version.
v0.2.3
Restart the game after this installs.
The session no longer follows you to the main menu
Opening multiplayer and leaving closed the session and then opened it again a moment later, so sitting on the main menu you were still advertised as hosting a deathmatch lobby you had left. That stands in front of the game's own co-op, which is not what somebody who opened the game to play co-op asked for.
A session now exists only while the multiplayer screen is open, and an empty one closes when you leave it by any route.
The player who started the match no longer gets left behind
Loading a level destroys the game's menus, and this mod was still trying to draw on them several times a second, waiting on each attempt, on the same thread that tells the other players you have finished loading. They heard nothing and waited. That work now stops once the match has the screen.
Honest about what a match currently is
Both machines load the same map at the same moment with the same random seed, and that works. Nothing about the players is sent between machines once you are in it, so you each play your own copy and cannot see each other. That is the next major piece of work. The README said "Built", which reads as more than it is, and now says so plainly.
While this is being tested
This build keeps a detailed log on every machine, so a problem that needs two or three people can be worked out from what was recorded rather than from what anyone remembers afterwards.
Nothing leaves your machine unless the install has been set up for it, which needs a file you would have to be given. When it is on, the status panel in the top right says TEST BUILD: SHARING LOGS for as long as it is. If you would rather the log stayed brief either way, put an empty file named quiet.on in the MultiplayerEvolved folder.
All of this is temporary and comes out when testing is done.
Install
Copy version.dll, MultiplayerEvolved.dll and the MultiplayerEvolved folder into Halo Campaign Evolved\Meteorite\Binaries\Win64\. Everyone you play with needs the same version.
v0.2.2
Restart the game after this installs.
Two faults, one of them caused by v0.2.1.
Joining failed instantly with "a connection attempt is already in flight"
v0.2.1 made the mod both watch for a lobby entry directly and listen for Steam to announce it, so that neither could hold a join up. That part worked. What it missed is that the join then heard about the same entry twice, and the second time it started the whole thing again: a second connection on top of one that was already being made, which fails, and the failure killed the session.
So the join was going fine and the mod broke it. It is now reported once however many times it is noticed, guarded in two separate places.
The session that stayed offline no matter what
Hosting was only ever attempted when you did something, and a failed attempt was never tried again. Going back to the main menu and returning is the same single attempt meeting the same refusal, which is why it never recovered.
Two things could refuse it: Steam limits how often a lobby can be created, and a request that never got an answer left the mod believing one was still in progress, for as long as the game stayed open.
- A request that goes twenty seconds without an answer is now abandoned and reported, instead of blocking every later one
- Hosting is retried every three seconds while the multiplayer screen is open and there is no session
Also
The server name field gives your own name back when you leave somebody's lobby. You are shown the host's name while you are in their session, which is right, but it stayed in the box afterwards, and the mod reads that box when you host. Your next server was advertised to everybody under the previous host's name.
Install
Copy version.dll, MultiplayerEvolved.dll and the MultiplayerEvolved folder into Halo Campaign Evolved\Meteorite\Binaries\Win64\. Everyone you play with needs the same version.
v0.2.1
Restart the game after this installs.
This release is about one thing: nothing should take longer than a few seconds, and nothing should be able to hang.
Why everything was slow
The loading screen in v0.2.0 hid the lobby behind it. The lobby was also carrying the mechanism the whole mod uses to run work on the game's thread, and a hidden widget stops feeding it. So the mod's own loop lost seconds at a time.
That single fault caused three of the things you saw: a five second countdown taking over a minute, the bar crawling between steps, and CANCEL doing nothing. The cancel button was drawn and was enabled; the loop that reads button presses was the thing that had stopped running.
Why joining could hang forever
- Joining a lobby had no time limit at all. Every other step had one. If Steam never confirmed the entry, the session sat there until the game was closed. It now gives up after fifteen seconds and says why.
- The greeting to the host was sent once. If it or the reply went missing, you waited out the full timeout and then failed, while the host's screen showed you as having arrived. It is repeated every two seconds now.
- Appearing on the host's roster now counts as being let in. The acceptance and the roster travel separately and either can go missing. If you can see yourself in the lobby, you are in it.
- Picking a server after backing out of another one could wait on the lobby you had just left. Entry is now matched against the lobby you actually asked for.
Why the steps were slow
Entering a lobby and every connection change were being waited for rather than asked about. The mod now asks Steam directly every tick instead of waiting to be told.
Also in this release
- The countdown is timed against the clock, so nothing can stretch it
- A hundred loading lines instead of a sentence describing what the title already says
- A server nobody has named is advertised under its host's name instead of reading "PLAYER"
- Ping shows as unmeasured rather than as
0ms. A Steam lobby search does not return a round trip, so every server was showing the best possible number. Real ping estimation is the next piece of work
Install
Copy version.dll, MultiplayerEvolved.dll and the MultiplayerEvolved folder into Halo Campaign Evolved\Meteorite\Binaries\Win64\. Everyone you play with needs the same version.
v0.2.0
Restart the game after this installs. A loaded DLL cannot replace itself, so the new build is saved beside the running one and swapped in the next time the game starts.
The match-start crash
Pressing START MATCH froze both machines for about a minute and then crashed them. One fault caused all of it: the launch asked the game thread for a lock the lobby was already holding, so each waited for the other until the timeout, and the wait then gave up while the work was still running against memory that had gone.
Both halves are fixed. Beginning a match no longer takes that lock and no longer blocks the lobby, and the game thread dispatcher can no longer abandon work that has already started, run the same job twice, or let anything it throws reach the engine.
Everything else in this release
The invite panel opens on the first press. It used to wait for the Steam lobby to finish being created, which is always later than the button, and it refused to open at all for anyone who had joined a friend. You can now invite people into a session you joined, not only one you host.
A guest can see what the host chose. Mode, map, game time, friendly fire, respawn time and the server name are greyed out rather than removed, so the terms of the match are readable. Only the host can change them, and typing into the server name field as a guest is no longer possible.
Names draw correctly. Steam names were being decoded one byte at a time, which turned anything outside plain English into garbage glyphs, and cut mid character when they were too long. Names outside the game's own alphabet are cleaned rather than drawn as empty boxes.
Server browser rows no longer overlap. CAPTURE THE FLAG printed across the map column and the LOBBY tag sat on top of the server name. Long player names ran off their team cards.
A loading screen. Joining a lobby, starting a session, loading the map and waiting for the other players each used to leave the screen exactly as it was, with no way to tell working from hung. There is now a screen for all four showing how far through the wait it is, what is happening at that moment, how long it has been going, and a way out. Where a real percentage exists it is shown; where none does it shows the elapsed time and says what the game is doing instead of inventing a number.
Install
Copy version.dll, MultiplayerEvolved.dll and the MultiplayerEvolved folder into Halo Campaign Evolved\Meteorite\Binaries\Win64\. Everyone you play with needs the same version.
v0.1.9
Both players need this build. Update from 0.1.8 is automatic and needs one restart.
A match starts for everybody now
Pressing START MATCH used to leave the lobby and begin the campaign on that
machine alone. A guest watched the host vanish and stayed sitting in a lobby with
nobody in it.
The host counts down out loud, every player sees the same number, and the launch
carries the scenario and a shared random seed so both machines load the same map
the same way. Nobody is released until everyone has loaded.
The whole sequence had been written for months and was unreachable: the gate in
front of it tested for a Blam console binding this build does not resolve, while
the path that actually starts a match never used that binding at all.
Starting alone is refused with a reason on screen rather than nothing happening.
The invite panel looks like the game now
It was drawn to its own proportions and looked borrowed from another program:
rows stretching the frontend's button art to an aspect it was never drawn at, and
a close button running the full width of the card, which is a shape the game uses
nowhere.
Rows are the height the lobby's own buttons use and read correctly at, the heading
is in the frontend's heading art, the list sits on the game's panel backing so the
rows read as a group, and the footer is a page back, a page indicator, a page
forward and a close button the size of a button.