Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37560042
en ru br
Репозитории ALT
S:0.7.5-alt2
5.1: 0.5.1-alt1
www.altlinux.org/Changes

Группа :: Игры/Аркады
Пакет: teeworlds

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: instagib-2.1.patch
Скачать


Index: src/game/server/entities/character.cpp
===================================================================
--- src/game/server/entities/character.cpp	(revision 1841)
+++ src/game/server/entities/character.cpp	(working copy)
@@ -52,9 +52,18 @@
 	player_state = PLAYERSTATE_UNKNOWN;
 	emote_stop = -1;
 	last_action = -1;
-	active_weapon = WEAPON_GUN;
-	last_weapon = WEAPON_HAMMER;
-	queued_weapon = -1;
+	if(game.controller->is_instagib())
+	{
+		active_weapon = WEAPON_RIFLE;
+		last_weapon = WEAPON_RIFLE;
+		queued_weapon = -1;
+	}
+	else
+	{
+		active_weapon = WEAPON_GUN;
+		last_weapon = WEAPON_HAMMER;
+		queued_weapon = -1;
+	}
 	
 	//clear();
 	this->player = player;
@@ -662,6 +671,16 @@
 	dbg_msg("game", "kill killer='%d:%s' victim='%d:%s' weapon=%d special=%d",
 		killer, server_clientname(killer),
 		player->client_id, server_clientname(player->client_id), weapon, mode_special);
+	
+	if(on_spree())
+	{
+		game.create_sound(pos, SOUND_GRENADE_EXPLODE);
+		game.create_explosion(pos, player->client_id, WEAPON_RIFLE, true);
+	}
+	
+	if(game.get_player_char(killer))
+		game.get_player_char(killer)->spree_add();
+	spree_end(killer);
 
 	// send the kill message
 	NETMSG_SV_KILLMSG msg;
@@ -694,12 +713,56 @@
 	player->respawn_tick = server_tick()+server_tickspeed()/2;
 }
 
+char spree_note[4][32] = { "is on a killing spree", "is on a rampage", "is dominating", "is unstoppable" };
+
+void CHARACTER::spree_add()
+{
+	spree++;
+	if(spree % 5 == 0)
+	{
+		int p = (int)spree/5-1;
+		if(p > 3)
+			p = 3;
+		char buf[256];
+		str_format(buf, sizeof(buf), "%s %s with %d kills!", server_clientname(player->client_id), spree_note[p], spree);
+		game.send_chat(-1, GAMECONTEXT::CHAT_ALL, buf);
+	}
+}
+
+void CHARACTER::spree_end(int killer)
+{
+	if(spree >= 5)
+	{
+		char buf[256];
+		str_format(buf, sizeof(buf), "%s killing spree was ended by %s", server_clientname(player->client_id), server_clientname(killer));
+		game.send_chat(-1, GAMECONTEXT::CHAT_ALL, buf);
+	}
+	spree = 0;
+}
+
+bool CHARACTER::on_spree()
+{
+	if(spree >= 5)
+		return true;
+	return false;
+}
+
 bool CHARACTER::take_damage(vec2 force, int dmg, int from, int weapon)
 {
 	core.vel += force;
 	
 	if(game.controller->is_friendly_fire(player->client_id, from) && !config.sv_teamdamage)
 		return false;
+	
+	if(game.controller->is_instagib() && weapon == WEAPON_GAME)
+		return false;
+	
+	if(game.controller->is_instagib())
+	{
+		game.create_sound(pos, SOUND_HIT, -1);
+		die(from, weapon);
+		return true;
+	}
 
 	// player only inflicts half damage on self
 	if(from == player->client_id)
Index: src/game/server/entities/character.hpp
===================================================================
--- src/game/server/entities/character.hpp	(revision 1841)
+++ src/game/server/entities/character.hpp	(working copy)
@@ -83,6 +83,8 @@
 	//int score;
 	int team;
 	int player_state; // if the client is chatting, accessing a menu or so
+	
+	int spree;
 
 	// the player core for the physics	
 	CHARACTER_CORE core;
@@ -113,6 +115,10 @@
 	void fire_weapon();
 
 	void die(int killer, int weapon);
+	
+	void spree_add();
+	void spree_end(int killer);
+	bool on_spree();
 
 	bool take_damage(vec2 force, int dmg, int from, int weapon);	
 
Index: src/game/server/entities/laser.cpp
===================================================================
--- src/game/server/entities/laser.cpp	(revision 1841)
+++ src/game/server/entities/laser.cpp	(working copy)
@@ -1,5 +1,6 @@
 /* copyright (c) 2007 magnus auvinen, see licence.txt for more info */
 #include <engine/e_server_interface.h>
+#include <engine/e_config.h>
 #include <game/generated/g_protocol.hpp>
 #include <game/server/gamecontext.hpp>
 #include "laser.hpp"
@@ -31,7 +32,8 @@
 
 	this->from = from;
 	pos = at;
-	energy = -1;		
+	energy = -1;
+	
 	hit->take_damage(vec2(0,0), tuning.laser_damage, owner, WEAPON_RIFLE);
 	return true;
 }
