|
1 | 1 | #include "gs_level.h"
|
| 2 | +#include "gs_player.h" |
2 | 3 | #include "scriptObject.h"
|
3 | 4 | #include "scriptSector.h"
|
4 | 5 | #include <angelscript.h>
|
@@ -451,6 +452,123 @@ namespace TFE_DarkForces
|
451 | 452 | }
|
452 | 453 | }
|
453 | 454 | }
|
| 455 | + |
| 456 | + vec3_float getVelocity(ScriptObject* sObject) |
| 457 | + { |
| 458 | + if (!doesObjectExist(sObject)) { return { 0, 0, 0,}; } |
| 459 | + SecObject* obj = TFE_Jedi::s_objectRefList[sObject->m_id].object; |
| 460 | + |
| 461 | + // Is it the player? |
| 462 | + if (obj->entityFlags & ETFLAG_PLAYER) |
| 463 | + { |
| 464 | + return getPlayerVelocity(); |
| 465 | + } |
| 466 | + |
| 467 | + // First try to find a dispatch logic |
| 468 | + ActorDispatch* dispatch = getDispatch(obj); |
| 469 | + if (dispatch) |
| 470 | + { |
| 471 | + return |
| 472 | + { |
| 473 | + fixed16ToFloat(dispatch->vel.x), |
| 474 | + -fixed16ToFloat(dispatch->vel.y), |
| 475 | + fixed16ToFloat(dispatch->vel.z) |
| 476 | + }; |
| 477 | + } |
| 478 | + |
| 479 | + // Then try other logics |
| 480 | + Logic** logicPtr = (Logic**)allocator_getHead((Allocator*)obj->logic); |
| 481 | + while (logicPtr) |
| 482 | + { |
| 483 | + Logic* logic = *logicPtr; |
| 484 | + PhysicsActor* actor = nullptr; |
| 485 | + |
| 486 | + switch (logic->type) |
| 487 | + { |
| 488 | + case LOGIC_BOBA_FETT: |
| 489 | + case LOGIC_DRAGON: |
| 490 | + case LOGIC_PHASE_ONE: |
| 491 | + case LOGIC_PHASE_TWO: |
| 492 | + case LOGIC_PHASE_THREE: |
| 493 | + case LOGIC_TURRET: |
| 494 | + case LOGIC_WELDER: |
| 495 | + case LOGIC_MOUSEBOT: |
| 496 | + SpecialActor* data = (SpecialActor*)logic; |
| 497 | + actor = &data->actor; |
| 498 | + break; |
| 499 | + } |
| 500 | + |
| 501 | + if (actor) |
| 502 | + { |
| 503 | + return |
| 504 | + { |
| 505 | + fixed16ToFloat(actor->vel.x), |
| 506 | + -fixed16ToFloat(actor->vel.y), |
| 507 | + fixed16ToFloat(actor->vel.z) |
| 508 | + }; |
| 509 | + } |
| 510 | + |
| 511 | + logicPtr = (Logic**)allocator_getNext((Allocator*)obj->logic); |
| 512 | + } |
| 513 | + |
| 514 | + return { 0, 0, 0 }; |
| 515 | + } |
| 516 | + |
| 517 | + void setVelocity(vec3_float vel, ScriptObject* sObject) |
| 518 | + { |
| 519 | + if (!doesObjectExist(sObject)) { return; } |
| 520 | + SecObject* obj = TFE_Jedi::s_objectRefList[sObject->m_id].object; |
| 521 | + |
| 522 | + // Is it the player? |
| 523 | + if (obj->entityFlags & ETFLAG_PLAYER) |
| 524 | + { |
| 525 | + setPlayerVelocity(vel); |
| 526 | + return; |
| 527 | + } |
| 528 | + |
| 529 | + // First try to find a dispatch logic |
| 530 | + ActorDispatch* dispatch = getDispatch(obj); |
| 531 | + if (dispatch) |
| 532 | + { |
| 533 | + dispatch->vel.x = floatToFixed16(vel.x); |
| 534 | + dispatch->vel.y = -floatToFixed16(vel.y); |
| 535 | + dispatch->vel.z = floatToFixed16(vel.z); |
| 536 | + return; |
| 537 | + } |
| 538 | + |
| 539 | + // Then try other logics |
| 540 | + Logic** logicPtr = (Logic**)allocator_getHead((Allocator*)obj->logic); |
| 541 | + while (logicPtr) |
| 542 | + { |
| 543 | + Logic* logic = *logicPtr; |
| 544 | + PhysicsActor* actor = nullptr; |
| 545 | + |
| 546 | + switch (logic->type) |
| 547 | + { |
| 548 | + case LOGIC_BOBA_FETT: |
| 549 | + case LOGIC_DRAGON: |
| 550 | + case LOGIC_PHASE_ONE: |
| 551 | + case LOGIC_PHASE_TWO: |
| 552 | + case LOGIC_PHASE_THREE: |
| 553 | + case LOGIC_TURRET: |
| 554 | + case LOGIC_WELDER: |
| 555 | + case LOGIC_MOUSEBOT: |
| 556 | + SpecialActor* data = (SpecialActor*)logic; |
| 557 | + actor = &data->actor; |
| 558 | + break; |
| 559 | + } |
| 560 | + |
| 561 | + if (actor) |
| 562 | + { |
| 563 | + actor->vel.x = floatToFixed16(vel.x); |
| 564 | + actor->vel.y = -floatToFixed16(vel.y); |
| 565 | + actor->vel.z = floatToFixed16(vel.z); |
| 566 | + return; |
| 567 | + } |
| 568 | + |
| 569 | + logicPtr = (Logic**)allocator_getNext((Allocator*)obj->logic); |
| 570 | + } |
| 571 | + } |
454 | 572 |
|
455 | 573 | void ScriptObject::registerType()
|
456 | 574 | {
|
@@ -516,5 +634,7 @@ namespace TFE_DarkForces
|
516 | 634 | ScriptPropertyGetFunc("int get_hitPoints()", getHitPoints);
|
517 | 635 | ScriptPropertySetFunc("void set_hitPoints(int)", setHitPoints);
|
518 | 636 | ScriptPropertySetFunc("void set_projectile(int)", setProjectile);
|
| 637 | + ScriptPropertyGetFunc("float3 get_velocity()", getVelocity); |
| 638 | + ScriptPropertySetFunc("void set_velocity(float3)", setVelocity); |
519 | 639 | }
|
520 | 640 | }
|
0 commit comments