Danbias/Code/Game/GameLogic/CollisionManager.cpp

242 lines
8.1 KiB
C++
Raw Normal View History

#include "PhysicsAPI.h"
#include "Object.h"
#include "DynamicObject.h"
#include "Player.h"
#include "Level.h"
#include "AttatchmentMassDriver.h"
#include "Game.h"
#include "CollisionManager.h"
#include "JumpPad.h"
#include "Portal.h"
#include "ExplosiveCrate.h"
using namespace Oyster;
2013-12-19 10:21:03 +01:00
using namespace GameLogic;
2014-01-22 15:47:44 +01:00
void PlayerVObject(Player &player, Object &obj, Oyster::Math::Float kineticEnergyLoss);
void PlayerVLethalObject(Player &player, Object &obj, Oyster::Math::Float kineticEnergyLoss, Oyster::Math::Float ExtraDamage);
void SendObjectFlying(Oyster::Physics::ICustomBody &obj, Oyster::Math::Float3 force);
void Teleport(Oyster::Physics::ICustomBody &obj, Oyster::Math::Float3 target);
2014-01-22 15:47:44 +01:00
//Physics::ICustomBody::SubscriptMessage
2014-01-27 08:54:25 +01:00
void Player::PlayerCollision(Oyster::Physics::ICustomBody *rigidBodyPlayer, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss)
2013-12-19 10:21:03 +01:00
{
2014-02-19 15:52:16 +01:00
Player *player = ((Player*)(rigidBodyPlayer->GetCustomTag()));
Object *realObj = (Object*)obj->GetCustomTag(); //needs to be changed?
2014-01-30 09:40:58 +01:00
switch (realObj->GetObjectType())
{
case ObjectSpecialType::ObjectSpecialType_Generic:
2014-01-22 15:47:44 +01:00
PlayerVObject(*player,*realObj, kineticEnergyLoss);
//return Physics::ICustomBody::SubscriptMessage_none;
break;
case ObjectSpecialType::ObjectSpecialType_StandardBox:
PlayerVObject(*player,*realObj, kineticEnergyLoss);
//return Physics::ICustomBody::SubscriptMessage_none;
break;
case ObjectSpecialType::ObjectSpecialType_Player:
2014-01-22 15:47:44 +01:00
//return Physics::ICustomBody::SubscriptMessage_none;
break;
case ObjectSpecialType::ObjectSpecialType_World:
2014-02-04 11:13:02 +01:00
PlayerVObject(*player,*realObj, kineticEnergyLoss);
//player->playerState = PLAYER_STATE::PLAYER_STATE_WALKING;
2014-01-23 08:57:46 +01:00
break;
case ObjectSpecialType::ObjectSpecialType_CrystalFormation:
PlayerVLethalObject(*player,*realObj, kineticEnergyLoss,realObj->GetExtraDamageOnCollision());
//player->playerState = PLAYER_STATE::PLAYER_STATE_WALKING;
break;
}
2013-12-19 10:21:03 +01:00
2014-01-22 15:47:44 +01:00
//return Physics::ICustomBody::SubscriptMessage_none;
2013-12-19 10:21:03 +01:00
}
void JumpPad::JumpPadActivated(Oyster::Physics::ICustomBody *rigidBodyJumpPad, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss)
{
JumpPad *jumpPad = (JumpPad*)(rigidBodyJumpPad->GetCustomTag());
Object *realObj = (Object*)obj->GetCustomTag(); //needs to be changed?
switch (realObj->GetObjectType())
{
case ObjectSpecialType::ObjectSpecialType_Generic:
break;
case ObjectSpecialType::ObjectSpecialType_StandardBox:
SendObjectFlying(*obj, jumpPad->pushForce);
break;
case ObjectSpecialType::ObjectSpecialType_Player:
SendObjectFlying(*obj, jumpPad->pushForce);
break;
}
}
void SendObjectFlying(Oyster::Physics::ICustomBody &obj, Oyster::Math::Float3 force)
{
2014-02-12 14:45:10 +01:00
obj.ApplyImpulse(force);
}
void Portal::PortalActivated(Oyster::Physics::ICustomBody *rigidBodyPortal, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss)
{
Portal *portal = (Portal*)(rigidBodyPortal->GetCustomTag());
if(obj->GetState().mass == 0) return;
Teleport(*obj,portal->portalExit);
}
void Teleport(Oyster::Physics::ICustomBody &obj, Oyster::Math::Float3 target)
{
obj.SetPosition(target);
}
void ExplosiveCrate::ExplosiveCrateCollision(Oyster::Physics::ICustomBody *rigidBodyCrate, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss)
{
int forceThreashHold = 200000; //how much force for the box to explode of the impact
2014-02-14 13:54:50 +01:00
Object *realObj = (Object*)obj->GetCustomTag(); //needs to be changed?
2014-02-14 13:54:50 +01:00
switch (realObj->GetObjectType())
{
2014-02-14 13:54:50 +01:00
case ObjectSpecialType::ObjectSpecialType_Generic:
break;
case ObjectSpecialType::ObjectSpecialType_StandardBox:
break;
case ObjectSpecialType::ObjectSpecialType_Player:
ExplosiveCrate* crate = ((ExplosiveCrate*)rigidBodyCrate->GetCustomTag());
Oyster::Math::Float3 pos = rigidBodyCrate->GetState().centerPos;
Oyster::Collision3D::Sphere *hitSphere = new Oyster::Collision3D::Sphere(pos,crate->ExplosionRadius);
Oyster::Physics::API::Instance().ApplyEffect(hitSphere,crate,Explode);
delete hitSphere;
2014-02-14 13:54:50 +01:00
break;
}
2014-02-14 13:54:50 +01:00
/*if(kineticEnergyLoss > forceThreashHold)
{
ExplosiveCrate* crate = ((ExplosiveCrate*)rigidBodyCrate->GetCustomTag());
Oyster::Math::Float3 pos = rigidBodyCrate->GetState().centerPos;
Oyster::Collision3D::Sphere *hitSphere = new Oyster::Collision3D::Sphere(pos,crate->ExplosionRadius);
Oyster::Physics::API::Instance().ApplyEffect(hitSphere,crate,Explode);
delete hitSphere;
}*/
}
2014-02-03 16:20:50 +01:00
void ExplosiveCrate::Explode(Oyster::Physics::ICustomBody *obj, void* args)
{
Object *realObj = (Object*)obj->GetCustomTag();
ExplosiveCrate* ExplosionSource = ((ExplosiveCrate*)args);
Oyster::Math::Float3 explosionCenterPos = ExplosionSource->GetPosition();
Oyster::Math::Float3 hitObjectPos = obj->GetState().centerPos;
Oyster::Math::Float3 force = (((hitObjectPos- explosionCenterPos).GetNormalized()) * ExplosionSource->pushForceMagnitude);
if(realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_Player)
{
Player *hitPlayer = (Player*)realObj;
2014-02-14 13:54:50 +01:00
//hitPlayer->DamageLife(ExplosionSource->getExtraDamageOnCollision());
//do shredding damage
}
realObj->GetRigidBody()->ApplyImpulse(force);
}
2013-12-19 10:21:03 +01:00
2014-01-22 15:47:44 +01:00
void PlayerVObject(Player &player, Object &obj, Oyster::Math::Float kineticEnergyLoss)
{
//Collision between a player and a general static or dynamic object
//use kinetic energyloss of the collision in order too determin how much damage to take
//use as part of the damage algorithm
2014-01-27 08:54:25 +01:00
int damageDone = 0;
int forceThreashHold = 200000;
2014-01-27 08:54:25 +01:00
if(kineticEnergyLoss > forceThreashHold) //should only take damage if the force is high enough
{
damageDone = (int)(kineticEnergyLoss * 0.10f);
2014-02-05 09:06:33 +01:00
//player.DamageLife(damageDone);
2014-01-27 08:54:25 +01:00
}
2014-01-27 08:54:25 +01:00
}
void PlayerVLethalObject(Player &player, Object &obj, Oyster::Math::Float kineticEnergyLoss, Oyster::Math::Float ExtraDamage)
{
2014-02-18 13:47:40 +01:00
Oyster::Math::Float damageDone = 0;
Oyster::Math::Float forceThreashHold = 200000;
if(kineticEnergyLoss > forceThreashHold) //should only take damage if the force is high enough
{
2014-02-18 13:47:40 +01:00
damageDone = (kineticEnergyLoss * 0.10f);
damageDone += ExtraDamage;
//player.DamageLife(damageDone);
}
}
Oyster::Physics::ICustomBody::SubscriptMessage Object::DefaultOnCollision(Oyster::Physics::ICustomBody *rigidBodyObject, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss)
{
return Physics::ICustomBody::SubscriptMessage_none;
}
Oyster::Physics::ICustomBody::SubscriptMessage Player::PlayerCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss)
2014-01-31 10:58:03 +01:00
{
return Physics::ICustomBody::SubscriptMessage_none;
}
Oyster::Physics::ICustomBody::SubscriptMessage CollisionManager::IgnoreCollision(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustomBody *obj)
{
return Physics::ICustomBody::SubscriptMessage_ignore_collision_response;
}
Oyster::Physics::ICustomBody::SubscriptMessage Level::LevelCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss)
2014-01-16 11:40:29 +01:00
{
return Physics::ICustomBody::SubscriptMessage_ignore_collision_response;
2014-01-16 11:40:29 +01:00
}
2014-01-30 11:11:45 +01:00
void AttatchmentMassDriver::ForcePushAction(Oyster::Physics::ICustomBody *obj, void *args)
2014-01-22 14:39:10 +01:00
{
2014-02-12 11:32:30 +01:00
if(obj->GetState().mass == 0) return;
2014-01-30 15:12:53 +01:00
Object *realObj = (Object*)obj->GetCustomTag();
if(realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_Player || realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_World)
2014-01-30 15:12:53 +01:00
return;
2014-02-12 11:32:30 +01:00
obj->ApplyImpulse(((forcePushData*)(args))->pushForce);
}
void AttatchmentMassDriver::AttemptPickUp(Oyster::Physics::ICustomBody *obj, void* args)
{
2014-02-12 11:32:30 +01:00
if(obj->GetState().mass == 0) return;
AttatchmentMassDriver *weapon = ((AttatchmentMassDriver*)args);
if(weapon->hasObject)
{
//do nothing
}
else
{
Object* realObj = (Object*)(obj->GetCustomTag());
//check so that it is an object that you can pickup
switch(realObj->GetObjectType())
{
case ObjectSpecialType::ObjectSpecialType_StandardBox:
weapon->heldObject = obj; //weapon now holds the object
weapon->hasObject = true;
break;
}
}
2014-01-30 11:11:45 +01:00
}