X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmiscfunctions.qc;h=13eb647dbdeb36d83aeebb371d88a44e4bcef1f4;hp=07bdf87937a410bb3f711dd1aab52d901a22768a;hb=94a967120c8bfe0d4ffd95690b97e5af297dfc05;hpb=81d670441b9c2bc8cb1ec3edd71f575be7999b32 diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 07bdf8793..13eb647db 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -32,7 +32,6 @@ void WarpZone_crosshair_trace(entity pl) void() spawnfunc_info_player_deathmatch; // needed for the other spawnpoints void() spawnpoint_use; string GetMapname(); -string ColoredTeamName(float t); string admin_name(void) { @@ -80,26 +79,27 @@ float DistributeEvenly_GetRandomized(float weight) #define move_out_of_solid(e) WarpZoneLib_MoveOutOfSolid(e) - string STR_PLAYER = "player"; string STR_SPECTATOR = "spectator"; string STR_OBSERVER = "observer"; -#if 0 -#define FOR_EACH_CLIENT(v) for(v = world; (v = findflags(v, flags, FL_CLIENT)) != world; ) -#define FOR_EACH_REALCLIENT(v) FOR_EACH_CLIENT(v) if(clienttype(v) == CLIENTTYPE_REAL) -#define FOR_EACH_PLAYER(v) for(v = world; (v = find(v, classname, STR_PLAYER)) != world; ) -#define FOR_EACH_REALPLAYER(v) FOR_EACH_PLAYER(v) if(clienttype(v) == CLIENTTYPE_REAL) -#else +#define IS_PLAYER(v) (v.classname == STR_PLAYER) +#define IS_SPEC(v) (v.classname == STR_SPECTATOR) +#define IS_OBSERVER(v) (v.classname == STR_OBSERVER) +#define IS_CLIENT(v) (v.flags & FL_CLIENT) +#define IS_BOT_CLIENT(v) (clienttype(v) == CLIENTTYPE_BOT) +#define IS_REAL_CLIENT(v) (clienttype(v) == CLIENTTYPE_REAL) +#define IS_NOT_A_CLIENT(v) (clienttype(v) == CLIENTTYPE_NOTACLIENT) + #define FOR_EACH_CLIENTSLOT(v) for(v = world; (v = nextent(v)) && (num_for_edict(v) <= maxclients); ) -#define FOR_EACH_CLIENT(v) FOR_EACH_CLIENTSLOT(v) if(v.flags & FL_CLIENT) -#define FOR_EACH_REALCLIENT(v) FOR_EACH_CLIENT(v) if(clienttype(v) == CLIENTTYPE_REAL) -#define FOR_EACH_PLAYER(v) FOR_EACH_CLIENT(v) if(v.classname == STR_PLAYER) -#define FOR_EACH_SPEC(v) FOR_EACH_CLIENT(v) if(v.classname != STR_PLAYER) -#define FOR_EACH_REALPLAYER(v) FOR_EACH_REALCLIENT(v) if(v.classname == STR_PLAYER) -#endif +#define FOR_EACH_CLIENT(v) FOR_EACH_CLIENTSLOT(v) if(IS_CLIENT(v)) +#define FOR_EACH_REALCLIENT(v) FOR_EACH_CLIENT(v) if(IS_REAL_CLIENT(v)) + +#define FOR_EACH_PLAYER(v) FOR_EACH_CLIENT(v) if(IS_PLAYER(v)) +#define FOR_EACH_SPEC(v) FOR_EACH_CLIENT(v) if not(IS_PLAYER(v)) // Samual: shouldn't this be IS_SPEC(v)? and rather create a separate macro to include observers too +#define FOR_EACH_REALPLAYER(v) FOR_EACH_REALCLIENT(v) if(IS_PLAYER(v)) -#define CENTER_OR_VIEWOFS(ent) (ent.origin + ((ent.classname == STR_PLAYER) ? ent.view_ofs : ((ent.mins + ent.maxs) * 0.5))) +#define CENTER_OR_VIEWOFS(ent) (ent.origin + (IS_PLAYER(ent) ? ent.view_ofs : ((ent.mins + ent.maxs) * 0.5))) // copies a string to a tempstring (so one can strunzone it) string strcat1(string s) = #115; // FRIK_FILE @@ -107,15 +107,6 @@ string strcat1(string s) = #115; // FRIK_FILE float logfile_open; float logfile; -void bcenterprint(string s) -{ - // TODO replace by MSG_ALL (would show it to spectators too, though)? - entity head; - FOR_EACH_PLAYER(head) - if (clienttype(head) == CLIENTTYPE_REAL) - centerprint(head, s); -} - void GameLogEcho(string s) { string fn; @@ -428,7 +419,7 @@ string formatmessage(string msg) else replacement = "batteries"; // ;) } else if (escape == "x") { replacement = cursor_ent.netname; - if (!replacement || !cursor_ent) + if (replacement == "" || !cursor_ent) replacement = "nothing"; } else if (escape == "s") replacement = ftos(vlen(self.velocity - self.velocity_z * '0 0 1')); @@ -546,7 +537,11 @@ void GetCvars(float f) get_cvars_f = f; get_cvars_s = s; + MUTATOR_CALLHOOK(GetCvars); + + Notification_GetCvars(); + GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch"); GetCvars_handleFloat(s, f, cvar_cl_autoscreenshot, "cl_autoscreenshot"); GetCvars_handleString(s, f, cvar_g_xonoticversion, "g_xonoticversion"); @@ -574,10 +569,6 @@ void GetCvars(float f) 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); -#ifdef ALLOW_FORCEMODELS - GetCvars_handleFloat(s, f, cvar_cl_forceplayermodels, "cl_forceplayermodels"); - GetCvars_handleFloat(s, f, cvar_cl_forceplayermodelsfromxonotic, "cl_forceplayermodelsfromxonotic"); -#endif GetCvars_handleFloatOnce(s, f, cvar_cl_gunalign, "cl_gunalign"); GetCvars_handleFloat(s, f, cvar_cl_allow_uid2name, "cl_allow_uid2name"); GetCvars_handleFloat(s, f, cvar_cl_allow_uidtracking, "cl_allow_uidtracking"); @@ -594,102 +585,6 @@ void GetCvars(float f) } } -void backtrace(string msg) -{ - float dev, war; - dev = autocvar_developer; - war = autocvar_prvm_backtraceforwarnings; - cvar_set("developer", "1"); - cvar_set("prvm_backtraceforwarnings", "1"); - print("\n"); - print("--- CUT HERE ---\nWARNING: "); - print(msg); - print("\n"); - remove(world); // isn't there any better way to cause a backtrace? - print("\n--- CUT UNTIL HERE ---\n"); - cvar_set("developer", ftos(dev)); - cvar_set("prvm_backtraceforwarnings", ftos(war)); -} - -string Team_ColorCode(float teamid) -{ - if (teamid == COLOR_TEAM1) - return "^1"; - else if (teamid == COLOR_TEAM2) - return "^4"; - else if (teamid == COLOR_TEAM3) - return "^3"; - else if (teamid == COLOR_TEAM4) - return "^6"; - else - return "^7"; -} - -string Team_ColorName(float t) -{ - // fixme: Search for team entities and get their .netname's! - if (t == COLOR_TEAM1) - return "Red"; - if (t == COLOR_TEAM2) - return "Blue"; - if (t == COLOR_TEAM3) - return "Yellow"; - if (t == COLOR_TEAM4) - return "Pink"; - return "Neutral"; -} - -string Team_ColorNameLowerCase(float t) -{ - // fixme: Search for team entities and get their .netname's! - if (t == COLOR_TEAM1) - return "red"; - if (t == COLOR_TEAM2) - return "blue"; - if (t == COLOR_TEAM3) - return "yellow"; - if (t == COLOR_TEAM4) - return "pink"; - return "neutral"; -} - -float ColourToNumber(string team_colour) -{ - if (team_colour == "red") - return COLOR_TEAM1; - - if (team_colour == "blue") - return COLOR_TEAM2; - - if (team_colour == "yellow") - return COLOR_TEAM3; - - if (team_colour == "pink") - return COLOR_TEAM4; - - if (team_colour == "auto") - return 0; - - return -1; -} - -float NumberToTeamNumber(float number) -{ - if (number == 1) - return COLOR_TEAM1; - - if (number == 2) - return COLOR_TEAM2; - - if (number == 3) - return COLOR_TEAM3; - - if (number == 4) - return COLOR_TEAM4; - - return -1; -} - // decolorizes and team colors the player name when needed string playername(entity p) { @@ -855,7 +750,7 @@ void readplayerstartcvars() s = cvar_string("g_weaponarena"); if (s == "0" || s == "") { - if(g_lms || g_ca) + if(g_ca) s = "most"; } @@ -933,7 +828,7 @@ void readplayerstartcvars() g_pinata = 0; // incompatible g_weapon_stay = 0; // incompatible WEPSET_COPY_AA(start_weapons, g_weaponarena_weapons); - if(!(g_lms || g_ca)) + if(!g_ca) start_items |= IT_UNLIMITED_AMMO; } else if (g_minstagib) @@ -986,7 +881,7 @@ void readplayerstartcvars() } else { - if(g_lms || g_ca) + if(g_ca) { start_ammo_shells = cvar("g_lms_start_ammo_shells"); start_ammo_nails = cvar("g_lms_start_ammo_nails"); @@ -1004,7 +899,7 @@ void readplayerstartcvars() } } - if (g_lms || g_ca) + if (g_ca) { start_health = cvar("g_lms_start_health"); start_armorvalue = cvar("g_lms_start_armor"); @@ -1098,19 +993,9 @@ float g_bugrigs_speed_ref; float g_bugrigs_speed_pow; float g_bugrigs_steer; -float g_touchexplode; -float g_touchexplode_radius; -float g_touchexplode_damage; -float g_touchexplode_edgedamage; -float g_touchexplode_force; - float sv_autotaunt; float sv_taunt; -float sv_pitch_min; -float sv_pitch_max; -float sv_pitch_fixyaw; - string GetGametype(); // g_world.qc void readlevelcvars(void) { @@ -1121,6 +1006,10 @@ void readlevelcvars(void) MUTATOR_ADD(mutator_dodging); if(cvar("g_spawn_near_teammate")) MUTATOR_ADD(mutator_spawn_near_teammate); + if(cvar("g_physical_items")) + MUTATOR_ADD(mutator_physical_items); + if(cvar("g_touchexplode")) + MUTATOR_ADD(mutator_touchexplode); if(!g_minstagib) { if(cvar("g_invincible_projectiles")) @@ -1160,18 +1049,7 @@ void readlevelcvars(void) g_bugrigs_speed_pow = cvar("g_bugrigs_speed_pow"); g_bugrigs_steer = cvar("g_bugrigs_steer"); - g_touchexplode = cvar("g_touchexplode"); - g_touchexplode_radius = cvar("g_touchexplode_radius"); - g_touchexplode_damage = cvar("g_touchexplode_damage"); - g_touchexplode_edgedamage = cvar("g_touchexplode_edgedamage"); - g_touchexplode_force = cvar("g_touchexplode_force"); - -#ifdef ALLOW_FORCEMODELS - sv_clforceplayermodels = cvar("sv_clforceplayermodels"); -#endif - sv_clones = cvar("sv_clones"); - sv_gentle = cvar("sv_gentle"); sv_foginterval = cvar("sv_foginterval"); g_cloaked = cvar("g_cloaked"); if(g_cts) @@ -1193,7 +1071,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_runematch || g_arena || g_assault || cvar("g_campaign")) + if ((g_race && g_race_qualifying == 2) || g_arena || g_assault || cvar("g_campaign")) inWarmupStage = 0; // these modes cannot work together, sorry g_pickup_respawntime_weapon = cvar("g_pickup_respawntime_weapon"); @@ -1262,12 +1140,8 @@ void readlevelcvars(void) if(!g_weapon_stay) g_weapon_stay = cvar("g_weapon_stay"); - if not(inWarmupStage && !g_ca) - game_starttime = cvar("g_start_delay"); - - sv_pitch_min = cvar("sv_pitch_min"); - sv_pitch_max = cvar("sv_pitch_max"); - sv_pitch_fixyaw = cvar("sv_pitch_fixyaw"); + if not(inWarmupStage) + game_starttime = time + cvar("g_start_delay"); readplayerstartcvars(); } @@ -1530,11 +1404,6 @@ void precache() { // gamemode related things precache_model ("models/misc/chatbubble.spr"); - if (g_runematch) - { - precache_model ("models/runematch/curse.mdl"); - precache_model ("models/runematch/rune.mdl"); - } #ifdef TTURRETS_ENABLED if (autocvar_g_turrets) @@ -1599,9 +1468,6 @@ void precache() precache_sound ("player/lava.wav"); precache_sound ("player/slime.wav"); - if (g_jetpack) - precache_sound ("misc/jetpack_fly.wav"); - precache_model ("models/sprites/0.spr32"); precache_model ("models/sprites/1.spr32"); precache_model ("models/sprites/2.spr32"); @@ -1657,34 +1523,6 @@ void precache() #endif } -// sorry, but using \ in macros breaks line numbers -#define WRITESPECTATABLE_MSG_ONE_VARNAME(varname,statement) entity varname; varname = msg_entity; FOR_EACH_REALCLIENT(msg_entity) if(msg_entity == varname || (msg_entity.classname == STR_SPECTATOR && msg_entity.enemy == varname)) statement msg_entity = varname -#define WRITESPECTATABLE_MSG_ONE(statement) WRITESPECTATABLE_MSG_ONE_VARNAME(oldmsg_entity, statement) -#define WRITESPECTATABLE(msg,statement) if(msg == MSG_ONE) { WRITESPECTATABLE_MSG_ONE(statement); } else statement float WRITESPECTATABLE_workaround = 0 - - -void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration, float countdown_num) -{ - if ((clienttype(e) == CLIENTTYPE_REAL) && (e.flags & FL_CLIENT)) - { - msg_entity = e; - WRITESPECTATABLE_MSG_ONE({ - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_CENTERPRINT_GENERIC); - WriteByte(MSG_ONE, id); - WriteString(MSG_ONE, s); - if (id != 0 && s != "") - { - WriteByte(MSG_ONE, duration); - WriteByte(MSG_ONE, countdown_num); - } - }); - } -} -void Send_CSQC_Centerprint_Generic_Expire(entity e, float id) -{ - Send_CSQC_Centerprint_Generic(e, id, "", 1, 0); -} // WARNING: this kills the trace globals #define EXACTTRIGGER_TOUCH if(WarpZoneLib_ExactTrigger_Touch()) return #define EXACTTRIGGER_INIT WarpZoneLib_ExactTrigger_Init() @@ -1824,7 +1662,7 @@ void InitializeEntitiesRun() self = e_old; } //dprint("Delayed initialization: ", self.classname, "\n"); - if(func != func_null) + if(func) func(); else { @@ -1850,7 +1688,7 @@ void SetCustomizer(entity e, float(void) customizer, void(void) uncustomizer) { e.customizeentityforclient = customizer; e.uncustomizeentityforclient = uncustomizer; - e.uncustomizeentityforclient_set = (uncustomizer != func_null); + e.uncustomizeentityforclient_set = !!uncustomizer; } .float nottargeted; @@ -2163,22 +2001,6 @@ string race_readName(string map, float pos) return uid2name(db_get(ServerProgsDB, strcat(map, rr, "crypto_idfp", ftos(pos)))); } -string race_placeName(float pos) { - if(floor((mod(pos, 100))/10) * 10 != 10) // examples: 12th, 111th, 213th will not execute this block - { - if(mod(pos, 10) == 1) - return strcat(ftos(pos), "st"); - else if(mod(pos, 10) == 2) - return strcat(ftos(pos), "nd"); - else if(mod(pos, 10) == 3) - return strcat(ftos(pos), "rd"); - else - return strcat(ftos(pos), "th"); - } - else - return strcat(ftos(pos), "th"); -} - float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance) { float m, i; @@ -2528,43 +2350,6 @@ vector gettaginfo_relative(entity e, float tag) return gettaginfo(gettaginfo_relative_ent, tag); } -void SoundEntity_StartSound(entity pl, float chan, string samp, float vol, float attn) -{ - float p; - p = pow(2, chan); - if (pl.soundentity.cnt & p) - return; - soundtoat(MSG_ALL, pl.soundentity, gettaginfo(pl.soundentity, 0), chan, samp, vol, attn); - pl.soundentity.cnt |= p; -} - -void SoundEntity_StopSound(entity pl, float chan) -{ - float p; - p = pow(2, chan); - if (pl.soundentity.cnt & p) - { - stopsoundto(MSG_ALL, pl.soundentity, chan); - pl.soundentity.cnt &~= p; - } -} - -void SoundEntity_Attach(entity pl) -{ - pl.soundentity = spawn(); - pl.soundentity.classname = "soundentity"; - pl.soundentity.owner = pl; - setattachment(pl.soundentity, pl, ""); - setmodel(pl.soundentity, "null"); -} - -void SoundEntity_Detach(entity pl) -{ - float i; - for (i = 0; i <= 7; ++i) - SoundEntity_StopSound(pl, i); -} - .float scale2; float modeleffect_SendEntity(entity to, float sf)