function CPlayer:moveTo(waypoint, ignoreCycleTargets) self:update(); local angle = math.atan2(waypoint.Z - self.Z, waypoint.X - self.X); local angleDif = angleDifference(angle, self.Direction); local canTarget = false; local startTime = os.time(); if( ignoreCycleTargets == nil ) then ignoreCycleTargets = false; end; if( waypoint.Type == WPT_TRAVEL ) then ignoreCycleTargets = true; end; -- Make sure we don't have a garbage (dead) target if( self.TargetPtr ~= 0 ) then local target = CPawn(self.TargetPtr); if( target.HP <= 1 ) then self:clearTarget(); end end -- If more than X degrees off, correct before moving. local rotateStartTime = os.time(); local turningDir = -1; -- 0 = left, 1 = right --oma keyboardHold( settings.hotkeys.MOVE_FORWARD.key ); yrest(150); while( angleDif > math.rad(65) ) do if( self.HP < 1 or self.Alive == false ) then return false, WF_NONE; end; if( settings.profile.options.QUICK_TURN == true ) then self:faceDirection(angle); angleDif = angleDifference(angle, self.Direction); break; end if( os.difftime(os.time(), rotateStartTime) > 3.0 ) then -- Sometimes both left and right rotate get stuck down. -- Press them both to make sure they are fully released. keyboardPress(settings.hotkeys.ROTATE_LEFT.key); keyboardPress(settings.hotkeys.ROTATE_RIGHT.key); -- we seem to have been distracted, take a step back. keyboardPress(settings.hotkeys.MOVE_BACKWARD.key); rotateStartTime = os.time(); end if( angleDifference(angle, self.Direction + 0.01) < angleDif ) then -- rotate left keyboardRelease( settings.hotkeys.ROTATE_RIGHT.key ); keyboardHold( settings.hotkeys.ROTATE_LEFT.key ); --self:faceDirection( angle ); else -- rotate right keyboardRelease( settings.hotkeys.ROTATE_LEFT.key ); keyboardHold( settings.hotkeys.ROTATE_RIGHT.key ); --self:faceDirection( angle ); end yrest(50); self:update(); angleDif = angleDifference(angle, self.Direction); end keyboardRelease( settings.hotkeys.ROTATE_LEFT.key ); keyboardRelease( settings.hotkeys.ROTATE_RIGHT.key ); local success, failreason = true, WF_NONE; local dist = distance(self.X, self.Z, waypoint.X, waypoint.Z); local lastDist = dist; local lastDistImprove = os.time(); --keyboardHold( settings.hotkeys.MOVE_FORWARD.key ); while( dist > 15.0 ) do if( self.HP < 1 or self.Alive == false ) then return false, WF_NONE; end; if( canTarget == false and os.difftime(os.time(), startTime) > 1 ) then canTarget = true; end if( canTarget and (not ignoreCycleTargets) and (not self.Battling) ) then if(settings.hotkeys.TARGET.modifier) then keyboardHold(settings.hotkeys.TARGET.modifier); end keyboardPress(settings.hotkeys.TARGET.key); if(settings.hotkeys.TARGET.modifier) then keyboardRelease(settings.hotkeys.TARGET.modifier); end yrest(10); end -- We've got a target, fight it instead of worrying about our waypoint. if( self:haveTarget() and self.Fighting == false ) then local target = self:getTarget(); if( not target:haveTarget() ) then -- Target is free, attack it. cprintf(cli.turquoise, "Stopping waypoint::target acquired\n"); success = false; failreason = WF_TARGET; break; end; if( target:getTarget().Address == self.Address ) then cprintf(cli.turquoise, language[28]); success = false; failreason = WF_TARGET; break; end end self:checkPotions(); -- We're still making progress if( dist < lastDist ) then lastDistImprove = os.time(); lastDist = dist; elseif( dist > lastDist + 40 ) then -- Make sure we didn't pass it up printf(language[29]); success = false; failreason = WF_DIST; break; end; if( os.difftime(os.time(), lastDistImprove) > 3 ) then -- We haven't improved for 3 seconds, assume stuck success = false; failreason = WF_STUCK; break; end dist = distance(self.X, self.Z, waypoint.X, waypoint.Z); angle = math.atan2(waypoint.Z - self.Z, waypoint.X - self.X); angleDif = angleDifference(angle, self.Direction); -- Continue to make sure we're facing the right direction if( angleDif > math.rad(15) ) then --keyboardRelease( settings.hotkeys.MOVE_FORWARD.key ); keyboardRelease( settings.hotkeys.MOVE_BACKWARD.key ); if( angleDifference(angle, self.Direction + 0.01) < angleDif ) then keyboardRelease( settings.hotkeys.ROTATE_RIGHT.key ); keyboardHold( settings.hotkeys.ROTATE_LEFT.key ); yrest(100); else keyboardRelease( settings.hotkeys.ROTATE_LEFT.key ); keyboardHold( settings.hotkeys.ROTATE_RIGHT.key ); yrest(100); end elseif( angleDif > 0.0 ) then keyboardRelease( settings.hotkeys.ROTATE_LEFT.key ); keyboardRelease( settings.hotkeys.ROTATE_RIGHT.key ); self:faceDirection(angle); --keyboardHold( settings.hotkeys.MOVE_FORWARD.key ); else keyboardRelease( settings.hotkeys.ROTATE_LEFT.key ); keyboardRelease( settings.hotkeys.ROTATE_RIGHT.key ); end --keyboardHold( settings.hotkeys.MOVE_FORWARD.key ); yrest(100); self:update(); waypoint:update(); end --keyboardRelease( settings.hotkeys.MOVE_FORWARD.key ); keyboardRelease( settings.hotkeys.ROTATE_LEFT.key ); keyboardRelease( settings.hotkeys.ROTATE_RIGHT.key ); if( success ) then -- We successfully reached the waypoint. -- Execute it's action, if it has one. if( waypoint.Action and type(waypoint.Action) == "string" ) then local actionchunk = loadstring(waypoint.Action); assert( actionchunk ); actionchunk(); end end return success, failreason; end