text:
//
// g_combat.c

#include "g_local.h"
#include "challenges.h"

int modToWeapon[] = {
    -1,
    WP_SHOTGUN,
    WP_GAUNTLET,
    WP_MACHINEGUN,
    WP_GRENADE_LAUNCHER,
    WP_GRENADE_LAUNCHER,
    WP_ROCKET_LAUNCHER,
    WP_ROCKET_LAUNCHER,
    WP_PLASMAGUN,
    WP_PLASMAGUN,
    WP_RAILGUN,
    WP_LIGHTNING,
    WP_BFG,
    WP_BFG,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    WP_NAILGUN,
    WP_CHAINGUN,
    WP_PROX_LAUNCHER,
    -1,
    -1,
    WP_GRAPPLING_HOOK
};

/*
============
ScorePlum
============
*/
void ScorePlum(gentity_t* ent, vec3_t origin, int score) {
    gentity_t* plum;
    plum = G_TempEntity(origin, EV_SCOREPLUM);
    // only send this temp entity to a single client
    plum->r.svFlags |= SVF_SINGLECLIENT;
    plum->r.singleClient = ent->s.number;
    //
    plum->s.otherEntityNum = ent->s.number;
    plum->s.time = score;
}

/*
============
AddScore

Adds score to both the client and his team
============
*/
void AddScore(gentity_t* ent, vec3_t origin, int score) {
    int i;
    if (!ent->client) {
        return;
    }
    // no scoring during pre-match warmup
    if ((level.warmupTime) || !isMatchTime()) {
        return;
    }
    //No scoring during intermission
    if (level.intermissiontime) {
        return;
    }
    // show score plum
    if (level.numNonSpectatorClients < 3 && score < 0 && (g_gametype.integer < GT_TEAM || g_ffa_gt == 1)) {
        for (i = 0; i < level.maxclients; i++) {
            if (level.clients[ i ].pers.connected != CON_CONNECTED) {
                continue; //Client was not connected
            }
            if (level.clients[i].sess.sessionTeam == TEAM_SPECTATOR) {
                continue; //Don't give anything to spectators
            }
            if (g_entities + i == ent) {
                continue; //Don't award dead one
            }
            level.clients[i].ps.persistant[PERS_SCORE] -= score;
            ScorePlum(ent, origin, -score);
        }
    } else {
        ScorePlum(ent, origin, score);
        //
        ent->client->ps.persistant[PERS_SCORE] += score;
        if (g_gametype.integer == GT_TEAM) {
            int team = ent->client->ps.persistant[PERS_TEAM];
            level.teamScores[ team ] += score;
            G_LogPrintf("TeamScore: %i %i: Team %d now has %d points\n",
                        team, level.teamScores[ team ], team, level.teamScores[ team ]);
        }
    }
    G_LogPrintf("PlayerScore: %i %i: %s now has %d points\n",
                ent->s.number, ent->client->ps.persistant[PERS_SCORE], ent->client->pers.netname, ent->client->ps.persistant[PERS_SCORE]);
    CalculateRanks();
}

/*
=================
TossClientItems

Toss the weapon and powerups for the killed player
=================
*/
void TossClientItems(gentity_t* self) {
    gitem_t* item;
    int weapon;
    float angle;
    int i;
    gentity_t* drop;
    // drop the weapon if not a gauntlet or machinegun
    weapon = self->s.weapon;
    //Never drop in elimination or last man standing mode!
    if (g_gametype.integer == GT_ELIMINATION || g_gametype.integer == GT_LMS) {
        return;
    }
    // make a special check to see if they are changing to a new
    // weapon that isn't the mg or gauntlet. Without this, a client
    // can pick up a weapon, be killed, and not drop the weapon because
    // their weapon change hasn't completed yet and they are still holding the MG.
    if (weapon == WP_MACHINEGUN || weapon == WP_GRAPPLING_HOOK) {
        if (self->client->ps.weaponstate == WEAPON_DROPPING) {
            weapon = self->client->pers.cmd.weapon;
        }
        if (!(self->client->ps.stats[STAT_WEAPONS] & (1 << weapon))) {
            weapon = WP_NONE;
        }
    }
    if (g_instantgib.integer || g_rockets.integer || g_gametype.integer == GT_CTF_ELIMINATION || g_elimination_allgametypes.integer) {
        //Nothing!
    } else if (weapon > WP_MACHINEGUN && weapon != WP_GRAPPLING_HOOK &&
               self->client->ps.ammo[ weapon ]) {
        // find the item type for this weapon
        item = BG_FindItemForWeapon(weapon);
        // spawn the item
        Drop_Item(self, item, 0);
    }
    // drop all the powerups if not in teamplay
    if (g_gametype.integer != GT_TEAM) {
        angle = 45;
        for (i = 1; i < PW_NUM_POWERUPS; i++) {
            if (self->client->ps.powerups[ i ] > level.time) {
                item = BG_FindItemForPowerup(i);
                if (!item) {
                    continue;
                }
                drop = Drop_Item(self, item, angle);
                // decide how many seconds it has left
                drop->count = (self->client->ps.powerups[ i ] - level.time) / 1000;
                if (drop->count < 1) {
                    drop->count = 1;
                }
                angle += 45;
            }
        }
    }
}

/*
=================
TossClientCubes
=================
*/
extern gentity_t* neutralObelisk;

void TossClientCubes(gentity_t* self) {
    gitem_t* item;
    gentity_t* drop;
    vec3_t velocity;
    vec3_t angles;
    vec3_t origin;
    self->client->ps.generic1 = 0;
    // this should never happen but we should never
    // get the server to crash due to skull being spawned in
    if (!G_EntitiesFree()) {
        return;
    }
    if (self->client->sess.sessionTeam == TEAM_RED) {
        item = BG_FindItem("Red Cube");
    } else {
        item = BG_FindItem("Blue Cube");
    }
    angles[YAW] = (float)(level.time % 360);
    angles[PITCH] = 0; // always forward
    angles[ROLL] = 0;
    AngleVectors(angles, velocity, NULL, NULL);
    VectorScale(velocity, 150, velocity);
    velocity[2] += 200 + crandom() * 50;
    if (neutralObelisk) {
        VectorCopy(neutralObelisk->s.pos.trBase, origin);
        origin[2] += 44;
    } else {
        VectorClear(origin);
    }
    drop = LaunchItem(item, origin, velocity);
    drop->nextthink = level.time + g_cubeTimeout.integer * 1000;
    drop->think = G_FreeEntity;
    drop->spawnflags = self->client->sess.sessionTeam;
}

/*
=================
TossClientPersistantPowerups
=================
*/
void TossClientPersistantPowerups(gentity_t* ent) {
    gentity_t* powerup;
    if (!ent->client) {
        return;
    }
    if (!ent->client->persistantPowerup) {
        return;
    }
    powerup = ent->client->persistantPowerup;
    powerup->r.svFlags &= ~SVF_NOCLIENT;
    powerup->s.eFlags &= ~EF_NODRAW;
    powerup->r.contents = CONTENTS_TRIGGER;
    trap_LinkEntity(powerup);
    ent->client->ps.stats[STAT_PERSISTANT_POWERUP] = 0;
    ent->client->persistantPowerup = NULL;
}

/*
==================
LookAtKiller
==================
*/
void LookAtKiller(gentity_t* self, gentity_t* inflictor, gentity_t* attacker) {
    vec3_t dir;
    //vec3_t angles;
    if (attacker && attacker != self) {
        VectorSubtract(attacker->s.pos.trBase, self->s.pos.trBase, dir);
    } else if (inflictor && inflictor != self) {
        VectorSubtract(inflictor->s.pos.trBase, self->s.pos.trBase, dir);
    } else {
        self->client->ps.stats[STAT_DEAD_YAW] = self->s.angles[YAW];
        return;
    }
    self->client->ps.stats[STAT_DEAD_YAW] = vectoyaw(dir);
    /*angles[YAW] =*/ vectoyaw(dir);
    //angles[PITCH] = 0;
    //angles[ROLL] = 0;
}

/*
==================
GibEntity
==================
*/
void GibEntity(gentity_t* self, int killer) {
    gentity_t* ent;
    int i;
    //if this entity still has kamikaze
    if (self->s.eFlags & EF_KAMIKAZE) {
        // check if there is a kamikaze timer around for this owner
        for (i = 0; i < MAX_GENTITIES; i++) {
            ent = &g_entities[i];
            if (!ent->inuse) {
                continue;
            }
            if (ent->activator != self) {
                continue;
            }
            if (!strequals(ent->classname, "kamikaze timer")) {
                continue;
            }
            G_FreeEntity(ent);
            break;
        }
    }
    G_AddEvent(self, EV_GIB_PLAYER, killer);
    self->takedamage = qfalse;
    self->s.eType = ET_INVISIBLE;
    self->r.contents = 0;
}

/*
==================
body_die
==================
*/
void body_die(gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int damage, int meansOfDeath) {
    if (self->health > GIB_HEALTH) {
        return;
    }
    if (!g_blood.integer) {
        self->health = GIB_HEALTH + 1;
        return;
    }
    GibEntity(self, 0);
}

// these are just for logging, the client prints its own messages
static const char* modNames[] = {
    "MOD_UNKNOWN",
    "MOD_SHOTGUN",
    "MOD_GAUNTLET",
    "MOD_MACHINEGUN",
    "MOD_GRENADE",
    "MOD_GRENADE_SPLASH",
    "MOD_ROCKET",
    "MOD_ROCKET_SPLASH",
    "MOD_PLASMA",
    "MOD_PLASMA_SPLASH",
    "MOD_RAILGUN",
    "MOD_LIGHTNING",
    "MOD_BFG",
    "MOD_BFG_SPLASH",
    "MOD_WATER",
    "MOD_SLIME",
    "MOD_LAVA",
    "MOD_CRUSH",
    "MOD_TELEFRAG",
    "MOD_FALLING",
    "MOD_SUICIDE",
    "MOD_TARGET_LASER",
    "MOD_TRIGGER_HURT",
    "MOD_NAIL",
    "MOD_CHAINGUN",
    "MOD_PROXIMITY_MINE",
    "MOD_KAMIKAZE",
    "MOD_JUICED",
    "MOD_GRAPPLE"
};

/*
==================
Kamikaze_DeathActivate
==================
*/
void Kamikaze_DeathActivate(gentity_t* ent) {
    G_StartKamikaze(ent);
    G_FreeEntity(ent);
}

/*
==================
Kamikaze_DeathTimer
==================
*/
void Kamikaze_DeathTimer(gentity_t* self) {
    gentity_t* ent;
    ent = G_Spawn();
    ent->classname = "kamikaze timer";
    VectorCopy(self->s.pos.trBase, ent->s.pos.trBase);
    ent->r.svFlags |= SVF_NOCLIENT;
    ent->think = Kamikaze_DeathActivate;
    ent->nextthink = level.time + 5 * 1000;
    ent->activator = self;
}

