X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator%2Fgamemode_ctf.qc;h=4690cd8f5820dedbe682d8bc1a7c0ab036eabcef;hp=b3270577de5408342cb2892eeea5766c3b6ca4fb;hb=42c08e5c16159929187a67150750bce1770b6355;hpb=c31b9a5a1c0918c5c44a14d10f997d3b6c7e4f8f diff --git a/qcsrc/server/mutators/mutator/gamemode_ctf.qc b/qcsrc/server/mutators/mutator/gamemode_ctf.qc index b3270577de..4690cd8f58 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ctf.qc +++ b/qcsrc/server/mutators/mutator/gamemode_ctf.qc @@ -479,6 +479,7 @@ void ctf_Handle_Throw(entity player, entity receiver, int droptype) flag.solid = SOLID_TRIGGER; flag.ctf_dropper = player; flag.ctf_droptime = time; + navigation_dynamicgoal_set(flag); flag.flags = FL_ITEM | FL_NOTARGET; // clear FL_ONGROUND for MOVETYPE_TOSS @@ -921,11 +922,11 @@ void ctf_FlagThink(entity this) FOREACH_CLIENT(true, LAMBDA(ctf_CaptureShield_Update(it, 1))); // release shield only // sanity checks - if(this.mins != CTF_FLAG.m_mins || this.maxs != CTF_FLAG.m_maxs) { // reset the flag boundaries in case it got squished + if(this.mins != this.m_mins || this.maxs != this.m_maxs) { // reset the flag boundaries in case it got squished LOG_TRACE("wtf the flag got squashed?"); - tracebox(this.origin, CTF_FLAG.m_mins, CTF_FLAG.m_maxs, this.origin, MOVE_NOMONSTERS, this); + tracebox(this.origin, this.m_mins, this.m_maxs, this.origin, MOVE_NOMONSTERS, this); if(!trace_startsolid || this.noalign) // can we resize it without getting stuck? - setsize(this, CTF_FLAG.m_mins * this.scale, CTF_FLAG.m_maxs * this.scale); + setsize(this, this.m_mins, this.m_maxs); } // main think method @@ -1197,6 +1198,7 @@ void ctf_RespawnFlag(entity flag) flag.ctf_pickuptime = 0; flag.ctf_droptime = 0; flag.ctf_flagdamaged_byworld = false; + navigation_dynamicgoal_unset(flag); ctf_CheckStalemate(); } @@ -1225,8 +1227,7 @@ void ctf_DelayedFlagSetup(entity this) // called after a flag is placed on a map { // bot waypoints waypoint_spawnforitem_force(this, this.origin); - this.nearestwaypointtimeout = 0; // activate waypointing again - this.bot_basewaypoint = this.nearestwaypoint; + navigation_dynamicgoal_init(this, true); // waypointsprites entity basename; @@ -1318,6 +1319,8 @@ void ctf_FlagSetup(int teamnumber, entity flag) // called when spawning a flag e // appearence _setmodel(flag, flag.model); // precision set below setsize(flag, CTF_FLAG.m_mins * flag.scale, CTF_FLAG.m_maxs * flag.scale); + flag.m_mins = flag.mins; // store these for squash checks + flag.m_maxs = flag.maxs; setorigin(flag, (flag.origin + FLAG_SPAWN_OFFSET)); if(autocvar_g_ctf_flag_glowtrails) @@ -1372,7 +1375,7 @@ void ctf_FlagSetup(int teamnumber, entity flag) // called when spawning a flag e // NOTE: LEGACY CODE, needs to be re-written! -void havocbot_calculate_middlepoint() +void havocbot_ctf_calculate_middlepoint() { entity f; vector s = '0 0 0'; @@ -1389,8 +1392,23 @@ void havocbot_calculate_middlepoint() } if(!n) return; - havocbot_ctf_middlepoint = s / n; - havocbot_ctf_middlepoint_radius = vlen(fo - havocbot_ctf_middlepoint); + + havocbot_middlepoint = s / n; + havocbot_middlepoint_radius = vlen(fo - havocbot_middlepoint); + + havocbot_symmetryaxys_equation = '0 0 0'; + if(n == 2) + { + // for symmetrical editing of waypoints + entity f1 = ctf_worldflaglist; + entity f2 = f1.ctf_worldflagnext; + float m = -(f1.origin.y - f2.origin.y) / (f1.origin.x - f2.origin.x); + float q = havocbot_middlepoint.y - m * havocbot_middlepoint.x; + havocbot_symmetryaxys_equation.x = m; + havocbot_symmetryaxys_equation.y = q; + } + // store number of flags in this otherwise unused vector component + havocbot_symmetryaxys_equation.z = n; } @@ -1599,9 +1617,6 @@ void havocbot_ctf_reset_role(entity this) if(IS_DEAD(this)) return; - if(havocbot_ctf_middlepoint == '0 0 0') - havocbot_calculate_middlepoint(); - // Check ctf flags if (this.flagcarried) { @@ -1638,13 +1653,13 @@ void havocbot_ctf_reset_role(entity this) // Evaluate best position to take // Count mates on middle position - cmiddle = havocbot_ctf_teamcount(this, havocbot_ctf_middlepoint, havocbot_ctf_middlepoint_radius * 0.5); + cmiddle = havocbot_ctf_teamcount(this, havocbot_middlepoint, havocbot_middlepoint_radius * 0.5); // Count mates on defense position - cdefense = havocbot_ctf_teamcount(this, mf.dropped_origin, havocbot_ctf_middlepoint_radius * 0.5); + cdefense = havocbot_ctf_teamcount(this, mf.dropped_origin, havocbot_middlepoint_radius * 0.5); // Count mates on offense position - coffense = havocbot_ctf_teamcount(this, ef.dropped_origin, havocbot_ctf_middlepoint_radius); + coffense = havocbot_ctf_teamcount(this, ef.dropped_origin, havocbot_middlepoint_radius); if(cdefense<=coffense) havocbot_role_ctf_setrole(this, HAVOCBOT_CTF_ROLE_DEFENSE); @@ -1683,7 +1698,7 @@ void havocbot_role_ctf_carrier(entity this) navigation_goalrating_end(this); - if (this.navigation_hasgoals) + if (this.goalentity) this.havocbot_cantfindflag = time + 10; else if (time > this.havocbot_cantfindflag) { @@ -1926,15 +1941,15 @@ void havocbot_role_ctf_middle(entity this) { vector org; - org = havocbot_ctf_middlepoint; + org = havocbot_middlepoint; org.z = this.origin.z; this.bot_strategytime = time + autocvar_bot_ai_strategyinterval; navigation_goalrating_start(this); havocbot_goalrating_ctf_ourstolenflag(this, 50000); havocbot_goalrating_ctf_droppedflags(this, 30000, this.origin, 10000); - havocbot_goalrating_enemyplayers(this, 10000, org, havocbot_ctf_middlepoint_radius * 0.5); - havocbot_goalrating_items(this, 5000, org, havocbot_ctf_middlepoint_radius * 0.5); + havocbot_goalrating_enemyplayers(this, 10000, org, havocbot_middlepoint_radius * 0.5); + havocbot_goalrating_items(this, 5000, org, havocbot_middlepoint_radius * 0.5); havocbot_goalrating_items(this, 2500, this.origin, 10000); havocbot_goalrating_ctf_enemybase(this, 2500); navigation_goalrating_end(this); @@ -1975,11 +1990,7 @@ void havocbot_role_ctf_defense(entity this) } if (this.bot_strategytime < time) { - float mp_radius; - vector org; - - org = mf.dropped_origin; - mp_radius = havocbot_ctf_middlepoint_radius; + vector org = mf.dropped_origin; this.bot_strategytime = time + autocvar_bot_ai_strategyinterval; navigation_goalrating_start(this); @@ -2003,9 +2014,9 @@ void havocbot_role_ctf_defense(entity this) havocbot_goalrating_ctf_ourbase(this, 30000); havocbot_goalrating_ctf_ourstolenflag(this, 20000); - havocbot_goalrating_ctf_droppedflags(this, 20000, org, mp_radius); - havocbot_goalrating_enemyplayers(this, 15000, org, mp_radius); - havocbot_goalrating_items(this, 10000, org, mp_radius); + havocbot_goalrating_ctf_droppedflags(this, 20000, org, havocbot_middlepoint_radius); + havocbot_goalrating_enemyplayers(this, 15000, org, havocbot_middlepoint_radius); + havocbot_goalrating_items(this, 10000, org, havocbot_middlepoint_radius); havocbot_goalrating_items(this, 5000, this.origin, 10000); navigation_goalrating_end(this); } @@ -2719,6 +2730,8 @@ void ctf_DelayedInit(entity this) // Do this check with a delay so we can wait f if(tmp_entity.team == 0) { ctf_oneflag = true; } } + havocbot_ctf_calculate_middlepoint(); + if(NumTeams(ctf_teams) < 2) // somehow, there's not enough flags! { ctf_teams = 0; // so set the default red and blue teams