From: Rudolf Polzer Date: Fri, 16 Dec 2011 15:48:38 +0000 (+0100) Subject: Merge remote-tracking branch 'origin/divVerent/csqcmodel' X-Git-Tag: xonotic-v0.6.0~74^2~100 X-Git-Url: http://de.git.xonotic.org/?a=commitdiff_plain;h=7548b068fae6d831133281ff225280eca61be97d;hp=-c;p=xonotic%2Fxonotic-data.pk3dir.git Merge remote-tracking branch 'origin/divVerent/csqcmodel' --- 7548b068fae6d831133281ff225280eca61be97d diff --combined defaultXonotic.cfg index 0231923ce,87076513d..2db0a5534 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@@ -500,9 -500,12 +500,9 @@@ set g_shootfromfixedorigin "" "if set t set g_pinata 0 "if set to 1 you will not only drop your current weapon when you are killed, but you will drop all weapons that you possessed" set g_weapon_stay 0 "if set to 1 or 2, weapons stay after they were picked up (1: weapons you don't have yet give you ammo of their type and they can not be dropped, 2: weapons don't give ammo, but instead players start with one pickup-load of ammo by default, 3: weapons give ammo, weapons only stay as ammo-less ghosts)" set g_weapon_throwable 1 "if set to 1, weapons can be dropped" -set g_powerup_superhealth 1 "if set to 0 the mega health powerup will not spawn on the map" -set g_powerup_strength 1 "if set to 0 the strength powerup will not spawn on the map" -set g_powerup_shield 1 "if set to 0 the shield (invincibility) powerup will not spawn on the map" -set g_balance_powerup_timer 1 "if set to 0 the powerups dont wear off" +set g_powerups -1 "if set to 0 the strength and shield (invincibility) will not spawn on the map, if 1 they will spawn in all game modes, -1 is game mode default" set g_use_ammunition 1 "if set to 0 all weapons have unlimited ammunition" -set g_pickup_items 1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map" +set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map, if 1 they are forced to spawn" set g_minstagib 0 "enable minstagib" set g_minstagib_extralives 2 "how many extra lives you will get per powerup" set g_minstagib_ammo_start 10 "starting ammo" @@@ -835,6 -838,7 +835,6 @@@ set g_arena 0 "Arena: many one-on-one r set g_arena_maxspawned 2 "maximum number of players to spawn at once (the rest is spectating, waiting for their turn)" set g_arena_roundbased 1 "if disabled, the next player will spawn as soon as someone dies" set g_arena_warmup 5 "time, newly spawned players have to prepare themselves in round based matches" -set g_arena_powerups 0 "enables powerups (superhealth, strength and shield), which are removed by default" // ca set g_ca 0 "Clan Arena: Played in rounds, once you're dead you're out! The team with survivors wins the round." @@@ -1801,11 -1805,6 +1801,6 @@@ set menu_updatecheck set bot_navigation_ignoreplayers 0 // FIXME remove this once the issue is solved set bot_sound_monopoly 0 "when enabled, only bots can make any noise" - // broken, sorry (cannot handle weapon attachment properly) - //seta cl_forceplayermodels 0 "force all players to look like you; WARNING: animations can look very bad with this" - //seta cl_forceplayermodelsfromxonotic 0 "force models coming from xonotic; WARNING: animations can look very bad with this" - //set sv_clforceplayermodels 1 "allow clients to use cl_forcemodels" - set sv_loddistance1 1024 set sv_loddistance2 4096 seta cl_playerdetailreduction 0 "the higher, the less detailed player models are displayed (LOD)" @@@ -1915,6 -1914,9 +1910,9 @@@ set developer_shtest 0 "experimental sp set waypoint_benchmark 0 "quit after waypoint loading to benchmark bot navigation code" set g_debug_bot_commands 0 "print scripted bot commands before executing" set g_debug_defaultsounds 0 "always use default sounds" + set sv_use_csqc_players 1 "set to 0 to disable CSQC players for better Xonotic 0.5 compat" + set cl_forceplayermodels 0 "set to 1 to make everyone look like yourself (requires server to have sv_use_csqc_players 1)" + set cl_precacheplayermodels 0 "TODO please check if this needs to be 1 or if precaching a model the server already requested is fast enough to do it at runtime" // debug cvars for keyhunt attaching set _angles "0 0 0" diff --combined qcsrc/server/autocvars.qh index 255f78aaf,c210f848a..c6c29817a --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@@ -73,6 -73,7 +73,6 @@@ float autocvar_g_antilag_nudge float autocvar_g_arena_maxspawned; float autocvar_g_arena_point_leadlimit; float autocvar_g_arena_point_limit; -float autocvar_g_arena_powerups; float autocvar_g_arena_roundbased; float autocvar_g_arena_warmup; float autocvar_g_assault; @@@ -565,6 -566,7 +565,6 @@@ float autocvar_g_balance_powerup_streng float autocvar_g_balance_powerup_strength_selfdamage; float autocvar_g_balance_powerup_strength_selfforce; float autocvar_g_balance_powerup_strength_time; -float autocvar_g_balance_powerup_timer; float autocvar_g_balance_rocketlauncher_ammo; float autocvar_g_balance_rocketlauncher_animtime; float autocvar_g_balance_rocketlauncher_damage; @@@ -777,7 -779,6 +777,6 @@@ float autocvar_g_ctf_shield_max_ratio float autocvar_g_ctf_shield_min_negscore; float autocvar_g_cts_finish_kill_delay; float autocvar_g_cts_selfdamage; - float autocvar_g_deathglow; float autocvar_g_debug_bot_commands; float autocvar_g_domination_default_teams; float autocvar_g_domination_disable_frags; @@@ -923,7 -924,9 +922,7 @@@ float autocvar_g_player_alpha float autocvar_g_player_brightness; float autocvar_g_playerclip_collisions; string autocvar_g_playerstats_uri; -float autocvar_g_powerup_shield; -float autocvar_g_powerup_strength; -float autocvar_g_powerup_superhealth; +float autocvar_g_powerups; float autocvar_g_projectiles_damage; float autocvar_g_projectiles_newton_style; float autocvar_g_projectiles_newton_style_2_maxfactor; @@@ -1125,13 -1128,6 +1124,6 @@@ float autocvar_sv_maxairspeed float autocvar_sv_maxairstrafespeed; float autocvar_sv_maxspeed; string autocvar_sv_motd; - string autocvar_sv_player_crouch_maxs; - string autocvar_sv_player_crouch_mins; - string autocvar_sv_player_crouch_viewoffset; - string autocvar_sv_player_headsize; - string autocvar_sv_player_maxs; - string autocvar_sv_player_mins; - string autocvar_sv_player_viewoffset; float autocvar_sv_player_jumpanim_minfall; float autocvar_sv_precacheplayermodels; float autocvar_sv_precacheweapons; diff --combined qcsrc/server/cl_client.qc index f81a245de,171fcf35b..d34a0c287 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@@ -341,160 -341,36 +341,36 @@@ string CheckPlayerModel(string plyermod // to change a cvar default, we'll have a small leak here. FallbackPlayerModel = strzone(cvar_defstring("_cl_playermodel")); } - if(strlen(plyermodel) < 4) - return FallbackPlayerModel; + // only in right path if( substring(plyermodel,0,14) != "models/player/") return FallbackPlayerModel; - else if(autocvar_sv_servermodelsonly) + // only good file extensions + if(substring(plyermodel,-4,4) != ".zym") + if(substring(plyermodel,-4,4) != ".dpm") + if(substring(plyermodel,-4,4) != ".iqm") + if(substring(plyermodel,-4,4) != ".md3") + if(substring(plyermodel,-4,4) != ".psk") + return FallbackPlayerModel; + // forbid the LOD models + if(substring(plyermodel, -9,5) == "_lod1") + return FallbackPlayerModel; + if(substring(plyermodel, -9,5) == "_lod2") + return FallbackPlayerModel; + if(plyermodel != strtolower(plyermodel)) + return FallbackPlayerModel; + // also, restrict to server models + if(autocvar_sv_servermodelsonly) { - if(substring(plyermodel,-4,4) != ".zym") - if(substring(plyermodel,-4,4) != ".dpm") - if(substring(plyermodel,-4,4) != ".iqm") - if(substring(plyermodel,-4,4) != ".md3") - if(substring(plyermodel,-4,4) != ".psk") - return FallbackPlayerModel; - // forbid the LOD models - if(substring(plyermodel, -9,5) == "_lod1") - return FallbackPlayerModel; - if(substring(plyermodel, -9,5) == "_lod2") - return FallbackPlayerModel; - if(plyermodel != strtolower(plyermodel)) - return FallbackPlayerModel; if(!fexists(plyermodel)) return FallbackPlayerModel; } return plyermodel; } - /* - ============= - Client_customizeentityforclient - - LOD reduction - ============= - */ - void Client_uncustomizeentityforclient() - { - if(self.modelindex == 0) // no need to uncustomize then - return; - self.modelindex = self.modelindex_lod0; - self.skin = self.skinindex; - } - - float Client_customizeentityforclient() + void setplayermodel(entity e, string modelname) { - entity modelsource; - - if(self.modelindex == 0) - return TRUE; - - // forcemodel stuff - - #ifdef PROFILING - float t0; - t0 = gettime(GETTIME_HIRES); // reference - #endif - - modelsource = self; - - #ifdef ALLOW_FORCEMODELS - if(other.cvar_cl_forceplayermodelsfromxonotic) - if not(self.modelindex_lod0_from_xonotic) - modelsource = other; - if(other.cvar_cl_forceplayermodels && sv_clforceplayermodels) - modelsource = other; - #endif - - self.skin = modelsource.skinindex; - - #if 0 - if(modelsource == self) - self.skin = modelsource.skinindex; - else - self.skin = mod(modelsource.skinindex, 3); // forbid the fbskins as forced skins - #endif - - // self: me - // other: the player viewing me - float distance; - float f; - - if(other.cvar_cl_playerdetailreduction <= 0) - { - if(other.cvar_cl_playerdetailreduction <= -2) - self.modelindex = modelsource.modelindex_lod2; - else if(other.cvar_cl_playerdetailreduction <= -1) - self.modelindex = modelsource.modelindex_lod1; - else - self.modelindex = modelsource.modelindex_lod0; - } - else - { - distance = vlen(self.origin - other.origin); - f = (distance + 100.0) * other.cvar_cl_playerdetailreduction; - if(f > sv_loddistance2) - self.modelindex = modelsource.modelindex_lod2; - else if(f > sv_loddistance1) - self.modelindex = modelsource.modelindex_lod1; - else - self.modelindex = modelsource.modelindex_lod0; - } - - #ifdef PROFILING - float t1; - t1 = gettime(GETTIME_HIRES); // reference - client_cefc_accumulator += (t1 - t0); - #endif - - return TRUE; - } - - void setmodel_lod(entity e, string modelname) - { - string s; - - if(sv_loddistance1) - { - // FIXME: this only supports 3-letter extensions - s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod1", substring(modelname, -4, 4)); - if(fexists(s)) - { - setmodel(e, s); // players have high precision - self.modelindex_lod1 = self.modelindex; - } - else - self.modelindex_lod1 = -1; - - s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4)); - if(fexists(s)) - { - setmodel(e, s); // players have high precision - self.modelindex_lod2 = self.modelindex; - } - else - self.modelindex_lod2 = -1; - - precache_model(modelname); - setmodel(e, modelname); // players have high precision - self.modelindex_lod0 = self.modelindex; - - if(self.modelindex_lod1 < 0) - self.modelindex_lod1 = self.modelindex; - - if(self.modelindex_lod2 < 0) - self.modelindex_lod2 = self.modelindex; - } - else - { - precache_model(modelname); - setmodel(e, modelname); // players have high precision - self.modelindex_lod0 = self.modelindex; - // save it for possible player model forcing - } - - s = whichpack(self.model); - self.modelindex_lod0_from_xonotic = ((s == "") || (substring(s, 0, 4) == "data")); - + precache_model(modelname); + setmodel(e, modelname); player_setupanimsformodel(); UpdatePlayerSounds(); } @@@ -609,16 -485,18 +485,18 @@@ void PutObserverInServer (void self.fixangle = TRUE; self.crouch = FALSE; - self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS" setorigin (self, spot.origin); - setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY self.prevorigin = self.origin; self.items = 0; self.weapons = 0; self.model = ""; FixPlayermodel(); - self.model = ""; - self.modelindex = 0; + setmodel(self, "null"); + self.drawonlytoclient = self; + + setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY + self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS" + self.weapon = 0; self.weaponname = ""; self.switchingweapon = 0; @@@ -633,9 -511,6 +511,6 @@@ self.oldvelocity = self.velocity; self.fire_endtime = -1; - if(sv_loddistance1) - SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient); - if(g_arena) { if(self.version_mismatch) @@@ -722,29 -597,29 +597,29 @@@ void FixPlayermodel( { m1 = self.mins; m2 = self.maxs; - setmodel_lod (self, defaultmodel); + setplayermodel (self, defaultmodel); setsize (self, m1, m2); chmdl = TRUE; } - oldskin = self.skinindex; - self.skinindex = defaultskin; + oldskin = self.skin; + self.skin = defaultskin; } else { if (self.playermodel != self.model || self.playermodel == "") { self.playermodel = CheckPlayerModel(self.playermodel); // this is never "", so no endless loop m1 = self.mins; m2 = self.maxs; - setmodel_lod (self, self.playermodel); + setplayermodel (self, self.playermodel); setsize (self, m1, m2); chmdl = TRUE; } - oldskin = self.skinindex; - self.skinindex = stof(self.playerskin); + oldskin = self.skin; + self.skin = stof(self.playerskin); } - if(chmdl || oldskin != self.skinindex) + if(chmdl || oldskin != self.skin) self.species = player_getspecies(); // model or skin has changed if(!teamplay) @@@ -849,6 -724,7 +724,7 @@@ void PutClientInServer (void self.effects = EF_FULLBRIGHT; else self.effects = 0; + self.effects |= EF_TELEPORT_BIT | EF_RESTARTANIM_BIT; self.air_finished = time + 12; self.dmg = 2; if(autocvar_g_balance_nex_charge) @@@ -946,11 -822,9 +822,9 @@@ WriteByte(MSG_ONE, TE_CSQC_SPAWN); }); - if(sv_loddistance1) - SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient); - self.model = ""; FixPlayermodel(); + self.drawonlytoclient = world; self.crouch = FALSE; self.view_ofs = PL_VIEW_OFS; @@@ -1315,7 -1189,7 +1189,7 @@@ void ClientKill_TeamChange (float targe self.clientkill_nexttime = time + killtime + autocvar_g_balance_kill_antispam; } - if(killtime <= 0 || !self.modelindex || self.deadflag != DEAD_NO) + if(killtime <= 0 || self.classname != "player" || self.deadflag != DEAD_NO) { ClientKill_Now(); } @@@ -1723,6 -1597,8 +1597,8 @@@ void ClientConnect (void if(!autocvar_g_campaign) Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), autocvar_welcome_message_time, 0); + CSQCMODEL_AUTOINIT(); + self.model_randomizer = random(); } @@@ -1976,7 -1852,7 +1852,7 @@@ void player_powerups (void if (self.items & IT_INVINCIBLE) { play_countdown(self.invincible_finished, "misc/poweroff.wav"); - if (time > self.invincible_finished && autocvar_g_balance_powerup_timer) + if (time > self.invincible_finished) { self.items = self.items - (self.items & IT_INVINCIBLE); sprint(self, "^3Speed has worn off\n"); @@@ -1997,7 -1873,7 +1873,7 @@@ { play_countdown(self.strength_finished, "misc/poweroff.wav"); self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT); - if (time > self.strength_finished && autocvar_g_balance_powerup_timer) + if (time > self.strength_finished) { self.items = self.items - (self.items & IT_STRENGTH); sprint(self, "^3Strength has worn off\n"); @@@ -2015,7 -1891,7 +1891,7 @@@ { play_countdown(self.invincible_finished, "misc/poweroff.wav"); self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT); - if (time > self.invincible_finished && autocvar_g_balance_powerup_timer) + if (time > self.invincible_finished) { self.items = self.items - (self.items & IT_INVINCIBLE); sprint(self, "^3Shield has worn off\n"); @@@ -2743,42 -2619,26 +2619,26 @@@ void PlayerPreThink (void if(frametime) { - if(self.health <= 0 && autocvar_g_deathglow) - { - if(self.glowmod_x > 0) - self.glowmod_x -= autocvar_g_deathglow * frametime; - else - self.glowmod_x = -1; - if(self.glowmod_y > 0) - self.glowmod_y -= autocvar_g_deathglow * frametime; - else - self.glowmod_y = -1; - if(self.glowmod_z > 0) - self.glowmod_z -= autocvar_g_deathglow * frametime; - else - self.glowmod_z = -1; - } - else + #ifndef NO_LEGACY_NETWORKING + self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2; + #endif + + if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge) { - // set weapon and player glowmod - self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2; + self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); + self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); + self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); - if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge) + if(self.nex_charge > autocvar_g_balance_nex_charge_animlimit) { - self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); - self.weaponentity_glowmod_y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); - self.weaponentity_glowmod_z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit); - - if(self.nex_charge > autocvar_g_balance_nex_charge_animlimit) - { - self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); - self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); - self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); - } + self.weaponentity_glowmod_x = self.weaponentity_glowmod_x + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); + self.weaponentity_glowmod_y = self.weaponentity_glowmod_y + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); + self.weaponentity_glowmod_z = self.weaponentity_glowmod_z + autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.nex_charge - autocvar_g_balance_nex_charge_animlimit) / (1 - autocvar_g_balance_nex_charge_animlimit); } - else - self.weaponentity_glowmod = self.glowmod; } + else + self.weaponentity_glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2; + player_powerups(); } @@@ -3191,4 -3051,6 +3051,6 @@@ void PlayerPostThink (void if(g_race) dprint(sprintf("%f %.6f\n", time, race_GetFractionalLapCount(self))); */ + + CSQCMODEL_AUTOUPDATE(); } diff --combined qcsrc/server/g_world.qc index 5d2a63324,79641ed70..bf89111c7 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@@ -410,10 -410,10 +410,10 @@@ void cvar_changes_init( // :%s,//\([^ ]*\).*,BADCVAR("\1");, // :%!sort // yes, this does contain some redundant stuff, don't really care + BADCVAR("bot_config_file"); BADCVAR("bot_number"); BADCVAR("bot_prefix"); BADCVAR("bot_suffix"); - BADCVAR("bot_config_file"); BADCVAR("capturelimit_override"); BADCVAR("fraglimit_override"); BADCVAR("gametype"); @@@ -444,7 -444,6 +444,7 @@@ BADCVAR("g_minstagib"); BADCVAR("g_mirrordamage"); BADCVAR("g_nexball_goallimit"); + BADCVAR("g_powerups"); BADCVAR("g_runematch_point_limit"); BADCVAR("g_start_delay"); BADCVAR("g_warmup"); @@@ -461,7 -460,6 +461,7 @@@ BADCVAR("skill"); BADCVAR("sv_adminnick"); BADCVAR("sv_autoscreenshot"); + BADCVAR("sv_autotaunt"); BADCVAR("sv_curl_defaulturl"); BADCVAR("sv_defaultcharacter"); BADCVAR("sv_defaultplayercolors"); @@@ -473,7 -471,6 +473,7 @@@ BADCVAR("sv_public"); BADCVAR("sv_ready_restart"); BADCVAR("sv_status_privacy"); + BADCVAR("sv_taunt"); BADCVAR("sv_vote_call"); BADCVAR("sv_vote_commands"); BADCVAR("sv_vote_majority_factor"); @@@ -485,7 -482,6 +485,7 @@@ BADCVAR("teamplay_mode"); BADCVAR("timelimit_override"); BADPREFIX("g_warmup_"); + BADPREFIX("sv_ready_restart_"); if(autocvar_g_minstagib) { @@@ -747,10 -743,8 +747,10 @@@ void spawnfunc_worldspawn (void s = strcat(s, ":no_use_ammunition"); // initialiation stuff, not good in the mutator system - if(!autocvar_g_pickup_items) + if(autocvar_g_pickup_items == 0) s = strcat(s, ":no_pickup_items"); + if(autocvar_g_pickup_items > 0) + s = strcat(s, ":pickup_items"); // initialiation stuff, not good in the mutator system if(autocvar_g_weaponarena != "0") @@@ -768,12 -762,6 +768,12 @@@ if(autocvar_g_minstagib) s = strcat(s, ":minstagib"); + // TODO to mutator system + if(autocvar_g_powerups == 0) + s = strcat(s, ":no_powerups"); + if(autocvar_g_powerups > 0) + s = strcat(s, ":powerups"); + GameLogEcho(s); GameLogEcho(":gameinfo:end"); } @@@ -947,8 -935,17 +947,17 @@@ s = ""; n = tokenize_console(cvar_string("sv_curl_serverpackages")); for(i = 0; i < n; ++i) - if(substring(argv(i), -14, -1) != ".serverpackage") + if(substring(argv(i), -14, -1) != "-serverpackage.txt") + if(substring(argv(i), -14, -1) != ".serverpackage") // OLD legacy s = strcat(s, " ", argv(i)); + fd = search_begin("*-serverpackage.txt", TRUE, FALSE); + if(fd >= 0) + { + j = search_getsize(fd); + for(i = 0; i < j; ++i) + s = strcat(s, " ", search_getfilename(fd, i)); + search_end(fd); + } fd = search_begin("*.serverpackage", TRUE, FALSE); if(fd >= 0) {