| 538 | } |
| 539 | |
| 540 | void flagdropped(int flag, float x, float y, float z) |
| 541 | { |
| 542 | flaginfo &f = flaginfos[flag]; |
| 543 | if(OUTBORD(x, y)) return; // valid pos |
| 544 | bounceent p; |
| 545 | p.plclipped = true; |
| 546 | p.rotspeed = 0.0f; |
| 547 | p.o.x = x; |
| 548 | p.o.y = y; |
| 549 | p.o.z = z; |
| 550 | p.vel.z = -0.8f; |
| 551 | p.aboveeye = 1.0f; |
| 552 | p.eyeheight = p.maxeyeheight = 0.1f; |
| 553 | p.radius = 0.1f; |
| 554 | |
| 555 | bool oldcancollide = false; |
| 556 | if(f.actor) |
| 557 | { |
| 558 | oldcancollide = f.actor->cancollide; |
| 559 | f.actor->cancollide = false; // avoid collision with owner |
| 560 | } |
| 561 | loopi(100) // perform physics steps |
| 562 | { |
| 563 | moveplayer(&p, 10, true, 50); |
| 564 | if(p.stuck) break; |
| 565 | } |
| 566 | if(p.o.z < waterlevel) |
| 567 | { |
| 568 | p.aboveeye = 6.7f; |
| 569 | loopirev((waterlevel - p.o.z) / 0.2f + 1) |
| 570 | { |
| 571 | p.o.z += 0.2f; |
| 572 | if(p.o.z > z) p.radius = 1.0f; // don't float through small holes in the ceiling |
| 573 | if(collide(&p)) break; |
| 574 | } |
| 575 | if(p.o.z > waterlevel) p.o.z = waterlevel; |
| 576 | } |
| 577 | if(f.actor) f.actor->cancollide = oldcancollide; // restore settings |
| 578 | |
| 579 | f.pos.x = floor(p.o.x + 0.5f); |
| 580 | f.pos.y = floor(p.o.y + 0.5f); |
| 581 | f.pos.z = floor(p.o.z * 5 + 0.5f) / 5; |
| 582 | f.flagent->spawned = true; |
| 583 | f.ack = true; |
| 584 | } |
| 585 | |
| 586 | void flaginbase(int flag) |
| 587 | { |
no test coverage detected