Ioq3ded & OSP spectator bug

When you’re spectating someone and the match is over and the map changes, client spectating doesn’t work. Normally you can click attack and it’ll cycle through the players. But with this, it does nothing.

Looking for tips on how to patch this bug with OSP.

I’m afraid it’s impossible since OSP source code was lost(?) after it was passed to CPMA devs. So i’ve heard.
You are not thinking about reverse engineering it? :wink:

Just the rumor I heard… the creator of OSP has gone to Quake Live,
since it’s such a popular MOD, I don’t believe the source was ever
As far as spectator bugs, I honestly have no clue if it has anything that would
help you with what your doing Sentry. But Hellfire MOD has the most
up-to-date version of ZCAM… it’s an upgrade to the standard Q3 spectator
cam, it has an action cam, etc. I haven’t evaluated it completely, but was
thinking of using it myself, as it impressed me greatly.

Perhaps a hack to fix this bug with OSP would be when a player is a spectator, if they issue the attack command, it’ll execute the /follownext command which still works.

You normally switch between spectators with the attack command. However, after a game or two with OSP, it’s broken and you have to manually type /follownext to switch between players.

What would be the easiest way to see if a player is issuing the attack command?

I never said source code of CPMA was released. I wasn’t. Unfortunately.

I wonder if this is even possible to handle solely server side?

Inside of code/server/sv_client.c, I modified SV_ClientThink to try and determine if a spectator is sending the BUTTON_ATTACK (1) command. But, the only values I’m getting for lastUsercmd.buttons are 0 and 2048 (any key on keyboard depressed sets the value to 2048).

void SV_ClientThink (client_t *cl, usercmd_t *cmd) {
	cl->lastUsercmd = *cmd;
	int clientNum;
	// Spectator calling (BUTTON_ATTACK)
	if( cl->teamNum == 3 && cl->lastUsercmd.buttons == 1 ) {
		clientNum = cl - svs.clients;
		Cbuf_ExecuteText( EXEC_NOW, va( "spoof %i follownext\n", clientNum ) );

	if ( cl->state != CS_ACTIVE ) {
		return;		// may have been kicked during the last usercmd

	VM_Call( gvm, GAME_CLIENT_THINK, cl - svs.clients );

This is weird because if you load OSP on Q3 1.32c this bug doesn’t exist. It only exists when you run OSP on ioquake3 that it happens. What’s different in the ioquake3 code that could be causing this bug to happen?

ioq3 fixed the time bugs so long uptime on a single map shouldn’t bug out the server. Don’t think theres anything else significant.