/*
==================
CheckAlmostCapture
==================
*/
void CheckAlmostCapture(gentity_t* self, gentity_t* attacker) {
    gentity_t* ent;
    vec3_t dir;
    char* classname;
    // if this player was carrying a flag
    if (self->client->ps.powerups[PW_REDFLAG] ||
            self->client->ps.powerups[PW_BLUEFLAG] ||
            self->client->ps.powerups[PW_NEUTRALFLAG]) {
        // get the goal flag this player should have been going for
        if (g_gametype.integer == GT_CTF || g_gametype.integer == GT_CTF_ELIMINATION) {
            if (self->client->sess.sessionTeam == TEAM_BLUE) {
                classname = "team_CTF_blueflag";
            } else {
                classname = "team_CTF_redflag";
            }
        } else {
            if (self->client->sess.sessionTeam == TEAM_BLUE) {
                classname = "team_CTF_redflag";
            } else {
                classname = "team_CTF_blueflag";
            }
        }
        ent = NULL;
        do {
            ent = G_Find(ent, FOFS(classname), classname);
        } while (ent && (ent->flags & FL_DROPPED_ITEM));
        // if we found the destination flag and it's not picked up
        if (ent && !(ent->r.svFlags & SVF_NOCLIENT)) {
            // if the player was *very* close
            VectorSubtract(self->client->ps.origin, ent->s.origin, dir);
            if (VectorLength(dir) < 200) {
                self->client->ps.persistant[PERS_PLAYEREVENTS] ^= PLAYEREVENT_HOLYSHIT;
                if (attacker->client) {
                    attacker->client->ps.persistant[PERS_PLAYEREVENTS] ^= PLAYEREVENT_HOLYSHIT;
                }
            }
        }
    }
}

/*
==================
CheckAlmostScored
==================
*/
void CheckAlmostScored(gentity_t* self, gentity_t* attacker) {
    gentity_t* ent;
    vec3_t dir;
    char* classname;
    // if the player was carrying cubes
    if (self->client->ps.generic1) {
        if (self->client->sess.sessionTeam == TEAM_BLUE) {
            classname = "team_redobelisk";
        } else {
            classname = "team_blueobelisk";
        }
        ent = G_Find(NULL, FOFS(classname), classname);
        // if we found the destination obelisk
        if (ent) {
            // if the player was *very* close
            VectorSubtract(self->client->ps.origin, ent->s.origin, dir);
            if (VectorLength(dir) < 200) {
                self->client->ps.persistant[PERS_PLAYEREVENTS] ^= PLAYEREVENT_HOLYSHIT;
                if (attacker->client) {
                    attacker->client->ps.persistant[PERS_PLAYEREVENTS] ^= PLAYEREVENT_HOLYSHIT;
                }
            }
        }
    }
}

/*
==================
player_die
==================
*/
void player_die(gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int damage, int meansOfDeath) {
    gentity_t* ent;
    int anim;
    int contents;
    int killer;
    int i, counter2;
    const char* killerName;
    const char* obit;
    if (!(self->client) || (self->client->ps.pm_type == PM_DEAD)) {
        return;
    }
    if (level.intermissiontime) {
        return;
    }
    if (self->client->ps.powerups[PW_REDFLAG] || self->client->ps.powerups[PW_BLUEFLAG]) {
        G_SetFlagsStatus(OtherTeam(self->client->sess.sessionTeam), 1, 1);
        Team_DropFlagSound(self);
    }
    // Global stats.
    self->client->pers.deaths += 1;
    if (attacker->client) {
        attacker->client->pers.kills += 1;
    }
    //unlagged - backward reconciliation #2
    // make sure the body shows up in the client's current position
    G_UnTimeShiftClient(self);
    //unlagged - backward reconciliation #2
    //KK-OAX Here is where we run the streak logic.
    G_RunStreakLogic(attacker, self);
    // check for an almost capture
    CheckAlmostCapture(self, attacker);
    // check for a player that almost brought in cubes
    CheckAlmostScored(self, attacker);
    if (!self->client) {
        return;
    }
    if (self->client->hook) {
        Weapon_HookFree(self->client->hook);
    }
    if ((self->client->ps.eFlags & EF_TICKING) && self->activator) {
        self->client->ps.eFlags &= ~EF_TICKING;
        self->activator->think = G_FreeEntity;
        self->activator->nextthink = level.time;
    }
    self->client->ps.pm_type = PM_DEAD;
    if (attacker) {
        killer = attacker->s.number;
        if (attacker->client) {
            killerName = attacker->client->pers.netname;
        } else {
            killerName = "<non-client>";
        }
    } else {
        killer = ENTITYNUM_WORLD;
        killerName = "<world>";
    }
    if (killer < 0 || killer >= MAX_CLIENTS) {
        killer = ENTITYNUM_WORLD;
        killerName = "<world>";
    }
    if (meansOfDeath < 0 || meansOfDeath >= sizeof(modNames) / sizeof(modNames[0])) {
        obit = "<bad obituary>";
    } else {
        obit = modNames[meansOfDeath];
    }
    G_LogPrintf("Kill: %i %i %i: %s killed %s by %s\n",
                killer, self->s.number, meansOfDeath, killerName,
                self->client->pers.netname, obit);
    // broadcast the death event to everyone
    ent = G_TempEntity(self->r.currentOrigin, EV_OBITUARY);
    ent->s.eventParm = meansOfDeath;
    ent->s.otherEntityNum = self->s.number;
    ent->s.otherEntityNum2 = killer;
    //Sago: Hmmm... generic? Can I transmit anything I like? Like if it is a team kill? Let's try
    ent->s.generic1 = OnSameTeam(self, attacker);
    if (!((g_gametype.integer == GT_ELIMINATION || g_gametype.integer == GT_CTF_ELIMINATION) && level.time < level.roundStartTime)) {
        ent->r.svFlags = SVF_BROADCAST; // send to everyone (if not an elimination gametype during active warmup)
    } else {
        ent->r.svFlags = SVF_NOCLIENT;
    }
    self->enemy = attacker;
    self->client->ps.persistant[PERS_KILLED]++;
    if (attacker && attacker->client) {
        attacker->client->lastkilled_client = self->s.number;
        if (attacker == self || OnSameTeam(self, attacker)) {
            if (g_gametype.integer != GT_LMS && g_gametype.integer != GT_POSSESSION && !((g_gametype.integer == GT_ELIMINATION || g_gametype.integer == GT_CTF_ELIMINATION) && level.time < level.roundStartTime)) {
                if ((g_gametype.integer < GT_TEAM && g_ffa_gt != 1 && self->client->ps.persistant[PERS_SCORE] > 0) || level.numNonSpectatorClients < 3) {
                    //Cannot get negative scores by suicide
                    AddScore(attacker, self->r.currentOrigin, -1);
                }
            }
        } else {
            if (g_gametype.integer != GT_LMS && g_gametype.integer != GT_POSSESSION) {
                AddScore(attacker, self->r.currentOrigin, 1);
            }
            if (meansOfDeath == MOD_GAUNTLET) {
                // Attack gets a challenge complete:
                if (!(attacker->r.svFlags & SVF_BOT) && !(self->r.svFlags & SVF_BOT)) {
                    ChallengeMessage(attacker, WEAPON_GAUNTLET_KILLS);
                }
                // play humiliation on player
                attacker->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT]++;
                G_LogPrintf("Award: %i %i: %s gained the %s award!\n", attacker->client->ps.clientNum, 0, attacker->client->pers.netname, "GAUNTLET");
                // add the sprite over the player's head
                attacker->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP);
                attacker->client->ps.eFlags |= EF_AWARD_GAUNTLET;
                attacker->client->rewardTime = level.time + REWARD_SPRITE_TIME;
                // also play humiliation on target
                self->client->ps.persistant[PERS_PLAYEREVENTS] ^= PLAYEREVENT_GAUNTLETREWARD;
            }
            //If neither attacker or taget is bots and not the same
            if (!(attacker->r.svFlags & SVF_BOT) && !(self->r.svFlags & SVF_BOT) && self != attacker) {
                switch (meansOfDeath) {
                case MOD_GAUNTLET:
                    ChallengeMessage(attacker, WEAPON_GAUNTLET_KILLS);
                    break;
                case MOD_MACHINEGUN:
                    ChallengeMessage(attacker, WEAPON_MACHINEGUN_KILLS);
                    break;
                case MOD_SHOTGUN:
                    ChallengeMessage(attacker, WEAPON_SHOTGUN_KILLS);
                    break;
                case MOD_GRENADE:
                case MOD_GRENADE_SPLASH:
                    ChallengeMessage(attacker, WEAPON_GRANADE_KILLS);
                    break;
                case MOD_ROCKET:
                case MOD_ROCKET_SPLASH:
                    ChallengeMessage(attacker, WEAPON_ROCKET_KILLS);
                    break;
                case MOD_LIGHTNING:
                    ChallengeMessage(attacker, WEAPON_LIGHTNING_KILLS);
                    break;
                case MOD_PLASMA:
                case MOD_PLASMA_SPLASH:
                    ChallengeMessage(attacker, WEAPON_PLASMA_KILLS);
                    break;
                case MOD_RAILGUN:
                    if (g_instantgib.integer) {
                        ChallengeMessage(attacker, WEAPON_INSTANT_RAIL_KILLS);
                    } else {
                        ChallengeMessage(attacker, WEAPON_RAIL_KILLS);
                    }
                    break;
                case MOD_BFG:
                case MOD_BFG_SPLASH:
                    ChallengeMessage(attacker, WEAPON_BFG_KILLS);
                    break;
                case MOD_NAIL:
                    ChallengeMessage(attacker, WEAPON_NAILGUN_KILLS);
                    break;
                case MOD_CHAINGUN:
                    ChallengeMessage(attacker, WEAPON_CHAINGUN_KILLS);
                    break;
                case MOD_PROXIMITY_MINE:
                    ChallengeMessage(attacker, WEAPON_MINE_KILLS);
                    break;
                case MOD_GRAPPLE:
                    ChallengeMessage(attacker, WEAPON_GRAPPLE_KILLS);
                    break;
                case MOD_LAVA:
                case MOD_SLIME:
                case MOD_TRIGGER_HURT:
                case MOD_FALLING:
                    ChallengeMessage(attacker, WEAPON_PUSH_KILLS);
                    break;
                case MOD_CRUSH:
                    ChallengeMessage(attacker, WEAPON_CRUSH_KILLS);
                    break;
                case MOD_TELEFRAG:
                    ChallengeMessage(attacker, WEAPON_TELEFRAG_KILLS);
                    break;
                };
                ChallengeMessage(attacker, GENERAL_TOTALKILLS);
                ChallengeMessage(self, GENERAL_TOTALDEATHS);
                //Lets count number of powerups:
                i = 0;
                counter2 = 0;
                if (attacker->client->ps.powerups[PW_QUAD]) {
                    ChallengeMessage(attacker, POWERUP_QUAD_KILL);
                    counter2++;
                }
                if (self->client->ps.powerups[PW_QUAD]) {
                    ChallengeMessage(attacker, POWERUP_COUNTER_QUAD);
                    i++;
                }
                if (attacker->client->ps.powerups[PW_HASTE]) {
                    ChallengeMessage(attacker, POWERUP_SPEED_KILL);
                    counter2++;
                }
                if (self->client->ps.powerups[PW_HASTE]) {
                    ChallengeMessage(attacker, POWERUP_COUNTER_SPEED);
                    i++;
                }
                if (attacker->client->ps.powerups[PW_INVIS]) {
                    ChallengeMessage(attacker, POWERUP_INVIS_KILL);
                    counter2++;
                }
                if (self->client->ps.powerups[PW_INVIS]) {
                    ChallengeMessage(attacker, POWERUP_COUNTER_INVIS);
                    i++;
                }
                if (attacker->client->ps.powerups[PW_FLIGHT]) {
                    ChallengeMessage(attacker, POWERUP_FLIGHT_KILL);
                    counter2++;
                }
                if (self->client->ps.powerups[PW_FLIGHT]) {
                    ChallengeMessage(attacker, POWERUP_COUNTER_FLIGHT);
                    i++;
                }
                if (self->client->ps.powerups[PW_BATTLESUIT]) {
                    ChallengeMessage(attacker, POWERUP_COUNTER_ENVIR);
                    i++;
                }
                if (self->client->ps.powerups[PW_REGEN]) {
                    ChallengeMessage(attacker, POWERUP_COUNTER_REGEN);
                    i++;
                }
                if (i > 1) { //The target had more than one powerup
                    ChallengeMessage(attacker, POWERUP_COUNTER_MULTI);
                }
                if (counter2 > 1) { //The attacker has more than one powerup
                    ChallengeMessage(attacker, POWERUP_MULTI_KILL);
                }
            }
            // check for two kills in a short amount of time
            // if this is close enough to the last kill, give a reward sound
            if (level.time - attacker->client->lastKillTime < CARNAGE_REWARD_TIME) {
                // KK-OAX
                // Check if Multikills are enabled
                if (g_altExcellent.integer) {
                    attacker->client->pers.multiKillCount++;
                    G_checkForMultiKill(attacker);
                } // play excellent on player
                attacker->client->ps.persistant[PERS_EXCELLENT_COUNT]++;
                G_LogPrintf("Award: %i %i: %s gained the %s award!\n", attacker->client->ps.clientNum, 1, attacker->client->pers.netname, "EXCELLENT");
                if (!level.hadBots) { //There has not been any bots
                    ChallengeMessage(attacker, AWARD_EXCELLENT);
                }
                // add the sprite over the player's head
                attacker->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP);
                attacker->client->ps.eFlags |= EF_AWARD_EXCELLENT;
                attacker->client->rewardTime = level.time + REWARD_SPRITE_TIME;
            } else {
                //KK-OAX Clear multikill count
                //Must be 1 so the correct number of kills are displayed to the clients.
                attacker->client->pers.multiKillCount = 1;
            }
            attacker->client->lastKillTime = level.time;
        }
    } else {
        if (g_gametype.integer != GT_LMS && g_gametype.integer != GT_POSSESSION &&
                !((g_gametype.integer == GT_ELIMINATION || g_gametype.integer == GT_CTF_ELIMINATION) && level.time < level.roundStartTime)) {
            if (self->client->ps.persistant[PERS_SCORE] > 0 || level.numNonSpectatorClients < 3) {
                //Cannot get negative scores by suicide
                AddScore(self, self->r.currentOrigin, -1);
            }
        }
    }
    // Add team bonuses
    Team_FragBonuses(self, inflictor, attacker);
    TossClientPersistantPowerups(self);
    if (g_gametype.integer == GT_HARVESTER) {
        TossClientCubes(self);
    }
    // if client is in a nodrop area, don't drop anything (but return CTF flags!)
    TossClientItems(self);
    //#endif
    Cmd_Score_f(self); // show scores
    // send updated scores to any clients that are following this one,
    // or they would get stale scoreboards
    for (i = 0; i < level.maxclients; i++) {
        gclient_t* client;
        client = &level.clients[i];
        if (client->pers.connected != CON_CONNECTED) {
            continue;
        }
        if (client->sess.sessionTeam != TEAM_SPECTATOR) {
            continue;
        }
        if (client->sess.spectatorClient == self->s.number) {
            Cmd_Score_f(g_entities + i);
        }
    }
    self->takedamage = qtrue; // can still be gibbed
    self->s.weapon = WP_NONE;
    self->s.powerups = 0;
    self->r.contents = CONTENTS_CORPSE;
    self->s.angles[0] = 0;
    self->s.angles[2] = 0;
    LookAtKiller(self, inflictor, attacker);
    VectorCopy(self->s.angles, self->client->ps.viewangles);
    self->s.loopSound = 0;
    self->r.maxs[2] = -8;
    // don't allow respawn until the death anim is done
    // g_forcerespawn may force spawning at some later time
    self->client->respawnTime = level.time + 1700 + i;
    if (g_respawntime.integer > 0) {
        for (i = 0; self->client->respawnTime > i * g_respawntime.integer * 1000; i++);
        self->client->respawnTime = i * g_respawntime.integer * 1000;
    }
    //However during warm up, we should respawn quicker!
    if (g_gametype.integer == GT_ELIMINATION || g_gametype.integer == GT_CTF_ELIMINATION || g_gametype.integer == GT_LMS) {
        if (level.time <= level.roundStartTime && level.time > level.roundStartTime - 1000 * g_elimination_activewarmup.integer) {
            self->client->respawnTime = level.time + rand() % 800;
        }
    }
    RespawnTimeMessage(self, self->client->respawnTime);
    // remove powerups
    memset(self->client->ps.powerups, 0, sizeof(self->client->ps.powerups));
    // never gib in a nodrop
    contents = trap_PointContents(self->r.currentOrigin, -1);
    if ((self->health <= GIB_HEALTH && !(contents & CONTENTS_NODROP) && g_blood.integer) || meansOfDeath == MOD_SUICIDE) {
        // gib death
        GibEntity(self, killer);
    } else {
        // normal death
        static int i;
        switch (i) {
        case 0:
            anim = BOTH_DEATH1;
            break;
        case 1:
            anim = BOTH_DEATH2;
            break;
        case 2:
        default:
            anim = BOTH_DEATH3;
            break;
        }
        // for the no-blood option, we need to prevent the health
        // from going to gib level
        if (self->health <= GIB_HEALTH) {
            self->health = GIB_HEALTH + 1;
        }
        self->client->ps.legsAnim =
            ((self->client->ps.legsAnim & ANIM_TOGGLEBIT) ^ ANIM_TOGGLEBIT) | anim;
        self->client->ps.torsoAnim =
            ((self->client->ps.torsoAnim & ANIM_TOGGLEBIT) ^ ANIM_TOGGLEBIT) | anim;
        G_AddEvent(self, EV_DEATH1 + i, killer);
        // the body can still be gibbed
        self->die = body_die;
        // globally cycle through the different death animations
        i = (i + 1) % 3;
        if (self->s.eFlags & EF_KAMIKAZE) {
            Kamikaze_DeathTimer(self);
        }
    }
    trap_LinkEntity(self);
}

