Garage working, ready for vehicle swap implementation
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
#include "PrecompiledHeader.h"
|
||||
#include "GarageSystem.h"
|
||||
#include "World.h"
|
||||
|
||||
void Systems::GarageSystem::RegisterComponents( ComponentFactory* cf )
|
||||
{
|
||||
cf->Register<Components::Garage>([]() { return new Components::Garage(); });
|
||||
}
|
||||
|
||||
void Systems::GarageSystem::Initialize()
|
||||
{
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EEnterTrigger, &Systems::GarageSystem::OnEnterTrigger);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_ELeaveTrigger, &Systems::GarageSystem::OnLeaveTrigger);
|
||||
}
|
||||
|
||||
void Systems::GarageSystem::Update(double dt)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Systems::GarageSystem::UpdateEntity(double dt, EntityID entity, EntityID parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool Systems::GarageSystem::OnEnterTrigger(const Events::EnterTrigger &event)
|
||||
{
|
||||
EntityID garage = m_World->GetEntityParent(event.Trigger);
|
||||
if (garage == 0)
|
||||
return false;
|
||||
auto garageComponent = m_World->GetComponent<Components::Garage>(garage);
|
||||
if (!garageComponent)
|
||||
return false;
|
||||
|
||||
std::string name = m_World->GetProperty<std::string>(event.Trigger, "Name");
|
||||
|
||||
if (name == "BoundsTrigger" || name == "ElevatorShaftTrigger")
|
||||
{
|
||||
ToggleGarage(garageComponent);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool Systems::GarageSystem::OnLeaveTrigger(const Events::LeaveTrigger &event)
|
||||
{
|
||||
EntityID garage = m_World->GetEntityParent(event.Trigger);
|
||||
if (garage == 0)
|
||||
return false;
|
||||
auto garageComponent = m_World->GetComponent<Components::Garage>(garage);
|
||||
if (!garageComponent)
|
||||
return false;
|
||||
|
||||
std::string name = m_World->GetProperty<std::string>(event.Trigger, "Name");
|
||||
|
||||
if (name == "BoundsTrigger")
|
||||
{
|
||||
ToggleGarage(garageComponent);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Systems::GarageSystem::ToggleGarage(Components::Garage* garageComponent)
|
||||
{
|
||||
// Elevator
|
||||
if (garageComponent->Elevator != 0)
|
||||
{
|
||||
auto move = m_World->GetComponent<Components::Move>(garageComponent->Elevator);
|
||||
Events::Move e;
|
||||
e.Entity = garageComponent->Elevator;
|
||||
e.GoalPosition = move->GoalPosition;
|
||||
e.Speed = move->Speed;
|
||||
e.Queue = true;
|
||||
EventBroker->Publish(e);
|
||||
std::swap(move->GoalPosition, move->StartPosition);
|
||||
}
|
||||
|
||||
// Left door
|
||||
if (garageComponent->DoorLeft != 0)
|
||||
{
|
||||
auto rotate = m_World->GetComponent<Components::Rotate>(garageComponent->DoorLeft);
|
||||
Events::Rotate e;
|
||||
e.Entity = garageComponent->DoorLeft;
|
||||
e.GoalRotation = rotate->GoalRotation;
|
||||
e.Time = rotate->Time;
|
||||
e.Queue = true;
|
||||
EventBroker->Publish(e);
|
||||
std::swap(rotate->GoalRotation, rotate->StartRotation);
|
||||
}
|
||||
// Right door
|
||||
if (garageComponent->DoorRight != 0)
|
||||
{
|
||||
auto rotate = m_World->GetComponent<Components::Rotate>(garageComponent->DoorRight);
|
||||
Events::Rotate e;
|
||||
e.Entity = garageComponent->DoorRight;
|
||||
e.GoalRotation = rotate->GoalRotation;
|
||||
e.Time = rotate->Time;
|
||||
e.Queue = true;
|
||||
EventBroker->Publish(e);
|
||||
std::swap(rotate->GoalRotation, rotate->StartRotation);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
#ifndef GarageSystem_h__
|
||||
#define GarageSystem_h__
|
||||
|
||||
|
||||
#include "System.h"
|
||||
#include "Components/Transform.h"
|
||||
#include "Components/Trigger.h"
|
||||
#include "Components/Garage.h"
|
||||
#include "Events/EnterTrigger.h"
|
||||
#include "Events/LeaveTrigger.h"
|
||||
|
||||
#include "Components/Player.h"
|
||||
#include "Events/Move.h"
|
||||
#include "Events/Rotate.h"
|
||||
#include "Components/Move.h"
|
||||
#include "Components/Rotate.h"
|
||||
|
||||
namespace Systems
|
||||
{
|
||||
class GarageSystem : public System
|
||||
{
|
||||
public:
|
||||
|
||||
GarageSystem(World* world, std::shared_ptr<::EventBroker> eventBroker, std::shared_ptr<::ResourceManager> resourceManager)
|
||||
: System(world, eventBroker, resourceManager) { }
|
||||
|
||||
void Initialize() override;
|
||||
void RegisterComponents(ComponentFactory* cf) override;
|
||||
void Update(double dt) override;
|
||||
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
||||
|
||||
private:
|
||||
EventRelay<GarageSystem, Events::EnterTrigger> m_EEnterTrigger;
|
||||
bool OnEnterTrigger(const Events::EnterTrigger &event);
|
||||
EventRelay<GarageSystem, Events::LeaveTrigger> m_ELeaveTrigger;
|
||||
bool OnLeaveTrigger(const Events::LeaveTrigger &event);
|
||||
|
||||
void ToggleGarage(Components::Garage* garageComponent);
|
||||
};
|
||||
|
||||
}
|
||||
#endif // GarageSystem_h__
|
||||
@@ -282,26 +282,27 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
|
||||
m_Wheels.push_back(entity);
|
||||
}
|
||||
|
||||
EntityID entityParent = m_World->GetEntityBaseParent(entity);
|
||||
EntityID entityParent = m_World->GetEntityParent(entity);
|
||||
|
||||
auto sphereComponent = m_World->GetComponent<Components::SphereShape>(entity);
|
||||
auto boxComponent = m_World->GetComponent<Components::BoxShape>(entity);
|
||||
auto meshShapeComponent = m_World->GetComponent<Components::MeshShape >(entity);
|
||||
|
||||
if(entityParent == entity && (sphereComponent || boxComponent || meshShapeComponent))
|
||||
if(entityParent == 0 && (sphereComponent || boxComponent || meshShapeComponent))
|
||||
{
|
||||
LOG_ERROR("Entity: %i , Only the children can have a shapeComponent", entity);
|
||||
LOG_ERROR("Entity: %i, Only the children can have a shapeComponent", entity);
|
||||
return;
|
||||
}
|
||||
|
||||
auto physicsComponent = m_World->GetComponent<Components::Physics>(entity);
|
||||
if (physicsComponent && m_Shapes[entity].size() > 0)
|
||||
{
|
||||
if(entityParent != entity)
|
||||
if(entityParent != 0 && !physicsComponent->Static)
|
||||
{
|
||||
LOG_ERROR("Entity: %i , Only the baseparent can have a PhysicsComponent", entity);
|
||||
LOG_ERROR("Entity: %i, Only the baseparent can have a dynamic PhysicsComponent", entity);
|
||||
return;
|
||||
}
|
||||
|
||||
hkpShape* shape;
|
||||
if(! physicsComponent->Static) // Not static
|
||||
{
|
||||
@@ -489,7 +490,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
|
||||
hkpRigidBodyCinfo rigidBodyInfo;
|
||||
{
|
||||
rigidBodyInfo.m_shape = shape;
|
||||
rigidBodyInfo.m_motionType = hkpMotion::MOTION_FIXED;
|
||||
rigidBodyInfo.m_motionType = hkpMotion::MOTION_KEYFRAMED;
|
||||
auto absoluteTransform = m_World->GetSystem<Systems::TransformSystem>()->AbsoluteTransform(entity);
|
||||
hkVector4 position = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Position);
|
||||
hkQuaternion rotation = GLMQUAT_TO_HKQUATERNION(absoluteTransform.Orientation);
|
||||
|
||||
@@ -132,8 +132,8 @@ public:
|
||||
if(m_PhysicsSystem->m_World->ValidEntity(entity1) && m_PhysicsSystem->m_World->ValidEntity(entity2))
|
||||
{
|
||||
Events::EnterTrigger e;
|
||||
e.Entity1 = entity1;
|
||||
e.Entity2 = entity2;
|
||||
e.Trigger = entity1;
|
||||
e.Entity = entity2;
|
||||
m_PhysicsSystem->EventBroker->Publish(e);
|
||||
}
|
||||
}
|
||||
@@ -146,8 +146,8 @@ public:
|
||||
if(m_PhysicsSystem->m_World->ValidEntity(entity1) && m_PhysicsSystem->m_World->ValidEntity(entity2))
|
||||
{
|
||||
Events::LeaveTrigger e;
|
||||
e.Entity1 = entity1;
|
||||
e.Entity2 = entity2;
|
||||
e.Trigger = entity1;
|
||||
e.Entity = entity2;
|
||||
m_PhysicsSystem->EventBroker->Publish(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ void Systems::TriggerSystem::RegisterComponents( ComponentFactory* cf )
|
||||
cf->Register<Components::Trigger>([]() { return new Components::Trigger(); });
|
||||
cf->Register<Components::TriggerExplosion>([]() { return new Components::TriggerExplosion(); });
|
||||
cf->Register<Components::TriggerMove>([]() { return new Components::TriggerMove(); });
|
||||
cf->Register<Components::TriggerRotate>([]() { return new Components::TriggerRotate(); });
|
||||
}
|
||||
|
||||
void Systems::TriggerSystem::Initialize()
|
||||
@@ -47,44 +48,31 @@ void Systems::TriggerSystem::OnEntityRemoved( EntityID entity )
|
||||
|
||||
bool Systems::TriggerSystem::OnEnterTrigger( const Events::EnterTrigger &event )
|
||||
{
|
||||
/*auto explosionComponent1 = m_World->GetComponent<Components::TriggerExplosion>(event.Entity1);
|
||||
auto explosionComponent2 = m_World->GetComponent<Components::TriggerExplosion>(event.Entity2);
|
||||
|
||||
if(explosionComponent1)
|
||||
{
|
||||
Explosion(event.Entity2, event.Entity1);
|
||||
}
|
||||
else if (explosionComponent2)
|
||||
{
|
||||
Explosion(event.Entity1, event.Entity2);
|
||||
}*/
|
||||
|
||||
auto flagComponent1 = m_World->GetComponent<Components::Flag>(event.Entity1);
|
||||
auto flagComponent2 = m_World->GetComponent<Components::Flag>(event.Entity2);
|
||||
|
||||
|
||||
auto flagComponent1 = m_World->GetComponent<Components::Flag>(event.Trigger);
|
||||
auto flagComponent2 = m_World->GetComponent<Components::Flag>(event.Entity);
|
||||
//HACK: SIMON IS DISSING AMERICA
|
||||
if(flagComponent1)
|
||||
{
|
||||
Flag(event.Entity2, event.Entity1);
|
||||
Flag(event.Entity, event.Trigger);
|
||||
}
|
||||
else if (flagComponent2)
|
||||
{
|
||||
Flag(event.Entity1, event.Entity2);
|
||||
Flag(event.Trigger, event.Entity);
|
||||
}
|
||||
|
||||
|
||||
auto triggerComponent1 = m_World->GetComponent<Components::TriggerMove>(event.Entity1);
|
||||
auto triggerComponent2 = m_World->GetComponent<Components::TriggerMove>(event.Entity2);
|
||||
|
||||
auto playerComponent1 = m_World->GetComponent<Components::Player>(event.Entity1);
|
||||
auto playerComponent2 = m_World->GetComponent<Components::Player>(event.Entity2);
|
||||
|
||||
if(triggerComponent1 && playerComponent2)
|
||||
auto triggerMoveComponent = m_World->GetComponent<Components::TriggerMove>(event.Trigger);
|
||||
if (triggerMoveComponent)
|
||||
{
|
||||
Move(event.Entity1);
|
||||
Move(triggerMoveComponent->Entity, triggerMoveComponent->Queue, triggerMoveComponent->Swap);
|
||||
}
|
||||
else if (triggerComponent2 && playerComponent1)
|
||||
|
||||
auto triggerRotateComponent = m_World->GetComponent<Components::TriggerRotate>(event.Trigger);
|
||||
if (triggerRotateComponent)
|
||||
{
|
||||
Move(event.Entity2);
|
||||
Rotate(triggerMoveComponent->Entity, triggerMoveComponent->Queue, triggerMoveComponent->Swap);
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -93,41 +81,56 @@ bool Systems::TriggerSystem::OnEnterTrigger( const Events::EnterTrigger &event )
|
||||
|
||||
bool Systems::TriggerSystem::OnLeaveTrigger( const Events::LeaveTrigger &event )
|
||||
{
|
||||
auto triggerComponent1 = m_World->GetComponent<Components::TriggerMove>(event.Entity1);
|
||||
auto triggerComponent2 = m_World->GetComponent<Components::TriggerMove>(event.Entity2);
|
||||
|
||||
auto playerComponent1 = m_World->GetComponent<Components::Player>(event.Entity1);
|
||||
auto playerComponent2 = m_World->GetComponent<Components::Player>(event.Entity2);
|
||||
|
||||
if(triggerComponent1 && playerComponent2)
|
||||
auto triggerMoveComponent = m_World->GetComponent<Components::TriggerMove>(event.Trigger);
|
||||
if (triggerMoveComponent)
|
||||
{
|
||||
Move(event.Entity1);
|
||||
Move(triggerMoveComponent->Entity, triggerMoveComponent->Queue, triggerMoveComponent->Swap);
|
||||
}
|
||||
else if (triggerComponent2 && playerComponent1)
|
||||
|
||||
auto triggerRotateComponent = m_World->GetComponent<Components::TriggerRotate>(event.Trigger);
|
||||
if (triggerRotateComponent)
|
||||
{
|
||||
Move(event.Entity2);
|
||||
Rotate(triggerMoveComponent->Entity, triggerMoveComponent->Queue, triggerMoveComponent->Swap);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Systems::TriggerSystem::Move( EntityID entity )
|
||||
void Systems::TriggerSystem::Rotate(EntityID entity, bool queue, bool swap)
|
||||
{
|
||||
auto trigger = m_World->GetComponent<Components::TriggerMove>(entity);
|
||||
auto transform = m_World->GetComponent<Components::Transform>(trigger->Entity);
|
||||
|
||||
Events::Move e;
|
||||
e.Entity = trigger->Entity;
|
||||
e.GoalPosition = trigger->GoalPosition;
|
||||
e.Speed = trigger->Speed;
|
||||
e.Queue = false;
|
||||
auto transform = m_World->GetComponent<Components::Transform>(entity);
|
||||
auto rotate = m_World->GetComponent<Components::Rotate>(entity);
|
||||
|
||||
Events::Rotate e;
|
||||
e.Entity = entity;
|
||||
e.GoalRotation = rotate->GoalRotation;
|
||||
e.Time = rotate->Time;
|
||||
e.Queue = queue;
|
||||
EventBroker->Publish(e);
|
||||
|
||||
glm::vec3 temp = trigger->GoalPosition;
|
||||
trigger->GoalPosition = trigger->StartPosition;
|
||||
trigger->StartPosition = temp;
|
||||
if (swap)
|
||||
{
|
||||
std::swap(rotate->GoalRotation, rotate->StartRotation);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Systems::TriggerSystem::Move(EntityID entity, bool queue, bool swap)
|
||||
{
|
||||
auto move = m_World->GetComponent<Components::Move>(entity);
|
||||
Events::Move e;
|
||||
e.Entity = entity;
|
||||
e.GoalPosition = move->GoalPosition;
|
||||
e.Speed = move->Speed;
|
||||
e.Queue = queue;
|
||||
EventBroker->Publish(e);
|
||||
|
||||
if (swap)
|
||||
{
|
||||
std::swap(move->GoalPosition, move->StartPosition);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
#include "Events/LeaveTrigger.h"
|
||||
#include "Components/Flag.h"
|
||||
#include "Components/TriggerMove.h"
|
||||
#include "Components/TriggerRotate.h"
|
||||
#include "Components/Move.h"
|
||||
#include "Components/Rotate.h"
|
||||
#include "Components/Player.h"
|
||||
#include "Events/Move.h"
|
||||
#include "Events/Rotate.h"
|
||||
@@ -46,7 +49,8 @@ namespace Systems
|
||||
private:
|
||||
void Flag(EntityID entity, EntityID phantomEntity);
|
||||
void Explosion(EntityID entity, EntityID phantomEntity);
|
||||
void Move(EntityID entity);
|
||||
void Move(EntityID entity, bool queue, bool swap);
|
||||
void Rotate(EntityID entity, bool queue, bool swap);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user