ValveSoftware / Proton

Compatibility tool for Steam Play based on Wine and additional components
Other
24.46k stars 1.07k forks source link

Source 2007 mods: Unable to join/create servers, or view achievements (218) #2249

Open ghost opened 5 years ago

ghost commented 5 years ago

Compatibility Report

System Information

I confirm:

steam-9856914317583057114.log

Symptoms

Hello,

Thank you for recently adding the option to force apps to use Proton. This makes it possible to launch Source 2007 mods on Steam for Linux. However, multiplayer mods are unable to create/join servers, or view achievements. The following were observed when playing a multiplayer mod:

Server Browser: Steam Beta must be running to make use of Find Servers

Connect by IP: The server requires that you be running Steam.

Create listen server: CD Key authentication invalid for internet servers.

View achievements: You must be logged in to Steam to unlock or view achievements

Reproduction

  1. Opt into the Steam Beta
  2. Force Source SDK Base 2007 to use Proton
  3. Install Source SDK Base 2007
  4. Install a multiplayer Source mod. I used GoldenEye: Source
  5. Attempt any of the above tasks under Symptoms
nsivov commented 5 years ago

It probably needs older API that's not exposed currently:

12137.073:0008:0009:err:steamclient:create_win_interface Don't recognize interface name: SteamUser008 ... 12145.249:0008:0009:err:steamclient:create_win_interface Don't recognize interface name: SteamGameServer003

ghost commented 5 years ago

Progress made with the recent 3.16-Beta release! It's now possible to view achievements and use the server browser. However, actually connecting to a server gets the message "This Steam account is being used in another location" in the console, along with the message box below: image However, if one uses sv_lan 1 it is finally possible to launch a listen server :)

ghost commented 5 years ago

I have this problem as well. Obsidian Conflict, Source SDK 2007.

Proton version: 3.16.7

romulasry commented 5 years ago

A new Proton 4.2 was just released today.

ghost commented 5 years ago

Already tried it, no improvement (for GE:S) unfortunately.

romulasry commented 5 years ago

https://lutris.net/games/obsidian-conflict/ I tried but it isn't working on Lutris yet.

ghost commented 5 years ago

Proton 4.2-3

Got an error when trying to join a game server.

image

Strange considering I can already join servers using Proton in Half-Life 1 Mods.

ghost commented 5 years ago

4.2-4

Still can't join servers.

ghost commented 5 years ago

Still unable to join servers due to the error above. Attaching a fresh log. steam-9856914317583057114.log

ghost commented 5 years ago

Proton 4.11-1

Still unable to join servers.

ghost commented 5 years ago

Proton 4.11-3

Still unable to join servers, it seems nothing has changed in the previous versions.

As an additional note, listen servers are not VAC protected and I get STEAM_ID_PENDING as Steam ID.

] status
hostname: Obsidian Conflict Beta v1.34 Listen Server
version : 1.0.1.0/14 4104 insecure  
udp/ip  :  (redacted):27015
map     : oc_stadium at: -113 x, -1000 y, 192 z
players : 1 (4 max)

# userid name uniqueid connected ping loss state adr
#  2 "Gabe Iggy" STEAM_ID_PENDING 00:26 16 0 active loopback
romulasry commented 5 years ago

@kisak-valve Is this being worked on? I don't see why this would be fixed as of 4.11-6.

ghost commented 5 years ago

4.11-8

The mod now crashes when trying to connect a server.

Attaching Proton Log steam-14770360520569520346.log

ghost commented 4 years ago

4.11-12

The mod still crashes when creating or joining a server.

Is this being worked on?

ghost commented 4 years ago

Nope

brianinthered commented 4 years ago

I just tried Goldeneye: Source with Proton 5.0-5 and it launches then crashes. I watch Source SDK Base 2007 launch and then close.

It used to run fine, but now when I try any version of Proton it crashes

Fenteale commented 4 years ago

Just want to add that D.I.P.R.I.P. Warm Up on steam does not work on linux with the exact same symptoms posted in OP. https://store.steampowered.com/app/17530/DIPRIP_Warm_Up/

ghost commented 4 years ago

Proton 5.0-6