/*
================
CheckArmor
================
*/
int CheckArmor(gentity_t* ent, int damage, int dflags) {
    gclient_t* client;
    int save;
    int count;
    if (!damage) {
        return 0;
    }
    client = ent->client;
    if (!client) {
        return 0;
    }
    if (dflags & DAMAGE_NO_ARMOR) {
        return 0;
    }
    // armor
    count = client->ps.stats[STAT_ARMOR];
    save = ceil(damage * ARMOR_PROTECTION);
    if (save >= count) {
        save = count;
    }
    if (!save) {
        return 0;
    }
    client->ps.stats[STAT_ARMOR] -= save;
    return save;
}

/*
================
RaySphereIntersections
================
*/
int RaySphereIntersections(vec3_t origin, float radius, vec3_t point, vec3_t dir, vec3_t intersections[2]) {
    float b, c, d, t;
    // | origin - (point + t * dir) | = radius
    // a = dir[0]^2 + dir[1]^2 + dir[2]^2;
    // b = 2 * (dir[0] * (point[0] - origin[0]) + dir[1] * (point[1] - origin[1]) + dir[2] * (point[2] - origin[2]));
    // c = (point[0] - origin[0])^2 + (point[1] - origin[1])^2 + (point[2] - origin[2])^2 - radius^2;
    // normalize dir so a = 1
    VectorNormalize(dir);
    b = 2 * (dir[0] * (point[0] - origin[0]) + dir[1] * (point[1] - origin[1]) + dir[2] * (point[2] - origin[2]));
    c = (point[0] - origin[0]) * (point[0] - origin[0]) +
        (point[1] - origin[1]) * (point[1] - origin[1]) +
        (point[2] - origin[2]) * (point[2] - origin[2]) -
        radius * radius;
    d = b * b - 4 * c;
    if (d > 0) {
        t = (- b + sqrt(d)) / 2;
        VectorMA(point, t, dir, intersections[0]);
        t = (- b - sqrt(d)) / 2;
        VectorMA(point, t, dir, intersections[1]);
        return 2;
    } else if (d == 0) {
        t = (- b) / 2;
        VectorMA(point, t, dir, intersections[0]);
        return 1;
    }
    return 0;
}

/*
================
G_InvulnerabilityEffect
================
*/
int G_InvulnerabilityEffect(gentity_t* targ, vec3_t dir, vec3_t point, vec3_t impactpoint, vec3_t bouncedir) {
    gentity_t* impact;
    vec3_t intersections[2], vec;
    int n;
    if (!targ->client) {
        return qfalse;
    }
    VectorCopy(dir, vec);
    VectorInverse(vec);
    // sphere model radius = 42 units
    n = RaySphereIntersections(targ->client->ps.origin, 42, point, vec, intersections);
    if (n > 0) {
        impact = G_TempEntity(targ->client->ps.origin, EV_INVUL_IMPACT);
        VectorSubtract(intersections[0], targ->client->ps.origin, vec);
        vectoangles(vec, impact->s.angles);
        impact->s.angles[0] += 90;
        if (impact->s.angles[0] > 360) {
            impact->s.angles[0] -= 360;
        }
        if (impactpoint) {
            VectorCopy(intersections[0], impactpoint);
        }
        if (bouncedir) {
            VectorCopy(vec, bouncedir);
            VectorNormalize(bouncedir);
        }
        return qtrue;
    } else {
        return qfalse;
    }
}

/*
catchup_damage
*/
static int catchup_damage(int damage, int attacker_points, int target_points) {
    int newdamage;
    if (g_catchup.integer <= 0) {
        return damage;
    }
    //Reduce damage
    if (attacker_points <= target_points + 5) {
        return damage; //Never reduce damage if only 5 points ahead.
    }
    newdamage = damage - ((attacker_points - target_points - 5) * (g_catchup.integer * damage)) / 100;
    if (newdamage < damage / 2) {
        return damage / 2;
    }
    return newdamage;
}

void G_UpdateWeaponStats(gentity_t* ent, int damage, int weapon) {
    weaponStats_t* weap_stats = &ent->client->pers.weaponStats;
    weap_stats->weapDamage[weapon] += damage;
    if (weap_stats->weapDamage[weapon] > weap_stats->maxDamage) {
        weap_stats->maxDamage = weap_stats->weapDamage[weapon];
        weap_stats->favWeapon = weapon;
    }
}

/*
============
G_Damage

targ entity that is being damaged
inflictor entity that is causing the damage
attacker entity that caused the inflictor to damage targ
 example: targ=monster, inflictor=rocket, attacker=player

dir direction of the attack for knockback
point point at which the damage is being inflicted, used for headshots
damage amount of damage being inflicted
knockback force to be applied against targ as a result of the damage

inflictor, attacker, dir, and point can be NULL for environmental effects

dflags these flags are used to control how T_Damage works
 DAMAGE_RADIUS damage was indirect (from a nearby explosion)
 DAMAGE_NO_ARMOR armor does not protect from this damage
 DAMAGE_NO_KNOCKBACK do not affect velocity, just view angles
 DAMAGE_NO_PROTECTION kills godmode, armor, everything
============
*/