@@ -72,6 +74,9 @@
 				energy = -1;
 				
 			game.create_sound(pos, SOUND_RIFLE_BOUNCE);
+			
+			if(bounces == 1 && config.sv_laserjumps)
+				game.create_explosion(pos, owner, WEAPON_GAME, false);
 		}
 	}
 	else
Index: src/game/server/entities/pickup.cpp
===================================================================
--- src/game/server/entities/pickup.cpp	(revision 1841)
+++ src/game/server/entities/pickup.cpp	(working copy)
@@ -16,7 +16,8 @@
 	reset();
 
 	// TODO: should this be done here?
-	game.world.insert_entity(this);
+	if(!game.controller->is_instagib())
+		game.world.insert_entity(this);
 }
 
 void PICKUP::reset()
Index: src/game/server/gamecontroller.cpp
===================================================================
--- src/game/server/gamecontroller.cpp	(revision 1841)
+++ src/game/server/gamecontroller.cpp	(working copy)
@@ -29,6 +29,7 @@
 	
 	unbalanced_tick = -1;
 	force_balanced = false;
+	instagib = false;
 	
 	num_spawn_points[0] = 0;
 	num_spawn_points[1] = 0;
@@ -331,10 +332,18 @@
 	chr->health = 10;
 	
 	// give default weapons
-	chr->weapons[WEAPON_HAMMER].got = 1;
-	chr->weapons[WEAPON_HAMMER].ammo = -1;
-	chr->weapons[WEAPON_GUN].got = 1;
-	chr->weapons[WEAPON_GUN].ammo = 10;
+	if(is_instagib())
+	{
+		chr->weapons[WEAPON_RIFLE].got = 1;
+		chr->weapons[WEAPON_RIFLE].ammo = -1;
+	}
+	else
+	{
+		chr->weapons[WEAPON_HAMMER].got = 1;
+		chr->weapons[WEAPON_HAMMER].ammo = -1;
+		chr->weapons[WEAPON_GUN].got = 1;
+		chr->weapons[WEAPON_GUN].ammo = 10;
+	}
 }
 
 void GAMECONTROLLER::do_warmup(int seconds)
@@ -472,7 +481,17 @@
 	server_setbrowseinfo(gametype, prog);
 }
 
+void GAMECONTROLLER::make_instagib(char *new_gametype)
+{
+	instagib = true;
+	gametype = new_gametype;
+}
 
+bool GAMECONTROLLER::is_instagib() const
+{
+	return instagib;
+}
+
 bool GAMECONTROLLER::is_teamplay() const
 {
 	return game_flags&GAMEFLAG_TEAMS;
Index: src/game/server/gamecontroller.hpp
===================================================================
--- src/game/server/gamecontroller.hpp	(revision 1841)
+++ src/game/server/gamecontroller.hpp	(working copy)
@@ -51,9 +51,13 @@
 	int unbalanced_tick;
 	bool force_balanced;
 	
+	bool instagib;
+	
 public:
 	const char *gametype;
 
+	void make_instagib(char *gametype);
+	bool is_instagib() const;
 	bool is_teamplay() const;
 	
 	GAMECONTROLLER();
Index: src/game/server/hooks.cpp
===================================================================
--- src/game/server/hooks.cpp	(revision 1841)
+++ src/game/server/hooks.cpp	(working copy)
@@ -529,7 +529,22 @@
 	//players = new PLAYER[MAX_CLIENTS];
 
 	// select gametype
-	if(strcmp(config.sv_gametype, "mod") == 0)
+	if(strcmp(config.sv_gametype, "ictf") == 0)
+	{
+		game.controller = new GAMECONTROLLER_CTF;
+		game.controller->make_instagib("iCTF");
+	}
+	else if(strcmp(config.sv_gametype, "itdm") == 0)
+	{
+		game.controller = new GAMECONTROLLER_TDM;
+		game.controller->make_instagib("iTDM");
+	}
+	else if(strcmp(config.sv_gametype, "idm") == 0)
+	{
+		game.controller = new GAMECONTROLLER_DM;
+		game.controller->make_instagib("iDM");
+	}
+	else if(strcmp(config.sv_gametype, "mod") == 0)
 		game.controller = new GAMECONTROLLER_MOD;
 	else if(strcmp(config.sv_gametype, "ctf") == 0)
 		game.controller = new GAMECONTROLLER_CTF;
Index: src/game/variables.hpp
===================================================================
--- src/game/variables.hpp	(revision 1841)
+++ src/game/variables.hpp	(working copy)
@@ -71,3 +71,6 @@
 MACRO_CONFIG_INT(dbg_focus, 0, 0, 1, CFGFLAG_CLIENT, "")
 MACRO_CONFIG_INT(dbg_tuning, 0, 0, 1, CFGFLAG_CLIENT, "")
+
+/* instagib */
+MACRO_CONFIG_INT(sv_laserjumps, 1, 0, 1, CFGFLAG_SERVER, "Enable laser jumps")
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin