From 438032ab72de7b54639ff994e4c49fc9a2449cdb Mon Sep 17 00:00:00 2001 From: div0 Date: Wed, 1 Oct 2008 07:41:23 +0000 Subject: [PATCH] experimental team radar (try: cl_teamradar 1) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4566 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/defaultNexuiz.cfg | 2 + data/maps/bloodprisonctf_mini.tga | Bin 0 -> 65554 bytes data/maps/dismal_mini.tga | Bin 0 -> 65554 bytes data/{gfx => maps}/ons-reborn_mini.tga | Bin data/qcsrc/client/Main.qc | 10 +- data/qcsrc/client/View.qc | 4 + data/qcsrc/client/main.qh | 2 + data/qcsrc/client/progs.src | 2 + data/qcsrc/client/teamradar.qc | 121 +++++++++++++++++++++++++ data/qcsrc/client/teamradar.qh | 1 + data/qcsrc/common/mapinfo.qc | 2 +- data/qcsrc/server/ent_cs.qc | 34 ++----- data/qcsrc/server/gamecommand.qc | 4 +- data/qcsrc/server/teamplay.qc | 4 +- 14 files changed, 152 insertions(+), 34 deletions(-) create mode 100644 data/maps/bloodprisonctf_mini.tga create mode 100644 data/maps/dismal_mini.tga rename data/{gfx => maps}/ons-reborn_mini.tga (100%) create mode 100644 data/qcsrc/client/teamradar.qc create mode 100644 data/qcsrc/client/teamradar.qh diff --git a/data/defaultNexuiz.cfg b/data/defaultNexuiz.cfg index 97d6ce458..b5b866722 100644 --- a/data/defaultNexuiz.cfg +++ b/data/defaultNexuiz.cfg @@ -1142,3 +1142,5 @@ seta sv_status_privacy 1 // hide IP addresses from "status" replies shown to cli r_subdivisions_mintess 3 r_subdivisions_maxtess 3 r_subdivisions_tolerance 1000000 + +set cl_teamradar 0 diff --git a/data/maps/bloodprisonctf_mini.tga b/data/maps/bloodprisonctf_mini.tga new file mode 100644 index 0000000000000000000000000000000000000000..71aaefab1230183c356c1250467c29f0d531a593 GIT binary patch literal 65554 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

