From 3482e3673e3d1f9b36b6970ec2af53f55b02abb4 Mon Sep 17 00:00:00 2001 From: div0 Date: Wed, 10 Jun 2009 13:42:59 +0000 Subject: [PATCH] bots: minor fixes, still not good... git-svn-id: svn://svn.icculus.org/nexuiz/trunk@6957 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/bots.qc | 98 +++++++++++++++++++++-------- data/qcsrc/server/bots_scripting.qc | 1 - data/qcsrc/server/gamecommand.qc | 9 +++ data/qcsrc/server/havocbot.qc | 4 +- 4 files changed, 83 insertions(+), 29 deletions(-) diff --git a/data/qcsrc/server/bots.qc b/data/qcsrc/server/bots.qc index c079dd91c..164c71445 100644 --- a/data/qcsrc/server/bots.qc +++ b/data/qcsrc/server/bots.qc @@ -111,6 +111,7 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float #ifdef DEBUG_TRACEWALK debugnodestatus(start, DEBUG_NODE_FAIL); #endif + //print("tracewalk: ", vtos(start), " is a bad start\n"); return FALSE; } @@ -125,6 +126,7 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float #ifdef DEBUG_TRACEWALK debugnodestatus(org, DEBUG_NODE_SUCCESS); #endif + //print("tracewalk: ", vtos(start), " can reach ", vtos(end), "\n"); return TRUE; } #ifdef DEBUG_TRACEWALK @@ -145,6 +147,7 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float #ifdef DEBUG_TRACEWALK debugnodestatus(org, DEBUG_NODE_FAIL); #endif + //print("tracewalk: ", vtos(start), " hits a hazard when trying to reach ", vtos(end), "\n"); return FALSE; } } @@ -176,6 +179,7 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float debugnodestatus(org, DEBUG_NODE_FAIL); #endif return FALSE; + //print("tracewalk: ", vtos(start), " failed under water\n"); } continue; @@ -221,6 +225,9 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float #ifdef DEBUG_TRACEWALK debugnodestatus(trace_endpos, DEBUG_NODE_FAIL); #endif + //print("tracewalk: ", vtos(start), " hit something when trying to reach ", vtos(end), "\n"); + //te_explosion(trace_endpos); + //print(ftos(e.dphitcontentsmask), "\n"); return FALSE; // failed } } @@ -251,6 +258,8 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float } } + //print("tracewalk: ", vtos(start), " did not arrive at ", vtos(end), " but at ", vtos(org), "\n"); + // moved but didn't arrive at the intended destination #ifdef DEBUG_TRACEWALK debugnodestatus(org, DEBUG_NODE_FAIL); @@ -561,10 +570,12 @@ void waypoint_think() { local entity e; local vector sv, sm1, sm2, ev, em1, em2, dv; + + stepheightvec = cvar("sv_stepheight") * '0 0 1'; + //dprint("waypoint_think wpisbox = ", ftos(self.wpisbox), "\n"); sm1 = self.origin + self.mins; sm2 = self.origin + self.maxs; - stepheightvec = cvar("sv_stepheight") * '0 0 1'; for(e = world; (e = find(e, classname, "waypoint")); ) { if (boxesoverlap(self.absmin, self.absmax, e.absmin, e.absmax)) @@ -769,6 +780,23 @@ entity waypoint_spawn(vector m1, vector m2, float f) waypoint_clearlinks(w); //waypoint_schedulerelink(w); + + if (cvar("g_waypointeditor")) + { + m1 = w.mins; + m2 = w.maxs; + setmodel(w, "models/runematch/rune.mdl"); w.effects = EF_LOWPRECISION; + setsize(w, m1, m2); + if (w.wpflags & WAYPOINTFLAG_ITEM) + w.colormod = '1 0 0'; + else if (w.wpflags & WAYPOINTFLAG_GENERATED) + w.colormod = '1 1 0'; + else + w.colormod = '1 1 1'; + } + else + w.model = ""; + return w; }; @@ -1285,6 +1313,9 @@ entity waypoint_spawnpersonal(vector position) { entity w; + tracebox(position, PL_MIN, PL_MAX, position + '0 0 -1024', MOVE_NORMAL, world); + if(trace_fraction < 1) + position = trace_endpos; w = waypoint_spawn(position, position, WAYPOINTFLAG_GENERATED | WAYPOINTFLAG_PERSONAL); w.nearestwaypoint = world; w.nearestwaypointtimeout = 0; @@ -1300,6 +1331,7 @@ entity waypoint_spawnpersonal(vector position) // completely empty the goal stack, used when deciding where to go void navigation_clearroute() { + //print("bot ", etos(self), " clear\n"); self.navigation_hasgoals = FALSE; self.goalcurrent = world; self.goalstack01 = world; @@ -1339,6 +1371,7 @@ void navigation_clearroute() // (in other words: add a new prerequisite before going to the later goals) void navigation_pushroute(entity e) { + //print("bot ", etos(self), " push ", etos(e), "\n"); self.goalstack31 = self.goalstack30; self.goalstack30 = self.goalstack29; self.goalstack29 = self.goalstack28; @@ -1378,6 +1411,7 @@ void navigation_pushroute(entity e) // (used when a spawnfunc_waypoint is reached) void navigation_poproute() { + //print("bot ", etos(self), " pop\n"); if(self.goalcurrent.wpflags & WAYPOINTFLAG_PERSONAL && self.goalcurrent.owner==self) remove(self.goalcurrent); @@ -1430,8 +1464,9 @@ entity navigation_findnearestwaypoint(entity ent, float walkfromwp) while (w) { // if object is touching spawnfunc_waypoint - if (boxesoverlap(pm1, pm2, w.absmin, w.absmax)) - return w; + if(w != ent) + if (boxesoverlap(pm1, pm2, w.absmin, w.absmax)) + return w; w = w.chain; } @@ -1448,39 +1483,45 @@ entity navigation_findnearestwaypoint(entity ent, float walkfromwp) while (w) { // if object can walk from spawnfunc_waypoint - if (w.wpisbox) - { - local vector wm1, wm2; - wm1 = w.origin + w.mins; - wm2 = w.origin + w.maxs; - v_x = bound(wm1_x, org_x, wm2_x); - v_y = bound(wm1_y, org_y, wm2_y); - v_z = bound(wm1_z, org_z, wm2_z); - } - else - v = w.origin; - dist = vlen(v - org); - if (bestdist > dist) + if(w != ent) { - if (walkfromwp) + if (w.wpisbox) { - traceline(v, org, TRUE, ent); - if (trace_fraction == 1) - if (tracewalk(ent, v, PL_MIN, PL_MAX, org, MOVE_NORMAL)) - { - bestdist = dist; - best = w; - } + local vector wm1, wm2; + wm1 = w.origin + w.mins; + wm2 = w.origin + w.maxs; + v_x = bound(wm1_x, org_x, wm2_x); + v_y = bound(wm1_y, org_y, wm2_y); + v_z = bound(wm1_z, org_z, wm2_z); } else + v = w.origin; + dist = vlen(v - org); + if (bestdist > dist) { traceline(v, org, TRUE, ent); if (trace_fraction == 1) - if (tracewalk(ent, org, PL_MIN, PL_MAX, v, MOVE_NORMAL)) { - bestdist = dist; - best = w; + if (walkfromwp) + { + //print("^1can I reach ", vtos(org), " from ", vtos(v), "?\n"); + if (tracewalk(ent, v, PL_MIN, PL_MAX, org, MOVE_NORMAL)) + { + bestdist = dist; + best = w; + } + } + else + { + if (tracewalk(ent, org, PL_MIN, PL_MAX, v, MOVE_NORMAL)) + { + bestdist = dist; + best = w; + } + } } + else + te_lightning1(world, v, org); } } w = w.chain; @@ -2639,6 +2680,7 @@ void botframe_showwaypointlinks() { //navigation_testtracewalk = TRUE; head = navigation_findnearestwaypoint(player, FALSE); + print("currently selected WP is ", etos(head), "\n"); //navigation_testtracewalk = FALSE; if (head) { @@ -2790,6 +2832,8 @@ void bot_serverframe() if (time < 2) return; + stepheightvec = cvar("sv_stepheight") * '0 0 1'; + if(time > autoskill_nextthink) { float a; diff --git a/data/qcsrc/server/bots_scripting.qc b/data/qcsrc/server/bots_scripting.qc index 756bb6da2..49deca2d7 100755 --- a/data/qcsrc/server/bots_scripting.qc +++ b/data/qcsrc/server/bots_scripting.qc @@ -897,7 +897,6 @@ float bot_cmd_movetotarget() { entity e; e = find(world, targetname, bot_cmd.bot_cmd_parm_string); - print(etos(e), "\n"); if(!e) return CMD_STATUS_ERROR; return self.cmd_moveto(e.origin + (e.mins + e.maxs) * 0.5); diff --git a/data/qcsrc/server/gamecommand.qc b/data/qcsrc/server/gamecommand.qc index b1a721782..697867b50 100644 --- a/data/qcsrc/server/gamecommand.qc +++ b/data/qcsrc/server/gamecommand.qc @@ -913,6 +913,15 @@ void GameCommand(string command) } } + if(argv(0) == "tracewalk") + { + e = nextent(world); + if(tracewalk(e, stov(argv(1)), e.mins, e.maxs, stov(argv(2)), MOVE_NORMAL)) + print("can walk\n"); + else + print("cannot walk\n"); + } + if(argv(0) == "bot_cmd") { if(argv(1) == "help") diff --git a/data/qcsrc/server/havocbot.qc b/data/qcsrc/server/havocbot.qc index 68bac28cc..9702ef105 100644 --- a/data/qcsrc/server/havocbot.qc +++ b/data/qcsrc/server/havocbot.qc @@ -1136,6 +1136,7 @@ float havocbot_moveto(vector pos) // Refresh path to goal if necessary local entity g; g = self.goalentity; + //print("bot ", etos(self), " goal = ", etos(g), "\n"); navigation_clearroute(); navigation_routetogoal(g,self.origin); bot_strategytoken_taken = TRUE; @@ -1170,8 +1171,9 @@ float havocbot_moveto(vector pos) // Put it as next goal navigation_clearroute(); - navigation_findnearestwaypoint(wp, TRUE); + wp.nearestwaypoint = navigation_findnearestwaypoint(wp, TRUE); navigation_routetogoal(wp,self.origin); + //print("bot ", etos(self), " goal = ", etos(self.goalentity), "\n"); bot_strategytoken_taken = TRUE; self.bot_strategytime = time + 10; -- 2.39.2