| 270 | } |
| 271 | |
| 272 | void CTeleWhirlwindObject::keep() |
| 273 | { |
| 274 | CPhysicsShell* p = get_object()->PPhysicsShell(); |
| 275 | if (!p || !p->isActive()) |
| 276 | return; |
| 277 | else |
| 278 | { |
| 279 | p->SetAirResistance(0.f, 0.f); |
| 280 | p->set_ApplyByGravity(FALSE); |
| 281 | } |
| 282 | |
| 283 | u16 element_number = p->get_ElementsNumber(); |
| 284 | Fvector center = m_telekinesis->Center(); |
| 285 | |
| 286 | CPhysicsElement* maxE = p->get_ElementByStoreOrder(0); |
| 287 | for (u16 element = 0; element < element_number; ++element) |
| 288 | { |
| 289 | CPhysicsElement* E = p->get_ElementByStoreOrder(element); |
| 290 | if (maxE->getMass() < E->getMass()) |
| 291 | maxE = E; |
| 292 | Fvector dir; |
| 293 | dir.sub(center, E->mass_Center()); |
| 294 | dir.normalize_safe(); |
| 295 | Fvector vel; |
| 296 | E->get_LinearVel(vel); |
| 297 | float force = dir.dotproduct(vel) * E->getMass() / 2.f; |
| 298 | if (force < 0.f) |
| 299 | { |
| 300 | dir.mul(force); |
| 301 | } |
| 302 | } |
| 303 | |
| 304 | maxE->setTorque(Fvector().set(0, 500.f, 0)); |
| 305 | |
| 306 | Fvector dist; |
| 307 | dist.sub(center, maxE->mass_Center()); |
| 308 | if (dist.magnitude() > m_telekinesis->keep_radius() * 1.5f) |
| 309 | { |
| 310 | p->setTorque(Fvector().set(0, 0, 0)); |
| 311 | p->setForce(Fvector().set(0, 0, 0)); |
| 312 | p->set_LinearVel(Fvector().set(0, 0, 0)); |
| 313 | p->set_AngularVel(Fvector().set(0, 0, 0)); |
| 314 | p->set_ApplyByGravity(TRUE); |
| 315 | switch_state(TS_Raise); |
| 316 | } |
| 317 | } |
| 318 | void CTeleWhirlwindObject::fire(const Fvector& target) |
| 319 | { |
| 320 | // inherited::fire(target); |
nothing calls this directly
no test coverage detected