seta crosshair_color_by_health 0 "if enabled, crosshair color will depend on current health"
// ring around crosshair, used for various purposes (such as indicating bullets left in clip, nex charge)
+seta crosshair_ring 1 "main cvar to enable or disable crosshair rings"
+seta crosshair_ring_inner 0 "allow inner rings to be drawn too"
seta crosshair_ring_size 2 "bullet counter ring size for Rifle, velocity ring for Nex"
seta crosshair_ring_alpha 0.2 "ring alpha"
+seta crosshair_ring_sniperrifle 1 "draw a ring showing the ammount of ammo left in the sniperrifle
seta crosshair_ring_sniperrifle_alpha 0.15
-seta crosshair_ring_nex_outer_alpha 0.15
+seta crosshair_ring_nex 1 "draw a ring showing the current charge of the nexgun"
+seta crosshair_ring_nex_alpha 0.15
seta crosshair_ring_nex_inner_alpha 0.15
seta crosshair_ring_nex_inner_color_red 0.8
seta crosshair_ring_nex_inner_color_green 0
seta crosshair_ring_nex_currentcharge_scale 30
seta crosshair_ring_nex_currentcharge_movingavg_rate 0.05
+seta crosshair_ring_minelayer 1
+seta crosshair_ring_minelayer_alpha 0.15
+
seta cl_reticle_stretch 0 "whether to stretch reticles so they fit the screen (brakes image proportions)"
seta cl_reticle_item_nex 1 "draw aiming reticle for the nex weapon's zoom, 0 disables and values between 0 and 1 change alpha"
seta cl_reticle_item_normal 1 "draw reticle when zooming with the zoom button, 0 disables and values between 0 and 1 change alpha"
float sniperrifle_scope;
float nex_scope;
+float minelayer_maxmines;
+
float bgmtime;
string weaponorder_byimpulse;
serverflags = ReadByte();
+ minelayer_maxmines = ReadByte();
+
g_trueaim_minrange = ReadCoord();
if(!postinit)
// TrueAim check
float shottype;
+
float weapon_clipload, weapon_clipsize, ring_scale;
+
// wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
wcross_origin = project_3d_to_2d(view_origin + MAX_SHOT_DISTANCE * view_forward);
wcross_origin_z = 0;
wcross_scale *= 1 - autocvar__menu_alpha;
wcross_alpha *= 1 - autocvar__menu_alpha;
-
- ring_scale = autocvar_crosshair_ring_size;
-
wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
- float nex_charge, nex_chargepool;
- nex_charge = getstatf(STAT_NEX_CHARGE);
- nex_chargepool = getstatf(STAT_NEX_CHARGEPOOL);
-
- if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
- nex_charge_movingavg = nex_charge;
-
- // ring around crosshair representing ammo left in weapon clip
- weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD);
- if (weapon_clipload)
+ if (autocvar_crosshair_ring)
{
- weapon_clipsize = getstati(STAT_WEAPON_CLIPSIZE);
- f = bound(0, weapon_clipload / weapon_clipsize, 1);
+ float ring_value, ring_alpha, ring_inner_value, ring_inner_alpha;
+ string ring_image, ring_inner_image;
+ vector ring_rgb, ring_inner_rgb;
+
+ float ring_scale = autocvar_crosshair_ring_size;
+
+ float nex_charge, nex_chargepool;
+ nex_charge = getstatf(STAT_NEX_CHARGE);
+ nex_chargepool = getstatf(STAT_NEX_CHARGEPOOL);
+
+ if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
+ nex_charge_movingavg = nex_charge;
- a = autocvar_crosshair_ring_sniperrifle_alpha;
- DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", f, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE);
- }
- if (activeweapon == WEP_NEX && nex_charge) // ring around crosshair representing velocity-dependent damage for the nex
- {
- if(nex_chargepool || use_nex_chargepool)
+ weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD);
+ if (weapon_clipload) // ring around crosshair representing ammo left in weapon clip
{
- use_nex_chargepool = 1;
-
- a = autocvar_crosshair_ring_nex_inner_alpha;
- rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
- DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", nex_chargepool, rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE);
+ weapon_clipsize = getstati(STAT_WEAPON_CLIPSIZE);
+ f = bound(0, weapon_clipload / weapon_clipsize, 1);
+ a = autocvar_crosshair_ring_sniperrifle_alpha;
+
+ ring_value = f;
+ ring_alpha = a;
+ ring_image = "gfx/crosshair_ring_sniperrifle.tga";
+ ring_rgb = wcross_color;
}
- else
+ else if (activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex
{
- // indicate how much we're charging right now with an inner circle
- a = autocvar_crosshair_ring_nex_inner_alpha;
- nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge;
-
- rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
- DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1), rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE);
+ if (nex_chargepool || use_nex_chargepool) {
+ use_nex_chargepool = 1;
+ ring_inner_value = nex_chargepool;
+ } else {
+ nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge;
+ ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1);
+ }
+
+ ring_inner_alpha = wcross_alpha * autocvar_crosshair_ring_nex_inner_alpha;
+ ring_inner_image = "gfx/crosshair_ring_inner.tga";
+ ring_inner_rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
+
+ // draw the outer ring to show the current charge of the weapon
+ ring_value = nex_charge;
+ ring_alpha = wcross_alpha * autocvar_crosshair_ring_nex_alpha;
+ ring_image = "gfx/crosshair_ring_nexgun.tga";
+ ring_rgb = wcross_color;
}
-
- // draw the charge
- a = autocvar_crosshair_ring_nex_outer_alpha;
- DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", nex_charge, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE);
+ else if (activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer)
+ {
+ ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to.
+ ring_alpha = wcross_alpha * autocvar_crosshair_ring_minelayer_alpha;
+ ring_image = "gfx/crosshair_ring.tga";
+ ring_rgb = wcross_color;
+ }
+
+ if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
+ DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, ring_inner_alpha, DRAWFLAG_ADDITIVE);
+
+ if (ring_value)
+ DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, ring_alpha, DRAWFLAG_ADDITIVE);
}
#define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \
float autocvar_crosshair_per_weapon;
float autocvar_crosshair_pickup;
float autocvar_crosshair_pickup_speed;
-float autocvar_crosshair_ring_sniperrifle_alpha;
+float autocvar_crosshair_ring;
+float autocvar_crosshair_ring_inner;
+float autocvar_crosshair_ring_minelayer;
+float autocvar_crosshair_ring_minelayer_alpha;
+float autocvar_crosshair_ring_nex;
+float autocvar_crosshair_ring_nex_alpha;
float autocvar_crosshair_ring_nex_currentcharge_movingavg_rate;
float autocvar_crosshair_ring_nex_currentcharge_scale;
float autocvar_crosshair_ring_nex_inner_alpha;
float autocvar_crosshair_ring_nex_inner_color_blue;
float autocvar_crosshair_ring_nex_inner_color_green;
float autocvar_crosshair_ring_nex_inner_color_red;
-float autocvar_crosshair_ring_nex_outer_alpha;
float autocvar_crosshair_ring_size;
+float autocvar_crosshair_ring_sniperrifle;
+float autocvar_crosshair_ring_sniperrifle_alpha;
float autocvar_crosshair_size;
float autocvar_ekg;
float autocvar_fov;
string s;
if(complain_weapon_type == 0) {
- s = "Out of ammo";
+ s = _("Out of ammo");
color = stov(autocvar_hud_panel_weapons_complainbubble_color_outofammo);
}
else if(complain_weapon_type == 1) {
}
}
else if(type == KILL_FIRST_BLOOD)
- print(sprintf("^1%s^1 drew first blood\n", s1));
+ print(sprintf(_("^1%s^1 drew first blood\n"), s1));
else if (type == DEATH_TELEFRAG) {
HUD_KillNotify_Push(s1, s2, 1, DEATH_TELEFRAG);
if(gentle)
} else if (type == DEATH_SLIME) {
HUD_KillNotify_Push(s1, "", 0, DEATH_SLIME);
if(alsoprint)
- print (sprintf("^1%s^1 was slimed\n", s1));
+ print (sprintf(_("^1%s^1 was slimed\n"), s1));
} else if (type == DEATH_LAVA) {
HUD_KillNotify_Push(s1, "", 0, DEATH_LAVA);
if(alsoprint)
if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE))
{
vote_active = 1;
- vote_called_vote = strzone(_("^2Name ^7instead of \"^1Unregistered player\" ^7in stats"));
+ vote_called_vote = strzone(_("^2Name ^7instead of \"^1Unregistered player^7\" in stats"));
uid2name_dialog = 1;
}
if (tm)
if (tm.team != COLOR_SPECTATOR)
if (tm.team_size == ts_max)
- s = strcat(s, sprintf(" Press ^3%s%s to adjust", getcommandkey("team menu", "menu_showteamselect"), blinkcolor));
+ s = strcat(s, sprintf(_(" Press ^3%s%s to adjust"), getcommandkey("team menu", "menu_showteamselect"), blinkcolor));
drawInfoMessage(s)
}
}
const float TE_CSQC_NOTIFY = 112;
const float TE_CSQC_WEAPONCOMPLAIN = 113;
const float TE_CSQC_NEX_SCOPE = 116;
+const float TE_CSQC_MINELAYER_MAXMINES = 117;
const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
const float RACE_NET_CHECKPOINT_CLEAR = 1;
const float STAT_NEX_CHARGEPOOL = 53;
const float STAT_HIT_TIME = 54;
const float STAT_TYPEHIT_TIME = 55;
+const float STAT_LAYED_MINES = 56;
// see DP source, quakedef.h
const float STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW = 222;
}
float Button_mouseRelease(entity me, vector pos)
{
- if(cvar("menu_sounds"))
- localsound("sound/misc/menu2.wav");
me.mouseDrag(me, pos); // verify coordinates
if(me.pressed)
{
if not(me.disabled)
+ {
+ if(cvar("menu_sounds"))
+ localsound("sound/misc/menu2.wav");
me.onClick(me, me.onClickEntity);
+ }
me.pressed = 0;
}
return 1;
}
float Slider_mouseRelease(entity me, vector pos)
{
- if(cvar("menu_sounds"))
- localsound("sound/misc/menu2.wav");
me.pressed = 0;
if(me.disabled)
return 0;
+ if(cvar("menu_sounds"))
+ localsound("sound/misc/menu2.wav");
return 1;
}
void Slider_showNotify(entity me)
vector avoidplus, avoidminus;
vector v;
- avoidplus_x = (SKINAVOID_TOOLTIP_x + SKINSIZE_CURSOR_x - SKINOFFSET_CURSOR_x) / conwidth;
- avoidplus_y = (SKINAVOID_TOOLTIP_y + SKINSIZE_CURSOR_y - SKINOFFSET_CURSOR_y) / conheight;
+ avoidplus_x = (SKINAVOID_TOOLTIP_x + SKINSIZE_CURSOR_x - SKINOFFSET_CURSOR_x * SKINSIZE_CURSOR_x) / conwidth;
+ avoidplus_y = (SKINAVOID_TOOLTIP_y + SKINSIZE_CURSOR_y - SKINOFFSET_CURSOR_y * SKINSIZE_CURSOR_y) / conheight;
avoidplus_z = 0;
- avoidminus_x = (SKINAVOID_TOOLTIP_x + SKINOFFSET_CURSOR_x) / conwidth + menuTooltipSize_x;
- avoidminus_y = (SKINAVOID_TOOLTIP_y + SKINOFFSET_CURSOR_y) / conheight + menuTooltipSize_y;
+ avoidminus_x = (SKINAVOID_TOOLTIP_x + SKINOFFSET_CURSOR_x * SKINSIZE_CURSOR_x) / conwidth + menuTooltipSize_x;
+ avoidminus_y = (SKINAVOID_TOOLTIP_y + SKINOFFSET_CURSOR_y * SKINSIZE_CURSOR_y) / conheight + menuTooltipSize_y;
avoidminus_z = 0;
// bottom right
WriteByte(MSG_ENTITY, autocvar_g_balance_nex_secondary); // client has to know if it should zoom or not
WriteByte(MSG_ENTITY, autocvar_g_balance_sniperrifle_secondary); // client has to know if it should zoom or not
WriteByte(MSG_ENTITY, serverflags); // client has to know if it should zoom or not
+ WriteByte(MSG_ENTITY, autocvar_g_balance_minelayer_limit); // minelayer max mines
WriteCoord(MSG_ENTITY, autocvar_g_trueaim_minrange);
return TRUE;
}
self.weapons = spectatee.weapons;
self.switchweapon = spectatee.switchweapon;
self.weapon = spectatee.weapon;
+ self.nex_charge = spectatee.nex_charge;
+ self.nex_chargepool_ammo = spectatee.nex_chargepool_ammo;
+ self.minelayer_mines = spectatee.minelayer_mines;
self.punchangle = spectatee.punchangle;
self.view_ofs = spectatee.view_ofs;
self.v_angle = spectatee.v_angle;
.float clip_load;
.float old_clip_load;
.float clip_size;
+.float minelayer_mines;
#define PROJECTILE_MAKETRIGGER(e) (e).solid = SOLID_CORPSE; (e).dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE
// when doing this, hagar can go through clones
addstat(STAT_LAST_PICKUP, AS_FLOAT, last_pickup);
addstat(STAT_HIT_TIME, AS_FLOAT, hit_time);
addstat(STAT_TYPEHIT_TIME, AS_FLOAT, typehit_time);
+ addstat(STAT_LAYED_MINES, AS_INT, minelayer_mines);
addstat(STAT_NEX_CHARGE, AS_FLOAT, nex_charge);
addstat(STAT_NEX_CHARGEPOOL, AS_FLOAT, nex_chargepool_ammo);
#else
#ifdef SVQC
void W_Mine_Think (void);
-.float minelayer_detonate, minelayer_mines;
+.float minelayer_detonate, mine_explodeanyway;
.float mine_time;
void spawnfunc_weapon_minelayer (void)
self.owner.switchweapon = w_getbestweapon(self.owner);
}
}
+ self.owner.minelayer_mines -= 1;
remove (self);
}
self.owner.switchweapon = w_getbestweapon(self.owner);
}
}
+ self.owner.minelayer_mines -= 1;
remove (self);
}
void W_Mine_ProximityExplode ()
{
// make sure no friend is in the mine's radius. If there is any, explosion is delayed until he's at a safe distance
- if(autocvar_g_balance_minelayer_protection && self.minelayer_mines == 0)
+ if(autocvar_g_balance_minelayer_protection && self.mine_explodeanyway == 0)
{
entity head;
head = findradius(self.origin, autocvar_g_balance_minelayer_radius);
W_Mine_Explode();
}
+float W_Mine_Count(entity e)
+{
+ float minecount;
+ entity mine;
+ for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == e)
+ minecount += 1;
+
+ return minecount;
+}
+
void W_Mine_Think (void)
{
entity head;
if(autocvar_g_balance_minelayer_lifetime_countdown > 0)
spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
self.mine_time = time + autocvar_g_balance_minelayer_lifetime_countdown;
- self.minelayer_mines = 1; // make the mine super aggressive
+ self.mine_explodeanyway = 1; // make the mine super aggressive -- Samual: Rather, make it not care if a team mate is near.
}
// a player's mines shall explode if he disconnects or dies
// scan how many mines we placed, and return if we reached our limit
if(autocvar_g_balance_minelayer_limit)
{
- self.minelayer_mines = 0;
- for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
- self.minelayer_mines += 1;
-
- if(self.minelayer_mines >= autocvar_g_balance_minelayer_limit)
+
+ if(W_Mine_Count(self) >= autocvar_g_balance_minelayer_limit)
{
// the refire delay keeps this message from being spammed
sprint(self, strcat("You cannot place more than ^2", ftos(autocvar_g_balance_minelayer_limit), " ^7mines at a time\n") );
// common properties
other = mine; MUTATOR_CALLHOOK(EditProjectile);
+
+ self.minelayer_mines = W_Mine_Count(self);
}
void spawnfunc_weapon_minelayer (void); // defined in t_items.qc
\sv_vote_simple_majority_factor\Simple majority wins a vote
\XonoticMultiplayerDialog/Advanced settings...\Advanced server settings
\XonoticMultiplayerDialog/Mutators...\Mutators and weapon arenas
+\g_dodging\Enable dodging
\g_cloaked\All players are almost invisible
\g_footsteps\Enable footstep sounds
-\g_midair\Only possible to inflict damage on your enemy while he's airborn
+\g_midair\Only possible to inflict damage on your enemy while he's airborne
\g_vampire\Damage done to your enemy gets added to your own health
\g_bloodloss\Amount of health below which your player gets stunned because of blood loss
\sv_gravity\Make things fall to the ground slower, lower value means lower gravity