X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=data%2Fqcsrc%2Fserver%2Fmiscfunctions.qc;h=d30b368ccb4e21fa1d1254c869f1cd88b76ce26b;hb=b2df32d96df3e954d54f6e4b9bbb6c98d77ef507;hp=d312584beb931b08b5edcb0ff8fe4de4ff95194b;hpb=19330cd22e334e898c4ca89a497543330400e30c;p=voretournament%2Fvoretournament.git diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index d312584b..d30b368c 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -181,22 +181,27 @@ void GameLogClose() } } -vector PL_VIEW_OFS; -vector PL_MIN; -vector PL_MAX; -vector PL_CROUCH_VIEW_OFS; -vector PL_CROUCH_MIN; -vector PL_CROUCH_MAX; +// you need an init method to set them somewhere +// default values simply become constant +const vector PL_VIEW_OFS; +const vector PL_MIN; +const vector PL_MAX; +const vector PL_CROUCH_VIEW_OFS; +const vector PL_CROUCH_MIN; +const vector PL_CROUCH_MAX; float spawnpoint_nag; void relocate_spawnpoint() { + // this code wouldn't work anyways, they're constants by having default assignment in a header. +#if 0 PL_VIEW_OFS = stov(cvar_string("sv_player_viewoffset")); PL_MIN = stov(cvar_string("sv_player_mins")); PL_MAX = stov(cvar_string("sv_player_maxs")); PL_CROUCH_VIEW_OFS = stov(cvar_string("sv_player_crouch_viewoffset")); PL_CROUCH_MIN = stov(cvar_string("sv_player_crouch_mins")); PL_CROUCH_MAX = stov(cvar_string("sv_player_crouch_maxs")); +#endif // nudge off the floor setorigin(self, self.origin + '0 0 1'); @@ -596,6 +601,7 @@ void GetCvars(float f) GetCvars_handleFloat(s, f, cvar_cl_shownames, "cl_shownames"); GetCvars_handleString(s, f, cvar_g_voretournamentversion, "g_voretournamentversion"); GetCvars_handleFloat(s, f, cvar_cl_handicap, "cl_handicap"); + GetCvars_handleFloat(s, f, cvar_cl_clippedspectating, "cl_clippedspectating"); GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriority, "cl_weaponpriority", W_FixWeaponOrder_ForceComplete); GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[0], "cl_weaponpriority0", W_FixWeaponOrder_AllowIncomplete); GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[1], "cl_weaponpriority1", W_FixWeaponOrder_AllowIncomplete); @@ -616,9 +622,9 @@ void GetCvars(float f) GetCvars_handleFloat(s, f, cvar_cl_accuracy_data_receive, "cl_accuracy_data_receive"); GetCvars_handleFloat(s, f, cvar_chase_active, "chase_active"); GetCvars_handleFloat(s, f, cvar_cl_vore_stomachmodel, "cl_vore_stomachmodel"); - GetCvars_handleFloat(s, f, cvar_cl_vore_cameraspeed, "cl_vore_cameraspeed"); - GetCvars_handleFloat(s, f, cvar_cl_vore_punchangle, "cl_vore_punchangle"); + GetCvars_handleFloat(s, f, cvar_cl_vore_gulletmodel, "cl_vore_gulletmodel"); GetCvars_handleFloat(s, f, cvar_cl_vore_autodigest, "cl_vore_autodigest"); + GetCvars_handleFloat(s, f, cvar_cl_dodging_timeout, "cl_dodging_timeout"); self.cvar_cl_accuracy_data_share = boolean(self.cvar_cl_accuracy_data_share); self.cvar_cl_accuracy_data_receive = boolean(self.cvar_cl_accuracy_data_receive); @@ -819,12 +825,16 @@ float g_pickup_armorlarge; float g_pickup_armorlarge_max; float g_pickup_healthsmall; float g_pickup_healthsmall_max; +float g_pickup_healthsmall_consumable; float g_pickup_healthmedium; float g_pickup_healthmedium_max; +float g_pickup_healthmedium_consumable; float g_pickup_healthlarge; float g_pickup_healthlarge_max; +float g_pickup_healthlarge_consumable; float g_pickup_healthmega; float g_pickup_healthmega_max; +float g_pickup_healthmega_consumable; float g_weaponspeedfactor; float g_weaponratefactor; float g_weapondamagefactor; @@ -1031,7 +1041,7 @@ void readlevelcvars(void) g_warmup_allguns = cvar("g_warmup_allguns"); g_warmup_allow_timeout = cvar("g_warmup_allow_timeout"); - if ((g_race && g_race_qualifying == 2) || g_arena || g_assault || cvar("g_campaign")) + if ((g_race && g_race_qualifying == 2) || g_arena || g_assault || g_rpg || cvar("g_campaign")) inWarmupStage = 0; // these modes cannot work together, sorry g_pickup_respawntime_weapon = cvar("g_pickup_respawntime_weapon"); @@ -1066,12 +1076,16 @@ void readlevelcvars(void) g_pickup_armorlarge_max = cvar("g_pickup_armorlarge_max"); g_pickup_healthsmall = cvar("g_pickup_healthsmall"); g_pickup_healthsmall_max = cvar("g_pickup_healthsmall_max"); + g_pickup_healthsmall_consumable = cvar("g_pickup_healthsmall_consumable"); g_pickup_healthmedium = cvar("g_pickup_healthmedium"); g_pickup_healthmedium_max = cvar("g_pickup_healthmedium_max"); + g_pickup_healthmedium_consumable = cvar("g_pickup_healthmedium_consumable"); g_pickup_healthlarge = cvar("g_pickup_healthlarge"); g_pickup_healthlarge_max = cvar("g_pickup_healthlarge_max"); + g_pickup_healthlarge_consumable = cvar("g_pickup_healthlarge_consumable"); g_pickup_healthmega = cvar("g_pickup_healthmega"); g_pickup_healthmega_max = cvar("g_pickup_healthmega_max"); + g_pickup_healthmega_consumable = cvar("g_pickup_healthmega_consumable"); g_weapon_stay = cvar("g_weapon_stay"); @@ -1083,7 +1097,7 @@ void readlevelcvars(void) if(g_ghost_items >= 1) g_ghost_items = 0.25; // default alpha value - if not(inWarmupStage && !g_ca) + if not(inWarmupStage && !g_ca && !g_rpg) game_starttime = cvar("g_start_delay"); sv_pitch_min = cvar("sv_pitch_min"); @@ -1124,6 +1138,7 @@ float precache_sound_index (string s) = #19; #define SND_ATTENUATION 2 #define SND_LARGEENTITY 8 #define SND_LARGESOUND 16 +#define SND_SPEEDUSHORT4000 32 float sound_allowed(float dest, entity e) { @@ -1155,7 +1170,7 @@ void sound(entity e, float chan, string samp, float vol, float atten) return; sound_builtin(e, chan, samp, vol, atten); } -void soundtoat(float dest, entity e, vector o, float chan, string samp, float vol, float atten) +void soundtoat(float dest, entity e, vector o, float chan, string samp, float vol, float atten, float spd) { float entno, idx; @@ -1175,6 +1190,8 @@ void soundtoat(float dest, entity e, vector o, float chan, string samp, float vo sflags |= SND_VOLUME; if (atten != 64) sflags |= SND_ATTENUATION; + if (spd) + sflags |= SND_SPEEDUSHORT4000; if (entno >= 8192) sflags |= SND_LARGEENTITY; if (idx >= 256) @@ -1186,6 +1203,8 @@ void soundtoat(float dest, entity e, vector o, float chan, string samp, float vo WriteByte(dest, vol); if (sflags & SND_ATTENUATION) WriteByte(dest, atten); + if(sflags & SND_SPEEDUSHORT4000) + WriteShort(dest, spd * 4000); if (sflags & SND_LARGEENTITY) { WriteShort(dest, entno); @@ -1204,7 +1223,7 @@ void soundtoat(float dest, entity e, vector o, float chan, string samp, float vo WriteCoord(dest, o_y); WriteCoord(dest, o_z); } -void soundto(float dest, entity e, float chan, string samp, float vol, float atten) +void soundto(float dest, entity e, float chan, string samp, float vol, float atten, float spd) { vector o; @@ -1212,11 +1231,11 @@ void soundto(float dest, entity e, float chan, string samp, float vol, float att return; o = e.origin + 0.5 * (e.mins + e.maxs); - soundtoat(dest, e, o, chan, samp, vol, atten); + soundtoat(dest, e, o, chan, samp, vol, atten, spd); } -void soundat(entity e, vector o, float chan, string samp, float vol, float atten) +void soundat(entity e, vector o, float chan, string samp, float vol, float atten, float spd) { - soundtoat(MSG_BROADCAST, e, o, chan, samp, vol, atten); + soundtoat(MSG_BROADCAST, e, o, chan, samp, vol, atten, spd); } void stopsoundto(float dest, entity e, float chan) { @@ -1267,7 +1286,7 @@ void play2(entity e, string filename) if (clienttype(e) == CLIENTTYPE_REAL) { msg_entity = e; - soundtoat(MSG_ONE, world, '0 0 0', CHAN_AUTO, filename, VOL_BASE, ATTN_NONE); + soundtoat(MSG_ONE, world, '0 0 0', CHAN_AUTO, filename, VOL_BASE, ATTN_NONE, 0); } } @@ -1310,7 +1329,26 @@ void play2all(string samp) } void PrecachePlayerSounds(string f); -void precache_all_models(string pattern) +void precache_playermodel(string m) +{ + float globhandle, i, n; + string f; + + precache_model(m); + + globhandle = search_begin(strcat(m, "_*.sounds"), TRUE, FALSE); + if (globhandle < 0) + return; + n = search_getsize(globhandle); + for (i = 0; i < n; ++i) + { + //print(search_getfilename(globhandle, i), "\n"); + f = search_getfilename(globhandle, i); + PrecachePlayerSounds(f); + } + search_end(globhandle); +} +void precache_all_playermodels(string pattern) { float globhandle, i, n; string f; @@ -1323,18 +1361,17 @@ void precache_all_models(string pattern) { //print(search_getfilename(globhandle, i), "\n"); f = search_getfilename(globhandle, i); - precache_model(f); - PrecachePlayerSounds(strcat(f, ".sounds")); + precache_playermodel(f); } search_end(globhandle); } void precache() { + float i; + // gamemode related things precache_model ("models/misc/chatbubble.spr"); - precache_model ("models/misc/teambubble.spr"); - precache_model ("models/misc/teambubbleheal.spr"); // used by the waypoint editor precache_model ("models/rune.mdl"); @@ -1348,11 +1385,11 @@ void precache() if (cvar("sv_precacheplayermodels")) { PrecachePlayerSounds("sound/player/default.sounds"); - precache_all_models("models/player/*.zym"); - precache_all_models("models/player/*.dpm"); - precache_all_models("models/player/*.md3"); - precache_all_models("models/player/*.psk"); - //precache_model("models/player/vixen.zym"); + precache_all_playermodels("models/player/*.zym"); + precache_all_playermodels("models/player/*.dpm"); + precache_all_playermodels("models/player/*.md3"); + precache_all_playermodels("models/player/*.psk"); + precache_all_playermodels("models/player/*.iqm"); } if (cvar("sv_defaultcharacter")) @@ -1394,6 +1431,8 @@ void precache() { PrecacheGlobalSound((globalsound_step = "misc/footstep0 6")); PrecacheGlobalSound((globalsound_metalstep = "misc/metalfootstep0 6")); + if(cvar("g_healthsize")) + precache_sound("misc/macro_footstep.wav"); } // gore and miscellaneous sounds @@ -1410,8 +1449,12 @@ void precache() precache_sound ("misc/hit.wav"); precache_sound ("misc/typehit.wav"); precache_sound ("misc/unavailable.wav"); + precache_sound ("misc/forbidden.wav"); + precache_sound ("misc/beep.wav"); PrecacheGlobalSound((globalsound_fall = "misc/hitground 4")); PrecacheGlobalSound((globalsound_metalfall = "misc/metalhitground 4")); + if(cvar("g_healthsize")) + precache_sound("misc/macro_hitground.wav"); precache_sound ("misc/null.wav"); precache_sound ("misc/spawn.wav"); precache_sound ("misc/talk.wav"); @@ -1420,8 +1463,9 @@ void precache() precache_sound ("player/lava.wav"); precache_sound ("player/slime.wav"); precache_sound ("player/digest.wav"); - precache_sound ("misc/health_regen.ogg"); - precache_sound ("misc/armor_regen.ogg"); + precache_sound ("misc/health_regen.wav"); + precache_sound ("misc/armor_regen.wav"); + precache_sound ("misc/power_fail.wav"); if (g_jetpack) precache_sound ("misc/jetpack_fly.wav"); @@ -1441,11 +1485,21 @@ void precache() // common weapon precaches precache_sound ("weapons/weapon_switch.wav"); precache_sound ("weapons/weaponpickup.wav"); - precache_sound ("weapons/unavailable.wav"); - precache_sound ("weapons/grabber_fire.wav"); // grabber - precache_sound ("weapons/grabber_altfire.wav"); // grabber - precache_sound ("weapons/grabber_impact.wav"); // grabber - precache_sound ("weapons/stomachkick.ogg"); + + // precache display digits + for(i = WEP_FIRST; i <= WEP_LAST; ++i) + { + entity e; + float w; + e = get_weaponinfo(i); + for(w = 1; fexists(strcat("models/weapons/v_", e.netname, "_digit1-", ftos(w) , ".md3")); w++) + precache_model (strcat("models/weapons/v_", e.netname, "_digit1-", ftos(w) , ".md3")); + for(w = 1; fexists(strcat("models/weapons/v_", e.netname, "_digit2-", ftos(w) , ".md3")); w++) + precache_model (strcat("models/weapons/v_", e.netname, "_digit2-", ftos(w) , ".md3")); + } + + for(i = 0; i < 8; i += 1) + precache_sound (strcat("weapons/hit", ftos(i), ".wav")); if (cvar("sv_precacheweapons")) { @@ -2278,7 +2332,7 @@ void SoundEntity_StartSound(entity pl, float chan, string samp, float vol, float p = pow(2, chan); if (pl.soundentity.cnt & p) return; - soundtoat(MSG_ALL, pl.soundentity, gettaginfo(pl.soundentity, 0), chan, samp, vol, attn); + soundtoat(MSG_ALL, pl.soundentity, gettaginfo(pl.soundentity, 0), chan, samp, vol, attn, 0); pl.soundentity.cnt |= p; } @@ -2452,6 +2506,31 @@ void modeleffect_spawn(string m, float s, float f, vector o, vector v, vector an Net_LinkEntity(e, FALSE, 0.1, modeleffect_SendEntity); } +float portrait_SendEntity(entity to, float sf) +{ + if(to != self.enemy) + return FALSE; + + WriteByte(MSG_ENTITY, ENT_CLIENT_PORTRAIT); + + WriteString(MSG_ENTITY, self.owner.playermodel); + WriteByte(MSG_ENTITY, stof(self.owner.playerskin)); + WriteString(MSG_ENTITY, self.owner.netname); + + return TRUE; +} + +void portrait(entity pl, entity targ) +{ + entity e; + e = spawn(); + e.classname = "portrait"; + e.owner = pl; + e.enemy = targ; + + Net_LinkEntity(e, FALSE, 0, portrait_SendEntity); +} + void shockwave_spawn(string m, vector org, float sz, float t1, float t2) { return modeleffect_spawn(m, 0, 0, org, '0 0 0', '0 0 0', '0 0 0', 0, sz, 1, t1, t2); @@ -2565,3 +2644,59 @@ void defer(float fdelay, void() func) e.think = defer_think; e.nextthink = time + fdelay; } + +// returns 1 if player is at minimum size and 0 if player is at normal size +float playersize_micro(entity e) +{ + if(!cvar("g_healthsize")) + return 0; + return bound(0, (e.health / cvar("g_healthsize_center") - 1) / (cvar("g_healthsize_min") / cvar("g_healthsize_center") - 1), 1); +} +// returns 0 if player is at normal size and 1 if player is at maximum size +float playersize_macro(entity e) +{ + if(!cvar("g_healthsize")) + return 0; + return 1 - bound(0, (e.health / cvar("g_healthsize_max") - 1) / (cvar("g_healthsize_center") / cvar("g_healthsize_max") - 1), 1); +} + +// returns 1 if the player is close to a wall +float check_close_to_wall(float threshold) { + //TODO: This check should be moved somehow for this to be a common utility + if (!cvar("sv_dodging_wall_dodging")) + return 0; + + vector trace_start; + vector trace_end; + + trace_start = self.origin; + + trace_end = self.origin + (1000*v_right); + tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self); + if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold) + return 1; + + trace_end = self.origin - (1000*v_right); + tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self); + if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold) + return 1; + + trace_end = self.origin + (1000*v_forward); + tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self); + if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold) + return 1; + + trace_end = self.origin - (1000*v_forward); + tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self); + if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold) + return 1; + + return 0; +} + +float check_close_to_ground(float threshold) { + if (self.flags & FL_ONGROUND) + return 1; + + return 0; +}