I'm looking to compile a list of coop bugs in Xidia and 7Bullets so they can later be looked into. While I have spent a good amount of time with them, I couldn't have gotten them all. Here's what I've found so far. If anyone knows of any other issues let me know.

Map 16 "Beacon"Exit teleporter sends players to the first map of The Escape, rather than the first (playable) map of The Incident.

Seven BulletsAll MapsMaps that fadeout and play dialog create a game-breaking bug as players can move off the teleporter before it's enabled and cannot see to "try again", making progress impossible.ScriptedHumans are super buggy. They will crash clients AND servers because they hate everything and everyone.

Map 2 "Infiltration of the Kran"Server room can't be entered once the laser doors are active, which are also solid so this leaves no way to kill enemies inside the room if players with them have died.

Map 3 "The Rogue"Scarred One battle skipped. Weird ghost door.

Map 5 "Slight Complication"ScriptedHumans from sp cutscene still exist and fill up log with warnings. A bug in terms of performance issue.

Map 6 "The Guardian of Vandora's Pass"If a player is on the wrong side when the bridge collapses the only way to cross is to die.Titan supershock battle skipped.Spooky ghost door.

Map 9 "Tension at Vandora's Temple"The first code (of 3) does not spawn/trigger, making it impossible to progress.

Map 12 "The Dead Scorpions"Another ghost door.The second code (of 2) does not spawn/trigger, making it impossible to progress.

Map 13 "Unfinished Business"Scripting to activate existing coop teleporter is broken so players must wait for the duration of the singleplayer cutscene before the singleplayer teleporter is triggered.

Map 14 "The Ghost of Oraghar"Map not intended for coop, as such:Scarred One is never triggered out of his hiding spot.Exit teleporter sends players to credits map.

Just found out 7Bullets' ScriptedUnrealHumans are specifically the (most likely) culprit. They would be fine but for some reason the PostBeginPlay makes a call to Male/FemaleBot, a very obviously depreciated OldSkool class (that is for some reason still part of the codebase) with invalid references.

Also found another ghost door in Xidia's Dead Mines. Really guys, don't do this.

bNet false I think.Basically you can pass through them but they do not open. Sometimes this is highly confusing because a certain door just doesn't open and you just go around aimlessly until you figure out you can pass through that door.

Replication. Server side properties of map actors can be changed (collision) but not client-side (display). Movers, lights, basically anything that has a visual influence on the map can't be changed for clients.

About one year ago I was working on a modification of 7 Bullets for coop game on Unreal 227i+ servers, and elimination of various issues was part of my work. Here I can describe those issues in detail, including technical background behind some of them, and methods I used to resolve them. Let's start with the issues already mentioned here.

zYnthetic wrote:Maps that fadeout and play dialog create a game-breaking bug as players can move off the teleporter before it's enabled and cannot see to "try again", making progress impossible.

I think, the best resolution here is to eliminate the fadeout effect in coop game completely.

ScriptedHumans are super buggy. They will crash clients AND servers because they hate everything and everyone.

I can't recall issues like that with Unreal 227. Maybe it's more robust to some coding errors than UT. Anyway, I doubt that crashes (especially client-side) can be somehow related to AI attitude.

Map 2 "Infiltration of the Kran"Server room can't be entered once the laser doors are active, which are also solid so this leaves no way to kill enemies inside the room if players with them have died.

I didn't consider that an issue, since not killing those mobs does not prevent further progress.

Map 6 "The Guardian of Vandora's Pass"If a player is on the wrong side when the bridge collapses the only way to cross is to die.

Or reconnect. The best solution I could imagine is placing a teleporter after destruction of the bridge. I'd also point out that physics of the falling bridge is very far from looking realistic. The speed of fragments immediately changes from zero to a huge value (I didn't fix this).

Titan supershock battle skipped.

I presume, it was intentionally skipped due to difficulties with implementing coop-friendly rules for the part with Titans. The logic used in SP mode is not suitable for multiplayer game and many things need to be changed there. An example of possible implementation for Unreal 227 can be found in SevenBCoopMutator (function SBMapFixServer.Server_FixCurrentMap_Jones_05_TemplePart3).

