_update_generic
set g_configversion 2
+
+// we now use mastervolume
+volume 1
cl_bobcycle 0 // how long the cycle of up/down view movement takes (only works if cl_bob is not 0), default is 0.6
cl_bob 0.01 // how much view moves up/down when moving (does not move if cl_bobcycle is 0, but still enables cl_bobmodel), default is 0.02
cl_bobmodel 1 // whether to have gun model move around on screen when moving (only works if cl_bob is not 0), default is 1
+cl_leanmodel 1 // enables weapon leaning effect when looking around
+cl_followmodel 1 // enables weapon pushing / pulling effect when walking
cl_rollangle 0 // amount of view tilt when strafing, default is 2.0
v_kicktime 0 // how long damage kicks of the view last, default is 0 seconds
gl_polyblend 0.5 // whether to use screen tints, default is 1
set g_telefrags_avoid 0
set g_teleport_maxspeed 0 "maximum speed that a player can keep when going through a teleporter (if a misc_teleporter_dest also has a cap the smallest one of these will be used), 0 = don't limit, -1 = keep no speed"
+set g_respawn_ghosts 1 "if 1 dead bodies become ghosts and float away when the player respawns"
+set g_respawn_ghosts_speed 5 "the speed with which respawn ghosts float and rotate"
+set g_respawn_ghosts_maxtime 6 "maximum amount of time a respawn ghost can last, minimum time is half this value. 0 disables and ghosts fade when the body would"
+
// fragmessage: This allows extra information to be displayed with the frag centerprints.
set sv_fragmessage_information_ping 0 "Enable ping display information, 0 = Never display; 1 = Always display (If the player is a bot, it will say bot instead of the ping.)"
set sv_fragmessage_information_handicap 1 "Enable handicap display information, 0 = Never display; 1 = Only when the player has handicap on; 2 = Always display (Displays Off if off)"
// improve some minor details
sv_gameplayfix_gravityunaffectedbyticrate 1
sv_gameplayfix_nogravityonground 1
+
+// autodemo deleting
+seta cl_autodemo_delete_keeprecords 0 "when 1, records with a newly made race/cts demo are kept even if cl_autodemo_delete is used to delete demos"
+
+// freeze camera
+set cl_lockview 0 "when 1, the camera does not move any more"
+
+// we now use mastervolume
+volume 1
velocitymultiplier 20
velocityoffset 0 0 10
airfriction 1
+
+// effect for respawn ghosts
+// used in qcsrc/server/cl_client.qc: pointparticles(particleeffectnum("respawn_ghost"), self.origin, '0 0 0', 1)
+effect respawn_ghost
+count 75
+type static
+color 0xA0A0A0 0xFFFFFF
+size 2 2
+alpha 32 64 128
+airfriction 1
+liquidfriction 4
+originoffset 0 0 -8
+originjitter 28 28 16
+velocityjitter 0 0 256
\ No newline at end of file
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
sv_aircontrol 150
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
--- /dev/null
+// These have been modified from Nexuiz 2.4.2's physicsQBR.cfg file
+sv_gravity 800
+sv_gravity 802
+sv_maxspeed 417
+sv_maxairspeed 202
+sv_stopspeed 100
+sv_accelerate 5.8
+sv_airaccelerate 5.5
+sv_friction 4.1
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 307
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0.207
+sv_airaccel_qw -0.93
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_aircontrol 0
+sv_aircontrol_power 2
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
sv_aircontrol 150
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
sv_aircontrol 150
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
-// Xonotic 2.0-2.4.2 physics minus QW-bunnyhopping-bug, faster onground accel, CPMA air control
+// 2.0-2.4.2 physics minus QW-bunnyhopping-bug, faster onground accel, CPMA air control
sv_gravity 800
-sv_maxspeed 320
-sv_maxairspeed 320
+sv_maxspeed 400
+sv_maxairspeed 220
sv_stopspeed 100
-sv_accelerate 15
-sv_airaccelerate 5.5
-sv_friction 5
+sv_accelerate 12
+sv_airaccelerate 8
+sv_friction 7
edgefriction 1
sv_stepheight 34
sv_jumpvelocity 300
sv_wateraccelerate -1
sv_waterfriction -1
-sv_airaccel_sideways_friction -1
+sv_airaccel_sideways_friction -0.125
sv_airaccel_qw -0.95
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
-sv_aircontrol 70
+sv_aircontrol 100
+sv_aircontrol_power 3
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 9 // activates warsow movement mode
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
sv_aircontrol 150
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
sv_aircontrol 0
+sv_aircontrol_power 2
sv_warsowbunny_turnaccel 6 // activates warsow movement mode
sv_warsowbunny_accel 0.1585
sv_warsowbunny_topspeed 900
case ENT_CLIENT_TUBANOTE: Ent_TubaNote(bIsNewEntity); break;
case ENT_CLIENT_WARPZONE: WarpZone_Read(bIsNewEntity); break;
case ENT_CLIENT_WARPZONE_CAMERA: WarpZone_Camera_Read(bIsNewEntity); break;
+ case ENT_CLIENT_TRIGGER_MUSIC: Ent_ReadTriggerMusic(); break;
default:
error(strcat("unknown entity type in CSQC_Ent_Update: ", ftos(self.enttype), "\n"));
break;
// NOTE: Could just do return instead of break...
switch(nTEID)
{
+ case TE_CSQC_TARGET_MUSIC:
+ Net_TargetMusic();
+ bHandled = true;
+ break;
case TE_CSQC_PICTURE:
Net_MapVote_Picture();
bHandled = true;
void CSQC_SPIDER_HUD();
void CSQC_RAPTOR_HUD();
+vector freeze_pmove_org, freeze_input_angles;
+
void CSQC_UpdateView(float w, float h)
{
entity e;
pmove_org = warpzone_fixview_origin - vo;
input_angles = warpzone_fixview_angles;
+ if(cvar("cl_lockview"))
+ {
+ pmove_org = warpzone_fixview_origin = freeze_pmove_org;
+ input_angles = freeze_input_angles;
+ R_SetView(VF_ORIGIN, pmove_org + vo);
+ R_SetView(VF_ANGLES, input_angles);
+ //R_SetView(VF_CL_VIEWANGLES, input_angles);
+ }
+ freeze_pmove_org = pmove_org;
+ freeze_input_angles = input_angles;
+
// Render the Scene
if(!intermission || !view_set)
{
}
#endif
+ TargetMusic_Advance();
Fog_Force();
drawframetime = max(0.000001, time - drawtime);
float log(float f) = #532;
void(entity e, entity ignore) tracetoss = #64;
+
+float(entity e, float ch) getsoundtime = #533; // (DP_SND_GETSOUNDTIME)
rr = RACE_RECORD;
t = stof(db_get(ClientProgsDB, strcat(shortmapname, rr, "time")));
- if(score && score < t || !t)
+ if(score && (score < t || !t)) {
db_put(ClientProgsDB, strcat(shortmapname, rr, "time"), ftos(score));
+ if(cvar("cl_autodemo_delete_keeprecords"))
+ {
+ f = cvar("cl_autodemo_delete");
+ f &~= 1;
+ cvar_set("cl_autodemo_delete", ftos(f)); // don't delete demo with new record!
+ }
+ }
if(t != crecordtime_prev) {
crecordtime_prev = t;
wall.qc
modeleffects.qc
tuba.qc
+target_music.qc
//vehicles/spiderbot.qc
Main.qc
--- /dev/null
+float music_disabled;
+entity music_default;
+entity music_target;
+entity music_trigger;
+
+.float state;
+
+void TargetMusic_Advance()
+{
+ // run AFTER all the thinks!
+ entity best, e;
+ float s0;
+ best = music_default;
+ if(music_target && time < music_target.lifetime)
+ best = music_target;
+ if(music_trigger)
+ best = music_trigger;
+ for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); ) if(e.noise)
+ {
+ s0 = e.state;
+ if(getsoundtime(e, CHAN_VOICE) < 0)
+ {
+ s0 = -1;
+ }
+ if(e == best)
+ {
+ // increase volume
+ if(e.fade_time > 0)
+ e.state = bound(0, e.state + frametime / e.fade_time, 1);
+ else
+ e.state = 1;
+ }
+ else
+ {
+ // decrease volume
+ if(e.fade_rate > 0)
+ e.state = bound(0, e.state - frametime / e.fade_rate, 1);
+ else
+ e.state = 0;
+ }
+ if(e.state != s0)
+ {
+ if(s0 < 0)
+ sound(e, CHAN_VOICE, e.noise, e.volume * e.state * cvar("bgmvolume"), ATTN_NONE); // restart
+ else
+ sound(e, CHAN_VOICE, "", e.volume * e.state * cvar("bgmvolume"), ATTN_NONE);
+ }
+ }
+ music_trigger = world;
+}
+
+void Net_TargetMusic()
+{
+ float vol, fai, fao, tim, id;
+ string noi, s;
+ entity e;
+
+ id = ReadShort();
+ vol = ReadByte() / 255.0;
+ fai = ReadByte() / 16.0;
+ fao = ReadByte() / 16.0;
+ tim = ReadByte();
+ noi = ReadString();
+
+ for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); )
+ {
+ if(e.count == id)
+ break;
+ }
+ if(!e)
+ {
+ e = spawn();
+ e.enttype = ENT_CLIENT_TRIGGER_MUSIC;
+ }
+ s = e.noise;
+ if(e.noise)
+ strunzone(e.noise);
+ e.noise = strzone(noi);
+ if(e.noise != s)
+ {
+ precache_sound(e.noise);
+ sound(e, CHAN_VOICE, e.noise, 0, ATTN_NONE);
+ if(getsoundtime(e, CHAN_VOICE) < 0)
+ {
+ print("Cannot initialize sound ", e.noise, "\n");
+ strunzone(e.noise);
+ e.noise = string_null;
+ }
+ }
+ e.volume = vol;
+ e.fade_time = fai;
+ e.fade_rate = fao;
+ if(vol > 0)
+ {
+ if(tim == 0)
+ {
+ music_default = e;
+ if(!music_disabled)
+ {
+ e.state = 2;
+ localcmd("cd stop\n"); // just in case
+ music_disabled = 1;
+ }
+ }
+ else
+ {
+ music_target = e;
+ e.lifetime = time + tim;
+ }
+ }
+}
+
+void Ent_TriggerMusic_Think()
+{
+ if(WarpZoneLib_BoxTouchesBrush(view_origin, view_origin, self, world))
+ {
+ music_trigger = self;
+ }
+ self.nextthink = time;
+}
+
+void Ent_TriggerMusic_Remove()
+{
+ if(self.noise)
+ strunzone(self.noise);
+ self.noise = string_null;
+}
+
+void Ent_ReadTriggerMusic()
+{
+ float f;
+ string s;
+ f = ReadByte();
+ if(f & 4)
+ {
+ self.origin_x = ReadCoord();
+ self.origin_y = ReadCoord();
+ self.origin_z = ReadCoord();
+ }
+ if(f & 1)
+ {
+ self.modelindex = ReadShort();
+ if(self.modelindex)
+ {
+ self.mins_x = ReadCoord();
+ self.mins_y = ReadCoord();
+ self.mins_z = ReadCoord();
+ self.maxs_x = ReadCoord();
+ self.maxs_y = ReadCoord();
+ self.maxs_z = ReadCoord();
+ }
+ else
+ {
+ self.mins = '0 0 0';
+ self.maxs_x = ReadCoord();
+ self.maxs_y = ReadCoord();
+ self.maxs_z = ReadCoord();
+ }
+
+ self.volume = ReadByte() / 255.0;
+ self.fade_time = ReadByte() / 16.0;
+ self.fade_rate = ReadByte() / 16.0;
+ s = self.noise;
+ if(self.noise)
+ strunzone(self.noise);
+ self.noise = strzone(ReadString());
+ if(self.noise != s)
+ {
+ precache_sound(self.noise);
+ sound(self, CHAN_VOICE, self.noise, 0, ATTN_NONE);
+ if(getsoundtime(self, CHAN_VOICE) < 0)
+ {
+ print("Cannot initialize sound ", self.noise, "\n");
+ strunzone(self.noise);
+ self.noise = string_null;
+ }
+ }
+ }
+
+ setorigin(self, self.origin);
+ setsize(self, self.mins, self.maxs);
+ self.cnt = 1;
+ self.think = Ent_TriggerMusic_Think;
+ self.nextthink = time;
+}
const float TE_CSQC_VOTE = 108;
const float TE_CSQC_VOTERESET = 109;
const float TE_CSQC_ANNOUNCE = 110;
+const float TE_CSQC_TARGET_MUSIC = 111;
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 ENT_CLIENT_TUBANOTE = 23;
const float ENT_CLIENT_WARPZONE = 24;
const float ENT_CLIENT_WARPZONE_CAMERA = 25;
+const float ENT_CLIENT_TRIGGER_MUSIC = 26;
const float ENT_CLIENT_TURRET = 40;
// on world: UNUSED
// on players: voice VOICE
// on entities: ambient AMBIENT
- // on csqc: UNUSED
+ // on csqc: background music BGM
float CHAN_TRIGGER = 3; // Triggers/Items
// on world: UNUSED
// on players: item pickup ITEMS
{ }
else if(startsWith(v, "weapon_"))
MapInfo_Map_supportedFeatures |= MAPINFO_FEATURE_WEAPONS;
+ else if(v == "target_music" || v == "trigger_music")
+ _MapInfo_Map_worldspawn_music = string_null; // don't use regular BGM
}
}
}
else
fputs(fh, strcat("cdtrack ", _MapInfo_Map_worldspawn_music, "\n"));
}
- else
+ else if(_MapInfo_Map_worldspawn_music)
{
n = tokenize_console(cvar_string("g_cdtracks_remaplist"));
s = strcat(" ", cvar_string("g_cdtracks_dontusebydefault"), " ");
entity e, s, sl;
me.TR(me);
- s = makeXonoticDecibelsSlider(-20, 0, 0.5, "bgmvolume");
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Music:"));
+ s = makeXonoticDecibelsSlider(-20, 0, 0.5, "mastervolume");
+ me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Master:"));
me.TD(me, 1, 2, s);
me.TR(me);
- me.TR(me);
- s = makeXonoticDecibelsSlider(-20, 0, 0.5, "volume");
- me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Master:"));
+ me.TDempty(me, 0.2);
+ s = makeXonoticDecibelsSlider(-20, 0, 0.5, "bgmvolume");
+ makeMulti(s, "snd_csqcchannel2volume");
+ me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Music:"));
me.TD(me, 1, 2, s);
me.TR(me);
me.TDempty(me, 0.2);
else self.colormod = '1 1 1';
};*/
+.float oldcolormap;
void respawn(void)
{
+ if(self.modelindex != 0 && cvar("g_respawn_ghosts"))
+ {
+ self.solid = SOLID_NOT;
+ self.takedamage = DAMAGE_NO;
+ self.movetype = MOVETYPE_FLY;
+ self.velocity = '0 0 1' * cvar("g_respawn_ghosts_speed");
+ self.avelocity = randomvec() * cvar("g_respawn_ghosts_speed") * 3 - randomvec() * cvar("g_respawn_ghosts_speed") * 3;
+ self.effects |= EF_ADDITIVE;
+ self.oldcolormap = self.colormap;
+ self.colormap = 512;
+ pointparticles(particleeffectnum("respawn_ghost"), self.origin, '0 0 0', 1);
+ if(cvar("g_respawn_ghosts_maxtime"))
+ SUB_SetFade (self, time + cvar("g_respawn_ghosts_maxtime") / 2 + random () * (cvar("g_respawn_ghosts_maxtime") - cvar("g_respawn_ghosts_maxtime") / 2), 1.5);
+ }
+
CopyBody(1);
self.effects |= EF_NODRAW; // prevent another CopyBody
+ if(self.oldcolormap)
+ {
+ self.colormap = self.oldcolormap;
+ self.oldcolormap = 0;
+ }
PutClientInServer();
}
float sv_airstrafeaccelerate;
float sv_maxairstrafespeed;
float sv_aircontrol;
+float sv_aircontrol_power;
float sv_warsowbunny_airforwardaccel;
float sv_warsowbunny_accel;
float sv_warsowbunny_topspeed;
xyspeed = vlen(self.velocity); self.velocity = normalize(self.velocity);
dot = self.velocity * wishdir;
- k *= sv_aircontrol*dot*dot*frametime;
if(dot > 0) // we can't change direction while slowing down
{
+ k *= fabs(sv_aircontrol)*pow(dot, sv_aircontrol_power)*frametime;
self.velocity = normalize(self.velocity * xyspeed + wishdir * k);
}
self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
self.dmg_inflictor = inflictor;
- if (self.health <= -75 && self.modelindex != 0)
+ if (self.health <= -100 && self.modelindex != 0)
{
// don't use any animations as a gib
self.frame = 0;
frag_attacker = attacker;
frag_inflictor = inflictor;
+ frag_target = self;
MUTATOR_CALLHOOK(PlayerDies);
if(self.flagcarried)
//implementation notes:
//entity customization is done before per-client culling (visibility for instance) because the entity may be doing setorigin to display itself in different locations on different clients, may be altering its .modelindex, .effects and other fields important to culling, so customized entities increase cpu usage (non-customized entities can use all the early culling they want however, as they are not changing on a per client basis).
+//DP_SV_DISCARDABLEDEMO
+//idea: parasti
+//darkplaces implementation: parasti
+//field definitions:
+.float discardabledemo;
+//description:
+//when this field is set to a non-zero value on a player entity, a possibly recorded server-side demo for the player is discarded
+//Note that this extension only works if:
+// auto demos are enabled (the cvar sv_autodemo_perclient is set)
+// discarding demos is enabled (the cvar sv_autodemo_perclient_discardable is set)
+
//DP_SV_DRAWONLYTOCLIENT
//idea: LordHavoc
//darkplaces implementation: LordHavoc
entity oldself;
oldself = self;
self = attacker;
+ frag_attacker = attacker;
frag_target = targ;
frag_score = f;
if(MUTATOR_CALLHOOK(GiveFragsForKill))
return TRUE;
}
+void TargetMusic_RestoreGame();
void RestoreGame()
{
// Loaded from a save game
MapInfo_Enumerate();
MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1);
WeaponStats_Init();
+
+ TargetMusic_RestoreGame();
}
void SV_Shutdown()
// INPUT:
entity frag_inflictor;
entity frag_attacker;
+ entity frag_target; // same as self
MUTATOR_HOOKABLE(GiveFragsForKill);
// called when someone was fragged by "self", and is expected to change frag_score to adjust scoring for the kill
// INPUT:
+ entity frag_attacker; // same as self
entity frag_target;
// INPUT, OUTPUT:
float frag_score;
target_spawn.qc
func_breakable.qc
+target_music.qc
../common/items.qc
{
if(gameover)
return 0;
- error("Adding score to unknown player!");
+ backtrace("Adding score to unknown player!");
+ return 0;
}
if(score)
if(scores_label[scorefield] != "")
sv_airstrafeaccelerate = cvar("sv_airstrafeaccelerate");
sv_maxairstrafespeed = cvar("sv_maxairstrafespeed");
sv_aircontrol = cvar("sv_aircontrol");
+ sv_aircontrol_power = cvar("sv_aircontrol_power");
sv_warsowbunny_airforwardaccel = cvar("sv_warsowbunny_airforwardaccel");
sv_warsowbunny_accel = cvar("sv_warsowbunny_accel");
sv_warsowbunny_topspeed = cvar("sv_warsowbunny_topspeed");
{
startitem_failed = FALSE;
+ self.items = itemid;
+ self.weapons = weaponid;
+
// is it a dropped weapon?
if (self.classname == "droppedweapon")
{
}
else
{
- self.items = itemid;
- self.weapons = weaponid;
-
if(MUTATOR_CALLHOOK(FilterItem)) // error means we do not want the item
{
startitem_failed = TRUE;
--- /dev/null
+.float lifetime;
+// values:
+// volume
+// noise
+// targetname
+// lifetime
+// fade_time
+// fade_rate
+// when triggered, the music is overridden for activator until lifetime (or forever, if lifetime is 0)
+// when targetname is not set, THIS ONE is default
+void target_music_sendto(float to, float is)
+{
+ WriteByte(to, SVC_TEMPENTITY);
+ WriteByte(to, TE_CSQC_TARGET_MUSIC);
+ WriteShort(to, num_for_edict(self));
+ WriteByte(to, self.volume * 255.0 * is);
+ WriteByte(to, self.fade_time * 16.0);
+ WriteByte(to, self.fade_rate * 16.0);
+ WriteByte(to, self.lifetime);
+ WriteString(to, self.noise);
+}
+void target_music_reset()
+{
+ if(self.targetname == "")
+ target_music_sendto(MSG_ALL, 1);
+}
+void target_music_use()
+{
+ if(!activator)
+ return;
+ msg_entity = activator;
+ target_music_sendto(MSG_ONE, 1);
+}
+void spawnfunc_target_music()
+{
+ self.use = target_music_use;
+ self.reset = target_music_reset;
+ if(!self.volume)
+ self.volume = 1;
+ if(self.targetname == "")
+ target_music_sendto(MSG_INIT, 1);
+ else
+ target_music_sendto(MSG_INIT, 0);
+}
+void TargetMusic_RestoreGame()
+{
+ for(self = world; (self = find(self, classname, "target_music")); )
+ {
+ if(self.targetname == "")
+ target_music_sendto(MSG_INIT, 1);
+ else
+ target_music_sendto(MSG_INIT, 0);
+ }
+}
+// values:
+// volume
+// noise
+// targetname
+// fade_time
+// spawnflags:
+// 1 = START_OFF
+// when triggered, it is disabled/enabled for everyone
+float trigger_music_SendEntity(entity to, float sf)
+{
+ WriteByte(MSG_ENTITY, ENT_CLIENT_TRIGGER_MUSIC);
+ sf &~= 0x80;
+ if(self.cnt)
+ sf |= 0x80;
+ WriteByte(MSG_ENTITY, sf);
+ if(sf & 4)
+ {
+ WriteCoord(MSG_ENTITY, self.origin_x);
+ WriteCoord(MSG_ENTITY, self.origin_y);
+ WriteCoord(MSG_ENTITY, self.origin_z);
+ }
+ if(sf & 1)
+ {
+ if(self.model != "null")
+ {
+ WriteShort(MSG_ENTITY, self.modelindex);
+ WriteCoord(MSG_ENTITY, self.mins_x);
+ WriteCoord(MSG_ENTITY, self.mins_y);
+ WriteCoord(MSG_ENTITY, self.mins_z);
+ WriteCoord(MSG_ENTITY, self.maxs_x);
+ WriteCoord(MSG_ENTITY, self.maxs_y);
+ WriteCoord(MSG_ENTITY, self.maxs_z);
+ }
+ else
+ {
+ WriteShort(MSG_ENTITY, 0);
+ WriteCoord(MSG_ENTITY, self.maxs_x);
+ WriteCoord(MSG_ENTITY, self.maxs_y);
+ WriteCoord(MSG_ENTITY, self.maxs_z);
+ }
+ WriteByte(MSG_ENTITY, self.volume * 255.0);
+ WriteByte(MSG_ENTITY, self.fade_time * 16.0);
+ WriteByte(MSG_ENTITY, self.fade_rate * 16.0);
+ WriteString(MSG_ENTITY, self.noise);
+ }
+ return 1;
+}
+void trigger_music_reset()
+{
+ self.cnt = !(self.spawnflags & 1);
+ self.SendFlags |= 0x80;
+}
+void trigger_music_use()
+{
+ self.cnt = !self.cnt;
+ self.SendFlags |= 0x80;
+}
+void spawnfunc_trigger_music()
+{
+ if(self.model != "")
+ setmodel(self, self.model);
+ if(!self.volume)
+ self.volume = 1;
+ if(!self.modelindex)
+ {
+ setorigin(self, self.origin + self.mins);
+ setsize(self, '0 0 0', self.maxs - self.mins);
+ }
+ trigger_music_reset();
+
+ self.use = trigger_music_use;
+ self.reset = trigger_music_reset;
+
+ Net_LinkEntity(self, FALSE, 0, trigger_music_SendEntity);
+}
target_spawn_useon(e);
e.target_spawn_id = self.target_spawn_id;
}
+ else if(self.target == "*activator")
+ {
+ // edit entity
+ if(activator)
+ target_spawn_useon(activator);
+ }
else
{
// edit entity
void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent, entity zone, WarpZone_trace_callback_t cb)
{
- float frac, sol;
+ float frac, sol, i;
vector o0, e0;
entity wz;
vector vf, vr, vu;
WarpZone_MakeAllSolid();
sol = -1;
frac = 0;
+ i = 16;
for(;;)
{
+ if(--i < 1)
+ {
+ dprint("Too many warpzones in sequence, aborting trace.\n");
+ break;
+ }
tracebox(org, mi, ma, end, nomonsters, forent);
if(cb)
cb(org, trace_endpos, end);
void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZone_trace_callback_t cb)
{
- float g, dt;
+ float g, dt, i;
vector vf, vr, vu, v0, o0;
entity wz;
WarpZone_MakeAllSolid();
g = cvar("sv_gravity") * e.gravity;
WarpZone_tracetoss_time = 0;
+ i = 16;
for(;;)
{
+ if(--i < 1)
+ {
+ dprint("Too many warpzones in sequence, aborting trace.\n");
+ break;
+ }
tracetoss(e, forent);
if(cb)
cb(e.origin, trace_endpos, trace_endpos);