void G_Damage(gentity_t* targ, gentity_t* inflictor, gentity_t* attacker,
              vec3_t dir, vec3_t point, int damage, int dflags, int mod) {
    gclient_t* client;
    int take;
    //int save;
    int asave;
    int knockback;
    int max;
    vec3_t bouncedir, impactpoint;
    if (!targ->takedamage) {
        return;
    }
    // the intermission has allready been qualified for, so don't
    // allow any extra scoring
    if (level.intermissionQueued) {
        return;
    }
    if (targ->client && mod != MOD_JUICED) {
        if (targ->client->invulnerabilityTime > level.time) {
            if (dir && point) {
                G_InvulnerabilityEffect(targ, dir, point, impactpoint, bouncedir);
            }
            return;
        }
    }
    client = targ->client;
    if (!inflictor) {
        inflictor = &g_entities[ENTITYNUM_WORLD];
    }
    if (!attacker) {
        attacker = &g_entities[ENTITYNUM_WORLD];
    }
    if ((attacker == &g_entities[ENTITYNUM_WORLD] || attacker == targ || attacker->s.eType != ET_PLAYER) && client && client->lastSentFlying > -1 &&
            (mod == MOD_FALLING || mod == MOD_LAVA || mod == MOD_SLIME || mod == MOD_TRIGGER_HURT || mod == MOD_SUICIDE)) {
        if (client->lastSentFlyingTime + 5000 < level.time) {
            //More than 5 seconds, not a kill!
            client->lastSentFlying = -1;
        } else {
            attacker = &g_entities[client->lastSentFlying];
        }
    }
    // shootable doors / buttons don't actually have any health
    if (targ->s.eType == ET_MOVER) {
        if (targ->use && targ->moverState == MOVER_POS1) {
            targ->use(targ, inflictor, attacker);
        }
        return;
    }
    if (g_gametype.integer == GT_OBELISK && CheckObeliskAttack(targ, attacker)) {
        return;
    }
    // reduce damage by the attacker's handicap value
    // unless they are rocket jumping
    if (attacker->client && attacker != targ) {
        max = attacker->client->ps.stats[STAT_MAX_HEALTH];
        if (bg_itemlist[attacker->client->ps.stats[STAT_PERSISTANT_POWERUP]].giTag == PW_GUARD) {
            max /= 2;
        }
        damage = damage * max / 100;
    }
    if (client) {
        if (client->noclip) {
            return;
        }
    }
    if (!dir) {
        dflags |= DAMAGE_NO_KNOCKBACK;
    } else {
        VectorNormalize(dir);
    }
    knockback = damage;
    if (knockback > 200) {
        knockback = 200;
    }
    if (targ->flags & FL_NO_KNOCKBACK) {
        knockback = 0;
    }
    if (dflags & DAMAGE_NO_KNOCKBACK) {
        knockback = 0;
    }
    // figure momentum add, even if the damage won't be taken
    if (knockback && targ->client) {
        vec3_t kvel;
        float mass;
        mass = 200;
        VectorScale(dir, g_knockback.value * (float)knockback / mass, kvel);
        VectorAdd(targ->client->ps.velocity, kvel, targ->client->ps.velocity);
        // set the timer so that the other client can't cancel
        // out the movement immediately
        if (!targ->client->ps.pm_time) {
            int t;
            t = knockback * 2;
            if (t < 50) {
                t = 50;
            }
            if (t > 200) {
                t = 200;
            }
            targ->client->ps.pm_time = t;
            targ->client->ps.pm_flags |= PMF_TIME_KNOCKBACK;
        }
        //Remeber the last person to hurt the player
        if (!g_awardpushing.integer || targ == attacker || OnSameTeam(targ, attacker)) {
            targ->client->lastSentFlying = -1;
        } else {
            targ->client->lastSentFlying = attacker->s.number;
            targ->client->lastSentFlyingTime = level.time;
        }
    }
    // check for completely getting out of the damage
    if (!(dflags & DAMAGE_NO_PROTECTION)) {
        // if TF_NO_FRIENDLY_FIRE is set, don't do damage to the target
        // if the attacker was on the same team
        if (mod != MOD_JUICED && mod != MOD_CRUSH && targ != attacker && !(dflags & DAMAGE_NO_TEAM_PROTECTION) && OnSameTeam(targ, attacker)) {
            if ((!g_friendlyFire.integer && g_gametype.integer != GT_ELIMINATION && g_gametype.integer != GT_CTF_ELIMINATION) || (g_elimination_selfdamage.integer < 2 && (g_gametype.integer == GT_ELIMINATION || g_gametype.integer == GT_CTF_ELIMINATION))) {
                return;
            }
        }
        if (mod == MOD_PROXIMITY_MINE) {
            if (inflictor && inflictor->parent && OnSameTeam(targ, inflictor->parent)) {
                return;
            }
            if (targ == attacker) {
                return;
            }
        }
        // check for godmode
        if (targ->flags & FL_GODMODE) {
            return;
        }
        if (targ->client && targ->client->spawnprotected) {
            if (level.time > targ->client->respawnTime + g_spawnprotect.integer) {
                targ->client->spawnprotected = qfalse;
            } else {
                if ((mod > MOD_UNKNOWN && mod < MOD_WATER) || mod == MOD_TELEFRAG || mod > MOD_TRIGGER_HURT) {
                    return;
                }
            }
        }
    }
    // battlesuit protects from all radius damage (but takes knockback)
    // and protects 50% against all damage
    if (client && client->ps.powerups[PW_BATTLESUIT]) {
        G_AddEvent(targ, EV_POWERUP_BATTLESUIT, 0);
        if ((dflags & DAMAGE_RADIUS) || (mod == MOD_FALLING)) {
            return;
        }
        damage *= 0.5;
    }
    // add to the attacker's hit counter (if the target isn't a general entity like a prox mine)
    if (attacker->client && client
            && targ != attacker && targ->health > 0
            && targ->s.eType != ET_MISSILE
            && targ->s.eType != ET_GENERAL) {
        if (OnSameTeam(targ, attacker)) {
            attacker->client->ps.persistant[PERS_HITS]--;
        } else {
            attacker->client->ps.persistant[PERS_HITS]++;
        }
        attacker->client->ps.persistant[PERS_ATTACKEE_ARMOR] = (targ->health << 8) | (client->ps.stats[STAT_ARMOR]);
    }
    // always give half damage if hurting self
    // calculated after knockback, so rocket jumping works
    if (targ == attacker) {
        damage *= 0.5;
    }
    if (targ && targ->client && attacker->client) {
        damage = catchup_damage(damage, attacker->client->ps.persistant[PERS_SCORE], targ->client->ps.persistant[PERS_SCORE]);
    }
    if (g_damageModifier.value > 0.01) {
        damage *= g_damageModifier.value;
    }
    if (damage < 1) {
        damage = 1;
    }
    if (targ == attacker && (g_dmflags.integer & DF_NO_SELF_DAMAGE)) {
        damage = 0;
    }
    if ((g_gametype.integer == GT_ELIMINATION || g_gametype.integer == GT_CTF_ELIMINATION || g_gametype.integer == GT_LMS || g_elimination_allgametypes.integer)
            && g_elimination_selfdamage.integer < 1 && (targ == attacker || mod == MOD_FALLING)) {
        damage = 0;
    }
    //So people can be telefragged!
    if ((g_gametype.integer == GT_ELIMINATION || g_gametype.integer == GT_CTF_ELIMINATION || g_gametype.integer == GT_LMS) && level.time < level.roundStartTime && ((mod == MOD_LAVA) || (mod == MOD_SLIME))) {
        damage = 1000;
    }
    take = damage;
    //save = 0;
    // save some from armor
    asave = CheckArmor(targ, take, dflags);
    take -= asave;
    if (g_debugDamage.integer) {
        G_Printf("%i: client:%i health:%i damage:%i armor:%i\n", level.time, targ->s.number,
                 targ->health, take, asave);
    }
    // add to the damage inflicted on a player this frame
    // the total will be turned into screen blends and view angle kicks
    // at the end of the frame
    if (client) {
        if (attacker) {
            client->ps.persistant[PERS_ATTACKER] = attacker->s.number;
        } else if (client->lastSentFlying > -1) {
            client->ps.persistant[PERS_ATTACKER] = client->lastSentFlying;
        } else {
            client->ps.persistant[PERS_ATTACKER] = ENTITYNUM_WORLD;
        }
        client->damage_armor += asave;
        client->damage_blood += take;
        client->damage_knockback += knockback;
        // Global stats.
        if (attacker->client) {
            // We only include damage from weapons.
            if (modToWeapon[mod] != -1) {
                // Update weapon stats of attacker.
                G_UpdateWeaponStats(attacker, take, modToWeapon[mod]);
                // Update damage stats.
                // We don't count self damage.
                if (targ != attacker) {
                    // Don't count extra damage (when it exceeds hp).
                    int actualDamage = ((targ->health < take) ? targ->health : take);
                    client->pers.damageTaken += actualDamage;
                    attacker->client->pers.damageGiven += actualDamage;
                }
            }
        }
        if (dir) {
            VectorCopy(dir, client->damage_from);
            client->damage_fromWorld = qfalse;
        } else {
            VectorCopy(targ->r.currentOrigin, client->damage_from);
            client->damage_fromWorld = qtrue;
        }
    }
    // See if it's the player hurting the emeny flag carrier
    if (g_gametype.integer == GT_CTF || g_gametype.integer == GT_1FCTF || g_gametype.integer == GT_CTF_ELIMINATION) {
        Team_CheckHurtCarrier(targ, attacker);
    }
    if (targ->client) {
        // set the last client who damaged the target
        targ->client->lasthurt_client = attacker->s.number;
        targ->client->lasthurt_mod = mod;
    }
    //If vampire is enabled, gain health but not from self or teammate, cannot steal more than targ has
    if (g_vampire.value > 0.0 && (targ != attacker) && take > 0 &&
            !(OnSameTeam(targ, attacker)) && attacker->health > 0 && targ->health > 0) {
        if (take < targ->health) {
            attacker->health += (int)(((float)take) * g_vampire.value);
        } else {
            attacker->health += (int)(((float)targ->health) * g_vampire.value);
        }
        if (attacker->health > g_vampireMaxHealth.integer) {
            attacker->health = g_vampireMaxHealth.integer;
        }
    }
    // do the damage
    if (take) {
        targ->health = targ->health - take;
        if (targ->client) {
            targ->client->ps.stats[STAT_HEALTH] = targ->health;
        }
        if (targ->health <= 0) {
            if (client) {
                targ->flags |= FL_NO_KNOCKBACK;
            }
            if (targ->health < -999) {
                targ->health = -999;
            }
            targ->enemy = attacker;
            targ->die(targ, inflictor, attacker, take, mod);
            return;
        } else if (targ->pain) {
            targ->pain(targ, attacker, take);
        }
    }
}