Map 9 "Tension at Vandora's Temple"The first code (of 3) does not spawn/trigger, making it impossible to progress.

The problem with missing translator messages arises from big length of such messages. Size of a replicated string must not exceed some limits; otherwise, client won't receive the string from the server. If you want to transfer some long message from a server to a client, you have to split the message into small pieces, perform piecewise replication, and then put pieces together. Alternatively, a mapper might store messages in non-destructible actors (with bStatic or bNoDelete equal to True), so that network client would be able to obtain values directly from the map. Note that on the given map TvTranslatorEvents are destructible actors, and a network client has to obtain properties of such actors through replication from the server. My implementation uses series of replicated function calls for transferring potentially long strings.

Map 13 "Unfinished Business"Scripting to activate existing coop teleporter is broken so players must wait for the duration of the singleplayer cutscene before the singleplayer teleporter is triggered.

In the worst case, Mr Drago can be pushed outside by an explosion - good luck with finding and killing him in the outside bottom part of the level then.

Map 14 "The Ghost of Oraghar"Map not intended for coop, as such:

But making it coop-friendly is easy (a ready-to-use fix for 227 is implemented).

UBerserker wrote:bNet false I think.Basically you can pass through them but they do not open. Sometimes this is highly confusing because a certain door just doesn't open and you just go around aimlessly until you figure out you can pass through that door.

Technically, it's an old bug in Unreal/UT implementation of movers. Game-irrelevant movers ARE supposed to be hidden, but the given implementation from Engine.u

//brushes can't be deleted, so if not relevant, make it invisible and non-colliding if ( !Level.Game.IsRelevant(self) ) { SetCollision(false, false, false); SetLocation(Location + vect(0,0,20000)); // temp since still in bsp bHidden = true; }

does not produce the desirable effect in network game. Movers cannot be simply destroyed because of bNoDelete == true, hence elimination of game-irrelevant movers is done by hiding, not by destruction. bHidden == true doesn't make the mover invisible, it only prevents further visible changes of mover's location. So, the actual hiding is done by moving the mover into location (x=0,y=0,z=20000) where it's likely to be non-observable. There are two reasons why this code doesn't work well in network game: new location is not replicated to client because of RemoteRole == ROLE_SimulatedProxy (it should be set to ROLE_DumbProxy to make changes of location visible to clients), and even if it would be replicated, the condition bHidden == true prevents client from updating visible mover's location which was changed after mover's initialization phase.

In Unreal 227j, the implementation of Engine.Mover.PostBeginPlay has been revised as follows:

and on 227j servers such ghost movers don't appear anymore. For UT and older versions of Unreal 1 it's possible to write a mutator that would fix this issue. I don't know if UT community created any mods that serve as bug-fixes for UT, but in case of Unreal v224 - v227i typical problems with movers are covered, e.g., by UGoldFix v7.

So, setting mover's bNet to false can reasonably be used as long as correct elimination of game-irrelevant movers is maintained - it's feasible.

zYnthetic wrote:Server side properties of map actors can be changed (collision) but not client-side (display).

Properties of client-side actors can be dynamically changed in several ways.

Movers, lights, basically anything that has a visual influence on the map can't be changed for clients.

That's not correct. You cannot dynamically change BSP or light maps, but many properties of movers and static lights can be modified.

UBerserker wrote:From what I remember this happened solely with the bots in the Vandora redux.

I couldn't reproduce that issue using UT so far.

Masterkent wrote:Alternatively, a mapper might store messages in non-destructible actors (with bStatic or bNoDelete equal to True), so that network client would be able to obtain values directly from the map.

It's also possible to use hack with loading particular actor client-side. When a TranslatorEvent-like actor of a custom TranslatorEvent-like type is touched by a player, it may set the actor name to some property (e.g. TranslatorEventActorName) of player's Translator-like inventory:

Then the Translator-like inventory may replicate the value of TranslatorEventActorName to client, its client-side counterpart may load TranslatorEvent-like actor with the given name directly from the map and retrieve its properties:

