diff -Nur teeworlds-0.4.2-src/src/game/server/gs_common.h teeworlds-0.4.2_insta-src/src/game/server/gs_common.h --- teeworlds-0.4.2-src/src/game/server/gs_common.h 2008-04-05 15:13:02.000000000 +0200 +++ teeworlds-0.4.2_insta-src/src/game/server/gs_common.h 2008-04-06 03:50:14.000000000 +0200 @@ -131,8 +131,10 @@ int round_count; bool is_teamplay; - + public: + char spree_msg[128]; + int gametype; gameobject(); @@ -238,6 +240,9 @@ // player entity class player : public entity { +private: + int spawn_tick; + public: static const int phys_size = 28; @@ -301,6 +306,7 @@ int score; int team; int player_state; // if the client is chatting, accessing a menu or so + unsigned int spree; bool spawning; bool dead; diff -Nur teeworlds-0.4.2-src/src/game/server/gs_game.cpp teeworlds-0.4.2_insta-src/src/game/server/gs_game.cpp --- teeworlds-0.4.2-src/src/game/server/gs_game.cpp 2008-04-05 15:13:02.000000000 +0200 +++ teeworlds-0.4.2_insta-src/src/game/server/gs_game.cpp 2008-04-06 12:45:22.000000000 +0200 @@ -197,12 +197,41 @@ } } +char spree_note[6][64] = { "is on a killing spree!", "is on a rampage!", "is dominating", "is unstoppable!", "is Godlike!", "is Wicked SICK!!" }; + +void broadcast_spree(class player *p1, class player *p2) +{ + NETMSG_SV_BROADCAST msg; + + if(!p2) + str_format(gameobj->spree_msg, sizeof(gameobj->spree_msg), "%s %s", server_clientname(p1->client_id), spree_note[(p1->spree/5)-1]); + else + str_format(gameobj->spree_msg, sizeof(gameobj->spree_msg), "%s's killing spree ended by %s", server_clientname(p1->client_id), server_clientname(p2->client_id)); + + msg.message = gameobj->spree_msg; + msg.pack(MSGFLAG_VITAL); + server_send_msg(-1); +} + +void increment_spree(class player *p) +{ + if(++(p->spree) < 31 && (p->spree)%5 == 0) + broadcast_spree(p, NULL); +} + +void end_spree(class player *victim, class player *killer) +{ + if(victim->spree > 4) + broadcast_spree(victim, killer); + victim->spree = 0; +} int gameobject::on_player_death(class player *victim, class player *killer, int weapon) { // do scoreing if(!killer) return 0; + end_spree(victim, killer); if(killer == victim) victim->score--; // suicide else @@ -211,6 +240,8 @@ killer->score--; // teamkill else killer->score++; // normal kill + increment_spree(killer); + } return 0; } diff -Nur teeworlds-0.4.2-src/src/game/server/gs_server.cpp teeworlds-0.4.2_insta-src/src/game/server/gs_server.cpp --- teeworlds-0.4.2-src/src/game/server/gs_server.cpp 2008-04-05 15:13:02.000000000 +0200 +++ teeworlds-0.4.2_insta-src/src/game/server/gs_server.cpp 2008-04-06 02:31:13.000000000 +0200 @@ -683,6 +683,7 @@ //direction = vec2(0.0f, 1.0f); score = 0; + spree = 0; dead = true; clear_flag(entity::FLAG_PHYSICS); spawning = false; @@ -700,6 +701,7 @@ emote_stop = 0; damage_taken_tick = 0; + spawn_tick = 0; attack_tick = 0; mem_zero(&ninja, sizeof(ninja)); @@ -914,6 +916,7 @@ dead = false; set_flag(entity::FLAG_PHYSICS); player_state = PLAYERSTATE_PLAYING; + spree = 0; core.hook_state = HOOK_IDLE; @@ -921,20 +924,23 @@ // init weapons mem_zero(&weapons, sizeof(weapons)); - weapons[WEAPON_HAMMER].got = true; + /*weapons[WEAPON_HAMMER].got = true; weapons[WEAPON_HAMMER].ammo = -1; weapons[WEAPON_GUN].got = true; - weapons[WEAPON_GUN].ammo = data->weapons[WEAPON_GUN].maxammo; + weapons[WEAPON_GUN].ammo = data->weapons[WEAPON_GUN].maxammo;*/ - /*weapons[WEAPON_RIFLE].got = true; - weapons[WEAPON_RIFLE].ammo = -1;*/ + weapons[WEAPON_RIFLE].got = true; + weapons[WEAPON_RIFLE].ammo = -1; - active_weapon = WEAPON_GUN; - last_weapon = WEAPON_HAMMER; - queued_weapon = 0; + active_weapon = WEAPON_RIFLE; + last_weapon = WEAPON_RIFLE; + queued_weapon = -1; reload_timer = 0; + // Spawn protection + spawn_tick = server_tick(); + // Create sound and spawn effects create_sound(pos, SOUND_PLAYER_SPAWN); create_playerspawn(pos); @@ -1522,7 +1528,11 @@ bool player::take_damage(vec2 force, int dmg, int from, int weapon) { core.vel += force; - + + // Spawn protection + if(server_tick()-spawn_tick <= server_tickspeed()) + return false; + if(gameobj->is_friendly_fire(client_id, from) && !config.sv_teamdamage) return false; @@ -1690,10 +1700,10 @@ subtype = _subtype; proximity_radius = phys_size; - reset(); + //reset(); // TODO: should this be done here? - world->insert_entity(this); + //world->insert_entity(this); } void powerup::reset()