/*
============
CanDamage

Returns qtrue if the inflictor can directly damage the target. Used for
explosions and melee attacks.
============
*/
qboolean CanDamage(gentity_t* targ, vec3_t origin) {
    vec3_t dest;
    trace_t tr;
    vec3_t midpoint;
    // use the midpoint of the bounds instead of the origin, because
    // bmodels may have their origin is 0,0,0
    VectorAdd(targ->r.absmin, targ->r.absmax, midpoint);
    VectorScale(midpoint, 0.5, midpoint);
    VectorCopy(midpoint, dest);
    trap_Trace(&tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID);
    if (tr.fraction == 1.0 || tr.entityNum == targ->s.number) {
        return qtrue;
    }
    // this should probably check in the plane of projection,
    // rather than in world coordinate, and also include Z
    VectorCopy(midpoint, dest);
    dest[0] += 15.0;
    dest[1] += 15.0;
    trap_Trace(&tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID);
    if (tr.fraction == 1.0) {
        return qtrue;
    }
    VectorCopy(midpoint, dest);
    dest[0] += 15.0;
    dest[1] -= 15.0;
    trap_Trace(&tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID);
    if (tr.fraction == 1.0) {
        return qtrue;
    }
    VectorCopy(midpoint, dest);
    dest[0] -= 15.0;
    dest[1] += 15.0;
    trap_Trace(&tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID);
    if (tr.fraction == 1.0) {
        return qtrue;
    }
    VectorCopy(midpoint, dest);
    dest[0] -= 15.0;
    dest[1] -= 15.0;
    trap_Trace(&tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID);
    if (tr.fraction == 1.0) {
        return qtrue;
    }
    return qfalse;
}

/*
============
G_RadiusDamage
============
*/
qboolean G_RadiusDamage(vec3_t origin, gentity_t* attacker, float damage, float radius,
                        gentity_t* ignore, int mod) {
    float points, dist;
    gentity_t* ent;
    int entityList[MAX_GENTITIES];
    int numListedEntities;
    vec3_t mins, maxs;
    vec3_t v;
    vec3_t dir;
    int i, e;
    qboolean hitClient = qfalse;
    if (radius < 1) {
        radius = 1;
    }
    for (i = 0; i < 3; i++) {
        mins[i] = origin[i] - radius;
        maxs[i] = origin[i] + radius;
    }
    numListedEntities = trap_EntitiesInBox(mins, maxs, entityList, MAX_GENTITIES);
    for (e = 0; e < numListedEntities; e++) {
        ent = &g_entities[entityList[ e ]];
        if (ent == ignore) {
            continue;
        }
        if (!ent->takedamage) {
            continue;
        }
        // find the distance from the edge of the bounding box
        for (i = 0; i < 3; i++) {
            if (origin[i] < ent->r.absmin[i]) {
                v[i] = ent->r.absmin[i] - origin[i];
            } else if (origin[i] > ent->r.absmax[i]) {
                v[i] = origin[i] - ent->r.absmax[i];
            } else {
                v[i] = 0;
            }
        }
        dist = VectorLength(v);
        if (dist >= radius) {
            continue;
        }
        points = damage * (1.0 - dist / radius);
        if (CanDamage(ent, origin)) {
            if (LogAccuracyHit(ent, attacker)) {
                hitClient = qtrue;
            }
            VectorSubtract(ent->r.currentOrigin, origin, dir);
            // push the center of mass higher than the origin so players
            // get knocked into the air more
            dir[2] += 24;
            G_Damage(ent, NULL, attacker, dir, origin, (int)points, DAMAGE_RADIUS, mod);
        }
    }
    return hitClient;
}

// Monster code

/*
==================
monster_die

definitely mangled from player_die with less about the player
==================
*/

void monster_die(gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int damage, int meansOfDeath) {
    int contents;
    int killer = 0;
    if (self->client && self->client->hook) {
        Weapon_HookFree(self->client->hook);
    }
    if ((self->client->ps.eFlags & EF_TICKING) && self->activator) {
        self->client->ps.eFlags &= ~EF_TICKING;
        self->activator->think = G_FreeEntity;
        self->activator->nextthink = level.time;
    }
    self->enemy = attacker;
    self->takedamage = qtrue; // can still be gibbed
    self->s.weapon = WP_NONE;
    self->s.powerups = 0;
    self->r.contents = CONTENTS_CORPSE;
    self->s.angles[0] = 0;
    self->s.angles[2] = 0;
    LookAtKiller(self, inflictor, attacker);
    VectorCopy(self->s.angles, self->client->ps.viewangles);
    self->s.loopSound = 0;
    self->r.maxs[2] = -8;
    // never gib in a nodrop
    contents = trap_PointContents(self->r.currentOrigin, -1);
    if ((self->health <= GIB_HEALTH && !(contents & CONTENTS_NODROP) && g_blood.integer) || meansOfDeath == MOD_SUICIDE) {
        // gib death
        GibEntity(self, killer);
    } else {
        // normal death
        // for the no-blood option, we need to prevent the health
        // from going to gib level
        if (self->health <= GIB_HEALTH) {
            self->health = GIB_HEALTH + 1;
        }
        // the body can still be gibbed
        self->die = body_die;
    }
    trap_LinkEntity(self);
}


Provide a way for editors involved in a decision-making process (AfD, RfC, Admin Noticeboard) to report how satisfied they were with the outcome of the process.
Do you have any suggestions for making the process more effective, more satisfactory to all parties, or easier to carry out?
This survey could be made available as a link when the discussion is closed, or automatically sent out as a notification to participating users.
The results could be analyzed to identify processes that are major "pain points" for the editing community, either due to being overly complicated or failing to reach a solution that is satisfactory to the parties involved.
In the short term, high survey participation rates would indicate that users are making use of the opportunity to give feedback.
The overall goal of these metrics is to help guide process changes. So a long-term positive outcome would be to see the metrics improving over time as process changes are implemented.
The metrics would provide an ongoing way to identify dysfunctional processes, give users a way to suggest improvements, and give Wikimedia projects a way to quantify the effects of process changes.
I personally do not have the knowledge or capabilities to implement this idea. I believe this would developer support from the Wikimedia Foundation to implement the above requirements.
This page was last edited on 23 November 2018, at 21:50.


Dutch Entwistle III - Hartsell & Williams Attorneys, P.A.
One of the reasons I became a lawyer is because I feel that it is important for someone to have an advocate on their side who is willing to fight for them and represent their interests in some of the most significant times of their life. While in college, through many of my extra-curricular activities, I learned what it felt like to be there for very worthy people who do not always get a fair shot at certain aspects of life.
"In college, I found my passion. In law school, I learned tools through which to channel that passion. Now, at Hartsell & Williams, I once again find myself surrounded by passionate role models, and I am honored to emulate the great attorneys here as we all serve to make this community better."
Growing up in Concord, North Carolina, I always heard about the exceptional reputation of Hartsell & Williams. This firm made its name, and continues to make its name, by offering second-to-none representation for the members of this community. As a younger man, I looked up to the members of this firm for their stature in the community. Now, as their fellow attorney, I look up to the members of this firm because of all that they accomplish in a day. The attorneys here will wake up early, spend their whole day representing their clients and providing exceptional services, and then when they get home they still make time for their families, friends, and community organizations.
Austin first realized that he wanted to be a lawyer in his sophomore year of college at UNC Chapel Hill. Like a lot of sophomores, he found himself undecided on what future he wanted to pursue. He was very fortunate to have older friends who were already interested in going to law school, and those friends told him how becoming a lawyer seemed like such a natural path for him to follow.
Leading by example, those friends motivated him to go out and help others. In particular, working with people with disabilities in the Orange County community. Whether it was organizing 5K race fundaisers, raising awareness on campus for using more appropriate language, or just having the local branch of Extraordinary Ventures over for dinner, they made it a point to be advocates and friends witht their brothers and sisters born with disabilities.
Entwistle was a standout mock trial participant while in college. During his second year of law school his team won a Mock Trial National Championship known as the South Texas Challenge upsetting Stetson, a school historically ranked #1 in the nation for advocacy programs. Law schools do not have football or basketball teams to send to the NCAA tournament, but law schools do have Mock Trial, Moot Court, and Negotiation teams that go out and compete against teams from other schools. Only the best-of-the-best make it onto the teams, and only the best-of-the-best come out as champions. With him giving the closing argument and being crowned champions, it was reminiscent to him of the Miracle on Ice. The only thing we were missing was the "USA" chants.
I really enjoy spending time with family and close friends. Whether it is playing basketball at the YMCA, getting my friends together to play a board game, or travelling with my fiancé to see new parts of the world, I am happiest when I am active. I am also a big fan of the Minnesota Vikings and San Antonio Spurs, so any day I get to watch either of those teams play is a good day to me.


You have selected to begin a new personal loan application. Click the New Application button below to get started!
Here's an overview of how simple and easy it is to apply online with Landmark Bank. Please take a moment to read the Getting Prepared page to see what documents will be helpful to complete your loan application quickly and easily.
Begin Application- by giving us some general information about your financing needs.
Borrower Information - You can safely and securely provide information about yourself and others who will be applying for the loan. We require general information for each applicant, including Social Security Numbers so we can gather credit information. This helps us to accurately evaluate which loan programs meet your financing needs.
Collateral and Loan Information - We ask for information about the type, amount, and term of personal loan you would like. We also ask for information about any collateral you are pledging for the loan.
Submit- The final step of the application process!


text:
Feline atopic dermatitis
Feline atopic dermatitis presents clinical differences when compared with canine or human allergic dermatitis, the former being associated with the presence of itching (although not always), symmetrical alopecia, papular-scaly dermatitis or miliary dermatitis, plaque-nodular dermatitis and cervical or facial ulcers1.
This disease is more common in young cats, appearing 75% of the time during the first three years of life2.
Papular and nodular lesions of an inflammatory origin are relatively rare in cats. The causes of papular and nodular dermatitis are infections and not infectious (sterile/immune measures)3.
It was thought that atopic cats presented no secondary infections. However, these feline patients may present secondary infections such as dermatitis pyoderma from malassezia4, as well as other infections from methicillin-resistant Staphylococcus.
The differential diagnoses are allergic dermatitis stemming from a flea bite, food allergy, demodicosis (Demodex gatoi), bacterial folliculitis, pemphigus foliaceus, ulcerative dermatitis caused by FHV-1 and cutaneous epitheliotropic lymphoma. Cytologies, cutaneous biopsies, immunohistochemistry and cultures are needed for diagnosis3.
Allergen-specific immunotherapy is one of the recommended treatments5, as is treatment with glucocorticoids and cyclosporine6.
Effects of laser therapy in the treatment of feline atopic dermatitis
The fundamental effects of laser therapy include the immunomodulatory and biostimulant effect on various tissues7. Although more studies are needed in the field of veterinary medicine, studies exist in human medicine that show the benefits of laser therapy on atopic dermatitis and laser therapy is considered as a new therapeutic option for this pathology8. Furthermore, an antimicrobial effect has been observed in various micro-organisms that can help any possible secondary infections9.
More studies on feline atopic dermatitis and its triggers are needed, as well as on how laser therapy interacts with the immune system. Nonetheless, due to the general effects of laser therapy, it can become an adjuvant therapy for feline atopic dermatitis.
DoctorVet has an inflammation protocol designed to create the immunomodulatory effect from laser therapy. Furthermore, this protocol can be combined in the presence of infection with the protocol for superficial infection.
Depending on the lesions presented by the patient, it can be combined with other protocols included in the "Wound" folder. The sweeper treatment head is recommended with the scanner application technique in non-contact mode. Depending on the lesions presented by the patient, the treatment schedule may vary between 2-4 sessions/week until an improvement is observed.
Maintenance sessions may be necessary, which may vary between once a fortnight to once a month depending on the individual response by the patient.
Bajwa J. Atopic dermatitsi in cats. Vet Dermatol, 59: 311-319, 2018.
Roosje PJ. et al. Feline atopic dermatitis: a review. Vet Dermatol, 23:110-118, 2000.
Ordeix L. Introducción a las enfermedades nodulares e infecciones fúngicas profundas. SEVC, 7-9 Noviembre, 2019.
Ordeix L. et al. Malassezia spp. overgrowth in allergic cats. Vet Dermatol, 18:316-323,2007.
Jones S. et al. Rush immunotherapy in two cats with atopic skin syndrome. J Fel Med and Surg Open Reports: 1-5, 2021.
Favrot C. Feline non-flea induced hypersensitivity dermatitis: clinical features, diagnosis and treatment. J Feline Med Surg, 15(9): 778-784, 2013.
Morita H. et al. Clinica application of low reactive level laser therapy (LLLT) for atopic dermatitis. J Med, 42(4): 174-176, 1993.
Krespi YP. Et al. Laser-assited nasal decolonization of Syaphylococcus aureus, including methicillin-resistant Staphylococcus aureus. Am J Otolaryngol, 33(5): 572-575, 2012.

redpajama_set_name: RedPajamaCommonCrawl


text:
The jungle book part 49 the arrivals
Based on rudyard kiplings eponymous collective works and inspired by walt disneys 1967 animated film of the same name, the jungle book is a liveactioncgi film that tells the story of mowgli, an orphaned human boy who. The jungle book is a 2016 american fantasy adventure film directed and produced by jon favreau, from a screenplay written by justin marks and produced by walt disney pictures. Visit the official site for disneys the jungle book to watch videos, play games, find activities, browse photos, meet the characters and buy the movie. The jungle book on dvd august 30, 2016 starring scarlett johansson, lupita nyongo, idris elba, neel sethi. Our limited edition jungle jamboree comes gallery wrapped and includes a certificate of authenticity. Rikkitikkitavi from the jungle book analysis shmoop.
Series isbncatalog id price pages format type cover artist verif. Walt disneys the jungle book is a series of video games based on the 1967 disney animated film the jungle book, primarily released in 1994. Jungle book part 2 evolution mix by dissidenten on. The jungle book cartoon show for all its fans in amazing 3d animation and special effects. Its a testament to the totalimmersion powers of the jungle book, from its visual splendors to its sound design, that the seams never show. The jungle book by rudyard kipling part 1 out of 3. Most people today are probably more familiar with the tuneful 1967 animated version of the jungle book, the last disney feature to be supervised by walt himself. Bagheera the panther and baloo the bear have a difficult time trying to convince a boy to leave the jungle for human civilization. The movie is inspired from rudyard kiplings novel with the same name. Rudyard kipling 18651936 was one of the most popular writers in the united kingdom in the late 19th and early 20th centuries.
The jungle book amazonclassics edition kindle edition by kipling, rudyard. Make sure to like, share and subscribe to the channel power kids for more exciting episodes and shows. A newborn boy gets lost in the jungle and is adopted by a family of wolves. The jungle book was a reminder that simpler can be better, and achieved such with some quite infectious music arguably one of the greatest disney soundtracks to date, relatable characters and soft artwork. The jungle book released almost half a century after the original 1967 masterpiece made its debut. Jungle book in hindi the damaged heart ep 16 cartoon for kids. The jungle book is an allnew liveaction epic adventure about mowgli newcomer neel sethi, a mancub whos been raised by a family of wo. The jungle book is a short collection of stories published by kipling in various magazines between 1893 and 1894. Jungle skipper canteen restaurant walt disney world resort. Once he sees the cause of their alarm, he grabs a rope hes made from vinesa human trick of invention that his wolf family frowns uponand clambers out of sight. However, shere khan the tiger does not believe that mowgli is part of the jungle only because he is a human. Press enter to navigate or collapse by pressing escape. The jungle book thewildanimal style part 10 janja, cheezi and chungus arrival outta the way thewildanimal. Her mother, melanie sloan, is from a jewish family from the bronx, and her father, karsten johansson, is a danishborn architect, from copenhagen.
The jungle book 7 buzzy, flaps, dizzy, ziggy quotes buzzy. The short stories and poems include the tale of mowgli, a boy raised by a pack of wolves in the indian jungle. She has a sister, vanessa johansson, who is also an actress, a brother, adrian, a twin brother, hunter johansson, born three minutes after her, and a. Mowglis song the white seal lukannon rikkitikkitavi darzees chant toomai of the elephants.
We meet the tiger shere khan, bagheera, the black panther, baloo, the sleepy brown bear, and the python, kaa. In part to make the jungle book appeal to a finicky high school crowd older siblings tend to influence younger brothers and sisters disney packed the first trailer with scary moments. Based off rudyard kiplings famous collection of stories, the jungle book movie is one of disneys most beloved classics, with characters that have charmed audiences since the day it was released. Directed by jon favreau iron man, based on rudyard kiplings timeless stories and inspired by disneys classic animated film, the jungle book is a liveaction epic adventure about mowgli newcomer neel sethi, a mancub whos been raised by a family of wolves. In 1907, at the age of 42, he was awarded the nobel prize in literature. Shoobe dobee dobee can learn to be human too roobakatee. Download it once and read it on your kindle device, pc, phones or tablets.
For his part, sometime songanddance man walken gets to reprise the sherman brothers tune louis prima handled 49 years ago, i wanna be like you. Were your friends were your friends were your friends to the bitter end buzzy. By continuing to visit this site you agree to our use of cookies. Kaas sloughing and the elephant dance jungle book ep. Bagheera, a panther who has lived a long time among humans, and baloo. There was probably not that much story depth there to create an equally good sequel. Mowgli, played by neel sethi has been living in the jungle, for as long as he can remember. Jungle book 3d edition shows how the jungle was made. Academy awards 2003 arrivals gallery iii 2 still photographs of the jungle book 2016 2 vanity fair party at the 2011 tribeca film festival 2 adam sandler through the years 2 14th annual screen actors guild awards arrivals 2 photos we love 2012 1 horror movies based on books 1 movies that became tv shows 1. The jungle book is the classic collection of animal tales that shows rudyard kiplings writing for children at its best. Despite its page length, rikkitikkitavi is an epic at heart, and most epics are named after the hero they feature. The aim in producing this 52 episode series was to convey to children the importance of protecting and preserving nature, as well as how precious and important all life is.
The jungle book 8 bagheera quotes but you must remember, mowgli, greater love hath no one than he who lays down his life for his friend. Rudyard kipling books, ebooks, audiobooks, biography. Use features like bookmarks, note taking and highlighting while reading the jungle book amazonclassics edition. But the earlier 1942 big budget liveaction take on rudyard kiplings tales of india written while living in vermont with his american wife and produced in hollywood by great britains leading film family stands out for its exotic. The jungle book is an adaptation of disneys most famous animated film, the jungle book. Disney made several smart marketing choices during the leadin to the release of the jungle book that helped build hype and buzz for the movie. Please continue to report images that break our rules on underage content. Mowgli must learn to abide by the ways of jungle law and stand up to the fierce khan in this imaginative adaptation of the classic kipling story. The jungle book mowglis brothers now rann the kite brings home the night that mang the bat sets free the herds are shut in byre and hut for loosed till dawn are we. Kaas sloughing and the elephant dance jungle book, ep. An adaptation of the disney movie the jungle book, mowgli, the boy who gets lost in. Disneys savvy marketing of the jungle book the new. Directed by wolfgang reitherman, james algar, jack kinney.
Disney has dusted off another of its classics with a liveaction remake of the jungle book. Kipling spent both his early years and his late teenage years in india and that upbringing is front and center in these stories despite them being written while he was living in vermont. A worldfamous novel by rudyard kipling, the jungle book is the story of a boy lost in the jungle as child and adopted into. The jungle book official diamond edition bluray trailer 20 disney movie hd bagheera the panther and baloo the bear have a difficult time trying to convince a. The jungle book 1894 is a collection of stories by the english author rudyard kipling. Why was disneys marketing of the jungle book remarked. Baloo, mowgli, king louie and more characters from disneys animated classic the jungle book join together for the scene on this giclee on canvas by karin arruda. Kipling gave the founder of the scouts permission to use the book as a part of the curriculum. His fiction works include the jungle book a classic of childrens literature and the rousing adventure novel kim, as well as books of poems, short stories, and essays. The jungle book by rudyard kipling full text free book.
Conversions for the game boy, nes for which it was one of the last titles released by a thirdparty developer, sega mega. With jimmy hibbert, david holt, nigel pilkington, teresa gallagher. The jungle book 2 has great production values and the highlight of the movie is john goodmans performance as baloo. The jungle book is a parable about maturity and about finding the good in the world, and it finds an endless fount of it in bill murrays baloo. Everything you need to know about the jungle book movie. Mowgli misses meshua and thinks about her all the time, but he is distracted by the arrival of a herd of deer that is the perfect prey for hungry wolves. Walt disney studios will put the 3d into the home viewing for the jungle book disney announced a 3d home version of its hit liveaction film on friday, part of its collectors edition which. The jungle book was first made into a film in 1942, an almost unknown production starring the young indian actor sabu, who five years earlier had played toomai in elephant boy, a. Most of the characters are animals such as shere khan the tiger and baloo the bear, though a principal character is the boy or mancub mowgli, who is raised in the jungle by wolves. Provided to youtube by zebralution gmbh jungle book part 1 dissidenten live in europe.
Walt disneys 1967 handdrawn animated classic is, in my humble opinion, one of the landmarks of disney character animation. With phil harris, sebastian cabot, louis prima, bruce reitherman. They combined typical marketing approaches, special opportunities available only to disney, and a few u. Next part 2 the jungle book contents mowglis brothers huntingsong of the seeonee pack kaas hunting roadsong of the bandarlog tiger. This is the hour of pride and power, talon and tush and claw. When great deeds are remembered in this jungle, one name will stand above all others. The jungle book amazonclassics edition kindle edition. Check out jungle book part 2 evolution mix by dissidenten on amazon music. The jungle book official diamond edition bluray trailer. Join us for our ice cream social sponsored by medexpress following the july 7 performance. Jungle book is an animated tv series freely based on rudyard kiplings masterpiece. It was first released by virgin interactive in 1993 for the sega master system. The odyssey means the story of odysseus, and virgil titled his epic, the aeneid, after its hero as a shoutout to the odyssey and rikkitikkitavi is about a mongoose named rikkitikkitavi. The story was, as in many walt disney animated movies, very simple.
1292 408 188 936 800 311 1073 438 631 1243 1202 793 123 677 1016 785 1157 929 127 1560 1002 1449 226 177 1520 68 873 524 1453 271 1577 933 1299 558 1342 14 212 828


Fenty Beauty is an amazing makeup brand that was founded by Rihanna. It is a high-end luxury brand that have a wide range of makeup products that can be used on all skin types and skin tones. This makeup range has a wide variety of lipsticks, foundations, blushes, eyeshadows, highlighters, bronzers and what not.


That's right, it's that time again! The 4WD and Adventure Show is back for its third year and this time the adventure is bigger than ever.
The 2013 show will be held in three states: Sydney (18-20 October), Adelaide (25-27 October) and Perth (8-10 November). The Perth show will be in McCalum Park and will have a range of exciting special guests, new products and awesome entertainment!
There's something for everyone in the family. Tickets are $15 for adults, $7 for children (age 5-17), $40 for families and $12 for seniors/pensioners. Children under 5 get in free!
Check out the website – www.4wdshow.com.au – for more details and to buy tickets.


SW-MOTECH  Pro pannier frames/racks for the BMW F 850 / 750 GS are the next generation of luggage frames with the unique quick lock system.
These Quicklock BMW F 850 / 750 GS  pannier frames/racks are completely removable and can be attached to the bike in less than one minute, without tools.
Only 3 or 4 nearly invisible mounting tabs remain when the racks are not in use, disturbing neither the handling or appearance of the motorcycle.
Each rack is tailor made for the bike it will fit.
Compact, discreet & sturdy SW Motech Pro QuickLock pannier racks are the perfect answer for riders who value form as much as function.
Now upgraded for tough South African conditions & suitable for both hard and soft luggage.
Compatible with soft & hard luggage  from SW Motech ( TraX alu-panniers ), GIVI (Monokey system),  Pelican, , Kappa, Shad, Hepco-Becker, Krauser, and more. Luggage-specific adapter kits are sold separately for each brand.
In addition, optional key locks are available to lock the racks to the bike, with the key unlocking a pair of special quick-release fasteners which secure the racks on each side.
A rugged top box system representing the latest advancement in motorcycle luggage technology.


What I did to make discount coupon codes work with this, was put a link "if you have a coupon code enter it here" on checkout_confirmation.php , then had this link to the coupon code page. I have a heavily modified site that alot of the code has been drawn from some of my modifications. I do hope to get a chance to work on some of the bugs that people have mentioned since it was posted. I have adapted my site so some of the problems mentioned in this forum do not happen to me, but have not kept up with every single update. Any help / modifcations would be appreciated till I can help with some of these bugs.
Yes, Just undo all of the code changes you made, and just change all of the linking back to the original checkout pages. I have found 2 more errors that sometimes happen if a certain navigation path is used, and if other contributions are not installed. I will be working on making this one of the best checkout solutions possible very shortly.
Add a customer survey during checkout?
I have not seen any problems with the admin / orders page but this is transmitted to the page with checkout_process.php . What version of OsCommerce are you running? I have only tested this on 2.2 MS2 so i wonder if that has something to do with that- I am going to be doing a fresh install of the new osC so i will see if that is the issue.
I think you are right about the length of the page - i could make the billing box only show if the shipping address is different than the billing address and if you check the box. I dont understand the question what you are looking for the page to do, something about a redirect? but explain and i might be able to help. Thanks for the input.
Is that one of the things I posted about in the known errors.. does it do that only when you are logged in and then click checkout? I noticed that if you are logged in and go to the checkout page and do not select a shipping method again, it does not work. When you create a new account and go directly to checkout_confirmation does it work then? If it does I might be able to help.
http://addons.oscommerce.com/info/6595 This contribution was made to make the checkout process easy and efficient with the idea that too many customers are leaving the site because the original checkout procedure is too lengthy and complex. I believe that almost any contribution can be improved to be even better with the collective knowledge of the osCommerce community. In regards to this contribution, can anybody help answer this question regarding this contribution. Step 1 (Review The Contents Of Your Order), all products, except the first, display the COST EACH price as eg $39.9900 instead of $39.99. How do I get rid of these extra zeros in the checkout. I will be grateful for your help. the current code looks like echo '	' . ' ' . [b]$order->products[$i]['price'] . '[/b] =' . '	' . "\n"; and that gets the each price. also how can that code be rewritten to get the each price + attributes options selected if selected. Any help would be greatly appreciated.


US scientists were allowed to participate in Russia-sponsored programs The U.S. Department of energy has banned its employees and scientists to participate in programs on the search for talented personnel who are sponsored by a number of countries, including Russia, China, Iran and North Korea. In an interview with The Wall Street Journal said the Deputy Minister of energy of the USA Dan Pollett, these measures are aimed at "protecting national interests of the United States in the field of security and science." Now all Agency staff, contract workers, scientists and potential grant winners are prohibited from participating in specialized events abroad and share experiences with colleagues from those countries. "We have to work either with us or with them", — concluded Brullet. 29 January it became known that the Russian Academy of Sciences (RAS) and the national Academy of Sciences of the United States has prepared a cooperation agreement.
Died legendary announcer of "Time" Yevhen Suslov MOSCOW, Feb 2 — RIA Novosti. The legendary announcer of "Time" Yevhen Suslov, more than 30 years has worked as an announcer at Central television, died on Friday, February 1, at the age of 81 years. This was reported in Facebook by his colleague Alla Danko. "Today, after a serious illness died our beloved colleague, the speaker of the Central television, honored artist of the RSFSR Yevgeny Suslov," wrote Danko. Eugene Suslov was born 10 October 1937, for a long time he worked as an announcer and presenter on Soviet TV, in 1984, he was awarded the title of honored artist of the RSFSR. Suslov led the program "Time", commented on military parades and festive demonstrations in the USSR, as well as "Blue lights" and other programs. "Time" — an information television program, first aired January 1, 1968, released in color in 1970.
Russia will respond to the U.S. withdrawal from the INF Treaty by developing new missiles According to "Kommersant", will be created a terrestrial version of the "Caliber" and "Zircon". The President of Russia Vladimir Putin declared about the mirror Moscow's actions in response to the US suspension of its participation in the Treaty on intermediate and shorter-range missiles (INF Treaty) in force since 1987. According to the President, Russia suspends participation in the Treaty and begins research and development work on the creation of new types of missiles. These products, according to "Kommersant", will be developed on the basis of cruise missiles "Caliber" and hypersonic missiles "Zircon". The decision to suspend Russia's participation in the INF Treaty, Vladimir Putin said at a meeting with defence Minister Sergei Shoigu and Russian foreign Minister Sergei Lavrov. American partners have announced that they suspend their participation in the Contract and we are suspending.


text:
Variety Plus Icon Read Next: Kamal Haasan Sets Disney Plus Hotstar Show 'Bigg Boss Ultimate,' Sony Pictures India Tamil Language Project – Global Bulletin
Feb 16, 1998 11:00pm PT
Coppola's 'Contact' claim is dismissed
Judge says he waited too long to sue
By Paul Karon
Paul Karon
Vlife: Familiarity breeds content 20 years ago
Genre transfusion 20 years ago
Kudos go for Clark spark 20 years ago
A Los Angeles superior court judge on Friday summarily dismissed a legal claim by director and producer Francis Ford Coppola against the estate of late scientist-writer Carl Sagan and Warner Bros. over rights to the 1997 sci-fi film "Contact," which was based on a novel by Sagan.
Warners and Ann Druyan, Sagan's widow, said they were gratified with the judge's decision to dismiss the suit.
Coppola will appeal that decision to a higher court, according to attorneys.
In the suit, filed in 1996, Coppola claimed that Sagan's novel was actually based on a treatment the pair had developed for a television program back in the 1970s, to be called "First Contact." Under that development agreement, the pair were to split proceeds from the project and from any novel Sagan would write. The television program was never produced, but in 1985, Sagan published "Contact" and sold the film rights to Warner Bros. for the movie released last summer.
The Coppola suit sought at least $250,000 in compensatory damages and a share of the proceeds from the movie version of "Contact." But on Friday, Los Angeles Superior Court Judge Ricardo Torres dismissed the complaint.
The judge agreed that Sagan had violated some terms of the contract, but he also said Coppola had waited too long to file his suit, and that the contract might not be enforceable as it was written, according to Robert Chapman, Coppola's attorney.
The "Contact" suit was one of two legal disputes between Coppola and Warner Bros. Coppola is also suing the studio for failing to produce a live-action film based on the children's classic tale "Pinocchio," and for preventing him from making the film at another studio. That dispute is set to go to trial May 11.


Before the decade is out, it seems every celebrity will have shed their clothes to appear in a PETA ad campaign. The latest addition to the naked celebrity parade is British actress and model Kelly Brook. In the ad, Brook is naked but she's painted to resemble a snake. The ad's headline is "Whose Skin Are You In?" Body copy reads, "Animals belong in the wild, not in your wardrobe."
Of her participation in the campaign, Brook said, "It makes my skin crawl to think about the violent ways snakes, lizards, alligators and other exotic creatures are raised and killed for boots, bags and belts."
The 32E Brook was last seen writhing in a perpetual state of hyper sexualized ecstasy as she awaited rescue as the last Axe Angel who hadn't yet fallen from the sky into the arms of her perfect lover.


Relax by the pool in our classic Majorca Bralette. Adjustable shoulder straps and removable slip-in cups ensure the perfect fit.
Shown here with the Flores Hipster Bottom.
Need a break from the sun? Our long-sleeved zipper-less Lanai Rash Guard is just the thing, whether you're snorkeling, playing water sports or just want to protect yourself from those UV rays. Made from imported Italian fabric that is recycled, ultra chlorine and UV resistant.
The Lanai Rash Guard comes in other colours, check them out here.


4 Positive Ways Adults Are Coloring to Improve Their Health!
"Happy!" What an upbeat word.
Makes me think of a woman I once met called Happy. It wasn't a nick name either, and perfectly matched her personality: Always smiling. Positive. Cheerful. And who doesn't sing and clap along with the song, "Happy," by Pharrell Williams.
Wait until you see the pages inside. So cute!
So, yes, like thousands of others, coloring books for grownups have my attention these days. They seem to be everywhere: craft stores, grocery stores, dollar stores, fabric stores, and even in the work place. Apparently they are "in" right now.
Not too long ago my local paper ran an article about their current popularity, touching upon the benefits coloring can have on one's health. Intrigued, I did a little research into the subject. In a nutshell, here's what I learned: Coloring helps reduce stress, fosters friendships, counters anxiety and more.
Simply stated, coloring calms us. Scientific studies indicate that as we color our brains become more focused, quieting our minds and enabling us to relax. Ah, how nice.
Totally relaxed after coloring this page.
"I am on an oral chemotherapy regimen for an EGFR lung cancer mutation. Once a month I get an infusion to help strengthen my bones and slow the spread of my metastatic bone cancer. It's a long, difficult day and often stirs up anxiety in me as I usually do it alone.
Another artist in the family: Gina's Mom!
"Coloring and creating art helps me (Gina) combat daily anxiety and depression - which has stalked me since I was a teenager. Thankfully it also played a big role in my own cancer journey, providing relief as I healed from thyroid removal and the scary complications that followed in 2013.
These are two remarkable women and stories. Now let me tell you another which I stumbled upon while doing my research.
This one is about an innovative young man I heard about via FoxNews.com who brought a coloring book and crayons to his workplace! On Friday afternoons, he did some coloring to counter all the challenges of the week. Eventually, some of his co-workers joined him in the conference room. I don't know where he got the idea, but it worked. If I owned a business I'd be quick to initiate a similar practice. After all, happy employees make good employees.
Here's another novel idea that came from my research which has the potential to cultivate or deepen relationships: start a Ladies' Coloring Club! One woman did this by inviting her friends to meet once a month at her home where they would color, sip wine, and visit. Sounds like a hoot. What an ideal way to get to know others plus develop a healthy outlook on life by coloring for a few hours with friends.
My local library gave me a surprise recently when I noticed it offers a weekly coloring opportunity for anyone over 18. That's a win-win for me as reading books and enjoying art are my two favorite forms of entertainment. The combination of being in a book environment while participating in a creative activity makes me happy. And the thought of having a lively book discussion as we color away makes me want to go out and buy a new box of crayons.
What about you? Ready to borrow your child's crayons and join the trend? Or perhaps acquire a coloring book to encourage someone you know with a chronic illness or in distress? Would love to hear your story in the comment box below if you do.
Meanwhile, stay upbeat. Live happy!
P.S. To buy a copy of "Here's Some Happy" or see other art by Gina go to www.ginagraham.com. Or check out www.facebook.com/heressomehappy.


