## 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) g_firstAid : Whether any player (not just medics) can revive other players. bitflag : 1 - can revive medics only, don't show icon over wounded teammates 2 - can revive any class, show icon over wounded teammates default : 3 g_forceLimboHealth [0|1] # If set to 0 it takes about 3 shots (75HP) to gib a wounded player, if set to 1 it takes about 5 (150HP). # Default is 1 New : if you set it to higher than 10 (not included), you set directly the amount of HP between wounded and limbo. ------------------------- MODIFICATION STARTS HERE src\game\c_cmds.c (line 4406) **** BEFORE /* G_DragCorpse //tjw */ **** ADD /* PerformFirstAid //etpub_pcr_ah */ extern void ReviveEntity(gentity_t *ent, gentity_t *traceEnt); qboolean PerformFirstAid(gentity_t *ent, gentity_t *traceEnt) { int healamt; int limbo_health = FORCE_LIMBO_HEALTH; playerState_t *ps; ps = &ent->client->ps; //for replacing ent->client->ps.serverCursorHint with ps->serverCursorHint /*vec3_t dir, pull, res; float dist; VectorSubtract(dragger->r.currentOrigin, corpse->r.currentOrigin, dir); dir[2] = 0; dist = VectorNormalize(dir); if(dist > 48) return qfalse;*/ if(ps->serverCursorHint!=HINT_PCR_FIRSTAID && ps->serverCursorHint!=HINT_REVIVE) return qfalse; if((traceEnt->client->ps.pm_type != PM_DEAD) || (traceEnt->client->sess.sessionTeam != ent->client->sess.sessionTeam) || (traceEnt->client->ps.eFlags & EF_PLAYDEAD)) return qfalse; else { if(traceEnt->firstAidHealing < 250) { //G_Printf("traceEnt->health : %d\n", traceEnt->health); //G_Printf("traceEnt->firstAidHealing : %d\n", traceEnt->firstAidHealing); if(traceEnt->firstAidHealing == 0) { CPx(ent->s.number, "cp \"Performing first aid\" 1"); } traceEnt->firstAidHealing += 3; return qtrue; } if(g_forceLimboHealth.integer == 1) limbo_health = FORCE_LIMBO_HEALTH2; else if(g_forceLimboHealth.integer>10) limbo_health = 0 - g_forceLimboHealth.integer; healamt = 10 - (traceEnt->health - limbo_health)*80/limbo_health; ReviveEntity(ent, traceEnt); traceEnt->health=healamt; } return qtrue; } (line 4752) **** REPLACE // look for a corpse to drag trap_Trace(&tr, offset, NULL, NULL, end, ent->s.number, CONTENTS_CORPSE); if(tr.entityNum >= 0) { traceEnt = &g_entities[tr.entityNum]; if(traceEnt->client) { G_DragCorpse(ent, traceEnt); return; } } **** WITH // look for a corpse to drag or perform first aid trap_Trace(&tr, offset, NULL, NULL, end, ent->s.number, CONTENTS_CORPSE); if(tr.entityNum >= 0) { traceEnt = &g_entities[tr.entityNum]; if(traceEnt->client) { if(!PerformFirstAid(ent, traceEnt)) G_DragCorpse(ent, traceEnt); return; } } src\game\g_local.h (line 275) **** IN struct gentity_s { entityState_t s; // communicated by server to clients **** AFTER // forty - dynamite chaining gentity_t *onobjective; **** ADD // etpub_pcr_ah - first aid int firstAidHealing; src\game\g_client.c (line 2924) **** BEFORE // TTimo keep it isolated from spectator to be safe still if( client->sess.sessionTeam != TEAM_SPECTATOR ) { // Xian - Moved the invul. stuff out of SetWolfSpawnWeapons and put it here for clarity if ( g_fastres.integer == 1 && revived ){} **** ADD // etpub_pcr_ah : first aid must be set to 0 ent->firstAidHealing=0; src\cgame\cg_newDraw.c (line 478) **** AFTER case HINT_REVIVE: icon = cgs.media.reviveHintShader; break; **** ADD case HINT_PCR_FIRSTAID: icon = cgs.media.PCRfirstAidHintShader; break; src\game\bg_public.h (line 1776) **** AFTER HINT_DISARM, // DHM - Nerve HINT_REVIVE, // DHM - Nerve **** ADD HINT_PCR_FIRSTAID, // etpub_pcr_ah src\game\g_mover.c (line 52) **** AFTER "HINT_DISARM", // DHM - Nerve "HINT_REVIVE", // DHM - Nerve **** ADD "HINT_PCR_FIRSTAID", // etpub_pcr_ah src\cgame\cg_local.h (line 1499) **** AFTER qhandle_t reviveHintShader; **** ADD qhandle_t PCRfirstAidHintShader; (line 1420) **** AFER qhandle_t medicReviveShader; **** ADD qhandle_t PCRfirstAidReviveShader; src\cgame\cg_main.c (line 1660) **** AFTER cgs.media.reviveHintShader = trap_R_RegisterShader( "gfx/2d/reviveHint" ); // DHM - Nerve **** ADD cgs.media.PCRfirstAidHintShader = trap_R_RegisterShader( "gfx/2d/pcrfirstaidhint" ); // etpub_pcr_ah - first aid (line 1768) **** AFTER cgs.media.medicReviveShader = trap_R_RegisterShader( "sprites/medic_revive" ); **** ADD cgs.media.PCRfirstAidReviveShader = trap_R_RegisterShader( "sprites/pcr_firstaid" ); src\game\g_main.c (line 1444) **** AFER hintDist = CH_REVIVE_DIST; hintType = HINT_REVIVE; } **** ADD else if (g_firstAid.integer !=0 && traceEnt->client->ps.pm_type == PM_DEAD && !(traceEnt->client->ps.pm_flags & PMF_LIMBO) && !(traceEnt->client->ps.eFlags & EF_PLAYDEAD) && (traceEnt->client->ps.stats[STAT_PLAYER_CLASS] == PC_MEDIC || (g_firstAid.integer & 2))) { hintDist = 48; hintType = HINT_PCR_FIRSTAID; hintVal = traceEnt->firstAidHealing; if( hintVal > 255 ) hintVal=255; } src\game\g_combat.c (line 1621) **** AFTER limbo_health = FORCE_LIMBO_HEALTH; if(g_forceLimboHealth.integer == 1) limbo_health = FORCE_LIMBO_HEALTH2; **** ADD else if(g_forceLimboHealth.integer>10) limbo_health = 0 - g_forceLimboHealth.integer; src\game\g_match.c (line 332) **** AFTER // tjw: you can't do more damage than the victim has to give if(g_forceLimboHealth.integer == 1) limbo_health = FORCE_LIMBO_HEALTH2; **** ADD else if(g_forceLimboHealth.integer>10) limbo_health = 0 - g_forceLimboHealth.integer; src\cgame\cg_players.c (line 1397) **** AFTER // DHM - Nerve :: If this client is a medic, draw a 'revive' icon over // dead players that are not in limbo yet. if( (cent->currentState.eFlags & EF_DEAD) && cent->currentState.number == cent->currentState.clientNum // kw: fixed revive icons showing when following non-medics as spectator && cgs.clientinfo[cg.snap->ps.clientNum].cls == PC_MEDIC && cg.snap->ps.stats[ STAT_HEALTH ] > 0 && cg.snap->ps.persistant[PERS_TEAM] == team ) { CG_PlayerFloatSprite( cent, cgs.media.medicReviveShader, 8 ); return; } **** ADD else if ((g_firstAid.integer & 2) && (cent->currentState.eFlags & EF_DEAD) && cent->currentState.number == cent->currentState.clientNum //&& (cg.snap->ps.stats[ STAT_PLAYER_CLASS ] == PC_MEDIC || (g_firstAid.integer & 2)) && cg.snap->ps.stats[ STAT_HEALTH ] > 0 && cg.snap->ps.persistant[PERS_TEAM] == team ) { CG_PlayerFloatSprite( cent, cgs.media.medicReviveShader, 8 ); return; } src\game\g_local.h : (line 2154) **** AFTER extern vmCvar_t g_spawnInvul; **** ADD extern vmCvar_t g_firstAid; src\game\g_main.c : (line 257) **** AFTER vmCvar_t g_spawnInvul; **** ADD vmCvar_t g_firstAid; (line 755) **** AFTER { &g_spawnInvul, "g_spawnInvul", "3", 0 }, **** ADD { &g_firstAid, "g_firstAid", "3", CVAR_SYSTEMINFO }, src\cgame\cg_local.h (line 2513) **** AFTER extern vmCvar_t g_medicMaxAmmo; **** ADD extern vmCvar_t g_firstAid; src\cgame\cg_main.c (line 336) **** AFTER vmCvar_t g_medicMaxAmmo; **** ADD vmCvar_t g_firstAid; (line 628) **** AFTER { &g_medicMaxAmmo, "g_medicMaxAmmo", "3", 0 }, **** ADD { &g_firstAid, "g_firstAid", "0", CVAR_SYSTEMINFO | CVAR_ROM }, ------------------------- PERSONAL NOTES rem : pour faire comme NQ (le patient se dégrade) il suffit d'ajouter la dégradation au même endroit que l'ammo regen // kw: spectators have crosshairnames too if( cg_entities[cg.crosshairClientNum].currentState.eType == ET_MOVER && cg_entities[cg.crosshairClientNum].currentState.effect1Time ) { isTank = qtrue; ****** g_classChange ****** // class stealing if(!g_classChange.integer) break; ****** /* G_DragCorpse //tjw */ ****** /* G_ClassSteal //tjw */ ****** qboolean ReviveEntity(gentity_t *ent, gentity_t *traceEnt) ****** // START - Mad Doc - TDF // took this out of Weapon_Syringe so we can use it from other places qboolean ReviveEntity(gentity_t *ent, gentity_t *traceEnt) { ****** if((traceEnt->client->ps.pm_type == PM_DEAD) && (traceEnt->client->sess.sessionTeam == ent->client->sess.sessionTeam) && !(traceEnt->client->ps.eFlags & EF_PLAYDEAD)) { // Mad Doc - TDF moved all the revive stuff into its own function usedSyringe = ReviveEntity( ent, traceEnt ); ****** hintDist = 48; hintType = HINT_UNIFORM; hintVal = BODY_VALUE(traceEnt); if( hintVal > 255 ) { hintVal = 255; ****** if ( traceEnt->client && traceEnt->client->sess.sessionTeam == ent->client->sess.sessionTeam) { if(ps->stats[ STAT_PLAYER_CLASS ] == PC_MEDIC && traceEnt->client->ps.pm_type == PM_DEAD && !(traceEnt->client->ps.pm_flags & PMF_LIMBO) && !(traceEnt->client->ps.eFlags & EF_PLAYDEAD)) { hintDist = CH_REVIVE_DIST; hintType = HINT_REVIVE; } ****** cgs.media.reviveHintShader = trap_R_RegisterShader( "gfx/2d/reviveHint" ); // DHM - Nerve ****** if(ent->client->pers.etpubc >= 20051230) { ****** #define ETPUBC_VERSION "20061219" ****** playerState_t *ps; ps = &ent->client->ps; ****** cgs.media.medicReviveShader = trap_R_RegisterShader( "sprites/medic_revive" ); ****** // Gordon: ps->teamNum is really class.... thx whoever decided on that... if( ps->teamNum == PC_MEDIC ) { ****** suivre team_maxPanzers ou skill_medic par exemple void CG_ParseEtpubinfo( void ) { #define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc // used for system variables, not for player // specific configurations #define CVAR_USERINFO 2 // sent to server on connect or change #define CVAR_SERVERINFO 4 // sent in response to front end requests #define CVAR_SYSTEMINFO 8 // these cvars will be duplicated on all clients #define CVAR_INIT 16 // don't allow change from console at all, // but can be set from the command line #define CVAR_LATCH 32 // will only change when C code next does // a Cvar_Get(), so it can't be changed // without proper initialization. modified // will be set, even though the value hasn't // changed yet #define CVAR_ROM 64 // display only, cannot be set by user at all #define CVAR_USER_CREATED 128 // created by a set command #define CVAR_TEMP 256 // can be set even when cheats are disabled, but is not archived #define CVAR_CHEAT 512 // can not be changed if cheats are disabled #define CVAR_NORESTART 1024 // do not clear when a cvar_restart is issued #define CVAR_WOLFINFO 2048 // DHM - NERVE :: Like userinfo, but for wolf multiplayer info #define CVAR_UNSAFE 4096 // ydnar: unsafe system cvars (renderer, sound settings, anything that might cause a crash) #define CVAR_SERVERINFO_NOUPDATE 8192 // gordon: WONT automatically send this to clients, but server browsers will see it