PhantomPhysics: Fix gravity (#1221)

Fix gravity not being adjusted when colliding with a phantom physics object

Tested that while on moonbase, the players gravity is no longer reset to 1 when they change their cheat info.
This commit is contained in:
David Markowitz 2023-10-16 05:55:57 -07:00 committed by GitHub
parent c6087ce77a
commit e4cae35edb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 64 additions and 22 deletions

View File

@ -215,7 +215,7 @@ PhantomPhysicsComponent::PhantomPhysicsComponent(Entity* parent) : PhysicsCompon
m_dpEntity->SetRotation(m_Rotation); m_dpEntity->SetRotation(m_Rotation);
m_dpEntity->SetPosition(m_Position); m_dpEntity->SetPosition(m_Position);
dpWorld::Instance().AddEntity(m_dpEntity); dpWorld::Instance().AddEntity(m_dpEntity);
} else if (info->physicsAsset == "env\\env_won_fv_gas-blocking-volume.hkx"){ } else if (info->physicsAsset == "env\\env_won_fv_gas-blocking-volume.hkx") {
m_dpEntity = new dpEntity(m_Parent->GetObjectID(), 390.496826f, 111.467964f, 600.821534f, true); m_dpEntity = new dpEntity(m_Parent->GetObjectID(), 390.496826f, 111.467964f, 600.821534f, true);
m_dpEntity->SetScale(m_Scale); m_dpEntity->SetScale(m_Scale);
m_dpEntity->SetRotation(m_Rotation); m_dpEntity->SetRotation(m_Rotation);
@ -336,11 +336,37 @@ void PhantomPhysicsComponent::Serialize(RakNet::BitStream* outBitStream, bool bI
} }
} }
// Even if we were to implement Friction server side,
// it also defaults to 1.0f in the last argument, so we dont need two functions to do the same thing.
void ApplyCollisionEffect(const LWOOBJID& target, const ePhysicsEffectType effectType, const float effectScale) {
switch (effectType) {
case ePhysicsEffectType::GRAVITY_SCALE: {
auto* targetEntity = Game::entityManager->GetEntity(target);
if (targetEntity) {
auto* controllablePhysicsComponent = targetEntity->GetComponent<ControllablePhysicsComponent>();
// dont want to apply an effect to nothing.
if (!controllablePhysicsComponent) return;
controllablePhysicsComponent->SetGravityScale(effectScale);
GameMessages::SendSetGravityScale(target, effectScale, targetEntity->GetSystemAddress());
}
}
// The other types are not handled by the server
case ePhysicsEffectType::ATTRACT:
case ePhysicsEffectType::FRICTION:
case ePhysicsEffectType::PUSH:
case ePhysicsEffectType::REPULSE:
default:
break;
}
}
void PhantomPhysicsComponent::Update(float deltaTime) { void PhantomPhysicsComponent::Update(float deltaTime) {
if (!m_dpEntity) return; if (!m_dpEntity) return;
//Process enter events //Process enter events
for (auto en : m_dpEntity->GetNewObjects()) { for (auto en : m_dpEntity->GetNewObjects()) {
if (!en) continue;
ApplyCollisionEffect(en->GetObjectID(), m_EffectType, m_DirectionalMultiplier);
m_Parent->OnCollisionPhantom(en->GetObjectID()); m_Parent->OnCollisionPhantom(en->GetObjectID());
//If we are a respawn volume, inform the client: //If we are a respawn volume, inform the client:
@ -357,6 +383,8 @@ void PhantomPhysicsComponent::Update(float deltaTime) {
//Process exit events //Process exit events
for (auto en : m_dpEntity->GetRemovedObjects()) { for (auto en : m_dpEntity->GetRemovedObjects()) {
if (!en) continue;
ApplyCollisionEffect(en->GetObjectID(), m_EffectType, 1.0f);
m_Parent->OnCollisionLeavePhantom(en->GetObjectID()); m_Parent->OnCollisionLeavePhantom(en->GetObjectID());
} }
} }

View File

@ -943,7 +943,7 @@ void GameMessages::SendResurrect(Entity* entity) {
destroyableComponent->SetImagination(imaginationToRestore); destroyableComponent->SetImagination(imaginationToRestore);
} }
} }
}); });
auto cont = static_cast<ControllablePhysicsComponent*>(entity->GetComponent(eReplicaComponentType::CONTROLLABLE_PHYSICS)); auto cont = static_cast<ControllablePhysicsComponent*>(entity->GetComponent(eReplicaComponentType::CONTROLLABLE_PHYSICS));
@ -2964,14 +2964,14 @@ void GameMessages::SendSetStunned(LWOOBJID objectId, eStateChangeType stateChang
} }
void GameMessages::SendSetStunImmunity(LWOOBJID target, eStateChangeType state, const SystemAddress& sysAddr, void GameMessages::SendSetStunImmunity(LWOOBJID target, eStateChangeType state, const SystemAddress& sysAddr,
LWOOBJID originator, LWOOBJID originator,
bool bImmuneToStunAttack, bool bImmuneToStunAttack,
bool bImmuneToStunEquip, bool bImmuneToStunEquip,
bool bImmuneToStunInteract, bool bImmuneToStunInteract,
bool bImmuneToStunJump, bool bImmuneToStunJump,
bool bImmuneToStunMove, bool bImmuneToStunMove,
bool bImmuneToStunTurn, bool bImmuneToStunTurn,
bool bImmuneToStunUseItem) { bool bImmuneToStunUseItem) {
CBITSTREAM; CBITSTREAM;
CMSGHEADER; CMSGHEADER;
@ -2996,15 +2996,15 @@ void GameMessages::SendSetStunImmunity(LWOOBJID target, eStateChangeType state,
} }
void GameMessages::SendSetStatusImmunity(LWOOBJID objectId, eStateChangeType state, const SystemAddress& sysAddr, void GameMessages::SendSetStatusImmunity(LWOOBJID objectId, eStateChangeType state, const SystemAddress& sysAddr,
bool bImmuneToBasicAttack, bool bImmuneToBasicAttack,
bool bImmuneToDamageOverTime, bool bImmuneToDamageOverTime,
bool bImmuneToKnockback, bool bImmuneToKnockback,
bool bImmuneToInterrupt, bool bImmuneToInterrupt,
bool bImmuneToSpeed, bool bImmuneToSpeed,
bool bImmuneToImaginationGain, bool bImmuneToImaginationGain,
bool bImmuneToImaginationLoss, bool bImmuneToImaginationLoss,
bool bImmuneToQuickbuildInterrupt, bool bImmuneToQuickbuildInterrupt,
bool bImmuneToPullToPoint) { bool bImmuneToPullToPoint) {
CBITSTREAM; CBITSTREAM;
CMSGHEADER; CMSGHEADER;
@ -5473,6 +5473,18 @@ void GameMessages::HandleRemoveItemFromInventory(RakNet::BitStream* inStream, En
} }
} }
void GameMessages::SendSetGravityScale(const LWOOBJID& target, const float effectScale, const SystemAddress& sysAddr) {
CBITSTREAM;
CMSGHEADER;
bitStream.Write(target);
bitStream.Write(eGameMessageType::SET_GRAVITY_SCALE);
bitStream.Write(effectScale);
SEND_PACKET;
}
void GameMessages::HandleMoveItemInInventory(RakNet::BitStream* inStream, Entity* entity) { void GameMessages::HandleMoveItemInInventory(RakNet::BitStream* inStream, Entity* entity) {
bool destInvTypeIsDefault = false; bool destInvTypeIsDefault = false;
int32_t destInvType = eInventoryType::INVALID; int32_t destInvType = eInventoryType::INVALID;
@ -6269,7 +6281,7 @@ void GameMessages::HandleConfirmDonationOnPlayer(RakNet::BitStream* inStream, En
auto* donationEntity = Game::entityManager->GetEntity(characterComponent->GetCurrentInteracting()); auto* donationEntity = Game::entityManager->GetEntity(characterComponent->GetCurrentInteracting());
if (!donationEntity) return; if (!donationEntity) return;
auto* donationVendorComponent = donationEntity->GetComponent<DonationVendorComponent>(); auto* donationVendorComponent = donationEntity->GetComponent<DonationVendorComponent>();
if(!donationVendorComponent) return; if (!donationVendorComponent) return;
if (donationVendorComponent->GetActivityID() == 0) { if (donationVendorComponent->GetActivityID() == 0) {
Game::logger->Log("GameMessages", "WARNING: Trying to dontate to a vendor with no activity"); Game::logger->Log("GameMessages", "WARNING: Trying to dontate to a vendor with no activity");
return; return;
@ -6279,7 +6291,7 @@ void GameMessages::HandleConfirmDonationOnPlayer(RakNet::BitStream* inStream, En
auto items = inventory->GetItems(); auto items = inventory->GetItems();
if (!items.empty()) { if (!items.empty()) {
uint32_t count = 0; uint32_t count = 0;
for (auto& [itemID, item] : items){ for (auto& [itemID, item] : items) {
count += item->GetCount(); count += item->GetCount();
item->RemoveFromInventory(); item->RemoveFromInventory();
} }
@ -6297,7 +6309,7 @@ void GameMessages::HandleCancelDonationOnPlayer(RakNet::BitStream* inStream, Ent
auto* inventory = inventoryComponent->GetInventory(eInventoryType::DONATION); auto* inventory = inventoryComponent->GetInventory(eInventoryType::DONATION);
if (!inventory) return; if (!inventory) return;
auto items = inventory->GetItems(); auto items = inventory->GetItems();
for (auto& [itemID, item] : items){ for (auto& [itemID, item] : items) {
inventoryComponent->MoveItemToInventory(item, eInventoryType::BRICKS, item->GetCount(), false, false, true); inventoryComponent->MoveItemToInventory(item, eInventoryType::BRICKS, item->GetCount(), false, false, true);
} }
auto* characterComponent = entity->GetComponent<CharacterComponent>(); auto* characterComponent = entity->GetComponent<CharacterComponent>();

View File

@ -109,6 +109,8 @@ namespace GameMessages {
void SendSetInventorySize(Entity* entity, int invType, int size); void SendSetInventorySize(Entity* entity, int invType, int size);
void SendSetGravityScale(const LWOOBJID& target, const float effectScale, const SystemAddress& sysAddr);
void SendSetEmoteLockState(Entity* entity, bool bLock, int emoteID); void SendSetEmoteLockState(Entity* entity, bool bLock, int emoteID);
void SendSetJetPackMode(Entity* entity, bool use, bool bypassChecks = false, bool doHover = false, int effectID = -1, float airspeed = 10, float maxAirspeed = 15, float verticalVelocity = 1, int warningEffectID = -1); void SendSetJetPackMode(Entity* entity, bool use, bool bypassChecks = false, bool doHover = false, int effectID = -1, float airspeed = 10, float maxAirspeed = 15, float verticalVelocity = 1, int warningEffectID = -1);
void SendResurrect(Entity* entity); void SendResurrect(Entity* entity);