X-Git-Url: https://de.git.xonotic.org/?p=voretournament%2Fvoretournament.git;a=blobdiff_plain;f=data%2Fqcsrc%2Fserver%2Fmiscfunctions.qc;h=d30b368ccb4e21fa1d1254c869f1cd88b76ce26b;hp=d5be06ccc7cd88045263fe89b410eef5f7733845;hb=HEAD;hpb=35026837b97d7fd4defea4eab3397ce47bc3d836 diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index d5be06cc..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'); @@ -617,8 +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_swallowmodel, "cl_vore_swallowmodel"); + 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); @@ -1132,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) { @@ -1163,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; @@ -1183,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) @@ -1194,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); @@ -1212,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; @@ -1220,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) { @@ -1275,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); } } @@ -1318,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; @@ -1331,14 +1361,15 @@ 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"); @@ -1354,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_all_models("models/player/*.iqm"); + 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")) @@ -1400,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 @@ -1420,6 +1453,8 @@ void precache() 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"); @@ -1450,9 +1485,19 @@ void precache() // common weapon precaches precache_sound ("weapons/weapon_switch.wav"); precache_sound ("weapons/weaponpickup.wav"); - precache_model ("models/weapons/w_displaydigit.md3"); - float i; + // 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")); @@ -2287,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; } @@ -2468,8 +2513,8 @@ float portrait_SendEntity(entity to, float sf) WriteByte(MSG_ENTITY, ENT_CLIENT_PORTRAIT); - WriteString(MSG_ENTITY, self.owner.model); - WriteByte(MSG_ENTITY, self.owner.skin); + WriteString(MSG_ENTITY, self.owner.playermodel); + WriteByte(MSG_ENTITY, stof(self.owner.playerskin)); WriteString(MSG_ENTITY, self.owner.netname); return TRUE; @@ -2483,7 +2528,7 @@ void portrait(entity pl, entity targ) e.owner = pl; e.enemy = targ; - Net_LinkEntity(e, FALSE, 0.1, portrait_SendEntity); + Net_LinkEntity(e, FALSE, 0, portrait_SendEntity); } void shockwave_spawn(string m, vector org, float sz, float t1, float t2) @@ -2599,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; +}