In pc.c, find 'pc_setdead(sd);'
//...
if( pc_issit(sd) ) {
clif_status_load(&sd->bl,SI_SIT,0);
}
pc_setdead(sd);
//...
Add this below the line and recompile
unsigned int base_penalty =0;
if(battle_config.zeny_penalty > 0 && !map[sd->bl.m].flag.nozenypenalty)
{
base_penalty = (unsigned int)((double)sd->status.zeny * (double)battle_config.zeny_penalty / 10000.);
if(base_penalty)
pc_payzeny(sd, base_penalty);
}
Note, it's untested ;P
Another workaround, still inf pc.c:
if (src && src->type == BL_PC)
{
struct map_session_data *ssd = (struct map_session_data *)src;
pc_setparam(ssd, SP_KILLEDRID, sd->bl.id);
npc_script_event(ssd, NPCE_KILLPC);
//...
Edit it into:
if (src && src->type == BL_PC ) || (src && src->type == BL_MOB )
{
struct map_session_data *ssd = (struct map_session_data *)src;
pc_setparam(ssd, SP_KILLEDRID, sd->bl.id);
npc_script_event(ssd, NPCE_KILLPC);
If you use the second one, everytype of penalty (exp, zeny, karma) will work on 'killed by monster' too.