mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-25 23:17:28 +00:00
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:
parent
c6087ce77a
commit
e4cae35edb
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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>();
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user