throw grabbed objects when using the portal buttons

This commit is contained in:
Deconimus 2024-03-05 20:33:49 +01:00
parent d7b2bcfe67
commit 43b5a83f6f
3 changed files with 17 additions and 1 deletions

View file

@ -54,6 +54,7 @@
#define MAX_ROTATE_RATE_DELTA MAX_ROTATE_RATE
#define JUMP_IMPULSE 2.7f
#define THROW_IMPULSE 2.7f
struct Vector3 gGrabDistance = {0.0f, 0.0f, -1.5f};
struct Vector3 gCameraOffset = {0.0f, 0.0f, 0.0f};
@ -296,6 +297,20 @@ int playerIsGrabbing(struct Player* player) {
return player->grabConstraint.object != NULL;
}
void playerThrowObject(struct Player* player) {
if (!playerIsGrabbing(player)) {
return;
}
struct CollisionObject* object = player->grabConstraint.object;
playerSetGrabbing(player, NULL);
struct Vector3 forward, right;
playerGetMoveBasis(&player->lookTransform, &forward, &right);
vector3Scale(&forward, &forward, -1.0f * THROW_IMPULSE);
rigidBodyAppyImpulse(object->body, &object->body->transform.position, &forward);
}
int playerRaycastGrab(struct Player* player, struct RaycastHit* hit, int checkPastObject) {
struct Ray ray;

View file

@ -73,6 +73,7 @@ int playerIsDead(struct Player* player);
void playerSetGrabbing(struct Player* player, struct CollisionObject* grabbing);
void playerSignalPortalChanged(struct Player* player);
int playerIsGrabbing(struct Player* player);
void playerThrowObject(struct Player* player);
void playerSerialize(struct Serializer* serializer, SerializeAction action, struct Player* player);
void playerDeserialize(struct Serializer* serializer, struct Player* player);

View file

@ -411,7 +411,7 @@ void sceneCheckPortals(struct Scene* scene) {
}
if ((fireOrange || fireBlue) && playerIsGrabbing(&scene->player)){
playerSetGrabbing(&scene->player, NULL);
playerThrowObject(&scene->player);
scene->ignorePortalGun = fireOrange && fireBlue ? IGNORE_FIRE_BOTH : (fireBlue ? IGNORE_FIRE_BLUE : IGNORE_FIRE_ORANGE); // prevent blocking other button
}