Now only single player works, listen servers will now crash. On Obsidian Conflict I can set maxplayers to 1 to force a single player session and it will work that way.

It seems it gets progressively more broken.

Also I can't seem to find this issue in the GitHub searcher, I have to use Google, anyone else?

brianinthered commented 4 years ago

Tried both Goldeneye: Source and D.I.P.R.I.P and both still do not work. DIPRIP will launch and I can get to the menu, but anything else will crash.

Really sucks because these games ran fine in PlayOnLinux/Wine but I prefer running them in Steam. Just easier!

gigawatts commented 3 years ago

I think one of the largest issues here might be because there are spaces in Source SDK Base 2007 directory.

When trying to launch Base 2007 directly (with compatibility force set to Proton 6.3 or Experimental), this results:

GameAction [AppID 218, ActionID 3] : LaunchApp continues with user response "CreatingProcess"
/bin/sh\0-c\0/home/me/.local/share/Steam/ubuntu12_32/reaper SteamLaunch AppId=218 -- '/usr/games/steam/steamapps/common/SteamLinuxRuntime_soldier'/_v2-entry-point --verb=waitforexitandrun -- '/usr/games/steam/steamapps/common/Proton - Experimental'/proton waitforexitandrun  '/usr/games/steam/steamapps/common/Source SDK Base 2007/hl2.exe' -game sourcetest -steam\0
Game update: AppID 218 "", ProcID 44867, IP 0.0.0.0:0
Starting app 218
>>> Adding process 44867 for game ID 218
GameAction [AppID 218, ActionID 3] : LaunchApp changed task to WaitingGameWindow with ""
GameAction [AppID 218, ActionID 3] : LaunchApp changed task to Completed with ""
pressure-vessel-wrap[44868]: W: Binding directories that are located under "/usr/" is not supported!
bwrap: Can't chdir to /usr/games/steam/steamapps/common/Source SDK Base 2007: No such file or directory
Game removed: AppID 218 "", ProcID 44867 
Uploaded AppInterfaceStats to Steam
Exiting app 218

Specifically that bwrap line towards the bottom, no such file or directory, is what I would expect if it was not escaping the spaces in the directory name.

For example:

$ ls /usr/games/steam/steamapps/common/Source\ SDK\ Base\ 2007
bin  hl2  hl2.exe  hlds_steamgames.vdf  patches  platform  sourcetest  srcds.exe  steamclient.dll  steam.dll  tier0_s.dll  vpks  vstdlib_s.dll

versus

$ ls /usr/games/steam/steamapps/common/Source SDK Base 2007
ls: cannot access '/usr/games/steam/steamapps/common/Source': No such file or directory
ls: cannot access 'SDK': No such file or directory
ls: cannot access 'Base': No such file or directory
ls: cannot access '2007': No such file or directory
kisak-valve commented 3 years ago

Hello @gigawatts, pressure-vessel is explicitly telling you the issue it's having with your system. Please see https://github.com/ValveSoftware/steam-runtime/blob/master/doc/steamlinuxruntime-known-issues.md#usrlocal.

gigawatts commented 3 years ago

Hello @gigawatts, pressure-vessel is explicitly telling you the issue it's having with your system. Please see https://github.com/ValveSoftware/steam-runtime/blob/master/doc/steamlinuxruntime-known-issues.md#usrlocal.

ah, interesting, I'll have to find a different mount point for my steamlib, thanks for pointing that out!

EDIT: yep, cool that allows sourcetest to load 👍

ozgq commented 2 years ago

Downgraded to 5.13 since Experimental just makes the screen pitch black. Joining/creating MP servers doesn't work at all.

Using Gmod 11 classic

Using Ubuntu 20.04 Focal Fossa on a Dell Latitude E6430 ATG. Unable to attach logs because none were found under Source SDK Base or Gmod 11.

niobium93 commented 5 months ago

I tried to play the old 2012 mod version of Black Mesa which uses Source 2007 and it crashes on launch. steam-12487904729269010650.log Most relevent part seems to be:

