Example #1
0
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;
}
Example #2
0
inline int cmask_all_except_one(int cid) { return 0x7fffffff^cmask_one(cid); }
Example #3
0
inline bool cmask_is_set(int mask, int cid) { return (mask&cmask_one(cid)) != 0; }
Example #4
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;
}