## ETPub PCR alpha hacks (etpub_pcr_ah) ## (C) 2006-2007 PatheticCockroach.com ## This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ## Derivative works may only be done if they are distributed with their source code. ## ## The original etpub_pcr_ah source and binaries can be found around http://www.patheticcockroach.com/etserver/etpub_pcr.php ## ## Note : ETPub PCR alpha hacks are just small modifications for ETPub (http://www.etpub.org) bug 0000007 : When a player is gibbed "for ROE violation" by g_peaceAndLove, their death is shown twice (once as "gibbed for ROEV" and then as "died") ------------------------- MODIFICATION STARTS HERE src\cgame\cg_event.c (line 125) **** REPLACE // check for single client messages switch( mod ) { case MOD_SUICIDE: message = "committed suicide"; break; **** WITH // check for single client messages switch( mod ) { case MOD_ROEV: message = "^9was gibbed for ^hROE violation^9"; break; case MOD_SUICIDE: message = "committed suicide"; break; src\game\bg_public.h (line 1643) **** AFTER MOD_SUICIDE, **** ADD MOD_ROEV, src\game\g_combat.c (line 295) **** AFTER "MOD_SUICIDE", **** ADD "MOD_ROEV", (line 2066) **** REPLACE } else if(g_peaceAndLove.integer & PCR_PEACE_GIB && attacker->health>0) { //trap_SendConsoleCommand(EXEC_APPEND, va("!gib %i\n", attacker->s.number)); G_Damage(attacker, NULL, NULL, NULL, NULL, 500, 0, MOD_UNKNOWN); AP(va("cpm \"%s ^9was gibbed for ^hROE violation^9.\"", attacker->client->pers.netname)); limbo(attacker, qtrue); } **** WITH } else if(g_peaceAndLove.integer & PCR_PEACE_GIB && attacker->health>0) { //trap_SendConsoleCommand(EXEC_APPEND, va("!gib %i\n", attacker->s.number)); G_Damage(attacker, NULL, NULL, NULL, NULL, 500, 0, MOD_ROEV); //AP(va("cpm \"%s ^9was gibbed for ^hROE violation^9.\"", attacker->client->pers.netname)); //limbo(attacker, qtrue); } (line 2760) **** REPLACE // check for single client messages switch( mod ) { case MOD_SUICIDE: message = "[v]^7 committed suicide."; break; **** WITH // check for single client messages switch( mod ) { case MOD_ROEV: message = "[v]^9 was gibbed for ^hROE violation^9."; break; case MOD_SUICIDE: message = "[v]^7 committed suicide."; break; src\game\g_player_rating.c (line 617) **** AFTER "MOD_SUICIDE", **** ADD "MOD_ROEV", ------------------------- PERSONAL NOTES static void CG_Obituary( entityState_t *ent ) { int mod; int target, attacker; char *message; char *message2; char *finalMsg; char targetName[32]; char attackerName[32]; qboolean tk; clientInfo_t *ci, *ca; // JPW NERVE ca = attacker qhandle_t deathShader = cgs.media.pmImages[PM_DEATH]; target = ent->otherEntityNum; attacker = ent->otherEntityNum2; mod = ent->eventParm; tk = qfalse; if ( target < 0 || target >= MAX_CLIENTS ) { CG_Error( "CG_Obituary: target out of range" ); } ci = &cgs.clientinfo[target]; if ( attacker < 0 || attacker >= MAX_CLIENTS ) { attacker = ENTITYNUM_WORLD; ca = NULL; } else { ca = &cgs.clientinfo[attacker]; } Q_strncpyz( targetName, ci->name, sizeof(targetName) - 2); strcat( targetName, S_COLOR_WHITE ); message2 = ""; // check for single client messages switch( mod ) { case MOD_SUICIDE: message = "committed suicide"; break; case MOD_FALLING: message = "fell to his death"; break; case MOD_CRUSH: message = "was crushed"; break; case MOD_WATER: message = "drowned"; break; case MOD_SLIME: message = "died by toxic materials"; break; case MOD_TRIGGER_HURT: case MOD_TELEFRAG: // rain - added TELEFRAG and TARGET_LASER, just in case case MOD_TARGET_LASER: message = "was killed"; break; case MOD_CRUSH_CONSTRUCTIONDEATH_NOATTACKER: message = "got buried under a pile of rubble"; break; case MOD_LAVA: // rain message = "was incinerated"; break; default: message = NULL; break; } if( attacker == target ) { switch (mod) { case MOD_DYNAMITE: message = "dynamited himself to pieces"; break; case MOD_GRENADE_LAUNCHER: case MOD_GRENADE_PINEAPPLE: // rain - added PINEAPPLE message = "dove on his own grenade"; break; case MOD_PANZERFAUST: message = "vaporized himself"; break; case MOD_FLAMETHROWER: // rain message = "played with fire"; break; case MOD_AIRSTRIKE: message = "obliterated himself"; break; case MOD_ARTY: message = "fired-for-effect on himself"; break; case MOD_EXPLOSIVE: message = "died in his own explosion"; break; // rain - everything from this point on is sorted by MOD, didn't // resort existing messages to avoid differences between pre // and post-patch code (for source patching) case MOD_GPG40: case MOD_M7: // rain //bani - more amusing, less wordy message = "ate his own rifle grenade"; break; case MOD_LANDMINE: // rain //bani - slightly more amusing message = "failed to spot his own landmine"; break; case MOD_SATCHEL: // rain message = "embraced his own satchel explosion"; break; case MOD_TRIPMINE: // rain - dormant code message = "forgot where his tripmine was"; break; case MOD_CRUSH_CONSTRUCTION: // rain message = "engineered himself into oblivion"; break; case MOD_CRUSH_CONSTRUCTIONDEATH: // rain message = "buried himself alive"; break; case MOD_MORTAR: // rain message = "never saw his own mortar round coming"; break; case MOD_SMOKEGRENADE: // rain // bani - more amusing message = "danced on his airstrike marker"; break; case MOD_REFLECTED_FF: // perro message = "was killed by his own friendly fire."; break; // no obituary message if changing teams case MOD_SWITCHTEAM: return; default: message = "killed himself"; break; } } if (message) { message = CG_TranslateString( message ); finalMsg = va("%s %s.", targetName, message); if ( (cg_obituary.integer % 2) == 1 ) { CG_AddToTeamChat( finalMsg, -1 ); CG_Printf("%s\n", finalMsg); } else { CG_AddPMItem( PM_DEATH, finalMsg, deathShader ); } return; } // check for kill messages from the current clientNum if( attacker == cg.snap->ps.clientNum ) { char *s; if ( ci->team == ca->team ) { if (mod == MOD_SWAP_PLACES) { s = va("%s %s", CG_TranslateString( "You swapped places with" ), targetName ); } else { s = va("%s %s", CG_TranslateString( "You killed ^1TEAMMATE^7" ), targetName ); } } else { s = va("%s %s", CG_TranslateString( "You killed" ), targetName ); } CG_PriorityCenterPrint( s, CP_DEFAULTHEIGHT, BIGCHAR_WIDTH * 0.6, 1 ); // print the text message as well } // check for double client messages if ( !ca ) { strcpy( attackerName, "noname" ); } else { Q_strncpyz( attackerName, ca->name, sizeof(attackerName) - 2); strcat( attackerName, S_COLOR_WHITE ); // check for kill messages about the current clientNum if ( target == cg.snap->ps.clientNum ) { Q_strncpyz( cg.killerName, attackerName, sizeof( cg.killerName ) ); } } if( ca ) { switch( mod ) { case MOD_KNIFE: message = "was stabbed by"; message2 = "'s knife"; // OSP - goat luvin // if( attacker == cg.snap->ps.clientNum || target == cg.snap->ps.clientNum ) { // trap_S_StartSound( cg.snap->ps.origin, cg.snap->ps.clientNum, CHAN_AUTO, cgs.media.goatAxis ); // } break; case MOD_AKIMBO_COLT: case MOD_AKIMBO_SILENCEDCOLT: message = "was killed by"; message2 = "'s Akimbo .45ACP 1911s"; break; case MOD_AKIMBO_LUGER: case MOD_AKIMBO_SILENCEDLUGER: message = "was killed by"; message2 = "'s Akimbo Luger 9mms"; break; case MOD_SILENCER: case MOD_LUGER: message = "was killed by"; message2 = "'s Luger 9mm"; break; case MOD_SILENCED_COLT: case MOD_COLT: message = "was killed by"; message2 = "'s .45ACP 1911"; break; case MOD_MP40: message = "was killed by"; message2 = "'s MP40"; break; case MOD_THOMPSON: message = "was killed by"; message2 = "'s Thompson"; break; case MOD_STEN: message = "was killed by"; message2 = "'s Sten"; break; case MOD_DYNAMITE: message = "was blasted by"; message2 = "'s dynamite"; break; case MOD_PANZERFAUST: message = "was blasted by"; message2 = "'s Panzerfaust"; break; case MOD_GRENADE_LAUNCHER: case MOD_GRENADE_PINEAPPLE: message = "was exploded by"; message2 = "'s grenade"; break; case MOD_FLAMETHROWER: message = "was cooked by"; message2 = "'s flamethrower"; break; case MOD_MORTAR: message = "never saw"; message2 = "'s mortar round coming"; break; case MOD_MACHINEGUN: message = "was perforated by"; message2 = "'s crew-served MG"; break; case MOD_BROWNING: message = "was perforated by"; message2 = "'s tank-mounted browning 30cal"; break; case MOD_MG42: message = "was perforated by"; message2 = "'s tank-mounted MG42"; break; case MOD_AIRSTRIKE: message = "was blasted by"; message2 = "'s support fire"; break; case MOD_ARTY: message = "was shelled by"; message2 = "'s artillery support"; break; case MOD_SWAP_PLACES: message = "^2swapped places with^7"; message2=""; break; case MOD_KAR98: // same weapon really case MOD_K43: message = "was killed by"; message2 = "'s K43"; break; case MOD_CARBINE: // same weapon really case MOD_GARAND: message = "was killed by"; message2 = "'s Garand"; break; case MOD_GPG40: case MOD_M7: message = "was killed by"; message2 = "'s rifle grenade"; break; case MOD_LANDMINE: message = "failed to spot"; message2 = "'s Landmine"; break; case MOD_CRUSH_CONSTRUCTION: message = "got caught in"; message2 = "'s construction madness"; break; case MOD_CRUSH_CONSTRUCTIONDEATH: message = "got burried under"; message2 = "'s rubble"; break; case MOD_MOBILE_MG42: message = "was mown down by"; message2 = "'s Mobile MG42"; break; case MOD_GARAND_SCOPE: message = "was silenced by"; message2 = "'s Garand"; break; case MOD_K43_SCOPE: message = "was silenced by"; message2 = "'s K43"; break; case MOD_FG42: message = "was killed by"; message2 = "'s FG42"; break; case MOD_FG42SCOPE: message = "was sniped by"; message2 = "'s FG42"; break; case MOD_SATCHEL: message = "was blasted by"; message2 = "'s Satchel Charge"; break; case MOD_TRIPMINE: // rain - dormant code message = "was detonated by"; message2 = "'s trip mine"; break; case MOD_SMOKEGRENADE: // rain message = "stood on"; message2 = "'s airstrike marker"; break; case MOD_POISON: // josh message = "was poisoned by"; message2 = "'s needle."; break; case MOD_GOOMBA: // josh message = "experienced death from above from"; message2 = ""; break; case MOD_FEAR: // tjw message = "was scared to death by"; message2 = ""; break; case MOD_THROWN_KNIFE: // matt message = "was killed by"; message2 = "'s throwing knife"; break; default: message = "was killed by"; break; } if( ci->team == ca->team ) { tk = qtrue; if ( cg_obituary.integer < 2 ) { message = "^1WAS KILLED BY TEAMMATE^7"; message2=""; } } if (message) { message = CG_TranslateString( message ); if ( message2 ) { message2 = CG_TranslateString( message2 ); finalMsg = va("%s%s %s %s%s", ((tk && cg_obituary.integer > 1)?"^1TEAMKILL: ^7":""), targetName, message, attackerName, message2); if ( (cg_obituary.integer % 2) == 1 ) { CG_AddToTeamChat(finalMsg, -1); CG_Printf("%s\n", finalMsg); } else { CG_AddPMItem( PM_DEATH, finalMsg, deathShader ); } // CG_Printf( "%s %s %s%s\n", targetName, message, attackerName, message2 ); } return; } } // we don't know what it was switch( mod ) { default: finalMsg = va("%s died.", targetName); if ( (cg_obituary.integer % 2) == 1 ) { CG_AddToTeamChat(finalMsg, -1); CG_Printf("%s\n", finalMsg); } else { CG_AddPMItem( PM_DEATH, finalMsg, deathShader ); } break; } }