hd%C^XDLpKbQDtyzM8$>G;$&O#X}DE$PFjqv$jE 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 literal 0 HcmV?d00001 diff --git a/data/gfx/ons-reborn_mini.tga b/data/maps/ons-reborn_mini.tga similarity index 100% rename from data/gfx/ons-reborn_mini.tga rename to data/maps/ons-reborn_mini.tga diff --git a/data/qcsrc/client/Main.qc b/data/qcsrc/client/Main.qc index f78104ebb..69d908ce4 100644 --- a/data/qcsrc/client/Main.qc +++ b/data/qcsrc/client/Main.qc @@ -325,16 +325,20 @@ float CSQC_InputEvent(float bInputType, float nPrimary, float nSecondary) // -------------------------------------------------------------------------- // BEGIN OPTIONAL CSQC FUNCTIONS -void Ent_ReadONS() +void Ent_ReadEntCS() { entity gps; using_gps = true; + InterpolateOrigin_Undo(); + self.origin_x = ReadCoord(); self.origin_y = ReadCoord(); self.angles_y = ReadCoord(); self.origin_z = self.angles_x = self.angles_z = 0; + InterpolateOrigin_Note(); + for(gps = gps_start; gps; gps = gps.chain) { if(gps == self) @@ -487,7 +491,7 @@ void(float bIsNewEntity) CSQC_Ent_Update = { switch(msg) { - case ENTCS_MSG_ONS_GPS: Ent_ReadONS(); break; + case ENTCS_MSG_ONS_GPS: Ent_ReadEntCS(); break; case ENTCS_MSG_ONS_REMOVE: Ent_RemoveONS(); break; default: error("unknown ENTCS_MSG type\n"); @@ -576,7 +580,7 @@ void Gamemode_Init() get_mi_min_max(); mi_center = (mi_min + mi_max) * 0.5; mi_scale = mi_max - mi_min; - minimapname = strzone(strcat("gfx/", mi_shortname, "_mini.tga")); + minimapname = strzone(strcat("maps/", mi_shortname, "_mini.tga")); shortmapname = mi_shortname; if(gametype == GAME_ONSLAUGHT) { diff --git a/data/qcsrc/client/View.qc b/data/qcsrc/client/View.qc index f709036fb..8da72277b 100644 --- a/data/qcsrc/client/View.qc +++ b/data/qcsrc/client/View.qc @@ -161,6 +161,8 @@ vector GetCurrentFov(float fov) } } + current_zoomfraction = (current_viewzoom - 1) / (1/zoomfactor - 1); + if(zoomsensitivity < 1) setsensitivityscale(pow(current_viewzoom, 1 - zoomsensitivity)); else @@ -306,6 +308,8 @@ void CSQC_UpdateView(void) ons_view(); //drawresetcliparea(); } + else if(teamplay) + teamradar_view(); } void Sbar_Draw(); diff --git a/data/qcsrc/client/main.qh b/data/qcsrc/client/main.qh index ed9291f1c..1f7fb5165 100644 --- a/data/qcsrc/client/main.qh +++ b/data/qcsrc/client/main.qh @@ -135,3 +135,5 @@ float ready_waiting; float ready_waiting_for_me; float vote_waiting; float vote_waiting_for_me; + +float current_zoomfraction; diff --git a/data/qcsrc/client/progs.src b/data/qcsrc/client/progs.src index 262643403..e036daac6 100644 --- a/data/qcsrc/client/progs.src +++ b/data/qcsrc/client/progs.src @@ -10,6 +10,7 @@ csqc_builtins.qc ../common/mapinfo.qh ../common/util.qh interpolate.qh +teamradar.qh main.qh @@ -30,6 +31,7 @@ laser.qc Main.qc View.qc interpolate.qc +teamradar.qc ../common/util.qc ../common/gamecommand.qc diff --git a/data/qcsrc/client/teamradar.qc b/data/qcsrc/client/teamradar.qc new file mode 100644 index 000000000..64ae0e78d --- /dev/null +++ b/data/qcsrc/client/teamradar.qc @@ -0,0 +1,121 @@ +float DEG2RAD = 0.01745329251994329576; + +float teamradar_angle; // player yaw angle +vector teamradar_origin3d_in_texcoord; // player origin +vector teamradar_origin2d; // 2D origin +vector teamradar_size2d; // 2D size +float teamradar_size; // 2D scale factor +float teamradar_scale; // window size = ...qu + +vector teamradar_3dcoord_to_texcoord(vector in) +{ + vector out; + out_x = (in_x - mi_picmin_x) / (mi_picmax_x - mi_picmin_x); + out_y = (in_y - mi_picmin_y) / (mi_picmax_y - mi_picmin_y); + out_z = 0; + return out; +} + +vector teamradar_texcoord_to_2dcoord(vector in) +{ + vector out; + in -= teamradar_origin3d_in_texcoord; + + out_x = in_y * sin(teamradar_angle * DEG2RAD) + in_x * cos(teamradar_angle * DEG2RAD); + out_y = in_y * cos(teamradar_angle * DEG2RAD) - in_x * sin(teamradar_angle * DEG2RAD); + out_y = - out_y; // WHY?!? TODO find out whether the map images are mirrored too + + out = out * teamradar_size; + out += teamradar_origin2d; + return out; +} + +vector yinvert(vector v) +{ + v_y = -v_y; + return v; +} + +void draw_teamradar_background() +{ + R_BeginPolygon(minimapname, 0); + R_PolygonVertex('1 0 0' * (teamradar_origin2d_x - teamradar_size2d_x * 0.5) + '0 1 0' * (teamradar_origin2d_y - teamradar_size2d_y * 0.5), '0 0 0', '0 0 0', 1); + R_PolygonVertex('1 0 0' * (teamradar_origin2d_x + teamradar_size2d_x * 0.5) + '0 1 0' * (teamradar_origin2d_y - teamradar_size2d_y * 0.5), '0 0 0', '0 0 0', 1); + R_PolygonVertex('1 0 0' * (teamradar_origin2d_x + teamradar_size2d_x * 0.5) + '0 1 0' * (teamradar_origin2d_y + teamradar_size2d_y * 0.5), '0 0 0', '0 0 0', 1); + R_PolygonVertex('1 0 0' * (teamradar_origin2d_x - teamradar_size2d_x * 0.5) + '0 1 0' * (teamradar_origin2d_y + teamradar_size2d_y * 0.5), '0 0 0', '0 0 0', 1); + R_EndPolygon(); + R_BeginPolygon(minimapname, DRAWFLAG_ADDITIVE); + R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord0), yinvert(mi_pictexcoord0), '1 1 1', 1); + R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord1), yinvert(mi_pictexcoord1), '1 1 1', 1); + R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord2), yinvert(mi_pictexcoord2), '1 1 1', 1); + R_PolygonVertex(teamradar_texcoord_to_2dcoord(mi_pictexcoord3), yinvert(mi_pictexcoord3), '1 1 1', 1); + R_EndPolygon(); +} + +void(vector coord3d, vector pangles, vector rgb) draw_teamradar_player = +{ + vector coord; + + coord = teamradar_texcoord_to_2dcoord(teamradar_3dcoord_to_texcoord(coord3d)); + + makevectors(pangles - '0 1 0' * teamradar_angle); + v_forward_z = 0; + v_forward = normalize(v_forward); + v_forward_y *= -1.0; + v_right_x = -v_forward_y; + v_right_y = v_forward_x; + + R_BeginPolygon("", 0); + R_PolygonVertex(coord+v_forward*2, '0 0 0', rgb, 1); + R_PolygonVertex(coord+v_right*3-v_forward*2, '0 1 0', rgb, 1); + R_PolygonVertex(coord-v_forward, '1 0 0', rgb, 1); + R_PolygonVertex(coord-v_right*3-v_forward*2, '1 1 0', rgb, 1); + R_EndPolygon(); +}; + +void() teamradar_view = +{ + local float color; + local vector coord, rgb; + local entity tm; + float scale2d, normalsize, bigsize; + + if(!cvar("cl_teamradar")) + return; + + color = GetPlayerColor(player_localentnum-1); + rgb = GetTeamRGB(color); + + scale2d = max( + mi_picmax_x - mi_picmin_x, + mi_picmax_y - mi_picmin_y + ); + + teamradar_angle = input_angles_y - 90; + teamradar_origin2d = '64 64 0'; + teamradar_size2d = '128 128 0'; + teamradar_scale = 1024; + + normalsize = teamradar_size2d_x * scale2d / teamradar_scale; + bigsize = teamradar_size2d_x * scale2d / max(teamradar_scale, vlen(mi_min - mi_max)); + teamradar_size = + current_zoomfraction * bigsize + + (1 - current_zoomfraction) * normalsize; + teamradar_origin3d_in_texcoord = teamradar_3dcoord_to_texcoord( + current_zoomfraction * (mi_min + mi_max) * 0.5 + + (1 - current_zoomfraction) * pmove_org); + + drawsetcliparea( + teamradar_origin2d_x - teamradar_size2d_x * 0.5, + teamradar_origin2d_y - teamradar_size2d_y * 0.5, + teamradar_size2d_x, + teamradar_size2d_y + ); + + draw_teamradar_background(); + draw_teamradar_player(pmove_org, input_angles, '1 1 1'); + for(tm = gps_start; tm != world; tm = tm.chain) + draw_teamradar_player(tm.origin, tm.angles, rgb); + + drawresetcliparea(); +}; diff --git a/data/qcsrc/client/teamradar.qh b/data/qcsrc/client/teamradar.qh new file mode 100644 index 000000000..9e1ebf8a9 --- /dev/null +++ b/data/qcsrc/client/teamradar.qh @@ -0,0 +1 @@ +void teamradar_view(); diff --git a/data/qcsrc/common/mapinfo.qc b/data/qcsrc/common/mapinfo.qc index c04df1a00..c74f3059f 100644 --- a/data/qcsrc/common/mapinfo.qc +++ b/data/qcsrc/common/mapinfo.qc @@ -618,7 +618,7 @@ float MapInfo_Get_ByName(string pFilename, float pAllowGenerate, float pGametype } else if(t == "size") { - float a, b, c, d, e, f; + float a, b, c, d, e; t = car(s); s = cdr(s); a = stof(t); t = car(s); s = cdr(s); b = stof(t); t = car(s); s = cdr(s); c = stof(t); diff --git a/data/qcsrc/server/ent_cs.qc b/data/qcsrc/server/ent_cs.qc index 30dfb3c7e..c562cfee2 100644 --- a/data/qcsrc/server/ent_cs.qc +++ b/data/qcsrc/server/ent_cs.qc @@ -35,7 +35,7 @@ entity get_entcs_ent() void entcs_ons(entity to) { if(to == self.owner || self.team != to.team || - self.owner.classname == "observer" || to.classname == "observer") + self.owner.classname == "observer" || to.classname == "observer") { WriteByte(MSG_ENTITY, ENTCS_MSG_ONS_REMOVE); return; @@ -48,36 +48,21 @@ void entcs_ons(entity to) void entcs_common_self() { - /* - entity pl; - if(self.pingtime < time) - { - self.pingtime = time + 9; // keep it 1 below the non-ons update intervall - // just to be safe... (blah) - WriteByte(MSG_ENTITY, ENTCS_MSG_PING); - FOR_EACH_REALCLIENT(pl) - { - WriteByte(MSG_ENTITY, num_for_edict(pl)); - WriteShort(MSG_ENTITY, pl.ping); - } - WriteByte(MSG_ENTITY, 0); - } - */ } float entcs_send(entity to) { WriteByte(MSG_ENTITY, ENT_CLIENT_ENTCS); WriteByte(MSG_ENTITY, self.health); // serves as entitynumber - + if(to == self.owner) { entcs_common_self(); } - - if(g_onslaught) + + if(teams_matter) entcs_ons(to); - + WriteByte(MSG_ENTITY, ENTCS_MSG_END); return TRUE; }; @@ -87,10 +72,7 @@ void entcs_think() self.team = self.owner.team; self.Version++; setorigin(self, self.owner.origin); - if(game == GAME_ONSLAUGHT) - self.nextthink = time + 0.1; - else - self.nextthink = time + 10; // update pings every 10 seconds + self.nextthink = time; }; entity attach_entcs() @@ -98,8 +80,6 @@ entity attach_entcs() local float num; local entity ent; - print("Attaching ENTCS entity\n"); - num = num_for_edict(self); ent = get_entcs_ent(); @@ -113,7 +93,7 @@ entity attach_entcs() ent.model = "entcs_sender"; ent.modelindex = 1; setsize(ent, '0 0 0', '0 0 0'); - + ent.SendEntity = entcs_send; return ent; }; diff --git a/data/qcsrc/server/gamecommand.qc b/data/qcsrc/server/gamecommand.qc index 9dbc014a1..cb81bb74c 100644 --- a/data/qcsrc/server/gamecommand.qc +++ b/data/qcsrc/server/gamecommand.qc @@ -37,7 +37,7 @@ float RoughMapAtPoint(float x, float y, float w, float h) return floor(FullTraceFraction(a, mi, ma, b) / (world.maxs_z - world.mins_z) * 255); } #else -float RoughMapAtPoint(float x, float y, float w, float h, vector mi_min, vector mi_max) +float RoughMapAtPoint(float x, float y, float w, float h) { vector o, mi, ma; float i, r; @@ -103,7 +103,7 @@ void RoughMap() fputs(f, "\""); for(x = 0; x < m; ++x) { - l = RoughMapAtPoint(mi_min_x + x * w, mi_min_y + y * h, w, h, mi_picmin, mi_picmax); + l = RoughMapAtPoint(mi_min_x + x * w, mi_min_y + y * h, w, h); fputs(f, substring(doublehex, 2 * l, 2)); } if(y == 0) diff --git a/data/qcsrc/server/teamplay.qc b/data/qcsrc/server/teamplay.qc index 75b7dc618..40e574404 100644 --- a/data/qcsrc/server/teamplay.qc +++ b/data/qcsrc/server/teamplay.qc @@ -283,7 +283,6 @@ void InitGameplayMode() game = GAME_ONSLAUGHT; gamemode_name = "Onslaught"; ActivateTeamplay(); - entcs_init(); } if(g_race) @@ -316,6 +315,9 @@ void InitGameplayMode() ScoreRules_race(); } + if(teams_matter) + entcs_init(); + // save it (for the next startup) cvar_set("gamecfg", ftos(game)); -- 2.39.2