Note that translator messages can be localized client-side in the given case. When playing on the same server, people from different countries may see different messages depending on what localization files they have. This differs from the situation when you replicate the same message to all clients and draw it.

ScrptedHumans for the most part are fine. Iirc it's the ScriptedUnrealHumans that are suspect. I imagine they would be fine if not for referencing an obviously depreciated class in PostBeginPlay. It might have nothing to do with the specific bug but it's a bad sign. I believe in our last playthrough, Vandora was crashing all clients and server pretty reliably at the same location until a killall ScrptedHumans was issued

Rewriting ScriptesHumans isn't a task I'm interested in since that would require a lot more testing than I'm willing to dedicate. I do have fixes for everything else but thanks for the input.

Brilliant idea - if the instigator is not a PlayerPawn, then just do nothing with maintaining a proper value of Velocity. Maybe there are similar flaws in other places, and some of them could cause those crashes.

Pretty sure the random crashing bug with the CAR Rifle alt (and any other gun bugs) are limited to bad projectiles and not the Terran Pirates. I remember when we were testing the Deathmatch mutator that came with 7B and the script bug with the CAR would happen regardless if players or Bots shot the alt projectile.

It's been a long time. I've forgotten a lot of this stuff. Totally onboard with a fixed 7B COOP, was always poorly implemented and added on impulse with very little or no testing.

Some stuff I've read here that I do remember.

1. The skipping of the Battle of the Titans (Enchanced Shockrifle fight) in that one level was intentional. We had too many problems with that in COOP because of teleporters and because it was such a long sequence of text dump.

2. The Vandora Redux level had so many problems during development that I think when we finally got a version that ran for all of us we stopped touching it and shipped it as is. I have no idea what kind of demons are lurking in that one, all I know is that we all got it to start and end with no problems.

3. 7B's custom files were scripted by UsAaR33 and his methods of doing things is well documented by Unreal community History. I know a lot of scripters and coders are often at odds with how he did things, but at the time he was the only person we had around who could do this stuff. We spent a great deal of time working around known bugs and doing our best to squash issues while we still had him around.

There are also secondary packages running alongside 7B ones that were made by other people, specifically the grass generator made by UArchitect. In my experience, UA's stuff was much more stable but there could be some conflicts with UsAaR33's code in certain levels. Specifically, the Vandora level.

Anyway, if you want to ask me something I'll do my best and try to remember.

Mister_Prophet wrote:1. The skipping of the Battle of the Titans (Enchanced Shockrifle fight) in that one level was intentional. We had too many problems with that in COOP because of teleporters and because it was such a long sequence of text dump.

I guess, supporting coop just wasn't seriously considered, so devs chose the most simple solution instead of working on coop-friendly rules for that part and building a corresponding alternative system of actors for supporting such rules. I can imagine difficulties with implementing complex map logics for mappers who don't know UScript well, because standard triggers, counters, and dispatchers don't really constitute a decent basis for defining non-trivial conditions when certain actors should do something specific. For a decent UScript coder there should be no difficulties with implementing any logic he likes. It's not even necessary to edit the map in order to alter the behavior of actors. A third-party mutator can dynamically change properties of existing actors, remove existing destructible actors, or spawn additional actors. This allows to write external map-fixes for many maps that were not designed for coop game.

There are also secondary packages running alongside 7B ones that were made by other people, specifically the grass generator made by UArchitect.

The quality of the grass generator is far from fine when it comes to multiplayer game. It spawns a lot of plants server-side, and the server tries to replicate all of them to client. I clearly remember that this totally messed up replication between 227 servers and clients in some places. Since grass has no any impact on the game mechanics and plays a purely decorative role, it should be spawned client-side only. I didn't edit implementation of the generator itself and added the following hack for it in my mutator instead:

Not bad. It's pretty similar to what I'm doing for the original UT version via CoopSuite (mutator).https://www.youtube.com/watch?v=3fpBsd4iPEoI haven't gotten to the CarRifle and ScriptedUnrealPawns yet but everything else in the first post has been fixed. This thread is basically an effort to avoid public revisions as much as possible by fishing for any bugs I haven't caught yet.