From 8e5da39ad7250b8fcd600acef1a3afce9c2b4ade Mon Sep 17 00:00:00 2001 From: Sheldon Johnson Date: Sun, 13 Oct 2024 23:22:18 +1100 Subject: [PATCH 1/3] WIP --- csqc/main.qc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/csqc/main.qc b/csqc/main.qc index fd78ce31..dc431cb1 100644 --- a/csqc/main.qc +++ b/csqc/main.qc @@ -191,6 +191,7 @@ noref void(float apiver, string enginename, float enginever) CSQC_Init = { precache_model("progs/turrpreview.mdl"); sentry_preview = spawn(); setmodel(sentry_preview, "progs/turrpreview.mdl"); + setsize(sentry_preview, '-16 -16 0', '16 16 48'); sentry_preview.alpha = 0.25; precache_model("progs/sphere.mdl"); @@ -218,6 +219,20 @@ void PMD_DrawGraphs(float width); DEFCVAR_FLOAT(fov, 90); +void adjustEntityAboveGround(entity ent) { + vector startPos, endPos; + + // Define start and end points for the trace downwards + startPos = ent.origin + '0 0 100'; // Start 100 units above the entity's origin + endPos = ent.origin - '0 0 1000'; // Trace downwards a sufficient distance + + // Perform the tracebox from startPos to endPos + tracebox(startPos, ent.mins, ent.maxs, endPos, MOVE_NORMAL, ent); + + // Move the entity up to be 1 unit above the ground + ent.origin[2] = trace_endpos[2] - (ent.mins[2] - ent.maxs[2]) + 1; // 1 unit above the ground +} + noref void(float width, float height, float menushown) CSQC_UpdateView = { float fts = perf_start_sample(&frame_timing); clearscene(); @@ -250,6 +265,7 @@ noref void(float width, float height, float menushown) CSQC_UpdateView = { v_forward_sentry.y = xy_pos.y; sentry_preview.origin = PM_Org() + v_forward_sentry; + adjustEntityAboveGround(sentry_preview); sentry_preview_range_sphere.origin = sentry_preview.origin; sentry_preview.angles_y = anglemod(view_angles_y + sentry_preview_offset); } else { From f5d9d48e20cd29c8875137535c85ef2e4a6278ad Mon Sep 17 00:00:00 2001 From: Sheldon Johnson Date: Thu, 17 Oct 2024 00:59:35 +1100 Subject: [PATCH 2/3] Use a tracebox to simplify sentry location --- csqc/main.qc | 6 ++--- share/engineer.qc | 63 ++++++----------------------------------------- ssqc/engineer.qc | 2 +- 3 files changed, 12 insertions(+), 59 deletions(-) diff --git a/csqc/main.qc b/csqc/main.qc index dc431cb1..d7ced5da 100644 --- a/csqc/main.qc +++ b/csqc/main.qc @@ -230,7 +230,7 @@ void adjustEntityAboveGround(entity ent) { tracebox(startPos, ent.mins, ent.maxs, endPos, MOVE_NORMAL, ent); // Move the entity up to be 1 unit above the ground - ent.origin[2] = trace_endpos[2] - (ent.mins[2] - ent.maxs[2]) + 1; // 1 unit above the ground + ent.origin[2] = trace_endpos[2] + 1; // 1 unit above the ground } noref void(float width, float height, float menushown) CSQC_UpdateView = { @@ -265,7 +265,7 @@ noref void(float width, float height, float menushown) CSQC_UpdateView = { v_forward_sentry.y = xy_pos.y; sentry_preview.origin = PM_Org() + v_forward_sentry; - adjustEntityAboveGround(sentry_preview); + /* adjustEntityAboveGround(sentry_preview); */ sentry_preview_range_sphere.origin = sentry_preview.origin; sentry_preview.angles_y = anglemod(view_angles_y + sentry_preview_offset); } else { @@ -879,7 +879,7 @@ void _Sync_ServerCommandFrame() { if (previewing_sentry) { if (game_state.is_alive) { - sentry_fits = CheckArea(sentry_preview, player_localentnum); + sentry_fits = CheckArea(sentry_preview, edict_num(player_localentnum)); sentry_preview.colormod = sentry_fits ? '1 1 1' : '0.5 0.2 0.2'; } else { SentryPreviewStop(); diff --git a/share/engineer.qc b/share/engineer.qc index 0bb2e0b1..04cbd525 100644 --- a/share/engineer.qc +++ b/share/engineer.qc @@ -1,59 +1,12 @@ -float (entity obj, float builder) CheckArea = { - local vector src; - local vector end; - local float pos; - local entity te; +float (entity obj, entity builder) CheckArea = { + vector start, end; + start = obj.origin; + end = start; + tracebox(start, obj.mins, obj.maxs, end, MOVE_NORMAL, builder); - pos = pointcontents(obj.origin); - if ((pos == CONTENT_SOLID) || (pos == CONTENT_SKY)) { + if (trace_inopen) { + return (1); + } else { return (0); } - src_x = (obj.origin_x) + 24; - src_y = (obj.origin_y) + 24; - src_z = (obj.origin_z); - pos = pointcontents(src); - if ((pos == CONTENT_SOLID) || (pos == CONTENT_SKY)) { - return (0); - } - end_x = (obj.origin_x) - 16; - end_y = (obj.origin_y) - 16; - end_z = (obj.origin_z); - traceline(src, end, 1, obj); - if (trace_fraction != 1) { - return (0); - } - pos = pointcontents(end); - if ((pos == CONTENT_SOLID) || (pos == CONTENT_SKY)) { - return (0); - } - src_x = (obj.origin_x) - 16; - src_y = (obj.origin_y) + 16; - src_z = (obj.origin_z); - pos = pointcontents(src); - if ((pos == CONTENT_SOLID) || (pos == CONTENT_SKY)) { - return (0); - } - end_x = (obj.origin_x) + 16; - end_y = (obj.origin_y) - 16; - end_z = (obj.origin_z); - traceline(src, end, 1, obj); - if (trace_fraction != 1) { - return (0); - } - pos = pointcontents(end); - if ((pos == CONTENT_SOLID) || (pos == CONTENT_SKY)) { - return (0); - } - /* traceline(builder.origin, obj.origin, 1, builder); */ - /* if (trace_fraction != 1) { */ - /* return (0); */ - /* } */ - - te = findradius(obj.origin, 64); - if (te != world) { - if !(te.movetype == MOVETYPE_WALK && builder && num_for_edict(te.owner) == builder) { - return (0); - } - } - return (1); }; diff --git a/ssqc/engineer.qc b/ssqc/engineer.qc index b3e83dc4..4d71d9d1 100644 --- a/ssqc/engineer.qc +++ b/ssqc/engineer.qc @@ -612,7 +612,7 @@ void (float objtobuild, float offset) TeamFortress_Build = { self.sentry_ticks = 0; } - if (!CheckArea(newmis, 0)) { + if (!CheckArea(newmis, self)) { sprint(self, PRINT_HIGH, "You can't build here\n"); dremove(newmis); return; From 6a1753a34be0cbd3dee287deb215784399cc39e5 Mon Sep 17 00:00:00 2001 From: Sheldon Johnson Date: Thu, 17 Oct 2024 20:30:44 +1100 Subject: [PATCH 3/3] Make building more flexible --- csqc/main.qc | 98 +++++++++++++++++++++-------------------------- share/engineer.qc | 28 +++++++++----- ssqc/engineer.qc | 2 +- 3 files changed, 63 insertions(+), 65 deletions(-) diff --git a/csqc/main.qc b/csqc/main.qc index d7ced5da..522be676 100644 --- a/csqc/main.qc +++ b/csqc/main.qc @@ -219,18 +219,38 @@ void PMD_DrawGraphs(float width); DEFCVAR_FLOAT(fov, 90); -void adjustEntityAboveGround(entity ent) { - vector startPos, endPos; +void SentryPreviewStart() { + sentry_preview_offset = 0; + sentry_preview.angles_y = input_angles_y; + sentry_preview.drawmask = MASK_ENGINE; + + local vector sphere_colormod = '1 1 1'; + switch (team_no) { + case 1: + sphere_colormod = '0 0.4 1'; + break; + case 2: + sphere_colormod = '1 0 0'; + break; + case 3: + sphere_colormod = '1 1 0'; + break; + case 4: + sphere_colormod = '0 1 0'; + break; + } - // Define start and end points for the trace downwards - startPos = ent.origin + '0 0 100'; // Start 100 units above the entity's origin - endPos = ent.origin - '0 0 1000'; // Trace downwards a sufficient distance + sentry_preview_range_sphere.colormod = sphere_colormod * 4; + sentry_preview_range_sphere.drawmask = MASK_ENGINE; - // Perform the tracebox from startPos to endPos - tracebox(startPos, ent.mins, ent.maxs, endPos, MOVE_NORMAL, ent); + previewing_sentry = TRUE; + prevent_firing = TRUE; +} - // Move the entity up to be 1 unit above the ground - ent.origin[2] = trace_endpos[2] + 1; // 1 unit above the ground +void SentryPreviewStop() { + previewing_sentry = FALSE; + sentry_preview.drawmask = 0; + sentry_preview_range_sphere.drawmask = 0; } noref void(float width, float height, float menushown) CSQC_UpdateView = { @@ -256,6 +276,16 @@ noref void(float width, float height, float menushown) CSQC_UpdateView = { PM_UpdateView(); if (previewing_sentry) { + if (game_state.is_alive) { + } else { + } + } + + if (previewing_sentry) { + if (!game_state.is_alive) { + SentryPreviewStop(); + } else { + } makevectors(view_angles); local vector v_forward_sentry; v_forward_sentry.z = (normalize(v_forward) * 64).z; @@ -265,7 +295,8 @@ noref void(float width, float height, float menushown) CSQC_UpdateView = { v_forward_sentry.y = xy_pos.y; sentry_preview.origin = PM_Org() + v_forward_sentry; - /* adjustEntityAboveGround(sentry_preview); */ + sentry_fits = PlaceSentry(sentry_preview, PM_Org()); + sentry_preview.colormod = sentry_fits ? '1 1 1' : '0.5 0.2 0.2'; sentry_preview_range_sphere.origin = sentry_preview.origin; sentry_preview.angles_y = anglemod(view_angles_y + sentry_preview_offset); } else { @@ -320,7 +351,7 @@ noref float(string cmd) CSQC_ConsoleCommand = { } else { localcmd("cmd sentry rotate 15\n"); } - break; + break; } break; case "specialdown": @@ -331,7 +362,7 @@ noref float(string cmd) CSQC_ConsoleCommand = { } else { localcmd("cmd sentry rotate -15\n"); } - break; + break; } break; case "+slot": @@ -718,40 +749,6 @@ void FO_ApplyCussInput() { void PM_InputFrame(); -void SentryPreviewStart() { - sentry_preview_offset = 0; - sentry_preview.angles_y = input_angles_y; - sentry_preview.drawmask = MASK_ENGINE; - - local vector sphere_colormod = '1 1 1'; - switch (team_no) { - case 1: - sphere_colormod = '0 0.4 1'; - break; - case 2: - sphere_colormod = '1 0 0'; - break; - case 3: - sphere_colormod = '1 1 0'; - break; - case 4: - sphere_colormod = '0 1 0'; - break; - } - - sentry_preview_range_sphere.colormod = sphere_colormod * 4; - sentry_preview_range_sphere.drawmask = MASK_ENGINE; - - previewing_sentry = TRUE; - prevent_firing = TRUE; -} - -void SentryPreviewStop() { - previewing_sentry = FALSE; - sentry_preview.drawmask = 0; - sentry_preview_range_sphere.drawmask = 0; -} - noref void CSQC_Input_Frame() { local float changed_buttons = input_buttons ^ oldbuttons; oldbuttons = input_buttons; @@ -876,15 +873,6 @@ void _Sync_ServerCommandFrame() { CsGrenTimer::UpdateSoundStack(); UpdateTeamColorCrosshair(); - - if (previewing_sentry) { - if (game_state.is_alive) { - sentry_fits = CheckArea(sentry_preview, edict_num(player_localentnum)); - sentry_preview.colormod = sentry_fits ? '1 1 1' : '0.5 0.2 0.2'; - } else { - SentryPreviewStop(); - } - } } diff --git a/share/engineer.qc b/share/engineer.qc index 04cbd525..01bb7083 100644 --- a/share/engineer.qc +++ b/share/engineer.qc @@ -1,12 +1,22 @@ -float (entity obj, entity builder) CheckArea = { - vector start, end; - start = obj.origin; - end = start; - tracebox(start, obj.mins, obj.maxs, end, MOVE_NORMAL, builder); +float PlaceSentry(entity sentry, vector builder_org) { + tracebox(sentry.origin, sentry.mins, sentry.maxs, sentry.origin, MOVE_NORMAL, sentry); - if (trace_inopen) { + if (trace_inopen) return (1); - } else { - return (0); + + local vector start = sentry.origin; + start_z = builder_org_z + 64; + + tracebox(start, sentry.mins, sentry.maxs, sentry.origin, MOVE_NORMAL, sentry); + + if (trace_fraction < 1.0) { + tracebox(trace_endpos, sentry.mins, sentry.maxs, trace_endpos, MOVE_NORMAL, sentry); + + if (trace_inopen) { + sentry.origin = trace_endpos; + return (1); + } } -}; + + return (0); +} diff --git a/ssqc/engineer.qc b/ssqc/engineer.qc index 4d71d9d1..0a8b3bac 100644 --- a/ssqc/engineer.qc +++ b/ssqc/engineer.qc @@ -612,7 +612,7 @@ void (float objtobuild, float offset) TeamFortress_Build = { self.sentry_ticks = 0; } - if (!CheckArea(newmis, self)) { + if (!PlaceSentry(newmis, self.origin)) { sprint(self, PRINT_HIGH, "You can't build here\n"); dremove(newmis); return;