r5009 - in trunk/data: . gfx qcsrc/client qcsrc/common qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Nov 7 15:46:11 EST 2008
Author: div0
Date: 2008-11-07 15:46:11 -0500 (Fri, 07 Nov 2008)
New Revision: 5009
Added:
trunk/data/gfx/sb_flag_blue_shielded.tga
trunk/data/gfx/sb_flag_red_shielded.tga
Modified:
trunk/data/build-compat-pack.sh
trunk/data/defaultNexuiz.cfg
trunk/data/gfx/sb_kh_full.tga
trunk/data/gfx/sb_kh_outline.tga
trunk/data/gfx/sb_playercolor_pants.tga
trunk/data/gfx/sb_playercolor_shirt.tga
trunk/data/qcsrc/client/sbar.qc
trunk/data/qcsrc/common/constants.qh
trunk/data/qcsrc/server/ctf.qc
trunk/data/qcsrc/server/miscfunctions.qc
Log:
Modified: trunk/data/build-compat-pack.sh
===================================================================
--- trunk/data/build-compat-pack.sh 2008-11-07 20:44:46 UTC (rev 5008)
+++ trunk/data/build-compat-pack.sh 2008-11-07 20:46:11 UTC (rev 5009)
@@ -23,6 +23,8 @@
gfx/runningman_1on1remix_mini.tga
gfx/runningmanctf_mini.tga
gfx/runningman_mini.tga
+ gfx/sb_flag_blue_shielded.tga
+ gfx/sb_flag_red_shielded.tga
gfx/sb_kh_full.tga
gfx/sb_kh_outline.tga
gfx/sb_playercolor_base.tga
@@ -156,6 +158,7 @@
sound/kh/collect.wav
sound/kh/destroy.wav
sound/kh/drop.wav
+ sound/misc/armor10.wav
sound/misc/armor1.wav
sound/misc/armor25.wav
sound/misc/footstep01.wav
@@ -217,6 +220,22 @@
sound/player/carni-lycan/player/pain50.ogg
sound/player/carni-lycan/player/pain75.ogg
sound/player/default.sounds
+ sound/player/fricka/coms/attackinfive.ogg
+ sound/player/fricka/coms/attack.ogg
+ sound/player/fricka/coms/coverme.ogg
+ sound/player/fricka/coms/defend.ogg
+ sound/player/fricka/coms/flagseen.ogg
+ sound/player/fricka/coms/freelance1.ogg
+ sound/player/fricka/coms/freelance2.ogg
+ sound/player/fricka/coms/incoming.ogg
+ sound/player/fricka/coms/taunt1.ogg
+ sound/player/fricka/coms/taunt2.ogg
+ sound/player/fricka/coms/taunt3.ogg
+ sound/player/fricka/coms/taunt4.ogg
+ sound/player/fricka/coms/teamshoot1.ogg
+ sound/player/fricka/coms/teamshoot2.ogg
+ sound/player/fricka/coms/teamshoot3.ogg
+ sound/player/fricka/coms/waypoint.ogg
sound/player/fricka/player/death1.ogg
sound/player/fricka/player/death2.ogg
sound/player/fricka/player/death3.ogg
@@ -277,6 +296,7 @@
sound/player/marine/coms/teamshoot1.ogg
sound/player/marine/coms/teamshoot2.ogg
sound/player/marine/coms/teamshoot3.ogg
+ sound/player/marine/coms/teamshoot4.ogg
sound/player/marine/player/death1.ogg
sound/player/marine/player/death2.ogg
sound/player/marine/player/death3.ogg
@@ -289,6 +309,26 @@
sound/player/marine/player/pain25.ogg
sound/player/marine/player/pain50.ogg
sound/player/marine/player/pain75.ogg
+ sound/player/pyria-skadi/coms/attack1.ogg
+ sound/player/pyria-skadi/coms/attack2.ogg
+ sound/player/pyria-skadi/coms/attackinfive.ogg
+ sound/player/pyria-skadi/coms/coverme.ogg
+ sound/player/pyria-skadi/coms/defend.ogg
+ sound/player/pyria-skadi/coms/freelance1.ogg
+ sound/player/pyria-skadi/coms/freelance2.ogg
+ sound/player/pyria-skadi/coms/incoming.ogg
+ sound/player/pyria-skadi/coms/meet.ogg
+ sound/player/pyria-skadi/coms/needhelp1.ogg
+ sound/player/pyria-skadi/coms/seenflag.ogg
+ sound/player/pyria-skadi/coms/taunt1.ogg
+ sound/player/pyria-skadi/coms/taunt2.ogg
+ sound/player/pyria-skadi/coms/taunt3.ogg
+ sound/player/pyria-skadi/coms/taunt4.ogg
+ sound/player/pyria-skadi/coms/taunt5.ogg
+ sound/player/pyria-skadi/coms/teamshoot1.ogg
+ sound/player/pyria-skadi/coms/teamshoot2.ogg
+ sound/player/pyria-skadi/coms/teamshoot3.ogg
+ sound/player/pyria-skadi/coms/teamshoot4.ogg
sound/player/pyria-skadi/player/death1.ogg
sound/player/pyria-skadi/player/death2.ogg
sound/player/pyria-skadi/player/death3.ogg
@@ -330,6 +370,7 @@
sound/player/reptilian/player/pain25.ogg
sound/player/reptilian/player/pain50.ogg
sound/player/reptilian/player/pain75.ogg
+ sound/player/slime.wav
sound/player/soldier/coms/attackinfive.ogg
sound/player/soldier/coms/attack.ogg
sound/player/soldier/coms/coverme.ogg
@@ -375,9 +416,11 @@
sound/player/specop/coms/taunt1.ogg
sound/player/specop/coms/taunt2.ogg
sound/player/specop/coms/taunt3.ogg
+ sound/player/specop/coms/taunt4.ogg
sound/player/specop/coms/teamshoot1.ogg
sound/player/specop/coms/teamshoot2.ogg
sound/player/specop/coms/teamshoot3.ogg
+ sound/player/specop/coms/teamshoot4.ogg
sound/player/specop/player/death1.ogg
sound/player/specop/player/death2.ogg
sound/player/specop/player/death3.ogg
@@ -415,12 +458,19 @@
sound/porto/explode.ogg
sound/porto/fire.ogg
sound/porto/unsupported.ogg
+ sound/weapons/crylink_fire2.ogg
sound/weapons/crylink_fire.ogg
+ sound/weapons/crylink_impact2.ogg
+ sound/weapons/crylink_impact.ogg
sound/weapons/electro_bounce.ogg
sound/weapons/electro_fire2.ogg
sound/weapons/electro_fire.ogg
sound/weapons/electro_fly.wav
sound/weapons/electro_impact.ogg
+ sound/weapons/flacexp1.ogg
+ sound/weapons/flacexp2.ogg
+ sound/weapons/flacexp3.ogg
+ sound/weapons/flac_fire.ogg
sound/weapons/grenade_bounce1.ogg
sound/weapons/grenade_bounce2.ogg
sound/weapons/grenade_bounce3.ogg
@@ -443,8 +493,18 @@
sound/weapons/rocket_fire.ogg
sound/weapons/rocket_fly.wav
sound/weapons/rocket_impact.ogg
+ sound/weapons/seekerexp1.ogg
+ sound/weapons/seekerexp2.ogg
+ sound/weapons/seekerexp3.ogg
+ sound/weapons/seeker_fire.ogg
sound/weapons/shotgun_fire.ogg
sound/weapons/strength_fire.ogg
+ sound/weapons/tagexp1.ogg
+ sound/weapons/tagexp2.ogg
+ sound/weapons/tagexp3.ogg
+ sound/weapons/tag_fire.ogg
+ sound/weapons/tag_impact.ogg
+ sound/weapons/tag_rocket_fly.wav
sound/weapons/uzi_fire.ogg
sound/weapons/weaponpickup.ogg
sound/weapons/weapon_switch.ogg
@@ -462,64 +522,6 @@
textures/portalgun_glow.tga
textures/portalgun_norm.tga
textures/portalgun.tga
- sound/weapons/crylink_impact.ogg
- sound/weapons/crylink_impact2.ogg
- sound/weapons/crylink_fire2.ogg
- sound/weapons/tag_fire.ogg
- sound/weapons/tag_impact.ogg
- sound/weapons/tagexp1.ogg
- sound/weapons/tagexp2.ogg
- sound/weapons/tagexp3.ogg
- sound/weapons/flac_fire.ogg
- sound/weapons/flacexp1.ogg
- sound/weapons/flacexp2.ogg
- sound/weapons/flacexp3.ogg
- sound/weapons/seeker_fire.ogg
- sound/weapons/seekerexp1.ogg
- sound/weapons/seekerexp2.ogg
- sound/weapons/seekerexp3.ogg
- sound/misc/armor10.wav
- sound/player/specop/coms/taunt4.ogg
- sound/player/specop/coms/teamshoot4.ogg
- sound/player/fricka/coms/freelance1.ogg
- sound/player/fricka/coms/freelance2.ogg
- sound/player/fricka/coms/attack.ogg
- sound/player/fricka/coms/attackinfive.ogg
- sound/player/fricka/coms/waypoint.ogg
- sound/player/fricka/coms/taunt1.ogg
- sound/player/fricka/coms/taunt2.ogg
- sound/player/fricka/coms/taunt3.ogg
- sound/player/fricka/coms/taunt4.ogg
- sound/player/fricka/coms/teamshoot1.ogg
- sound/player/fricka/coms/flagseen.ogg
- sound/player/fricka/coms/defend.ogg
- sound/player/fricka/coms/teamshoot2.ogg
- sound/player/fricka/coms/teamshoot3.ogg
- sound/player/fricka/coms/coverme.ogg
- sound/player/fricka/coms/incoming.ogg
- sound/player/slime.wav
- sound/player/marine/coms/teamshoot4.ogg
- sound/player/pyria-skadi/coms/freelance1.ogg
- sound/player/pyria-skadi/coms/needhelp1.ogg
- sound/player/pyria-skadi/coms/freelance2.ogg
- sound/player/pyria-skadi/coms/attackinfive.ogg
- sound/player/pyria-skadi/coms/taunt1.ogg
- sound/player/pyria-skadi/coms/taunt2.ogg
- sound/player/pyria-skadi/coms/taunt3.ogg
- sound/player/pyria-skadi/coms/taunt4.ogg
- sound/player/pyria-skadi/coms/taunt5.ogg
- sound/player/pyria-skadi/coms/teamshoot1.ogg
- sound/player/pyria-skadi/coms/seenflag.ogg
- sound/player/pyria-skadi/coms/defend.ogg
- sound/player/pyria-skadi/coms/teamshoot2.ogg
- sound/player/pyria-skadi/coms/teamshoot3.ogg
- sound/player/pyria-skadi/coms/teamshoot4.ogg
- sound/player/pyria-skadi/coms/attack1.ogg
- sound/player/pyria-skadi/coms/attack2.ogg
- sound/player/pyria-skadi/coms/meet.ogg
- sound/player/pyria-skadi/coms/coverme.ogg
- sound/player/pyria-skadi/coms/incoming.ogg
- sound/weapons/tag_rocket_fly.wav
"
rev=`svnversion`
Modified: trunk/data/defaultNexuiz.cfg
===================================================================
--- trunk/data/defaultNexuiz.cfg 2008-11-07 20:44:46 UTC (rev 5008)
+++ trunk/data/defaultNexuiz.cfg 2008-11-07 20:46:11 UTC (rev 5009)
@@ -395,6 +395,10 @@
set g_ctf_reverse 0 // when 1, bases/flags are switched :P you have to capture your OWN flag by bringing it to the ENEMY's
set g_balance_ctf_delay_collect 1.0
set g_balance_ctf_damageforcescale 1
+
+set g_ctf_shield_max_ratio 0 // shield at most 0% of a team from the enemy flag (try: 0.4 for 40%)
+set g_ctf_shield_min_negscore 20 // shield the player from the flag if he's got -20 points or less
+set g_ctf_shield_force 100 // push force of the shield
exec ctfscoring-nex242.cfg
Added: trunk/data/gfx/sb_flag_blue_shielded.tga
===================================================================
(Binary files differ)
Property changes on: trunk/data/gfx/sb_flag_blue_shielded.tga
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/data/gfx/sb_flag_red_shielded.tga
===================================================================
(Binary files differ)
Property changes on: trunk/data/gfx/sb_flag_red_shielded.tga
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: trunk/data/gfx/sb_kh_full.tga
===================================================================
(Binary files differ)
Modified: trunk/data/gfx/sb_kh_outline.tga
===================================================================
(Binary files differ)
Modified: trunk/data/gfx/sb_playercolor_pants.tga
===================================================================
(Binary files differ)
Modified: trunk/data/gfx/sb_playercolor_shirt.tga
===================================================================
(Binary files differ)
Modified: trunk/data/qcsrc/client/sbar.qc
===================================================================
--- trunk/data/qcsrc/client/sbar.qc 2008-11-07 20:44:46 UTC (rev 5008)
+++ trunk/data/qcsrc/client/sbar.qc 2008-11-07 20:46:11 UTC (rev 5009)
@@ -1781,8 +1781,8 @@
vector pos;
stat_items = getstati(STAT_ITEMS);
- redflag = (stat_items/32768) & 3;
- blueflag = (stat_items/131072) & 3;
+ redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3;
+ blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3;
/**
* FTEQCC BUG!
@@ -1814,6 +1814,10 @@
case 1: drawpic(pos, "gfx/sb_flag_red_taken", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
case 2: drawpic(pos, "gfx/sb_flag_red_lost", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
case 3: drawpic(pos, "gfx/sb_flag_red_carrying", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
+ default:
+ if(stat_items & IT_CTF_SHIELDED)
+ if(myteam == COLOR_TEAM2)
+ drawpic(pos, "gfx/sb_flag_red_shielded", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
}
pos_y -= 64;
@@ -1823,5 +1827,9 @@
case 1: drawpic(pos, "gfx/sb_flag_blue_taken", '0 0 0', '1 1 1', 1, 0); break;
case 2: drawpic(pos, "gfx/sb_flag_blue_lost", '0 0 0', '1 1 1', 1, 0); break;
case 3: drawpic(pos, "gfx/sb_flag_blue_carrying", '0 0 0', '1 1 1', 1, 0); break;
+ default:
+ if(stat_items & IT_CTF_SHIELDED)
+ if(myteam == COLOR_TEAM1)
+ drawpic(pos, "gfx/sb_flag_blue_shielded", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
}
}
Modified: trunk/data/qcsrc/common/constants.qh
===================================================================
--- trunk/data/qcsrc/common/constants.qh 2008-11-07 20:44:46 UTC (rev 5008)
+++ trunk/data/qcsrc/common/constants.qh 2008-11-07 20:46:11 UTC (rev 5009)
@@ -325,6 +325,7 @@
// when this bit is set, using a superweapon does not throw it away. Checkpoints can give this powerup.
float IT_UNLIMITED_AMMO = 3;
// both of these combined
+float IT_CTF_SHIELDED = 4; // set for the flag shield
float IT_SHELLS = 256;
float IT_NAILS = 512;
float IT_ROCKETS = 1024;
Modified: trunk/data/qcsrc/server/ctf.qc
===================================================================
--- trunk/data/qcsrc/server/ctf.qc 2008-11-07 20:44:46 UTC (rev 5008)
+++ trunk/data/qcsrc/server/ctf.qc 2008-11-07 20:46:11 UTC (rev 5009)
@@ -13,6 +13,111 @@
#define FLAG_CARRY_POS '-15 0 7'
+.float ctf_captureshielded; // set to 1 if the player is too bad to be allowed to capture
+
+float captureshield_min_negscore; // punish at -20 points
+float captureshield_max_ratio; // punish at most 30% of each team
+float captureshield_force; // push force of the shield
+
+float ctf_captureshield_shielded(entity p)
+{
+ float s, se;
+ entity e;
+ float players_worseeq, players_total;
+
+ if(captureshield_max_ratio <= 0)
+ return FALSE;
+
+ s = PlayerScore_Add(p, SP_SCORE, 0);
+ if(s >= -captureshield_min_negscore)
+ return FALSE;
+
+ players_total = players_worseeq = 0;
+ FOR_EACH_PLAYER(e)
+ {
+ if(e.team != p.team)
+ continue;
+ se = PlayerScore_Add(e, SP_SCORE, 0);
+ if(se <= s)
+ ++players_worseeq;
+ ++players_total;
+ }
+
+ // player is in the worse half, if >= half the players are better than him, or consequently, if < half of the players are worse
+ // use this rule here
+
+ if(players_worseeq >= players_total * captureshield_max_ratio)
+ return FALSE;
+
+ return TRUE;
+}
+
+void ctf_captureshield_update(entity p, float dir)
+{
+ float should;
+ if(dir == p.ctf_captureshielded) // 0: shield only, 1: unshield only
+ {
+ should = ctf_captureshield_shielded(p);
+ if(should != dir)
+ {
+ if(should)
+ {
+ centerprint_atprio(p, CENTERPRIO_SHIELDING, "^3You are now ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Make some defensive scores before trying again.");
+ // TODO csqc notifier for this
+ }
+ else
+ {
+ centerprint_atprio(p, CENTERPRIO_SHIELDING, "^3You are now free.\n\n^3Feel free to ^1try to capture^3 the flag again\n^3if you think you will succeed.");
+ // TODO csqc notifier for this
+ }
+ p.ctf_captureshielded = should;
+ }
+ }
+}
+
+float ctf_captureshield_customize()
+{
+ if not(other.ctf_captureshielded)
+ return FALSE;
+ if(self.team == other.team)
+ return FALSE;
+ return TRUE;
+}
+
+void ctf_captureshield_touch()
+{
+ if not(other.ctf_captureshielded)
+ return;
+ if(self.team == other.team)
+ return;
+ vector mymid;
+ vector othermid;
+ mymid = (self.absmin + self.absmax) * 0.5;
+ othermid = (other.absmin + other.absmax) * 0.5;
+ Damage(other, self, self, 0, DEATH_HURTTRIGGER, mymid, normalize(othermid - mymid) * captureshield_force);
+ centerprint_atprio(other, CENTERPRIO_SHIELDING, "^3You are ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Get some defensive scores before trying again.");
+}
+
+void ctf_captureshield_spawn()
+{
+ entity e;
+ e = spawn();
+ e.enemy = self;
+ e.team = self.team;
+ e.touch = ctf_captureshield_touch;
+ e.customizeentityforclient = ctf_captureshield_customize;
+ e.classname = "ctf_captureshield";
+ e.effects = EF_ADDITIVE;
+ e.movetype = MOVETYPE_NOCLIP;
+ e.solid = SOLID_TRIGGER;
+ e.avelocity = '7 0 11';
+ setorigin(e, self.origin);
+ setmodel(e, "models/onslaught/generator_shield.md3");
+ e.scale = 0.5;
+ setsize(e, e.scale * e.mins, e.scale * e.maxs);
+ print(etos(e), "\n");
+}
+
float ctf_score_value(string parameter)
{
if(g_ctf_win_mode != 2)
@@ -70,6 +175,7 @@
droptofloor();
self.movetype = MOVETYPE_TOSS;
}
+ InitializeEntity(self, ctf_captureshield_spawn, INITPRIO_SETLOCATION);
};
void LogCTF(string mode, float flagteam, entity actor)
@@ -143,6 +249,7 @@
else
UpdateFrags(p, -ctf_score_value("penalty_drop"));
PlayerScore_Add(p, SP_CTF_DROPS, +1);
+ ctf_captureshield_update(p, 0); // shield only
e.playerid = attacker.playerid;
e.ctf_droptime = time;
@@ -191,6 +298,12 @@
self.nextthink = time + 0.1;
+ if(self == ctf_worldflaglist) // only for the first flag
+ {
+ FOR_EACH_CLIENT(e)
+ ctf_captureshield_update(e, 1); // release shield only
+ }
+
AnimateFlag();
if(self.speedrunning)
@@ -318,6 +431,7 @@
if (other.team == COLOR_TEAM1 || other.team == COLOR_TEAM2) // only red and blue team can steal flags
if (other.team != self.team)
if (!other.flagcarried)
+ if (!other.ctf_captureshielded)
{
if (other.next_take_time > time)
return;
@@ -365,7 +479,10 @@
// punish the player who last had it
FOR_EACH_PLAYER(player)
if(player.playerid == self.dropperid)
+ {
PlayerScore_Add(player, SP_SCORE, -ctf_score_value("penalty_returned"));
+ ctf_captureshield_update(player, 0); // shield only
+ }
// punish the team who was last carrying it
if(self.team == COLOR_TEAM1)
@@ -584,6 +701,8 @@
WaypointSprite_SpawnFixed("redbase", self.origin + '0 0 37', self, sprite);
WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, '1 0 0');
+
+ precache_model("models/onslaught/generator_shield.md3");
};
/*QUAKED spawnfunc_item_flag_team2 (0 0.5 0.8) (-48 -48 -24) (48 48 64)
@@ -676,6 +795,8 @@
WaypointSprite_SpawnFixed("bluebase", self.origin + '0 0 37', self, sprite);
WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, '0 0 1');
+
+ precache_model("models/onslaught/generator_shield.md3");
};
@@ -744,6 +865,10 @@
{
InitializeEntity(world, ctf_delayedinit, INITPRIO_GAMETYPE);
flagcaptimerecord = stof(db_get(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time")));
+
+ captureshield_min_negscore = cvar("g_ctf_shield_min_negscore");
+ captureshield_max_ratio = cvar("g_ctf_shield_max_ratio");
+ captureshield_force = cvar("g_ctf_shield_force");
};
void ctf_setstatus2(entity flag, float shift)
@@ -763,15 +888,19 @@
void ctf_setstatus()
{
- self.items = self.items - (self.items & IT_RED_FLAG_TAKEN);
- self.items = self.items - (self.items & IT_RED_FLAG_LOST);
- self.items = self.items - (self.items & IT_BLUE_FLAG_TAKEN);
- self.items = self.items - (self.items & IT_BLUE_FLAG_LOST);
+ self.items (-) IT_RED_FLAG_TAKEN;
+ self.items (-) IT_RED_FLAG_LOST;
+ self.items (-) IT_BLUE_FLAG_TAKEN;
+ self.items (-) IT_BLUE_FLAG_LOST;
+ self.items (-) IT_CTF_SHIELDED;
if (g_ctf) {
local entity flag;
float redflags, blueflags;
+ if(self.ctf_captureshielded)
+ self.items |= IT_CTF_SHIELDED;
+
redflags = 0;
blueflags = 0;
Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc 2008-11-07 20:44:46 UTC (rev 5008)
+++ trunk/data/qcsrc/server/miscfunctions.qc 2008-11-07 20:46:11 UTC (rev 5009)
@@ -627,6 +627,7 @@
#define CENTERPRIO_REBALANCE 2
#define CENTERPRIO_VOTE 4
#define CENTERPRIO_NORMAL 5
+#define CENTERPRIO_SHIELDING 7
#define CENTERPRIO_MAPVOTE 9
#define CENTERPRIO_IDLEKICK 50
#define CENTERPRIO_ADMIN 99
More information about the nexuiz-commits
mailing list