text:
ភ្នំពេញប៉ុស្តិ៍ Subscribe Search
Phnom Penh Post - Man placed in pre-trial detention for murder of toddler in Kampong Speu
Post in-depth
K.R. Tribunal
Post Finance
Post Focus
Post Auto
Around NGOs
PDF Supplement
Post Siem Reap
Man placed in pre-trial detention for murder of toddler in Kampong Speu
Kim Sarom | Publication date 18 March 2021 | 22:55 ICT
A man was arrested on March 14 after he had hacked a boy to death with a machete in Ampil Pha-em village, Ramlaing Chak commune, and Kampong Speu's Samrong Tong district. Police
Kim Sarom
A man who is alleged to have hacked a toddler to death with a machete on March 14 in Ampil Pha-em village of Ramlaing Chak commune in Kampong Speu's Samrong Tong district was detained at the provincial prison by order of the investigating judge on March 16 following his visit to Kampong Speu Provincial Hospital to receive medical treatment for self-inflicted injuries.
Provincial deputy police chief Sam Sak told The Post that 40-year-old Eang Rado had cut his own neck using the murder weapon, but is now in stable condition after being treated by doctors.
The authorities took the suspect to Kampong Speu Provincial Court on March 15 where he was charged by the prosecutor and investigating judge Top Chhun Song, who also issued a temporary detention order that sent the suspect to the provincial prison on the same day.
"The suspect is charged with aggravated murder and aggravated violence under Article 202 and Article 218 of the Criminal Code," he said.
The defendant could be sentenced to 15 to 30 years in prison if the court finds him guilty under Article 202, with an additional two to five years punishment possible if convicted under Article 218, along with a four to ten million riel fine.
The charges stem from an incident on March 14, with witnesses claiming that the suspect used a machete to hack a 1-year-old boy to death by striking him in the head and neck. The child died near-instantly at the scene from his injuries.
The victim's mother is a 30-year-old garment worker who lives in Ampil Pha-em village of Ramlaing Chak commune.
After killing the child, the man fled the scene and returned to his home where he attempted to cut his own throat with the same machete. He was rushed to Kampong Speu Provincial Hospital for treatment by the arresting officers.
According to the suspect's wife Pin Kim, her husband used to work as a hearse driver, but he had been suffering from mental illness for many years.
Both doctors and traditional healers attempted to treat his condition, but he showed no improvement afterwards, Kim said.
Kim also said that the traditional healer had claimed that her husband was possessed by ghosts due to his former employment as a hearse driver.
Contact author: Kim Sarom
Research key to Kanitha's rep for expertise
Sok Kanitha is used to weighing in on controversial issues using a confident approach that signals expertise and authority, and a recent video she made was no exception. Her "Episode 342: The History of NATO" video went live on January 16, 2023 and immediately shot to 30,000 likes and 3,500
Cambodia maintains 'Kun Khmer' stance despite Thailand's boycott threat
Cambodia has taken the position that it will use the term "Kun Khmer" to refer to the sport of kickboxing at the upcoming Southeast Asian (SEA) Games, and has removed the term Muay from all references to the sport. Despite strong reactions from the Thai
Knockout! Kun Khmer replaces 'Muay' for Phnom Penh Games
Cambodia has decided to officially remove the word Muay from the programme of the 32nd Southeast Asian (SEA) Games 2023 in May. "Kun Khmer" will instead be used to represent the Southeast Asian sport of kickboxing, in accordance with the wishes of the Cambodian people. Vath
Artificial insemination takes herd from 7 to 700
Some farms breed local cows or even import bulls from a broad for the purpose of breeding heavier livestock for meat production. One Tbong Khnum farmer has found a more efficient way. Hout Leang employs artificial insemination to fertilise local cows. Thanks to imported "straws"
New int'l airport nearly half complete as travel industry returns to life
Construction of a new airport that is slated to serve the capital has passed the 43 per cent completion mark, raising prospects for a proper recovery in the civil aviation and tourism sectors as international travellers return to the Kingdom in increasingly large numbers. The figure
Chinese group tours return to Cambodia starting Feb 6
Cambodia is among 20 countries selected by Beijing for a pilot programme allowing travel agencies to provide international group tours as well as flight and hotel packages to Chinese citizens, following a three-year ban. As the days tick down until the programme kicks off on February 6,
Man gets 20 years for murder of step-child
Man faces court for killing eight-month-old daughter
Man in court for killing 4-month-old nephew
Man held for murder of toddler in Kampong Speu
Convicted child killer pleads for reduction of 20-year sentence
Police catch Kampong Cham child murderer
A man was arrested on Friday for the death of a five-year-old child in Kampong Cham last year after the girl supposedly insulted him. The
Girl found dead and tied up in bushes
Man accused of killing child while on drugs
CPU notes drop in child murders
Boy, 14, arrested for rape, attempted murder of girl, 9
Post Media Co Ltd
The Elements Condominium, Level 7
Hun Sen Boulevard
Phum Tuol Roka III
Sangkat Chak Angre Krom, Khan Meanchey
12353 Phnom Penh
Tel: +855(0) 23 888 161 / 162
Fax: +855(0) 23 214 318
Siem Reap Insider
PDF Printing
Copyright © 2020 The Phnom Penh Post. All Rights Reserved.


A very important component in any spark ignited engine is of course the spark plug itself. In spite of the simple component that a spark plug appears to be, it is a very sophisticated and important item in the combustion process.
It is of the upmost importance to pick the best spark plug for each application. A sparking plug needs to meet a whole set of conditions in order to perform well in the engine. Heat range, threading type and seat, nose projection, torque value, electrode gap size and electrode-material alloys. Every aspect plays a part in the spark plug performance. It makes that there is no single plug that "has it all" and for that reason Hatraco supplies a larger industrial spark plug program than any other party in Europe. Heavy duty spark plugs are the best plugs that are manufactured in general and need to perform under much heavier conditions than the average automotive spark plug. We are talking higher cylinder pressures, higher cylinder temperatures and ignition voltages and at the same time much longer plug life is required. Stationary engines don't always run on clean fuels like home quality natural gas. In many cases, engines need to run on dirty gases like well-head gas, sewage gas, waste gas, mine gas, wood gas etc. These type of fuels can be severely contaminated, low ignitability (low BTU) or contain aggressive elements. It requires a precise spark plug choice. Industrial spark plug form an exceptional spark plug family and are commonly only available through specialist sales parties. Hatraco is more than happy to help you personally and to specify the best plug for your application. This is why you will not find our spark plug program in a web-shop.
Hatraco is the best address for advice and supply of industrial spark plugs. Not only do we offer the largest program, for decennia already we are recognized by the biggest manufacturers as product specialist. We stay in contact with the specialist engineers that actually design and develop the plugs at the well-known brands that we represent. It allows us to provide you with the best spark plugs available on the aftermarket regardless the make and model of your engine. Additionally, we supply certain OEM special prechamber plugs for engines like Caterpillar, Guascor, MWM and Liebherr or special high performance spark plugs for GE Jenbacher engines with extreme long spark plug life. We work closely with various engineering companies and manufacturers like Bosch, Federal Mogul Beru & Champion and Denso on special spark plug versions. Some of them are exclusive designs and only available through us. Finally, we offer shielded and integral type spark plugs of Champion, Stitt Spark Plug and the BG Service Co. for applications in explosion endangered areas.


Handling the design and style in addition to arrangement for any increased appeal of indoor decor isn't really an easy feat. On the other hand to what you believe, you can find a lot of different aspects to take into consideration about. It's not just about the design but the general layout factor that will create a wow influence with the most convenient and also the almost all minimalist arrangement. You won't need to be considered a specialist indoor decorator to make a classy very own living space of the own. Provided that you know the main aspects of the repair, you should be able to create a remarkable outlook that resembles the ones developed by a specialist decorator. Obtaining the basic of your is not as hard just like you think.
You are able to find the that features a basic or perhaps contemporary design and style. An oldtime design is frequently crafted from wood that has a natural coloring, just like the hue of timber brown. Whilst contemporary designs normally make use of many materials created from aluminum and that is along with wood design. Although there are additional types, make sure you choose furniture with finishing quality and good upholstery, such as varnish techniques and materials, capacity dirt and mud, easy care, and color quality. For extended age along with endurance, it is possible to opt for timber pieces of furniture. As well as organic effect, solid wood has improved sturdiness, than many other materials like aluminum or maybe wood particles.
Do you realize that plays an important role in your house decor? Regardless of how little as well as inconsequential the part is definitely, it can impact the entire atmosphere and in addition functionality of the house. Certainly, we sometimes take it for granted, not knowing it has the crucial make use of until it's ruined or perhaps gone. Exactly what are the advantages you take from it? Consider some of the considerations when selecting products? What exactly elements will need to you consider?
Having the is rather important as it ensures a purpose in addition to the flowing aesthetic of the house. Envision how the home may be like without it. Besides you will see that there will be something missing through the whole layout, you'll observe that the entire harmony in your own home design isn't total, somehow.
Picking out are essentially an easy point, as long as the idea satisfies to the place thought that'll be developed, funds, in addition to needs. The whole could be accomplished by yourself, and never having to seek the advice of or perhaps use inner surface design. In selecting property home furniture not surprisingly you need to observe the superior plus the price. This is because with excellent and value difficulties generally such as a great deal of wrong in picking it. Pertaining to a variety of home furnishings good quality goods do not always have to be highly-priced, most importantly you possibly can decide on a excellent during a expense is not pricey.
For individuals that already get their own residence, surely aren't going to be lost from the category of .All of these tools can be really useful for remodelling the house. Currently, this kind of equipment is very simple to find, since it is widely available anywhere. Different items are made by adapting from the desires of shoppers, so we are incredibly absolutely free to determine which furniture are usually in all of our dwellings. In most nook of your home that we have definitely will be built with furniture in accordance with the purpose and also usefulness since the prices are not cheap, usually, people buy furniture one by one. By getting the most basic furniture first, like bed furniture, kitchen tables, recliners, electronic digital merchandise and cooking eating utensils inside the kitchen.
You need to realise that functionality is most important, and you should also include a little bit of your quality in the design. Even so the suggestions ought to assist and you simply shouldn't rush things when deciding to obtain that you just would like.
Additionally, to think about the size and shape of the property, selecting furniture we should also observe the temperature on the room that will be employed to position the furniture. As this will affect the constant maintenance of your property furnishings. For furniture manufactured from wood, you must input it inside of a cool room. Straightforward furniture made from glass, you can place it in a rather hot room. Provided you can choose the right design, this may give a fantastic effect to the room in your house, and will surely attract a person's eye of anyone that saw it. While the size of your dwelling is not too large, if you normally organise a room and choose the appropriate , you may still feel the home feels roomy and comfortable.