From 1b20204897d142ffff1f38362f8dcff311cca56c Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Wed, 4 Jun 2014 18:12:58 +0200 Subject: [PATCH] Player/Team specific triggers --- src/Components/SpawnPoint.h | 2 - src/Components/Team.h | 18 +++ src/Components/Trigger.h | 1 + src/GameWorld.cpp | 149 +++--------------- src/GameWorld.h | 5 +- src/Systems/GarageSystem.cpp | 33 +++- src/Systems/GarageSystem.h | 1 + src/Systems/JeepSteeringSystem.cpp | 12 +- src/Systems/JeepSteeringSystem.h | 1 + src/Systems/TankSteeringSystem.cpp | 13 +- src/Systems/TankSteeringSystem.h | 1 + src/Systems/TriggerSystem.cpp | 21 ++- src/Systems/TriggerSystem.h | 1 + vs11/Returngeance/Returngeance.vcxproj | 1 + .../Returngeance/Returngeance.vcxproj.filters | 23 +-- 15 files changed, 127 insertions(+), 155 deletions(-) create mode 100644 src/Components/Team.h diff --git a/src/Components/SpawnPoint.h b/src/Components/SpawnPoint.h index 74aaaf9..c29230d 100644 --- a/src/Components/SpawnPoint.h +++ b/src/Components/SpawnPoint.h @@ -8,8 +8,6 @@ namespace Components struct SpawnPoint : Component { - EntityID Player; - virtual SpawnPoint* Clone() const override { return new SpawnPoint(*this); } }; diff --git a/src/Components/Team.h b/src/Components/Team.h new file mode 100644 index 0000000..6bbf105 --- /dev/null +++ b/src/Components/Team.h @@ -0,0 +1,18 @@ +#ifndef Components_Team_h__ +#define Components_Team_h__ + +#include "Component.h" +#include "Entity.h" + +namespace Components +{ + + struct Team : Component + { + unsigned int TeamID; + + virtual Team* Clone() const override { return new Team(*this); } + }; + +} +#endif // !Components_Team_h__ \ No newline at end of file diff --git a/src/Components/Trigger.h b/src/Components/Trigger.h index ec7cfc4..6373259 100644 --- a/src/Components/Trigger.h +++ b/src/Components/Trigger.h @@ -9,6 +9,7 @@ namespace Components struct Trigger : Component { bool TriggerOnce; + int TeamID; virtual Trigger* Clone() const override { return new Trigger(*this); } }; diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index c324f3d..d407693 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -421,6 +421,7 @@ void GameWorld::RegisterComponents() m_ComponentFactory.Register([]() { return new Components::Flag(); }); m_ComponentFactory.Register([]() { return new Components::Move(); }); m_ComponentFactory.Register([]() { return new Components::Rotate(); }); + m_ComponentFactory.Register([]() { return new Components::Team(); }); } void GameWorld::RegisterSystems() @@ -507,7 +508,7 @@ void GameWorld::BindGamepadButton(Gamepad::Button button, std::string command, f EventBroker->Publish(e); } -void GameWorld::CreateGate(EntityID parent, glm::vec3 position, glm::quat orientation) +void GameWorld::CreateGate(EntityID parent, glm::vec3 position, glm::quat orientation, int teamID) { auto gateParent = CreateEntity(parent); auto transform = AddComponent(gateParent); @@ -614,9 +615,11 @@ void GameWorld::CreateGate(EntityID parent, glm::vec3 position, glm::quat orient auto transform = AddComponent(gateTrigger); transform->Position = glm::vec3(0, 2.8241, 0); auto trigger = AddComponent(gateTrigger); + trigger->TeamID = teamID; auto triggerMove = AddComponent(gateTrigger); triggerMove->Entity = gate; - + auto teamComponent = AddComponent(gateTrigger); + teamComponent->TeamID = teamID; { auto shape = CreateEntity(gateTrigger); auto transform = AddComponent(shape); @@ -663,126 +666,6 @@ EntityID GameWorld::CreateWall(EntityID parent, glm::vec3 pos, glm::quat orienta } -EntityID GameWorld::CreateJeep(int playerID) -{ - auto jeep = CreateEntity(); - auto transform = AddComponent(jeep); - transform->Position = glm::vec3(0, 5, 0); - transform->Orientation = glm::angleAxis(glm::pi() / 2, glm::vec3(0, 1, 0)); - auto physics = AddComponent(jeep); - physics->Mass = 1800; - physics->MotionType = Components::Physics::MotionTypeEnum::Dynamic; - auto vehicle = AddComponent(jeep); - vehicle->DownshiftRPM = 3500.f; - vehicle->UpshiftRPM = 6000.f; - - AddComponent(jeep); - auto player = AddComponent(jeep); - player->ID = playerID; - auto health = AddComponent(jeep); - health->Amount = 100.f; - - { - auto shape = CreateEntity(jeep); - auto transform = AddComponent(shape); - auto meshShape = AddComponent(shape); - meshShape->ResourceName = "Models/Jeep/Chassi/ChassiCollision.obj"; - CommitEntity(shape); - } - - { - auto chassis = CreateEntity(jeep); - auto transform = AddComponent(chassis); - transform->Position = glm::vec3(0, 0, 0); // 0.6577f - auto model = AddComponent(chassis); - model->ModelFile = "Models/Jeep/Chassi/chassi.obj"; - } - - //Create wheels - float wheelOffset = 0.4f; - float springLength = 0.3f; - float suspensionStrength = 35.f; - { - auto wheel = CreateEntity(jeep); - auto transform = AddComponent(wheel); - transform->Position = glm::vec3(1.9f, 0.5546f - wheelOffset, -0.9242f); - transform->Scale = glm::vec3(1.0f); - auto model = AddComponent(wheel); - model->ModelFile = "Models/Jeep/WheelFront/wheelFront.obj"; - auto Wheel = AddComponent(wheel); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 0; - Wheel->Mass = 50; - Wheel->Radius = 0.837f; - Wheel->Steering = true; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - CommitEntity(wheel); - } - - { - auto wheel = CreateEntity(jeep); - auto transform = AddComponent(wheel); - transform->Position = glm::vec3(-1.9f, 0.5546f - wheelOffset, -0.9242f); - transform->Scale = glm::vec3(1.0f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 0, 1)); - auto model = AddComponent(wheel); - model->ModelFile = "Models/Jeep/WheelFront/wheelFront.obj"; - auto Wheel = AddComponent(wheel); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 0; - Wheel->Mass = 50; - Wheel->Radius = 0.837f; - Wheel->Steering = true; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - CommitEntity(wheel); - } - - { - auto wheel = CreateEntity(jeep); - auto transform = AddComponent(wheel); - transform->Position = glm::vec3(0.2726f, 0.2805f - wheelOffset, 1.9307f); - auto model = AddComponent(wheel); - model->ModelFile = "Models/Jeep/WheelBack/wheelBack.obj"; - auto Wheel = AddComponent(wheel); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 1; - Wheel->Mass = 50; - Wheel->Radius = 0.737f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - CommitEntity(wheel); - } - - { - auto wheel = CreateEntity(jeep); - auto transform = AddComponent(wheel); - transform->Position = glm::vec3(-0.2726f, 0.2805f - wheelOffset, 1.9307f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 0, 1)); - auto model = AddComponent(wheel); - model->ModelFile = "Models/Jeep/WheelBack/wheelBack.obj"; - auto Wheel = AddComponent(wheel); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 1; - Wheel->Mass = 50; - Wheel->Radius = 0.737f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - CommitEntity(wheel); - } - - CommitEntity(jeep); - - return jeep; -} - void GameWorld::CreateTerrain() { { @@ -938,7 +821,7 @@ void GameWorld::CreateTerrain() } } -void GameWorld::CreateBase(glm::quat orientation, int playerID) +void GameWorld::CreateBase(glm::quat orientation, int teamID) { auto base = CreateEntity(); auto transform = AddComponent(base); @@ -1200,7 +1083,7 @@ void GameWorld::CreateBase(glm::quat orientation, int playerID) } #pragma endregion Terrain - CreateGate(base, glm::vec3(273.f, 40.185f, 0.06f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); + CreateGate(base, glm::vec3(273.f, 40.185f, 0.06f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0)), teamID); CreateWall(base, glm::vec3(273.f, 40.3f, -55.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); CreateWall(base, glm::vec3(273.f, 40.3f, -45.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); @@ -1210,19 +1093,16 @@ void GameWorld::CreateBase(glm::quat orientation, int playerID) CreateWall(base, glm::vec3(273.f, 40.3f, 15.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); CreateWall(base, glm::vec3(273.f, 40.3f, 25.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); - CreateGarage(base, glm::vec3(323.2f, 41.4f, -10.2f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0)), playerID); + CreateGarage(base, glm::vec3(323.2f, 41.4f, -10.2f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0)), teamID); } -EntityID GameWorld::CreateGarage(EntityID parent, glm::vec3 Position, glm::quat orientation, int playerID) + +EntityID GameWorld::CreateGarage(EntityID parent, glm::vec3 Position, glm::quat orientation, int teamID) { auto garage = CreateEntity(parent); auto transform = AddComponent(garage); transform->Position = Position; transform->Orientation = orientation; - auto player = CreateEntity(garage); - auto playerComponent = AddComponent(player); - playerComponent->ID = playerID; - auto ElevatorBase = CreateEntity(garage); { auto transform = AddComponent(ElevatorBase); @@ -1334,7 +1214,8 @@ EntityID GameWorld::CreateGarage(EntityID parent, glm::vec3 Position, glm::quat auto transform = AddComponent(spawnPoint); transform->Position.y = 1.f; auto spawnPointComponent = AddComponent(spawnPoint); - spawnPointComponent->Player = player; + auto teamComponent = AddComponent(spawnPoint); + teamComponent->TeamID = teamID; } CommitEntity(spawnPoint); } @@ -1352,6 +1233,9 @@ EntityID GameWorld::CreateGarage(EntityID parent, glm::vec3 Position, glm::quat auto transform = AddComponent(trigger); transform->Position = glm::vec3(0, 44.87521f, 0); auto triggerComponent = AddComponent(trigger); + triggerComponent->TeamID = teamID; + auto teamComponent = AddComponent(trigger); + teamComponent->TeamID = teamID; { auto shape = CreateEntity(trigger); auto transform = AddComponent(shape); @@ -1371,6 +1255,9 @@ EntityID GameWorld::CreateGarage(EntityID parent, glm::vec3 Position, glm::quat auto transform = AddComponent(trigger); transform->Position = glm::vec3(0.69385f, -6.7997f, -2.0f); auto triggerComponent = AddComponent(trigger); + triggerComponent->TeamID = teamID; + auto teamComponent = AddComponent(trigger); + teamComponent->TeamID = teamID; { auto shape = CreateEntity(trigger); auto transform = AddComponent(shape); diff --git a/src/GameWorld.h b/src/GameWorld.h index e8decde..0b2bcfa 100755 --- a/src/GameWorld.h +++ b/src/GameWorld.h @@ -57,6 +57,7 @@ #include "Components/TriggerRotate.h" #include "Components/Move.h" #include "Components/Rotate.h" +#include "Components/Team.h" class GameWorld : public World { @@ -79,11 +80,11 @@ private: void BindGamepadAxis(Gamepad::Axis axis, std::string command, float value); void BindGamepadButton(Gamepad::Button button, std::string command, float value); - void CreateGate(EntityID parent, glm::vec3 position, glm::quat orientation); + void CreateGate(EntityID parent, glm::vec3 position, glm::quat orientation, int teamID); void AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool steering); EntityID CreateJeep(int playerID); EntityID CreateWall(EntityID parent, glm::vec3 pos, glm::quat orientation); - EntityID CreateGarage(EntityID parent, glm::vec3 Position, glm::quat orientation, int playerID); + EntityID CreateGarage(EntityID parent, glm::vec3 Position, glm::quat orientation, int teamID); void CreateTerrain(); void CreateBase(glm::quat orientation, int playerID); std::vector m_WallDebrisTemplates; diff --git a/src/Systems/GarageSystem.cpp b/src/Systems/GarageSystem.cpp index d019b27..9d805c5 100644 --- a/src/Systems/GarageSystem.cpp +++ b/src/Systems/GarageSystem.cpp @@ -34,6 +34,14 @@ bool Systems::GarageSystem::OnEnterTrigger(const Events::EnterTrigger &event) if (!garageComponent) return false; + auto teamComponent = m_World->GetComponent(event.Trigger); + auto playerComponent = m_World->GetComponent(event.Entity); + + if(!teamComponent || !playerComponent) + return false; + if (teamComponent->TeamID != playerComponent->ID) + return false; + std::string name = m_World->GetProperty(event.Trigger, "Name"); if (name == "BoundsTrigger") @@ -56,6 +64,15 @@ bool Systems::GarageSystem::OnLeaveTrigger(const Events::LeaveTrigger &event) if (!garageComponent) return false; + auto teamComponent = m_World->GetComponent(event.Trigger); + auto playerComponent = m_World->GetComponent(event.Entity); + + if(!teamComponent || !playerComponent) + return false; + if (teamComponent->TeamID != playerComponent->ID) + return false; + + std::string name = m_World->GetProperty(event.Trigger, "Name"); if (name == "BoundsTrigger") @@ -76,18 +93,24 @@ bool Systems::GarageSystem::OnCommand(const Events::InputCommand &event) { EntityID trigger = pair.first; auto entities = pair.second; - std::string name = m_World->GetProperty(trigger, "Name"); if (name != "ElevatorShaftTrigger") continue; - auto triggerBaseParent = m_World->GetEntityBaseParent(trigger); - auto triggerPlayerComponent = m_World->GetComponent(triggerBaseParent); + auto triggerTeamComponent = m_World->GetComponent(trigger); + if (!triggerTeamComponent) + continue; for (EntityID entity : entities) { - auto entityPlayerComponent = m_World->GetComponent(triggerBaseParent); - if (triggerPlayerComponent == entityPlayerComponent) + auto entityPlayerComponent = m_World->GetComponent(entity); + if(!entityPlayerComponent) + continue; + + if (entityPlayerComponent->ID != event.PlayerID) + continue; + + if (triggerTeamComponent->TeamID == entityPlayerComponent->ID) { EntityID garage = m_World->GetEntityParent(trigger); auto garageComponent = m_World->GetComponent(garage); diff --git a/src/Systems/GarageSystem.h b/src/Systems/GarageSystem.h index aca5673..af0f4cf 100644 --- a/src/Systems/GarageSystem.h +++ b/src/Systems/GarageSystem.h @@ -18,6 +18,7 @@ #include "Events/Rotate.h" #include "Components/Move.h" #include "Components/Rotate.h" +#include "Components/Team.h" namespace Systems { diff --git a/src/Systems/JeepSteeringSystem.cpp b/src/Systems/JeepSteeringSystem.cpp index 62f2705..0121a43 100644 --- a/src/Systems/JeepSteeringSystem.cpp +++ b/src/Systems/JeepSteeringSystem.cpp @@ -66,9 +66,17 @@ bool Systems::JeepSteeringSystem::OnSpawnVehicle(const Events::SpawnVehicle &eve { auto spawnPoint = component->Entity; auto spawnPointComponent = std::dynamic_pointer_cast(component); - auto playerComponent = m_World->GetComponent(spawnPointComponent->Player); - if (!playerComponent || playerComponent->ID != event.PlayerID) + auto teamComponent = m_World->GetComponent(spawnPoint); + + if(!teamComponent) + { + LOG_ERROR("SpawnPoint has no TeamComponent"); continue; + } + + if (teamComponent->TeamID != event.PlayerID) + continue; + Components::Transform absoluteTransform = m_World->GetSystem()->AbsoluteTransform(spawnPoint); diff --git a/src/Systems/JeepSteeringSystem.h b/src/Systems/JeepSteeringSystem.h index 0a786be..9ece58b 100644 --- a/src/Systems/JeepSteeringSystem.h +++ b/src/Systems/JeepSteeringSystem.h @@ -28,6 +28,7 @@ #include "Components/Input.h" #include "Components/JeepSteering.h" #include "Events/JeepSteer.h" +#include "Components/Team.h" #include "Events/SetViewportCamera.h" diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp index d886550..f20279a 100644 --- a/src/Systems/TankSteeringSystem.cpp +++ b/src/Systems/TankSteeringSystem.cpp @@ -375,7 +375,7 @@ bool Systems::TankSteeringSystem::OnSpawnVehicle(const Events::SpawnVehicle &eve { if (event.VehicleType != "Tank") return false; - + auto spawnPointComponents = m_World->GetComponentsOfType(); if (!spawnPointComponents) { @@ -387,8 +387,15 @@ bool Systems::TankSteeringSystem::OnSpawnVehicle(const Events::SpawnVehicle &eve { auto spawnPoint = component->Entity; auto spawnPointComponent = std::dynamic_pointer_cast(component); - auto playerComponent = m_World->GetComponent(spawnPointComponent->Player); - if (!playerComponent || playerComponent->ID != event.PlayerID) + auto teamComponent = m_World->GetComponent(spawnPoint); + + if(!teamComponent) + { + LOG_ERROR("SpawnPoint has no TeamComponent"); + continue; + } + + if (teamComponent->TeamID != event.PlayerID) continue; Components::Transform absoluteTransform = m_World->GetSystem()->AbsoluteTransform(spawnPoint); diff --git a/src/Systems/TankSteeringSystem.h b/src/Systems/TankSteeringSystem.h index 3f2ee51..a237026 100644 --- a/src/Systems/TankSteeringSystem.h +++ b/src/Systems/TankSteeringSystem.h @@ -15,6 +15,7 @@ #include "Components/Vehicle.h" #include "Components/Player.h" #include "Components/Model.h" +#include "Components/Team.h" #include "Systems/TransformSystem.h" #include "Systems/ParticleSystem.h" #include "InputController.h" diff --git a/src/Systems/TriggerSystem.cpp b/src/Systems/TriggerSystem.cpp index b6fbe65..b087354 100644 --- a/src/Systems/TriggerSystem.cpp +++ b/src/Systems/TriggerSystem.cpp @@ -44,10 +44,18 @@ void Systems::TriggerSystem::OnEntityRemoved( EntityID entity ) bool Systems::TriggerSystem::OnEnterTrigger( const Events::EnterTrigger &event ) { - + + auto teamComponent = m_World->GetComponent(event.Trigger); + auto playerComponent = m_World->GetComponent(event.Entity); + + if(!teamComponent || !playerComponent) + return false; + if (teamComponent->TeamID != playerComponent->ID) + return false; auto flagComponent1 = m_World->GetComponent(event.Trigger); auto flagComponent2 = m_World->GetComponent(event.Entity); + //HACK: SIMON IS DISSING AMERICA if(flagComponent1) { @@ -77,6 +85,17 @@ bool Systems::TriggerSystem::OnEnterTrigger( const Events::EnterTrigger &event ) bool Systems::TriggerSystem::OnLeaveTrigger( const Events::LeaveTrigger &event ) { + auto teamComponent = m_World->GetComponent(event.Trigger); + auto playerComponent = m_World->GetComponent(event.Entity); + + if(!teamComponent || !playerComponent) + return false; + if (teamComponent->TeamID != playerComponent->ID) + return false; + + auto flagComponent1 = m_World->GetComponent(event.Trigger); + auto flagComponent2 = m_World->GetComponent(event.Entity); + auto triggerMoveComponent = m_World->GetComponent(event.Trigger); if (triggerMoveComponent) { diff --git a/src/Systems/TriggerSystem.h b/src/Systems/TriggerSystem.h index d158557..8891c9e 100644 --- a/src/Systems/TriggerSystem.h +++ b/src/Systems/TriggerSystem.h @@ -21,6 +21,7 @@ #include "Components/Move.h" #include "Components/Rotate.h" #include "Components/Player.h" +#include "Components/Team.h" #include "Events/Move.h" #include "Events/Rotate.h" #include diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 8121c25..e8bee55 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -146,6 +146,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index fed4ecf..410c86e 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -78,15 +78,16 @@ Game\Systems - - Gameplay\Systems - Game\Systems Audio + + + Physics\Systems + @@ -526,9 +527,6 @@ Rendering\Components - - Gameplay\Systems - Physics\Events @@ -565,9 +563,6 @@ GUI - - Gameplay\Events - Game\Events @@ -577,6 +572,16 @@ Game\Components + + + + + + Game\Components + + + Physics\Systems +