29260.412:0124:0128:warn:seh:handle_syscall_fault backtrace: --- Exception 0xc0000005 at 0xec65041e: /home/andrius/.local/share/Steam/linux32/steamclient.so + 0x56641e.
29260.412:0124:0128:trace:seh:handle_syscall_fault returning to user mode ip=7a5eb89d ret=c0000005
29260.412:0124:0128:err:steamclient:steamclient_call Access violation in ISteamUserStats_STEAMUSERSTATS_INTERFACE_VERSION002_RequestCurrentStats.
29260.412:0124:0128:trace:seh:dispatch_exception code=c0000005 flags=0 addr=7BC4B288 ip=7bc4b288
29260.412:0124:0128:warn:seh:dispatch_exception EXCEPTION_ACCESS_VIOLATION exception (code=c0000005) raised

So some issue in steamclient.so. To reproduce download the original Part 1 and Part 2 of the mod. (the 'fixed' version on moddb is actually more broken because the people 'fixing' it didn't know what they're doing) It need to be extracted into a folder named bms in sourcemods. Folder should NOT be named blackmesa just because the zip is.

caatge commented 4 months ago

Replying to https://github.com/ValveSoftware/Proton/issues/2249#issuecomment-2132478523

Hi, I've looked into this issue for Source SDK Base 2006 and i think i found the cause. The issue is caused by improper IPC mapping for the interface or failed porting attempt to a newer version of the interface. (or both lol) Old Source Engine games use the IClientUser::InitiateGameConnectionOld (previously IClientUser::InitiateGameConnection) interface to generate a userid ticket for authentication, and one of the issues mentioned above causes it to attempt to dereference appid + 4 inside steamclient.so which makes it segfault. Fun fact, some games like Fortress Forever have an appid that's a valid memory location so it actually lets you connect to the server. One solution to this problem could be spoofing the appid passed to the InitiateGameConnection, which is called from CSteam3Client::InitiateConnection in engine.dll. I've been able to modify engine.dll for SDK 06, specifically replace the instruction pushing the steam appid to the esi register with a jmp instruction (to avoid issues with PE relocations) a bunch of bytes back into the int 3 block left over by MSVC (10h (16 dec) function alignment) and modify it there to something that'd be a valid memory location when dereferenced. That solution isn't really a great idea, because it only lets you join servers that are running outdated Steam binaries that don't really care about your SteamID and would let you in no matter what it is. The attached is a screenshot of GDB showcasing the attempted dereference of appid (stored in eax+ 4). If anyone's interested I could attempt to modify SDK 2007 binaries in the same way I did for SDK 2006, but keep in mind that you won't be able to stay on the server for too long if at all. If you want to play SDK 06/07 games properly on Linux you'll need to install Steam inside wine so it completely skips the lsteamclient.dll IPC proxy thing.

Edit: I didn't realize that lsteamclient was open-source until I was done writing this, so now I am able to somewhat tell what's specifically broken, and that is older InitiateGameConnection taking a uint32_t as the appid instead of a CGameID.

vmware_YIq2jSGLad

niobium93 commented 4 months ago

@caatge Not sure why you're replying to me. I'm trying to run a single-player game. No joining servers here. Game crashes on launch for me.

caatge commented 4 months ago

Sorry, my bad, it's the first time I'm using the Github comments thing.

caatge commented 4 months ago

So I decided to waste more time debugging this and got it to auth properly without any sketchy workarounds that would make VAC mad and kick you. The actual reason was the difference between the Linux steamclient function prototype and the Windows function prototype. For some reason, the Linux steamclient.so takes a CGameID* instead of a CGameID which in the end results in the Linux function being feeded 4 bytes on stack more than it needs to as well as a bad pointer. I made a small VSP (Valve Server Plugin, and yes, server plugins can be loaded on clients) which hooks the function doing the IPC call between the Unix side and the Windows side and does it correctly. More proper fix is yet to come by telling the lsteamclient C file generator thing to somehow circumvent this issue. I'm going to leave the task of actually making this correction into the C file generator to someone else, as this is my first time dealing with anything Proton and Linux related and I have no experience with the codebase and barely any idea how it works. The small plugin (which is really hacky and bases on x86 patterns) can be found here: https://github.com/caatge/proton-sdk06.