Advertisement
Guest User

Untitled

a guest
Oct 5th, 2019
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.11 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "../eterLib/GrpMath.h"
  3. #include "../UserInterface/PythonBackground.h"
  4. #include "../UserInterface/Locale_inc.h"
  5. #include "ActorInstance.h"
  6.  
  7. void CActorInstance::__InitializeCollisionData()
  8. {
  9. m_canSkipCollision=false;
  10. }
  11.  
  12. void CActorInstance::EnableSkipCollision()
  13. {
  14. m_canSkipCollision=true;
  15. }
  16.  
  17. void CActorInstance::DisableSkipCollision()
  18. {
  19. m_canSkipCollision=false;
  20. }
  21.  
  22. bool CActorInstance::CanSkipCollision()
  23. {
  24. return m_canSkipCollision;
  25. }
  26.  
  27. void CActorInstance::UpdatePointInstance()
  28. {
  29. TCollisionPointInstanceListIterator itor;
  30. for (itor = m_DefendingPointInstanceList.begin(); itor != m_DefendingPointInstanceList.end(); ++itor)
  31. UpdatePointInstance(&(*itor));
  32. }
  33.  
  34. void CActorInstance::UpdatePointInstance(TCollisionPointInstance * pPointInstance)
  35. {
  36. if (!pPointInstance)
  37. {
  38. assert(!"CActorInstance::UpdatePointInstance - pPointInstance is NULL"); // 饭欺繁胶肺 背眉窍矫坷
  39. return;
  40. }
  41.  
  42. D3DXMATRIX matBone;
  43.  
  44. if (pPointInstance->isAttached)
  45. {
  46. if (pPointInstance->dwModelIndex>=m_LODControllerVector.size())
  47. {
  48. //Tracenf("CActorInstance::UpdatePointInstance - rInstance.dwModelIndex=%d >= m_LODControllerVector.size()=%d",
  49. // pPointInstance->dwModelIndex>m_LODControllerVector.size());
  50. return;
  51. }
  52.  
  53. CGrannyLODController* pGrnLODController=m_LODControllerVector[pPointInstance->dwModelIndex];
  54. if (!pGrnLODController)
  55. {
  56. //Tracenf("CActorInstance::UpdatePointInstance - m_LODControllerVector[pPointInstance->dwModelIndex=%d] is NULL", pPointInstance->dwModelIndex);
  57. return;
  58. }
  59.  
  60. CGrannyModelInstance * pModelInstance = pGrnLODController->GetModelInstance();
  61. if (!pModelInstance)
  62. {
  63. //Tracenf("CActorInstance::UpdatePointInstance - pGrnLODController->GetModelInstance() is NULL");
  64. return;
  65. }
  66.  
  67. D3DXMATRIX * pmatBone = (D3DXMATRIX *)pModelInstance->GetBoneMatrixPointer(pPointInstance->dwBoneIndex);
  68. matBone = *(D3DXMATRIX *)pModelInstance->GetCompositeBoneMatrixPointer(pPointInstance->dwBoneIndex);
  69. matBone._41 = pmatBone->_41;
  70. matBone._42 = pmatBone->_42;
  71. matBone._43 = pmatBone->_43;
  72. matBone *= m_worldMatrix;
  73. }
  74. else
  75. {
  76. matBone = m_worldMatrix;
  77. }
  78.  
  79. // Update Collsion Sphere
  80. CSphereCollisionInstanceVector::const_iterator sit = pPointInstance->c_pCollisionData->SphereDataVector.begin();
  81. CDynamicSphereInstanceVector::iterator dit=pPointInstance->SphereInstanceVector.begin();
  82. for (;sit!=pPointInstance->c_pCollisionData->SphereDataVector.end();++sit,++dit)
  83. {
  84. const TSphereData & c = sit->GetAttribute();//c_pCollisionData->SphereDataVector[j].GetAttribute();
  85.  
  86. D3DXMATRIX matPoint;
  87. D3DXMatrixTranslation(&matPoint, c.v3Position.x, c.v3Position.y, c.v3Position.z);
  88. matPoint = matPoint * matBone;
  89.  
  90. dit->v3LastPosition = dit->v3Position;
  91. dit->v3Position.x = matPoint._41;
  92. dit->v3Position.y = matPoint._42;
  93. dit->v3Position.z = matPoint._43;
  94. }
  95. }
  96.  
  97. void CActorInstance::UpdateAdvancingPointInstance()
  98. {
  99. // 富阑 爬阑 版快 荤恩篮 捞悼蔼阑 啊瘤绊 乐瘤 臼扁 锭巩俊 富肺 何磐 掘绢客具 茄促 - [levites]
  100. D3DXVECTOR3 v3Movement = m_v3Movement;
  101. if (m_pkHorse)
  102. v3Movement = m_pkHorse->m_v3Movement;
  103.  
  104. // 富篮 诀单捞飘 窍瘤 臼酒档 等促 - [levites]
  105. if (m_pkHorse)
  106. m_pkHorse->UpdateAdvancingPointInstance();
  107.  
  108. D3DXMATRIX matPoint;
  109. D3DXMATRIX matCenter;
  110.  
  111. TCollisionPointInstanceListIterator itor = m_BodyPointInstanceList.begin();
  112. for (; itor != m_BodyPointInstanceList.end(); ++itor)
  113. {
  114. TCollisionPointInstance & rInstance = *itor;
  115.  
  116. if (rInstance.isAttached)
  117. {
  118. if (rInstance.dwModelIndex>=m_LODControllerVector.size())
  119. {
  120. Tracenf("CActorInstance::UpdateAdvancingPointInstance - rInstance.dwModelIndex=%d >= m_LODControllerVector.size()=%d",
  121. rInstance.dwModelIndex, m_LODControllerVector.size());
  122. continue;
  123. }
  124.  
  125. CGrannyLODController* pGrnLODController=m_LODControllerVector[rInstance.dwModelIndex];
  126. if (!pGrnLODController)
  127. {
  128. Tracenf("CActorInstance::UpdateAdvancingPointInstance - m_LODControllerVector[rInstance.dwModelIndex=%d] is NULL", rInstance.dwModelIndex);
  129. continue;
  130. }
  131.  
  132. CGrannyModelInstance * pModelInstance = pGrnLODController->GetModelInstance();
  133. if (!pModelInstance)
  134. {
  135. //Tracenf("CActorInstance::UpdateAdvancingPointInstance - pGrnLODController->GetModelInstance() is NULL");
  136. continue;
  137. }
  138.  
  139. matCenter = *(D3DXMATRIX *)pModelInstance->GetBoneMatrixPointer(rInstance.dwBoneIndex);
  140. matCenter *= m_worldMatrix;
  141. }
  142. else
  143. {
  144. matCenter = m_worldMatrix;
  145. }
  146.  
  147. // Update Collision Sphere
  148. const NRaceData::TCollisionData * c_pCollisionData = rInstance.c_pCollisionData;
  149. if (c_pCollisionData)
  150. {
  151. for (DWORD j = 0; j < c_pCollisionData->SphereDataVector.size(); ++j)
  152. {
  153. const TSphereData & c = c_pCollisionData->SphereDataVector[j].GetAttribute();
  154. CDynamicSphereInstance & rSphereInstance = rInstance.SphereInstanceVector[j];
  155.  
  156. D3DXMatrixTranslation(&matPoint, c.v3Position.x, c.v3Position.y, c.v3Position.z);
  157. matPoint = matPoint * matCenter;
  158.  
  159. rSphereInstance.v3LastPosition.x = matPoint._41;
  160. rSphereInstance.v3LastPosition.y = matPoint._42;
  161. rSphereInstance.v3LastPosition.z = matPoint._43;
  162. rSphereInstance.v3Position = rSphereInstance.v3LastPosition;
  163. rSphereInstance.v3Position += v3Movement;
  164. }
  165. }
  166. }
  167. }
  168.  
  169. bool CActorInstance::CheckCollisionDetection(const CDynamicSphereInstanceVector * c_pAttackingSphereVector, D3DXVECTOR3 * pv3Position)
  170. {
  171. if (!c_pAttackingSphereVector)
  172. {
  173. assert(!"CActorInstance::CheckCollisionDetection - c_pAttackingSphereVector is NULL"); // 饭欺繁胶肺 背眉窍矫坷
  174. return false;
  175. }
  176.  
  177. TCollisionPointInstanceListIterator itor;
  178. for (itor = m_DefendingPointInstanceList.begin(); itor != m_DefendingPointInstanceList.end(); ++itor)
  179. {
  180. const CDynamicSphereInstanceVector * c_pDefendingSphereVector = &(*itor).SphereInstanceVector;
  181.  
  182. for (DWORD i = 0; i < c_pAttackingSphereVector->size(); ++i)
  183. for (DWORD j = 0; j < c_pDefendingSphereVector->size(); ++j)
  184. {
  185. const CDynamicSphereInstance & c_rAttackingSphere = c_pAttackingSphereVector->at(i);
  186. const CDynamicSphereInstance & c_rDefendingSphere = c_pDefendingSphereVector->at(j);
  187.  
  188. if (DetectCollisionDynamicSphereVSDynamicSphere(c_rAttackingSphere, c_rDefendingSphere))
  189. {
  190. // FIXME : 滴 盔狼 背痢阑 茫酒郴绰 侥栏肺 官层具 茄促.
  191. *pv3Position = (c_rAttackingSphere.v3Position + c_rDefendingSphere.v3Position) / 2.0f;
  192. return true;
  193. }
  194. }
  195. }
  196.  
  197. return false;
  198. }
  199.  
  200. bool CActorInstance::CreateCollisionInstancePiece(DWORD dwAttachingModelIndex, const NRaceData::TAttachingData * c_pAttachingData, TCollisionPointInstance * pPointInstance)
  201. {
  202. if (!c_pAttachingData)
  203. {
  204. assert(!"CActorInstance::CreateCollisionInstancePiece - c_pAttachingData is NULL"); // 饭欺繁胶肺 背眉窍矫坷
  205. return false;
  206. }
  207.  
  208. if (!c_pAttachingData->pCollisionData)
  209. {
  210. assert(!"CActorInstance::CreateCollisionInstancePiece - c_pAttachingData->pCollisionData is NULL"); // 饭欺繁胶肺 背眉窍矫坷
  211. return false;
  212. }
  213.  
  214. if (!pPointInstance)
  215. {
  216. assert(!"CActorInstance::CreateCollisionInstancePiece - pPointInstance is NULL"); // 饭欺繁胶肺 背眉窍矫坷
  217. return false;
  218. }
  219.  
  220. pPointInstance->dwModelIndex = dwAttachingModelIndex;
  221. pPointInstance->isAttached = FALSE;
  222. pPointInstance->dwBoneIndex = 0;
  223. pPointInstance->c_pCollisionData = c_pAttachingData->pCollisionData;
  224.  
  225. if (c_pAttachingData->isAttaching)
  226. {
  227. int iAttachingBoneIndex;
  228.  
  229. CGrannyModelInstance * pModelInstance = m_LODControllerVector[dwAttachingModelIndex]->GetModelInstance();
  230.  
  231. if (pModelInstance && pModelInstance->GetBoneIndexByName(c_pAttachingData->strAttachingBoneName.c_str(),
  232. &iAttachingBoneIndex))
  233. {
  234. pPointInstance->isAttached = TRUE;
  235. pPointInstance->dwBoneIndex = iAttachingBoneIndex;
  236. }
  237. else
  238. {
  239. //TraceError("CActorInstance::CreateCollisionInstancePiece: Cannot get matrix of bone %s ModelInstance 0x%p", c_pAttachingData->strAttachingBoneName.c_str(), pModelInstance);
  240. pPointInstance->isAttached = TRUE;
  241. pPointInstance->dwBoneIndex = 0;
  242. }
  243. }
  244.  
  245.  
  246. const CSphereCollisionInstanceVector & c_rSphereDataVector = c_pAttachingData->pCollisionData->SphereDataVector;
  247.  
  248. pPointInstance->SphereInstanceVector.clear();
  249. pPointInstance->SphereInstanceVector.reserve(c_rSphereDataVector.size());
  250.  
  251. CSphereCollisionInstanceVector::const_iterator it;
  252. CDynamicSphereInstance dsi;
  253.  
  254. dsi.v3LastPosition = D3DXVECTOR3(0.0f,0.0f,0.0f);
  255. dsi.v3Position = D3DXVECTOR3(0.0f,0.0f,0.0f);
  256. for (it = c_rSphereDataVector.begin(); it!=c_rSphereDataVector.end(); ++it)
  257. {
  258. const TSphereData & c_rSphereData = it->GetAttribute();
  259. dsi.fRadius = c_rSphereData.fRadius;
  260. pPointInstance->SphereInstanceVector.push_back(dsi);
  261. }
  262.  
  263. return true;
  264. }
  265.  
  266. ///////////////////////////////////////////////////////////////////////////////////////////////////
  267.  
  268. BOOL CActorInstance::__SplashAttackProcess(CActorInstance & rVictim)
  269. {
  270. D3DXVECTOR3 v3Distance(rVictim.m_x - m_x, rVictim.m_z - m_z, rVictim.m_z - m_z);
  271. float fDistance = D3DXVec3LengthSq(&v3Distance);
  272. if (fDistance >= 1000.0f*1000.0f)
  273. return FALSE;
  274.  
  275. // Check Distance
  276. if (!__IsInSplashTime())
  277. return FALSE;
  278.  
  279. const CRaceMotionData::TMotionAttackingEventData * c_pAttackingEvent = m_kSplashArea.c_pAttackingEvent;
  280. const NRaceData::TAttackData & c_rAttackData = c_pAttackingEvent->AttackData;
  281. THittedInstanceMap & rHittedInstanceMap = m_kSplashArea.HittedInstanceMap;
  282.  
  283. // NOTE : 捞固 锭啡促搁 锭副 荐 绝澜
  284. if (rHittedInstanceMap.end() != rHittedInstanceMap.find(&rVictim))
  285. {
  286. return FALSE;
  287. }
  288.  
  289. // NOTE : Snipe 葛靛捞绊..
  290. if (NRaceData::ATTACK_TYPE_SNIPE == c_rAttackData.iAttackType)
  291. {
  292. // Target 捞 PC 扼搁..
  293. if (__IsFlyTargetPC())
  294. // 促弗 按眉绰 锭副 荐 绝促
  295. if (!__IsSameFlyTarget(&rVictim))
  296. return FALSE;
  297.  
  298. /*
  299. if (IsFlyTargetObject())
  300. {
  301. CActorInstance * pActorInstance = (CActorInstance *)m_kFlyTarget.GetFlyTarget();
  302.  
  303. // NOTE : Target 捞 PC 老锭绰 茄疙父 锭副 荐 乐促.
  304. if (pActorInstance->IsPC())
  305. if (&rVictim != pActorInstance)
  306. return FALSE;
  307. }
  308. */
  309. }
  310.  
  311. D3DXVECTOR3 v3HitPosition;
  312. if (rVictim.CheckCollisionDetection(&m_kSplashArea.SphereInstanceVector, &v3HitPosition))
  313. {
  314. rHittedInstanceMap.insert(make_pair(&rVictim, GetLocalTime()+c_rAttackData.fInvisibleTime));
  315.  
  316. int iCurrentHitCount = rHittedInstanceMap.size();
  317. int iMaxHitCount = (0 == c_rAttackData.iHitLimitCount ? 16 : c_rAttackData.iHitLimitCount);
  318. //Tracef(" ------------------- Splash Hit : %d\n", iCurrentHitCount);
  319.  
  320. if (iCurrentHitCount > iMaxHitCount)
  321. {
  322. //Tracef(" ------------------- OVER FLOW :: Splash Hit Count : %d\n", iCurrentHitCount);
  323. return FALSE;
  324. }
  325.  
  326. NEW_SetAtkPixelPosition(NEW_GetCurPixelPositionRef());
  327. __ProcessDataAttackSuccess(c_rAttackData, rVictim, v3HitPosition, m_kSplashArea.uSkill, m_kSplashArea.isEnableHitProcess);
  328. return TRUE;
  329. }
  330.  
  331. return FALSE;
  332. }
  333.  
  334. BOOL CActorInstance::__NormalAttackProcess(CActorInstance & rVictim)
  335. {
  336. // Check Distance
  337. // NOTE - 老窜 辟立 眉农父 窍绊 乐澜
  338. D3DXVECTOR3 v3Distance(rVictim.m_x - m_x, rVictim.m_z - m_z, rVictim.m_z - m_z);
  339. float fDistance = D3DXVec3LengthSq(&v3Distance);
  340.  
  341. extern bool IS_HUGE_RACE(unsigned int vnum);
  342. if (IS_HUGE_RACE(rVictim.GetRace()))
  343. {
  344. if (fDistance >= 500.0f*500.0f)
  345. return FALSE;
  346. }
  347. else
  348. {
  349. if (fDistance >= 300.0f*300.0f)
  350. return FALSE;
  351. }
  352.  
  353. if (!isValidAttacking())
  354. return FALSE;
  355.  
  356. const float c_fAttackRadius = 20.0f;
  357. const NRaceData::TMotionAttackData * pad = m_pkCurRaceMotionData->GetMotionAttackDataPointer();
  358.  
  359. const float motiontime = GetAttackingElapsedTime();
  360.  
  361. NRaceData::THitDataContainer::const_iterator itorHitData = pad->HitDataContainer.begin();
  362. for (; itorHitData != pad->HitDataContainer.end(); ++itorHitData)
  363. {
  364. const NRaceData::THitData & c_rHitData = *itorHitData;
  365.  
  366. // NOTE : 捞固 嘎疽绰瘤 眉农
  367. THitDataMap::iterator itHitData = m_HitDataMap.find(&c_rHitData);
  368. if (itHitData != m_HitDataMap.end())
  369. {
  370. THittedInstanceMap & rHittedInstanceMap = itHitData->second;
  371.  
  372. THittedInstanceMap::iterator itInstance;
  373. if ((itInstance=rHittedInstanceMap.find(&rVictim)) != rHittedInstanceMap.end())
  374. {
  375. if (pad->iMotionType==NRaceData::MOTION_TYPE_COMBO || itInstance->second > GetLocalTime())
  376. continue;
  377. }
  378. }
  379.  
  380. NRaceData::THitTimePositionMap::const_iterator range_start, range_end;
  381. range_start = c_rHitData.mapHitPosition.lower_bound(motiontime-CTimer::Instance().GetElapsedSecond());
  382. range_end = c_rHitData.mapHitPosition.upper_bound(motiontime);
  383. float c = cosf(D3DXToRadian(GetRotation()));
  384. float s = sinf(D3DXToRadian(GetRotation()));
  385.  
  386. for(;range_start!=range_end;++range_start)
  387. {
  388. const CDynamicSphereInstance& dsiSrc=range_start->second;
  389.  
  390. CDynamicSphereInstance dsi;
  391. dsi = dsiSrc;
  392. dsi.fRadius = c_fAttackRadius;
  393. {
  394. D3DXVECTOR3 v3SrcDir=dsiSrc.v3Position-dsiSrc.v3LastPosition;
  395. v3SrcDir*=__GetReachScale();
  396.  
  397. const D3DXVECTOR3& v3Src = dsiSrc.v3LastPosition+v3SrcDir;
  398. D3DXVECTOR3& v3Dst = dsi.v3Position;
  399. v3Dst.x = v3Src.x * c - v3Src.y * s;
  400. v3Dst.y = v3Src.x * s + v3Src.y * c;
  401. v3Dst += GetPosition();
  402. }
  403. {
  404. const D3DXVECTOR3& v3Src = dsiSrc.v3LastPosition;
  405. D3DXVECTOR3& v3Dst = dsi.v3LastPosition;
  406. v3Dst.x = v3Src.x * c - v3Src.y * s;
  407. v3Dst.y = v3Src.x * s + v3Src.y * c;
  408. v3Dst += GetPosition();
  409. }
  410.  
  411.  
  412. TCollisionPointInstanceList::iterator cpit;
  413. for(cpit = rVictim.m_DefendingPointInstanceList.begin(); cpit!=rVictim.m_DefendingPointInstanceList.end();++cpit)
  414. {
  415. int index = 0;
  416. const CDynamicSphereInstanceVector & c_DefendingSphereVector = cpit->SphereInstanceVector;
  417. CDynamicSphereInstanceVector::const_iterator dsit;
  418. for(dsit = c_DefendingSphereVector.begin(); dsit!= c_DefendingSphereVector.end();++dsit, ++index)
  419. {
  420. const CDynamicSphereInstance& sub = *dsit;
  421. if (DetectCollisionDynamicZCylinderVSDynamicZCylinder(dsi, sub))
  422. {
  423. THitDataMap::iterator itHitData = m_HitDataMap.find(&c_rHitData);
  424. if (itHitData == m_HitDataMap.end())
  425. {
  426. THittedInstanceMap HittedInstanceMap;
  427. HittedInstanceMap.insert(make_pair(&rVictim, GetLocalTime()+pad->fInvisibleTime));
  428. //HittedInstanceMap.insert(make_pair(&rVictim, GetLocalTime()+HIT_COOL_TIME));
  429. m_HitDataMap.insert(make_pair(&c_rHitData, HittedInstanceMap));
  430.  
  431. //Tracef(" ----------- First Hit\n");
  432. }
  433. else
  434. {
  435. itHitData->second.insert(make_pair(&rVictim, GetLocalTime()+pad->fInvisibleTime));
  436. //itHitData->second.insert(make_pair(&rVictim, GetLocalTime()+HIT_COOL_TIME));
  437.  
  438. //Tracef(" ----------- Next Hit : %d\n", itHitData->second.size());
  439.  
  440. int iCurrentHitCount = itHitData->second.size();
  441. // NOTE : 焊烹 傍拜篮 16疙捞 茄拌
  442. if (NRaceData::MOTION_TYPE_COMBO == pad->iMotionType || NRaceData::MOTION_TYPE_NORMAL == pad->iMotionType)
  443. {
  444. if (iCurrentHitCount > 16)
  445. {
  446. //Tracef(" Type NORMAL :: Overflow - Can't process, skip\n");
  447. return FALSE;
  448. }
  449. }
  450. else
  451. {
  452. if (iCurrentHitCount > pad->iHitLimitCount)
  453. {
  454. //Tracef(" Type SKILL :: Overflow - Can't process, skip\n");
  455. return FALSE;
  456. }
  457. }
  458. }
  459.  
  460. D3DXVECTOR3 v3HitPosition = (GetPosition() + rVictim.GetPosition()) *0.5f;
  461.  
  462. // #0000780: [M2KR] 荐锋 鸥拜备 巩力
  463. extern bool IS_HUGE_RACE(unsigned int vnum);
  464. if (IS_HUGE_RACE(rVictim.GetRace()))
  465. {
  466. v3HitPosition = (GetPosition() + sub.v3Position) * 0.5f;
  467. }
  468.  
  469. __ProcessDataAttackSuccess(*pad, rVictim, v3HitPosition, m_kCurMotNode.uSkill);
  470. return TRUE;
  471. }
  472. }
  473. }
  474. }
  475. }
  476.  
  477. return FALSE;
  478. }
  479.  
  480. BOOL CActorInstance::AttackingProcess(CActorInstance & rVictim)
  481. {
  482. if (rVictim.__isInvisible())
  483. return FALSE;
  484.  
  485. if (__SplashAttackProcess(rVictim))
  486. return TRUE;
  487.  
  488. if (__NormalAttackProcess(rVictim))
  489. return TRUE;
  490.  
  491. return FALSE;
  492. }
  493.  
  494. BOOL CActorInstance::TestPhysicsBlendingCollision(CActorInstance & rVictim)
  495. {
  496. if (rVictim.IsDead())
  497. return FALSE;
  498.  
  499. TPixelPosition kPPosLast;
  500. GetBlendingPosition( &kPPosLast );
  501.  
  502. D3DXVECTOR3 v3Distance = D3DXVECTOR3(rVictim.m_x - kPPosLast.x, rVictim.m_y - kPPosLast.y, rVictim.m_z - kPPosLast.z);
  503. float fDistance = D3DXVec3LengthSq(&v3Distance);
  504. if (fDistance > 800.0f*800.0f)
  505. return FALSE;
  506.  
  507. // NOTE : 傍拜 吝老锭绰 Defending Sphere肺 Collision Check甫 钦聪促.
  508. // NOTE : Wait肺 喉坊爹 登绰 档吝俊 墩绊 甸绢啊绰 巩力啊 乐绢辑.. - [levites]
  509. TCollisionPointInstanceList * pMainList;
  510. TCollisionPointInstanceList * pVictimList;
  511. if (isAttacking() || IsWaiting())
  512. {
  513. pMainList = &m_DefendingPointInstanceList;
  514. pVictimList = &rVictim.m_DefendingPointInstanceList;
  515. }
  516. else
  517. {
  518. pMainList = &m_BodyPointInstanceList;
  519. pVictimList = &rVictim.m_BodyPointInstanceList;
  520. }
  521.  
  522. TPixelPosition kPDelta;
  523. m_PhysicsObject.GetLastPosition(&kPDelta);
  524.  
  525. D3DXVECTOR3 prevLastPosition, prevPosition;
  526. const int nSubCheckCount = 50;
  527.  
  528. TCollisionPointInstanceListIterator itorMain = pMainList->begin();
  529. TCollisionPointInstanceListIterator itorVictim = pVictimList->begin();
  530. for (; itorMain != pMainList->end(); ++itorMain)
  531. {
  532. for (; itorVictim != pVictimList->end(); ++itorVictim)
  533. {
  534. CDynamicSphereInstanceVector & c_rMainSphereVector = (*itorMain).SphereInstanceVector;
  535. CDynamicSphereInstanceVector & c_rVictimSphereVector = (*itorVictim).SphereInstanceVector;
  536.  
  537. for (DWORD i = 0; i < c_rMainSphereVector.size(); ++i)
  538. {
  539. CDynamicSphereInstance & c_rMainSphere = c_rMainSphereVector[i];
  540. //adjust main sphere center
  541. prevLastPosition = c_rMainSphere.v3LastPosition;
  542. prevPosition = c_rMainSphere.v3Position;
  543.  
  544. c_rMainSphere.v3LastPosition = prevPosition;
  545.  
  546. for( int i = 1; i <= nSubCheckCount; ++ i )
  547. {
  548. c_rMainSphere.v3Position = prevPosition + (float)(i/(float)nSubCheckCount) * kPDelta;
  549.  
  550. for (DWORD j = 0; j < c_rVictimSphereVector.size(); ++j)
  551. {
  552. CDynamicSphereInstance & c_rVictimSphere = c_rVictimSphereVector[j];
  553.  
  554. if (DetectCollisionDynamicSphereVSDynamicSphere(c_rMainSphere, c_rVictimSphere))
  555. {
  556. BOOL bResult = GetVector3Distance(c_rMainSphere.v3Position, c_rVictimSphere.v3Position) <= GetVector3Distance(c_rMainSphere.v3LastPosition, c_rVictimSphere.v3Position);
  557.  
  558. c_rMainSphere.v3LastPosition = prevLastPosition;
  559. c_rMainSphere.v3Position = prevPosition;
  560.  
  561. return bResult;
  562. }
  563. }
  564. }
  565.  
  566. //restore
  567. c_rMainSphere.v3LastPosition = prevLastPosition;
  568. c_rMainSphere.v3Position = prevPosition;
  569. }
  570. }
  571. }
  572.  
  573. return FALSE;
  574. }
  575.  
  576. #define ENABLE_PETS_WITHOUT_COLLISIONS
  577. #define ENABLE_SHOPS_WITHOUT_COLLISIONS
  578. #define ENABLE_MOUNTS_WITHOUT_COLLISIONS
  579. BOOL CActorInstance::TestActorCollision(CActorInstance & rVictim)
  580. {
  581.  
  582. if (rVictim.IsDead())
  583. return FALSE;
  584.  
  585. #ifdef ENABLE_PETS_WITHOUT_COLLISIONS
  586. if (rVictim.GetRace()>=34001 && rVictim.GetRace()<=34099)
  587. return FALSE;
  588. #endif
  589.  
  590. #ifdef ENABLE_SHOPS_WITHOUT_COLLISIONS
  591. if (rVictim.GetRace()>=30000 && rVictim.GetRace()<=30001)
  592. return FALSE;
  593. #endif
  594.  
  595. #ifdef ENABLE_MOUNTS_WITHOUT_COLLISIONS
  596. if (rVictim.GetRace()>=20101 && rVictim.GetRace()<=20299)
  597. return FALSE;
  598. #endif
  599.  
  600. #ifdef ENABLE_COLISION_WOL2
  601. int pListGlobal[] = {20300, 20301, 20302, 20303, 20304, 20305, 20306, 20307, 9001, 9002, 9003, 9005, 9006, 20091, 30121, 20015, 20094, 20406, 20349, 20011,
  602. 20018, 20009, 11000, 11001, 20355, 20354, 20358, 20357, 20084, 20086, 20087};
  603. const char* strMapListGlobal[] = {"metin2_map_a1", "metin2_map_a3", "metin2_map_b1", "metin2_map_b3", "metin2_map_c1", "metin2_map_c3"};
  604. std::string stringName = CPythonBackground::Instance().GetWarpMapName();
  605.  
  606. for (int i = 0; i < _countof(strMapListGlobal); i++)
  607. {
  608. if (strMapListGlobal[i] == stringName)
  609. {
  610. for (int i = 0; i < _countof(pListGlobal); i++)
  611. {
  612. if (rVictim.GetRace() == pListGlobal[i] || 0 <= rVictim.GetRace() && rVictim.GetRace() <= 7 )
  613. return FALSE;
  614. }
  615. }
  616. }
  617. #endif
  618.  
  619. D3DXVECTOR3 v3Distance = D3DXVECTOR3(rVictim.m_x - m_x, rVictim.m_y - m_y, rVictim.m_z - m_z);
  620. float fDistance = D3DXVec3LengthSq(&v3Distance);
  621. if (fDistance > 800.0f*800.0f)
  622. return FALSE;
  623.  
  624. TCollisionPointInstanceList * pMainList;
  625. TCollisionPointInstanceList * pVictimList;
  626. if (isAttacking() || IsWaiting())
  627. {
  628. pMainList = &m_DefendingPointInstanceList;
  629. pVictimList = &rVictim.m_DefendingPointInstanceList;
  630. }
  631. else
  632. {
  633. pMainList = &m_BodyPointInstanceList;
  634. pVictimList = &rVictim.m_BodyPointInstanceList;
  635. }
  636.  
  637. TCollisionPointInstanceListIterator itorMain = pMainList->begin();
  638. TCollisionPointInstanceListIterator itorVictim = pVictimList->begin();
  639. for (; itorMain != pMainList->end(); ++itorMain)
  640. for (; itorVictim != pVictimList->end(); ++itorVictim)
  641. {
  642. const CDynamicSphereInstanceVector & c_rMainSphereVector = (*itorMain).SphereInstanceVector;
  643. const CDynamicSphereInstanceVector & c_rVictimSphereVector = (*itorVictim).SphereInstanceVector;
  644.  
  645. for (DWORD i = 0; i < c_rMainSphereVector.size(); ++i)
  646. for (DWORD j = 0; j < c_rVictimSphereVector.size(); ++j)
  647. {
  648. const CDynamicSphereInstance & c_rMainSphere = c_rMainSphereVector[i];
  649. const CDynamicSphereInstance & c_rVictimSphere = c_rVictimSphereVector[j];
  650.  
  651. if (DetectCollisionDynamicSphereVSDynamicSphere(c_rMainSphere, c_rVictimSphere))
  652. {
  653. if (GetVector3Distance(c_rMainSphere.v3Position, c_rVictimSphere.v3Position) <=
  654. GetVector3Distance(c_rMainSphere.v3LastPosition, c_rVictimSphere.v3Position))
  655. {
  656. return TRUE;
  657. }
  658. return FALSE;
  659. }
  660. }
  661. }
  662.  
  663. return FALSE;
  664. }
  665.  
  666. bool CActorInstance::AvoidObject(const CGraphicObjectInstance& c_rkBGObj)
  667. {
  668. #ifdef __MOVIE_MODE__
  669. if (IsMovieMode())
  670. return false;
  671. #endif
  672.  
  673. if (this==&c_rkBGObj)
  674. return false;
  675.  
  676. if (!__TestObjectCollision(&c_rkBGObj))
  677. return false;
  678.  
  679. __AdjustCollisionMovement(&c_rkBGObj);
  680. return true;
  681. }
  682.  
  683. bool CActorInstance::IsBlockObject(const CGraphicObjectInstance& c_rkBGObj)
  684. {
  685. if (this==&c_rkBGObj)
  686. return false;
  687.  
  688. if (!__TestObjectCollision(&c_rkBGObj))
  689. return false;
  690.  
  691. return true;
  692. }
  693.  
  694. void CActorInstance::BlockMovement()
  695. {
  696. if (m_pkHorse)
  697. {
  698. m_pkHorse->__InitializeMovement();
  699. return;
  700. }
  701.  
  702. __InitializeMovement();
  703. }
  704.  
  705. BOOL CActorInstance::__TestObjectCollision(const CGraphicObjectInstance * c_pObjectInstance)
  706. {
  707. if (m_pkHorse)
  708. {
  709. if (m_pkHorse->__TestObjectCollision(c_pObjectInstance))
  710. return TRUE;
  711.  
  712. return FALSE;
  713. }
  714.  
  715. if (m_canSkipCollision)
  716. return FALSE;
  717.  
  718. if (m_v3Movement.x == 0.0f && m_v3Movement.y == 0.0f && m_v3Movement.z == 0.0f)
  719. return FALSE;
  720.  
  721. TCollisionPointInstanceListIterator itorMain = m_BodyPointInstanceList.begin();
  722. for (; itorMain != m_BodyPointInstanceList.end(); ++itorMain)
  723. {
  724. const CDynamicSphereInstanceVector & c_rMainSphereVector = (*itorMain).SphereInstanceVector;
  725. for (DWORD i = 0; i < c_rMainSphereVector.size(); ++i)
  726. {
  727. const CDynamicSphereInstance & c_rMainSphere = c_rMainSphereVector[i];
  728.  
  729. if (c_pObjectInstance->MovementCollisionDynamicSphere(c_rMainSphere))
  730. {
  731. //const D3DXVECTOR3 & c_rv3Position = c_pObjectInstance->GetPosition();
  732. //if (GetVector3Distance(c_rMainSphere.v3Position, c_rv3Position) <
  733. // GetVector3Distance(c_rMainSphere.v3LastPosition, c_rv3Position))
  734. {
  735. return TRUE;
  736. }
  737.  
  738. //return FALSE;
  739. }
  740. }
  741. }
  742.  
  743. return FALSE;
  744. }
  745.  
  746.  
  747. bool CActorInstance::TestCollisionWithDynamicSphere(const CDynamicSphereInstance & dsi)
  748. {
  749. TCollisionPointInstanceListIterator itorMain = m_BodyPointInstanceList.begin();
  750. for (; itorMain != m_BodyPointInstanceList.end(); ++itorMain)
  751. {
  752. const CDynamicSphereInstanceVector & c_rMainSphereVector = (*itorMain).SphereInstanceVector;
  753. for (DWORD i = 0; i < c_rMainSphereVector.size(); ++i)
  754. {
  755. const CDynamicSphereInstance & c_rMainSphere = c_rMainSphereVector[i];
  756.  
  757. if (DetectCollisionDynamicSphereVSDynamicSphere(c_rMainSphere, dsi))
  758. {
  759. return true;
  760. }
  761. }
  762. }
  763.  
  764. return false;
  765. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement