KVOID Kylin::ActSkill::OnTriggered( Factor* pFactor ) { // 只有以位置的技能是范围处理 KFLOAT fRadius = GetRange(); assert(fRadius); KPoint3 kPos = pFactor->GetTranslate(); KVEC<Ogre::Entity*> kEnts; if ( m_eType == AT_TAR) HitTarget(pFactor->GetTarget()); else OgreUtils::SphereQuery(kPos,fRadius,kEnts,KylinRoot::KR_NPC_MASK); for (KUINT i =0; i < kEnts.size(); i++) { if (kEnts[i]->getUserAny().isEmpty()) continue; KUINT uID = Ogre::any_cast<KUINT>(kEnts[i]->getUserAny()); if (uID != GetHostWorldID()) HitTarget(uID); } }
void CHSMissile::DoCycle() { // Do we need to delete ourselves? if (m_delete_me) { // Remove us from space CHSUniverse *cSource; cSource = GetUniverse(); if (cSource) { cSource->RemoveObject(this); } // Purge the object representing the missile prior to deallocating // memory if (hsInterface.ValidObject(GetDbref())) { hsInterface.DestroyObject(GetDbref()); } return; } // If we have no target or no parent, remove us from space. if (!m_target || !m_pData || !m_target->IsActive()) { hs_log("CHSMissile::DoCycle() Missile Data Invalid - Removing Object."); m_delete_me = true; return; } // Do we know how much time is left until we die? if (m_timeleft < 0) { CalculateTimeLeft(); } else { m_timeleft--; } // Missile depleted? if (0 == m_timeleft) { m_delete_me = true; return; } // Change the missile heading toward the target ChangeHeading(); // Move us closer to the target. MoveTowardTarget(); // The MoveTowardTarget() checks to see if the missile hits // so we just have to check our flag. if (m_target_hit) { // If we aren't designated to miss, apply damage if (m_specified_miss != true) { // BOOM! HitTarget(); } m_delete_me = true; // Delete next time around } }