bool CHARACTER::take_damage(vec2 force, int dmg, int from, int weapon) { if(!game.controller->is_race() || (game.controller->is_race() && (from == player->client_id || config.sv_enemy_damage))) if(!game.players[from]->get_character()) return false; core.vel += force; if(game.controller->is_friendly_fire(player->client_id, from) && !config.sv_teamdamage) return false; // player only inflicts half damage on self if(from == player->client_id) dmg = max(1, dmg/2); if(((from == player->client_id && !config.sv_rocket_jump_damage) || (weapon == WEAPON_HAMMER && !config.sv_hammer_damage) || !config.sv_enemy_damage) && game.controller->is_race()) dmg = 0; if(config.sv_water_oxygen && weapon == WEAPON_WORLD) dmg = 1; if(col_get_afk((int)pos.x, (int)pos.y) || col_get_ninjafly((int)pos.x, (int)pos.y)){ dmg = 0; } damage_taken++; // create healthmod indicator if(server_tick() < damage_taken_tick+25) { // make sure that the damage indicators doesn't group together game.create_damageind(pos, damage_taken*0.25f, dmg); } else { damage_taken = 0; game.create_damageind(pos, 0, dmg); } if(dmg) { if(!config.sv_water_oxygen && armor) { if(dmg > 1) { health--; dmg--; } if(dmg > armor) { dmg -= armor; armor = 0; } else { armor -= dmg; dmg = 0; } } health -= dmg; } damage_taken_tick = server_tick(); // do damage hit sound if(from >= 0 && from != player->client_id && game.players[from]) game.create_sound(game.players[from]->view_pos, SOUND_HIT, cmask_one(from)); // check for death if(health <= 0) { die(from, weapon); // set attacker's face to happy (taunt!) if (from >= 0 && from != player->client_id && game.players[from]) { CHARACTER *chr = game.players[from]->get_character(); if (chr) { chr->emote_type = EMOTE_HAPPY; chr->emote_stop = server_tick() + server_tickspeed(); } } return false; } if (dmg > 2) game.create_sound(pos, SOUND_PLAYER_PAIN_LONG); else game.create_sound(pos, SOUND_PLAYER_PAIN_SHORT); emote_type = EMOTE_PAIN; emote_stop = server_tick() + 500 * server_tickspeed() / 1000; // spawn blood? return true; }
inline int cmask_all_except_one(int cid) { return 0x7fffffff^cmask_one(cid); }
inline bool cmask_is_set(int mask, int cid) { return (mask&cmask_one(cid)) != 0; }
bool BUILDING::take_damage(vec2 force, int dmg, int from, int weapon) { if(from >= 0 && game.players[from] && game.players[from]->team == team && !config.sv_buildings_ff) //No friendly fire D= return false; if(from >= 0 && game.players[from] && game.players[from]->get_character() && game.players[from]->get_character()->damage_buff) { dmg += 1; } damage_taken++; // create healthmod indicator if(server_tick() < damage_taken_tick+25 && !decon) { // make sure that the damage indicators doesn't group together game.create_damageind(pos, damage_taken*0.25f, dmg); } else if(!decon) { damage_taken = 0; game.create_damageind(pos, 0, dmg); } if(dmg) { health -= dmg; } damage_taken_tick = server_tick(); if(damage_tick+150 < server_tick()) { damage_tick = server_tick(); if(health < maxhealth / 4) { if(type == B_REACTOR) { int target = GAMECONTEXT::CHAT_RED; if(team == 1) target = GAMECONTEXT::CHAT_BLUE; game.send_chat(-1, target, "The reactor is badly damaged!"); } } else { if(type == B_REACTOR) { int target = GAMECONTEXT::CHAT_RED; if(team == 1) target = GAMECONTEXT::CHAT_BLUE; game.send_chat(-1, target, "The reactor is under attack!"); } } } // do damage hit sound if(from >= 0 && game.players[from]) { game.create_sound(game.players[from]->view_pos, SOUND_HIT, cmask_one(from)); if(game.players[from]->team != team) game.players[from]->rage = min(100, game.players[from]->rage+dmg*config.sv_rage_modifier); else game.players[from]->rage = max(0, game.players[from]->rage-dmg*config.sv_rage_modifier); } // check for death if(health <= 0) { die(from, weapon); // set attacker's face to happy (taunt!) if (from >= 0 && game.players[from]) { CHARACTER *chr = game.players[from]->get_character(); if (chr && game.players[from]->team != team) { chr->emote_type = EMOTE_HAPPY; chr->emote_stop = server_tick() + server_tickspeed(); } } return false; } return true; }