In g_local.h
Find:
qboolean maxlivescalced;
Add below it:
// bacon
int poisonClient;
// -bacon
In bg_public.h
Find:
// Rafael - mg42 // (SA) I don't understand these here. can someone explain?
PERS_HWEAPON_USE,
Add below:
// bacon
PERS_POISONED,
// - bacon
We use PERS_POISONED so that you can do some kind of effect client-side without needing to do much coding 
Then in g_active.c after the health regeneration code of ClientTimerActions() add this:
// bacon - here we will take away HP from the client every second
if ( ent->client->ps.persistant[PERS_POISONED] ) {
int health;
gentity_t *attacker = &g_entities[ent->client->poisonClient]; // our poisoner ;o
// everytime we run this we will take away 3 more HP
health = ( ent->client->ps.persistant[PERS_POISONED] * 3 );
if ( health > 10 )
health = 10;
// take away the health and increase our counter
G_Damage(ent, attacker, attacker, NULL, NULL, health, 0, MOD_POISON);
ent->client->ps.persistant[PERS_POISONED]++;
}
Now in g_weapon.c
After:
// Arnout: calculate ranks to update numFinalDead arrays. Have to do it manually as addscore has an early out
if( g_gametype.integer == GT_WOLF_LMS ) {
CalculateRanks();
}
}
Add:
// bacon - poison an enemy
else if ( (traceEnt->client->ps.pm_type != PM_DEAD) && (traceEnt->client->sess.sessionTeam != ent->client->sess.sessionTeam) ) {
traceEnt->client->ps.persistant[PERS_POISONED] = 1; // this is our first second
traceEnt->client->poisonClient = ent->client->ps.clientNum;
}
In g_items.c (the pickup_health() function)
After:
int max;
int quantity = 0;
Add:
// bacon - cure me!
if ( other->client->ps.persistant[PERS_POISONED] )
other->client->ps.persistant[PERS_POISONED] = 0;
In g_client.c
Find:
for( i = 0 ; i < MAX_PERSISTANT ; i++ ) {
client->ps.persistant[i] = persistant[i];
}
Below it add:
// bacon - cure me!
if ( ent->client->ps.persistant[PERS_POISONED] )
ent->client->ps.persistant[PERS_POISONED] = 0;
All done 


