// 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; }