X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmiscfunctions.qc;h=e5eb7e41f622efbacd00ce19debdfb730f7c3344;hp=8ba161e4dd19eab30bd19d3a3381d45f5f6fd9ec;hb=cbf4da25107e5480eedbf4d3d67d103dd448ae83;hpb=3357e6223bd700ffc0cdff2a5a4a1451ab8c310e diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 8ba161e4d..e5eb7e41f 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -16,7 +16,6 @@ void WarpZone_crosshair_trace(entity pl) void() spawnfunc_info_player_deathmatch; // needed for the other spawnpoints void() spawnpoint_use; -float race_GetTime(float pos); string race_GetName(float pos); string race_PlaceName(float pos); string GetMapname(); @@ -100,9 +99,9 @@ string GetAdvancedDeathReports(entity enPlayer) // Extra fragmessage information if(cvar("sv_fragmessage_information_ping")) { if(clienttype(enPlayer) == CLIENTTYPE_BOT) // Bots have no ping - strMessage = strcat(strMessage, "\n^7(^2Bot"); + strMessage = strcat(strMessage, " ^7(^2Bot"); else - strMessage = strcat(strMessage, "\n^7(Ping ", strPlayerPingColor, ftos(nPlayerPing), "ms"); + strMessage = strcat(strMessage, " ^7(Ping ", strPlayerPingColor, ftos(nPlayerPing), "ms"); if(cvar("sv_fragmessage_information_handicap")) if(cvar("sv_fragmessage_information_handicap") == 2) if(nPlayerHandicap <= 1) @@ -229,12 +228,6 @@ void relocate_spawnpoint() } } - if (cvar("g_spawnpoints_autodrop")) - { - setsize(self, PL_MIN, PL_MAX); - droptofloor(); - } - self.use = spawnpoint_use; self.team_saved = self.team; if (!self.cnt) @@ -995,7 +988,7 @@ void readplayerstartcvars() if (g_weaponarena) { start_weapons = g_weaponarena; - if (g_weaponarena & (WEPBIT_GRENADE_LAUNCHER | WEPBIT_HAGAR | WEPBIT_ROCKET_LAUNCHER)) + if (g_weaponarena & (WEPBIT_GRENADE_LAUNCHER | WEPBIT_MINE_LAYER | WEPBIT_HAGAR | WEPBIT_ROCKET_LAUNCHER)) start_ammo_rockets = 999; if (g_weaponarena & WEPBIT_SHOTGUN) start_ammo_shells = 999; @@ -1178,6 +1171,10 @@ void readlevelcvars(void) // first load all the mutators if(cvar("g_nix")) MUTATOR_ADD(mutator_nix); + if(cvar("g_dodging")) + MUTATOR_ADD(mutator_dodging); + if(cvar("g_rocket_flying") || (cvar("g_balance_rocketlauncher_detonatedelay") == 0 && stof(cvar_defstring("g_balance_rocketlauncher_detonatedelay")) != 0)) + MUTATOR_ADD(mutator_rocketflying); g_bugrigs = cvar("g_bugrigs"); g_bugrigs_planar_movement = cvar("g_bugrigs_planar_movement"); @@ -1674,6 +1671,7 @@ void precache() precache_sound ("weapons/weapon_switch.wav"); precache_sound ("weapons/weaponpickup.wav"); precache_sound ("weapons/unavailable.wav"); + precache_sound ("weapons/dryfire.wav"); if (g_grappling_hook) { precache_sound ("weapons/hook_fire.wav"); // hook @@ -1915,6 +1913,13 @@ void adaptor_think2use() activator = a; } +void adaptor_think2use_hittype_splash() // for timed projectile detonation +{ + if not(self.flags & FL_ONGROUND) // if onground, we ARE touching something, but HITTYPE_SPLASH is to be networked if the damage causing projectile is not touching ANYTHING + self.projectiledeathtype |= HITTYPE_SPLASH; + adaptor_think2use(); +} + // deferred dropping void DropToFloor_Handler() { @@ -2063,6 +2068,67 @@ void print_to(entity e, string s) print(s, "\n"); } +string uid2name(string myuid) { + // TODO TODO TODO! + // store uid in separate uid2name db IF CLIENT ALLOWS THIS + // - make it global for all mods + // perhaps show 10 first digits here if missing name? + string s; + s = db_get(ServerProgsDB, strcat("uid2name", myuid)); + + if(s == "") + s = "^1Unregistered Player"; + return s; +} + +float race_GetTime(string map, float pos) +{ + float rr; + if(g_cts) + rr = CTS_RECORD; + else + rr = RACE_RECORD; + + return stof(db_get(ServerProgsDB, strcat(map, rr, "time", ftos(pos)))); +} + +string race_GetUID(string map, float pos) +{ + float rr; + if(g_cts) + rr = CTS_RECORD; + else + rr = RACE_RECORD; + + return stof(db_get(ServerProgsDB, strcat(map, rr, "time", ftos(pos)))); +} + +string race_GetName(string map, float pos) +{ + float rr; + if(g_cts) + rr = CTS_RECORD; + else + rr = RACE_RECORD; + + return uid2name(db_get(ServerProgsDB, strcat(map, rr, "crypto_idfp", ftos(pos)))); +} + +string race_PlaceName(float pos) { + if(pos < 10 || pos > 20) + { + if(pos % 10 == 1) + return strcat(ftos(pos), "st"); + else if(pos % 10 == 2) + return strcat(ftos(pos), "nd"); + else if(pos % 10 == 3) + return strcat(ftos(pos), "rd"); + else + return strcat(ftos(pos), "th"); + } + else + return strcat(ftos(pos), "th"); +} string getrecords(float page) // 50 records per page { float rec; @@ -2084,6 +2150,7 @@ string getrecords(float page) // 50 records per page r = stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, "/captimerecord/time"))); if (r == 0) continue; + // TODO: uid2name h = db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, "/captimerecord/netname")); s = strcat(s, strpad(32, MapInfo_Map_bspname), " ", strpad(-6, ftos_decimals(r, 2)), " ", h, "\n"); ++rec; @@ -2097,10 +2164,10 @@ string getrecords(float page) // 50 records per page { if (MapInfo_Get_ByID(i)) { - r = stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, RACE_RECORD, "time"))); + r = race_GetTime(MapInfo_Map_bspname, 1); if (r == 0) continue; - h = db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, RACE_RECORD, "netname")); + h = race_GetName(MapInfo_Map_bspname, 1) s = strcat(s, strpad(32, MapInfo_Map_bspname), " ", strpad(-8, TIME_ENCODED_TOSTRING(r)), " ", h, "\n"); ++rec; } @@ -2113,10 +2180,10 @@ string getrecords(float page) // 50 records per page { if (MapInfo_Get_ByID(i)) { - r = stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, CTS_RECORD, "time"))); + r = race_GetTime(MapInfo_Map_bspname, 1); if (r == 0) continue; - h = db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, CTS_RECORD, "netname")); + h = race_GetName(MapInfo_Map_bspname, 1) s = strcat(s, strpad(32, MapInfo_Map_bspname), " ", strpad(-8, TIME_ENCODED_TOSTRING(r)), " ", h, "\n"); ++rec; } @@ -2146,10 +2213,10 @@ string getrankings() for (i = 1; i <= RANKINGS_CNT; ++i) { - t = race_GetTime(i); + t = race_GetTime(map, i); if (t == 0) continue; - n = race_GetName(i); + n = race_GetName(map, i); p = race_PlaceName(i); s = strcat(s, strpad(8, p), " ", strpad(-8, TIME_ENCODED_TOSTRING(t)), " ", n, "\n"); } @@ -2162,6 +2229,163 @@ string getrankings() return strcat("Records for ", map, ":\n", s); } +const float LADDER_FIRSTPOINT = 100; +const float LADDER_CNT = 10; // position X still gives LADDER_FIRSTPOINT/X points +const float LADDER_SIZE = 30; // ladder shows the top X players +string top_uids[LADDER_SIZE]; +float top_scores[LADDER_SIZE]; +float UIDCNT; +string getladder() +{ + float i, j, k; + string s, len, temp_s; + + s = ""; + temp_s = ""; + + string myuid; + + for (k = 0; k < MapInfo_count; ++k) + { + if (MapInfo_Get_ByID(k)) + { + for (i = 0; i < LADDER_CNT; ++i) { + if(stof(db_get(ServerProgsDB, strcat(GetMapname(), rr, "time", ftos(Ii)))) == 0) + break; + + myuid = db_get(ServerProgsDB, strcat(GetMapname(), rr, "crypto_idfp", ftos(i))); + + // string s contains: + // arg 0 = # of speed recs + // arg 1 = # of 1st place recs + // arg 2 = # of 2nd place recs + // ... etc + // LADDER_CNT+1 = total points + + temp_s = db_get(TemporaryDB, strcat("ladder", myuid)); + if (temp_s == "") + { + db_put(TemporaryDB, strcat("uid", ftos(UIDCNT)), myuid); + ++UIDCNT; + for (j = 0; j <= LADDER_CNT + 1; ++j) + { + if(j != LADDER_CNT + 1) + temp_s = strcat(temp_s, "0 "); + else + temp_s = strcat(temp_s, "0"); + } + } + + len = tokenize_console(temp_s); + s = ""; + + if(i == 0) // speedrec + for (j = 0; j <= LADDER_CNT; ++j) // loop over each arg in the string + { + if(j == 0) // speed rec! + s = strcat(s, ftos(stof(argv(j)) +1)); // add 1 to speed rec count and write + else + s = strcat(s, " ", argv(j)); // just copy over everything else + } + else // record + for (j = 0; j <= LADDER_CNT; ++j) // loop over each arg in the string + { + if(j == 0) + s = strcat(s, argv(j)); // speed rec, dont prefix with " " + else if(j == i) // wanted rec! + s = strcat(s, " ", ftos(stof(argv(j)) +1)); // update argv(j) + else + s = strcat(s, " ", argv(j)); // just copy over everything else + } + + // total points are (by default) calculated like this: + // speedrec = floor(100 / 10) = 10 points + // 1st place = floor(100 / 1) = 100 points + // 2nd place = floor(100 / 2) = 50 points + // 3rd place = floor(100 / 3) = 33 points + // 4th place = floor(100 / 4) = 25 points + // 5th place = floor(100 / 5) = 20 points + // ... etc + + if(i == 0) + s = strcat(s, " ", ftos(stof(argv(LADDER_CNT+1)) + LADDER_FIRSTPOINT / 10)); // speedrec, add LADDER_FIRSTPOINT / 10 points + else + s = strcat(s, " ", ftos(stof(argv(LADDER_CNT+1)) + floor(LADDER_FIRSTPOINT / i))); // record, add LADDER_FIRSTPOINT / i points + + db_put(TemporaryDB, strcat("ladder", myuid), s); + } + } + } + } + + float thiscnt; + string thisuid; + for (i = 0; i <= UIDCNT; ++i) // for each known uid + { + thisuid = db_get(TemporaryDB, strcat("uid", ftos(i))); + temp_s = db_get(TemporaryDB, strcat("ladder", thisuid)); + len = tokenize_console(temp_s); + thiscnt = stof(argv(LADDER_CNT+1)); + + if(thiscnt > top_scores[LADDER_SIZE-1]) + for (j = 0; j < LADDER_SIZE; ++j) // for each place in ladder + { + if(thiscnt > top_scores[j]) + { + for (k = LADDER_SIZE-1; k >= j; --k) + { + top_uids[k] = top_uids[k-1]; + top_scores[k] = top_scores[k-1]; + } + top_uids[j] = thisuid; + top_scores[j] = thiscnt; + break; + } + } + } + + s = "^3-----------------------\n\n"; + + s = strcat(s, "Pos ^3|"); + s = strcat(s, " ^7Total ^3|"); + for (i = 1; i <= LADDER_CNT; ++i) + { + s = strcat(s, " ^7", race_PlaceName(i), " ^3|"); + } + s = strcat(s, " ^7Speed awards ^3| ^7Name"); + + s = strcat(s, "\n^3----+--------"); + for (i = 1; i <= LADDER_CNT; ++i) + { + s = strcat(s, "+-----"); + } + s = strcat(s, "+--------------+--------------------\n"); + + for (i = 0; i < LADDER_SIZE; ++i) + { + temp_s = db_get(TemporaryDB, strcat("ladder", top_uids[i])); + len = tokenize_console(temp_s); + if (argv(LADDER_CNT+1) == "") // total is 0, skip + continue; + s = strcat(s, strpad(4, race_PlaceName(i+1)), "^3| ^7"); // pos + s = strcat(s, strpad(7, argv(LADDER_CNT+1)), "^3| ^7"); // total + for (j = 1; j <= LADDER_CNT; ++j) + { + s = strcat(s, strpad(4, argv(j)), "^3| ^7"); // 1st, 2nd, 3rd etc cnt + } + s = strcat(s, strpad(13, argv(0)), "^3| ^7"); // speed rec cnt + s = strcat(s, race_GetName_OfUID(top_uids[i]), "\n"); // name + } + + MapInfo_ClearTemps(); + + if (s == "") + return "No ladder on this server!\n"; + else + return strcat("Top ", ftos(LADDER_SIZE), " ladder rankings:\n", s); +} + + float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance) { float m, i; @@ -2329,9 +2553,9 @@ void write_recordmarker(entity pl, float tstart, float dt) " ", ftos(tstart), " ", ftos(dt), "\n")); } -vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter) +vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter, float algn) { - switch(self.owner.cvar_cl_gunalign) + switch(algn) { case 1: // right break; @@ -2371,7 +2595,7 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter return vecs; } -vector shotorg_adjust(vector vecs, float y_is_right, float visual) +vector shotorg_adjust_values(vector vecs, float y_is_right, float visual, float algn) { string s; vector v; @@ -2380,7 +2604,7 @@ vector shotorg_adjust(vector vecs, float y_is_right, float visual) { if (visual) { - vecs = shotorg_adjustfromclient(vecs, y_is_right, TRUE); + vecs = shotorg_adjustfromclient(vecs, y_is_right, TRUE, algn); } else { @@ -2392,7 +2616,7 @@ vector shotorg_adjust(vector vecs, float y_is_right, float visual) { if (visual) { - vecs = shotorg_adjustfromclient(vecs, y_is_right, TRUE); + vecs = shotorg_adjustfromclient(vecs, y_is_right, TRUE, algn); } else { @@ -2412,11 +2636,15 @@ vector shotorg_adjust(vector vecs, float y_is_right, float visual) } else if (cvar("g_shootfromclient")) { - vecs = shotorg_adjustfromclient(vecs, y_is_right, (cvar("g_shootfromclient") >= 2)); + vecs = shotorg_adjustfromclient(vecs, y_is_right, (cvar("g_shootfromclient") >= 2), algn); } return vecs; } +vector shotorg_adjust(vector vecs, float y_is_right, float visual) +{ + return shotorg_adjust_values(vecs, y_is_right, visual, self.owner.cvar_cl_gunalign); +} void attach_sameorigin(entity e, entity to, string tag)