Пример #1
0
// Returns if given location would hurt bot with
// falling damage (Thanks Count Floyd)
bool CBotNav::IsDeadlyDrop(const Vector &vecTargetPos)
{
   traceresult_t tr;

   Vector vecMove(0, (vecTargetPos - m_pBot->GetOrigin()).ToYaw(), 0), forward;
   vecMove.AngleVectors(&forward);

   Vector v_direction = (vecTargetPos - m_pBot->GetOrigin()).Normalize();   // 1 unit long
   Vector v_check = m_pBot->GetOrigin();
   Vector v_down = m_pBot->GetOrigin();

   v_down.z = v_down.z - 1000.0; // straight down 1000 units

   tr = PlayerTestLine(v_check, v_down, true, m_pBot->IsDucking(), m_pBot);

   // We're not on ground anymore?
   if (tr.fraction > 0.036)
      tr.fraction = 0.036;

   float height;
   float last_height = tr.fraction * 1000.0; // height from ground

   float distance = (vecTargetPos - v_check).Length(); // distance from goal

   while (distance > 16.0) {
      // move 10 units closer to the goal...
      v_check = v_check + v_direction * 16.0;

      v_down = v_check;
      v_down.z = v_down.z - 1000.0; // straight down 1000 units

      tr = PlayerTestLine(v_check, v_down, true, m_pBot->IsDucking(), m_pBot);

      // Wall blocking?
      if (tr.startsolid)
         return false;

      height = tr.fraction * 1000.0; // height from ground

      // Drops more than 100 Units?
      if (last_height < height - 100)
         return true;

      last_height = height;

      distance = (vecTargetPos - v_check).Length(); // distance from goal
   }

   return false;
}
bool MikeDrumTrackBuilder::OnMouseMove(UINT nFlags, double lfX, double lfY )
{
	mdsVector<2, double> p2ScreenCoord; 
	p2ScreenCoord[0] = 1.0-2.0*lfX; p2ScreenCoord[1] = 2.0*lfY-1.0; 
	if(m_pRayPicker)
	{
		mdsRay<double> rayNew;
		m_pRayPicker->PickRayFromScreenCoordStateless(p2ScreenCoord, rayNew);
		
		if(nFlags & MK_LBUTTON)
		{
			if(m_nSelectedRect >= 0)
			{
				mdsVector<3, double> vecCurrPt;
				mdsVector<3, double> vecLastPt;
				if(rayNew.RayHitPlane(0, 0, vecCurrPt) &&
					m_rayOld.RayHitPlane(0, 0, vecLastPt))
				{
					mdsVector<3, double> vecMove(vecCurrPt-vecLastPt);
					m_vecRects[m_nSelectedRect].TranslateBy(vecMove);
				}
			}
			else if(!(m_nFlagsLast & MK_LBUTTON))
			{
				mdsVector<3, double> vecSelectPos;

				int nWhichIter = 0;
				for(std::vector<CollisionRect>::iterator iter = m_vecRects.begin();
					m_nSelectedRect < 0 && iter != m_vecRects.end(); ++iter)
				{
					
					if((*iter).CollideRay(rayNew, vecSelectPos))
					{
						m_nSelectedRect = nWhichIter;
					}

					++nWhichIter;
				}

				if(m_nSelectedRect < 0)
				{
					mdsVector<3, double> vecBump;
					vecBump[0] = -1.0*m_arrRectsCopyFrom[0].GetCenter()[0];

					for(int i = 0; i < MaxRectsToCopy(); ++i)
					{
						if(m_arrRectsCopyFrom[i].CollideRay(rayNew, vecSelectPos))
						{
							m_nSelectedRect = m_vecRects.size();
							m_vecRects.push_back(m_arrRectsCopyFrom[i]);
							m_vecRects[m_nSelectedRect].TranslateBy(vecBump);
						}
					}
				}
			}
			if(m_nSelectedRect >= 0)
			{
				m_rayOld = rayNew;
				m_nFlagsLast = nFlags;
				return true;
			}
		}
		else
		{
			m_nSelectedRect = -1;
		}

		m_rayOld = rayNew;
		m_nFlagsLast = nFlags;
	}

	m_nFlagsLast = nFlags;
	// if we don't need the mouse event
	if(m_pMouseHandlerNext)
	{
		return m_pMouseHandlerNext->OnMouseMove(nFlags, lfX, lfY);
	}
	return false;
}