From 59e487f9bb5a21f278a0b820a203e4fcb4b074e3 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 10 Mar 2016 16:05:46 +0100 Subject: [PATCH 01/61] PlayerDefenderBlue Updated blendtree --- .../Schema/Entities/PlayerDefenderBlue.xml | 1134 ++++++----------- 1 file changed, 415 insertions(+), 719 deletions(-) diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index 24bfee2b..d7c47f7e 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -2,7 +2,6 @@ - @@ -22,6 +21,7 @@ 150 150 + @@ -38,6 +38,26 @@ + + + + Textures/Icons/Arrow.png + + false + + + + + 50 + true + + + + + + + + @@ -183,10 +203,11 @@ + inf - Textures/Core/White.png + Textures\Icons\Abilities\SheildDots-01.png false @@ -493,195 +514,35 @@ - + - - MovementBlend - FinalBlend - - - Models/Characters/Defender/FirstPersonDefenderBlue.mesh - - - R_Arm_Weapon_Joint - - - DefenderWeapon - Schema/Entities/WeaponDefenderBlueView.xml - - - - + + + DefenderWeapon + - - R_Arm_Weapon_Joint - - - SidearmWeapon - - Schema/Entities/SidearmWeaponView.xml + Schema/Entities/WeaponDefenderBlueView.xml - - - - + + + DefenderWeapon + - - - - BlendTreeDefenderWeapon - BlendTreeSecondaryWeapon - 0 - true - - - - - - - - ActionBlend - Shield - 0 - true - - - - - - - - ActivateDeactiveShieldF - - 1 - false - - - - - - - - - Idle - ActionBlend2 - 0 - true - - - - - - - - IdleF - - - - - - - - - Fire - Reload - 0 - - - - - - - - ShootShotgunF - - 1 - false - - - - - - - - - ShotgunReloadTwoF - - 1 - false - - - - - - - - - - - - - - - - - - - - - - - Idle - Run - 0 - true - - - - - - - - RunF - - 1 - true - true - - - - - - - - - IdleF - - 1 - true - true - - - - - - - @@ -705,539 +566,18 @@ - - BlendTreeAim - BlendTreeAssault - + + BlendTreeUpper + BlendTreeLower + Models/Characters/Defender/DefenderBlue.mesh - - - - - R_Arm_Weapon_Joint - - - AssaultWeapon - - - - - - Schema/Entities/WeaponDefenderBlueWorld.xml - - - - - - - - - - - - R_Arm_Weapon_Joint - - - SidearmWeapon - - - - - - Schema/Entities/SidearmWeaponWorld.xml - - - - - - - - - - - - AimPrimary - AimSecondary - 0 - true - - - - - - - - AimSecWepA - - false - true - - - - - - - - - AimRifleA - - false - true - - - - - - - - - - - ReloadSwitchBlend - MovementBlend - - - - - - - - StandCrouchBlend - JumpDashBlend - 2.5146881298480398e-63 - true - - - - - - - - StandMovement - CrouchMovement - 0 - true - - - - - - - - MovementBlend - Idle - 1 - - - - - - - - Walk - StrafeLRBlend - 0 - - - - - - - - Left - Right - 0.033793529385008014 - - - - - - - - CrouchStrafeRightF - - 1 - true - - - - - - - - - CrouchStrafeLeftF - - 1 - true - - - - - - - - - - - CrouchWalkF - - 1 - true - - - - - - - - - - - CrouchF - - 1 - - - - - - - - - - - MovementBlend - Idle - 1 - - - - - - - - RunWalkBlend - StrafeLRBlend - 2.4565650245976452e-16 - - - - - - - - Left - Right - 0.033793529385008014 - - - - - - - - StrafeRightF - - 1 - true - - - - - - - - - StrafeLeftF - - 1 - true - - - - - - - - - - - Walk - Run - 1.2938206818383024e-24 - - - - - - - - WalkF - - 1 - true - - - - - - - - - RunF - - 1 - true - - - - - - - - - - - - - IdleF - - 1 - true - - - - - - - - - - - - - Jump - DashBlend - 1 - true - - - - - - - - JumpF - - 1 - false - - - - - - - - - DashFBBlend - DashLRBlend - 0.014621149736541383 - - - - - - - - DashForward - DashBackward - 0.014363533804961248 - - - - - - - - DashForwardF - - 1 - false - - - - - - - - - DashBackwardF - - 1 - false - - - - - - - - - - - DashLeft - DashRight - 4.3244885367500671e-16 - - - - - - - - DashLeftF - - 1 - false - - - - - - - - - DashRightF - - 1 - false - - - - - - - - - - - - - - - - - ReloadSwitch - WeaponActionBlend - 1 - true - - - - - - - - ReloadSwitchU - - 1 - - - - - - - - - IdleBlend - ShootBlend - 0 - - - - - - - - IdlePrimary - IdleSecondary - 0 - - - - - - - - IdleAssaultRifleU - - 1 - true - - - - - - - - - IdleSecWepU - - 1 - true - - - - - - - - - - - ShootPrimary - ShootSecondary - 0 - - - - - - - - ShootFastRifleU - - 1 - - - - - - - - - ShootSecWepFastU - - - - - - - - - - - - - @@ -1262,7 +602,6 @@ ActivateDeactiveShieldF - 1 @@ -1272,7 +611,384 @@ ShieldFrontF - 1 + + + + + + + + + + + + + MovementBlend + Jump + 0 + true + + + + + + + + StandMovement + CrouchMovement + 0 + true + + + + + + + + DirectionBlend + Idle + 0 + + + + + + + + IdleF + + true + + + + + + + + + RunWalkBlend + StrafeLRBlend + 0 + + + + + + + + Walk + Run + 1 + + + + + + + + WalkF + + true + + + + + + + + + RunF + + 2 + true + + + + + + + + + + + Left + Right + + + + + + + + StrafeLeftF + + 2 + true + + + + + + + + + StrafeRightF + + 2 + true + + + + + + + + + + + + + + + DirectionBlend + Idle + + + + + + + + Walk + StrafeLRBlend + + + + + + + + Left + Right + + + + + + + + CrouchStrafeLeftF + + true + + + + + + + + + CrouchStrafeRightF + + true + + + + + + + + + + + CrouchWalkF + + true + + + + + + + + + + + CrouchF + + true + + + + + + + + + + + + + JumpF + + false + + + + + + + + + + + R_Arm_Weapon_Joint + + + Schema/Entities/WeaponDefenderBlueWorld.xml + + + + + + + DefenderWeapon + + + + + + + + + + + R_Arm_Weapon_Joint + + + Schema/Entities/WeaponDefenderBlueWorld.xml + + + + + + + DefenderWeapon + + + + + + + + + + + AssaultWeaponBlend + SidearmWeapon + 0 + true + + + + + + + + Aim + WeaponBlend + + + + + + + + MovementBlend + ActionBlend + + + + + + + + Fire + Reload + 1 + + + + + + + + ReloadSwitchU + 0.5 + false + + + + + + + + + ShootFastRifleU + false + + + + + + + + + + + Idle + Run + 0 + + + + + + + + IdleAssaultRifleU + + true + true + + + + + + + + + IdleAssaultRifleU + + true + true + + + + + + + + + + + + + AimRifleA + + 0.10000000149011612 + false + true @@ -1326,26 +1042,6 @@ - - - - Textures/Icons/Arrow.png - - false - - - - - 50 - true - - - - - - - - From 35a8d45fa42c30e3e330bf270782a05fbb0f14c7 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 10 Mar 2016 19:20:21 +0100 Subject: [PATCH 02/61] Fixed skinned models not being able to be shielded --- src/Engine/Rendering/DrawFinalPass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index d03b0c2b..a538f818 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -1232,7 +1232,7 @@ void DrawFinalPass::DrawToDepthStencilBuffer(std::listSkeleton->GetTPose(); } - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); + glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); } else { if (lastShader != m_FillDepthStencilBufferProgram->GetHandle()) { From c82be79bb8ded6fc0114a60d4af1b6c528f66d19 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 10 Mar 2016 19:20:33 +0100 Subject: [PATCH 03/61] Functionally working defender weapon --- .../Systems/Weapon/DefenderWeaponBehaviour.h | 4 +- .../Schema/Components/DefenderWeapon.xml | 4 +- .../Schema/Components/DefenderWeapon.xsd | 2 +- resources/Schema/Entities/DefenderShield.xml | 102 ++++++++++--- resources/Schema/Entities/HitTest.xml | 27 ++++ .../Weapon/DefenderWeaponBehaviour.cpp | 134 +++++++++++------- 6 files changed, 194 insertions(+), 79 deletions(-) create mode 100644 resources/Schema/Entities/HitTest.xml diff --git a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h index 9e7d4991..e8e73e8f 100644 --- a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h @@ -27,9 +27,11 @@ private: std::random_device m_RandomDevice; std::mt19937 m_RandomEngine; + + // Weapon functions void fireShell(ComponentWrapper cWeapon, WeaponInfo& wi); - void dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, glm::vec3 direction, double damage); + void dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, const std::vector& pattern); bool canFire(ComponentWrapper cWeapon, WeaponInfo& wi); // Utility diff --git a/resources/Schema/Components/DefenderWeapon.xml b/resources/Schema/Components/DefenderWeapon.xml index b01955bc..6f7e5a84 100755 --- a/resources/Schema/Components/DefenderWeapon.xml +++ b/resources/Schema/Components/DefenderWeapon.xml @@ -6,9 +6,9 @@ 64 64 90 - 0.174533 + 10 0.174533 - 10 + 9 120 0.03 0.2 diff --git a/resources/Schema/Components/DefenderWeapon.xsd b/resources/Schema/Components/DefenderWeapon.xsd index 53200952..4968fa5d 100755 --- a/resources/Schema/Components/DefenderWeapon.xsd +++ b/resources/Schema/Components/DefenderWeapon.xsd @@ -36,7 +36,7 @@ Damage dealt if all shotgun pellets hit - Spread angle in radians + The spread angle radius. Maximum vertical aim travel angle in radians diff --git a/resources/Schema/Entities/DefenderShield.xml b/resources/Schema/Entities/DefenderShield.xml index 5cb72116..845f7d90 100755 --- a/resources/Schema/Entities/DefenderShield.xml +++ b/resources/Schema/Entities/DefenderShield.xml @@ -1,39 +1,95 @@ - + - - Deploy - Idle - 0 - - - Models/Characters/Defender/DefenderShield.mesh - - + + + - + - - ActivateDeactiveShieldF - - 1 - + + Deploy + Idle + 0 + + + + Models/Characters/Defender/DefenderShieldBack.mesh + + false + true + false + false + false + false + - + + + + + ActivateDeactiveShieldF + true + + + + + + + + + ShieldFrontF + + + + + + - + - - ShieldFrontF - 1 - + + Deploy + Idle + 0 + + + Models/Characters/Defender/DefenderShieldFront.mesh + + false + true + false + false + false + false + - + + + + + ActivateDeactiveShieldF + true + + + + + + + + + ShieldFrontF + + + + + + diff --git a/resources/Schema/Entities/HitTest.xml b/resources/Schema/Entities/HitTest.xml new file mode 100644 index 00000000..bea1c6c9 --- /dev/null +++ b/resources/Schema/Entities/HitTest.xml @@ -0,0 +1,27 @@ + + + + + + 1 + + + + 1 + true + true + + + Models/Core/UnitSphere.mesh + + false + true + + + + + + + + + diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index 835b5378..81873dc9 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -190,19 +190,28 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi magAmmo -= 1; } - int numPellets = cWeapon["NumPellets"]; - float spreadAngle = cWeapon["SpreadAngle"]; - std::uniform_real_distribution randomSpreadAngle(-spreadAngle, spreadAngle); - - // Calculate pellet angles - // HACK: Random for now? - // TODO: Make distribution even for each quadrant - std::vector pelletAngles; - for (int i = 0; i < numPellets; i++) { - pelletAngles.push_back(glm::vec2(randomSpreadAngle(m_RandomEngine), randomSpreadAngle(m_RandomEngine))); + // We can't really do any valuable calculations without a valid camera + if (!m_CurrentCamera.Valid()) { + return; } - double pelletDamage = (double)cWeapon["BaseDamage"] / numPellets; + int numPellets = cWeapon["NumPellets"]; + + // Create a spread pattern + std::vector pattern; + // The first pellet is always centered + pattern.push_back(glm::vec2(0, 0)); + // Any additional pellets form circles around the middle + int numOuterPellets = numPellets - 1; + float angleIncrement = glm::two_pi() / numOuterPellets; + for (int i = 0; i < numOuterPellets; ++i) { + float angle = angleIncrement * i; + glm::vec2 pellet = glm::vec2(glm::cos(angle), glm::sin(angle)); + pattern.push_back(pellet); + } + + // Deal damage (clientside) + dealDamage(cWeapon, wi, pattern); // View punch if (IsClient) { @@ -224,7 +233,7 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi } // Tracers - EntityWrapper weaponModelEntity; + /* EntityWrapper weaponModelEntity; if (wi.Player == LocalPlayer) { weaponModelEntity = wi.FirstPersonEntity; } else { @@ -243,7 +252,7 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi glm::vec3 trajectory = direction * distance; dealDamage(cWeapon, wi, direction, pelletDamage); } - } + }*/ // Play animation playAnimationAndReturn(wi.FirstPersonEntity, "FinalBlend", "Fire"); @@ -255,7 +264,7 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi m_EventBroker->Publish(e); } -void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, glm::vec3 direction, double damage) +void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, const std::vector& pattern) { // Only deal damage client side if (!IsClient) { @@ -271,47 +280,68 @@ void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& w if (!wi.Player.Valid()) { return; } - - glm::vec3 maxRange = direction * 2.f; - EntityWrapper camera = wi.Player.FirstChildByName("Camera"); - glm::vec3 cameraPosition = Transform::AbsolutePosition(camera); - if (!camera.Valid()) { - return; - } - Rectangle screenResolution = m_Renderer->GetViewportSize(); - glm::vec2 centerScreen = glm::vec2(screenResolution.Width / 2, screenResolution.Height / 2); - glm::vec2 screenCoords = cameraFromEntity(m_CurrentCamera).WorldToScreen(cameraPosition + maxRange, m_Renderer->GetViewportSize()); - PickData pickData = m_Renderer->Pick(centerScreen + screenCoords); - EntityWrapper victim(m_World, pickData.Entity); - if (!victim.Valid()) { - return; + + // Convert the spread angle to screen coordinates, taking FOV into account + Rectangle res = m_Renderer->GetViewportSize(); + float spreadAngle = glm::radians((float)cWeapon["SpreadAngle"]); + float nearClip = glm::radians((double)m_CurrentCamera["Camera"]["NearClip"]); + float yFOV = glm::radians((double)m_CurrentCamera["Camera"]["FOV"]); + float yRefFOV = glm::radians(59.f); + float yRef = glm::tan(yRefFOV) * nearClip; + float yRatio = yRef / (glm::tan(yFOV) * nearClip); + float yMax = (yRatio / 2.f) * spreadAngle * (res.Height / 2.f); + + double pelletDamage = (double)cWeapon["BaseDamage"] / pattern.size(); + + // Pick! + std::unordered_map damageSum; + glm::vec2 screenCenter(res.Width / 2.f, res.Height / 2.f); + for (auto& pellet : pattern) { + glm::vec2 pickCoord = screenCenter + (pellet * glm::vec2(yMax, yMax)); + PickData pick = m_Renderer->Pick(pickCoord); + + EntityWrapper victim(m_World, pick.Entity); + if (!victim.Valid()) { + continue; + } + + // Temp hit decal + EntityWrapper hit = ResourceManager::Load("Schema/Entities/HitTest.xml")->MergeInto(m_World); + hit["Transform"]["Position"] = pick.Position; + + // Don't let us shoot ourselves in the foot somehow + if (victim == LocalPlayer) { + continue; + } + + // Only care about players being hit + if (!victim.HasComponent("Player")) { + victim = victim.FirstParentWithComponent("Player"); + if (!victim.Valid()) { + continue; + } + } + + // Check for friendly fire + if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { + // TODO: Ammo sharing + continue; + } + + damageSum[victim] += pelletDamage; + ((glm::vec3&)hit["Model"]["Color"]).b = 1.f; } - // Don't let us shoot ourselves in the foot somehow - if (victim == LocalPlayer) { - return; + // Deal damage! + for (auto& kv : damageSum) { + // Deal damage! + Events::PlayerDamage ePlayerDamage; + ePlayerDamage.Inflictor = wi.Player; + ePlayerDamage.Victim = kv.first; + ePlayerDamage.Damage = kv.second; + m_EventBroker->Publish(ePlayerDamage); + LOG_DEBUG("Dealt %f damage to #%i", kv.second, kv.first.ID); } - - // Only care about players being hit - if (!victim.HasComponent("Player")) { - victim = victim.FirstParentWithComponent("Player"); - } - if (!victim.Valid()) { - return; - } - - // Check for friendly fire - if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { - return; - } - - // Deal damage! - Events::PlayerDamage ePlayerDamage; - ePlayerDamage.Inflictor = wi.Player; - ePlayerDamage.Victim = victim; - ePlayerDamage.Damage = damage; - m_EventBroker->Publish(ePlayerDamage); - LOG_DEBUG("Damage: %f", damage); } bool DefenderWeaponBehaviour::canFire(ComponentWrapper cWeapon, WeaponInfo& wi) From 1992b6cde1a5e562f32dbda0d1b5615aaff4bb4b Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 10 Mar 2016 21:15:27 +0100 Subject: [PATCH 04/61] WIP Defender tracers --- assets | 2 +- .../Systems/Weapon/DefenderWeaponBehaviour.h | 1 + .../Schema/Components/DefenderWeapon.xml | 2 +- resources/Schema/Entities/10Degrees.xml | 94 ++++++++++++++++ resources/Schema/Entities/HitTest.xml | 2 +- resources/Schema/Entities/MovementTest.xml | 100 +++++++++++++++++- resources/Schema/Entities/RayBlue.xml | 2 +- src/Engine/Core/EntityWrapper.cpp | 14 ++- .../Weapon/DefenderWeaponBehaviour.cpp | 99 ++++++++++------- 9 files changed, 266 insertions(+), 50 deletions(-) create mode 100644 resources/Schema/Entities/10Degrees.xml diff --git a/assets b/assets index 85d96f6f..298641b1 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 85d96f6f3d2269e46962492f9713ec67c54e8ece +Subproject commit 298641b1afe313ebde00d77a0c4d75e6c6a0533d diff --git a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h index e8e73e8f..a32d65f1 100644 --- a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h @@ -32,6 +32,7 @@ private: // Weapon functions void fireShell(ComponentWrapper cWeapon, WeaponInfo& wi); void dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, const std::vector& pattern); + void spawnTracers(ComponentWrapper cWeapon, WeaponInfo& wi, std::vector pattern); bool canFire(ComponentWrapper cWeapon, WeaponInfo& wi); // Utility diff --git a/resources/Schema/Components/DefenderWeapon.xml b/resources/Schema/Components/DefenderWeapon.xml index 6f7e5a84..9c3861cd 100755 --- a/resources/Schema/Components/DefenderWeapon.xml +++ b/resources/Schema/Components/DefenderWeapon.xml @@ -1,7 +1,7 @@ - 8 + 9999 8 64 64 diff --git a/resources/Schema/Entities/10Degrees.xml b/resources/Schema/Entities/10Degrees.xml new file mode 100644 index 00000000..0039ca82 --- /dev/null +++ b/resources/Schema/Entities/10Degrees.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/Ray.png + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/Ray.png + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/Ray.png + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/Ray.png + + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/HitTest.xml b/resources/Schema/Entities/HitTest.xml index bea1c6c9..4649072b 100644 --- a/resources/Schema/Entities/HitTest.xml +++ b/resources/Schema/Entities/HitTest.xml @@ -3,7 +3,7 @@ - 1 + 10 diff --git a/resources/Schema/Entities/MovementTest.xml b/resources/Schema/Entities/MovementTest.xml index 8a99df55..604aaca4 100644 --- a/resources/Schema/Entities/MovementTest.xml +++ b/resources/Schema/Entities/MovementTest.xml @@ -103,7 +103,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -157,14 +157,106 @@ Models/Weapons/Blue/DefenderWeaponBlue.mesh - - + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/Ray.png + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/Ray.png + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/Ray.png + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/Ray.png + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/RayBlue.xml b/resources/Schema/Entities/RayBlue.xml index 83adbe51..64ff3619 100644 --- a/resources/Schema/Entities/RayBlue.xml +++ b/resources/Schema/Entities/RayBlue.xml @@ -3,7 +3,7 @@ - 0.10000000149011612 + 10 diff --git a/src/Engine/Core/EntityWrapper.cpp b/src/Engine/Core/EntityWrapper.cpp index a85127ad..83a31fa7 100644 --- a/src/Engine/Core/EntityWrapper.cpp +++ b/src/Engine/Core/EntityWrapper.cpp @@ -27,7 +27,7 @@ void EntityWrapper::AttachComponent(const char* componentName) EntityWrapper EntityWrapper::Parent() { - if (this->World == nullptr || this->ID == EntityID_Invalid) { + if (!Valid()) { return EntityWrapper::Invalid; } else { return EntityWrapper(this->World, this->World->GetParent(this->ID)); @@ -36,6 +36,10 @@ EntityWrapper EntityWrapper::Parent() EntityWrapper EntityWrapper::FirstParentByName(const std::string& parentEntityName) { + if (!Valid()) { + return EntityWrapper::Invalid; + } + EntityWrapper entity = *this; while (entity.Parent().Valid()) { entity = entity.Parent(); @@ -48,6 +52,10 @@ EntityWrapper EntityWrapper::FirstParentByName(const std::string& parentEntityNa EntityWrapper EntityWrapper::FirstChildByName(const std::string& name) { + if (!Valid()) { + return EntityWrapper::Invalid; + } + return firstChildByNameRecursive(name, this->ID); } @@ -78,6 +86,10 @@ EntityWrapper EntityWrapper::FirstLevelChildByName(const std::string& name) EntityWrapper EntityWrapper::FirstParentWithComponent(const std::string& componentType) { + if (!Valid()) { + return EntityWrapper::Invalid; + } + EntityWrapper entity = *this; while (entity.Parent().Valid()) { entity = entity.Parent(); diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index 81873dc9..ca12ec91 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -213,46 +213,27 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi // Deal damage (clientside) dealDamage(cWeapon, wi, pattern); - // View punch - if (IsClient) { - EntityWrapper camera = wi.Player.FirstChildByName("Camera"); - if (camera.Valid()) { - glm::vec3& cameraOrientation = camera["Transform"]["Orientation"]; - float viewPunch = cWeapon["ViewPunch"]; - float maxTravelAngle = cWeapon["MaxTravelAngle"]; - float& currentTravel = cWeapon["CurrentTravel"]; - if (currentTravel < maxTravelAngle) { - float change = viewPunch; - if (currentTravel + change > maxTravelAngle) { - change = maxTravelAngle - currentTravel; - } - cameraOrientation.x += change; - currentTravel += change; - } - } - } + // Spawn tracers + spawnTracers(cWeapon, wi, pattern); - // Tracers - /* EntityWrapper weaponModelEntity; - if (wi.Player == LocalPlayer) { - weaponModelEntity = wi.FirstPersonEntity; - } else { - weaponModelEntity = wi.ThirdPersonEntity; - } - if (weaponModelEntity.Valid()) { - EntityWrapper spawner = weaponModelEntity.FirstChildByName("WeaponMuzzle"); - for (auto& angles : pelletAngles) { - glm::vec3 direction = Transform::AbsoluteOrientation(spawner) * glm::quat(glm::vec3(angles, 0.f)) * glm::vec3(0, 0, -1); - float distance = traceRayDistance(Transform::AbsolutePosition(spawner), direction); - EntityWrapper ray = SpawnerSystem::Spawn(spawner); - ((glm::vec3&)ray["Transform"]["Scale"]).z = (distance / 100.f); - glm::vec3& orientation = ray["Transform"]["Orientation"]; - orientation.x += angles.x; - orientation.y += angles.y; - glm::vec3 trajectory = direction * distance; - dealDamage(cWeapon, wi, direction, pelletDamage); - } - }*/ + // View punch + //if (IsClient) { + // EntityWrapper camera = wi.Player.FirstChildByName("Camera"); + // if (camera.Valid()) { + // glm::vec3& cameraOrientation = camera["Transform"]["Orientation"]; + // float viewPunch = cWeapon["ViewPunch"]; + // float maxTravelAngle = cWeapon["MaxTravelAngle"]; + // float& currentTravel = cWeapon["CurrentTravel"]; + // if (currentTravel < maxTravelAngle) { + // float change = viewPunch; + // if (currentTravel + change > maxTravelAngle) { + // change = maxTravelAngle - currentTravel; + // } + // cameraOrientation.x += change; + // currentTravel += change; + // } + // } + //} // Play animation playAnimationAndReturn(wi.FirstPersonEntity, "FinalBlend", "Fire"); @@ -264,6 +245,34 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi m_EventBroker->Publish(e); } +void DefenderWeaponBehaviour::spawnTracers(ComponentWrapper cWeapon, WeaponInfo& wi, std::vector pattern) +{ + EntityWrapper muzzle = getRelevantWeaponEntity(wi).FirstChildByName("WeaponMuzzle"); + if (!muzzle.Valid()) { + return; + } + + float spreadAngle = glm::radians((float)cWeapon["SpreadAngle"]); + + for (auto& pellet : pattern) { + glm::quat pelletRotation = glm::quat(Transform::AbsoluteOrientationEuler(wi.Player.FirstChildByName("Camera"))) * glm::quat(glm::vec3(pellet.y, pellet.x, 0) * spreadAngle); + glm::vec3 origin = Transform::AbsolutePosition(wi.Player.FirstChildByName("Camera")); + glm::vec3 direction = pelletRotation * glm::vec3(0, 0, -1); + float distance = traceRayDistance(origin, direction); + EntityWrapper ray = SpawnerSystem::Spawn(muzzle); + if (ray.Valid()) { + ComponentWrapper cTransform = ray["Transform"]; + glm::vec3& position = cTransform["Position"]; + glm::vec3& orientation = cTransform["Orientation"]; + glm::vec3& scale = cTransform["Scale"]; + + position = Transform::AbsolutePosition(wi.Player.FirstChildByName("Camera")); + orientation = glm::eulerAngles(pelletRotation); + scale.z = distance; + } + } +} + void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, const std::vector& pattern) { // Only deal damage client side @@ -284,13 +293,21 @@ void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& w // Convert the spread angle to screen coordinates, taking FOV into account Rectangle res = m_Renderer->GetViewportSize(); float spreadAngle = glm::radians((float)cWeapon["SpreadAngle"]); - float nearClip = glm::radians((double)m_CurrentCamera["Camera"]["NearClip"]); + float nearClip = (double)m_CurrentCamera["Camera"]["NearClip"]; + float farClip = (double)m_CurrentCamera["Camera"]["FarClip"]; float yFOV = glm::radians((double)m_CurrentCamera["Camera"]["FOV"]); + //float yRefFOV = glm::radians(59.f); + //float yRef = glm::tan(yRefFOV) * nearClip; + //float yRatio = yRef / (glm::tan(yFOV) * nearClip); + //float yMax = (yRatio / 2.f) * spreadAngle * (res.Height / 2.f); float yRefFOV = glm::radians(59.f); float yRef = glm::tan(yRefFOV) * nearClip; float yRatio = yRef / (glm::tan(yFOV) * nearClip); - float yMax = (yRatio / 2.f) * spreadAngle * (res.Height / 2.f); + float yMax = yRatio * (glm::tan(spreadAngle) * farClip); + LOG_DEBUG("Ratio: %f", yRatio); + LOG_DEBUG("fatClip: %f", farClip); + LOG_DEBUG("yMax: %f", yMax); double pelletDamage = (double)cWeapon["BaseDamage"] / pattern.size(); // Pick! From cc127ad772579fd5dc115088e81a2967fe4c61c5 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 10 Mar 2016 21:31:19 +0100 Subject: [PATCH 05/61] Updated defender blendtree --- resources/Schema/Entities/MovementTest.xml | 7 +- .../Schema/Entities/PlayerDefenderBlue.xml | 186 ++++++++++++------ 2 files changed, 125 insertions(+), 68 deletions(-) diff --git a/resources/Schema/Entities/MovementTest.xml b/resources/Schema/Entities/MovementTest.xml index 8a99df55..6a3fe47f 100644 --- a/resources/Schema/Entities/MovementTest.xml +++ b/resources/Schema/Entities/MovementTest.xml @@ -103,7 +103,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -157,8 +157,7 @@ Models/Weapons/Blue/DefenderWeaponBlue.mesh - - + diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index d7c47f7e..8da1a67a 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -41,9 +41,10 @@ - Textures/Icons/Arrow.png - false + Models/Core/UnitQuad.mesh + + Textures/Icons/Arrow.png @@ -93,9 +94,10 @@ - Textures/Weapons/Crosshair/SmallThickHoleDot.png - false + Models/Core/UnitQuad.mesh + + Textures/Weapons/Crosshair/SmallThickHoleDot.png @@ -126,8 +128,9 @@ - Textures/HealthHUD3.png + Models/Core/UnitQuad.mesh + Textures/HealthHUD3.png @@ -149,9 +152,10 @@ - Textures/Core/White.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png @@ -167,9 +171,10 @@ - Textures/Core/White.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png @@ -185,9 +190,10 @@ - Textures/Core/White.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png @@ -207,9 +213,10 @@ - Textures\Icons\Abilities\SheildDots-01.png - false + Models/Core/UnitQuad.mesh + + Textures\Icons\Abilities\SheildDots-01.png @@ -269,8 +276,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -287,8 +295,9 @@ 2 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -303,8 +312,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -321,8 +331,9 @@ 3 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -337,8 +348,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -356,8 +368,9 @@ 4 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -372,8 +385,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -390,8 +404,9 @@ 1 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -406,8 +421,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -423,8 +439,9 @@ - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -848,8 +865,8 @@ Schema/Entities/WeaponDefenderBlueWorld.xml - - + + DefenderWeapon @@ -869,8 +886,8 @@ Schema/Entities/WeaponDefenderBlueWorld.xml - - + + DefenderWeapon @@ -884,7 +901,7 @@ - AssaultWeaponBlend + DefenderWeaponBlend SidearmWeapon 0 true @@ -892,7 +909,7 @@ - + Aim @@ -904,45 +921,12 @@ - MovementBlend - ActionBlend + MovementBlend2 + FinalBlend - - - - Fire - Reload - 1 - - - - - - - - ReloadSwitchU - 0.5 - false - - - - - - - - - ShootFastRifleU - false - - - - - - - @@ -979,6 +963,80 @@ + + + + ShieldBlend + ActionBlend + + + + + + + + Fire + Reload + 1 + + + + + + + + ShootgunReloadU + 0.5 + + + + + + + + + ShootRifleU + false + + + + + + + + + + + ActivateShield + SheildFront + + + + + + + + ShieldFrontU + true + + + + + + + + + ActivateShieldU + false + + + + + + + + + From e0a6b09d36e0da7b8a2e116d0d37dee633069155 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 11 Mar 2016 19:16:34 +0100 Subject: [PATCH 06/61] Defender early alpha --- assets | 2 +- .../Systems/Weapon/DefenderWeaponBehaviour.h | 2 + resources/Schema/Entities/DefenderShield.xml | 19 +- resources/Schema/Entities/MovementTest.xml | 4 +- .../Schema/Entities/PlayerDefenderBlue.xml | 889 ++++++++++-------- .../Entities/SidearmWeaponBlueWorld.xml | 25 + .../Entities/WeaponDefenderBlueView.xml | 11 +- .../WeaponSidearmDefenderBlueView.xml | 195 ++++ .../Weapon/DefenderWeaponBehaviour.cpp | 106 ++- .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 26 +- 10 files changed, 839 insertions(+), 440 deletions(-) create mode 100644 resources/Schema/Entities/SidearmWeaponBlueWorld.xml create mode 100644 resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml diff --git a/assets b/assets index 298641b1..69ddae17 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 298641b1afe313ebde00d77a0c4d75e6c6a0533d +Subproject commit 69ddae179ac02d5c1582a8c6834451b3f5e4bbaf diff --git a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h index a32d65f1..9244bb60 100644 --- a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h @@ -22,6 +22,8 @@ public: void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) override; void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) override; bool OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e) override; + void OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) override; + private: std::random_device m_RandomDevice; diff --git a/resources/Schema/Entities/DefenderShield.xml b/resources/Schema/Entities/DefenderShield.xml index 845f7d90..d2cca1da 100755 --- a/resources/Schema/Entities/DefenderShield.xml +++ b/resources/Schema/Entities/DefenderShield.xml @@ -2,9 +2,7 @@ - - - + @@ -32,8 +30,8 @@ - ActivateDeactiveShieldF - true + ActivateShieldU + false @@ -42,7 +40,8 @@ - ShieldFrontF + ShieldFrontU + true @@ -67,14 +66,15 @@ false false + - ActivateDeactiveShieldF - true + ActivateShieldU + false @@ -83,7 +83,8 @@ - ShieldFrontF + ShieldFrontU + false diff --git a/resources/Schema/Entities/MovementTest.xml b/resources/Schema/Entities/MovementTest.xml index 604aaca4..b4db78d9 100644 --- a/resources/Schema/Entities/MovementTest.xml +++ b/resources/Schema/Entities/MovementTest.xml @@ -103,7 +103,7 @@ - + @@ -116,7 +116,7 @@ - + diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index 8da1a67a..5fcc6c64 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -8,15 +8,14 @@ - + - 4 - 52 + 8 - + 150 150 @@ -24,41 +23,18 @@ - - true + 5 - - + - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Arrow.png - - - - - 50 - true - - - - - - - - @@ -67,7 +43,6 @@ - @@ -84,6 +59,37 @@ + + + + + + + + + Schema/Entities/WeaponDefenderBlueView.xml + + + + DefenderWeapon + + + + + + + + Schema/Entities/WeaponSidearmDefenderBlueView.xml + + + + SidearmWeapon + + + + + + @@ -115,156 +121,6 @@ - - - - - - - - - 1 - - - - - Models/Core/UnitQuad.mesh - - Textures/HealthHUD3.png - - - - - - - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/White.png - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/White.png - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/White.png - - - - - - - - - - - - - - - - inf - - - - false - Models/Core/UnitQuad.mesh - - Textures\Icons\Abilities\SheildDots-01.png - - - - - - - - - - - 0.0 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - 1 - - - - 150/150 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - @@ -276,6 +132,7 @@ + false Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon.png @@ -295,6 +152,7 @@ 2 + false Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png @@ -312,6 +170,7 @@ + false Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon.png @@ -331,6 +190,7 @@ 3 + false Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png @@ -348,6 +208,7 @@ + false Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon.png @@ -368,6 +229,7 @@ 4 + false Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png @@ -385,6 +247,7 @@ + false Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon.png @@ -404,6 +267,7 @@ 1 + false Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png @@ -421,6 +285,7 @@ + false Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon.png @@ -439,6 +304,7 @@ + false Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png @@ -469,7 +335,6 @@ Fonts/DroidSans.ttf,64 - @@ -522,43 +387,152 @@ Models/Widgets/Arrows/Arrow5.mesh - - - + + - - - - - - - - + - - Schema/Entities/WeaponDefenderBlueView.xml - - - - DefenderWeapon - + + + + - - - - - - Schema/Entities/WeaponDefenderBlueView.xml - - - - DefenderWeapon - - - + + + + + 1 + + + + 150/150 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + 1 + + + + + Models/Core/UnitQuad.mesh + + Textures/HealthHUD3.png + + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Assault-01.png + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Defender-01.png + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Sniper-01.png + + + + + + + + + + + + + + + + + inf + + + + false + Models/Core/UnitQuad.mesh + + Textures\Icons\Abilities\SheildDots-01.png + + + + + + + + + + + @@ -595,47 +569,47 @@ - + + + R_Arm_Weapon_Joint + + + Schema/Entities/WeaponDefenderBlueWorld.xml + - + + + + DefenderWeapon + + + + - - - - - Deploy - Idle - 0 - - - Models/Characters/Defender/DefenderShield.mesh - - - - - - - - ActivateDeactiveShieldF - - - - - - - - - ShieldFrontF - - - - - - - - + + + + + + R_Arm_Weapon_Joint + + + Schema/Entities/SidearmWeaponBlueWorld.xml + + + + + + + SidearmWeapon + + + + + + @@ -659,116 +633,12 @@ - - - - DirectionBlend - Idle - 0 - - - - - - - - IdleF - - true - - - - - - - - - RunWalkBlend - StrafeLRBlend - 0 - - - - - - - - Walk - Run - 1 - - - - - - - - WalkF - - true - - - - - - - - - RunF - - 2 - true - - - - - - - - - - - Left - Right - - - - - - - - StrafeLeftF - - 2 - true - - - - - - - - - StrafeRightF - - 2 - true - - - - - - - - - - - DirectionBlend Idle + 1 @@ -778,6 +648,7 @@ Walk StrafeLRBlend + 0 @@ -787,6 +658,7 @@ Left Right + 0.033793529385008014 @@ -795,7 +667,7 @@ CrouchStrafeLeftF - + true @@ -806,7 +678,7 @@ CrouchStrafeRightF - + true @@ -819,7 +691,7 @@ CrouchWalkF - + true @@ -832,7 +704,113 @@ CrouchF - + + true + + + + + + + + + + + DirectionBlend + Idle + 1 + + + + + + + + RunWalkBlend + StrafeLRBlend + 2.4565650245976452e-16 + + + + + + + + Walk + Run + 1.2938206818383024e-24 + + + + + + + + WalkF + + true + + + + + + + + + RunF + + 2 + true + + + + + + + + + + + Left + Right + 0.033793529385008014 + + + + + + + + StrafeLeftF + + 2 + true + + + + + + + + + StrafeRightF + + 2 + true + + + + + + + + + + + + + IdleF + true @@ -856,60 +834,18 @@ - - - - R_Arm_Weapon_Joint - - - Schema/Entities/WeaponDefenderBlueWorld.xml - - - - - - - DefenderWeapon - - - - - - - - - - - R_Arm_Weapon_Joint - - - Schema/Entities/WeaponDefenderBlueWorld.xml - - - - - - - DefenderWeapon - - - - - - - - DefenderWeaponBlend + DefenderWeapon SidearmWeapon - 0 + 1 true - + Aim @@ -941,7 +877,7 @@ IdleAssaultRifleU - + true true @@ -953,7 +889,7 @@ IdleAssaultRifleU - + true true @@ -968,6 +904,7 @@ ShieldBlend ActionBlend + 1 @@ -977,7 +914,7 @@ Fire Reload - 1 + 0 @@ -986,6 +923,7 @@ ShootgunReloadU + 0.5 @@ -996,6 +934,7 @@ ShootRifleU + false @@ -1009,25 +948,29 @@ ActivateShield SheildFront + 1 - + - ShieldFrontU - true + ActivateShieldU + + 2 + false - + - ActivateShieldU - false + ShieldFrontU + + true @@ -1044,6 +987,101 @@ AimRifleA + true + + + + + + + + + + + Aim + WeaponBlend + + + + + + + + MovementBlend2 + ActionBlend + + + + + + + + Reload + Fire + + + + + + + + ReloadSwitchU + false + + + + + + + + + ShootSecWepU + false + + + + + + + + + + + Idle + Run + + + + + + + + IdleSecWepU + true + + + + + + + + + IdleSecWepU + true + + + + + + + + + + + + + AimSecWepA + 0.10000000149011612 false true @@ -1093,21 +1131,40 @@ - + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Arrow.png + + + + + 50 + true + + + + + + + + Schema/Entities/DefenderShield.xml - - - + diff --git a/resources/Schema/Entities/SidearmWeaponBlueWorld.xml b/resources/Schema/Entities/SidearmWeaponBlueWorld.xml new file mode 100644 index 00000000..d497e955 --- /dev/null +++ b/resources/Schema/Entities/SidearmWeaponBlueWorld.xml @@ -0,0 +1,25 @@ + + + + + + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + + + + + + + + + Schema/Entities/RayBlue.xml + + + + + + + + + + diff --git a/resources/Schema/Entities/WeaponDefenderBlueView.xml b/resources/Schema/Entities/WeaponDefenderBlueView.xml index c22e7200..fac92111 100644 --- a/resources/Schema/Entities/WeaponDefenderBlueView.xml +++ b/resources/Schema/Entities/WeaponDefenderBlueView.xml @@ -27,7 +27,7 @@ - ActivateDeactivateShieldF + ActivateShieldF false @@ -156,7 +156,7 @@ - + @@ -190,16 +190,17 @@ - - + + - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png diff --git a/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml b/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml new file mode 100644 index 00000000..45f18c33 --- /dev/null +++ b/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml @@ -0,0 +1,195 @@ + + + + + + MovementBlend + ActionBlend + + + Models/Characters/Defender/FirstPersonDefenderBlue.mesh + + + + + + + + + Idle + Run + 1 + true + + + + + + + + IdleSecF + true + true + + + + + + + + + RunSecF + true + true + + + + + + + + + + + R_Arm_Weapon_Joint + + + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + + + + + + + + + + + Schema/Entities/RayBlue.xml + + + + + + + + + + + Schema/Entities/ReloadEffectView.xml + + + + + + + + + + + R_Ammo_Joint + true + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + + + + + 38 + Fonts/DroidSans.ttf,64 + + + + + Sidearm + Ammo + + + + + + + + + + + + 5 + Fonts/DroidSans.ttf,64 + + + + + Sidearm + MagazineAmmo + + + + + + + + + + + + + + + Fire + Reload + 0 + + + + + + + + ShootSecF + false + + + + + + + + + ReloadSwitchSecF + false + + + + + + + + + + diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index ca12ec91..cf611c44 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -37,6 +37,16 @@ void DefenderWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& } else { isReloading = false; playAnimationAndReturn(wi.FirstPersonEntity, "FinalBlend", "ReloadEnd"); + + if (wi.ThirdPersonPlayerModel.Valid()) { + Events::AutoAnimationBlend eFireIdle; + eFireIdle.Duration = 0.2; + eFireIdle.RootNode = wi.ThirdPersonPlayerModel; + eFireIdle.NodeName = "Fire"; + eFireIdle.Start = false; + m_EventBroker->Publish(eFireIdle); + } + } } @@ -114,6 +124,16 @@ void DefenderWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) eBlendLoop.AnimationEntity = wi.FirstPersonEntity.FirstChildByName("ReloadStart"); m_EventBroker->Publish(eBlendLoop); } + + if(wi.ThirdPersonPlayerModel.Valid()) { + Events::AutoAnimationBlend eReload; + eReload.Duration = 0.2; + eReload.RootNode = wi.ThirdPersonPlayerModel; + eReload.NodeName = "Reload"; + eReload.Restart = true; + eReload.Start = true; + m_EventBroker->Publish(eReload); + } } void DefenderWeaponBehaviour::OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) @@ -136,17 +156,58 @@ bool DefenderWeaponBehaviour::OnInputCommand(ComponentWrapper cWeapon, WeaponInf SpawnerSystem::Spawn(attachment, attachment); } + EntityWrapper backAttachment = attachment.FirstChildByName("Back"); + if (backAttachment.Valid()) { + Events::AutoAnimationBlend eDeployShieldAttachement; + eDeployShieldAttachement.RootNode = backAttachment; + eDeployShieldAttachement.NodeName = "Deploy"; + eDeployShieldAttachement.Restart = true; + eDeployShieldAttachement.Start = true; + m_EventBroker->Publish(eDeployShieldAttachement); + } + EntityWrapper frontAttachment = attachment.FirstChildByName("Front"); + if (frontAttachment.Valid()) { + Events::AutoAnimationBlend eDeployShieldAttachement; + eDeployShieldAttachement.RootNode = frontAttachment; + eDeployShieldAttachement.NodeName = "Deploy"; + eDeployShieldAttachement.Restart = true; + eDeployShieldAttachement.Start = true; + m_EventBroker->Publish(eDeployShieldAttachement); + + } + if (IsClient) { EntityWrapper root = wi.FirstPersonEntity; if (root.Valid()) { EntityWrapper animationNode = root.FirstChildByName("Shield"); if (animationNode.Valid()) { - Events::AutoAnimationBlend eFireBlend; - eFireBlend.RootNode = root; - eFireBlend.NodeName = "Shield"; - eFireBlend.Restart = true; - eFireBlend.Start = true; - m_EventBroker->Publish(eFireBlend); + Events::AutoAnimationBlend eShieldBlend; + eShieldBlend.RootNode = root; + eShieldBlend.NodeName = "Shield"; + eShieldBlend.Restart = true; + eShieldBlend.Start = true; + m_EventBroker->Publish(eShieldBlend); + } + } + } else { // server only + EntityWrapper root = wi.ThirdPersonPlayerModel; + if (root.Valid()) { + Events::AutoAnimationBlend eShieldActivateBlend; + eShieldActivateBlend.RootNode = root; + eShieldActivateBlend.NodeName = "ActivateShield"; + eShieldActivateBlend.Restart = true; + eShieldActivateBlend.Start = true; + m_EventBroker->Publish(eShieldActivateBlend); + + EntityWrapper animationNode = root.FirstChildByName("ActivateShield"); + if (animationNode.Valid()) { + Events::AutoAnimationBlend eShieldIdleBlend; + eShieldIdleBlend.RootNode = root; + eShieldIdleBlend.NodeName = "ShieldFront"; + eShieldIdleBlend.Restart = true; + eShieldIdleBlend.Start = true; + eShieldIdleBlend.AnimationEntity = animationNode; + m_EventBroker->Publish(eShieldIdleBlend); } } } @@ -166,6 +227,26 @@ bool DefenderWeaponBehaviour::OnInputCommand(ComponentWrapper cWeapon, WeaponInf m_EventBroker->Publish(eFireBlend); } } + } else { // server only + EntityWrapper root = wi.ThirdPersonPlayerModel; + if (root.Valid()) { + Events::AutoAnimationBlend eShieldDeactivateBlend; + eShieldDeactivateBlend.RootNode = root; + eShieldDeactivateBlend.NodeName = "ActivateShield"; + eShieldDeactivateBlend.Restart = true; + eShieldDeactivateBlend.Start = true; + eShieldDeactivateBlend.Reverse = true; + m_EventBroker->Publish(eShieldDeactivateBlend); + + EntityWrapper animationNode = root.FirstChildByName("ActivateShield"); + if (animationNode.Valid()) { + Events::AutoAnimationBlend eActionBlend; + eActionBlend.RootNode = root; + eActionBlend.NodeName = "ActionBlend"; + eActionBlend.AnimationEntity = animationNode; + m_EventBroker->Publish(eActionBlend); + } + } } } } @@ -174,6 +255,18 @@ bool DefenderWeaponBehaviour::OnInputCommand(ComponentWrapper cWeapon, WeaponInf return false; } + +void DefenderWeaponBehaviour::OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) +{ + if (wi.ThirdPersonPlayerModel.Valid()) { + Events::AutoAnimationBlend b1; + b1.RootNode = wi.ThirdPersonPlayerModel; + b1.NodeName = "DefenderWeapon"; + b1.SingleLevelBlend = true; + m_EventBroker->Publish(b1); + } +} + void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi) { cWeapon["FireCooldown"] = 60.0 / (double)cWeapon["RPM"]; @@ -237,6 +330,7 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi // Play animation playAnimationAndReturn(wi.FirstPersonEntity, "FinalBlend", "Fire"); + playAnimationAndReturn(wi.ThirdPersonPlayerModel, "FinalBlend", "Fire"); // Sound Events::PlaySoundOnEntity e; diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index cba3d5e8..db5a9ede 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -35,6 +35,14 @@ void SidearmWeaponBehaviour::OnCeasePrimaryFire(ComponentWrapper cWeapon, Weapon void SidearmWeaponBehaviour::OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) { cWeapon["FireCooldown"] = (double)cWeapon["EquipTime"]; + + if(wi.ThirdPersonPlayerModel.Valid()) { + Events::AutoAnimationBlend b1; + b1.RootNode = wi.ThirdPersonPlayerModel; + b1.NodeName = "SidearmWeapon"; + b1.SingleLevelBlend = true; + m_EventBroker->Publish(b1); + } } void SidearmWeaponBehaviour::OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) @@ -64,7 +72,23 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi glm::vec3 direction = Transform::AbsoluteOrientation(tracerSpawner) * glm::vec3(0, 0, -1); float distance = traceRayDistance(origin, direction); EntityWrapper ray = SpawnerSystem::Spawn(tracerSpawner); - ((glm::vec3&)ray["Transform"]["Scale"]).z = (distance / 100.f); + if (ray.Valid()) { + ((glm::vec3&)ray["Transform"]["Scale"]).z = (distance / 100.f); + } + } + + + // Play animation + playAnimationAndReturn(wi.FirstPersonEntity, "ActionBlend", "Fire"); + + // Third person anim + if (wi.ThirdPersonPlayerModel.Valid()) { + Events::AutoAnimationBlend b1; + b1.RootNode = wi.ThirdPersonPlayerModel; + b1.NodeName = "Fire"; + b1.Restart = true; + b1.Start = true; + m_EventBroker->Publish(b1); } } From 2a209c5d8ecd090f51888d308792cda76fa6d054 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 11 Mar 2016 23:58:26 +0100 Subject: [PATCH 07/61] AmmoSharing beta --- .../Systems/Weapon/SidearmWeaponBehaviour.h | 12 + resources/Schema/Components/SidearmWeapon.xml | 1 + resources/Schema/Components/SidearmWeapon.xsd | 1 + resources/Schema/Entities/FriendlyAmmoHUD.xml | 49 +++ .../Schema/Entities/PlayerAssaultBlue.xml | 218 +++++++++--- .../Entities/SidearmWeaponBlendTree.xlm | 101 ++++++ .../Entities/WeaponSidearmAssaultBlueView.xml | 202 +++++++++++ .../WeaponSidearmReloadEffectView.xml | 54 +++ src/Engine/Rendering/AnimationSystem.cpp | 6 +- .../Systems/Weapon/AssaultWeaponBehaviour.cpp | 8 + .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 325 +++++++++++++++++- 11 files changed, 915 insertions(+), 62 deletions(-) create mode 100644 resources/Schema/Entities/FriendlyAmmoHUD.xml create mode 100644 resources/Schema/Entities/SidearmWeaponBlendTree.xlm create mode 100644 resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml create mode 100644 resources/Schema/Entities/WeaponSidearmReloadEffectView.xml diff --git a/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h b/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h index 10e6105a..7aa20025 100644 --- a/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h @@ -4,6 +4,8 @@ #include "WeaponBehaviour.h" #include "Collision/Collision.h" #include "Core/EPlayerDamage.h" +#include "Sound/EPlaySoundOnEntity.h" +#include "Rendering/EAutoAnimationBlend.h" class SidearmWeaponBehaviour : public WeaponBehaviour { @@ -18,6 +20,7 @@ public: void UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) override; void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override; void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override; + void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) override; void OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) override; void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) override; @@ -32,6 +35,15 @@ private: // Utility bool canFire(ComponentWrapper cWeapon); bool playerInFirstPerson(EntityWrapper player); + + bool dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi); + void giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, EntityWrapper receiver); + + + void CheckAmmo(ComponentWrapper cWeapon, WeaponInfo& wi); + void RemoveFrindlyAmmoHUD(WeaponInfo& wi); + + //float traceRayDistance(glm::vec3 origin, glm::vec3 direction); }; diff --git a/resources/Schema/Components/SidearmWeapon.xml b/resources/Schema/Components/SidearmWeapon.xml index bc90c067..968306a6 100644 --- a/resources/Schema/Components/SidearmWeapon.xml +++ b/resources/Schema/Components/SidearmWeapon.xml @@ -11,6 +11,7 @@ 0.5 false 0 + false false 0 \ No newline at end of file diff --git a/resources/Schema/Components/SidearmWeapon.xsd b/resources/Schema/Components/SidearmWeapon.xsd index 514bf354..2c1df4a1 100644 --- a/resources/Schema/Components/SidearmWeapon.xsd +++ b/resources/Schema/Components/SidearmWeapon.xsd @@ -44,6 +44,7 @@ + diff --git a/resources/Schema/Entities/FriendlyAmmoHUD.xml b/resources/Schema/Entities/FriendlyAmmoHUD.xml new file mode 100644 index 00000000..5ab1b754 --- /dev/null +++ b/resources/Schema/Entities/FriendlyAmmoHUD.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + + + + + + + 88 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/PlayerAssaultBlue.xml b/resources/Schema/Entities/PlayerAssaultBlue.xml index 64141757..7a2010e6 100644 --- a/resources/Schema/Entities/PlayerAssaultBlue.xml +++ b/resources/Schema/Entities/PlayerAssaultBlue.xml @@ -14,12 +14,8 @@ - - - - - + @@ -30,7 +26,6 @@ - @@ -70,9 +65,10 @@ - Textures/Weapons/Crosshair/SmallThickHoleDot.png - false + Models/Core/UnitQuad.mesh + + Textures/Weapons/Crosshair/SmallThickHoleDot.png @@ -101,8 +97,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -119,8 +116,9 @@ 2 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -135,8 +133,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -153,8 +152,9 @@ 3 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -169,8 +169,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -188,8 +189,9 @@ 4 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -204,8 +206,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -222,8 +225,9 @@ 1 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -238,8 +242,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -255,8 +260,9 @@ - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -379,8 +385,9 @@ - Textures/HealthHUD3.png + Models/Core/UnitQuad.mesh + Textures/HealthHUD3.png @@ -403,9 +410,10 @@ - Textures/Icons/Boosts/Assault-01.png - false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Assault-01.png @@ -422,9 +430,10 @@ - Textures/Icons/Boosts/Defender-01.png - false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Defender-01.png @@ -441,9 +450,10 @@ - Textures/Icons/Boosts/Sniper-01.png - false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Sniper-01.png @@ -463,9 +473,10 @@ - Textures\Icons\Abilities\Superman-01.png - false + Models/Core/UnitQuad.mesh + + Textures\Icons\Abilities\Superman-01.png @@ -517,11 +528,11 @@ - Schema/Entities/WeaponDefenderBlueView.xml + Schema/Entities/WeaponSidearmAssaultBlueView.xml - DefenderWeapon + SidearmWeapon @@ -570,8 +581,8 @@ Schema/Entities/WeaponAssaultBlueWorld.xml - - + + AssaultWeapon @@ -588,11 +599,11 @@ R_Arm_Weapon_Joint - Schema/Entities/SidearmWeaponWorld.xml + Schema/Entities/SidearmWeaponBlueWorld.xml - - + + SidearmWeapon @@ -659,7 +670,7 @@ CrouchStrafeLeftF - + true @@ -670,7 +681,7 @@ CrouchStrafeRightF - + true @@ -683,7 +694,7 @@ CrouchWalkF - + true @@ -696,7 +707,7 @@ CrouchF - + true @@ -739,7 +750,7 @@ WalkF - + true @@ -750,7 +761,7 @@ RunF - + 2 true @@ -774,7 +785,7 @@ StrafeLeftF - + 2 true @@ -786,7 +797,7 @@ StrafeRightF - + 2 true @@ -802,7 +813,7 @@ IdleF - + true @@ -891,10 +902,10 @@ - + - DashRightF + DashLeftF 1.7999999523162842 false @@ -903,10 +914,10 @@ - + - DashLeftF + DashRightF 1.7999999523162842 false @@ -926,15 +937,15 @@ - AssaultWeaponBlend + AssaultWeapon SidearmWeapon - 0 + 1 true - + Aim @@ -999,7 +1010,7 @@ IdleAssaultRifleU - + true true @@ -1011,7 +1022,7 @@ IdleAssaultRifleU - + true true @@ -1038,6 +1049,104 @@ + + + + Aim + WeaponBlend + + + + + + + + MovementBlend2 + ActionBlend + + + + + + + + Idle + Run + 0 + + + + + + + + IdleSecWepU + true + + + + + + + + + IdleSecWepU + true + + + + + + + + + + + Reload + Fire + 1 + + + + + + + + ReloadSwitchU + false + + + + + + + + + ShootSecWepU + false + + + + + + + + + + + + + AimSecWepA + + false + true + + + + + + + @@ -1087,9 +1196,10 @@ - Textures/Icons/Arrow.png - false + Models/Core/UnitQuad.mesh + + Textures/Icons/Arrow.png diff --git a/resources/Schema/Entities/SidearmWeaponBlendTree.xlm b/resources/Schema/Entities/SidearmWeaponBlendTree.xlm new file mode 100644 index 00000000..8a3dfb8e --- /dev/null +++ b/resources/Schema/Entities/SidearmWeaponBlendTree.xlm @@ -0,0 +1,101 @@ + + + + + + Aim + WeaponBlend + + + + + + + + + MovementBlend2 + ActionBlend + + + + + + + + Reload + Fire + + + + + + + + ReloadSwitchU + false + + + + + + + + + ShootSecWepU + false + + + + + + + + + + + Idle + Run + + + + + + + + IdleSecWepU + true + + + + + + + + + IdleSecWepU + true + + + + + + + + + + + + + AimSecWepA + + 0.10000000149011612 + false + true + + + + + + + + diff --git a/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml b/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml new file mode 100644 index 00000000..c3c06142 --- /dev/null +++ b/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml @@ -0,0 +1,202 @@ + + + + + + MovementBlend + ActionBlend + + + Models/Characters/Assault/FirstPersonAssaultBlue.mesh + + + + + + + + + Idle + Run + 1 + true + + + + + + + + IdleSecF + true + true + + + + + + + + + RunSecF + true + true + + + + + + + + + + + Fire + Reload + 0 + + + + + + + + ShootSecF + false + + + + + + + + + ReloadSwitchSecF + false + + + + + + + + + + + R_Arm_Weapon_Joint + + + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + + + + + + + + + + + Schema/Entities/Ray2Red.xml + + + + + + + + + + + Schema/Entities/WeaponSidearmReloadEffectView.xml + + + + + + + + + + + R_Ammo_Joint + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + + + + + 16 + Fonts/DroidSans.ttf,64 + + + + + SidearmWeapon + MagazineAmmo + + + + + + + + + + + + 8 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + Schema/Entities/FriendlyAmmoHUD.xml + + + + + + + + + + + + diff --git a/resources/Schema/Entities/WeaponSidearmReloadEffectView.xml b/resources/Schema/Entities/WeaponSidearmReloadEffectView.xml new file mode 100644 index 00000000..fce19d7f --- /dev/null +++ b/resources/Schema/Entities/WeaponSidearmReloadEffectView.xml @@ -0,0 +1,54 @@ + + + + + + 2 + + + + + + + + + + + 1 + 1 + -1 + 1 + + true + + + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + true + + + + + + + + + 1 + + + + + 1 + + true + + + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + true + + + + + + + + diff --git a/src/Engine/Rendering/AnimationSystem.cpp b/src/Engine/Rendering/AnimationSystem.cpp index fad64d77..e30c2e9f 100644 --- a/src/Engine/Rendering/AnimationSystem.cpp +++ b/src/Engine/Rendering/AnimationSystem.cpp @@ -75,18 +75,18 @@ void AnimationSystem::UpdateAnimations(double dt) try { model = ResourceManager::Load<::Model, true>(modelEntity["Model"]["Resource"]); } catch (const std::exception&) { - return; + continue; } Skeleton* skeleton = model->m_RawModel->m_Skeleton; if (skeleton == nullptr) { - return; + continue; } const Skeleton::Animation* animation = skeleton->GetAnimation(animationC["AnimationName"]); if (animation == nullptr) { - continue;; + continue; } double animationSpeed = (double)animationC["Speed"]; diff --git a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp index 8c92b35b..cf2aa9c5 100644 --- a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp @@ -166,6 +166,14 @@ void AssaultWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) void AssaultWeaponBehaviour::OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) { cWeapon["FireCooldown"] = (double)cWeapon["EquipTime"]; + + if (wi.ThirdPersonPlayerModel.Valid()) { + Events::AutoAnimationBlend b1; + b1.RootNode = wi.ThirdPersonPlayerModel; + b1.NodeName = "AssaultWeapon"; + b1.SingleLevelBlend = true; + m_EventBroker->Publish(b1); + } } void AssaultWeaponBehaviour::OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index db5a9ede..7ac802de 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -14,6 +14,62 @@ void SidearmWeaponBehaviour::UpdateComponent(EntityWrapper& entity, ComponentWra void SidearmWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) { + + CheckAmmo(cWeapon, wi); + + // Start reloading automatically if at 0 mag ammo + int& magAmmo = cWeapon["MagazineAmmo"]; + if (m_ConfigAutoReload && magAmmo <= 0) { + OnReload(cWeapon, wi); + } + + // Only start reloading once we're done firing + bool& reloadQueued = cWeapon["ReloadQueued"]; + double& fireCooldown = cWeapon["FireCooldown"]; + bool& isReloading = cWeapon["IsReloading"]; + if (reloadQueued && fireCooldown <= 0) { + reloadQueued = fireCooldown; + isReloading = true; + } + + // Decrement reload timer + double& reloadTimer = cWeapon["ReloadTimer"]; + if (isReloading) { + reloadTimer = glm::max(0.0, reloadTimer - dt); + } + + // Handle reloading + if (isReloading && reloadTimer <= 0.0) { + int& magSize = cWeapon["MagazineSize"]; + + magAmmo = magSize; + isReloading = false; + if (wi.FirstPersonEntity.Valid()) { + wi.FirstPersonEntity.FirstChildByName("ViewModel")["Model"]["Visible"] = true; + } + if (wi.ThirdPersonEntity.Valid()) { + wi.ThirdPersonEntity["Model"]["Visible"] = true; + } + } + double reloadTime = cWeapon["ReloadTime"]; + if (isReloading && reloadTimer <= reloadTime / 2) { + + } + + // Update first person run animation + ComponentWrapper cPlayer = wi.Player["Player"]; + ComponentWrapper cPhysics = wi.Player["Physics"]; + const float& movementSpeed = cPlayer["MovementSpeed"]; + float speed = glm::length((const glm::vec3&)cPhysics["Velocity"]); + float animationWeight = glm::min(speed, movementSpeed) / movementSpeed; + EntityWrapper rootNode = wi.FirstPersonEntity; + if (rootNode.Valid()) { + EntityWrapper blend = rootNode.FirstChildByName("MovementBlend"); + if (blend.Valid()) { + (double&)blend["Blend"]["Weight"] = animationWeight; + } + } + if ((bool)cWeapon["Automatic"] && canFire(cWeapon)) { fireBullet(cWeapon, wi); } @@ -32,6 +88,67 @@ void SidearmWeaponBehaviour::OnCeasePrimaryFire(ComponentWrapper cWeapon, Weapon cWeapon["TriggerHeld"] = false; } + +void SidearmWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) +{ + bool& reloadQueued = cWeapon["ReloadQueued"]; + bool& isReloading = cWeapon["IsReloading"]; + if (reloadQueued || isReloading) { + return; + } + + int& magAmmo = cWeapon["MagazineAmmo"]; + int& magSize = cWeapon["MagazineSize"]; + if (magAmmo >= magSize) { + return; + } + + double reloadTime = cWeapon["ReloadTime"]; + double& reloadTimer = cWeapon["ReloadTimer"]; + + // Start reload + reloadQueued = true; + reloadTimer = reloadTime; + + // Play animation + playAnimationAndReturn(wi.FirstPersonEntity, "ActionBlend", "Reload"); + // Third person anim + Events::AutoAnimationBlend eReloadBlend; + eReloadBlend.RootNode = wi.ThirdPersonPlayerModel; + eReloadBlend.NodeName = "Reload"; + eReloadBlend.Restart = true; + eReloadBlend.Start = true; + m_EventBroker->Publish(eReloadBlend); + + // Spawn explosion effect + if (wi.FirstPersonEntity.Valid()) { + if (IsClient) { + EntityWrapper reloadEffectSpawner = wi.FirstPersonEntity.FirstChildByName("ReloadSpawner"); + if (reloadEffectSpawner.Valid()) { + reloadEffectSpawner.DeleteChildren(); + SpawnerSystem::Spawn(reloadEffectSpawner, reloadEffectSpawner); + } + } + wi.FirstPersonEntity.FirstChildByName("ViewModel")["Model"]["Visible"] = false; + } + if (wi.ThirdPersonEntity.Valid()) { + if (IsServer) { + EntityWrapper reloadEffectSpawner = wi.ThirdPersonEntity.FirstChildByName("ReloadSpawner"); + if (reloadEffectSpawner.Valid()) { + reloadEffectSpawner.DeleteChildren(); + SpawnerSystem::Spawn(reloadEffectSpawner, reloadEffectSpawner); + } + } + wi.ThirdPersonEntity["Model"]["Visible"] = false; + } + + // Sound + Events::PlaySoundOnEntity e; + e.EmitterID = wi.Player.ID; + e.FilePath = "Audio/weapon/Assault/AssaultWeaponReload.wav"; + m_EventBroker->Publish(e); +} + void SidearmWeaponBehaviour::OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) { cWeapon["FireCooldown"] = (double)cWeapon["EquipTime"]; @@ -59,6 +176,14 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi { cWeapon["FireCooldown"] = 60.0 / (double)cWeapon["RPM"]; + // Ammo + int& magAmmo = cWeapon["MagazineAmmo"]; + if (magAmmo <= 0) { + return; + } else { + magAmmo -= 1; + } + // Get weapon model based on current person EntityWrapper weaponModelEntity = getRelevantWeaponEntity(wi); if (!weaponModelEntity.Valid()) { @@ -73,7 +198,20 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi float distance = traceRayDistance(origin, direction); EntityWrapper ray = SpawnerSystem::Spawn(tracerSpawner); if (ray.Valid()) { - ((glm::vec3&)ray["Transform"]["Scale"]).z = (distance / 100.f); + ((glm::vec3&)ray["Transform"]["Scale"]).z = distance; + } + } + + // Deal damage + if (dealDamage(cWeapon, wi)) { + // Show hit marker + EntityWrapper hitMarkerSpawner = wi.Player.FirstChildByName("HitMarkerSpawner"); + if (hitMarkerSpawner.Valid()) { + SpawnerSystem::Spawn(hitMarkerSpawner, hitMarkerSpawner); + Events::PlaySoundOnEntity e; + e.EmitterID = wi.Player.ID; + e.FilePath = "Audio/weapon/hitclick.wav"; + m_EventBroker->Publish(e); } } @@ -95,7 +233,184 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi bool SidearmWeaponBehaviour::canFire(ComponentWrapper cWeapon) { bool triggerHeld = cWeapon["TriggerHeld"]; - double& cooldown = cWeapon["FireCooldown"]; - // TODO: Ammo checks - return triggerHeld && cooldown <= 0.0; -} \ No newline at end of file + bool cooldownPassed = (double)cWeapon["FireCooldown"] <= 0.0; + bool isNotReloading = !(bool)cWeapon["IsReloading"]; + return triggerHeld && cooldownPassed && isNotReloading; +} + +bool SidearmWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi) +{ + // Only deal damage client side + if (!IsClient) { + return false; + } + + // Only handle damage for the local player + if (wi.Player != LocalPlayer) { + return false; + } + + // Make sure the player isn't shooting from the grave + if (!wi.Player.Valid()) { + return false; + } + + // 3D-pick middle of screen + Rectangle viewport = m_Renderer->GetViewportSize(); + glm::vec2 centerScreen(viewport.Width / 2, viewport.Height / 2); + // TODO: Some horizontal spread + PickData pickData = m_Renderer->Pick(centerScreen); + EntityWrapper victim(m_World, pickData.Entity); + if (!victim.Valid()) { + return false; + } + + // Don't let us somehow shoot ourselves in the foot + if (victim == LocalPlayer) { + return false; + } + + // Only care about players being hit + if (!victim.HasComponent("Player")) { + victim = victim.FirstParentWithComponent("Player"); + } + if (!victim.Valid()) { + return false; + } + + double damage = cWeapon["BaseDamage"]; + // If friendly fire, reduce damage to 0 (needed to make Boosts, Ammosharing work) + if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { + damage = 0; + giveAmmo(cWeapon, wi, victim); + } + + // Deal damage! + Events::PlayerDamage ePlayerDamage; + ePlayerDamage.Inflictor = wi.Player; + ePlayerDamage.Victim = victim; + ePlayerDamage.Damage = damage; + m_EventBroker->Publish(ePlayerDamage); + + return damage > 0; +} + +void SidearmWeaponBehaviour::giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, EntityWrapper receiver) +{ + if (receiver.HasComponent("AssaultWeapon")) { + int magazineSize = receiver["AssaultWeapon"]["MagazineSize"]; + int& magazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; + + int maxAmmo = receiver["AssaultWeapon"]["MaxAmmo"]; + int& ammo = receiver["AssaultWeapon"]["Ammo"]; + + if(magazineAmmo < magazineSize) { + magazineAmmo += 1; + } else if (ammo < maxAmmo) { + ammo += 1; + } + } else if (receiver.HasComponent("DefenderWeapon")) { + int magazineSize = receiver["DefenderWeapon"]["MagazineSize"]; + int& magazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; + + int maxAmmo = receiver["DefenderWeapon"]["MaxAmmo"]; + int& ammo = receiver["DefenderWeapon"]["Ammo"]; + + if (magazineAmmo < magazineSize) { + magazineAmmo += 1; + } else if (ammo < maxAmmo) { + ammo += 1; + } + } +} + +void SidearmWeaponBehaviour::CheckAmmo(ComponentWrapper cWeapon, WeaponInfo& wi) +{ + // Only check ammo client side + if (!IsClient) { + return; + } + + // Only handle ammo check for the local player + if (wi.Player != LocalPlayer) { + return; + } + + // Make sure the player isn't checking from the grave + if (!wi.Player.Valid()) { + return; + } + + // 3D-pick middle of screen + Rectangle viewport = m_Renderer->GetViewportSize(); + glm::vec2 centerScreen(viewport.Width / 2, viewport.Height / 2); + // TODO: Some horizontal spread + PickData pickData = m_Renderer->Pick(centerScreen); + EntityWrapper victim(m_World, pickData.Entity); + if (!victim.Valid()) { + RemoveFrindlyAmmoHUD(wi); + return; + } + + // Don't let us somehow shoot ourselves in the foot + if (victim == LocalPlayer) { + RemoveFrindlyAmmoHUD(wi); + return; + } + + // Only care about players being hit + if (!victim.HasComponent("Player")) { + victim = victim.FirstParentWithComponent("Player"); + } + if (!victim.Valid()) { + RemoveFrindlyAmmoHUD(wi); + return; + } + + + // If friendly fire, reduce damage to 0 (needed to make Boosts, Ammosharing work) + if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { + int magazineAmmo = 0; + if (victim.HasComponent("AssaultWeapon")) { + magazineAmmo = (int)victim["AssaultWeapon"]["MagazineAmmo"]; + + } else if (victim.HasComponent("DefenderWeapon")) { + magazineAmmo = (int)victim["DefenderWeapon"]["MagazineAmmo"]; + } + + + EntityWrapper friendlyAmmoHudSpawner = wi.FirstPersonPlayerModel.FirstChildByName("FriendlyAmmoAttachment"); + if(friendlyAmmoHudSpawner.Valid()) { + + auto children = m_World->GetDirectChildren(friendlyAmmoHudSpawner.ID); + + if (children.first == children.second) { + EntityWrapper friendlyAmmoHud = SpawnerSystem::Spawn(friendlyAmmoHudSpawner, friendlyAmmoHudSpawner); + if (friendlyAmmoHud.Valid()) { + EntityWrapper textEntity = friendlyAmmoHud.FirstChildByName("MagazineAmmo"); + if (textEntity.Valid()) { + if (textEntity.HasComponent("Text")) { + (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + } + } + } + } else { + EntityWrapper textEntity = friendlyAmmoHudSpawner.FirstChildByName("MagazineAmmo"); + if (textEntity.Valid()) { + if (textEntity.HasComponent("Text")) { + (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + } + } + } + + } + } +} + +void SidearmWeaponBehaviour::RemoveFrindlyAmmoHUD(WeaponInfo& wi) +{ + EntityWrapper friendlyAmmoHudSpawner = wi.FirstPersonPlayerModel.FirstChildByName("FriendlyAmmoAttachment"); + if (friendlyAmmoHudSpawner.Valid()) { + friendlyAmmoHudSpawner.DeleteChildren(); + } +} From 060585a388a19c139e79ad33906cd42093f12d2f Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sat, 12 Mar 2016 02:39:06 +0100 Subject: [PATCH 08/61] Aim fixed for all weapons --- include/Game/Systems/PlayerMovementSystem.h | 2 + .../Schema/Entities/AmmoShareEffectView.xml | 33 +++ resources/Schema/Entities/FriendlyAmmoHUD.xml | 22 +- .../Schema/Entities/PlayerAssaultBlue.xml | 12 +- .../Entities/WeaponSidearmAssaultBlueView.xml | 11 +- .../WeaponSidearmDefenderBlueView.xml | 236 ++++++++++-------- src/Game/Systems/PlayerMovementSystem.cpp | 33 ++- .../Weapon/DefenderWeaponBehaviour.cpp | 5 +- .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 52 +++- 9 files changed, 268 insertions(+), 138 deletions(-) create mode 100644 resources/Schema/Entities/AmmoShareEffectView.xml diff --git a/include/Game/Systems/PlayerMovementSystem.h b/include/Game/Systems/PlayerMovementSystem.h index 981fc13a..6ad52a95 100644 --- a/include/Game/Systems/PlayerMovementSystem.h +++ b/include/Game/Systems/PlayerMovementSystem.h @@ -46,4 +46,6 @@ private: void updateMovementControllers(double dt); void updateVelocity(EntityWrapper player, double dt); + + void setAim(EntityWrapper root, std::string weaponNodeName, double time); }; \ No newline at end of file diff --git a/resources/Schema/Entities/AmmoShareEffectView.xml b/resources/Schema/Entities/AmmoShareEffectView.xml new file mode 100644 index 00000000..651d1621 --- /dev/null +++ b/resources/Schema/Entities/AmmoShareEffectView.xml @@ -0,0 +1,33 @@ + + + + + + 1.2000000476837158 + + + + + 1.2000000476837158 + -1 + 1.2000000476837158 + + true + true + + + 16.040000915527344 + Models/Effects/JumpEffectHexagon.mesh + + true + + + + + + + + + + + diff --git a/resources/Schema/Entities/FriendlyAmmoHUD.xml b/resources/Schema/Entities/FriendlyAmmoHUD.xml index 5ab1b754..57209829 100644 --- a/resources/Schema/Entities/FriendlyAmmoHUD.xml +++ b/resources/Schema/Entities/FriendlyAmmoHUD.xml @@ -16,7 +16,7 @@ - + @@ -33,11 +33,25 @@ 88 Fonts/DroidSans.ttf,64 - + - - + + + + + + + + + + 88 + Fonts/DroidSans.ttf,64 + + + + + diff --git a/resources/Schema/Entities/PlayerAssaultBlue.xml b/resources/Schema/Entities/PlayerAssaultBlue.xml index 7a2010e6..4ca636da 100644 --- a/resources/Schema/Entities/PlayerAssaultBlue.xml +++ b/resources/Schema/Entities/PlayerAssaultBlue.xml @@ -15,7 +15,9 @@ - + + 10 + @@ -902,10 +904,10 @@ - + - DashLeftF + DashRightF 1.7999999523162842 false @@ -914,10 +916,10 @@ - + - DashRightF + DashLeftF 1.7999999523162842 false diff --git a/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml b/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml index c3c06142..620d9416 100644 --- a/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml +++ b/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml @@ -190,11 +190,20 @@ Schema/Entities/FriendlyAmmoHUD.xml - + + + + + Schema/Entities/AmmoShareEffectView.xml + + + + + diff --git a/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml b/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml index 45f18c33..3ff8b0a2 100644 --- a/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml +++ b/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml @@ -48,116 +48,6 @@ - - - - R_Arm_Weapon_Joint - - - Models/Weapons/Blue/SecondaryWeaponBlue.mesh - - - - - - - - - - - Schema/Entities/RayBlue.xml - - - - - - - - - - - Schema/Entities/ReloadEffectView.xml - - - - - - - - - - - R_Ammo_Joint - true - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - - - - - 38 - Fonts/DroidSans.ttf,64 - - - - - Sidearm - Ammo - - - - - - - - - - - - 5 - Fonts/DroidSans.ttf,64 - - - - - Sidearm - MagazineAmmo - - - - - - - - - - - @@ -190,6 +80,132 @@ + + + + R_Arm_Weapon_Joint + + + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + + + + + + + + + + + Schema/Entities/Ray2Red.xml + + + + + + + + + + + Schema/Entities/WeaponSidearmReloadEffectView.xml + + + + + + + + + + + R_Ammo_Joint + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + + + + + 16 + Fonts/DroidSans.ttf,64 + + + + + SidearmWeapon + MagazineAmmo + + + + + + + + + + + + 8 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + Schema/Entities/FriendlyAmmoHUD.xml + + + + + + + + + + + Schema/Entities/AmmoShareEffectView.xml + + + + + + + diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index cfe7356c..b86d4140 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -82,17 +82,15 @@ void PlayerMovementSystem::updateMovementControllers(double dt) // Limit camera pitch so we don't break our necks cameraOrientation.x = glm::clamp(cameraOrientation.x, -glm::half_pi(), glm::half_pi()); + float pitch = cameraOrientation.x; + double time = ((pitch + glm::half_pi()) / glm::pi()); + // Set third person model aim pitch EntityWrapper playerModel = player.FirstChildByName("PlayerModel"); if (playerModel.Valid()) { - EntityWrapper aimPrimaryEntity = playerModel.FirstChildByName("Aim"); - if(aimPrimaryEntity.Valid()){ - if(aimPrimaryEntity.HasComponent("Animation")) { - float pitch = cameraOrientation.x; - double time = ((pitch + glm::half_pi()) / glm::pi()); - (double&)aimPrimaryEntity["Animation"]["Time"] = time; - } - } + setAim(playerModel, "SidearmWeapon", time); + setAim(playerModel, "AssaultWeapon", time); + setAim(playerModel, "DefenderWeapon", time); } } @@ -308,6 +306,25 @@ void PlayerMovementSystem::updateVelocity(EntityWrapper player, double dt) position += velocity * (float)dt; } + +void PlayerMovementSystem::setAim(EntityWrapper root, std::string weaponNodeName, double time) +{ + if (root.Valid()) { + EntityWrapper blendTreeUpper = root.FirstChildByName("BlendTreeUpper"); + if (blendTreeUpper.Valid()) { + EntityWrapper weapon = blendTreeUpper.FirstChildByName(weaponNodeName); + if(weapon.Valid()) { + EntityWrapper aim = weapon.FirstChildByName("Aim"); + if (aim.Valid()) { + if (aim.HasComponent("Animation")) { + (double&)aim["Animation"]["Time"] = time; + } + } + } + } + } +} + void PlayerMovementSystem::playerStep(double dt) { if (!m_LocalPlayer.Valid()) { diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index cf611c44..f342f291 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -353,6 +353,9 @@ void DefenderWeaponBehaviour::spawnTracers(ComponentWrapper cWeapon, WeaponInfo& glm::vec3 origin = Transform::AbsolutePosition(wi.Player.FirstChildByName("Camera")); glm::vec3 direction = pelletRotation * glm::vec3(0, 0, -1); float distance = traceRayDistance(origin, direction); + + // Collision::EntityFirstHitByRay(Ray(origin, direction), m_CollisionOctree, distance, pos); + EntityWrapper ray = SpawnerSystem::Spawn(muzzle); if (ray.Valid()) { ComponentWrapper cTransform = ray["Transform"]; @@ -397,7 +400,7 @@ void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& w float yRefFOV = glm::radians(59.f); float yRef = glm::tan(yRefFOV) * nearClip; float yRatio = yRef / (glm::tan(yFOV) * nearClip); - float yMax = yRatio * (glm::tan(spreadAngle) * farClip); + float yMax = yRatio * (glm::tan(spreadAngle) * (farClip - nearClip)) * glm::pi(); // ????? Good enough???? LOG_DEBUG("Ratio: %f", yRatio); LOG_DEBUG("fatClip: %f", farClip); diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index 7ac802de..9c12bb2c 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -297,6 +297,8 @@ bool SidearmWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi void SidearmWeaponBehaviour::giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, EntityWrapper receiver) { + bool gaveAmmo = false; + if (receiver.HasComponent("AssaultWeapon")) { int magazineSize = receiver["AssaultWeapon"]["MagazineSize"]; int& magazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; @@ -306,8 +308,10 @@ void SidearmWeaponBehaviour::giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, if(magazineAmmo < magazineSize) { magazineAmmo += 1; + gaveAmmo = true; } else if (ammo < maxAmmo) { ammo += 1; + gaveAmmo = true; } } else if (receiver.HasComponent("DefenderWeapon")) { int magazineSize = receiver["DefenderWeapon"]["MagazineSize"]; @@ -318,8 +322,20 @@ void SidearmWeaponBehaviour::giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, if (magazineAmmo < magazineSize) { magazineAmmo += 1; + gaveAmmo = true; } else if (ammo < maxAmmo) { ammo += 1; + gaveAmmo = true; + } + } + + + if(gaveAmmo) { + EntityWrapper effectSpawner = wi.FirstPersonEntity.FirstChildByName("AmmoShareEffectSpawner"); + if(effectSpawner.Valid()) { + if (effectSpawner.HasComponent("Spawner")) { + SpawnerSystem::Spawn(effectSpawner, effectSpawner); + } } } } @@ -371,26 +387,38 @@ void SidearmWeaponBehaviour::CheckAmmo(ComponentWrapper cWeapon, WeaponInfo& wi) // If friendly fire, reduce damage to 0 (needed to make Boosts, Ammosharing work) if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { int magazineAmmo = 0; + int ammo = 0; if (victim.HasComponent("AssaultWeapon")) { magazineAmmo = (int)victim["AssaultWeapon"]["MagazineAmmo"]; + ammo = (int)victim["AssaultWeapon"]["Ammo"]; } else if (victim.HasComponent("DefenderWeapon")) { magazineAmmo = (int)victim["DefenderWeapon"]["MagazineAmmo"]; + ammo = (int)victim["DefenderWeapon"]["Ammo"]; } - + EntityWrapper friendlyAmmoHudSpawner = wi.FirstPersonPlayerModel.FirstChildByName("FriendlyAmmoAttachment"); - if(friendlyAmmoHudSpawner.Valid()) { + if (friendlyAmmoHudSpawner.Valid()) { auto children = m_World->GetDirectChildren(friendlyAmmoHudSpawner.ID); if (children.first == children.second) { - EntityWrapper friendlyAmmoHud = SpawnerSystem::Spawn(friendlyAmmoHudSpawner, friendlyAmmoHudSpawner); - if (friendlyAmmoHud.Valid()) { - EntityWrapper textEntity = friendlyAmmoHud.FirstChildByName("MagazineAmmo"); - if (textEntity.Valid()) { - if (textEntity.HasComponent("Text")) { - (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + if (friendlyAmmoHudSpawner.HasComponent("Spawner")) { + EntityWrapper friendlyAmmoHud = SpawnerSystem::Spawn(friendlyAmmoHudSpawner, friendlyAmmoHudSpawner); + if (friendlyAmmoHud.Valid()) { + EntityWrapper textEntity = friendlyAmmoHud.FirstChildByName("MagazineAmmo"); + if (textEntity.Valid()) { + if (textEntity.HasComponent("Text")) { + (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + } + } + + EntityWrapper ammoTextEntity = friendlyAmmoHud.FirstChildByName("Ammo"); + if (ammoTextEntity.Valid()) { + if (ammoTextEntity.HasComponent("Text")) { + (std::string&)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + } } } } @@ -401,8 +429,14 @@ void SidearmWeaponBehaviour::CheckAmmo(ComponentWrapper cWeapon, WeaponInfo& wi) (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); } } + + EntityWrapper ammoTextEntity = friendlyAmmoHudSpawner.FirstChildByName("Ammo"); + if (ammoTextEntity.Valid()) { + if (ammoTextEntity.HasComponent("Text")) { + (std::string&)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + } + } } - } } } From 8e266984f4ce9560cf6912e14216fc978d083ff5 Mon Sep 17 00:00:00 2001 From: Tleety Date: Sat, 12 Mar 2016 14:37:26 +0100 Subject: [PATCH 09/61] Player HUD should now be ok, color of health still shit tho --- assets | 2 +- .../Schema/Entities/PlayerAssaultBlue.xml | 890 +++++++++--------- .../Schema/Entities/PlayerDefenderBlue.xml | 839 +++++++++-------- resources/Schema/Entities/PlayerHUD.xml | 183 ++-- .../Schema/Entities/StartMenu_simple.xml | 440 +++++++++ resources/Shaders/Sprite.frag.glsl | 4 +- src/Game/Systems/AbilityCooldownHUDSystem.cpp | 13 +- 7 files changed, 1448 insertions(+), 923 deletions(-) create mode 100644 resources/Schema/Entities/StartMenu_simple.xml diff --git a/assets b/assets index 69ddae17..40f6ae62 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 69ddae179ac02d5c1582a8c6834451b3f5e4bbaf +Subproject commit 40f6ae6201adb94e99ee084b081fc8467f80953a diff --git a/resources/Schema/Entities/PlayerAssaultBlue.xml b/resources/Schema/Entities/PlayerAssaultBlue.xml index 4ca636da..33f1df73 100644 --- a/resources/Schema/Entities/PlayerAssaultBlue.xml +++ b/resources/Schema/Entities/PlayerAssaultBlue.xml @@ -57,449 +57,468 @@ - + - - - + + Schema/Entities/PlayerHUD.xml + + - - - - false - Models/Core/UnitQuad.mesh - - Textures/Weapons/Crosshair/SmallThickHoleDot.png - - - - - - - - - - - - Schema/Entities/HitMarker.xml - - - - - - + - - + - + - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 2 - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 3 - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 1 - - - - 4 - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 1 - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 1 - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - - Models/Widgets/Arrows/Arrow5.mesh - - - - - - - - - - - - - - - - - - - - - 1 - - - - 100/100 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - 1 - - - - - Models/Core/UnitQuad.mesh - - Textures/HealthHUD3.png - - - - - - - - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Boosts/Assault-01.png - - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Boosts/Defender-01.png - - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Boosts/Sniper-01.png - - - - - - - - - - - - - - - - - - false Models/Core/UnitQuad.mesh - Textures\Icons\Abilities\Superman-01.png - + Textures/Weapons/Crosshair/SmallThickHoleDot.png - - - + + + + + + + + + + Schema/Entities/HitMarker.xml + + + + + + + + + + - + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + 1 + + + + 4 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + 1 + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + + + + + + + + + - 0.0 + Fonts/DroidSans.ttf,64 - - false + + + + + + + + + + + + + Fonts/DroidSans.ttf,64 + + + - - - + + + + + + + + + + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + Models/Widgets/Arrows/ArrowBlue.mesh + + + + + + + + + + + + + + + + + + + + + 1 + + + + 100/100 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + 1 + + + + + Models/Core/UnitQuad.mesh + + Textures/HealthHUD3.png + + true + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Assault-01.png + + true + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Defender-01.png + + true + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Sniper-01.png + + false + true + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Abilities/Long/Superman-01.png + + true + + + + + @@ -570,6 +589,7 @@ Models/Characters/Assault/AssaultBlue.mesh + false @@ -583,8 +603,8 @@ Schema/Entities/WeaponAssaultBlueWorld.xml - - + + AssaultWeapon @@ -604,8 +624,8 @@ Schema/Entities/SidearmWeaponBlueWorld.xml - - + + SidearmWeapon @@ -672,7 +692,7 @@ CrouchStrafeLeftF - + true @@ -683,7 +703,7 @@ CrouchStrafeRightF - + true @@ -696,7 +716,7 @@ CrouchWalkF - + true @@ -709,7 +729,7 @@ CrouchF - + true @@ -752,7 +772,7 @@ WalkF - + true @@ -763,7 +783,7 @@ RunF - + 2 true @@ -787,7 +807,7 @@ StrafeLeftF - + 2 true @@ -799,7 +819,7 @@ StrafeRightF - + 2 true @@ -815,7 +835,7 @@ IdleF - + true @@ -1012,7 +1032,7 @@ IdleAssaultRifleU - + true true @@ -1024,7 +1044,7 @@ IdleAssaultRifleU - + true true diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index 5fcc6c64..30b0a3a1 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -30,6 +30,7 @@ + @@ -90,448 +91,475 @@ - + - - - + + Schema/Entities/PlayerHUD.xml + + - - - - false - Models/Core/UnitQuad.mesh - - Textures/Weapons/Crosshair/SmallThickHoleDot.png - - - - - - - - - - - - Schema/Entities/HitMarker.xml - - - - - - + - - + - + false Models/Core/UnitQuad.mesh - Textures/Core/UnitHexagon.png - + Textures/Weapons/Crosshair/SmallThickHoleDot.png - + + - - - - - - - - 2 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - + - + - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 3 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 1 - - - - 4 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 1 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 1 - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - + + Schema/Entities/HitMarker.xml + - + - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - - Models/Widgets/Arrows/Arrow5.mesh - - - - - - - - - - - - - - - - - - - - 1 - - - - 150/150 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - 1 - - - - - Models/Core/UnitQuad.mesh - - Textures/HealthHUD3.png - - - - - - - - - - - - - + + - + - - - false Models/Core/UnitQuad.mesh - Textures/Icons/Boosts/Assault-01.png - + Textures/Core/UnitHexagon.png + + true - - - + + + + + + + + 1 + + + + 4 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + 1 + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + + + + + + + + + + + + + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + Fonts/DroidSans.ttf,64 + + + + + + - + - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Boosts/Defender-01.png - - + + + Fonts/DroidSans.ttf,64 + + + + - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Boosts/Sniper-01.png - - - - - - + - + - - - inf - - - - false - Models/Core/UnitQuad.mesh - - Textures\Icons\Abilities\SheildDots-01.png - - + + + + + + + + Models/Widgets/Arrows/ArrowBlue.mesh + - - - + + + + + + + + + + + + + + + 1 + + + + 150/150 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + 1 + + + + + Models/Core/UnitQuad.mesh + + Textures/HealthHUD3.png + + true + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Assault-01.png + + true + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Defender-01.png + + true + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Sniper-01.png + + false + true + + + + + + + + + + + + + + + + 1 + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Abilities/Long/SheildDots-01.png + + true + + + + + + + + + + + @@ -564,6 +592,7 @@ + 1.7999999523162842 Models/Characters/Defender/DefenderBlue.mesh @@ -578,8 +607,8 @@ Schema/Entities/WeaponDefenderBlueWorld.xml - - + + DefenderWeapon @@ -599,8 +628,8 @@ Schema/Entities/SidearmWeaponBlueWorld.xml - - + + SidearmWeapon @@ -667,7 +696,7 @@ CrouchStrafeLeftF - + true @@ -678,7 +707,7 @@ CrouchStrafeRightF - + true @@ -691,7 +720,7 @@ CrouchWalkF - + true @@ -704,7 +733,7 @@ CrouchF - + true @@ -747,7 +776,7 @@ WalkF - + true @@ -758,7 +787,7 @@ RunF - + 2 true @@ -782,7 +811,7 @@ StrafeLeftF - + 2 true @@ -794,7 +823,7 @@ StrafeRightF - + 2 true @@ -810,7 +839,7 @@ IdleF - + true @@ -877,7 +906,7 @@ IdleAssaultRifleU - + true true @@ -889,7 +918,7 @@ IdleAssaultRifleU - + true true @@ -969,7 +998,7 @@ ShieldFrontU - + true diff --git a/resources/Schema/Entities/PlayerHUD.xml b/resources/Schema/Entities/PlayerHUD.xml index cf07bc56..5891362d 100644 --- a/resources/Schema/Entities/PlayerHUD.xml +++ b/resources/Schema/Entities/PlayerHUD.xml @@ -11,9 +11,10 @@ - Textures/Weapons/Crosshair/SmallThickHoleDot.png - false + Models/Core/UnitQuad.mesh + + Textures/Weapons/Crosshair/SmallThickHoleDot.png @@ -42,10 +43,52 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + true + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true @@ -61,9 +104,11 @@ 3 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true @@ -78,10 +123,12 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + true @@ -98,9 +145,11 @@ 4 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true @@ -115,46 +164,12 @@ - Textures/Core/UnitHexagon.png - false - - - - - - - - - - - - - - 2 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh - false + Textures/Core/UnitHexagon.png + true @@ -170,9 +185,11 @@ 1 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true @@ -187,10 +204,12 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + true @@ -205,9 +224,11 @@ - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true @@ -284,10 +305,11 @@ - Models/Widgets/Arrows/Arrow5.mesh + Models/Widgets/Arrows/ArrowBlue.mesh + @@ -310,7 +332,7 @@ 100/100 Fonts/DroidSans.ttf,64 - + @@ -329,9 +351,11 @@ - Textures/HealthHUD3.png + Models/Core/UnitQuad.mesh + Textures/HealthHUD3.png + true @@ -350,16 +374,18 @@ - + - Textures/Icons/Boosts/Assault-01.png - false - + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Assault-01.png + + true - + @@ -369,16 +395,18 @@ - + - Textures/Icons/Boosts/Defender-01.png - false - + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Defender-01.png + + true - + @@ -388,13 +416,16 @@ - + - Textures/Icons/Boosts/Sniper-01.png - false - + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Sniper-01.png + + false + true @@ -413,15 +444,17 @@ - Textures/Icons/Abilities/Superman-01.png - false - + Models/Core/UnitQuad.mesh + + Textures/Test/aM4ME4GR.png + + true - - + + diff --git a/resources/Schema/Entities/StartMenu_simple.xml b/resources/Schema/Entities/StartMenu_simple.xml new file mode 100644 index 00000000..944c51b5 --- /dev/null +++ b/resources/Schema/Entities/StartMenu_simple.xml @@ -0,0 +1,440 @@ + + + + + + + + + + + + + + + + + Schema/Entities/NewMap2version5NEW.xml + + + + + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + 0.20000000298023224 + + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/MainMenu.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + Play + 1 + + + + + + + + + + + Play + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + + + + Credits + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + + + + Option + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + + + + Quit + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/ServerList.xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/Shaders/Sprite.frag.glsl b/resources/Shaders/Sprite.frag.glsl index 5b6567eb..6a7169e1 100644 --- a/resources/Shaders/Sprite.frag.glsl +++ b/resources/Shaders/Sprite.frag.glsl @@ -29,9 +29,9 @@ void main() vec4 color_result = Color * diffuseTexel; float pos = ((P * vec4(Input.Position, 1)).y + 1.0)/2.0; - float fillResult = floor(pos*FillPercentage); + float fillResult = clamp(floor(pos/FillPercentage), 0, 1); - color_result = FillColor*diffuseTexel.a*fillResult + color_result*(1-fillResult); + color_result = FillColor*diffuseTexel.a*(1 - fillResult) + color_result*fillResult; sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1)); diff --git a/src/Game/Systems/AbilityCooldownHUDSystem.cpp b/src/Game/Systems/AbilityCooldownHUDSystem.cpp index 07461f95..23e9a6b7 100644 --- a/src/Game/Systems/AbilityCooldownHUDSystem.cpp +++ b/src/Game/Systems/AbilityCooldownHUDSystem.cpp @@ -23,26 +23,29 @@ void AbilityCooldownHUDSystem::Update(double dt) if (!abilityEntity.Valid()) { //If we dont have a shield ability, we return, since we cannot do anything. + if (entity.HasComponent("Sprite")) { + (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures/Test/aM4ME4GR.png"; + } return; } else { //If we have a shield ability, we set the right icon abilityName = "ShieldAbility"; if (entity.HasComponent("Sprite")) { - (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures\\Icons\\Abilities\\SheildDots-01.png"; + (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures/Icons/Abilities/Long/SheildDots-01.png"; } } } else { //If we do have a sprint ability, we change the icon abilityName = "SprintAbility"; if (entity.HasComponent("Sprite")) { - (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures\\Icons\\Abilities\\Dash-01.png"; + (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures/Icons/Abilities/Long/Dash-01.png"; } } } else { //If we have a dash ability, we set the icon to the correct one. abilityName = "DashAbility"; if (entity.HasComponent("Sprite")) { - (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures\\Icons\\Abilities\\Superman-01.png"; + (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures/Icons/Abilities/Long/Superman-01.png"; } } @@ -63,12 +66,12 @@ void AbilityCooldownHUDSystem::Update(double dt) } if (abilityName == "ShieldAbility") { - maxAbilityCD = 0.0; + maxAbilityCD = 1.0; currentAbilityCD = 1 - (bool)abilityEntity[abilityName]["Active"]; } if (abilityName == "SprintAbility") { - maxAbilityCD = 0.0; + maxAbilityCD = 1.0; currentAbilityCD = 1 - (bool)abilityEntity[abilityName]["Active"]; } From 4334ea067e0fc25387ba57338731b951af198868 Mon Sep 17 00:00:00 2001 From: Tleety Date: Sat, 12 Mar 2016 14:44:03 +0100 Subject: [PATCH 10/61] System skeleton --- include/Game/Systems/WinScreenSystem.h | 17 +++++++++++++++++ src/Game/Systems/WinScreenSystem.cpp | 12 ++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 include/Game/Systems/WinScreenSystem.h create mode 100644 src/Game/Systems/WinScreenSystem.cpp diff --git a/include/Game/Systems/WinScreenSystem.h b/include/Game/Systems/WinScreenSystem.h new file mode 100644 index 00000000..2563b4b5 --- /dev/null +++ b/include/Game/Systems/WinScreenSystem.h @@ -0,0 +1,17 @@ +#ifndef WinScreenSystem_h__ +#define WinScreenSystem_h__ + +#include "Core/System.h" +#include "Input/EInputCommand.h" + +class WinScreenSystem : public ImpureSystem +{ +public: + WinScreenSystem(SystemParams params); + + virtual void Update(double dt) override; + +private: +}; + +#endif \ No newline at end of file diff --git a/src/Game/Systems/WinScreenSystem.cpp b/src/Game/Systems/WinScreenSystem.cpp new file mode 100644 index 00000000..97cc0747 --- /dev/null +++ b/src/Game/Systems/WinScreenSystem.cpp @@ -0,0 +1,12 @@ +#include "Systems/WinScreenSystem.h" +#include "Rendering/ESetCamera.h" +#include "Core/ELockMouse.h" + +WinScreenSystem::WinScreenSystem(SystemParams params) + : System(params) +{ +} + +void WinScreenSystem::Update(double dt) +{ +} \ No newline at end of file From 8c2a665ccb99b17b5daa18ab059daffb9fc123ad Mon Sep 17 00:00:00 2001 From: Tleety Date: Sat, 12 Mar 2016 15:45:07 +0100 Subject: [PATCH 11/61] Some Entities for endscreen and some basic logic in the EndScreenSystem --- include/Game/Systems/EndScreenSystem.h | 21 +++++ include/Game/Systems/WinScreenSystem.h | 17 ---- resources/Schema/Components.xsd | 1 + resources/Schema/Components/EndScreen.xml | 3 + resources/Schema/Components/EndScreen.xsd | 10 +++ resources/Schema/Entities/EndScreen.xml | 88 +++++++++++++++++++ resources/Schema/Entities/ScoreBoard_Main.xml | 15 +++- resources/Schema/Types/Entity.xsd | 1 + src/Game/Systems/EndScreenSystem.cpp | 18 ++++ src/Game/Systems/WinScreenSystem.cpp | 12 --- 10 files changed, 154 insertions(+), 32 deletions(-) create mode 100644 include/Game/Systems/EndScreenSystem.h delete mode 100644 include/Game/Systems/WinScreenSystem.h create mode 100644 resources/Schema/Components/EndScreen.xml create mode 100644 resources/Schema/Components/EndScreen.xsd create mode 100644 resources/Schema/Entities/EndScreen.xml create mode 100644 src/Game/Systems/EndScreenSystem.cpp delete mode 100644 src/Game/Systems/WinScreenSystem.cpp diff --git a/include/Game/Systems/EndScreenSystem.h b/include/Game/Systems/EndScreenSystem.h new file mode 100644 index 00000000..ec4702ca --- /dev/null +++ b/include/Game/Systems/EndScreenSystem.h @@ -0,0 +1,21 @@ +#ifndef EndScreenSystem_h__ +#define EndScreenSystem_h__ + +#include "Core/System.h" +#include "Input/EInputCommand.h" +#include "Rendering/ESetCamera.h" +#include "Core/EWin.h" + +class EndScreenSystem : public ImpureSystem +{ +public: + EndScreenSystem(SystemParams params); + + virtual void Update(double dt) override; + +private: + EventRelay m_EWin; + bool OnWin(const Events::Win&); +}; + +#endif \ No newline at end of file diff --git a/include/Game/Systems/WinScreenSystem.h b/include/Game/Systems/WinScreenSystem.h deleted file mode 100644 index 2563b4b5..00000000 --- a/include/Game/Systems/WinScreenSystem.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef WinScreenSystem_h__ -#define WinScreenSystem_h__ - -#include "Core/System.h" -#include "Input/EInputCommand.h" - -class WinScreenSystem : public ImpureSystem -{ -public: - WinScreenSystem(SystemParams params); - - virtual void Update(double dt) override; - -private: -}; - -#endif \ No newline at end of file diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index bc6da932..f124272f 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -68,4 +68,5 @@ + \ No newline at end of file diff --git a/resources/Schema/Components/EndScreen.xml b/resources/Schema/Components/EndScreen.xml new file mode 100644 index 00000000..8a556256 --- /dev/null +++ b/resources/Schema/Components/EndScreen.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/resources/Schema/Components/EndScreen.xsd b/resources/Schema/Components/EndScreen.xsd new file mode 100644 index 00000000..9056f210 --- /dev/null +++ b/resources/Schema/Components/EndScreen.xsd @@ -0,0 +1,10 @@ + + + + + + + Put this on the camera that will show the final screen. + + + \ No newline at end of file diff --git a/resources/Schema/Entities/EndScreen.xml b/resources/Schema/Entities/EndScreen.xml new file mode 100644 index 00000000..11ddc201 --- /dev/null +++ b/resources/Schema/Entities/EndScreen.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + false + + + + + + + + + + + Blue team win! + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + Red team win! + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/ScoreBoard_Main.xml b/resources/Schema/Entities/ScoreBoard_Main.xml index ccc1df68..48d0782f 100644 --- a/resources/Schema/Entities/ScoreBoard_Main.xml +++ b/resources/Schema/Entities/ScoreBoard_Main.xml @@ -20,10 +20,10 @@ + - @@ -44,7 +44,7 @@ - + Schema/Entities/ScoreBoard_Red.xml @@ -55,7 +55,7 @@ - + Schema/Entities/ScoreBoard_Blue.xml @@ -63,6 +63,15 @@ + + + + Schema/Entities/EndScreen.xml + + + + + diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd index c0ac15aa..2d24590c 100644 --- a/resources/Schema/Types/Entity.xsd +++ b/resources/Schema/Types/Entity.xsd @@ -71,6 +71,7 @@ + diff --git a/src/Game/Systems/EndScreenSystem.cpp b/src/Game/Systems/EndScreenSystem.cpp new file mode 100644 index 00000000..e750cca3 --- /dev/null +++ b/src/Game/Systems/EndScreenSystem.cpp @@ -0,0 +1,18 @@ +#include "Systems/EndScreenSystem.h" + + +EndScreenSystem::EndScreenSystem(SystemParams params) + : System(params) +{ + EVENT_SUBSCRIBE_MEMBER(m_EWin, &EndScreenSystem::OnWin); +} + +void EndScreenSystem::Update(double dt) +{ + +} + +bool EndScreenSystem::OnWin(const Events::Win&) +{ + +} diff --git a/src/Game/Systems/WinScreenSystem.cpp b/src/Game/Systems/WinScreenSystem.cpp deleted file mode 100644 index 97cc0747..00000000 --- a/src/Game/Systems/WinScreenSystem.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "Systems/WinScreenSystem.h" -#include "Rendering/ESetCamera.h" -#include "Core/ELockMouse.h" - -WinScreenSystem::WinScreenSystem(SystemParams params) - : System(params) -{ -} - -void WinScreenSystem::Update(double dt) -{ -} \ No newline at end of file From 0b26f23188e38caae27cf69fcdffd1e6aab49394 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sat, 12 Mar 2016 15:47:19 +0100 Subject: [PATCH 12/61] 3rd person animations idle bug fixed --- .../Engine/Input/FirstPersonInputController.h | 19 ++-- include/Engine/Rendering/BlendTree.h | 3 +- .../Schema/Entities/PlayerAssaultBlue.xml | 94 +++++-------------- .../Schema/Entities/PlayerDefenderBlue.xml | 85 ++++------------- src/Engine/Rendering/AnimationSystem.cpp | 12 ++- src/Game/Systems/PlayerMovementSystem.cpp | 2 + .../Systems/Weapon/AssaultWeaponBehaviour.cpp | 2 +- .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 3 +- 8 files changed, 67 insertions(+), 153 deletions(-) diff --git a/include/Engine/Input/FirstPersonInputController.h b/include/Engine/Input/FirstPersonInputController.h index 30d1f945..68c8a430 100644 --- a/include/Engine/Input/FirstPersonInputController.h +++ b/include/Engine/Input/FirstPersonInputController.h @@ -163,6 +163,7 @@ bool FirstPersonInputController::OnCommand(const Events::InputComm aeb.Duration = 0.1; aeb.NodeName = "Run"; aeb.RootNode = firstPersonModel; + aeb.SingleLevelBlend = true; aeb.Start = true; m_EventBroker->Publish(aeb); } @@ -172,6 +173,7 @@ bool FirstPersonInputController::OnCommand(const Events::InputComm aeb.Duration = 0.1; aeb.NodeName = "Run"; aeb.RootNode = firstPersonModel; + aeb.SingleLevelBlend = true; aeb.Start = true; aeb.Reverse = true; m_EventBroker->Publish(aeb); @@ -211,10 +213,10 @@ bool FirstPersonInputController::OnCommand(const Events::InputComm } } - //Animation - if (glm::length2(m_Movement) < 0.25f) { - //Blend to Idle - if (m_PlayerEntity.Valid()) { + if (m_PlayerEntity.Valid()) { + glm::vec2 movementXZ = glm::vec2(m_Movement.x, m_Movement.z); + if (glm::length(movementXZ) < 0.1f) { + //Blend to Idle EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel"); if (playerModel.Valid()) { Events::AutoAnimationBlend aeb; @@ -233,10 +235,8 @@ bool FirstPersonInputController::OnCommand(const Events::InputComm aeb.Start = true; m_EventBroker->Publish(aeb); } - } - } else { - //Blend to movement - if (m_PlayerEntity.Valid()) { + } else { + //Blend to movement EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel"); if (playerModel.Valid()) { Events::AutoAnimationBlend aeb; @@ -248,8 +248,7 @@ bool FirstPersonInputController::OnCommand(const Events::InputComm } } - - if (glm::length2(m_Movement) > 0) { + if (glm::length(m_Movement) > 0) { m_Movement = glm::normalize(m_Movement); //Animation diff --git a/include/Engine/Rendering/BlendTree.h b/include/Engine/Rendering/BlendTree.h index 502a1cc9..46ea7f0c 100644 --- a/include/Engine/Rendering/BlendTree.h +++ b/include/Engine/Rendering/BlendTree.h @@ -49,9 +49,7 @@ public: next = next->Child[0]; } } - return next; - } }; @@ -82,6 +80,7 @@ public: BlendTree::Node* FirstCommonParent(Node* node1, Node* node2); EntityWrapper GetSubTreeRoot(std::string nodeName); + std::vector GetSubTreeRoots(std::string nodeName); std::vector GetSingleLevelRoots(std::string name); std::vector GetEntitesByName(std::string name); diff --git a/resources/Schema/Entities/PlayerAssaultBlue.xml b/resources/Schema/Entities/PlayerAssaultBlue.xml index 4ca636da..4797ec09 100644 --- a/resources/Schema/Entities/PlayerAssaultBlue.xml +++ b/resources/Schema/Entities/PlayerAssaultBlue.xml @@ -583,8 +583,8 @@ Schema/Entities/WeaponAssaultBlueWorld.xml - - + + AssaultWeapon @@ -604,8 +604,8 @@ Schema/Entities/SidearmWeaponBlueWorld.xml - - + + SidearmWeapon @@ -959,7 +959,7 @@ - MovementBlend + IdleAssault ActionBlend @@ -998,41 +998,17 @@ - + - - Idle - Run - 0 - + + IdleAssaultRifleU + + true + true + - - - - - IdleAssaultRifleU - - true - true - - - - - - - - - IdleAssaultRifleU - - true - true - - - - - - + @@ -1063,44 +1039,12 @@ - MovementBlend2 + IdleSidearm ActionBlend - - - - Idle - Run - 0 - - - - - - - - IdleSecWepU - true - - - - - - - - - IdleSecWepU - true - - - - - - - @@ -1133,6 +1077,16 @@ + + + + IdleSecWepU + true + + + + + diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index 5fcc6c64..84324379 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -857,48 +857,12 @@ - MovementBlend2 + IdleDefender FinalBlend - - - - Idle - Run - 0 - - - - - - - - IdleAssaultRifleU - - true - true - - - - - - - - - IdleAssaultRifleU - - true - true - - - - - - - @@ -980,6 +944,18 @@ + + + + IdleAssaultRifleU + + true + true + + + + + @@ -1007,7 +983,7 @@ - MovementBlend2 + IdleSidearm ActionBlend @@ -1044,36 +1020,15 @@ - + - - Idle - Run - + + IdleSecWepU + true + - - - - - IdleSecWepU - true - - - - - - - - - IdleSecWepU - true - - - - - - + diff --git a/src/Engine/Rendering/AnimationSystem.cpp b/src/Engine/Rendering/AnimationSystem.cpp index e30c2e9f..3895dc4a 100644 --- a/src/Engine/Rendering/AnimationSystem.cpp +++ b/src/Engine/Rendering/AnimationSystem.cpp @@ -127,8 +127,8 @@ void AnimationSystem::UpdateAnimations(double dt) void AnimationSystem::UpdateWeights(double dt) { for (auto it = m_AutoBlendQueues.begin(); it != m_AutoBlendQueues.end(); ) { - /* LOG_INFO("%s", it->first.Name().c_str()); - it->second.PrintQueue();*/ + //LOG_INFO("%s", it->first.Name().c_str()); + //it->second.PrintQueue(); if(it->second.HasActiveBlendJob()) { AutoBlendQueue::AutoBlendJob& blendJob = it->second.GetActiveBlendJob(); @@ -158,12 +158,13 @@ void AnimationSystem::UpdateWeights(double dt) bool AnimationSystem::OnAutoAnimationBlend(Events::AutoAnimationBlend& e) { - if (!e.RootNode.Valid()) { + LOG_ERROR("%s, RootNode invalid %s", e.NodeName, e.RootNode.Name().c_str()); return false; } if (!e.RootNode.HasComponent("Model")) { + LOG_ERROR("%s, RootNode has no model %s", e.NodeName, e.RootNode.Name().c_str()); return false; } @@ -171,11 +172,13 @@ bool AnimationSystem::OnAutoAnimationBlend(Events::AutoAnimationBlend& e) try { model = ResourceManager::Load<::Model, true>((std::string)e.RootNode["Model"]["Resource"]); } catch (const std::exception&) { + LOG_ERROR("%s, RootNode model not finished loading %s", e.NodeName, e.RootNode.Name().c_str()); return false; } Skeleton* skeleton = model->m_RawModel->m_Skeleton; if (skeleton == nullptr) { + LOG_ERROR("%s, RootNode skeleton invalid %s", e.NodeName, e.RootNode.Name().c_str()); return false; } @@ -183,6 +186,7 @@ bool AnimationSystem::OnAutoAnimationBlend(Events::AutoAnimationBlend& e) if (skeleton->BlendTrees.find(e.RootNode) != skeleton->BlendTrees.end()) { blendTree = skeleton->BlendTrees.at(e.RootNode); } else { + LOG_ERROR("%s, No blendtree was found invalid %s", e.NodeName, e.RootNode.Name().c_str()); return false; } @@ -193,6 +197,7 @@ bool AnimationSystem::OnAutoAnimationBlend(Events::AutoAnimationBlend& e) subTreeRoot = blendTree->GetSubTreeRoot(e.NodeName); if (!subTreeRoot.Valid()) { + LOG_ERROR("%s, subTreeRoot invalid", e.NodeName); return false; } @@ -237,6 +242,7 @@ bool AnimationSystem::OnAutoAnimationBlend(Events::AutoAnimationBlend& e) subTreeRoot = entity; if (!subTreeRoot.Valid()) { + LOG_ERROR("%s, subTreeRoot invalid", e.NodeName); return false; } diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index b86d4140..51d7bcef 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -24,6 +24,8 @@ void PlayerMovementSystem::Update(double dt) if (LocalPlayer.Valid()){ updateVelocity(LocalPlayer, dt); } + + m_SprintEffectTimer += dt; if (m_SprintEffectTimer < 0.016f) { return; diff --git a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp index cf2aa9c5..0662cbaa 100644 --- a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp @@ -74,7 +74,7 @@ void AssaultWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& float animationWeight = glm::min(speed, movementSpeed) / movementSpeed; EntityWrapper rootNode = wi.FirstPersonEntity; if (rootNode.Valid()) { - EntityWrapper blend = rootNode.FirstChildByName("MovementBlend"); + EntityWrapper blend = rootNode.FirstChildByName("MovementBlendAssault"); if (blend.Valid()) { (double&)blend["Blend"]["Weight"] = animationWeight; } diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index 9c12bb2c..f87f1f81 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -14,7 +14,6 @@ void SidearmWeaponBehaviour::UpdateComponent(EntityWrapper& entity, ComponentWra void SidearmWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) { - CheckAmmo(cWeapon, wi); // Start reloading automatically if at 0 mag ammo @@ -64,7 +63,7 @@ void SidearmWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& float animationWeight = glm::min(speed, movementSpeed) / movementSpeed; EntityWrapper rootNode = wi.FirstPersonEntity; if (rootNode.Valid()) { - EntityWrapper blend = rootNode.FirstChildByName("MovementBlend"); + EntityWrapper blend = rootNode.FirstChildByName("MovementBlendSidearm"); if (blend.Valid()) { (double&)blend["Blend"]["Weight"] = animationWeight; } From 4ba011a098c3adbd82821c67ce518d83c118dc57 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sat, 12 Mar 2016 17:01:46 +0100 Subject: [PATCH 13/61] Ammosharing over network test WIP --- include/Game/Systems/BoostSystem.h | 3 + .../Systems/Weapon/SidearmWeaponBehaviour.h | 2 +- include/Game/Systems/Weapon/WeaponBehaviour.h | 2 + .../Schema/Entities/PlayerAssaultBlue.xml | 865 +++++++++--------- .../Schema/Entities/PlayerDefenderBlue.xml | 803 ++++++++-------- src/Game/Systems/BoostSystem.cpp | 94 +- .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 5 +- 7 files changed, 941 insertions(+), 833 deletions(-) diff --git a/include/Game/Systems/BoostSystem.h b/include/Game/Systems/BoostSystem.h index f02e9472..925ef438 100644 --- a/include/Game/Systems/BoostSystem.h +++ b/include/Game/Systems/BoostSystem.h @@ -6,6 +6,7 @@ #include "Core/EntityFile.h" #include "Core/EPlayerDamage.h" #include "Common.h" +#include "SpawnerSystem.h" class BoostSystem : public System { @@ -17,5 +18,7 @@ private: bool OnPlayerDamage(Events::PlayerDamage& e); std::string DetermineClass(EntityWrapper player); + + void giveAmmo(EntityWrapper giver, EntityWrapper receiver); }; #endif \ No newline at end of file diff --git a/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h b/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h index 7aa20025..3123b460 100644 --- a/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h @@ -37,7 +37,7 @@ private: bool playerInFirstPerson(EntityWrapper player); bool dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi); - void giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, EntityWrapper receiver); + // void giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, EntityWrapper receiver); void CheckAmmo(ComponentWrapper cWeapon, WeaponInfo& wi); diff --git a/include/Game/Systems/Weapon/WeaponBehaviour.h b/include/Game/Systems/Weapon/WeaponBehaviour.h index cd067f36..6d13e741 100644 --- a/include/Game/Systems/Weapon/WeaponBehaviour.h +++ b/include/Game/Systems/Weapon/WeaponBehaviour.h @@ -305,6 +305,8 @@ private: wi.ThirdPersonEntity = thirdPersonWeapon; wi.ThirdPersonPlayerModel = thirdPersonWeapon.FirstParentWithComponent("Model"); + player["Player"]["CurrentWeapon"] = cWeapon.Info.Name; + OnEquip(cWeapon, wi); } diff --git a/resources/Schema/Entities/PlayerAssaultBlue.xml b/resources/Schema/Entities/PlayerAssaultBlue.xml index 4797ec09..c73a4c46 100644 --- a/resources/Schema/Entities/PlayerAssaultBlue.xml +++ b/resources/Schema/Entities/PlayerAssaultBlue.xml @@ -59,447 +59,466 @@ - - - + + Schema/Entities/PlayerHUD.xml + + - - - - false - Models/Core/UnitQuad.mesh - - Textures/Weapons/Crosshair/SmallThickHoleDot.png - - - - - - - - - - - - Schema/Entities/HitMarker.xml - - - - - - + - - + - + - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 2 - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 3 - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 1 - - - - 4 - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 1 - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 1 - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - - Models/Widgets/Arrows/Arrow5.mesh - - - - - - - - - - - - - - - - - - - - - 1 - - - - 100/100 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - 1 - - - - - Models/Core/UnitQuad.mesh - - Textures/HealthHUD3.png - - - - - - - - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Boosts/Assault-01.png - - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Boosts/Defender-01.png - - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Boosts/Sniper-01.png - - - - - - - - - - - - - - - - - - false Models/Core/UnitQuad.mesh - Textures\Icons\Abilities\Superman-01.png - + Textures/Weapons/Crosshair/SmallThickHoleDot.png - - - + + + + + + + + + + Schema/Entities/HitMarker.xml + + + + + + + + + + - + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + 1 + + + + 4 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + 1 + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + + + + + + + + + - 0.0 + Fonts/DroidSans.ttf,64 - - false + + + + + + + + + + + + + Fonts/DroidSans.ttf,64 + + + - - - + + + + + + + + + + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + Models/Widgets/Arrows/ArrowBlue.mesh + + + + + + + + + + + + + + + + + + + + + 1 + + + + 100/100 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + 1 + + + + + Models/Core/UnitQuad.mesh + + Textures/HealthHUD3.png + + true + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Assault-01.png + + true + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Defender-01.png + + true + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Sniper-01.png + + false + true + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Abilities/Long/Superman-01.png + + true + + + + + @@ -904,10 +923,10 @@ - + - DashRightF + DashLeftF 1.7999999523162842 false @@ -916,10 +935,10 @@ - + - DashLeftF + DashRightF 1.7999999523162842 false diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index 84324379..c75f50fd 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -92,446 +92,473 @@ - - - + + Schema/Entities/PlayerHUD.xml + + - - - - false - Models/Core/UnitQuad.mesh - - Textures/Weapons/Crosshair/SmallThickHoleDot.png - - - - - - - - - - - - Schema/Entities/HitMarker.xml - - - - - - + - - + - + false Models/Core/UnitQuad.mesh - Textures/Core/UnitHexagon.png - + Textures/Weapons/Crosshair/SmallThickHoleDot.png - + + - - - - - - - - 2 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - + - + - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 3 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 1 - - - - 4 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 1 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 1 - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - + + Schema/Entities/HitMarker.xml + - + - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - - Models/Widgets/Arrows/Arrow5.mesh - - - - - - - - - - - - - - - - - - - - 1 - - - - 150/150 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - 1 - - - - - Models/Core/UnitQuad.mesh - - Textures/HealthHUD3.png - - - - - - - - - - - - - + + - + - - - false Models/Core/UnitQuad.mesh - Textures/Icons/Boosts/Assault-01.png - + Textures/Core/UnitHexagon.png + + true - - - + + + + + + + + 1 + + + + 4 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + + + + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + + + + + + + + 1 + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + true + + + + + + + + + + + + + + + + + + + + + + + + + + + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + Fonts/DroidSans.ttf,64 + + + + + + - + - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Boosts/Defender-01.png - - + + + Fonts/DroidSans.ttf,64 + + + + - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Boosts/Sniper-01.png - - - - - - + - + - - - inf - - - - false - Models/Core/UnitQuad.mesh - - Textures\Icons\Abilities\SheildDots-01.png - - + + + + + + + + Models/Widgets/Arrows/ArrowBlue.mesh + - - - + + + + + + + + + + + + + + + 1 + + + + 150/150 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + 1 + + + + + Models/Core/UnitQuad.mesh + + Textures/HealthHUD3.png + + true + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Assault-01.png + + true + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Defender-01.png + + true + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Sniper-01.png + + false + true + + + + + + + + + + + + + + + + 1 + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Abilities/Long/SheildDots-01.png + + true + + + + + + + + + + + diff --git a/src/Game/Systems/BoostSystem.cpp b/src/Game/Systems/BoostSystem.cpp index c3dc1f2b..2ebfff73 100644 --- a/src/Game/Systems/BoostSystem.cpp +++ b/src/Game/Systems/BoostSystem.cpp @@ -35,19 +35,25 @@ bool BoostSystem::OnPlayerDamage(Events::PlayerDamage& e) return false; } - //get the XML file, example: "Schema/Entities/BoostclassName.xml" - std::string classXML = "Schema/Entities/" + className + ".xml"; - //check if player already has a child with the component, if so delete that child - auto playerBoostAssaultEntity = e.Victim.FirstChildByName(className); - if (playerBoostAssaultEntity.Valid()) { - m_World->DeleteEntity(playerBoostAssaultEntity.ID); + LOG_INFO("intflictor: %s, vicitm: %s", e.Inflictor.Name().c_str(), e.Victim.Name().c_str()); + if(className == "SidearmWeapon") { // give ammo + giveAmmo(e.Inflictor, e.Victim); + } else { //give boost + //get the XML file, example: "Schema/Entities/BoostclassName.xml" + std::string classXML = "Schema/Entities/" + className + ".xml"; + + //check if player already has a child with the component, if so delete that child + auto playerBoostAssaultEntity = e.Victim.FirstChildByName(className); + if (playerBoostAssaultEntity.Valid()) { + m_World->DeleteEntity(playerBoostAssaultEntity.ID); + } + //load boost XML file, set it entity parented with the victim player + auto entityFile = ResourceManager::Load(classXML); + EntityWrapper boostAssaultEntity = entityFile->MergeInto(m_World); + m_World->SetName(boostAssaultEntity.ID, className); + m_World->SetParent(boostAssaultEntity.ID, e.Victim.ID); } - //load boost XML file, set it entity parented with the victim player - auto entityFile = ResourceManager::Load(classXML); - EntityWrapper boostAssaultEntity = entityFile->MergeInto(m_World); - m_World->SetName(boostAssaultEntity.ID, className); - m_World->SetParent(boostAssaultEntity.ID, e.Victim.ID); return true; } @@ -55,14 +61,64 @@ bool BoostSystem::OnPlayerDamage(Events::PlayerDamage& e) std::string BoostSystem::DetermineClass(EntityWrapper inflictorPlayer) { //determine the class based on what component the inflictor-player has - if (m_World->HasComponent(inflictorPlayer.ID, "DashAbility")) { - return "BoostAssault"; - } - if (m_World->HasComponent(inflictorPlayer.ID, "ShieldAbility")) { - return "BoostDefender"; - } - if (m_World->HasComponent(inflictorPlayer.ID, "SprintAbility")) { - return "BoostSniper"; + if (inflictorPlayer.HasComponent("Player")) { + if ((std::string)inflictorPlayer["Player"]["CurrentWeapon"] == "AssaultWeapon") { + return "BoostAssault"; + } + if ((std::string)inflictorPlayer["Player"]["CurrentWeapon"] == "DefenderWeapon") { + return "BoostDefender"; + } + if ((std::string)inflictorPlayer["Player"]["CurrentWeapon"] == "SniperWeapon") { + return "BoostSniper"; + } + if ((std::string)inflictorPlayer["Player"]["CurrentWeapon"] == "SidearmWeapon") { + return "SidearmWeapon"; + } } return ""; } + +void BoostSystem::giveAmmo(EntityWrapper giver, EntityWrapper receiver) +{ + bool gaveAmmo = false; + + if (receiver.HasComponent("AssaultWeapon")) { + int magazineSize = receiver["AssaultWeapon"]["MagazineSize"]; + int& magazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; + + int maxAmmo = receiver["AssaultWeapon"]["MaxAmmo"]; + int& ammo = receiver["AssaultWeapon"]["Ammo"]; + + if (magazineAmmo < magazineSize) { + magazineAmmo += 1; + gaveAmmo = true; + } else if (ammo < maxAmmo) { + ammo += 1; + gaveAmmo = true; + } + } else if (receiver.HasComponent("DefenderWeapon")) { + int magazineSize = receiver["DefenderWeapon"]["MagazineSize"]; + int& magazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; + + int maxAmmo = receiver["DefenderWeapon"]["MaxAmmo"]; + int& ammo = receiver["DefenderWeapon"]["Ammo"]; + + if (magazineAmmo < magazineSize) { + magazineAmmo += 1; + gaveAmmo = true; + } else if (ammo < maxAmmo) { + ammo += 1; + gaveAmmo = true; + } + } + + + if (gaveAmmo) { + EntityWrapper effectSpawner = giver.FirstChildByName("AmmoShareEffectSpawner"); + if (effectSpawner.Valid()) { + if (effectSpawner.HasComponent("Spawner")) { + SpawnerSystem::Spawn(effectSpawner, effectSpawner); + } + } + } +} diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index f87f1f81..517d17fb 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -281,7 +281,7 @@ bool SidearmWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi // If friendly fire, reduce damage to 0 (needed to make Boosts, Ammosharing work) if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { damage = 0; - giveAmmo(cWeapon, wi, victim); + //giveAmmo(cWeapon, wi, victim); } // Deal damage! @@ -293,6 +293,7 @@ bool SidearmWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi return damage > 0; } +/* void SidearmWeaponBehaviour::giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, EntityWrapper receiver) { @@ -337,7 +338,7 @@ void SidearmWeaponBehaviour::giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, } } } -} +}*/ void SidearmWeaponBehaviour::CheckAmmo(ComponentWrapper cWeapon, WeaponInfo& wi) { From 548efeb11ec9b09352a03d1539330cfafb0c34ae Mon Sep 17 00:00:00 2001 From: Tleety Date: Sat, 12 Mar 2016 17:03:50 +0100 Subject: [PATCH 14/61] EndScreen should now show when a team win --- include/Game/Systems/EndScreenSystem.h | 4 +- resources/DefaultConfig.ini | 8 +- resources/Schema/Entities/CP_Rocky2.xml | 9944 +++++++++++------------ resources/Schema/Entities/EndScreen.xml | 35 +- src/Game/Game.cpp | 2 + src/Game/Systems/EndScreenSystem.cpp | 60 +- 6 files changed, 4967 insertions(+), 5086 deletions(-) diff --git a/include/Game/Systems/EndScreenSystem.h b/include/Game/Systems/EndScreenSystem.h index ec4702ca..1dabbb5e 100644 --- a/include/Game/Systems/EndScreenSystem.h +++ b/include/Game/Systems/EndScreenSystem.h @@ -14,8 +14,8 @@ public: virtual void Update(double dt) override; private: - EventRelay m_EWin; - bool OnWin(const Events::Win&); + EventRelay m_EWin; + bool OnWin(const Events::Win& e); }; #endif \ No newline at end of file diff --git a/resources/DefaultConfig.ini b/resources/DefaultConfig.ini index 92e7bad3..5daddb56 100644 --- a/resources/DefaultConfig.ini +++ b/resources/DefaultConfig.ini @@ -75,13 +75,13 @@ NumIterations=9 TextureQuality=0 [GLOW] -Quality=3 +Quality=1 [GLOW1] -NumIterations=5 +NumIterations=2 [GLOW2] -NumIterations=9 +NumIterations=4 [GLOW3] -NumIterations=13 \ No newline at end of file +NumIterations=6 \ No newline at end of file diff --git a/resources/Schema/Entities/CP_Rocky2.xml b/resources/Schema/Entities/CP_Rocky2.xml index 93b7fd77..469966e6 100644 --- a/resources/Schema/Entities/CP_Rocky2.xml +++ b/resources/Schema/Entities/CP_Rocky2.xml @@ -30,6 +30,28 @@ + + + + + 2 + Models/Props/Walls/SciFiWallBig.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallMedium.mesh + + + + + @@ -65,28 +87,6 @@ - - - - - 2 - Models/Props/Walls/SciFiWallBig.mesh - - - - - - - - - - 2 - Models/Props/Walls/SciFiWallMedium.mesh - - - - - @@ -684,6 +684,32 @@ + + + + + Models/Highgrounds/Hg18.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg20.mesh + + + + + + + + @@ -771,32 +797,6 @@ - - - - - Models/Highgrounds/Hg18.mesh - - - - - - - - - - - - - Models/Highgrounds/Hg20.mesh - - - - - - - - @@ -1607,11 +1607,11 @@ 12 - + - + @@ -1661,11 +1661,11 @@ 12 - + - + @@ -1730,11 +1730,11 @@ 12 - + - + @@ -2779,6 +2779,312 @@ + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + @@ -2805,6 +3111,20 @@ + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + @@ -2966,6 +3286,20 @@ + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + @@ -3130,20 +3464,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3157,19 +3477,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3184,20 +3491,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3211,20 +3504,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3239,19 +3518,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3292,32 +3558,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - @@ -3331,47 +3571,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -3385,46 +3584,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3439,45 +3598,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -3492,45 +3612,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3545,46 +3626,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3598,47 +3639,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -3646,19 +3646,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -3685,6 +3672,19 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -3711,54 +3711,6 @@ - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - @@ -3775,18 +3727,17 @@ 2 - + - + - 8 @@ -3797,57 +3748,10 @@ - + - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - @@ -3861,7 +3765,7 @@ Models/Props/PickUps/PickUpHolder.mesh - + @@ -3871,31 +3775,31 @@ 2 - + - + - - + 8 - Models/Props/PickUps/AmmoPickUp.mesh + Models/Props/PickUps/HealthPickUp.mesh - + + @@ -3919,18 +3823,17 @@ 2 - + - + - 8 @@ -3941,9 +3844,10 @@ - + + @@ -3967,18 +3871,17 @@ 2 - + - + - 8 @@ -3989,9 +3892,58 @@ - + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + @@ -4015,18 +3967,17 @@ 2 - + - + - 8 @@ -4037,9 +3988,58 @@ - + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + @@ -4107,12 +4107,12 @@ 4 - Models/Props/Pillars/SciFiPillar3Red.mesh + Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + + @@ -4139,56 +4139,13 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - + + - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar3Red.mesh - - - - - - - - - @@ -4211,23 +4168,8 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - + + @@ -4237,12 +4179,12 @@ 4 - Models/Props/Pillars/SciFiPillar2Red.mesh + Models/Props/Pillars/SciFiPillar3Red.mesh - - - + + + @@ -4251,13 +4193,12 @@ - 6 Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + + @@ -4277,6 +4218,65 @@ + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + @@ -4284,51 +4284,6 @@ - - - - - 15 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 10 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 15 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - @@ -4336,35 +4291,8 @@ Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - 15 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - + + @@ -4383,47 +4311,6 @@ - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar1Blue.mesh - - - - - - - - - @@ -4432,35 +4319,8 @@ Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - 15 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - + + @@ -4471,6 +4331,21 @@ + + + + Models/Props/Flora/HangingBush4.mesh + true + false + + + + + + + + + @@ -4498,21 +4373,6 @@ - - - - Models/Props/Flora/HangingBush4.mesh - true - false - - - - - - - - - @@ -4528,6 +4388,174 @@ + + + + + 10 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + @@ -4567,34 +4595,6 @@ - - - - - 15 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - @@ -4628,630 +4628,6 @@ - - - - Models/Core/UnitPlane.mesh - - true - - - - - - - - - - - - - - - - - - - Models/Props/Flora/Root.mesh - - - - - - - - - - - - - - Models/Props/Flora/Root.mesh - - - - - - - - - - - - - - Models/Props/Flora/Root.mesh - - - - - - - - - - - - - - Models/Props/Flora/Root.mesh - - - - - - - - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 1 - 0.30000001192092896 - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - @@ -5264,8 +4640,8 @@ Models/Props/Walls/SpecialWall1.mesh - - + + @@ -5278,8 +4654,8 @@ Models/Props/Walls/SpecialWall1.mesh - - + + @@ -5306,8 +4682,8 @@ Models/Props/Walls/SpecialWall1.mesh - - + + @@ -5315,288 +4691,26 @@ + + + + Models/Core/UnitPlane.mesh + + true + + + + + + + + + - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh - - - - - - - - - - - - 12 - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - - - - - - - - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - - - - - - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - - - - - 12 - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh - - - - - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - - - - - 12 - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh - - - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - @@ -5715,6 +4829,892 @@ + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 1 + 0.30000001192092896 + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + @@ -5743,7 +5743,7 @@ Models/Props/Walls/BigWallRed.mesh - + @@ -5763,6 +5763,20 @@ + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + @@ -5780,11 +5794,11 @@ - Models/Props/Walls/SmallWall3.mesh + Models/Props/Walls/MediumWall3.mesh - - + + @@ -5796,8 +5810,8 @@ Models/Props/Walls/MediumWall3.mesh - - + + @@ -5809,7 +5823,74 @@ Models/Props/Walls/SmallWall3.mesh - + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + @@ -5829,6 +5910,19 @@ + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + @@ -5843,6 +5937,114 @@ + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + @@ -5882,47 +6084,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -5937,47 +6098,6 @@ - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -5991,46 +6111,6 @@ - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - @@ -6044,46 +6124,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -6098,46 +6138,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - @@ -6165,21 +6165,8 @@ Models/Props/SciFiHolder1.mesh - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - + + @@ -6204,8 +6191,21 @@ Models/Props/SciFiHolder1.mesh - - + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + @@ -6236,6 +6236,20 @@ + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + @@ -6243,8 +6257,22 @@ Models/Props/Stones/SmallStone1.mesh - - + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + @@ -6256,8 +6284,358 @@ Models/Props/Stones/BigStone.mesh - - + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + @@ -6293,11 +6671,26 @@ - Models/Props/Stones/MediumStone2.mesh + Models/Props/Stones/mediumStone2.mesh - - + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + @@ -6309,9 +6702,48 @@ Models/Props/Stones/SmallStone2.mesh - - - + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + @@ -6323,9 +6755,90 @@ Models/Props/Stones/mediumStone2.mesh - - - + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + @@ -6344,46 +6857,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6397,46 +6870,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6450,47 +6883,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6503,47 +6895,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6558,47 +6909,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6613,20 +6923,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - @@ -6640,20 +6936,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -6668,46 +6950,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6721,19 +6963,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6747,19 +6976,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - @@ -6774,46 +6990,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6855,33 +7031,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6908,20 +7057,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6936,19 +7071,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -6963,19 +7085,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -7004,33 +7113,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -7072,33 +7154,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -7126,20 +7181,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -7180,20 +7221,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -7220,33 +7247,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -7254,19 +7254,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -7293,6 +7280,19 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -7308,9 +7308,9 @@ Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + @@ -7319,17 +7319,61 @@ - 6 + 7 Models/Props/Stones/ShinyStoneCrystalRed.mesh - - + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + @@ -7353,9 +7397,39 @@ Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + @@ -7389,21 +7463,6 @@ - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -7419,21 +7478,6 @@ - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -7449,20 +7493,6 @@ - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - @@ -7493,36 +7523,6 @@ - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -7530,20 +7530,6 @@ - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - @@ -7570,6 +7556,20 @@ + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + @@ -7641,6 +7641,78 @@ + + + + + 4 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + @@ -7670,21 +7742,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - @@ -7700,21 +7757,6 @@ - - - - - 4 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - @@ -7729,20 +7771,6 @@ - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - @@ -7771,34 +7799,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - @@ -7841,138 +7841,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8007,8 +7875,9 @@ Models/Props/Stones/AssaultHolder.mesh - - + + + @@ -8020,8 +7889,8 @@ Models/Props/Stones/AssaultHolder.mesh - - + + @@ -8054,6 +7923,137 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -8079,11 +8079,39 @@ - Models/Props/Walls/MediumWall3.mesh + Models/Props/Walls/BigWallRed.mesh - - + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + @@ -8108,9 +8136,22 @@ Models/Props/Walls/SmallWall3.mesh - - - + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + @@ -8122,9 +8163,9 @@ Models/Props/Walls/SmallWall3.mesh - - - + + + @@ -8142,19 +8183,6 @@ - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -8182,34 +8210,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -8247,18 +8247,17 @@ 2 - + - + - 8 @@ -8269,9 +8268,10 @@ - + + @@ -8295,18 +8295,17 @@ 2 - + - + - 8 @@ -8317,9 +8316,10 @@ - + + @@ -8334,6 +8334,60 @@ + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + @@ -8351,11 +8405,37 @@ - Models/Props/Stones/MediumStone2.mesh + Models/Props/Stones/SmallStone1.mesh - - + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + @@ -8373,6 +8453,46 @@ + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + @@ -8400,32 +8520,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -8453,33 +8547,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -8507,19 +8574,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -8533,20 +8587,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -8561,19 +8601,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -8601,33 +8628,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -8699,721 +8699,19 @@ - - - - 0.049999997019767761 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Pick Class - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - Textures/Icons/Classes/Defender-01.png - - false - - - PickClass - 2 - - - - - - - - - - - Defender - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - Textures/Icons/Classes/Assault-01.png - - false - - - PickClass - 1 - - - - - - - - - - - Assault - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - Textures/Icons/Classes/Sniper-01.png - - false - - - PickClass - 3 - - - - - - - - - - - Sniper - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - SwapToTeamPick - 1 - - - - - - - - - - - Team - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - PickTeam - 1 - - - - - - - - - - - Spectator - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - Pick Team - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - PickTeam - 2 - - - - - - - - - - - Red - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - PickTeam - 3 - - - - - - - - - - - Blue - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - false - - - SwapToClassPick - 1 - - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - false - - - - - - - - - - - - Class - Fonts/DroidSans.ttf,64 - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 7 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - - - - 2 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - - - - 1 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - 1 - - - - 4 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - 1 - - - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - - - - 3 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - SwapToTeamPick - 1 - - - - - - - - - - - Team - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - SwapToClassPick - 1 - - - - - - - - - - - Class - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - + - + - Schema/Entities/PlayerRed.xml + Schema/Entities/Player.xml - + @@ -9425,7 +8723,7 @@ false - + @@ -9438,7 +8736,7 @@ false - + @@ -9451,7 +8749,7 @@ false - + @@ -9464,830 +8762,18 @@ false - + - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - Schema/Entities/ScoreBoard_Red.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - Schema/Entities/ScoreBoard_Blue.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Schema/Entities/ScoreBoard_Blue.xml - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - Schema/Entities/ScoreBoard_Red.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 3 - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointRed.mesh - - - - - - - - - - 15 - - - - - - - - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 2 - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 1 - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - - - - - - - - - - -15 - - - - 4 - - - - - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - - - - 10 - - - - - - - @@ -10304,6 +8790,72 @@ + + + + 4 + + + + + + + + + + + 5 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + @@ -10337,28 +8889,6 @@ - - - - 4 - - - - - - - - - - - 4 - - - - - - - @@ -10393,28 +8923,6 @@ - - - - 4 - - - - - - - - - - - 5 - - - - - - - @@ -10438,17 +8946,6 @@ - - - - 4 - - - - - - - @@ -10460,27 +8957,16 @@ - - - - 4 - - - - - - - - - - 0.80000001192092896 - 1.2000000476837158 - - + + 10 + + + + @@ -10497,7 +8983,81 @@ - + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + @@ -10510,7 +9070,7 @@ 0.5 - + @@ -10524,7 +9084,7 @@ 0.5 - + @@ -10534,7 +9094,81 @@ - + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + @@ -10608,7 +9242,7 @@ - + @@ -10621,11 +9255,34 @@ 0.5 - + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + @@ -10640,6 +9297,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -10649,20 +9320,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -10677,6 +9334,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -10685,43 +9356,6 @@ - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - @@ -10790,43 +9424,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -10864,43 +9461,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -10908,20 +9468,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -10936,6 +9482,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -10944,80 +9504,6 @@ - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - @@ -11186,6 +9672,41 @@ + + + + + 10 + + + + + + + + + + + + 10 + + + + + + + + + + + + 0.80000001192092896 + 1.2000000476837158 + + + + + @@ -11209,29 +9730,6 @@ - - - - - 10 - - - - - - - - - - - 10 - - - - - - - @@ -11248,172 +9746,57 @@ - + - - - 15 - 1 - - - - + - + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -11454,7 +9837,44 @@ - + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + @@ -11528,61 +9948,10 @@ - + - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - @@ -11597,15 +9966,6 @@ - - - - - - - - - @@ -11620,20 +9980,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -11676,7 +10022,44 @@ - + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + @@ -11713,7 +10096,44 @@ - + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + @@ -11731,6 +10151,103 @@ + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + @@ -11745,73 +10262,54 @@ + + + + + 5 + 1 + 0.5 + + + + + + + - + - + + + 15 + 1 + + + + - - - - - - 10 - 1 - - - - - - - - - - - - 10 - 1 - - - - - - - - - - - - 10 - 1 - - - - - - - - + - + - + - Schema/Entities/Player.xml + Schema/Entities/PlayerRed.xml - + @@ -11823,7 +10321,7 @@ false - + @@ -11836,7 +10334,7 @@ false - + @@ -11849,7 +10347,7 @@ false - + @@ -11862,13 +10360,1337 @@ false - + + + + + 0.049999997019767761 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Sniper-01.png + + + PickClass + 3 + + + + + + + + + + + Sniper + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Defender-01.png + + + PickClass + 2 + + + + + + + + + + + Defender + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Pick Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Assault-01.png + + + PickClass + 1 + + + + + + + + + + + Assault + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + 1 + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + 1 + + + + 4 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + + + 7 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToClassPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 2 + + + + + + + + + + + Red + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + Pick Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + false + + + SwapToClassPick + 1 + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 1 + + + + + + + + + + + Spectator + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 3 + + + + + + + + + + + Blue + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/ScoreBoard_Main.xml + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + Schema/Entities/ScoreBoard_Red.xml + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + Schema/Entities/ScoreBoard_Blue.xml + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + Schema/Entities/EndScreen.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + false + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + + + + Blue team win! + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + Red team win! + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + + + + + + + + + + 15 + + + + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 1 + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 3 + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 2 + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + + + + + + + + + + -15 + + + + 4 + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/EndScreen.xml b/resources/Schema/Entities/EndScreen.xml index 11ddc201..7b8b055f 100644 --- a/resources/Schema/Entities/EndScreen.xml +++ b/resources/Schema/Entities/EndScreen.xml @@ -11,6 +11,7 @@ + @@ -21,6 +22,22 @@ + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + false + + + + + + + @@ -28,8 +45,7 @@ Textures/Core/White.png true - - false + @@ -64,21 +80,6 @@ - - - - Models/Core/UnitQuad.mesh - - Textures/Core/White.png - true - - - - - - - - diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 7b80727e..74cc5fe8 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -40,6 +40,7 @@ #include "Game/Systems/MainMenuSystem.h" #include "Game/Systems/ServerListSystem.h" #include "Game/Systems/StartSystem.h" +#include "Game/Systems/EndScreenSystem.h" #include "Rendering/TextureSprite.h" @@ -157,6 +158,7 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(updateOrderLevel); m_SystemPipeline->AddSystem(updateOrderLevel, m_Renderer); m_SystemPipeline->AddSystem(updateOrderLevel); + m_SystemPipeline->AddSystem(updateOrderLevel); // Populate Octree with collidables ++updateOrderLevel; m_SystemPipeline->AddSystem(updateOrderLevel, m_OctreeCollision, "Collidable"); diff --git a/src/Game/Systems/EndScreenSystem.cpp b/src/Game/Systems/EndScreenSystem.cpp index e750cca3..6a7ee90e 100644 --- a/src/Game/Systems/EndScreenSystem.cpp +++ b/src/Game/Systems/EndScreenSystem.cpp @@ -3,6 +3,7 @@ EndScreenSystem::EndScreenSystem(SystemParams params) : System(params) + , ImpureSystem() { EVENT_SUBSCRIBE_MEMBER(m_EWin, &EndScreenSystem::OnWin); } @@ -12,7 +13,62 @@ void EndScreenSystem::Update(double dt) } -bool EndScreenSystem::OnWin(const Events::Win&) +bool EndScreenSystem::OnWin(const Events::Win& e) { - + auto endScreenCameras = m_World->GetComponents("EndScreen"); + if(endScreenCameras == nullptr) { + LOG_ERROR("Win event recieved but no Endscreen camera is present."); + return 1; + } + for(auto& camera : *endScreenCameras) { + EntityWrapper entity = EntityWrapper(m_World, camera.EntityID); + + Events::SetCamera event; + event.CameraEntity = entity; + m_EventBroker->Publish(event); + + EntityWrapper redSprite = entity.FirstChildByName("SpriteRed"); + EntityWrapper blueSprite = entity.FirstChildByName("SpriteBlue"); + EntityWrapper redText = entity.FirstChildByName("TextRed"); + EntityWrapper blueText = entity.FirstChildByName("TextBlue"); + + if (e.TeamThatWon == 2) { + //Red team won + if(redSprite.HasComponent("Sprite")) + (bool&)redSprite["Sprite"]["Visible"] = true; + if (redText.HasComponent("Text")) + (bool&)redText["Text"]["Visible"] = true; + + if (blueSprite.HasComponent("Sprite")) + (bool&)blueSprite["Sprite"]["Visible"] = false; + if (blueText.HasComponent("Text")) + (bool&)blueText["Text"]["Visible"] = false; + + }else if (e.TeamThatWon == 1) { + //Blue team won + if (redSprite.HasComponent("Sprite")) + (bool&)redSprite["Sprite"]["Visible"] = false; + if (redText.HasComponent("Text")) + (bool&)redText["Text"]["Visible"] = false; + + if (blueSprite.HasComponent("Sprite")) + (bool&)blueSprite["Sprite"]["Visible"] = true; + if (blueText.HasComponent("Text")) + (bool&)blueText["Text"]["Visible"] = true; + } else { + //No team won? + if (redSprite.HasComponent("Sprite")) + (bool&)redSprite["Sprite"]["Visible"] = false; + if (blueSprite.HasComponent("Sprite")) + (bool&)blueSprite["Sprite"]["Visible"] = false; + + if (redText.HasComponent("Text")) + (bool&)redText["Text"]["Visible"] = false; + if (blueText.HasComponent("Text")) + (bool&)blueText["Text"]["Visible"] = false; + } + } + + + return 1; } From f7363eeea4b26aff973643b703b09a3915a5eae6 Mon Sep 17 00:00:00 2001 From: Tleety Date: Sat, 12 Mar 2016 17:30:28 +0100 Subject: [PATCH 15/61] Boost icon fix --- src/Game/Systems/BoostIconsHUDSystem.cpp | 14 ++++++++------ src/Game/Systems/EndScreenSystem.cpp | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Game/Systems/BoostIconsHUDSystem.cpp b/src/Game/Systems/BoostIconsHUDSystem.cpp index f83278ff..d151a044 100644 --- a/src/Game/Systems/BoostIconsHUDSystem.cpp +++ b/src/Game/Systems/BoostIconsHUDSystem.cpp @@ -5,11 +5,13 @@ void BoostIconsHUDSystem::UpdateComponent(EntityWrapper& entity, ComponentWrappe EntityWrapper assaultEntity = entity.FirstChildByName("Assault"); EntityWrapper defenderEntity = entity.FirstChildByName("Defender"); EntityWrapper sniperEntity = entity.FirstChildByName("Sniper"); + EntityWrapper player = entity.FirstParentWithComponent("Player"); + if(assaultEntity.Valid()) { if (assaultEntity.HasComponent("Fill")) { - EntityWrapper parentWithAssaultBoost = assaultEntity.FirstParentWithComponent("BoostAssault"); - if (parentWithAssaultBoost.Valid()) { + EntityWrapper assaultBoost = player.FirstChildByName("BoostAssault"); + if (assaultBoost.Valid()) { (double&)assaultEntity["Fill"]["Percentage"] = 1.0; } else { (double&)assaultEntity["Fill"]["Percentage"] = 0.0; @@ -19,8 +21,8 @@ void BoostIconsHUDSystem::UpdateComponent(EntityWrapper& entity, ComponentWrappe if (defenderEntity.Valid()) { if (defenderEntity.HasComponent("Fill")) { - EntityWrapper parentWithAssaultBoost = defenderEntity.FirstParentWithComponent("BoostDefender"); - if (parentWithAssaultBoost.Valid()) { + EntityWrapper defenderBoost = player.FirstChildByName("BoostDefender"); + if (defenderBoost.Valid()) { (double&)defenderEntity["Fill"]["Percentage"] = 1.0; } else { (double&)defenderEntity["Fill"]["Percentage"] = 0.0; @@ -30,8 +32,8 @@ void BoostIconsHUDSystem::UpdateComponent(EntityWrapper& entity, ComponentWrappe if (sniperEntity.Valid()) { if (sniperEntity.HasComponent("Fill")) { - EntityWrapper parentWithAssaultBoost = sniperEntity.FirstParentWithComponent("BoostSniper"); - if (parentWithAssaultBoost.Valid()) { + EntityWrapper sniperBoost = player.FirstChildByName("BoostSniper"); + if (sniperBoost.Valid()) { (double&)sniperEntity["Fill"]["Percentage"] = 1.0; } else { (double&)sniperEntity["Fill"]["Percentage"] = 0.0; diff --git a/src/Game/Systems/EndScreenSystem.cpp b/src/Game/Systems/EndScreenSystem.cpp index 6a7ee90e..f16adf83 100644 --- a/src/Game/Systems/EndScreenSystem.cpp +++ b/src/Game/Systems/EndScreenSystem.cpp @@ -44,7 +44,7 @@ bool EndScreenSystem::OnWin(const Events::Win& e) if (blueText.HasComponent("Text")) (bool&)blueText["Text"]["Visible"] = false; - }else if (e.TeamThatWon == 1) { + }else if (e.TeamThatWon == 3) { //Blue team won if (redSprite.HasComponent("Sprite")) (bool&)redSprite["Sprite"]["Visible"] = false; From 944d10f4bbdebbea7d2f51a2478a92d8377a78e9 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sat, 12 Mar 2016 17:34:32 +0100 Subject: [PATCH 16/61] Some network fixes with sidearm --- .../Network/MultiplayerSnapshotFilter.cpp | 1 + src/Game/Systems/BoostSystem.cpp | 87 ++++++++++--------- 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/src/Game/Network/MultiplayerSnapshotFilter.cpp b/src/Game/Network/MultiplayerSnapshotFilter.cpp index 1131424b..db3d998e 100644 --- a/src/Game/Network/MultiplayerSnapshotFilter.cpp +++ b/src/Game/Network/MultiplayerSnapshotFilter.cpp @@ -14,6 +14,7 @@ bool MultiplayerSnapshotFilter::FilterComponent(EntityWrapper entity, SharedComp || component.Info.Name == "Physics" || component.Info.Name == "AssaultWeapon" || component.Info.Name == "DefenderWeapon" + || component.Info.Name == "SidearmWeapon" || component.Info.Name == "Animation" || component.Info.Name == "Blend" || component.Info.Name == "BlendAdditive" diff --git a/src/Game/Systems/BoostSystem.cpp b/src/Game/Systems/BoostSystem.cpp index 2ebfff73..5074e1c7 100644 --- a/src/Game/Systems/BoostSystem.cpp +++ b/src/Game/Systems/BoostSystem.cpp @@ -8,51 +8,52 @@ BoostSystem::BoostSystem(SystemParams params) bool BoostSystem::OnPlayerDamage(Events::PlayerDamage& e) { - if (e.Victim.ID == e.Inflictor.ID) { - return false; - } + if (!IsClient) { - if (!e.Victim.Valid() || !LocalPlayer.Valid()) { - return false; - } - - if (e.Victim != LocalPlayer && !e.Victim.IsChildOf(LocalPlayer)) { - return false; - } - - if (!e.Inflictor.Valid()) { - return false; - } - - //if its not friendly fire, return - if ((int)m_World->GetComponent(e.Inflictor.ID, "Team")["Team"] != (int)m_World->GetComponent(e.Victim.ID, "Team")["Team"]) { - return false; - } - - //determine the inflictors class - auto className = DetermineClass(e.Inflictor); - if (className == "") { - return false; - } - - - LOG_INFO("intflictor: %s, vicitm: %s", e.Inflictor.Name().c_str(), e.Victim.Name().c_str()); - if(className == "SidearmWeapon") { // give ammo - giveAmmo(e.Inflictor, e.Victim); - } else { //give boost - //get the XML file, example: "Schema/Entities/BoostclassName.xml" - std::string classXML = "Schema/Entities/" + className + ".xml"; - - //check if player already has a child with the component, if so delete that child - auto playerBoostAssaultEntity = e.Victim.FirstChildByName(className); - if (playerBoostAssaultEntity.Valid()) { - m_World->DeleteEntity(playerBoostAssaultEntity.ID); + if (e.Victim.ID == e.Inflictor.ID) { + return false; + } + + if (!e.Victim.Valid() || !LocalPlayer.Valid()) { + return false; + } + + if (e.Victim != LocalPlayer && !e.Victim.IsChildOf(LocalPlayer)) { + return false; + } + + if (!e.Inflictor.Valid()) { + return false; + } + + //if its not friendly fire, return + if ((int)m_World->GetComponent(e.Inflictor.ID, "Team")["Team"] != (int)m_World->GetComponent(e.Victim.ID, "Team")["Team"]) { + return false; + } + + //determine the inflictors class + auto className = DetermineClass(e.Inflictor); + if (className == "") { + return false; + } + + if (className == "SidearmWeapon") { // give ammo + giveAmmo(e.Inflictor, e.Victim); + } else { //give boost + //get the XML file, example: "Schema/Entities/BoostclassName.xml" + std::string classXML = "Schema/Entities/" + className + ".xml"; + + //check if player already has a child with the component, if so delete that child + auto playerBoostAssaultEntity = e.Victim.FirstChildByName(className); + if (playerBoostAssaultEntity.Valid()) { + m_World->DeleteEntity(playerBoostAssaultEntity.ID); + } + //load boost XML file, set it entity parented with the victim player + auto entityFile = ResourceManager::Load(classXML); + EntityWrapper boostAssaultEntity = entityFile->MergeInto(m_World); + m_World->SetName(boostAssaultEntity.ID, className); + m_World->SetParent(boostAssaultEntity.ID, e.Victim.ID); } - //load boost XML file, set it entity parented with the victim player - auto entityFile = ResourceManager::Load(classXML); - EntityWrapper boostAssaultEntity = entityFile->MergeInto(m_World); - m_World->SetName(boostAssaultEntity.ID, className); - m_World->SetParent(boostAssaultEntity.ID, e.Victim.ID); } return true; From dfc30f4693bb3c59cd3d6c794a6d6455617ae6ee Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sat, 12 Mar 2016 17:39:50 +0100 Subject: [PATCH 17/61] Boost fixes? --- src/Game/Systems/BoostSystem.cpp | 90 ++++++++++++++++---------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/src/Game/Systems/BoostSystem.cpp b/src/Game/Systems/BoostSystem.cpp index 5074e1c7..f6148192 100644 --- a/src/Game/Systems/BoostSystem.cpp +++ b/src/Game/Systems/BoostSystem.cpp @@ -8,54 +8,52 @@ BoostSystem::BoostSystem(SystemParams params) bool BoostSystem::OnPlayerDamage(Events::PlayerDamage& e) { - if (!IsClient) { - - if (e.Victim.ID == e.Inflictor.ID) { - return false; - } - - if (!e.Victim.Valid() || !LocalPlayer.Valid()) { - return false; - } - - if (e.Victim != LocalPlayer && !e.Victim.IsChildOf(LocalPlayer)) { - return false; - } - - if (!e.Inflictor.Valid()) { - return false; - } - - //if its not friendly fire, return - if ((int)m_World->GetComponent(e.Inflictor.ID, "Team")["Team"] != (int)m_World->GetComponent(e.Victim.ID, "Team")["Team"]) { - return false; - } - - //determine the inflictors class - auto className = DetermineClass(e.Inflictor); - if (className == "") { - return false; - } - - if (className == "SidearmWeapon") { // give ammo - giveAmmo(e.Inflictor, e.Victim); - } else { //give boost - //get the XML file, example: "Schema/Entities/BoostclassName.xml" - std::string classXML = "Schema/Entities/" + className + ".xml"; - - //check if player already has a child with the component, if so delete that child - auto playerBoostAssaultEntity = e.Victim.FirstChildByName(className); - if (playerBoostAssaultEntity.Valid()) { - m_World->DeleteEntity(playerBoostAssaultEntity.ID); - } - //load boost XML file, set it entity parented with the victim player - auto entityFile = ResourceManager::Load(classXML); - EntityWrapper boostAssaultEntity = entityFile->MergeInto(m_World); - m_World->SetName(boostAssaultEntity.ID, className); - m_World->SetParent(boostAssaultEntity.ID, e.Victim.ID); - } + if (e.Victim.ID == e.Inflictor.ID) { + return false; } + if (!e.Victim.Valid() || !LocalPlayer.Valid()) { + return false; + } + + if (e.Victim != LocalPlayer && !e.Victim.IsChildOf(LocalPlayer)) { + return false; + } + + if (!e.Inflictor.Valid()) { + return false; + } + + //if its not friendly fire, return + if ((int)m_World->GetComponent(e.Inflictor.ID, "Team")["Team"] != (int)m_World->GetComponent(e.Victim.ID, "Team")["Team"]) { + return false; + } + + //determine the inflictors class + auto className = DetermineClass(e.Inflictor); + if (className == "") { + return false; + } + + if (className == "SidearmWeapon") { // give ammo + giveAmmo(e.Inflictor, e.Victim); + } else { //give boost + //get the XML file, example: "Schema/Entities/BoostclassName.xml" + std::string classXML = "Schema/Entities/" + className + ".xml"; + + //check if player already has a child with the component, if so delete that child + auto playerBoostAssaultEntity = e.Victim.FirstChildByName(className); + if (playerBoostAssaultEntity.Valid()) { + m_World->DeleteEntity(playerBoostAssaultEntity.ID); + } + //load boost XML file, set it entity parented with the victim player + auto entityFile = ResourceManager::Load(classXML); + EntityWrapper boostAssaultEntity = entityFile->MergeInto(m_World); + m_World->SetName(boostAssaultEntity.ID, className); + m_World->SetParent(boostAssaultEntity.ID, e.Victim.ID); + } + + return true; } From 51b8846b3a4bfd3d2a96979ed2da4522821a6b46 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sat, 12 Mar 2016 18:29:49 +0100 Subject: [PATCH 18/61] Ammo sharing done --- .../Schema/Entities/AmmoShareEffectView.xml | 1 + src/Game/Systems/BoostSystem.cpp | 42 ++++++++----------- .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 39 ++++++++++++++++- 3 files changed, 56 insertions(+), 26 deletions(-) diff --git a/resources/Schema/Entities/AmmoShareEffectView.xml b/resources/Schema/Entities/AmmoShareEffectView.xml index 651d1621..28997ab0 100644 --- a/resources/Schema/Entities/AmmoShareEffectView.xml +++ b/resources/Schema/Entities/AmmoShareEffectView.xml @@ -21,6 +21,7 @@ true + diff --git a/src/Game/Systems/BoostSystem.cpp b/src/Game/Systems/BoostSystem.cpp index f6148192..b695aa96 100644 --- a/src/Game/Systems/BoostSystem.cpp +++ b/src/Game/Systems/BoostSystem.cpp @@ -79,45 +79,37 @@ std::string BoostSystem::DetermineClass(EntityWrapper inflictorPlayer) void BoostSystem::giveAmmo(EntityWrapper giver, EntityWrapper receiver) { - bool gaveAmmo = false; - if (receiver.HasComponent("AssaultWeapon")) { int magazineSize = receiver["AssaultWeapon"]["MagazineSize"]; int& magazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; - + int prevMagazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; int maxAmmo = receiver["AssaultWeapon"]["MaxAmmo"]; int& ammo = receiver["AssaultWeapon"]["Ammo"]; - if (magazineAmmo < magazineSize) { - magazineAmmo += 1; - gaveAmmo = true; - } else if (ammo < maxAmmo) { - ammo += 1; - gaveAmmo = true; + int givenAmmo = 3; + + magazineAmmo = glm::clamp(magazineAmmo + givenAmmo, 0, magazineSize); + if (magazineAmmo > prevMagazineAmmo) { + givenAmmo = prevMagazineAmmo + givenAmmo - magazineSize; + } + if (givenAmmo > 0) { + ammo = glm::clamp(ammo + givenAmmo, 0, maxAmmo); } } else if (receiver.HasComponent("DefenderWeapon")) { int magazineSize = receiver["DefenderWeapon"]["MagazineSize"]; int& magazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; - + int prevMagazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; int maxAmmo = receiver["DefenderWeapon"]["MaxAmmo"]; int& ammo = receiver["DefenderWeapon"]["Ammo"]; - if (magazineAmmo < magazineSize) { - magazineAmmo += 1; - gaveAmmo = true; - } else if (ammo < maxAmmo) { - ammo += 1; - gaveAmmo = true; + int givenAmmo = 1; + + magazineAmmo = glm::clamp(magazineAmmo + givenAmmo, 0, magazineSize); + if (magazineAmmo > prevMagazineAmmo) { + givenAmmo = prevMagazineAmmo + givenAmmo - magazineSize; } - } - - - if (gaveAmmo) { - EntityWrapper effectSpawner = giver.FirstChildByName("AmmoShareEffectSpawner"); - if (effectSpawner.Valid()) { - if (effectSpawner.HasComponent("Spawner")) { - SpawnerSystem::Spawn(effectSpawner, effectSpawner); - } + if (givenAmmo > 0) { + ammo = glm::clamp(ammo + givenAmmo, 0, maxAmmo); } } } diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index 517d17fb..1364894d 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -281,7 +281,44 @@ bool SidearmWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi // If friendly fire, reduce damage to 0 (needed to make Boosts, Ammosharing work) if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { damage = 0; - //giveAmmo(cWeapon, wi, victim); + + bool gaveAmmo = false; + + if (victim.HasComponent("AssaultWeapon")) { + int magazineSize = victim["AssaultWeapon"]["MagazineSize"]; + int magazineAmmo = victim["AssaultWeapon"]["MagazineAmmo"]; + + int maxAmmo = victim["AssaultWeapon"]["MaxAmmo"]; + int ammo = victim["AssaultWeapon"]["Ammo"]; + + if (magazineAmmo < magazineSize) { + gaveAmmo = true; + } else if (ammo < maxAmmo) { + gaveAmmo = true; + } + } else if (victim.HasComponent("DefenderWeapon")) { + int magazineSize = victim["DefenderWeapon"]["MagazineSize"]; + int magazineAmmo = victim["DefenderWeapon"]["MagazineAmmo"]; + + int maxAmmo = victim["DefenderWeapon"]["MaxAmmo"]; + int ammo = victim["DefenderWeapon"]["Ammo"]; + + if (magazineAmmo < magazineSize) { + gaveAmmo = true; + } else if (ammo < maxAmmo) { + gaveAmmo = true; + } + } + + + if (gaveAmmo) { + EntityWrapper effectSpawner = wi.FirstPersonEntity.FirstChildByName("AmmoShareEffectSpawner"); + if (effectSpawner.Valid()) { + if (effectSpawner.HasComponent("Spawner")) { + SpawnerSystem::Spawn(effectSpawner, effectSpawner); + } + } + } } // Deal damage! From c0fc36845ffe9525371661584429b8f8a5d861e3 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sat, 12 Mar 2016 18:43:04 +0100 Subject: [PATCH 19/61] Defender ability HUD fixed --- src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index f342f291..f33eea26 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -152,6 +152,13 @@ bool DefenderWeaponBehaviour::OnInputCommand(ComponentWrapper cWeapon, WeaponInf EntityWrapper attachment = wi.Player.FirstChildByName("ShieldAttachment"); if (attachment.Valid()) { if (e.Value > 0) { + + if(wi.Player.Valid()) { + if(wi.Player.HasComponent("ShieldAbility")) { + (bool&)wi.Player["ShieldAbility"]["Active"] = true; + } + } + if (IsServer) { SpawnerSystem::Spawn(attachment, attachment); } @@ -214,6 +221,12 @@ bool DefenderWeaponBehaviour::OnInputCommand(ComponentWrapper cWeapon, WeaponInf } else { attachment.DeleteChildren(); + if (wi.Player.Valid()) { + if (wi.Player.HasComponent("ShieldAbility")) { + (bool&)wi.Player["ShieldAbility"]["Active"] = false; + } + } + if (IsClient) { EntityWrapper root = wi.FirstPersonEntity; if (root.Valid()) { From f6a8534c15aa00f3e13233981e61433cac37ddaf Mon Sep 17 00:00:00 2001 From: Tleety Date: Sun, 13 Mar 2016 01:23:51 +0100 Subject: [PATCH 20/61] New assets, FadeOutComponent, Some MuzzleFlash entities, Changes to ray. Muzzleflash rotation --- assets | 2 +- include/Engine/Rendering/SpriteJob.h | 6 +- include/Game/Systems/FadeOutSystem.h | 21 ++ resources/Schema/Components.xsd | 1 + resources/Schema/Components/FadeOut.xml | 4 + resources/Schema/Components/FadeOut.xsd | 13 + resources/Schema/Entities/MuzzleFlashBlue.xml | 195 +++++++++++++ resources/Schema/Entities/MuzzleFlashFire.xml | 135 +++++++++ .../Schema/Entities/MuzzleFlashGreen.xml | 135 +++++++++ .../Schema/Entities/MuzzleFlashLightBlue.xml | 135 +++++++++ resources/Schema/Entities/MuzzleFlashPink.xml | 135 +++++++++ .../Schema/Entities/MuzzleFlashPurple.xml | 135 +++++++++ .../Schema/Entities/MuzzleFlashRainbow.xml | 135 +++++++++ resources/Schema/Entities/MuzzleFlashRed.xml | 135 +++++++++ .../Schema/Entities/MuzzleFlashWhite.xml | 135 +++++++++ .../Schema/Entities/MuzzleFlashYellow.xml | 135 +++++++++ .../Schema/Entities/QualityAssurance.xml | 260 ++++++++++-------- resources/Schema/Entities/RayBlue.xml | 24 +- .../Schema/Entities/WeaponAssaultBlueView.xml | 57 ++-- resources/Schema/Types/Entity.xsd | 1 + src/Game/Game.cpp | 1 + src/Game/Systems/FadeOutSystem.cpp | 19 ++ .../Systems/Weapon/AssaultWeaponBehaviour.cpp | 71 ++--- 23 files changed, 1713 insertions(+), 177 deletions(-) create mode 100644 include/Game/Systems/FadeOutSystem.h create mode 100644 resources/Schema/Components/FadeOut.xml create mode 100644 resources/Schema/Components/FadeOut.xsd create mode 100644 resources/Schema/Entities/MuzzleFlashBlue.xml create mode 100644 resources/Schema/Entities/MuzzleFlashFire.xml create mode 100644 resources/Schema/Entities/MuzzleFlashGreen.xml create mode 100644 resources/Schema/Entities/MuzzleFlashLightBlue.xml create mode 100644 resources/Schema/Entities/MuzzleFlashPink.xml create mode 100644 resources/Schema/Entities/MuzzleFlashPurple.xml create mode 100644 resources/Schema/Entities/MuzzleFlashRainbow.xml create mode 100644 resources/Schema/Entities/MuzzleFlashRed.xml create mode 100644 resources/Schema/Entities/MuzzleFlashWhite.xml create mode 100644 resources/Schema/Entities/MuzzleFlashYellow.xml create mode 100644 src/Game/Systems/FadeOutSystem.cpp diff --git a/assets b/assets index 40f6ae62..d97e6ce5 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 40f6ae6201adb94e99ee084b081fc8467f80953a +Subproject commit d97e6ce5b99b9f8a2d5fe6dbfa1dbd11444f62ae diff --git a/include/Engine/Rendering/SpriteJob.h b/include/Engine/Rendering/SpriteJob.h index 3d55e721..1410a682 100644 --- a/include/Engine/Rendering/SpriteJob.h +++ b/include/Engine/Rendering/SpriteJob.h @@ -54,7 +54,7 @@ struct SpriteJob : RenderJob if((bool)cSprite["KeepRatio"] == true) { if(scale.y >= scale.x) { - ScaleY = (scale.x)/(scale.y); + ScaleY = (scale.y)/(scale.x); ScaleX = 1.f; } else { ScaleY = 1.f; @@ -90,8 +90,8 @@ struct SpriteJob : RenderJob bool Pickable; bool IsIndicator = false; bool BlurBackground = false; - float ScaleX = 1; - float ScaleY = 1; + float ScaleX = 1.f; + float ScaleY = 1.f; bool Linear = false; glm::vec4 FillColor = glm::vec4(0); diff --git a/include/Game/Systems/FadeOutSystem.h b/include/Game/Systems/FadeOutSystem.h new file mode 100644 index 00000000..a327577d --- /dev/null +++ b/include/Game/Systems/FadeOutSystem.h @@ -0,0 +1,21 @@ +#ifndef FadeOutSystem_h__ +#define FadeOutSystem_h__ + +#include "Core/System.h" + +class FadeOutSystem : public PureSystem +{ +public: + FadeOutSystem(SystemParams params) + : System(params) + , PureSystem("FadeOut") + { + + } + + virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFadeOut, double dt) override; + +private: +}; + +#endif \ No newline at end of file diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index f124272f..a57f55a7 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -69,4 +69,5 @@ + \ No newline at end of file diff --git a/resources/Schema/Components/FadeOut.xml b/resources/Schema/Components/FadeOut.xml new file mode 100644 index 00000000..f322d1b7 --- /dev/null +++ b/resources/Schema/Components/FadeOut.xml @@ -0,0 +1,4 @@ + + + 0 + \ No newline at end of file diff --git a/resources/Schema/Components/FadeOut.xsd b/resources/Schema/Components/FadeOut.xsd new file mode 100644 index 00000000..d5c240d6 --- /dev/null +++ b/resources/Schema/Components/FadeOut.xsd @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/Schema/Entities/MuzzleFlashBlue.xml b/resources/Schema/Entities/MuzzleFlashBlue.xml new file mode 100644 index 00000000..f984f6bc --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashBlue.xml @@ -0,0 +1,195 @@ + + + + + + 0.039999999105930328 + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneLeft.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneRight.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneUp.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneDown.mesh + false + true + + + + + + + + + + + + + + + + Models/Core/UnitSphere.mesh + false + false + + + + + + + + + + + + + + + Models/Core/UnitSphere.mesh + + false + false + + + + 0.40000000596046448 + + + + + + + + + + + + Models/Core/UnitSphere.mesh + false + false + + + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashFire.xml b/resources/Schema/Entities/MuzzleFlashFire.xml new file mode 100644 index 00000000..c1d47b2a --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashFire.xml @@ -0,0 +1,135 @@ + + + + + + 0.039999999105930328 + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Fire/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Fire/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Fire/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Fire/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Fire/PlaneLeft.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Fire/PlaneRight.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Fire/PlaneUp.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Fire/PlaneDown.mesh + false + true + + + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashGreen.xml b/resources/Schema/Entities/MuzzleFlashGreen.xml new file mode 100644 index 00000000..966a2c8d --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashGreen.xml @@ -0,0 +1,135 @@ + + + + + + 0.039999999105930328 + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Green/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Green/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Green/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Green/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Green/PlaneLeft.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Green/PlaneRight.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Green/PlaneUp.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Green/PlaneDown.mesh + false + true + + + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashLightBlue.xml b/resources/Schema/Entities/MuzzleFlashLightBlue.xml new file mode 100644 index 00000000..86c0b76c --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashLightBlue.xml @@ -0,0 +1,135 @@ + + + + + + 0.039999999105930328 + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/LightBlue/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/LightBlue/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/LightBlue/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/LightBlue/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/LightBlue/PlaneLeft.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/LightBlue/PlaneRight.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/LightBlue/PlaneUp.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/LightBlue/PlaneDown.mesh + false + true + + + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashPink.xml b/resources/Schema/Entities/MuzzleFlashPink.xml new file mode 100644 index 00000000..7664cf0f --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashPink.xml @@ -0,0 +1,135 @@ + + + + + + 0.039999999105930328 + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Pink/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Pink/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Pink/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Pink/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Pink/PlaneLeft.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Pink/PlaneRight.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Pink/PlaneUp.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Pink/PlaneDown.mesh + false + true + + + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashPurple.xml b/resources/Schema/Entities/MuzzleFlashPurple.xml new file mode 100644 index 00000000..c867fbc2 --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashPurple.xml @@ -0,0 +1,135 @@ + + + + + + 0.039999999105930328 + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Purple/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Purple/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Purple/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Purple/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Purple/PlaneLeft.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Purple/PlaneRight.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Purple/PlaneUp.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Purple/PlaneDown.mesh + false + true + + + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashRainbow.xml b/resources/Schema/Entities/MuzzleFlashRainbow.xml new file mode 100644 index 00000000..27da23d0 --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashRainbow.xml @@ -0,0 +1,135 @@ + + + + + + 0.039999999105930328 + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Rainbow/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Rainbow/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Rainbow/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Rainbow/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Rainbow/PlaneLeft.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Rainbow/PlaneRight.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Rainbow/PlaneUp.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Rainbow/PlaneDown.mesh + false + true + + + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashRed.xml b/resources/Schema/Entities/MuzzleFlashRed.xml new file mode 100644 index 00000000..50b22d6c --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashRed.xml @@ -0,0 +1,135 @@ + + + + + + 0.039999999105930328 + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Red/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Red/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Red/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Red/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Red/PlaneLeft.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Red/PlaneRight.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Red/PlaneUp.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Red/PlaneDown.mesh + false + true + + + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashWhite.xml b/resources/Schema/Entities/MuzzleFlashWhite.xml new file mode 100644 index 00000000..a810631a --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashWhite.xml @@ -0,0 +1,135 @@ + + + + + + 0.039999999105930328 + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/White/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/White/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/White/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/White/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/White/PlaneLeft.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/White/PlaneRight.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/White/PlaneUp.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/White/PlaneDown.mesh + false + true + + + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashYellow.xml b/resources/Schema/Entities/MuzzleFlashYellow.xml new file mode 100644 index 00000000..c6c3b4cf --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashYellow.xml @@ -0,0 +1,135 @@ + + + + + + 0.039999999105930328 + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Yellow/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Yellow/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Yellow/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Yellow/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Yellow/PlaneLeft.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Yellow/PlaneRight.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Yellow/PlaneUp.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Yellow/PlaneDown.mesh + false + true + + + + + + + + + + diff --git a/resources/Schema/Entities/QualityAssurance.xml b/resources/Schema/Entities/QualityAssurance.xml index 2fbd9527..cd89d64a 100644 --- a/resources/Schema/Entities/QualityAssurance.xml +++ b/resources/Schema/Entities/QualityAssurance.xml @@ -3,7 +3,7 @@ - 3.6154132075906489 + 6.5024371606521605 @@ -11,6 +11,15 @@ + + + + + + + + + @@ -69,15 +78,6 @@ - - - - - - - - - @@ -85,7 +85,7 @@ - + @@ -105,6 +105,15 @@ + + + + + + + + + @@ -141,7 +150,7 @@ - + @@ -194,7 +203,7 @@ - + @@ -222,7 +231,7 @@ - + @@ -286,7 +295,7 @@ - + @@ -318,7 +327,7 @@ - + @@ -641,6 +650,52 @@ + + + + Models/Core/UnitCylinder.mesh + + + + + + + + + + + + + + + + + + + + 0.5 + + + + + + + + + + + Models/Test/AssaultTPoseSoftEdge.mesh + + + + + + + + + + + @@ -668,7 +723,7 @@ - + @@ -715,7 +770,7 @@ - + @@ -775,7 +830,7 @@ - + @@ -795,52 +850,6 @@ - - - - Models/Core/UnitCylinder.mesh - - - - - - - - - - - - - - - - - - - - 0.5 - - - - - - - - - - - Models/Test/AssaultTPoseSoftEdge.mesh - - - - - - - - - - - @@ -868,7 +877,7 @@ - + @@ -915,7 +924,7 @@ - + @@ -962,7 +971,7 @@ - + @@ -1027,7 +1036,6 @@ - Models/Core/UnitCube.mesh @@ -1037,6 +1045,7 @@ + @@ -1073,7 +1082,6 @@ 1 - Models/Core/UnitCube.mesh @@ -1083,6 +1091,7 @@ + @@ -1117,7 +1126,6 @@ 2 - Models/Core/UnitCube.mesh @@ -1127,6 +1135,7 @@ + @@ -1163,7 +1172,6 @@ 3 - Models/Core/UnitCube.mesh @@ -1173,6 +1181,7 @@ + @@ -1217,7 +1226,6 @@ - Models/Core/UnitCube.mesh @@ -1227,6 +1235,7 @@ + @@ -1376,19 +1385,19 @@ - + - true - 1.5712751414989441 + 1.3579803859829696 3.7999999523162842 true + true Models/Weapons/Blue/AssaultWeaponBlue.mesh @@ -1432,7 +1441,7 @@ - + @@ -1441,7 +1450,7 @@ - 0.85439856235552725 + 0.79164215554514783 Models/Characters/Assault/AssaultTPose.mesh @@ -1484,7 +1493,7 @@ - + @@ -1494,12 +1503,12 @@ - true - 0.85439856235552725 + 0.79164215554514783 true + true Models/Characters/Assault/AssaultAnimated.mesh @@ -1542,21 +1551,21 @@ - + - true - 7.5223549108000043 + 7.7876951610054306 10 3 true + true Models/Core/UnitSphere.mesh @@ -1600,20 +1609,20 @@ - + - true - 0.39702717854592606 - true + 2.6357521906414902 5 true + true + true Models/Assault.mesh @@ -1791,12 +1800,12 @@ - true - 1.5712751414989441 + 1.3579803859829696 3.7999999523162842 true + true Models/AssaultWeaponRed.mesh @@ -1939,8 +1948,9 @@ - Textures/Props/FoliageDiff.png + Models/Core/UnitQuad.mesh + Textures/Props/FoliageDiff.png @@ -1949,8 +1959,9 @@ - Textures/Props/FoliageDiff.png + Models/Core/UnitQuad.mesh + Textures/Props/FoliageDiff.png @@ -1970,8 +1981,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -1988,8 +2000,9 @@ 2 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -2004,8 +2017,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -2022,8 +2036,9 @@ 3 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -2038,8 +2053,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -2057,8 +2073,9 @@ 4 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -2073,8 +2090,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -2091,8 +2109,9 @@ 1 - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -2107,8 +2126,9 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -2124,8 +2144,9 @@ - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon_Rotated.png @@ -2173,7 +2194,7 @@ - + @@ -2203,8 +2224,9 @@ - Textures/Core/ErrorTexture.png + Models/Core/UnitQuad.mesh + Textures/Core/ErrorTexture.png @@ -2215,8 +2237,9 @@ - Textures/Core/White.png + Models/Core/UnitQuad.mesh + Textures/Core/White.png @@ -2244,8 +2267,9 @@ - Textures/Core/White.png + Models/Core/UnitQuad.mesh + Textures/Core/White.png @@ -2273,8 +2297,9 @@ - Textures/Core/White.png + Models/Core/UnitQuad.mesh + Textures/Core/White.png @@ -2302,8 +2327,9 @@ - Textures/Core/White.png + Models/Core/UnitQuad.mesh + Textures/Core/White.png @@ -2331,8 +2357,9 @@ - Textures/Core/White.png + Models/Core/UnitQuad.mesh + Textures/Core/White.png @@ -2373,9 +2400,10 @@ + Models/Core/UnitQuad.mesh + Textures/Core/ErrorTexture.png true - @@ -2387,8 +2415,9 @@ - Textures/Core/White.png + Models/Core/UnitQuad.mesh + Textures/Core/White.png false @@ -2418,8 +2447,9 @@ - Textures/Core/White.png + Models/Core/UnitQuad.mesh + Textures/Core/White.png false @@ -2449,8 +2479,9 @@ - Textures/Core/White.png + Models/Core/UnitQuad.mesh + Textures/Core/White.png @@ -2478,8 +2509,9 @@ - Textures/Core/White.png + Models/Core/UnitQuad.mesh + Textures/Core/White.png diff --git a/resources/Schema/Entities/RayBlue.xml b/resources/Schema/Entities/RayBlue.xml index 64ff3619..c358a4d5 100644 --- a/resources/Schema/Entities/RayBlue.xml +++ b/resources/Schema/Entities/RayBlue.xml @@ -3,25 +3,26 @@ - 10 + 0.079999998211860657 - - - + - Textures/Effects/Ray.png + Models/Core/UnitQuad.mesh - + Textures/Effects/NewRay5.png + + true + true - + @@ -29,14 +30,17 @@ - Textures/Effects/Ray.png + Models/Core/UnitQuad.mesh - + Textures/Effects/NewRay5.png + + true + true - + diff --git a/resources/Schema/Entities/WeaponAssaultBlueView.xml b/resources/Schema/Entities/WeaponAssaultBlueView.xml index 520c9906..6d7e6fa0 100644 --- a/resources/Schema/Entities/WeaponAssaultBlueView.xml +++ b/resources/Schema/Entities/WeaponAssaultBlueView.xml @@ -91,23 +91,11 @@ Models/Weapons/Blue/AssaultWeaponBlue.mesh - - + + - - - - Schema/Entities/RayBlue.xml - - - - - - - - @@ -117,6 +105,38 @@ + + + + + + + + + + + + Schema/Entities/MuzzleFlashBlue.xml + + + + + + + + + + + Schema/Entities/RayBlue.xml + + + + + + + + + @@ -127,17 +147,18 @@ true - - - + + + - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd index 2d24590c..363f65e7 100644 --- a/resources/Schema/Types/Entity.xsd +++ b/resources/Schema/Types/Entity.xsd @@ -72,6 +72,7 @@ + diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 74cc5fe8..359f0b57 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -41,6 +41,7 @@ #include "Game/Systems/ServerListSystem.h" #include "Game/Systems/StartSystem.h" #include "Game/Systems/EndScreenSystem.h" +#include "Game/Systems/FadeOutSystem.h" #include "Rendering/TextureSprite.h" diff --git a/src/Game/Systems/FadeOutSystem.cpp b/src/Game/Systems/FadeOutSystem.cpp new file mode 100644 index 00000000..96a11b83 --- /dev/null +++ b/src/Game/Systems/FadeOutSystem.cpp @@ -0,0 +1,19 @@ +#include "Systems/FadeOutSystem.h" + +void FadeOutSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFadeOut, double dt) +{ + //if (dt == 0.0) { + // return; + //} + + //if (!entity.Valid()) { + // return; + //} + + //double& lifetime = cLifetime["Lifetime"]; + //lifetime -= dt; + + //if (lifetime <= 0.0) { + // m_Deletions.push_back(entity); + //} +} \ No newline at end of file diff --git a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp index 0662cbaa..ca53ce0f 100644 --- a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp @@ -198,6 +198,46 @@ void AssaultWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi magAmmo -= 1; } + // Get weapon model based on current person + EntityWrapper weaponModelEntity = getRelevantWeaponEntity(wi); + if (!weaponModelEntity.Valid()) { + return; + } + + // Tracer + EntityWrapper tracerSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzleRay"); + if (tracerSpawner.Valid()) { + glm::vec3 origin = Transform::AbsolutePosition(tracerSpawner); + glm::vec3 direction = glm::quat(Transform::AbsoluteOrientationEuler(tracerSpawner)) * glm::vec3(0, 0, -1); + float distance = traceRayDistance(origin, direction); + EntityWrapper ray = SpawnerSystem::Spawn(tracerSpawner, tracerSpawner); + if (ray.Valid()) { + ((glm::vec3&)ray["Transform"]["Scale"]).z = distance; + } + } + //MuzzleFlash + EntityWrapper muzzleFlashSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzleFlash"); + if (muzzleFlashSpawner.Valid()) { + std::uniform_real_distribution randomSpreadAngle(0.f, 3.1415f*2); + EntityWrapper flash = SpawnerSystem::Spawn(muzzleFlashSpawner, muzzleFlashSpawner); + if (flash.Valid()) { + ((glm::vec3&)flash["Transform"]["Orientation"]).z = randomSpreadAngle(m_RandomEngine); + } + } + + // Deal damage + if (dealDamage(cWeapon, wi)) { + // Show hit marker + EntityWrapper hitMarkerSpawner = wi.Player.FirstChildByName("HitMarkerSpawner"); + if (hitMarkerSpawner.Valid()) { + SpawnerSystem::Spawn(hitMarkerSpawner, hitMarkerSpawner); + Events::PlaySoundOnEntity e; + e.EmitterID = wi.Player.ID; + e.FilePath = "Audio/weapon/hitclick.wav"; + m_EventBroker->Publish(e); + } + } + // View punch if (IsClient) { EntityWrapper camera = wi.Player.FirstChildByName("Camera"); @@ -216,37 +256,6 @@ void AssaultWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi } } } - - // Get weapon model based on current person - EntityWrapper weaponModelEntity = getRelevantWeaponEntity(wi); - if (!weaponModelEntity.Valid()) { - return; - } - - // Tracer - EntityWrapper tracerSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzle"); - if (tracerSpawner.Valid()) { - glm::vec3 origin = Transform::AbsolutePosition(tracerSpawner); - glm::vec3 direction = glm::quat(Transform::AbsoluteOrientationEuler(tracerSpawner)) * glm::vec3(0, 0, -1); - float distance = traceRayDistance(origin, direction); - EntityWrapper ray = SpawnerSystem::Spawn(tracerSpawner); - if (ray.Valid()) { - ((glm::vec3&)ray["Transform"]["Scale"]).z = distance; - } - } - - // Deal damage - if (dealDamage(cWeapon, wi)) { - // Show hit marker - EntityWrapper hitMarkerSpawner = wi.Player.FirstChildByName("HitMarkerSpawner"); - if (hitMarkerSpawner.Valid()) { - SpawnerSystem::Spawn(hitMarkerSpawner, hitMarkerSpawner); - Events::PlaySoundOnEntity e; - e.EmitterID = wi.Player.ID; - e.FilePath = "Audio/weapon/hitclick.wav"; - m_EventBroker->Publish(e); - } - } // Play animation playAnimationAndReturn(wi.FirstPersonEntity, "ActionBlend", "Fire"); From bbe61f300cd8c5aed5feb57ba9bf440e8b2feb42 Mon Sep 17 00:00:00 2001 From: Tleety Date: Sun, 13 Mar 2016 02:03:49 +0100 Subject: [PATCH 21/61] Fade in/out should now work with models and sprites --- include/Engine/Core/System.h | 2 +- .../Systems/{FadeOutSystem.h => FadeSystem.h} | 11 +++--- resources/Schema/Components.xsd | 2 +- resources/Schema/Components/Fade.xml | 6 +++ resources/Schema/Components/Fade.xsd | 17 +++++++++ resources/Schema/Components/FadeOut.xml | 4 -- resources/Schema/Components/FadeOut.xsd | 13 ------- resources/Schema/Types/Entity.xsd | 2 +- src/Game/Game.cpp | 3 +- src/Game/Systems/FadeOutSystem.cpp | 19 ---------- src/Game/Systems/FadeSystem.cpp | 37 +++++++++++++++++++ 11 files changed, 71 insertions(+), 45 deletions(-) rename include/Game/Systems/{FadeOutSystem.h => FadeSystem.h} (54%) create mode 100644 resources/Schema/Components/Fade.xml create mode 100644 resources/Schema/Components/Fade.xsd delete mode 100644 resources/Schema/Components/FadeOut.xml delete mode 100644 resources/Schema/Components/FadeOut.xsd delete mode 100644 src/Game/Systems/FadeOutSystem.cpp create mode 100644 src/Game/Systems/FadeSystem.cpp diff --git a/include/Engine/Core/System.h b/include/Engine/Core/System.h index 1ca1c824..8077fcc7 100644 --- a/include/Engine/Core/System.h +++ b/include/Engine/Core/System.h @@ -68,7 +68,7 @@ protected: const std::string m_ComponentType; - virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt) = 0; + virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFade, double dt) = 0; }; class ImpureSystem : public virtual System diff --git a/include/Game/Systems/FadeOutSystem.h b/include/Game/Systems/FadeSystem.h similarity index 54% rename from include/Game/Systems/FadeOutSystem.h rename to include/Game/Systems/FadeSystem.h index a327577d..e2e930df 100644 --- a/include/Game/Systems/FadeOutSystem.h +++ b/include/Game/Systems/FadeSystem.h @@ -1,14 +1,15 @@ -#ifndef FadeOutSystem_h__ -#define FadeOutSystem_h__ +#ifndef FadeSystem_h__ +#define FadeSystem_h__ #include "Core/System.h" +#include "GLM.h" -class FadeOutSystem : public PureSystem +class FadeSystem : public PureSystem { public: - FadeOutSystem(SystemParams params) + FadeSystem(SystemParams params) : System(params) - , PureSystem("FadeOut") + , PureSystem("Fade") { } diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index a57f55a7..aa303da9 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -69,5 +69,5 @@ - + \ No newline at end of file diff --git a/resources/Schema/Components/Fade.xml b/resources/Schema/Components/Fade.xml new file mode 100644 index 00000000..6a8ac525 --- /dev/null +++ b/resources/Schema/Components/Fade.xml @@ -0,0 +1,6 @@ + + + 1 + + true + \ No newline at end of file diff --git a/resources/Schema/Components/Fade.xsd b/resources/Schema/Components/Fade.xsd new file mode 100644 index 00000000..b0c5152a --- /dev/null +++ b/resources/Schema/Components/Fade.xsd @@ -0,0 +1,17 @@ + + + + + + + + + + + + If the entity should fade out or in. + + + + + \ No newline at end of file diff --git a/resources/Schema/Components/FadeOut.xml b/resources/Schema/Components/FadeOut.xml deleted file mode 100644 index f322d1b7..00000000 --- a/resources/Schema/Components/FadeOut.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 0 - \ No newline at end of file diff --git a/resources/Schema/Components/FadeOut.xsd b/resources/Schema/Components/FadeOut.xsd deleted file mode 100644 index d5c240d6..00000000 --- a/resources/Schema/Components/FadeOut.xsd +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd index 363f65e7..9da41687 100644 --- a/resources/Schema/Types/Entity.xsd +++ b/resources/Schema/Types/Entity.xsd @@ -72,7 +72,7 @@ - + diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 359f0b57..a9d3f2d5 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -41,7 +41,7 @@ #include "Game/Systems/ServerListSystem.h" #include "Game/Systems/StartSystem.h" #include "Game/Systems/EndScreenSystem.h" -#include "Game/Systems/FadeOutSystem.h" +#include "Game/Systems/FadeSystem.h" #include "Rendering/TextureSprite.h" @@ -160,6 +160,7 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(updateOrderLevel, m_Renderer); m_SystemPipeline->AddSystem(updateOrderLevel); m_SystemPipeline->AddSystem(updateOrderLevel); + m_SystemPipeline->AddSystem(updateOrderLevel); // Populate Octree with collidables ++updateOrderLevel; m_SystemPipeline->AddSystem(updateOrderLevel, m_OctreeCollision, "Collidable"); diff --git a/src/Game/Systems/FadeOutSystem.cpp b/src/Game/Systems/FadeOutSystem.cpp deleted file mode 100644 index 96a11b83..00000000 --- a/src/Game/Systems/FadeOutSystem.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "Systems/FadeOutSystem.h" - -void FadeOutSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFadeOut, double dt) -{ - //if (dt == 0.0) { - // return; - //} - - //if (!entity.Valid()) { - // return; - //} - - //double& lifetime = cLifetime["Lifetime"]; - //lifetime -= dt; - - //if (lifetime <= 0.0) { - // m_Deletions.push_back(entity); - //} -} \ No newline at end of file diff --git a/src/Game/Systems/FadeSystem.cpp b/src/Game/Systems/FadeSystem.cpp new file mode 100644 index 00000000..f71bd316 --- /dev/null +++ b/src/Game/Systems/FadeSystem.cpp @@ -0,0 +1,37 @@ +#include "Systems/FadeSystem.h" + +void FadeSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFade, double dt) +{ + double dTime = dt; + if (dTime == 0.0) { + return; + } + + if (!entity.Valid()) { + return; + } + + if (!(bool)cFade["Out"]) { + dTime *= -1; + } + + double fadeTime = cFade["FadeTime"]; + double& currentTime = cFade["Time"]; + currentTime += dTime; + + if(currentTime > fadeTime) { + currentTime = 0.0; + } + if(currentTime < 0.0) { + currentTime = fadeTime; + } + double ratio = currentTime/fadeTime; + + if(entity.HasComponent("Model")){ + ((glm::vec4&)entity["Model"]["Color"]).a = ratio; + } + if (entity.HasComponent("Sprite")) { + ((glm::vec4&)entity["Sprite"]["Color"]).a = ratio; + + } +} \ No newline at end of file From 8d809f30f7196f806c1e8a63a3e67b051c8d70dc Mon Sep 17 00:00:00 2001 From: Tleety Date: Sun, 13 Mar 2016 02:25:11 +0100 Subject: [PATCH 22/61] Muzzleflash now very nice --- resources/Schema/Components/Fade.xml | 1 + resources/Schema/Components/Fade.xsd | 3 ++ resources/Schema/Entities/MuzzleFlashBlue.xml | 34 ++++++++++++++++++- src/Game/Systems/FadeSystem.cpp | 12 +++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/resources/Schema/Components/Fade.xml b/resources/Schema/Components/Fade.xml index 6a8ac525..94c942ca 100644 --- a/resources/Schema/Components/Fade.xml +++ b/resources/Schema/Components/Fade.xml @@ -3,4 +3,5 @@ 1 true + false \ No newline at end of file diff --git a/resources/Schema/Components/Fade.xsd b/resources/Schema/Components/Fade.xsd index b0c5152a..9c638258 100644 --- a/resources/Schema/Components/Fade.xsd +++ b/resources/Schema/Components/Fade.xsd @@ -11,6 +11,9 @@ If the entity should fade out or in. + + If the entity should reverse the fade after finishing, this will double the speed. + diff --git a/resources/Schema/Entities/MuzzleFlashBlue.xml b/resources/Schema/Entities/MuzzleFlashBlue.xml index f984f6bc..840a2365 100644 --- a/resources/Schema/Entities/MuzzleFlashBlue.xml +++ b/resources/Schema/Entities/MuzzleFlashBlue.xml @@ -3,7 +3,7 @@ - 0.039999999105930328 + 0.08 @@ -16,6 +16,10 @@ + + 0.08 + true + 2 Models/Effects/MuzzleFlash/Blue/Cone1Outside.mesh @@ -28,6 +32,10 @@ + + 0.08 + true + 2 Models/Effects/MuzzleFlash/Blue/Cone1Inside.mesh @@ -49,6 +57,10 @@ + + 0.08 + true + 2 Models/Effects/MuzzleFlash/Blue/Cone2Inside.mesh @@ -61,6 +73,10 @@ + + 0.08 + true + 2 Models/Effects/MuzzleFlash/Blue/Cone2Outside.mesh @@ -82,6 +98,10 @@ + + 0.08 + true + 2 Models/Effects/MuzzleFlash/Blue/PlaneLeft.mesh @@ -94,6 +114,10 @@ + + 0.08 + true + 2 Models/Effects/MuzzleFlash/Blue/PlaneRight.mesh @@ -106,6 +130,10 @@ + + 0.08 + true + 2 Models/Effects/MuzzleFlash/Blue/PlaneUp.mesh @@ -118,6 +146,10 @@ + + 0.08 + true + 2 Models/Effects/MuzzleFlash/Blue/PlaneDown.mesh diff --git a/src/Game/Systems/FadeSystem.cpp b/src/Game/Systems/FadeSystem.cpp index f71bd316..0ed98ddb 100644 --- a/src/Game/Systems/FadeSystem.cpp +++ b/src/Game/Systems/FadeSystem.cpp @@ -15,15 +15,27 @@ void FadeSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFade, dTime *= -1; } + if((bool)cFade["Reverse"]) { + dTime *= 2; + } + double fadeTime = cFade["FadeTime"]; double& currentTime = cFade["Time"]; currentTime += dTime; if(currentTime > fadeTime) { currentTime = 0.0; + if ((bool)cFade["Reverse"]) { + (bool&)cFade["Out"] = !(bool)cFade["Out"]; + currentTime = fadeTime; + } } if(currentTime < 0.0) { currentTime = fadeTime; + if ((bool)cFade["Reverse"]) { + (bool&)cFade["Out"] = !(bool)cFade["Out"]; + currentTime = 0.0; + } } double ratio = currentTime/fadeTime; From 60c6aa24868c8652a6604dd865059097dfe3851f Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 02:35:02 +0100 Subject: [PATCH 23/61] Defender first person tracers done --- .../Systems/Weapon/DefenderWeaponBehaviour.h | 1 + .../Entities/WeaponDefenderBlueView.xml | 2 +- .../Weapon/DefenderWeaponBehaviour.cpp | 35 +++++++++++++------ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h index 9244bb60..51f9c2cd 100644 --- a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h @@ -5,6 +5,7 @@ #include "Collision/Collision.h" #include "Core/EPlayerDamage.h" #include "Sound/EPlaySoundOnEntity.h" +#include class DefenderWeaponBehaviour : public WeaponBehaviour { diff --git a/resources/Schema/Entities/WeaponDefenderBlueView.xml b/resources/Schema/Entities/WeaponDefenderBlueView.xml index fac92111..2bcdbcb7 100644 --- a/resources/Schema/Entities/WeaponDefenderBlueView.xml +++ b/resources/Schema/Entities/WeaponDefenderBlueView.xml @@ -166,7 +166,7 @@ Schema/Entities/RayBlue.xml - + diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index f33eea26..442be142 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -359,26 +359,41 @@ void DefenderWeaponBehaviour::spawnTracers(ComponentWrapper cWeapon, WeaponInfo& return; } + EntityWrapper camera = wi.Player.FirstChildByName("Camera"); + if (!camera.Valid()) { + return; + } + float spreadAngle = glm::radians((float)cWeapon["SpreadAngle"]); for (auto& pellet : pattern) { - glm::quat pelletRotation = glm::quat(Transform::AbsoluteOrientationEuler(wi.Player.FirstChildByName("Camera"))) * glm::quat(glm::vec3(pellet.y, pellet.x, 0) * spreadAngle); - glm::vec3 origin = Transform::AbsolutePosition(wi.Player.FirstChildByName("Camera")); + glm::quat pelletRotation = glm::quat(Transform::AbsoluteOrientationEuler(camera)) * glm::quat(glm::vec3(pellet.y, pellet.x, 0) * spreadAngle); + glm::vec3 cameraPosition = Transform::AbsolutePosition(camera); glm::vec3 direction = pelletRotation * glm::vec3(0, 0, -1); - float distance = traceRayDistance(origin, direction); - // Collision::EntityFirstHitByRay(Ray(origin, direction), m_CollisionOctree, distance, pos); + float distance; + glm::vec3 hitPosition; + Collision::EntityFirstHitByRay(Ray(cameraPosition, direction), m_CollisionOctree, distance, hitPosition); EntityWrapper ray = SpawnerSystem::Spawn(muzzle); if (ray.Valid()) { ComponentWrapper cTransform = ray["Transform"]; - glm::vec3& position = cTransform["Position"]; - glm::vec3& orientation = cTransform["Orientation"]; - glm::vec3& scale = cTransform["Scale"]; + glm::vec3& rayOrigin = cTransform["Position"]; + glm::vec3& rayOrientation = cTransform["Orientation"]; + glm::vec3& rayScale = cTransform["Scale"]; - position = Transform::AbsolutePosition(wi.Player.FirstChildByName("Camera")); - orientation = glm::eulerAngles(pelletRotation); - scale.z = distance; + glm::vec3 muzzlePosition = Transform::AbsolutePosition(muzzle); + glm::quat muzzleOrientation = Transform::AbsoluteOrientation(muzzle); + + rayOrigin = muzzlePosition; + + glm::vec3 muzzleToHit = hitPosition - muzzlePosition; + glm::vec3 lookVector = glm::normalize(-muzzleToHit); + float pitch = std::asin(-lookVector.y); + float yaw = std::atan2(lookVector.x, lookVector.z); + glm::quat orientation = glm::quat(glm::vec3(pitch, yaw, 0)); + rayOrientation = glm::eulerAngles(orientation); + rayScale.z = glm::length(muzzleToHit); } } } From bfb7a4139d5ac5719f572b6f6d7c6078cfc4b8ef Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 13:41:28 +0100 Subject: [PATCH 24/61] Tweaking --- .../Systems/Weapon/AssaultWeaponBehaviour.h | 1 - .../Systems/Weapon/SidearmWeaponBehaviour.h | 1 + resources/Schema/Entities/DefenderRayBlue.xml | 50 +++++++++++++++++++ .../Schema/Entities/PlayerDefenderBlue.xml | 6 ++- .../Entities/WeaponDefenderBlueView.xml | 2 +- .../Entities/WeaponDefenderBlueWorld.xml | 2 +- .../Entities/WeaponSidearmAssaultBlueView.xml | 2 +- .../Weapon/DefenderWeaponBehaviour.cpp | 43 ++++++++-------- .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 45 +++++++++++++++++ 9 files changed, 126 insertions(+), 26 deletions(-) create mode 100644 resources/Schema/Entities/DefenderRayBlue.xml diff --git a/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h b/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h index d577e22f..3e019268 100644 --- a/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h @@ -31,7 +31,6 @@ private: // Weapon functions void fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi); - //void dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, glm::vec3 direction, double damage); bool canFire(ComponentWrapper cWeapon, WeaponInfo& wi); bool dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi); diff --git a/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h b/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h index 3123b460..7eaca082 100644 --- a/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h @@ -39,6 +39,7 @@ private: bool dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi); // void giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, EntityWrapper receiver); + void spawnTracer(ComponentWrapper cWeapon, WeaponInfo& wi); void CheckAmmo(ComponentWrapper cWeapon, WeaponInfo& wi); void RemoveFrindlyAmmoHUD(WeaponInfo& wi); diff --git a/resources/Schema/Entities/DefenderRayBlue.xml b/resources/Schema/Entities/DefenderRayBlue.xml new file mode 100644 index 00000000..7680f1da --- /dev/null +++ b/resources/Schema/Entities/DefenderRayBlue.xml @@ -0,0 +1,50 @@ + + + + + + 0.5 + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/NewRay3.png + + true + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/NewRay3.png + + true + + + + + + + + + + + + diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index c75f50fd..25fc54d2 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -13,9 +13,13 @@ + 120 8 + 5 - + + 10 + 150 150 diff --git a/resources/Schema/Entities/WeaponDefenderBlueView.xml b/resources/Schema/Entities/WeaponDefenderBlueView.xml index 2bcdbcb7..8c8da6a3 100644 --- a/resources/Schema/Entities/WeaponDefenderBlueView.xml +++ b/resources/Schema/Entities/WeaponDefenderBlueView.xml @@ -163,7 +163,7 @@ - Schema/Entities/RayBlue.xml + Schema/Entities/DefenderRayBlue.xml diff --git a/resources/Schema/Entities/WeaponDefenderBlueWorld.xml b/resources/Schema/Entities/WeaponDefenderBlueWorld.xml index 6c750964..bf87a789 100644 --- a/resources/Schema/Entities/WeaponDefenderBlueWorld.xml +++ b/resources/Schema/Entities/WeaponDefenderBlueWorld.xml @@ -12,7 +12,7 @@ - Schema/Entities/RayBlue.xml + Schema/Entities/DefenderRayBlue.xml diff --git a/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml b/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml index 620d9416..0d7e2172 100644 --- a/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml +++ b/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml @@ -97,7 +97,7 @@ - Schema/Entities/Ray2Red.xml + Schema/Entities/RayBlue.xml diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index 442be142..0686aebf 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -373,27 +373,28 @@ void DefenderWeaponBehaviour::spawnTracers(ComponentWrapper cWeapon, WeaponInfo& float distance; glm::vec3 hitPosition; - Collision::EntityFirstHitByRay(Ray(cameraPosition, direction), m_CollisionOctree, distance, hitPosition); + if (Collision::EntityFirstHitByRay(Ray(cameraPosition, direction), m_CollisionOctree, distance, hitPosition) != boost::none) { // don't spawn ray if you "miss the world" - EntityWrapper ray = SpawnerSystem::Spawn(muzzle); - if (ray.Valid()) { - ComponentWrapper cTransform = ray["Transform"]; - glm::vec3& rayOrigin = cTransform["Position"]; - glm::vec3& rayOrientation = cTransform["Orientation"]; - glm::vec3& rayScale = cTransform["Scale"]; + EntityWrapper ray = SpawnerSystem::Spawn(muzzle); + if (ray.Valid()) { + ComponentWrapper cTransform = ray["Transform"]; + glm::vec3& rayOrigin = cTransform["Position"]; + glm::vec3& rayOrientation = cTransform["Orientation"]; + glm::vec3& rayScale = cTransform["Scale"]; - glm::vec3 muzzlePosition = Transform::AbsolutePosition(muzzle); - glm::quat muzzleOrientation = Transform::AbsoluteOrientation(muzzle); - - rayOrigin = muzzlePosition; + glm::vec3 muzzlePosition = Transform::AbsolutePosition(muzzle); + glm::quat muzzleOrientation = Transform::AbsoluteOrientation(muzzle); - glm::vec3 muzzleToHit = hitPosition - muzzlePosition; - glm::vec3 lookVector = glm::normalize(-muzzleToHit); - float pitch = std::asin(-lookVector.y); - float yaw = std::atan2(lookVector.x, lookVector.z); - glm::quat orientation = glm::quat(glm::vec3(pitch, yaw, 0)); - rayOrientation = glm::eulerAngles(orientation); - rayScale.z = glm::length(muzzleToHit); + rayOrigin = muzzlePosition; + + glm::vec3 muzzleToHit = hitPosition - muzzlePosition; + glm::vec3 lookVector = glm::normalize(-muzzleToHit); + float pitch = std::asin(-lookVector.y); + float yaw = std::atan2(lookVector.x, lookVector.z); + glm::quat orientation = glm::quat(glm::vec3(pitch, yaw, 0)); + rayOrientation = glm::eulerAngles(orientation); + rayScale.z = glm::length(muzzleToHit); + } } } } @@ -448,8 +449,8 @@ void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& w } // Temp hit decal - EntityWrapper hit = ResourceManager::Load("Schema/Entities/HitTest.xml")->MergeInto(m_World); - hit["Transform"]["Position"] = pick.Position; + // EntityWrapper hit = ResourceManager::Load("Schema/Entities/HitTest.xml")->MergeInto(m_World); + // hit["Transform"]["Position"] = pick.Position; // Don't let us shoot ourselves in the foot somehow if (victim == LocalPlayer) { @@ -471,7 +472,7 @@ void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& w } damageSum[victim] += pelletDamage; - ((glm::vec3&)hit["Model"]["Color"]).b = 1.f; + // ((glm::vec3&)hit["Model"]["Color"]).b = 1.f; } // Deal damage! diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index 1364894d..c9272127 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -321,6 +321,8 @@ bool SidearmWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi } } + spawnTracer(cWeapon, wi); + // Deal damage! Events::PlayerDamage ePlayerDamage; ePlayerDamage.Inflictor = wi.Player; @@ -330,6 +332,49 @@ bool SidearmWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi return damage > 0; } + +void SidearmWeaponBehaviour::spawnTracer(ComponentWrapper cWeapon, WeaponInfo& wi) +{ + EntityWrapper muzzle = getRelevantWeaponEntity(wi).FirstChildByName("WeaponMuzzle"); + if (!muzzle.Valid()) { + return; + } + + EntityWrapper camera = wi.Player.FirstChildByName("Camera"); + if (!camera.Valid()) { + return; + } + + glm::vec3 cameraPosition = Transform::AbsolutePosition(camera); + glm::vec3 direction = glm::vec3(0, 0, -1); + + float distance; + glm::vec3 hitPosition; + Collision::EntityFirstHitByRay(Ray(cameraPosition, direction), m_CollisionOctree, distance, hitPosition); + + EntityWrapper ray = SpawnerSystem::Spawn(muzzle); + if (ray.Valid()) { + ComponentWrapper cTransform = ray["Transform"]; + glm::vec3& rayOrigin = cTransform["Position"]; + glm::vec3& rayOrientation = cTransform["Orientation"]; + glm::vec3& rayScale = cTransform["Scale"]; + + glm::vec3 muzzlePosition = Transform::AbsolutePosition(muzzle); + glm::quat muzzleOrientation = Transform::AbsoluteOrientation(muzzle); + + rayOrigin = muzzlePosition; + + glm::vec3 muzzleToHit = hitPosition - muzzlePosition; + glm::vec3 lookVector = glm::normalize(-muzzleToHit); + float pitch = std::asin(-lookVector.y); + float yaw = std::atan2(lookVector.x, lookVector.z); + glm::quat orientation = glm::quat(glm::vec3(pitch, yaw, 0)); + rayOrientation = glm::eulerAngles(orientation); + rayScale.z = glm::length(muzzleToHit); + } + +} + /* void SidearmWeaponBehaviour::giveAmmo(ComponentWrapper cWeapon, WeaponInfo& wi, EntityWrapper receiver) From 0f4f32188c28ec2713f357c072b9083eecf6112a Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 14:55:29 +0100 Subject: [PATCH 25/61] assault weapon now reloading correctly --- src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp index ca53ce0f..089443a3 100644 --- a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp @@ -36,8 +36,11 @@ void AssaultWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& int& magSize = cWeapon["MagazineSize"]; int& ammo = cWeapon["Ammo"]; - ammo = glm::max(0, ammo - (magSize - magAmmo)); - magAmmo = glm::min(magSize, ammo); + int usedAmmo = glm::max(0, magSize - magAmmo); + magAmmo = glm::clamp(ammo + magAmmo, 0, magSize); + ammo = glm::max(0, ammo - usedAmmo); + + isReloading = false; if (wi.FirstPersonEntity.Valid()) { wi.FirstPersonEntity.FirstChildByName("ViewModel")["Model"]["Visible"] = true; From 7d899a989c5564928008b87196ff5c3ae9ff8bc4 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 15:09:50 +0100 Subject: [PATCH 26/61] Started working on boost HUD thingy --- .../Systems/Weapon/AssaultWeaponBehaviour.h | 4 + .../Schema/Entities/WeaponAssaultBlueView.xml | 20 ++++ .../Systems/Weapon/AssaultWeaponBehaviour.cpp | 96 +++++++++++++++++++ 3 files changed, 120 insertions(+) diff --git a/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h b/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h index 3e019268..231cc020 100644 --- a/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h @@ -36,6 +36,10 @@ private: // Utility //Camera cameraFromEntity(EntityWrapper camera); + + void CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi); + void RemoveBoostCheckHUD(WeaponInfo& wi); + }; #endif \ No newline at end of file diff --git a/resources/Schema/Entities/WeaponAssaultBlueView.xml b/resources/Schema/Entities/WeaponAssaultBlueView.xml index 6d7e6fa0..910fe8b3 100644 --- a/resources/Schema/Entities/WeaponAssaultBlueView.xml +++ b/resources/Schema/Entities/WeaponAssaultBlueView.xml @@ -212,6 +212,26 @@ + + + + Schema/Entities/FriendlyAmmoHUD.xml + + + + + + + + + + + Schema/Entities/AmmoShareEffectView.xml + + + + + diff --git a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp index 089443a3..1af0e927 100644 --- a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp @@ -341,3 +341,99 @@ bool AssaultWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi return damage > 0; } + +void AssaultWeaponBehaviour::CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi) +{ + // Only check ammo client side + if (!IsClient) { + return; + } + + // Only handle ammo check for the local player + if (wi.Player != LocalPlayer) { + return; + } + + // Make sure the player isn't checking from the grave + if (!wi.Player.Valid()) { + return; + } + + // 3D-pick middle of screen + Rectangle viewport = m_Renderer->GetViewportSize(); + glm::vec2 centerScreen(viewport.Width / 2, viewport.Height / 2); + // TODO: Some horizontal spread + PickData pickData = m_Renderer->Pick(centerScreen); + EntityWrapper victim(m_World, pickData.Entity); + if (!victim.Valid()) { + RemoveBoostCheckHUD(wi); + return; + } + + // Don't let us somehow shoot ourselves in the foot + if (victim == LocalPlayer) { + RemoveBoostCheckHUD(wi); + return; + } + + // Only care about players being hit + if (!victim.HasComponent("Player")) { + victim = victim.FirstParentWithComponent("Player"); + } + if (!victim.Valid()) { + RemoveBoostCheckHUD(wi); + return; + } + + + // If friendly fire, reduce damage to 0 (needed to make Boosts, Ammosharing work) + if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { + + EntityWrapper friendlyBoostHudSpawner = wi.FirstPersonPlayerModel.FirstChildByName("FriendlyBoostAttachment"); + if (friendlyBoostHudSpawner.Valid()) { + + auto children = m_World->GetDirectChildren(friendlyBoostHudSpawner.ID); + + if (children.first == children.second) { + if (friendlyBoostHudSpawner.HasComponent("Spawner")) { + EntityWrapper friendlyAmmoHud = SpawnerSystem::Spawn(friendlyBoostHudSpawner, friendlyBoostHudSpawner); + if (friendlyAmmoHud.Valid()) { + EntityWrapper textEntity = friendlyAmmoHud.FirstChildByName("MagazineAmmo"); + if (textEntity.Valid()) { + if (textEntity.HasComponent("Text")) { + // (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + } + } + + EntityWrapper ammoTextEntity = friendlyAmmoHud.FirstChildByName("Ammo"); + if (ammoTextEntity.Valid()) { + if (ammoTextEntity.HasComponent("Text")) { + // (std::string&)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + } + } + } + } + } else { + EntityWrapper textEntity = friendlyBoostHudSpawner.FirstChildByName("MagazineAmmo"); + if (textEntity.Valid()) { + if (textEntity.HasComponent("Text")) { + // (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + } + } + + EntityWrapper ammoTextEntity = friendlyBoostHudSpawner.FirstChildByName("Ammo"); + if (ammoTextEntity.Valid()) { + if (ammoTextEntity.HasComponent("Text")) { + // (std::string&)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + } + } + } + } + } + +} + +void AssaultWeaponBehaviour::RemoveBoostCheckHUD(WeaponInfo& wi) +{ + +} From 04288e52432adaa80e2087a26bec1979d870c6e1 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 16:14:13 +0100 Subject: [PATCH 27/61] Merge fixes --- include/Engine/Rendering/SpriteJob.h | 2 +- src/Game/Systems/AbilityCooldownHUDSystem.cpp | 12 ++-- src/Game/Systems/BoostIconsHUDSystem.cpp | 12 ++-- src/Game/Systems/BoostSystem.cpp | 8 +-- src/Game/Systems/EndScreenSystem.cpp | 24 ++++---- src/Game/Systems/FadeSystem.cpp | 10 ++-- src/Game/Systems/PlayerMovementSystem.cpp | 4 +- .../Systems/Weapon/AssaultWeaponBehaviour.cpp | 14 ++--- .../Weapon/DefenderWeaponBehaviour.cpp | 58 +++++++++--------- .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 60 +++++++++---------- 10 files changed, 102 insertions(+), 102 deletions(-) diff --git a/include/Engine/Rendering/SpriteJob.h b/include/Engine/Rendering/SpriteJob.h index b0c16bd4..2836e050 100644 --- a/include/Engine/Rendering/SpriteJob.h +++ b/include/Engine/Rendering/SpriteJob.h @@ -21,7 +21,7 @@ struct SpriteJob : RenderJob SpriteJob(ComponentWrapper cSprite, Camera* camera, glm::mat4 matrix, World* world, glm::vec4 fillColor, float fillPercentage, bool depthSorted, bool isIndicator) : RenderJob() { - Model = ResourceManager::Load<::Model>((std::string)cSprite["Model"]); + Model = ResourceManager::Load<::Model>(cSprite["Model"]); ::RawModel::MaterialProperties matProp = Model->MaterialGroups().front(); TextureID = 0; diff --git a/src/Game/Systems/AbilityCooldownHUDSystem.cpp b/src/Game/Systems/AbilityCooldownHUDSystem.cpp index 23e9a6b7..c89b4251 100644 --- a/src/Game/Systems/AbilityCooldownHUDSystem.cpp +++ b/src/Game/Systems/AbilityCooldownHUDSystem.cpp @@ -24,28 +24,28 @@ void AbilityCooldownHUDSystem::Update(double dt) if (!abilityEntity.Valid()) { //If we dont have a shield ability, we return, since we cannot do anything. if (entity.HasComponent("Sprite")) { - (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures/Test/aM4ME4GR.png"; + (Field)entity["Sprite"]["DiffuseTexture"] = "Textures/Test/aM4ME4GR.png"; } return; } else { //If we have a shield ability, we set the right icon abilityName = "ShieldAbility"; if (entity.HasComponent("Sprite")) { - (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures/Icons/Abilities/Long/SheildDots-01.png"; + (Field)entity["Sprite"]["DiffuseTexture"] = "Textures/Icons/Abilities/Long/SheildDots-01.png"; } } } else { //If we do have a sprint ability, we change the icon abilityName = "SprintAbility"; if (entity.HasComponent("Sprite")) { - (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures/Icons/Abilities/Long/Dash-01.png"; + (Field)entity["Sprite"]["DiffuseTexture"] = "Textures/Icons/Abilities/Long/Dash-01.png"; } } } else { //If we have a dash ability, we set the icon to the correct one. abilityName = "DashAbility"; if (entity.HasComponent("Sprite")) { - (std::string&)entity["Sprite"]["DiffuseTexture"] = "Textures/Icons/Abilities/Long/Superman-01.png"; + (Field)entity["Sprite"]["DiffuseTexture"] = "Textures/Icons/Abilities/Long/Superman-01.png"; } } @@ -60,7 +60,7 @@ void AbilityCooldownHUDSystem::Update(double dt) if (cooldownTextEntity.Valid()) { if (cooldownTextEntity.HasComponent("Text")) { - std::string t = (std::string&)cooldownTextEntity["Text"]["Content"] = std::to_string(currentAbilityCD).substr(0, 3); + (Field)cooldownTextEntity["Text"]["Content"] = std::to_string(currentAbilityCD).substr(0, 3); } } } @@ -76,7 +76,7 @@ void AbilityCooldownHUDSystem::Update(double dt) } if (entity.HasComponent("Fill")) { - entity["Fill"]["Percentage"] = currentAbilityCD/maxAbilityCD; + (Field)entity["Fill"]["Percentage"] = currentAbilityCD/maxAbilityCD; } diff --git a/src/Game/Systems/BoostIconsHUDSystem.cpp b/src/Game/Systems/BoostIconsHUDSystem.cpp index d151a044..1f0331e2 100644 --- a/src/Game/Systems/BoostIconsHUDSystem.cpp +++ b/src/Game/Systems/BoostIconsHUDSystem.cpp @@ -12,9 +12,9 @@ void BoostIconsHUDSystem::UpdateComponent(EntityWrapper& entity, ComponentWrappe if (assaultEntity.HasComponent("Fill")) { EntityWrapper assaultBoost = player.FirstChildByName("BoostAssault"); if (assaultBoost.Valid()) { - (double&)assaultEntity["Fill"]["Percentage"] = 1.0; + (Field)assaultEntity["Fill"]["Percentage"] = 1.0; } else { - (double&)assaultEntity["Fill"]["Percentage"] = 0.0; + (Field)assaultEntity["Fill"]["Percentage"] = 0.0; } } } @@ -23,9 +23,9 @@ void BoostIconsHUDSystem::UpdateComponent(EntityWrapper& entity, ComponentWrappe if (defenderEntity.HasComponent("Fill")) { EntityWrapper defenderBoost = player.FirstChildByName("BoostDefender"); if (defenderBoost.Valid()) { - (double&)defenderEntity["Fill"]["Percentage"] = 1.0; + (Field)defenderEntity["Fill"]["Percentage"] = 1.0; } else { - (double&)defenderEntity["Fill"]["Percentage"] = 0.0; + (Field)defenderEntity["Fill"]["Percentage"] = 0.0; } } } @@ -34,9 +34,9 @@ void BoostIconsHUDSystem::UpdateComponent(EntityWrapper& entity, ComponentWrappe if (sniperEntity.HasComponent("Fill")) { EntityWrapper sniperBoost = player.FirstChildByName("BoostSniper"); if (sniperBoost.Valid()) { - (double&)sniperEntity["Fill"]["Percentage"] = 1.0; + (Field)sniperEntity["Fill"]["Percentage"] = 1.0; } else { - (double&)sniperEntity["Fill"]["Percentage"] = 0.0; + (Field)sniperEntity["Fill"]["Percentage"] = 0.0; } } } diff --git a/src/Game/Systems/BoostSystem.cpp b/src/Game/Systems/BoostSystem.cpp index b695aa96..ede147c3 100644 --- a/src/Game/Systems/BoostSystem.cpp +++ b/src/Game/Systems/BoostSystem.cpp @@ -81,10 +81,10 @@ void BoostSystem::giveAmmo(EntityWrapper giver, EntityWrapper receiver) { if (receiver.HasComponent("AssaultWeapon")) { int magazineSize = receiver["AssaultWeapon"]["MagazineSize"]; - int& magazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; + Field magazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; int prevMagazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; int maxAmmo = receiver["AssaultWeapon"]["MaxAmmo"]; - int& ammo = receiver["AssaultWeapon"]["Ammo"]; + Field ammo = receiver["AssaultWeapon"]["Ammo"]; int givenAmmo = 3; @@ -97,10 +97,10 @@ void BoostSystem::giveAmmo(EntityWrapper giver, EntityWrapper receiver) } } else if (receiver.HasComponent("DefenderWeapon")) { int magazineSize = receiver["DefenderWeapon"]["MagazineSize"]; - int& magazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; + Field magazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; int prevMagazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; int maxAmmo = receiver["DefenderWeapon"]["MaxAmmo"]; - int& ammo = receiver["DefenderWeapon"]["Ammo"]; + Field ammo = receiver["DefenderWeapon"]["Ammo"]; int givenAmmo = 1; diff --git a/src/Game/Systems/EndScreenSystem.cpp b/src/Game/Systems/EndScreenSystem.cpp index f16adf83..59c261bd 100644 --- a/src/Game/Systems/EndScreenSystem.cpp +++ b/src/Game/Systems/EndScreenSystem.cpp @@ -35,37 +35,37 @@ bool EndScreenSystem::OnWin(const Events::Win& e) if (e.TeamThatWon == 2) { //Red team won if(redSprite.HasComponent("Sprite")) - (bool&)redSprite["Sprite"]["Visible"] = true; + (Field)redSprite["Sprite"]["Visible"] = true; if (redText.HasComponent("Text")) - (bool&)redText["Text"]["Visible"] = true; + (Field)redText["Text"]["Visible"] = true; if (blueSprite.HasComponent("Sprite")) - (bool&)blueSprite["Sprite"]["Visible"] = false; + (Field)blueSprite["Sprite"]["Visible"] = false; if (blueText.HasComponent("Text")) - (bool&)blueText["Text"]["Visible"] = false; + (Field)blueText["Text"]["Visible"] = false; }else if (e.TeamThatWon == 3) { //Blue team won if (redSprite.HasComponent("Sprite")) - (bool&)redSprite["Sprite"]["Visible"] = false; + (Field)redSprite["Sprite"]["Visible"] = false; if (redText.HasComponent("Text")) - (bool&)redText["Text"]["Visible"] = false; + (Field)redText["Text"]["Visible"] = false; if (blueSprite.HasComponent("Sprite")) - (bool&)blueSprite["Sprite"]["Visible"] = true; + (Field)blueSprite["Sprite"]["Visible"] = true; if (blueText.HasComponent("Text")) - (bool&)blueText["Text"]["Visible"] = true; + (Field)blueText["Text"]["Visible"] = true; } else { //No team won? if (redSprite.HasComponent("Sprite")) - (bool&)redSprite["Sprite"]["Visible"] = false; + (Field)redSprite["Sprite"]["Visible"] = false; if (blueSprite.HasComponent("Sprite")) - (bool&)blueSprite["Sprite"]["Visible"] = false; + (Field)blueSprite["Sprite"]["Visible"] = false; if (redText.HasComponent("Text")) - (bool&)redText["Text"]["Visible"] = false; + (Field)redText["Text"]["Visible"] = false; if (blueText.HasComponent("Text")) - (bool&)blueText["Text"]["Visible"] = false; + (Field)blueText["Text"]["Visible"] = false; } } diff --git a/src/Game/Systems/FadeSystem.cpp b/src/Game/Systems/FadeSystem.cpp index 0ed98ddb..5c33f8af 100644 --- a/src/Game/Systems/FadeSystem.cpp +++ b/src/Game/Systems/FadeSystem.cpp @@ -20,30 +20,30 @@ void FadeSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFade, } double fadeTime = cFade["FadeTime"]; - double& currentTime = cFade["Time"]; + Field currentTime = cFade["Time"]; currentTime += dTime; if(currentTime > fadeTime) { currentTime = 0.0; if ((bool)cFade["Reverse"]) { - (bool&)cFade["Out"] = !(bool)cFade["Out"]; + (Field)cFade["Out"] = !(bool)cFade["Out"]; currentTime = fadeTime; } } if(currentTime < 0.0) { currentTime = fadeTime; if ((bool)cFade["Reverse"]) { - (bool&)cFade["Out"] = !(bool)cFade["Out"]; + (Field)cFade["Out"] = !(bool)cFade["Out"]; currentTime = 0.0; } } double ratio = currentTime/fadeTime; if(entity.HasComponent("Model")){ - ((glm::vec4&)entity["Model"]["Color"]).a = ratio; + ((Field)entity["Model"]["Color"]).w(ratio); } if (entity.HasComponent("Sprite")) { - ((glm::vec4&)entity["Sprite"]["Color"]).a = ratio; + ((Field)entity["Sprite"]["Color"]).w(ratio); } } \ No newline at end of file diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index 09da8d41..35a7d3cf 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -84,7 +84,7 @@ void PlayerMovementSystem::updateMovementControllers(double dt) // Limit camera pitch so we don't break our necks cameraOrientation.x(glm::clamp(cameraOrientation.x(), -glm::half_pi(), glm::half_pi())); - float pitch = cameraOrientation.x; + float pitch = cameraOrientation.x(); double time = ((pitch + glm::half_pi()) / glm::pi()); // Set third person model aim pitch @@ -325,7 +325,7 @@ void PlayerMovementSystem::setAim(EntityWrapper root, std::string weaponNodeName EntityWrapper aim = weapon.FirstChildByName("Aim"); if (aim.Valid()) { if (aim.HasComponent("Animation")) { - (double&)aim["Animation"]["Time"] = time; + (Field)aim["Animation"]["Time"] = time; } } } diff --git a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp index 60f69609..ad9caae4 100644 --- a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp @@ -36,9 +36,9 @@ void AssaultWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& Field magSize = cWeapon["MagazineSize"]; Field ammo = cWeapon["Ammo"]; - int usedAmmo = glm::max(0, magSize - magAmmo); - magAmmo = glm::clamp(ammo + magAmmo, 0, magSize); - ammo = glm::max(0, ammo - usedAmmo); + int usedAmmo = glm::max(0, *magSize - *magAmmo); + magAmmo = glm::clamp(*ammo + *magAmmo, 0, *magSize); + ammo = glm::max(0, *ammo - usedAmmo); isReloading = false; @@ -243,7 +243,7 @@ void AssaultWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi std::uniform_real_distribution randomSpreadAngle(0.f, 3.1415f*2); EntityWrapper flash = SpawnerSystem::Spawn(muzzleFlashSpawner, muzzleFlashSpawner); if (flash.Valid()) { - ((glm::vec3&)flash["Transform"]["Orientation"]).z = randomSpreadAngle(m_RandomEngine); + ((Field)flash["Transform"]["Orientation"]).z(randomSpreadAngle(m_RandomEngine)); } } @@ -264,16 +264,16 @@ void AssaultWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi if (IsClient) { EntityWrapper camera = wi.Player.FirstChildByName("Camera"); if (camera.Valid()) { - glm::vec3& cameraOrientation = camera["Transform"]["Orientation"]; + Field cameraOrientation = camera["Transform"]["Orientation"]; float viewPunch = cWeapon["ViewPunch"]; float maxTravelAngle = cWeapon["MaxTravelAngle"]; - float& currentTravel = cWeapon["CurrentTravel"]; + Field currentTravel = cWeapon["CurrentTravel"]; if (currentTravel < maxTravelAngle) { float change = viewPunch; if (currentTravel + change > maxTravelAngle) { change = maxTravelAngle - currentTravel; } - cameraOrientation.x += change; + cameraOrientation.x(cameraOrientation.x() + change); currentTravel += change; } } diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index 0686aebf..39da8399 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -2,7 +2,7 @@ void DefenderWeaponBehaviour::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) { - double& fireCooldown = cWeapon["FireCooldown"]; + Field fireCooldown = cWeapon["FireCooldown"]; fireCooldown = glm::max(0.0, fireCooldown - dt); WeaponBehaviour::UpdateComponent(entity, cWeapon, dt); @@ -11,27 +11,27 @@ void DefenderWeaponBehaviour::UpdateComponent(EntityWrapper& entity, ComponentWr void DefenderWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) { // Decrement reload timer - double& reloadTimer = cWeapon["ReloadTimer"]; + Field reloadTimer = cWeapon["ReloadTimer"]; reloadTimer = glm::max(0.0, reloadTimer - dt); // Start reloading automatically if at 0 mag ammo - int& magAmmo = cWeapon["MagazineAmmo"]; + Field magAmmo = cWeapon["MagazineAmmo"]; if (m_ConfigAutoReload && magAmmo <= 0) { OnReload(cWeapon, wi); } // Handle reloading - bool& isReloading = cWeapon["IsReloading"]; + Field isReloading = cWeapon["IsReloading"]; if (isReloading && reloadTimer <= 0.0) { double reloadTime = cWeapon["ReloadTime"]; - int& magSize = cWeapon["MagazineSize"]; - int& ammo = cWeapon["Ammo"]; + Field magSize = cWeapon["MagazineSize"]; + Field ammo = cWeapon["Ammo"]; if (magAmmo < magSize && ammo > 0) { ammo -= 1; magAmmo += 1; reloadTimer = reloadTime; Events::PlaySoundOnEntity e; - e.EmitterID = wi.Player.ID; + e.Emitter = wi.Player; e.FilePath = "Audio/weapon/Zoom.wav"; m_EventBroker->Publish(e); } else { @@ -52,15 +52,15 @@ void DefenderWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& // Restore view angle if (IsClient) { - float& currentTravel = cWeapon["CurrentTravel"]; - float& returnSpeed = cWeapon["ViewReturnSpeed"]; + Field currentTravel = cWeapon["CurrentTravel"]; + Field returnSpeed = cWeapon["ViewReturnSpeed"]; if (currentTravel > 0) { float change = returnSpeed * dt; currentTravel = glm::max(0.f, currentTravel - change); EntityWrapper camera = wi.Player.FirstChildByName("Camera"); if (camera.Valid()) { - glm::vec3& cameraOrientation = camera["Transform"]["Orientation"]; - cameraOrientation.x -= change; + Field cameraOrientation = camera["Transform"]["Orientation"]; + cameraOrientation.x(cameraOrientation.x() - change); } } } @@ -86,23 +86,23 @@ void DefenderWeaponBehaviour::OnCeasePrimaryFire(ComponentWrapper cWeapon, Weapo void DefenderWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) { - bool& isReloading = cWeapon["IsReloading"]; + Field isReloading = cWeapon["IsReloading"]; if (isReloading) { return; } - int& magAmmo = cWeapon["MagazineAmmo"]; - int& magSize = cWeapon["MagazineSize"]; + Field magAmmo = cWeapon["MagazineAmmo"]; + Field magSize = cWeapon["MagazineSize"]; if (magAmmo >= magSize) { return; } - int& ammo = cWeapon["Ammo"]; + Field ammo = cWeapon["Ammo"]; if (ammo <= 0) { return; } double reloadTime = cWeapon["ReloadTime"]; - double& reloadTimer = cWeapon["ReloadTimer"]; + Field reloadTimer = cWeapon["ReloadTimer"]; // Start reload isReloading = true; @@ -155,7 +155,7 @@ bool DefenderWeaponBehaviour::OnInputCommand(ComponentWrapper cWeapon, WeaponInf if(wi.Player.Valid()) { if(wi.Player.HasComponent("ShieldAbility")) { - (bool&)wi.Player["ShieldAbility"]["Active"] = true; + (Field)wi.Player["ShieldAbility"]["Active"] = true; } } @@ -223,7 +223,7 @@ bool DefenderWeaponBehaviour::OnInputCommand(ComponentWrapper cWeapon, WeaponInf if (wi.Player.Valid()) { if (wi.Player.HasComponent("ShieldAbility")) { - (bool&)wi.Player["ShieldAbility"]["Active"] = false; + (Field)wi.Player["ShieldAbility"]["Active"] = false; } } @@ -285,11 +285,11 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi cWeapon["FireCooldown"] = 60.0 / (double)cWeapon["RPM"]; // Stop reloading - bool& isReloading = cWeapon["IsReloading"]; + Field isReloading = cWeapon["IsReloading"]; isReloading = false; // Ammo - int& magAmmo = cWeapon["MagazineAmmo"]; + Field magAmmo = cWeapon["MagazineAmmo"]; if (magAmmo <= 0) { return; } else { @@ -347,7 +347,7 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi // Sound Events::PlaySoundOnEntity e; - e.EmitterID = wi.Player.ID; + e.Emitter = wi.Player; e.FilePath = "Audio/weapon/Blast.wav"; m_EventBroker->Publish(e); } @@ -367,8 +367,8 @@ void DefenderWeaponBehaviour::spawnTracers(ComponentWrapper cWeapon, WeaponInfo& float spreadAngle = glm::radians((float)cWeapon["SpreadAngle"]); for (auto& pellet : pattern) { - glm::quat pelletRotation = glm::quat(Transform::AbsoluteOrientationEuler(camera)) * glm::quat(glm::vec3(pellet.y, pellet.x, 0) * spreadAngle); - glm::vec3 cameraPosition = Transform::AbsolutePosition(camera); + glm::quat pelletRotation = glm::quat(TransformSystem::AbsoluteOrientationEuler(camera)) * glm::quat(glm::vec3(pellet.y, pellet.x, 0) * spreadAngle); + glm::vec3 cameraPosition = TransformSystem::AbsolutePosition(camera); glm::vec3 direction = pelletRotation * glm::vec3(0, 0, -1); float distance; @@ -378,12 +378,12 @@ void DefenderWeaponBehaviour::spawnTracers(ComponentWrapper cWeapon, WeaponInfo& EntityWrapper ray = SpawnerSystem::Spawn(muzzle); if (ray.Valid()) { ComponentWrapper cTransform = ray["Transform"]; - glm::vec3& rayOrigin = cTransform["Position"]; - glm::vec3& rayOrientation = cTransform["Orientation"]; - glm::vec3& rayScale = cTransform["Scale"]; + Field rayOrigin = cTransform["Position"]; + Field rayOrientation = cTransform["Orientation"]; + Field rayScale = cTransform["Scale"]; - glm::vec3 muzzlePosition = Transform::AbsolutePosition(muzzle); - glm::quat muzzleOrientation = Transform::AbsoluteOrientation(muzzle); + glm::vec3 muzzlePosition = TransformSystem::AbsolutePosition(muzzle); + glm::quat muzzleOrientation = TransformSystem::AbsoluteOrientation(muzzle); rayOrigin = muzzlePosition; @@ -393,7 +393,7 @@ void DefenderWeaponBehaviour::spawnTracers(ComponentWrapper cWeapon, WeaponInfo& float yaw = std::atan2(lookVector.x, lookVector.z); glm::quat orientation = glm::quat(glm::vec3(pitch, yaw, 0)); rayOrientation = glm::eulerAngles(orientation); - rayScale.z = glm::length(muzzleToHit); + rayScale.z(glm::length(muzzleToHit)); } } } diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index c9272127..504130ff 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -2,7 +2,7 @@ void SidearmWeaponBehaviour::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) { - double& cooldown = cWeapon["FireCooldown"]; + Field cooldown = cWeapon["FireCooldown"]; if (cooldown > 0) { cooldown -= dt; if (cooldown < 0) { @@ -17,29 +17,29 @@ void SidearmWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& CheckAmmo(cWeapon, wi); // Start reloading automatically if at 0 mag ammo - int& magAmmo = cWeapon["MagazineAmmo"]; + Field magAmmo = cWeapon["MagazineAmmo"]; if (m_ConfigAutoReload && magAmmo <= 0) { OnReload(cWeapon, wi); } // Only start reloading once we're done firing - bool& reloadQueued = cWeapon["ReloadQueued"]; - double& fireCooldown = cWeapon["FireCooldown"]; - bool& isReloading = cWeapon["IsReloading"]; + Field reloadQueued = cWeapon["ReloadQueued"]; + Field fireCooldown = cWeapon["FireCooldown"]; + Field isReloading = cWeapon["IsReloading"]; if (reloadQueued && fireCooldown <= 0) { reloadQueued = fireCooldown; isReloading = true; } // Decrement reload timer - double& reloadTimer = cWeapon["ReloadTimer"]; + Field reloadTimer = cWeapon["ReloadTimer"]; if (isReloading) { reloadTimer = glm::max(0.0, reloadTimer - dt); } // Handle reloading if (isReloading && reloadTimer <= 0.0) { - int& magSize = cWeapon["MagazineSize"]; + Field magSize = cWeapon["MagazineSize"]; magAmmo = magSize; isReloading = false; @@ -65,7 +65,7 @@ void SidearmWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& if (rootNode.Valid()) { EntityWrapper blend = rootNode.FirstChildByName("MovementBlendSidearm"); if (blend.Valid()) { - (double&)blend["Blend"]["Weight"] = animationWeight; + (Field)blend["Blend"]["Weight"] = animationWeight; } } @@ -90,20 +90,20 @@ void SidearmWeaponBehaviour::OnCeasePrimaryFire(ComponentWrapper cWeapon, Weapon void SidearmWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) { - bool& reloadQueued = cWeapon["ReloadQueued"]; - bool& isReloading = cWeapon["IsReloading"]; + Field reloadQueued = cWeapon["ReloadQueued"]; + Field isReloading = cWeapon["IsReloading"]; if (reloadQueued || isReloading) { return; } - int& magAmmo = cWeapon["MagazineAmmo"]; - int& magSize = cWeapon["MagazineSize"]; + Field magAmmo = cWeapon["MagazineAmmo"]; + Field magSize = cWeapon["MagazineSize"]; if (magAmmo >= magSize) { return; } double reloadTime = cWeapon["ReloadTime"]; - double& reloadTimer = cWeapon["ReloadTimer"]; + Field reloadTimer = cWeapon["ReloadTimer"]; // Start reload reloadQueued = true; @@ -143,7 +143,7 @@ void SidearmWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) // Sound Events::PlaySoundOnEntity e; - e.EmitterID = wi.Player.ID; + e.Emitter = wi.Player; e.FilePath = "Audio/weapon/Assault/AssaultWeaponReload.wav"; m_EventBroker->Publish(e); } @@ -176,7 +176,7 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi cWeapon["FireCooldown"] = 60.0 / (double)cWeapon["RPM"]; // Ammo - int& magAmmo = cWeapon["MagazineAmmo"]; + Field magAmmo = cWeapon["MagazineAmmo"]; if (magAmmo <= 0) { return; } else { @@ -192,12 +192,12 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi // Tracer EntityWrapper tracerSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzle"); if (tracerSpawner.Valid()) { - glm::vec3 origin = Transform::AbsolutePosition(tracerSpawner); - glm::vec3 direction = Transform::AbsoluteOrientation(tracerSpawner) * glm::vec3(0, 0, -1); + glm::vec3 origin = TransformSystem::AbsolutePosition(tracerSpawner); + glm::vec3 direction = TransformSystem::AbsoluteOrientation(tracerSpawner) * glm::vec3(0, 0, -1); float distance = traceRayDistance(origin, direction); EntityWrapper ray = SpawnerSystem::Spawn(tracerSpawner); if (ray.Valid()) { - ((glm::vec3&)ray["Transform"]["Scale"]).z = distance; + ((Field)ray["Transform"]["Scale"]).z(distance); } } @@ -208,7 +208,7 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi if (hitMarkerSpawner.Valid()) { SpawnerSystem::Spawn(hitMarkerSpawner, hitMarkerSpawner); Events::PlaySoundOnEntity e; - e.EmitterID = wi.Player.ID; + e.Emitter = wi.Player; e.FilePath = "Audio/weapon/hitclick.wav"; m_EventBroker->Publish(e); } @@ -345,7 +345,7 @@ void SidearmWeaponBehaviour::spawnTracer(ComponentWrapper cWeapon, WeaponInfo& w return; } - glm::vec3 cameraPosition = Transform::AbsolutePosition(camera); + glm::vec3 cameraPosition = TransformSystem::AbsolutePosition(camera); glm::vec3 direction = glm::vec3(0, 0, -1); float distance; @@ -355,12 +355,12 @@ void SidearmWeaponBehaviour::spawnTracer(ComponentWrapper cWeapon, WeaponInfo& w EntityWrapper ray = SpawnerSystem::Spawn(muzzle); if (ray.Valid()) { ComponentWrapper cTransform = ray["Transform"]; - glm::vec3& rayOrigin = cTransform["Position"]; - glm::vec3& rayOrientation = cTransform["Orientation"]; - glm::vec3& rayScale = cTransform["Scale"]; + Field rayOrigin = cTransform["Position"]; + Field rayOrientation = cTransform["Orientation"]; + Field rayScale = cTransform["Scale"]; - glm::vec3 muzzlePosition = Transform::AbsolutePosition(muzzle); - glm::quat muzzleOrientation = Transform::AbsoluteOrientation(muzzle); + glm::vec3 muzzlePosition = TransformSystem::AbsolutePosition(muzzle); + glm::quat muzzleOrientation = TransformSystem::AbsoluteOrientation(muzzle); rayOrigin = muzzlePosition; @@ -370,7 +370,7 @@ void SidearmWeaponBehaviour::spawnTracer(ComponentWrapper cWeapon, WeaponInfo& w float yaw = std::atan2(lookVector.x, lookVector.z); glm::quat orientation = glm::quat(glm::vec3(pitch, yaw, 0)); rayOrientation = glm::eulerAngles(orientation); - rayScale.z = glm::length(muzzleToHit); + rayScale.z(glm::length(muzzleToHit)); } } @@ -492,14 +492,14 @@ void SidearmWeaponBehaviour::CheckAmmo(ComponentWrapper cWeapon, WeaponInfo& wi) EntityWrapper textEntity = friendlyAmmoHud.FirstChildByName("MagazineAmmo"); if (textEntity.Valid()) { if (textEntity.HasComponent("Text")) { - (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + (Field)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); } } EntityWrapper ammoTextEntity = friendlyAmmoHud.FirstChildByName("Ammo"); if (ammoTextEntity.Valid()) { if (ammoTextEntity.HasComponent("Text")) { - (std::string&)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + (Field)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); } } } @@ -508,14 +508,14 @@ void SidearmWeaponBehaviour::CheckAmmo(ComponentWrapper cWeapon, WeaponInfo& wi) EntityWrapper textEntity = friendlyAmmoHudSpawner.FirstChildByName("MagazineAmmo"); if (textEntity.Valid()) { if (textEntity.HasComponent("Text")) { - (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + (Field)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); } } EntityWrapper ammoTextEntity = friendlyAmmoHudSpawner.FirstChildByName("Ammo"); if (ammoTextEntity.Valid()) { if (ammoTextEntity.HasComponent("Text")) { - (std::string&)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + (Field)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); } } } From 9f752ad3e9baa89c4fc1c5e584b589fbdb67f88a Mon Sep 17 00:00:00 2001 From: Tleety Date: Sun, 13 Mar 2016 16:15:06 +0100 Subject: [PATCH 28/61] Fadesystem, entities, weapon muzzles should now look good. reload for secondary --- resources/Schema/Components/SidearmWeapon.xml | 2 +- resources/Schema/Entities/MovementTest.xml | 733 ++++++++++++++++++ .../Entities/MuzzleFlashSideArmBlue.xml | 219 ++++++ ...DefenderRayBlue.xml => RayAssaultBlue.xml} | 24 +- resources/Schema/Entities/RayDefenderBlue.xml | 50 ++ resources/Schema/Entities/RaySideArmBlue.xml | 53 ++ .../Schema/Entities/WeaponAssaultBlueView.xml | 3 +- .../Entities/WeaponDefenderBlueView.xml | 100 ++- .../Entities/WeaponSidearmAssaultBlueView.xml | 100 ++- .../WeaponSidearmDefenderBlueView.xml | 100 ++- .../WeaponSidearmReloadEffectView.xml | 27 +- src/Game/Systems/FadeSystem.cpp | 2 +- .../Weapon/DefenderWeaponBehaviour.cpp | 11 +- .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 17 +- 14 files changed, 1300 insertions(+), 141 deletions(-) create mode 100644 resources/Schema/Entities/MuzzleFlashSideArmBlue.xml rename resources/Schema/Entities/{DefenderRayBlue.xml => RayAssaultBlue.xml} (65%) create mode 100644 resources/Schema/Entities/RayDefenderBlue.xml create mode 100644 resources/Schema/Entities/RaySideArmBlue.xml diff --git a/resources/Schema/Components/SidearmWeapon.xml b/resources/Schema/Components/SidearmWeapon.xml index 968306a6..a41bc201 100644 --- a/resources/Schema/Components/SidearmWeapon.xml +++ b/resources/Schema/Components/SidearmWeapon.xml @@ -7,7 +7,7 @@ 500 false 0.01 - 0.5 + 1.0 0.5 false 0 diff --git a/resources/Schema/Entities/MovementTest.xml b/resources/Schema/Entities/MovementTest.xml index b4db78d9..ca0ae6e2 100644 --- a/resources/Schema/Entities/MovementTest.xml +++ b/resources/Schema/Entities/MovementTest.xml @@ -2,6 +2,10 @@ + + 2.3827375146874772 + 4 + @@ -257,6 +261,735 @@ + + + + + + + + + 0.049999997019767761 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Sniper-01.png + + + PickClass + 3 + + + + + + + + + + + Sniper + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Assault-01.png + + + PickClass + 1 + + + + + + + + + + + Assault + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Defender-01.png + + + PickClass + 2 + + + + + + + + + + + Defender + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Pick Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pick Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 1 + + + + + + + + + + + Spectator + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + PickTeam + 2 + + + + + + + + + + + Red + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + true + + + PickTeam + 3 + + + + + + + + + + + Blue + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + false + + + SwapToClassPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 4 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + 0.10332605343919568 + + + + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToClassPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashSideArmBlue.xml b/resources/Schema/Entities/MuzzleFlashSideArmBlue.xml new file mode 100644 index 00000000..2d4dd59b --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashSideArmBlue.xml @@ -0,0 +1,219 @@ + + + + + + 0.08 + + + + + + + + + + + + + + 0.08 + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone1Outside.mesh + false + true + + + + + + + + + 0.08 + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone1Inside.mesh + false + true + + + + + + + + + + + + + + + + + + 0.08 + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone2Inside.mesh + false + true + + + + + + + + + 0.08 + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone2Outside.mesh + false + true + + + + + + + + + + + + + + + + + + 0.08 + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneLeft.mesh + false + true + + + + + + + + + 0.08 + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneRight.mesh + false + true + + + + + + + + + 0.08 + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneUp.mesh + false + true + + + + + + + + + 0.08 + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneDown.mesh + false + true + + + + + + + + + + + + + + + + Models/Core/UnitSphere.mesh + false + false + + + + + + + + + + + + + + + Models/Core/UnitSphere.mesh + + false + false + + + + 0.40000000596046448 + + + + + + + + + + + + Models/Core/UnitSphere.mesh + false + false + + + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/DefenderRayBlue.xml b/resources/Schema/Entities/RayAssaultBlue.xml similarity index 65% rename from resources/Schema/Entities/DefenderRayBlue.xml rename to resources/Schema/Entities/RayAssaultBlue.xml index 7680f1da..c358a4d5 100644 --- a/resources/Schema/Entities/DefenderRayBlue.xml +++ b/resources/Schema/Entities/RayAssaultBlue.xml @@ -3,11 +3,9 @@ - 0.5 + 0.079999998211860657 - - - + @@ -16,14 +14,15 @@ Models/Core/UnitQuad.mesh - Textures/Effects/NewRay3.png - - true + Textures/Effects/NewRay5.png + + true + true - + @@ -33,14 +32,15 @@ Models/Core/UnitQuad.mesh - Textures/Effects/NewRay3.png - - true + Textures/Effects/NewRay5.png + + true + true - + diff --git a/resources/Schema/Entities/RayDefenderBlue.xml b/resources/Schema/Entities/RayDefenderBlue.xml new file mode 100644 index 00000000..066f2fb1 --- /dev/null +++ b/resources/Schema/Entities/RayDefenderBlue.xml @@ -0,0 +1,50 @@ + + + + + + 0.079999998211860657 + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/NewRay7.png + + true + true + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/NewRay7.png + + true + true + + + + + + + + + + + + diff --git a/resources/Schema/Entities/RaySideArmBlue.xml b/resources/Schema/Entities/RaySideArmBlue.xml new file mode 100644 index 00000000..072f8e95 --- /dev/null +++ b/resources/Schema/Entities/RaySideArmBlue.xml @@ -0,0 +1,53 @@ + + + + + + 0.08 + + + 0.08 + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/NewRay5.png + + true + true + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Effects/NewRay5.png + + true + true + + + + + + + + + + + + diff --git a/resources/Schema/Entities/WeaponAssaultBlueView.xml b/resources/Schema/Entities/WeaponAssaultBlueView.xml index 6d7e6fa0..3b3d418d 100644 --- a/resources/Schema/Entities/WeaponAssaultBlueView.xml +++ b/resources/Schema/Entities/WeaponAssaultBlueView.xml @@ -88,6 +88,7 @@ R_Arm_Weapon_Joint + 1.5 Models/Weapons/Blue/AssaultWeaponBlue.mesh @@ -127,7 +128,7 @@ - Schema/Entities/RayBlue.xml + Schema/Entities/RayAssaultBlue.xml diff --git a/resources/Schema/Entities/WeaponDefenderBlueView.xml b/resources/Schema/Entities/WeaponDefenderBlueView.xml index 8c8da6a3..37fd2722 100644 --- a/resources/Schema/Entities/WeaponDefenderBlueView.xml +++ b/resources/Schema/Entities/WeaponDefenderBlueView.xml @@ -146,42 +146,6 @@ - - - - R_Arm_Weapon_Joint - - - Models/Weapons/Blue/DefenderWeaponBlue.mesh - - - - - - - - - - - Schema/Entities/DefenderRayBlue.xml - - - - - - - - - - - Schema/Entities/ReloadEffectView.xml - - - - - - - @@ -256,6 +220,70 @@ + + + + + + + + + R_Arm_Weapon_Joint + + + Models/Weapons/Blue/DefenderWeaponBlue.mesh + + + + + + + + + + + Schema/Entities/ReloadEffectView.xml + + + + + + + + + + + + + + + + + + Schema/Entities/RayDefenderBlue.xml + + + + + + + + + + + Schema/Entities/MuzzleFlashBlue.xml + + + + + + + + + + + + diff --git a/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml b/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml index 0d7e2172..e48cffba 100644 --- a/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml +++ b/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml @@ -80,42 +80,6 @@ - - - - R_Arm_Weapon_Joint - - - Models/Weapons/Blue/SecondaryWeaponBlue.mesh - - - - - - - - - - - Schema/Entities/RayBlue.xml - - - - - - - - - - - Schema/Entities/WeaponSidearmReloadEffectView.xml - - - - - - - @@ -206,6 +170,70 @@ + + + + + + + + + R_Arm_Weapon_Joint + + + 1.2999999523162842 + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + + + + + + + + + + + Schema/Entities/WeaponSidearmReloadEffectView.xml + + + + + + + + + + + + + + + + + + Schema/Entities/RaySideArmBlue.xml + + + + + + + + + + + Schema/Entities/MuzzleFlashSideArmBlue.xml + + + + + + + + + + + diff --git a/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml b/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml index 3ff8b0a2..129082ed 100644 --- a/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml +++ b/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml @@ -80,42 +80,6 @@ - - - - R_Arm_Weapon_Joint - - - Models/Weapons/Blue/SecondaryWeaponBlue.mesh - - - - - - - - - - - Schema/Entities/Ray2Red.xml - - - - - - - - - - - Schema/Entities/WeaponSidearmReloadEffectView.xml - - - - - - - @@ -206,6 +170,70 @@ + + + + + + + + + R_Arm_Weapon_Joint + + + 1.5 + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + + + + + + + + + + + Schema/Entities/WeaponSidearmReloadEffectView.xml + + + + + + + + + + + + + + + + + + Schema/Entities/MuzzleFlashSideArmBlue.xml + + + + + + + + + + + Schema/Entities/RaySideArmBlue.xml + + + + + + + + + + + diff --git a/resources/Schema/Entities/WeaponSidearmReloadEffectView.xml b/resources/Schema/Entities/WeaponSidearmReloadEffectView.xml index fce19d7f..bae68bc2 100644 --- a/resources/Schema/Entities/WeaponSidearmReloadEffectView.xml +++ b/resources/Schema/Entities/WeaponSidearmReloadEffectView.xml @@ -2,47 +2,46 @@ - - 2 - - + - - - 1 - 1 + + 0.5 + 0.5 -1 - 1 + 0.5 true + 1.5 Models/Weapons/Blue/SecondaryWeaponBlue.mesh + false true - + - 1 + 0.5 - - - 1 + + 0.5 true + 1.5 Models/Weapons/Blue/SecondaryWeaponBlue.mesh + false true diff --git a/src/Game/Systems/FadeSystem.cpp b/src/Game/Systems/FadeSystem.cpp index 0ed98ddb..e3cf55a9 100644 --- a/src/Game/Systems/FadeSystem.cpp +++ b/src/Game/Systems/FadeSystem.cpp @@ -11,7 +11,7 @@ void FadeSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFade, return; } - if (!(bool)cFade["Out"]) { + if ((bool)cFade["Out"]) { dTime *= -1; } diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index 0686aebf..ce2b833c 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -354,7 +354,16 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi void DefenderWeaponBehaviour::spawnTracers(ComponentWrapper cWeapon, WeaponInfo& wi, std::vector pattern) { - EntityWrapper muzzle = getRelevantWeaponEntity(wi).FirstChildByName("WeaponMuzzle"); + EntityWrapper flashSpawner = getRelevantWeaponEntity(wi).FirstChildByName("WeaponMuzzleFlash"); + if (flashSpawner.Valid()) { + std::uniform_real_distribution randomSpreadAngle(0.f, 3.1415f*2); + EntityWrapper flash = SpawnerSystem::Spawn(flashSpawner, flashSpawner); + if (flash.Valid()) { + ((glm::vec3&)flash["Transform"]["Orientation"]).z = randomSpreadAngle(m_RandomEngine); + } + } + + EntityWrapper muzzle = getRelevantWeaponEntity(wi).FirstChildByName("WeaponMuzzleRay"); if (!muzzle.Valid()) { return; } diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index c9272127..1b8a3139 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -189,18 +189,29 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi return; } - // Tracer - EntityWrapper tracerSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzle"); + //Tracer + EntityWrapper tracerSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzleRay"); if (tracerSpawner.Valid()) { glm::vec3 origin = Transform::AbsolutePosition(tracerSpawner); glm::vec3 direction = Transform::AbsoluteOrientation(tracerSpawner) * glm::vec3(0, 0, -1); float distance = traceRayDistance(origin, direction); - EntityWrapper ray = SpawnerSystem::Spawn(tracerSpawner); + EntityWrapper ray = SpawnerSystem::Spawn(tracerSpawner, tracerSpawner); if (ray.Valid()) { ((glm::vec3&)ray["Transform"]["Scale"]).z = distance; } } + //Flash + EntityWrapper flashSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzleFlash"); + if (flashSpawner.Valid()) { + std::uniform_real_distribution randomSpreadAngle(0.f, 3.1415f*2); + EntityWrapper flash = SpawnerSystem::Spawn(flashSpawner, flashSpawner); + if(flash.Valid()){ + ((glm::vec3&)flash["Transform"]["Orientation"]).z = randomSpreadAngle(m_RandomEngine); + } + } + + // Deal damage if (dealDamage(cWeapon, wi)) { // Show hit marker From 17007a2a41a2d7d587c39b1267b516f971c04a7c Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 16:28:39 +0100 Subject: [PATCH 29/61] fix fix --- src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index 39da8399..cc2f9f7c 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -155,7 +155,7 @@ bool DefenderWeaponBehaviour::OnInputCommand(ComponentWrapper cWeapon, WeaponInf if(wi.Player.Valid()) { if(wi.Player.HasComponent("ShieldAbility")) { - (Field)wi.Player["ShieldAbility"]["Active"] = true; + (Field)wi.Player["ShieldAbility"]["Active"] = true; } } @@ -285,7 +285,7 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi cWeapon["FireCooldown"] = 60.0 / (double)cWeapon["RPM"]; // Stop reloading - Field isReloading = cWeapon["IsReloading"]; + Field isReloading = cWeapon["IsReloading"]; isReloading = false; // Ammo From 3cee4e42482e026a393f2682669cb11b8d8c71c5 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 16:42:07 +0100 Subject: [PATCH 30/61] defender ray fixes --- resources/Schema/Entities/DefenderRayBlue.xml | 22 +++++++++---------- .../Weapon/DefenderWeaponBehaviour.cpp | 8 +++---- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/resources/Schema/Entities/DefenderRayBlue.xml b/resources/Schema/Entities/DefenderRayBlue.xml index 7680f1da..37a8f80c 100644 --- a/resources/Schema/Entities/DefenderRayBlue.xml +++ b/resources/Schema/Entities/DefenderRayBlue.xml @@ -3,11 +3,9 @@ - 0.5 + 0.079999998211860657 - - - + @@ -16,14 +14,14 @@ Models/Core/UnitQuad.mesh - Textures/Effects/NewRay3.png - - true + Textures/Effects/NewRay5.png + + true - + @@ -33,14 +31,14 @@ Models/Core/UnitQuad.mesh - Textures/Effects/NewRay3.png - - true + Textures/Effects/NewRay5.png + + true - + diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index cc2f9f7c..7fd07e2d 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -393,7 +393,7 @@ void DefenderWeaponBehaviour::spawnTracers(ComponentWrapper cWeapon, WeaponInfo& float yaw = std::atan2(lookVector.x, lookVector.z); glm::quat orientation = glm::quat(glm::vec3(pitch, yaw, 0)); rayOrientation = glm::eulerAngles(orientation); - rayScale.z(glm::length(muzzleToHit)); + rayScale.x(glm::length(muzzleToHit)); } } } @@ -449,8 +449,8 @@ void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& w } // Temp hit decal - // EntityWrapper hit = ResourceManager::Load("Schema/Entities/HitTest.xml")->MergeInto(m_World); - // hit["Transform"]["Position"] = pick.Position; + EntityWrapper hit = ResourceManager::Load("Schema/Entities/HitTest.xml")->MergeInto(m_World); + (Field)hit["Transform"]["Position"] = pick.Position; // Don't let us shoot ourselves in the foot somehow if (victim == LocalPlayer) { @@ -472,7 +472,7 @@ void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& w } damageSum[victim] += pelletDamage; - // ((glm::vec3&)hit["Model"]["Color"]).b = 1.f; + ((Field)hit["Model"]["Color"]).z(1.f); } // Deal damage! From fc5ad2d38022ce2b5a5aea4fa2b3ef29510e984d Mon Sep 17 00:00:00 2001 From: Tleety Date: Sun, 13 Mar 2016 17:33:12 +0100 Subject: [PATCH 31/61] Small fix --- assets | 2 +- src/Game/Systems/FadeSystem.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets b/assets index 504752c9..6ffc1ab8 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 504752c94966c432513cac35acf906f8c9a3f965 +Subproject commit 6ffc1ab82aa36a933b84b9eb4d50e013e9ad9911 diff --git a/src/Game/Systems/FadeSystem.cpp b/src/Game/Systems/FadeSystem.cpp index 0abd9896..88460d53 100644 --- a/src/Game/Systems/FadeSystem.cpp +++ b/src/Game/Systems/FadeSystem.cpp @@ -20,7 +20,7 @@ void FadeSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFade, } double fadeTime = cFade["FadeTime"]; - Field currentTime = cFade["Time"]; + Field currentTime = cFade["Time"]; currentTime += dTime; if(currentTime > fadeTime) { From 389d27973fb66e345edd3b5bfc169da7d6cfb4b7 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 18:55:45 +0100 Subject: [PATCH 32/61] Assault boost check --- .../Schema/Entities/FriendlyBoostBlueHUD.xml | 145 ++++++++++++++++++ .../Schema/Entities/WeaponAssaultBlueView.xml | 2 +- src/Game/Systems/BoostSystem.cpp | 13 +- .../Systems/Weapon/AssaultWeaponBehaviour.cpp | 99 +++++++++--- 4 files changed, 228 insertions(+), 31 deletions(-) create mode 100644 resources/Schema/Entities/FriendlyBoostBlueHUD.xml diff --git a/resources/Schema/Entities/FriendlyBoostBlueHUD.xml b/resources/Schema/Entities/FriendlyBoostBlueHUD.xml new file mode 100644 index 00000000..296560fa --- /dev/null +++ b/resources/Schema/Entities/FriendlyBoostBlueHUD.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + \1 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + \1 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + \2 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + \2 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + \3 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + \3 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/WeaponAssaultBlueView.xml b/resources/Schema/Entities/WeaponAssaultBlueView.xml index c85d4c2d..36fbfc03 100644 --- a/resources/Schema/Entities/WeaponAssaultBlueView.xml +++ b/resources/Schema/Entities/WeaponAssaultBlueView.xml @@ -216,7 +216,7 @@ - Schema/Entities/FriendlyAmmoHUD.xml + Schema/Entities/FriendlyBoostBlueHUD.xml diff --git a/src/Game/Systems/BoostSystem.cpp b/src/Game/Systems/BoostSystem.cpp index ede147c3..0aab545f 100644 --- a/src/Game/Systems/BoostSystem.cpp +++ b/src/Game/Systems/BoostSystem.cpp @@ -8,21 +8,18 @@ BoostSystem::BoostSystem(SystemParams params) bool BoostSystem::OnPlayerDamage(Events::PlayerDamage& e) { - if (e.Victim.ID == e.Inflictor.ID) { + if (!IsServer) { return false; } - if (!e.Victim.Valid() || !LocalPlayer.Valid()) { + if (e.Victim == e.Inflictor) { return false; } - if (e.Victim != LocalPlayer && !e.Victim.IsChildOf(LocalPlayer)) { + if (!e.Victim.Valid() || !e.Inflictor.Valid()) { return false; } - if (!e.Inflictor.Valid()) { - return false; - } //if its not friendly fire, return if ((int)m_World->GetComponent(e.Inflictor.ID, "Team")["Team"] != (int)m_World->GetComponent(e.Victim.ID, "Team")["Team"]) { @@ -86,7 +83,7 @@ void BoostSystem::giveAmmo(EntityWrapper giver, EntityWrapper receiver) int maxAmmo = receiver["AssaultWeapon"]["MaxAmmo"]; Field ammo = receiver["AssaultWeapon"]["Ammo"]; - int givenAmmo = 3; + int givenAmmo = 20; magazineAmmo = glm::clamp(magazineAmmo + givenAmmo, 0, magazineSize); if (magazineAmmo > prevMagazineAmmo) { @@ -102,7 +99,7 @@ void BoostSystem::giveAmmo(EntityWrapper giver, EntityWrapper receiver) int maxAmmo = receiver["DefenderWeapon"]["MaxAmmo"]; Field ammo = receiver["DefenderWeapon"]["Ammo"]; - int givenAmmo = 1; + int givenAmmo = 3; magazineAmmo = glm::clamp(magazineAmmo + givenAmmo, 0, magazineSize); if (magazineAmmo > prevMagazineAmmo) { diff --git a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp index ad9caae4..5a4af4f6 100644 --- a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp @@ -10,6 +10,7 @@ void AssaultWeaponBehaviour::UpdateComponent(EntityWrapper& entity, ComponentWra void AssaultWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) { + CheckBoost(cWeapon, wi); // Start reloading automatically if at 0 mag ammo Field magAmmo = cWeapon["MagazineAmmo"]; if (m_ConfigAutoReload && magAmmo <= 0) { @@ -407,52 +408,106 @@ void AssaultWeaponBehaviour::CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi // If friendly fire, reduce damage to 0 (needed to make Boosts, Ammosharing work) if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { - + EntityWrapper friendlyBoostHudSpawner = wi.FirstPersonPlayerModel.FirstChildByName("FriendlyBoostAttachment"); if (friendlyBoostHudSpawner.Valid()) { + EntityWrapper assaultBoost = victim.FirstChildByName("BoostAssault"); + EntityWrapper defenderBoost = victim.FirstChildByName("BoostDefender"); + EntityWrapper sniperBoost = victim.FirstChildByName("BoostSniper"); + auto children = m_World->GetDirectChildren(friendlyBoostHudSpawner.ID); if (children.first == children.second) { if (friendlyBoostHudSpawner.HasComponent("Spawner")) { - EntityWrapper friendlyAmmoHud = SpawnerSystem::Spawn(friendlyBoostHudSpawner, friendlyBoostHudSpawner); - if (friendlyAmmoHud.Valid()) { - EntityWrapper textEntity = friendlyAmmoHud.FirstChildByName("MagazineAmmo"); - if (textEntity.Valid()) { - if (textEntity.HasComponent("Text")) { - // (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + + EntityWrapper friendlyBoostHud = SpawnerSystem::Spawn(friendlyBoostHudSpawner, friendlyBoostHudSpawner); + if (friendlyBoostHud.Valid()) { + EntityWrapper assaultBoostEntity = friendlyBoostHud.FirstChildByName("AssaultBoost"); + if (assaultBoostEntity.Valid()) { + EntityWrapper active = assaultBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (assaultBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } } } - EntityWrapper ammoTextEntity = friendlyAmmoHud.FirstChildByName("Ammo"); - if (ammoTextEntity.Valid()) { - if (ammoTextEntity.HasComponent("Text")) { - // (std::string&)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + EntityWrapper defenderBoostEntity = friendlyBoostHud.FirstChildByName("DefenderBoost"); + if (defenderBoostEntity.Valid()) { + EntityWrapper active = defenderBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (defenderBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } + } + } + + EntityWrapper sniperBoostEntity = friendlyBoostHud.FirstChildByName("SniperBoost"); + if (sniperBoostEntity.Valid()) { + EntityWrapper active = sniperBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (sniperBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } } } } } } else { - EntityWrapper textEntity = friendlyBoostHudSpawner.FirstChildByName("MagazineAmmo"); - if (textEntity.Valid()) { - if (textEntity.HasComponent("Text")) { - // (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + EntityWrapper friendlyBoostHud = friendlyBoostHudSpawner.FirstChildByName("FriendlyBoostHUD"); + if (friendlyBoostHud.Valid()) { + EntityWrapper assaultBoostEntity = friendlyBoostHud.FirstChildByName("AssaultBoost"); + if (assaultBoostEntity.Valid()) { + EntityWrapper active = assaultBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (assaultBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } + } } - } - EntityWrapper ammoTextEntity = friendlyBoostHudSpawner.FirstChildByName("Ammo"); - if (ammoTextEntity.Valid()) { - if (ammoTextEntity.HasComponent("Text")) { - // (std::string&)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + EntityWrapper defenderBoostEntity = friendlyBoostHud.FirstChildByName("DefenderBoost"); + if (defenderBoostEntity.Valid()) { + EntityWrapper active = defenderBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (defenderBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } + } + } + + EntityWrapper sniperBoostEntity = friendlyBoostHud.FirstChildByName("SniperBoost"); + if (sniperBoostEntity.Valid()) { + EntityWrapper active = sniperBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (sniperBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } + } } } } } } - } void AssaultWeaponBehaviour::RemoveBoostCheckHUD(WeaponInfo& wi) { - + EntityWrapper friendlyBoostHudSpawner = wi.FirstPersonPlayerModel.FirstChildByName("FriendlyBoostAttachment"); + if (friendlyBoostHudSpawner.Valid()) { + friendlyBoostHudSpawner.DeleteChildren(); + } } From 1da3ec3c74dfb9d884b5abb1d28a07f152e0a93f Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 20:32:08 +0100 Subject: [PATCH 33/61] ammo share fix? --- .../Game/Systems/Weapon/AssaultWeaponBehaviour.h | 1 - .../Schema/Entities/FriendlyBoostBlueHUD.xml | 12 +++++++++--- src/Game/Systems/BoostSystem.cpp | 7 ++++--- src/Game/Systems/PlayerMovementSystem.cpp | 2 +- .../Systems/Weapon/AssaultWeaponBehaviour.cpp | 16 ++++++---------- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h b/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h index 231cc020..5783cf31 100644 --- a/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h @@ -38,7 +38,6 @@ private: //Camera cameraFromEntity(EntityWrapper camera); void CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi); - void RemoveBoostCheckHUD(WeaponInfo& wi); }; diff --git a/resources/Schema/Entities/FriendlyBoostBlueHUD.xml b/resources/Schema/Entities/FriendlyBoostBlueHUD.xml index 296560fa..c181392e 100644 --- a/resources/Schema/Entities/FriendlyBoostBlueHUD.xml +++ b/resources/Schema/Entities/FriendlyBoostBlueHUD.xml @@ -2,6 +2,9 @@ + + 0.5 + @@ -44,6 +47,7 @@ \1 Fonts/Hind-Edited.otf,64 + false @@ -56,7 +60,7 @@ \1 Fonts/Hind-Edited.otf,64 - + @@ -80,6 +84,7 @@ \2 Fonts/Hind-Edited.otf,64 + false @@ -92,7 +97,7 @@ \2 Fonts/Hind-Edited.otf,64 - + @@ -116,6 +121,7 @@ \3 Fonts/Hind-Edited.otf,64 + false @@ -128,7 +134,7 @@ \3 Fonts/Hind-Edited.otf,64 - + diff --git a/src/Game/Systems/BoostSystem.cpp b/src/Game/Systems/BoostSystem.cpp index 0aab545f..5a04e3f8 100644 --- a/src/Game/Systems/BoostSystem.cpp +++ b/src/Game/Systems/BoostSystem.cpp @@ -8,9 +8,7 @@ BoostSystem::BoostSystem(SystemParams params) bool BoostSystem::OnPlayerDamage(Events::PlayerDamage& e) { - if (!IsServer) { - return false; - } + if (e.Victim == e.Inflictor) { return false; @@ -35,6 +33,9 @@ bool BoostSystem::OnPlayerDamage(Events::PlayerDamage& e) if (className == "SidearmWeapon") { // give ammo giveAmmo(e.Inflictor, e.Victim); } else { //give boost + if (!IsServer) { + return false; + } //get the XML file, example: "Schema/Entities/BoostclassName.xml" std::string classXML = "Schema/Entities/" + className + ".xml"; diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index 35a7d3cf..d093ee21 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -393,7 +393,7 @@ void PlayerMovementSystem::spawnHexagon(EntityWrapper target) bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e) { EntityWrapper player(m_World, e.Player); - if (!player.Valid()){// || !IsClient || player.ID == LocalPlayer.ID) { + if (!player.Valid() || !IsClient || player.ID == LocalPlayer.ID) { return false; } diff --git a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp index 5a4af4f6..b58cf158 100644 --- a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp @@ -386,13 +386,11 @@ void AssaultWeaponBehaviour::CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi PickData pickData = m_Renderer->Pick(centerScreen); EntityWrapper victim(m_World, pickData.Entity); if (!victim.Valid()) { - RemoveBoostCheckHUD(wi); return; } // Don't let us somehow shoot ourselves in the foot if (victim == LocalPlayer) { - RemoveBoostCheckHUD(wi); return; } @@ -401,7 +399,6 @@ void AssaultWeaponBehaviour::CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi victim = victim.FirstParentWithComponent("Player"); } if (!victim.Valid()) { - RemoveBoostCheckHUD(wi); return; } @@ -463,6 +460,12 @@ void AssaultWeaponBehaviour::CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi } else { EntityWrapper friendlyBoostHud = friendlyBoostHudSpawner.FirstChildByName("FriendlyBoostHUD"); if (friendlyBoostHud.Valid()) { + if(friendlyBoostHud.HasComponent("Lifetime")) { + (Field)friendlyBoostHud["Lifetime"]["Lifetime"] = 0.5; + } + + + EntityWrapper assaultBoostEntity = friendlyBoostHud.FirstChildByName("AssaultBoost"); if (assaultBoostEntity.Valid()) { EntityWrapper active = assaultBoostEntity.FirstChildByName("Active"); @@ -504,10 +507,3 @@ void AssaultWeaponBehaviour::CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi } } -void AssaultWeaponBehaviour::RemoveBoostCheckHUD(WeaponInfo& wi) -{ - EntityWrapper friendlyBoostHudSpawner = wi.FirstPersonPlayerModel.FirstChildByName("FriendlyBoostAttachment"); - if (friendlyBoostHudSpawner.Valid()) { - friendlyBoostHudSpawner.DeleteChildren(); - } -} From ee8d7574b25296a535d4248f27c4967cc404ba44 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 20:46:59 +0100 Subject: [PATCH 34/61] dash fix? --- src/Game/Systems/PlayerMovementSystem.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index d093ee21..d6b8ad56 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -392,17 +392,22 @@ void PlayerMovementSystem::spawnHexagon(EntityWrapper target) bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e) { - EntityWrapper player(m_World, e.Player); - if (!player.Valid() || !IsClient || player.ID == LocalPlayer.ID) { + EntityWrapper eventPlayer(m_World, e.Player); + if (!eventPlayer.Valid() || IsServer || eventPlayer.ID == LocalPlayer.ID) { return false; } // auto entityFile = ResourceManager::Load("Schema/Entities/DashEffect.xml"); // EntityWrapper dashEffect = entityFile->MergeInto(m_World); - EntityWrapper playerModel = player.FirstChildByName("PlayerModel"); + EntityWrapper playerModel = eventPlayer.FirstChildByName("PlayerModel"); for (auto& kv : m_PlayerInputControllers) { EntityWrapper player = kv.first; + if(player != eventPlayer) { + continue; + } + + auto& controller = kv.second; if (!player.Valid()) { From e929ecab502058a476190923e3d46cf77f2986fe Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 20:58:53 +0100 Subject: [PATCH 35/61] fix??? --- src/Game/Systems/PlayerMovementSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index d6b8ad56..3cf1068d 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -393,7 +393,7 @@ void PlayerMovementSystem::spawnHexagon(EntityWrapper target) bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e) { EntityWrapper eventPlayer(m_World, e.Player); - if (!eventPlayer.Valid() || IsServer || eventPlayer.ID == LocalPlayer.ID) { + if (!eventPlayer.Valid()){// || IsServer || eventPlayer.ID == LocalPlayer.ID) { return false; } From 20e48eeb08d76e8588a1a7377cbd3795b40be387 Mon Sep 17 00:00:00 2001 From: Tleety Date: Sun, 13 Mar 2016 21:01:04 +0100 Subject: [PATCH 36/61] Killfeed should work now. --- include/Engine/Network/Client.h | 2 + include/Engine/Network/EKillDeath.h | 11 + include/Engine/Network/MessageType.h | 1 + include/Game/Systems/KillFeedSystem.h | 27 +- resources/Schema/Entities/MovementTest.xml | 1259 +++++++++-------- resources/Schema/Entities/OverwatchCamera.xml | 58 +- .../Schema/Entities/PlayerAssaultBlue.xml | 204 ++- .../Schema/Entities/PlayerDefenderBlue.xml | 264 ++-- resources/Schema/Entities/PlayerHUD.xml | 120 +- src/Engine/Network/Client.cpp | 19 + src/Engine/Network/Server.cpp | 39 + src/Game/Systems/KillFeedSystem.cpp | 61 +- 12 files changed, 1106 insertions(+), 959 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 29e9ac9a..d42ba14a 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -16,6 +16,7 @@ #include "Network/UDPClient.h" #include "Network/TCPClient.h" #include "Network/SnapshotDefinitions.h" +#include "Network/EKillDeath.h" #include "Core/World.h" #include "Core/EntityFile.h" #include "Core/EventBroker.h" @@ -104,6 +105,7 @@ private: void parseDashEffect(Packet& packet); void parseAmmoPickup(Packet& packet); void parseRemoveWorld(Packet& packet); + void parseKDEvent(Packet& packet); void InterpolateFields(Packet& packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType); void parseSnapshot(Packet& packet); void identifyPacketLoss(); diff --git a/include/Engine/Network/EKillDeath.h b/include/Engine/Network/EKillDeath.h index e53f3b8c..04917f39 100644 --- a/include/Engine/Network/EKillDeath.h +++ b/include/Engine/Network/EKillDeath.h @@ -10,8 +10,19 @@ namespace Events struct KillDeath : public Event { + int CasualtyTeam; PlayerID Casualty = -1; + std::string CasualtyName; + + //1 = assault, 2 = defender, 3 = sniper + int CasualtyClass; + + int KillerTeam; PlayerID Killer = -1; + std::string KillerName; + + //1 = assault, 2 = defender, 3 = sniper + int KillerClass; }; } diff --git a/include/Engine/Network/MessageType.h b/include/Engine/Network/MessageType.h index 11fb85be..53821084 100644 --- a/include/Engine/Network/MessageType.h +++ b/include/Engine/Network/MessageType.h @@ -24,6 +24,7 @@ enum class MessageType ServerlistRequest, AmmoPickup, RemoveWorld, + KD, Invalid }; diff --git a/include/Game/Systems/KillFeedSystem.h b/include/Game/Systems/KillFeedSystem.h index 31423999..57c7a98a 100644 --- a/include/Game/Systems/KillFeedSystem.h +++ b/include/Game/Systems/KillFeedSystem.h @@ -3,7 +3,7 @@ #include "../../Engine/Core/System.h" #include "../../Engine/GLM.h" -#include "Core/EPlayerDeath.h" +#include "Network/EKillDeath.h" class KillFeedSystem : public ImpureSystem { @@ -11,8 +11,7 @@ public: KillFeedSystem(SystemParams params) : System(params) { - EVENT_SUBSCRIBE_MEMBER(m_EPlayerDeath, &KillFeedSystem::OnPlayerDeath); - + EVENT_SUBSCRIBE_MEMBER(m_EKillDeath, &KillFeedSystem::OnPlayerKillDeath) } virtual void Update(double dt) override; @@ -22,16 +21,30 @@ private: - EventRelay m_EPlayerDeath; - bool KillFeedSystem::OnPlayerDeath(Events::PlayerDeath& e); + EventRelay m_EKillDeath; + bool KillFeedSystem::OnPlayerKillDeath(Events::KillDeath& e); struct KillFeedInfo { - std::string Content; - glm::vec4 Color; + std::string KillerName = ""; + int KillerClass = 0; + int KillerID = -1; + int KillerTeam = 0; + std::string KillerColor = ""; + + std::string VictimName = ""; + int VictimClass = 0; + int VictimID = -1; + int VictimTeam = 0; + std::string VictimColor = ""; + + bool redused; float TimeToLive = 5.f; }; + std::string m_RedColor = "\\C08366D"; + std::string m_BlueColor = "\\C6A1208"; + std::list m_DeathQueue; }; diff --git a/resources/Schema/Entities/MovementTest.xml b/resources/Schema/Entities/MovementTest.xml index ca0ae6e2..dd1b3211 100644 --- a/resources/Schema/Entities/MovementTest.xml +++ b/resources/Schema/Entities/MovementTest.xml @@ -3,7 +3,7 @@ - 2.3827375146874772 + 2.9023438519963349 4 @@ -107,7 +107,7 @@ - + @@ -120,7 +120,7 @@ - + @@ -265,389 +265,616 @@ + + + + + + 0.049999997019767761 + + + + + + + - + - - 0.049999997019767761 - - - - + + - + - - - - + + - + - - + + + - + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Sniper-01.png + + + PickClass + 3 + - + + - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Sniper-01.png - - - PickClass - 3 - - - - - - - - - - - Sniper - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Assault-01.png - - - PickClass - 1 - - - - - - - - - - - Assault - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Defender-01.png - - - PickClass - 2 - - - - - - - - - - - Defender - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - + - Pick Class + Sniper Fonts/DroidSans.ttf,64 - - + + - + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Assault-01.png + + + PickClass + 1 + + + + + + + + - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - SwapToTeamPick - 1 - + + Assault + Fonts/DroidSans.ttf,64 + + - - + + - - - - - Change - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - Team - Fonts/DroidSans.ttf,64 - - - - - - - - - + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Defender-01.png + + + PickClass + 2 + + + + + + + + + + + Defender + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Pick Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + - + + + + + + + + + - - + + + - + + + Pick Team + Fonts/DroidSans.ttf,64 + + - + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 1 + + + + - + - Pick Team + Spectator Fonts/DroidSans.ttf,64 - - - + + - + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 2 + + + + + + + + - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - PickTeam - 1 - + + Red + Fonts/DroidSans.ttf,64 + - - + + - - - - - Spectator - Fonts/DroidSans.ttf,64 - - - - - - - - - + - + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 3 + + + + + + + + - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - true - - - PickTeam - 2 - + + Blue + Fonts/DroidSans.ttf,64 + - - + + - - - - - Red - Fonts/DroidSans.ttf,64 - - - - - - - - - + - + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + false + + + SwapToClassPick + 1 + + + + + + + + - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - true - - - PickTeam - 3 - - - - - - - - - - - Blue - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - + + Change + Fonts/DroidSans.ttf,64 false - - - SwapToClassPick - 1 - + - - + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + - + - - Change - Fonts/DroidSans.ttf,64 - false - + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + - - + + + - + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + - - Class - Fonts/DroidSans.ttf,64 - false - + + + + + 4 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + - - + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + 0.10332605343919568 + + + + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + @@ -656,329 +883,153 @@ - - - - - - - - - + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + - + + - + - 2 + Change Fonts/DroidSans.ttf,64 - - - + + - + + + Team + Fonts/DroidSans.ttf,64 + - - + + - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 3 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 4 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 2 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 0.10332605343919568 - - - - 1 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - + - + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToClassPick + 1 + + + + + + + + - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - SwapToTeamPick - 1 - + + Change + Fonts/DroidSans.ttf,64 + - - + + - - - - - Change - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - Team - Fonts/DroidSans.ttf,64 - - - - - - - - - + - + - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - SwapToClassPick - 1 - + + Class + Fonts/DroidSans.ttf,64 + - - + + - - - - - Change - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - Class - Fonts/DroidSans.ttf,64 - - - - - - - - - + + + + + + + + + + + + + + + + + \C08366D\1\CFFFFFF Dahl \4 \C08366D\1\CFFFFFF Dahl + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + \C08366D\1\CFFFFFF Dahl \4 \C08366D\1\CFFFFFF Dahl + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + Fonts/Hind-Edited.otf,64 + + + + + + + + + diff --git a/resources/Schema/Entities/OverwatchCamera.xml b/resources/Schema/Entities/OverwatchCamera.xml index 92540e5b..55b2b6a4 100644 --- a/resources/Schema/Entities/OverwatchCamera.xml +++ b/resources/Schema/Entities/OverwatchCamera.xml @@ -8,7 +8,7 @@ - + @@ -275,7 +275,6 @@ Textures/Core/UnitHexagon.png - true PickTeam @@ -311,7 +310,6 @@ Textures/Core/UnitHexagon.png - true PickTeam @@ -715,6 +713,60 @@ + + + + + + + + + + + + + + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + diff --git a/resources/Schema/Entities/PlayerAssaultBlue.xml b/resources/Schema/Entities/PlayerAssaultBlue.xml index c73a4c46..76f1718c 100644 --- a/resources/Schema/Entities/PlayerAssaultBlue.xml +++ b/resources/Schema/Entities/PlayerAssaultBlue.xml @@ -104,6 +104,82 @@ + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + @@ -112,7 +188,6 @@ Textures/Core/UnitHexagon.png - true @@ -133,7 +208,6 @@ Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png - true @@ -153,87 +227,6 @@ Textures/Core/UnitHexagon.png - true - - - - - - - - - - - - - 2 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - true - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - true - - - - - - - - - - - - - 3 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - true - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - true @@ -253,7 +246,6 @@ Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png - true @@ -273,7 +265,6 @@ Textures/Core/UnitHexagon.png - true @@ -292,7 +283,6 @@ Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png - true @@ -319,7 +309,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -332,7 +322,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -347,7 +337,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -393,12 +383,12 @@ 1 + 100/100 Fonts/DroidSans.ttf,64 - + - @@ -419,7 +409,6 @@ Textures/HealthHUD3.png - true @@ -438,18 +427,17 @@ - + false Models/Core/UnitQuad.mesh Textures/Icons/Boosts/Assault-01.png - - true + - + @@ -459,18 +447,17 @@ - + false Models/Core/UnitQuad.mesh Textures/Icons/Boosts/Defender-01.png - - true + - + @@ -480,19 +467,17 @@ - + false Models/Core/UnitQuad.mesh Textures/Icons/Boosts/Sniper-01.png - - false - true + - + @@ -513,7 +498,6 @@ Textures/Icons/Abilities/Long/Superman-01.png - true @@ -923,10 +907,10 @@ - + - DashLeftF + DashRightF 1.7999999523162842 false @@ -935,10 +919,10 @@ - + - DashRightF + DashLeftF 1.7999999523162842 false diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index 25fc54d2..dd8992be 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -141,6 +141,82 @@ + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + @@ -149,7 +225,6 @@ Textures/Core/UnitHexagon.png - true @@ -170,7 +245,6 @@ Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png - true @@ -190,87 +264,6 @@ Textures/Core/UnitHexagon.png - true - - - - - - - - - - - - - 2 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - true - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - true - - - - - - - - - - - - - 3 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - true - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - true @@ -290,7 +283,6 @@ Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png - true @@ -310,7 +302,6 @@ Textures/Core/UnitHexagon.png - true @@ -329,7 +320,6 @@ Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png - true @@ -356,7 +346,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -369,7 +359,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -384,7 +374,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -430,12 +420,12 @@ 1 + 150/150 Fonts/DroidSans.ttf,64 - + - @@ -456,7 +446,6 @@ Textures/HealthHUD3.png - true @@ -475,18 +464,17 @@ - + false Models/Core/UnitQuad.mesh Textures/Icons/Boosts/Assault-01.png - - true + - + @@ -496,18 +484,17 @@ - + false Models/Core/UnitQuad.mesh Textures/Icons/Boosts/Defender-01.png - - true + - + @@ -517,19 +504,17 @@ - + false Models/Core/UnitQuad.mesh Textures/Icons/Boosts/Sniper-01.png - - false - true + - + @@ -551,7 +536,6 @@ Textures/Icons/Abilities/Long/SheildDots-01.png - true @@ -904,40 +888,6 @@ - - - - Fire - Reload - 0 - - - - - - - - ShootgunReloadU - - 0.5 - - - - - - - - - ShootRifleU - - false - - - - - - - @@ -973,6 +923,40 @@ + + + + Fire + Reload + 0 + + + + + + + + ShootgunReloadU + + 0.5 + + + + + + + + + ShootRifleU + + false + + + + + + + diff --git a/resources/Schema/Entities/PlayerHUD.xml b/resources/Schema/Entities/PlayerHUD.xml index 5891362d..48123411 100644 --- a/resources/Schema/Entities/PlayerHUD.xml +++ b/resources/Schema/Entities/PlayerHUD.xml @@ -48,47 +48,6 @@ Textures/Core/UnitHexagon.png - true - - - - - - - - - - - - - 2 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - true - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - true @@ -108,7 +67,6 @@ Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png - true @@ -128,7 +86,6 @@ Textures/Core/UnitHexagon.png - true @@ -149,7 +106,6 @@ Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png - true @@ -169,7 +125,44 @@ Textures/Core/UnitHexagon.png - true + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + @@ -189,7 +182,6 @@ Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png - true @@ -209,7 +201,6 @@ Textures/Core/UnitHexagon.png - true @@ -228,7 +219,6 @@ Models/Core/UnitQuad.mesh Textures/Core/UnitHexagon_Rotated.png - true @@ -255,7 +245,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -268,7 +258,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -283,7 +273,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -329,12 +319,12 @@ 1 + 100/100 Fonts/DroidSans.ttf,64 - + - @@ -355,7 +345,6 @@ Textures/HealthHUD3.png - true @@ -374,18 +363,17 @@ - + false Models/Core/UnitQuad.mesh Textures/Icons/Boosts/Assault-01.png - - true + - + @@ -395,18 +383,17 @@ - + false Models/Core/UnitQuad.mesh Textures/Icons/Boosts/Defender-01.png - - true + - + @@ -416,19 +403,17 @@ - + false Models/Core/UnitQuad.mesh Textures/Icons/Boosts/Sniper-01.png - - false - true + - + @@ -449,7 +434,6 @@ Textures/Test/aM4ME4GR.png - true diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 705872fa..cd395da0 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -165,6 +165,9 @@ void Client::parseMessageType(Packet& packet) case MessageType::RemoveWorld: parseRemoveWorld(packet); break; + case MessageType::KD: + parseKDEvent(packet); + break; default: break; } @@ -349,6 +352,22 @@ void Client::parseRemoveWorld(Packet & packet) m_EventBroker->Publish(e); } +void Client::parseKDEvent(Packet & packet) +{ + Events::KillDeath e; + e.Casualty = packet.ReadPrimitive(); + e.CasualtyClass = packet.ReadPrimitive(); + e.CasualtyName = packet.ReadString(); + e.CasualtyTeam = packet.ReadPrimitive(); + + e.Killer = packet.ReadPrimitive(); + e.KillerClass = packet.ReadPrimitive(); + e.KillerName = packet.ReadString(); + e.KillerTeam = packet.ReadPrimitive(); + + m_EventBroker->Publish(e); +} + void Client::updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID) { for (auto field : componentInfo.FieldsInOrder) { diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index dc40ea3f..dbaf4752 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -560,9 +560,48 @@ bool Server::OnAmmoPickup(const Events::AmmoPickup & e) bool Server::OnPlayerDeath(const Events::PlayerDeath& e) { Events::KillDeath eKD; + auto entity = e; eKD.Casualty = getPlayerIDFromEntityID(e.Player.ID); eKD.Killer = getPlayerIDFromEntityID(e.Killer.ID); + + eKD.CasualtyName = m_ConnectedPlayers.at(getPlayerIDFromEntityID(e.Player.ID)).Name; + eKD.KillerName = m_ConnectedPlayers.at(getPlayerIDFromEntityID(e.Killer.ID)).Name; + + if(entity.Player.HasComponent("Team")) { + eKD.CasualtyTeam = (const int&)entity.Player["Team"]["Team"]; + } + if (entity.Killer.HasComponent("Team")) { + eKD.KillerTeam = (const int&)entity.Killer["Team"]["Team"]; + } + + if(entity.Player.HasComponent("DashAbility")) { + eKD.CasualtyClass = 1; + } else if (entity.Player.HasComponent("ShieldAbility")) { + eKD.CasualtyClass = 2; + } else if (entity.Player.HasComponent("SprintAbility")) { + eKD.CasualtyClass = 3; + } + if (entity.Killer.HasComponent("DashAbility")) { + eKD.KillerClass = 1; + } else if (entity.Killer.HasComponent("ShieldAbility")) { + eKD.KillerClass = 2; + } else if (entity.Killer.HasComponent("SprintAbility")) { + eKD.KillerClass = 3; + } + m_EventBroker->Publish(eKD); + + Packet kdPacket(MessageType::KD); + kdPacket.WritePrimitive(eKD.Casualty); + kdPacket.WritePrimitive(eKD.CasualtyClass); + kdPacket.WriteString(eKD.CasualtyName); + kdPacket.WritePrimitive(eKD.CasualtyTeam); + + kdPacket.WritePrimitive(eKD.Killer); + kdPacket.WritePrimitive(eKD.KillerClass); + kdPacket.WriteString(eKD.KillerName); + kdPacket.WritePrimitive(eKD.KillerTeam); + reliableBroadcast(kdPacket); return false; } diff --git a/src/Game/Systems/KillFeedSystem.cpp b/src/Game/Systems/KillFeedSystem.cpp index eb3e916e..01a474ad 100644 --- a/src/Game/Systems/KillFeedSystem.cpp +++ b/src/Game/Systems/KillFeedSystem.cpp @@ -7,6 +7,10 @@ void KillFeedSystem::Update(double dt) return; } + for (auto it = m_DeathQueue.begin(); it != m_DeathQueue.end(); it++) { + (*it).TimeToLive -= dt; + } + for (auto& killFeedComponent : *killFeeds) { EntityWrapper entity = EntityWrapper(m_World, killFeedComponent.EntityID); @@ -16,10 +20,7 @@ void KillFeedSystem::Update(double dt) (Field)child["Text"]["Content"] = ""; } } - - - - + int feedIndex = 1; for (auto it = m_DeathQueue.begin(); it != m_DeathQueue.end(); ) { bool remove = false; @@ -27,14 +28,19 @@ void KillFeedSystem::Update(double dt) EntityWrapper child = entity.FirstChildByName("KillFeed" + std::to_string(feedIndex)); if (child.HasComponent("Text")) { - (Field)child["Text"]["Content"] = (*it).Content; - (Field)child["Text"]["Color"] = (*it).Color; - (*it).TimeToLive -= dt; + std::string str = ""; + //Add killer to the start of string. + str = (*it).KillerColor + "\\" + std::to_string((*it).KillerClass) + "\\CFFFFFF" + " " + (*it).KillerName + " "; + //Add Weapon to middle of string. + str += "\\" + std::to_string((*it).KillerClass+3) + " "; + //Add victim to the end of string + str += (*it).VictimColor + "\\" + std::to_string((*it).VictimClass) + "\\CFFFFFF" + " " + (*it).VictimName; + + (Field)child["Text"]["Content"] = str; if ((*it).TimeToLive <= 0.f) { (Field)child["Text"]["Content"] = ""; - (Field)child["Text"]["Color"] = (*it).Color; remove = true; } } @@ -52,29 +58,30 @@ void KillFeedSystem::Update(double dt) } } -bool KillFeedSystem::OnPlayerDeath(Events::PlayerDeath& e) +bool KillFeedSystem::OnPlayerKillDeath(Events::KillDeath& e) { - KillFeedInfo kfInfo; + KillFeedInfo info; - if (e.Player.HasComponent("Team")) { - int red = e.Player["Team"].Enum("Team", "Red"); - int blue = e.Player["Team"].Enum("Team", "Blue"); - - if ((int)e.Player["Team"]["Team"] == red) { - kfInfo.Content = "Blue Player killed Red Player"; - kfInfo.Color = glm::vec4(0.f, 0.2f, 1.f, 0.8f); - m_DeathQueue.push_back(kfInfo); - } else if ((int)e.Player["Team"]["Team"] == blue) { - kfInfo.Content = "Red Player killed blue Player"; - kfInfo.Color = glm::vec4(1.f, 0.f, 0.f, 0.8f); - m_DeathQueue.push_back(kfInfo); - } + info.KillerName = e.KillerName; + info.KillerID = e.Killer; + info.KillerClass = e.KillerClass; + info.KillerTeam = e.KillerTeam; + if(info.KillerTeam == 2){ + info.KillerColor = m_BlueColor; + } else if (info.KillerTeam == 3) { + info.KillerColor = m_RedColor; } - - if(m_DeathQueue.size() > 3) { - m_DeathQueue.pop_front(); + info.VictimName = e.CasualtyName; + info.VictimID = e.Casualty; + info.VictimClass = e.CasualtyClass; + info.VictimTeam = e.CasualtyTeam; + if (info.VictimTeam == 2) { + info.VictimColor = m_BlueColor; + } else if (info.VictimTeam == 3) { + info.VictimColor = m_RedColor; } - return true; + m_DeathQueue.push_back(info); + return 1; } From 3a0cff7a8308904adbff875e91208c7474b0c506 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 21:10:22 +0100 Subject: [PATCH 37/61] boost check for defender --- .../Systems/Weapon/DefenderWeaponBehaviour.h | 1 + .../Entities/FriendlyBoostAttachement.xml | 15 ++ .../Schema/Entities/FriendlyBoostBlueHUD.xml | 28 ++-- .../Schema/Entities/WeaponAssaultBlueView.xml | 9 -- .../Entities/WeaponDefenderBlueView.xml | 11 ++ .../Weapon/DefenderWeaponBehaviour.cpp | 146 ++++++++++++++++++ 6 files changed, 187 insertions(+), 23 deletions(-) create mode 100644 resources/Schema/Entities/FriendlyBoostAttachement.xml diff --git a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h index 0035d5eb..178f4eaf 100644 --- a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h @@ -41,6 +41,7 @@ private: // Utility Camera cameraFromEntity(EntityWrapper camera); + void CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi); }; #endif \ No newline at end of file diff --git a/resources/Schema/Entities/FriendlyBoostAttachement.xml b/resources/Schema/Entities/FriendlyBoostAttachement.xml new file mode 100644 index 00000000..38ac6643 --- /dev/null +++ b/resources/Schema/Entities/FriendlyBoostAttachement.xml @@ -0,0 +1,15 @@ + + + + + + Schema/Entities/FriendlyBoostBlueHUD.xml + + + + + + + + + diff --git a/resources/Schema/Entities/FriendlyBoostBlueHUD.xml b/resources/Schema/Entities/FriendlyBoostBlueHUD.xml index c181392e..1e0deebb 100644 --- a/resources/Schema/Entities/FriendlyBoostBlueHUD.xml +++ b/resources/Schema/Entities/FriendlyBoostBlueHUD.xml @@ -6,7 +6,7 @@ 0.5 - + @@ -78,6 +78,19 @@ + + + + \2 + Fonts/Hind-Edited.otf,64 + + + + + + + + @@ -92,19 +105,6 @@ - - - - \2 - Fonts/Hind-Edited.otf,64 - - - - - - - - diff --git a/resources/Schema/Entities/WeaponAssaultBlueView.xml b/resources/Schema/Entities/WeaponAssaultBlueView.xml index 36fbfc03..e1d6b852 100644 --- a/resources/Schema/Entities/WeaponAssaultBlueView.xml +++ b/resources/Schema/Entities/WeaponAssaultBlueView.xml @@ -224,15 +224,6 @@ - - - - Schema/Entities/AmmoShareEffectView.xml - - - - - diff --git a/resources/Schema/Entities/WeaponDefenderBlueView.xml b/resources/Schema/Entities/WeaponDefenderBlueView.xml index 37fd2722..a8bdd68b 100644 --- a/resources/Schema/Entities/WeaponDefenderBlueView.xml +++ b/resources/Schema/Entities/WeaponDefenderBlueView.xml @@ -218,6 +218,17 @@ + + + + Schema/Entities/FriendlyBoostBlueHUD.xml + + + + + + + diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index 275952d0..603f6991 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -10,6 +10,7 @@ void DefenderWeaponBehaviour::UpdateComponent(EntityWrapper& entity, ComponentWr void DefenderWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) { + CheckBoost(cWeapon, wi); // Decrement reload timer Field reloadTimer = cWeapon["ReloadTimer"]; reloadTimer = glm::max(0.0, reloadTimer - dt); @@ -518,3 +519,148 @@ Camera DefenderWeaponBehaviour::cameraFromEntity(EntityWrapper camera) cam.SetOrientation(glm::quat((const glm::vec3&)cTransform["Orientation"])); return cam; } + +void DefenderWeaponBehaviour::CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi) +{ + // Only check ammo client side + if (!IsClient) { + return; + } + + // Only handle ammo check for the local player + if (wi.Player != LocalPlayer) { + return; + } + + // Make sure the player isn't checking from the grave + if (!wi.Player.Valid()) { + return; + } + + // 3D-pick middle of screen + Rectangle viewport = m_Renderer->GetViewportSize(); + glm::vec2 centerScreen(viewport.Width / 2, viewport.Height / 2); + // TODO: Some horizontal spread + PickData pickData = m_Renderer->Pick(centerScreen); + EntityWrapper victim(m_World, pickData.Entity); + if (!victim.Valid()) { + return; + } + + // Don't let us somehow shoot ourselves in the foot + if (victim == LocalPlayer) { + return; + } + + // Only care about players being hit + if (!victim.HasComponent("Player")) { + victim = victim.FirstParentWithComponent("Player"); + } + if (!victim.Valid()) { + return; + } + + + // If friendly fire, reduce damage to 0 (needed to make Boosts, Ammosharing work) + if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { + + EntityWrapper friendlyBoostHudSpawner = wi.FirstPersonPlayerModel.FirstChildByName("FriendlyBoostAttachment"); + if (friendlyBoostHudSpawner.Valid()) { + + EntityWrapper assaultBoost = victim.FirstChildByName("BoostAssault"); + EntityWrapper defenderBoost = victim.FirstChildByName("BoostDefender"); + EntityWrapper sniperBoost = victim.FirstChildByName("BoostSniper"); + + auto children = m_World->GetDirectChildren(friendlyBoostHudSpawner.ID); + + if (children.first == children.second) { + if (friendlyBoostHudSpawner.HasComponent("Spawner")) { + + EntityWrapper friendlyBoostHud = SpawnerSystem::Spawn(friendlyBoostHudSpawner, friendlyBoostHudSpawner); + if (friendlyBoostHud.Valid()) { + EntityWrapper assaultBoostEntity = friendlyBoostHud.FirstChildByName("AssaultBoost"); + if (assaultBoostEntity.Valid()) { + EntityWrapper active = assaultBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (assaultBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } + } + } + + EntityWrapper defenderBoostEntity = friendlyBoostHud.FirstChildByName("DefenderBoost"); + if (defenderBoostEntity.Valid()) { + EntityWrapper active = defenderBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (defenderBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } + } + } + + EntityWrapper sniperBoostEntity = friendlyBoostHud.FirstChildByName("SniperBoost"); + if (sniperBoostEntity.Valid()) { + EntityWrapper active = sniperBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (sniperBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } + } + } + } + } + } else { + EntityWrapper friendlyBoostHud = friendlyBoostHudSpawner.FirstChildByName("FriendlyBoostHUD"); + if (friendlyBoostHud.Valid()) { + if (friendlyBoostHud.HasComponent("Lifetime")) { + (Field)friendlyBoostHud["Lifetime"]["Lifetime"] = 0.5; + } + + + + EntityWrapper assaultBoostEntity = friendlyBoostHud.FirstChildByName("AssaultBoost"); + if (assaultBoostEntity.Valid()) { + EntityWrapper active = assaultBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (assaultBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } + } + } + + EntityWrapper defenderBoostEntity = friendlyBoostHud.FirstChildByName("DefenderBoost"); + if (defenderBoostEntity.Valid()) { + EntityWrapper active = defenderBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (defenderBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } + } + } + + EntityWrapper sniperBoostEntity = friendlyBoostHud.FirstChildByName("SniperBoost"); + if (sniperBoostEntity.Valid()) { + EntityWrapper active = sniperBoostEntity.FirstChildByName("Active"); + if (active.HasComponent("Text")) { + if (sniperBoost.Valid()) { + (Field)active["Text"]["Visible"] = true; + } else { + (Field)active["Text"]["Visible"] = false; + } + } + } + } + } + } + } +} From 066ca6075dc1819defe5fbe0dbf03208d6279a0c Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 21:19:21 +0100 Subject: [PATCH 38/61] hp fixed? --- src/Game/Systems/HealthSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Game/Systems/HealthSystem.cpp b/src/Game/Systems/HealthSystem.cpp index c19d1b65..4343eeeb 100644 --- a/src/Game/Systems/HealthSystem.cpp +++ b/src/Game/Systems/HealthSystem.cpp @@ -58,7 +58,7 @@ bool HealthSystem::OnPlayerHealthPickup(Events::PlayerHealthPickup& e) ComponentWrapper cHealth = e.Player["Health"]; Field health = cHealth["Health"]; health += e.HealthAmount; - health = std::min((double)health, (double)cHealth["MaxHealth"]); + health = std::min(*health, (const double&)cHealth["MaxHealth"]); return true; } From 148d60f8f8e10adf58137d2b04283656338b613f Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 21:24:27 +0100 Subject: [PATCH 39/61] hp really fixed? --- src/Game/Systems/HealthHUDSystem.cpp | 8 ++++---- src/Game/Systems/PickupSpawnSystem.cpp | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Game/Systems/HealthHUDSystem.cpp b/src/Game/Systems/HealthHUDSystem.cpp index cd8a428f..efa70167 100644 --- a/src/Game/Systems/HealthHUDSystem.cpp +++ b/src/Game/Systems/HealthHUDSystem.cpp @@ -22,8 +22,8 @@ void HealthHUDSystem::Update(double dt) if (entityIDParent.HasComponent("Health")) { if (entity.HasComponent("Text")) { - Field health = entityIDParent["Health"]["Health"]; - Field maxHealth = entityIDParent["Health"]["Health"]; + double health = (const double&)entityIDParent["Health"]["Health"]; + double maxHealth = (const double&)entityIDParent["Health"]["Health"]; std::string s = ""; s = s + std::to_string((int)health); s = s + "/"; @@ -34,8 +34,8 @@ void HealthHUDSystem::Update(double dt) } if(entity.HasComponent("Fill")) { - Field health = entityIDParent["Health"]["Health"]; - Field maxHealth = entityIDParent["Health"]["Health"]; + double health = (const double&)entityIDParent["Health"]["Health"]; + double maxHealth = (const double&)entityIDParent["Health"]["Health"]; float healthPercentage = health/maxHealth; entity["Fill"]["Color"] = glm::vec4(1.0 - healthPercentage, 0.f, healthPercentage, glm::vec4(entity["Fill"]["Color"]).a); entity["Fill"]["Percentage"] = (double)healthPercentage; diff --git a/src/Game/Systems/PickupSpawnSystem.cpp b/src/Game/Systems/PickupSpawnSystem.cpp index b0efd696..c05d3bd2 100644 --- a/src/Game/Systems/PickupSpawnSystem.cpp +++ b/src/Game/Systems/PickupSpawnSystem.cpp @@ -45,7 +45,7 @@ void PickupSpawnSystem::Update(double dt) m_PickupAtMaximum.erase(it); break; } - if ((double)it->player["Health"]["Health"] < (double)it->player["Health"]["MaxHealth"]) { + if ((const double&)it->player["Health"]["Health"] < (const double&)it->player["Health"]["MaxHealth"]) { DoPickup(it->player, it->trigger); m_PickupAtMaximum.erase(it); break; @@ -59,7 +59,7 @@ bool PickupSpawnSystem::OnTriggerTouch(Events::TriggerTouch& e) return false; } //if at maxhealth, save the trigger-touch to a vector since standing inside it will not re-trigger the trigger - if ((double)e.Entity["Health"]["Health"] >= (double)e.Entity["Health"]["MaxHealth"]) { + if ((const double&)e.Entity["Health"]["Health"] >= (const double&)e.Entity["Health"]["MaxHealth"]) { m_PickupAtMaximum.push_back({ e.Entity, e.Trigger }); return false; } @@ -87,7 +87,7 @@ void PickupSpawnSystem::DoPickup(EntityWrapper &player, EntityWrapper &trigger) if (!trigger.Valid()) { return; } - double healthGiven = 0.01*(double)trigger["HealthPickup"]["HealthGain"] * (double)player["Health"]["MaxHealth"]; + double healthGiven = 0.01*(const double&)trigger["HealthPickup"]["HealthGain"] * (const double&)player["Health"]["MaxHealth"]; //only the server will increase the players hp and set it in the next delta Events::PlayerHealthPickup ePlayerHealthPickup; From 83ae87594fd3570e44b49927d0373a87293eaaaf Mon Sep 17 00:00:00 2001 From: Tleety Date: Sun, 13 Mar 2016 22:00:48 +0100 Subject: [PATCH 40/61] Fixed maxhealth probably --- src/Game/Systems/HealthHUDSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Game/Systems/HealthHUDSystem.cpp b/src/Game/Systems/HealthHUDSystem.cpp index efa70167..bfc63700 100644 --- a/src/Game/Systems/HealthHUDSystem.cpp +++ b/src/Game/Systems/HealthHUDSystem.cpp @@ -23,7 +23,7 @@ void HealthHUDSystem::Update(double dt) if (entity.HasComponent("Text")) { double health = (const double&)entityIDParent["Health"]["Health"]; - double maxHealth = (const double&)entityIDParent["Health"]["Health"]; + double maxHealth = (const double&)entityIDParent["Health"]["MaxHealth"]; std::string s = ""; s = s + std::to_string((int)health); s = s + "/"; From fd50ea3a12ddd0c7478cbc19ed0fa0a77a304079 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 22:02:37 +0100 Subject: [PATCH 41/61] Defender friendly boost hud --- resources/Schema/Entities/WeaponDefenderBlueView.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/Schema/Entities/WeaponDefenderBlueView.xml b/resources/Schema/Entities/WeaponDefenderBlueView.xml index a8bdd68b..9e3d6a51 100644 --- a/resources/Schema/Entities/WeaponDefenderBlueView.xml +++ b/resources/Schema/Entities/WeaponDefenderBlueView.xml @@ -150,12 +150,13 @@ R_Ammo_Joint + true - + @@ -224,7 +225,7 @@ Schema/Entities/FriendlyBoostBlueHUD.xml - + From ce2fcd91098876e0996ef906dab12bb190ea31b5 Mon Sep 17 00:00:00 2001 From: Tleety Date: Sun, 13 Mar 2016 22:13:37 +0100 Subject: [PATCH 42/61] Now it works --- src/Game/Systems/HealthHUDSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Game/Systems/HealthHUDSystem.cpp b/src/Game/Systems/HealthHUDSystem.cpp index bfc63700..70ccf465 100644 --- a/src/Game/Systems/HealthHUDSystem.cpp +++ b/src/Game/Systems/HealthHUDSystem.cpp @@ -35,7 +35,7 @@ void HealthHUDSystem::Update(double dt) if(entity.HasComponent("Fill")) { double health = (const double&)entityIDParent["Health"]["Health"]; - double maxHealth = (const double&)entityIDParent["Health"]["Health"]; + double maxHealth = (const double&)entityIDParent["Health"]["MaxHealth"]; float healthPercentage = health/maxHealth; entity["Fill"]["Color"] = glm::vec4(1.0 - healthPercentage, 0.f, healthPercentage, glm::vec4(entity["Fill"]["Color"]).a); entity["Fill"]["Percentage"] = (double)healthPercentage; From d587c9a6928c236b609013764b3574066b656552 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sun, 13 Mar 2016 22:17:55 +0100 Subject: [PATCH 43/61] Fixed first person strafe animation --- .../Engine/Input/FirstPersonInputController.h | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/include/Engine/Input/FirstPersonInputController.h b/include/Engine/Input/FirstPersonInputController.h index c159e113..67e7270e 100644 --- a/include/Engine/Input/FirstPersonInputController.h +++ b/include/Engine/Input/FirstPersonInputController.h @@ -212,6 +212,33 @@ bool FirstPersonInputController::OnCommand(const Events::InputComm m_EventBroker->Publish(aeb); } } + + + EntityWrapper firstPersonModel = m_PlayerEntity.FirstChildByName("Hands"); + if (firstPersonModel.Valid()) { + if (val > 0) { // Walk/Run + if (!m_Crouching) { + Events::AutoAnimationBlend aeb; + aeb.Duration = 0.1; + aeb.NodeName = "Run"; + aeb.RootNode = firstPersonModel; + aeb.SingleLevelBlend = true; + aeb.Start = true; + m_EventBroker->Publish(aeb); + } + } else if (val < 0) { // Walk/run Backwards + if (!m_Crouching) { + Events::AutoAnimationBlend aeb; + aeb.Duration = 0.1; + aeb.NodeName = "Run"; + aeb.RootNode = firstPersonModel; + aeb.SingleLevelBlend = true; + aeb.Start = true; + aeb.Reverse = true; + m_EventBroker->Publish(aeb); + } + } + } } } } From 00d77607b43e05b2f8c8a9951e3b627007d105d1 Mon Sep 17 00:00:00 2001 From: Ayumiwii Date: Sun, 13 Mar 2016 22:24:27 +0100 Subject: [PATCH 44/61] new scoreboard --- resources/Schema/Entities/ScoreBoard_Main.xml | 103 ++++++++++-------- 1 file changed, 55 insertions(+), 48 deletions(-) diff --git a/resources/Schema/Entities/ScoreBoard_Main.xml b/resources/Schema/Entities/ScoreBoard_Main.xml index ccc1df68..04bf74c9 100644 --- a/resources/Schema/Entities/ScoreBoard_Main.xml +++ b/resources/Schema/Entities/ScoreBoard_Main.xml @@ -2,60 +2,17 @@ - + + + + - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - - - + Schema/Entities/ScoreBoard_Red.xml @@ -63,6 +20,56 @@ + + + + 0.80000019073486328 + Models/Props/ScoreBoard/Scoreboard.mesh + false + + + + + + + + + + + 0.70000028610229492 + Models/Props/ScoreBoard/Spectatorboard.mesh + false + + + + + + + + + + + + Schema/Entities/ScoreBoard_Blue.xml + + + + + + + + + + + + + + + + + + + From e4145cf2920ee6ab3fec6f5ada880699600dc336 Mon Sep 17 00:00:00 2001 From: William Moberg Date: Sun, 13 Mar 2016 22:49:24 +0100 Subject: [PATCH 45/61] Fixed dash effect to be supported with the new animations using Fade components. Added bool Loop field in Fade component. --- include/Game/Systems/PlayerMovementSystem.h | 2 + resources/Schema/Components/BoostAssault.xml | 2 +- resources/Schema/Components/Fade.xml | 1 + resources/Schema/Components/Fade.xsd | 3 + resources/Schema/Entities/DashEffect.xml | 13 --- src/Game/Systems/FadeSystem.cpp | 4 +- src/Game/Systems/PlayerMovementSystem.cpp | 85 ++++++++++++++------ 7 files changed, 69 insertions(+), 41 deletions(-) delete mode 100644 resources/Schema/Entities/DashEffect.xml diff --git a/include/Game/Systems/PlayerMovementSystem.h b/include/Game/Systems/PlayerMovementSystem.h index feb1951e..60d25a42 100644 --- a/include/Game/Systems/PlayerMovementSystem.h +++ b/include/Game/Systems/PlayerMovementSystem.h @@ -32,6 +32,8 @@ private: glm::vec3 m_LastPosition = glm::vec3(); // Used to track afterimages for sprint effect. float m_SprintEffectTimer; + // Used to track afterimages for dash effect. + float m_DashEffectTimer; // The logic for making the sound play when player is moving void playerStep(double dt, EntityWrapper player); // Spawn a hexagon at origin of an Entity diff --git a/resources/Schema/Components/BoostAssault.xml b/resources/Schema/Components/BoostAssault.xml index c76fe21e..29378aec 100644 --- a/resources/Schema/Components/BoostAssault.xml +++ b/resources/Schema/Components/BoostAssault.xml @@ -1,4 +1,4 @@ - 2 + 1.35 diff --git a/resources/Schema/Components/Fade.xml b/resources/Schema/Components/Fade.xml index 94c942ca..2383b2a4 100644 --- a/resources/Schema/Components/Fade.xml +++ b/resources/Schema/Components/Fade.xml @@ -3,5 +3,6 @@ 1 true + true false \ No newline at end of file diff --git a/resources/Schema/Components/Fade.xsd b/resources/Schema/Components/Fade.xsd index 9c638258..c019678c 100644 --- a/resources/Schema/Components/Fade.xsd +++ b/resources/Schema/Components/Fade.xsd @@ -11,6 +11,9 @@ If the entity should fade out or in. + + If the effect should loop when it is done. + If the entity should reverse the fade after finishing, this will double the speed. diff --git a/resources/Schema/Entities/DashEffect.xml b/resources/Schema/Entities/DashEffect.xml deleted file mode 100644 index 6f28784d..00000000 --- a/resources/Schema/Entities/DashEffect.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - 0.5 - - - - - - - diff --git a/src/Game/Systems/FadeSystem.cpp b/src/Game/Systems/FadeSystem.cpp index 88460d53..f0e83eb5 100644 --- a/src/Game/Systems/FadeSystem.cpp +++ b/src/Game/Systems/FadeSystem.cpp @@ -24,14 +24,14 @@ void FadeSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFade, currentTime += dTime; if(currentTime > fadeTime) { - currentTime = 0.0; + currentTime = 0.0 + fadeTime * (bool)cFade["Loop"]; if ((bool)cFade["Reverse"]) { (Field)cFade["Out"] = !(bool)cFade["Out"]; currentTime = fadeTime; } } if(currentTime < 0.0) { - currentTime = fadeTime; + currentTime = fadeTime * (bool)cFade["Loop"]; if ((bool)cFade["Reverse"]) { (Field)cFade["Out"] = !(bool)cFade["Out"]; currentTime = 0.0; diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index 3cf1068d..7b49f474 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -3,6 +3,7 @@ PlayerMovementSystem::PlayerMovementSystem(SystemParams params) : System(params) , m_SprintEffectTimer(0.f) + , m_DashEffectTimer(0.f) { EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &PlayerMovementSystem::OnPlayerSpawned); EVENT_SUBSCRIBE_MEMBER(m_EDoubleJump, &PlayerMovementSystem::OnDoubleJump); @@ -24,23 +25,57 @@ void PlayerMovementSystem::Update(double dt) if (LocalPlayer.Valid()){ updateVelocity(LocalPlayer, dt); } - - - m_SprintEffectTimer += dt; - if (m_SprintEffectTimer < 0.016f) { + //m_SprintEffectTimer += dt; + //if (m_SprintEffectTimer < 0.016f) { + // return; + //} + //m_SprintEffectTimer = 0.f; + //auto pool = m_World->GetComponents("SprintAbility"); + //if (pool == nullptr) { + // return; + //} + //for (auto cSprint : *pool) { + // if (cSprint.EntityID != LocalPlayer.ID && (bool)cSprint["Active"]) { + // // Spawn one afterimage for each player that sprints. + // EntityWrapper player(m_World, cSprint.EntityID); + // auto entityFile = ResourceManager::Load("Schema/Entities/SprintEffect.xml"); + // EntityWrapper sprintEffect = entityFile->MergeInto(m_World); + // auto playerModel = player.FirstChildByName("PlayerModel"); + // if (!playerModel.Valid()) { + // continue; + // } + // if (!playerModel.HasComponent("Model")) { + // continue; + // } + // if (!playerModel.HasComponent("Animation")) { + // continue; + // } + // auto playerEntityModel = playerModel["Model"]; + // auto playerEntityAnimation = playerModel["Animation"]; + // playerEntityModel.Copy(sprintEffect["Model"]); + // playerEntityAnimation.Copy(sprintEffect["Animation"]); + // sprintEffect["ExplosionEffect"]["EndColor"] = (glm::vec4)playerEntityModel["Color"]; + // ((Field)sprintEffect["ExplosionEffect"]["EndColor"]).w(0.f); + // sprintEffect["Animation"]["Speed1"] = 0.0; + // sprintEffect["Animation"]["Speed2"] = 0.0; + // sprintEffect["Animation"]["Speed3"] = 0.0; + // sprintEffect["Transform"]["Position"] = (glm::vec3)player["Transform"]["Position"]; + // sprintEffect["Transform"]["Orientation"] = (glm::vec3)player["Transform"]["Orientation"]; + // } + //} + m_DashEffectTimer += dt; + if (m_DashEffectTimer < 0.046f) { return; } - m_SprintEffectTimer = 0.f; - auto pool = m_World->GetComponents("SprintAbility"); + m_DashEffectTimer = 0.f; + auto pool = m_World->GetComponents("DashAbility"); if (pool == nullptr) { return; } - for (auto cSprint : *pool) { - if (cSprint.EntityID != LocalPlayer.ID && (bool)cSprint["Active"]) { - // Spawn one afterimage for each player that sprints. - EntityWrapper player(m_World, cSprint.EntityID); - auto entityFile = ResourceManager::Load("Schema/Entities/SprintEffect.xml"); - EntityWrapper sprintEffect = entityFile->MergeInto(m_World); + for (auto cDash : *pool) { + if (cDash.EntityID != LocalPlayer.ID && (double)cDash["CoolDownMaxTimer"] - (double)cDash["CoolDownTimer"] < 0.5) { + // Spawn one afterimage for each player that Dashes. + EntityWrapper player(m_World, cDash.EntityID); auto playerModel = player.FirstChildByName("PlayerModel"); if (!playerModel.Valid()) { continue; @@ -48,20 +83,20 @@ void PlayerMovementSystem::Update(double dt) if (!playerModel.HasComponent("Model")) { continue; } - if (!playerModel.HasComponent("Animation")) { - continue; - } auto playerEntityModel = playerModel["Model"]; - auto playerEntityAnimation = playerModel["Animation"]; - playerEntityModel.Copy(sprintEffect["Model"]); - playerEntityAnimation.Copy(sprintEffect["Animation"]); - sprintEffect["ExplosionEffect"]["EndColor"] = (glm::vec4)playerEntityModel["Color"]; - ((Field)sprintEffect["ExplosionEffect"]["EndColor"]).w(0.f); - sprintEffect["Animation"]["Speed1"] = 0.0; - sprintEffect["Animation"]["Speed2"] = 0.0; - sprintEffect["Animation"]["Speed3"] = 0.0; - sprintEffect["Transform"]["Position"] = (glm::vec3)player["Transform"]["Position"]; - sprintEffect["Transform"]["Orientation"] = (glm::vec3)player["Transform"]["Orientation"]; + EntityWrapper dashEffect = playerModel.Clone(); + playerEntityModel.Copy(dashEffect["Model"]); + for (auto& cAnim : dashEffect.ChildrenWithComponent("Animation")) { + cAnim["Animation"]["Play"] = false; + } + dashEffect.AttachComponent("Lifetime"); + dashEffect.AttachComponent("Fade"); + dashEffect["Fade"]["Loop"] = false; + dashEffect["Fade"]["FadeTime"] = 0.5; + dashEffect["Fade"]["Time"] = (double)dashEffect["Fade"]["FadeTime"]; + dashEffect["Lifetime"]["Lifetime"] = (double)dashEffect["Fade"]["FadeTime"]; + dashEffect["Transform"]["Position"] = (glm::vec3)player["Transform"]["Position"]; + dashEffect["Transform"]["Orientation"] = (glm::vec3)player["Transform"]["Orientation"]; } } } From 9d2ce5af8a5df3c0104f6a7afffe631991a64220 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Sun, 13 Mar 2016 23:05:52 +0100 Subject: [PATCH 46/61] Player is now spawned as the correct class that they picked. --- include/Game/Systems/PlayerSpawnSystem.h | 6 +- include/Game/Systems/SpawnerSystem.h | 1 + resources/Schema/Components/PlayerSpawn.xml | 6 +- resources/Schema/Components/PlayerSpawn.xsd | 7 + resources/Schema/Entities/MovementTest.xml | 2987 ++++++++++++++++--- src/Game/Systems/PlayerSpawnSystem.cpp | 13 +- src/Game/Systems/SpawnerSystem.cpp | 15 +- 7 files changed, 2676 insertions(+), 359 deletions(-) diff --git a/include/Game/Systems/PlayerSpawnSystem.h b/include/Game/Systems/PlayerSpawnSystem.h index f74032f7..479f3bd0 100644 --- a/include/Game/Systems/PlayerSpawnSystem.h +++ b/include/Game/Systems/PlayerSpawnSystem.h @@ -19,9 +19,9 @@ private: enum class PlayerClass { None = 0, - Assault, - Defender, - Sniper + Assault = 1, + Defender = 2, + Sniper = 2 }; struct SpawnRequest { diff --git a/include/Game/Systems/SpawnerSystem.h b/include/Game/Systems/SpawnerSystem.h index c5b5b7b8..71ae2772 100644 --- a/include/Game/Systems/SpawnerSystem.h +++ b/include/Game/Systems/SpawnerSystem.h @@ -18,6 +18,7 @@ public: // will try to pick a spawn location so that the spawned entity doesn't // collide with anything that has that component and is collidable. static EntityWrapper Spawn(EntityWrapper spawner, EntityWrapper parent = EntityWrapper::Invalid, const std::string& dontCollideComponent = ""); + static EntityWrapper SpawnEntityFile(const std::string& entityFilePath, EntityWrapper spawner, EntityWrapper parent = EntityWrapper::Invalid, const std::string& dontCollideComponent = ""); private: EventRelay m_OnSpawnerSpawn; diff --git a/resources/Schema/Components/PlayerSpawn.xml b/resources/Schema/Components/PlayerSpawn.xml index edc1394e..b5d64879 100644 --- a/resources/Schema/Components/PlayerSpawn.xml +++ b/resources/Schema/Components/PlayerSpawn.xml @@ -1,2 +1,6 @@ - \ No newline at end of file + + Schema/Entities/PlayerAssaultBlue.xml + Schema/Entities/PlayerDefenderBlue.xml + + \ No newline at end of file diff --git a/resources/Schema/Components/PlayerSpawn.xsd b/resources/Schema/Components/PlayerSpawn.xsd index 6e321724..9c3afb00 100644 --- a/resources/Schema/Components/PlayerSpawn.xsd +++ b/resources/Schema/Components/PlayerSpawn.xsd @@ -7,5 +7,12 @@ Combined with a Spawner and a Team component, defines a spawn point for a player team. + + + + + + + diff --git a/resources/Schema/Entities/MovementTest.xml b/resources/Schema/Entities/MovementTest.xml index dd1b3211..c6e45bb6 100644 --- a/resources/Schema/Entities/MovementTest.xml +++ b/resources/Schema/Entities/MovementTest.xml @@ -3,8 +3,8 @@ - 2.9023438519963349 - 4 + 0.35657206405745967 + 0.5 @@ -261,209 +261,1157 @@ - - - - - - - 0.049999997019767761 + 0.014999999664723873 - - + + - + - + - + - + - + - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Sniper-01.png - - PickClass - 3 - - - - - - - - - - - Sniper - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Assault-01.png - - - PickClass + PickTeam 1 - - + - + - - Assault - Fonts/DroidSans.ttf,64 - - + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + + + + PickClass + 1 + - - + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + + + Blend + + + + + 1.6000000238418579 + Models/Characters/Assault/AssaultBluePose.mesh + false + + + + + + + + + + + + AssaultPoseF + + true + + + + + + + + + R_Arm_Weapon_Joint + + + Models/Weapons/Blue/AssaultWeaponBlue.mesh + + + + + + + + + + + + Models/Core/UnitSphere.mesh + false + + + 0.30000001192092896 + + + + + + + + + + + + + + + + + + + + + \1 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + Assault + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + 100 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Team Speed Boost + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \1 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + \4 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \7 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dash + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Icons/Abilities/Square/Superman-01.png + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Icons/Shoe-01.png + + + + + + + + + + + + x2 Jump + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + - + - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Defender-01.png - - PickClass - 2 + PickTeam + 1 - - - - + - + - - Defender - Fonts/DroidSans.ttf,64 - - + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + + + + PickClass + 2 + - - + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + + + Blend + + + + + 1.6000000238418579 + Models/Characters/Defender/DefenderBluePose.mesh + false + + + + + + + + + + + + DefenderPoseF + + true + + + + + + + + + R_Arm_Weapon_Joint + + + Models/Weapons/Blue/DefenderWeaponBlue.mesh + + + + + + + + + + + + Models/Core/UnitSphere.mesh + false + + + 0.30000001192092896 + + + + + + + + + + + + + + + + + + + + + \2 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + Defender + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + 150 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Team Shield Boost + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \2 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + \5 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \7 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Personal Shield + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Icons/Abilities/Square/SheildDots-01.png + + + + + + + + + + + + + + + - + - - Pick Class - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - SwapToTeamPick + PickTeam 1 - - + - + - - Change - Fonts/DroidSans.ttf,64 - + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + + + + PickClass + 3 + - - + - + - - Team - Fonts/DroidSans.ttf,64 - + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + + + Blend + + + + + 1.6000000238418579 + Models/Characters/Sniper/SniperBluePose.mesh + false + - - + + + - + + + + + SniperPoseF + + true + + + + + + + + + R_Arm_Weapon_Joint + + + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + + + + + + + + + + + + Models/Core/UnitSphere.mesh + false + + + 0.30000001192092896 + + + + + + + + + + + + + + + + + + + + + \3 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + Sniper + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + 100 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Team Accuracy Boost + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \3 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + \6 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \7 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sprint + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Icons/Abilities/Square/Dash-01.png + + + + + + + + + + + + + + @@ -480,53 +1428,119 @@ - + - + - - Pick Team - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - PickTeam - 1 - - - - + - + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + PickTeam + 3 + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + - Spectator + Blue Fonts/DroidSans.ttf,64 + + + - - + + @@ -535,121 +1549,228 @@ - - - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - PickTeam - 2 - - - + - + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + PickTeam + 2 + + + + + + + + Red Fonts/DroidSans.ttf,64 + + + - - + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + - + - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - PickTeam - 3 - - - + - + - - Blue - Fonts/DroidSans.ttf,64 - + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + PickTeam + 1 + - - + - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - false - - - SwapToClassPick - 1 - - - - - - - - + - Change + Spectator Fonts/DroidSans.ttf,64 - false - - + + - + - - Class - Fonts/DroidSans.ttf,64 - false - - - - - + - + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + @@ -673,7 +1794,7 @@ - 2 + 1 Fonts/DroidSans.ttf,64 @@ -747,6 +1868,7 @@ + 1 @@ -823,8 +1945,7 @@ - 0.10332605343919568 - + 1 @@ -837,7 +1958,7 @@ - + @@ -862,7 +1983,8 @@ - + 1 + @@ -873,7 +1995,7 @@ - + @@ -883,154 +2005,1319 @@ - + - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - SwapToTeamPick - 1 - - - + - + - - Change - Fonts/DroidSans.ttf,64 - - - + - + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + SwapToTeamPick + 1 + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + + Change Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + - + - - Team - Fonts/DroidSans.ttf,64 - - - + - + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + SwapToClassPick + 1 + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + + Change Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - SwapToClassPick + PickTeam 1 - - + - + - - Change - Fonts/DroidSans.ttf,64 - + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + + + + PickClass + 1 + - - + - + - - Class - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - - - \C08366D\1\CFFFFFF Dahl \4 \C08366D\1\CFFFFFF Dahl - Fonts/Hind-Edited.otf,64 - - - - - + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + - + - - \C08366D\1\CFFFFFF Dahl \4 \C08366D\1\CFFFFFF Dahl - Fonts/Hind-Edited.otf,64 - - - - + + Blend + + + + + 1.6000000238418579 + Models/Characters/Assault/AssaultRedPose.mesh + false + - + + + + + + + + + + AssaultPoseF + + true + + + + + + + + + R_Arm_Weapon_Joint + + + Models/Weapons/Red/AssaultWeaponRed.mesh + + + + + + + + + + + + Models/Core/UnitSphere.mesh + false + + + 0.30000001192092896 + + + + + + + + + + + + + + + + + + + + + \1 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + Assault + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + 100 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Team Speed Boost + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \1 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + \4 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \7 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dash + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Icons/Abilities/Square/Superman-01.png + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Icons/Shoe-01.png + + + + + + + + + + + + x2 Jump + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + PickTeam + 1 + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + + + + PickClass + 2 + + + - + - - - Fonts/Hind-Edited.otf,64 - - - - + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + + + Blend + + + + + 1.6000000238418579 + Models/Characters/Defender/DefenderRedPose.mesh + false + - + + + + + + + + + + DefenderPoseF + + true + + + + + + + + + R_Arm_Weapon_Joint + + + Models/Weapons/Red/DefenderWeaponRed.mesh + + + + + + + + + + + + Models/Core/UnitSphere.mesh + false + + + 0.30000001192092896 + + + + + + + + + + + + + + + + + + + + + \2 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + Defender + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + 150 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Team Shield Boost + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \2 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + \5 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \7 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Personal Shield + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Icons/Abilities/Square/SheildDots-01.png + + + + + + + + + + + + + + + + + + + + + PickTeam + 1 + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + + + + PickClass + 3 + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + + + Blend + + + + + 1.6000000238418579 + Models/Characters/Sniper/SniperRedPose.mesh + false + + + + + + + + + + + + SniperPoseF + + true + + + + + + + + + R_Arm_Weapon_Joint + + + Models/Weapons/Red/SecondaryWeaponRed.mesh + + + + + + + + + + + + Models/Core/UnitSphere.mesh + false + + + 0.30000001192092896 + + + + + + + + + + + + + + + + + + + + + \3 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + Sniper + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + 100 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Team Accuracy Boost + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \3 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + \6 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + \7 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sprint + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Icons/Abilities/Square/Dash-01.png + + + + + + + + + + + + + + + diff --git a/src/Game/Systems/PlayerSpawnSystem.cpp b/src/Game/Systems/PlayerSpawnSystem.cpp index ac33edb7..339a850c 100644 --- a/src/Game/Systems/PlayerSpawnSystem.cpp +++ b/src/Game/Systems/PlayerSpawnSystem.cpp @@ -83,15 +83,24 @@ void PlayerSpawnSystem::Update(double dt) if (it->Team == cSpawnerTeam["Team"].Enum("Spectator")) { ++playersSpectating; break; + } else { + continue; } - continue; } } // TODO: Choose a different spawner depending on class picked? + std::string playerEntityFile; + if (it->Class == PlayerClass::Assault) { + playerEntityFile = (const std::string&)cPlayerSpawn["AssaultFile"]; + } else if (it->Class == PlayerClass::Defender) { + playerEntityFile = (const std::string&)cPlayerSpawn["DefenderFile"]; + } else if (it->Class == PlayerClass::Sniper) { + playerEntityFile = (const std::string&)cPlayerSpawn["SniperFile"]; + } // Spawn the player! - EntityWrapper player = SpawnerSystem::Spawn(spawner, EntityWrapper::Invalid, "Player"); + EntityWrapper player = SpawnerSystem::SpawnEntityFile(playerEntityFile, spawner, EntityWrapper::Invalid, "Player"); // Set the player team affiliation player["Team"]["Team"] = it->Team; diff --git a/src/Game/Systems/SpawnerSystem.cpp b/src/Game/Systems/SpawnerSystem.cpp index 825c9e99..fb770bb5 100644 --- a/src/Game/Systems/SpawnerSystem.cpp +++ b/src/Game/Systems/SpawnerSystem.cpp @@ -8,6 +8,17 @@ SpawnerSystem::SpawnerSystem(SystemParams params) } EntityWrapper SpawnerSystem::Spawn(EntityWrapper spawner, EntityWrapper parent /*= EntityWrapper::Invalid*/, const std::string& dontCollideComponent) +{ + // Load the entity file and parse it + const std::string& entityFilePath = spawner["Spawner"]["EntityFile"]; + if (!entityFilePath.empty()) { + return SpawnEntityFile(entityFilePath, spawner, parent, dontCollideComponent); + } else { + return EntityWrapper::Invalid; + } +} + +EntityWrapper SpawnerSystem::SpawnEntityFile(const std::string& entityFilePath, EntityWrapper spawner, EntityWrapper parent /*= EntityWrapper::Invalid*/, const std::string& dontCollideComponent /*= ""*/) { // Spawn the entity in the parent's world if it exists, otherwise in the spawner's world World* world = parent.World; @@ -15,8 +26,6 @@ EntityWrapper SpawnerSystem::Spawn(EntityWrapper spawner, EntityWrapper parent / world = spawner.World; } - // Load the entity file and parse it - const std::string& entityFilePath = spawner["Spawner"]["EntityFile"]; EntityWrapper spawnedEntity; try { auto entityFile = ResourceManager::Load(entityFilePath); @@ -39,7 +48,7 @@ EntityWrapper SpawnerSystem::Spawn(EntityWrapper spawner, EntityWrapper parent / // Find any SpawnPoints existing as children of spawner auto children = spawner.World->GetDirectChildren(spawner.ID); - std::vector spawnPoints; + std::list spawnPoints; for (auto kv = children.first; kv != children.second; ++kv) { const EntityID& child = kv->second; if (spawner.World->HasComponent(child, "SpawnPoint")) { From 0084224e18c00607909ac55d322daf2e7ea60e5b Mon Sep 17 00:00:00 2001 From: William Moberg Date: Sun, 13 Mar 2016 23:23:05 +0100 Subject: [PATCH 47/61] WIP, dash effect fade weapon. --- src/Game/Systems/PlayerMovementSystem.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index 7b49f474..74a8de7e 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -64,7 +64,7 @@ void PlayerMovementSystem::Update(double dt) // } //} m_DashEffectTimer += dt; - if (m_DashEffectTimer < 0.046f) { + if (m_DashEffectTimer < 0.075f) { return; } m_DashEffectTimer = 0.f; @@ -89,6 +89,13 @@ void PlayerMovementSystem::Update(double dt) for (auto& cAnim : dashEffect.ChildrenWithComponent("Animation")) { cAnim["Animation"]["Play"] = false; } + for (auto& cModel : dashEffect.ChildrenWithComponent("Model")) { + Entity.AttachComponent("Lifetime"); + dashEffect.AttachComponent("Fade"); + dashEffect["Fade"]["Loop"] = false; + dashEffect["Fade"]["FadeTime"] = 0.5; + dashEffect["Fade"]["Time"] = (double)dashEffect["Fade"]["FadeTime"]; + } dashEffect.AttachComponent("Lifetime"); dashEffect.AttachComponent("Fade"); dashEffect["Fade"]["Loop"] = false; From be91fc50054ccb9608b65b92d83f75df98bbd930 Mon Sep 17 00:00:00 2001 From: William Moberg Date: Sun, 13 Mar 2016 23:23:36 +0100 Subject: [PATCH 48/61] WIP dash effect fade weapon 2. --- src/Game/Systems/PlayerMovementSystem.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index 74a8de7e..71954a8f 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -90,11 +90,12 @@ void PlayerMovementSystem::Update(double dt) cAnim["Animation"]["Play"] = false; } for (auto& cModel : dashEffect.ChildrenWithComponent("Model")) { - Entity.AttachComponent("Lifetime"); - dashEffect.AttachComponent("Fade"); - dashEffect["Fade"]["Loop"] = false; - dashEffect["Fade"]["FadeTime"] = 0.5; - dashEffect["Fade"]["Time"] = (double)dashEffect["Fade"]["FadeTime"]; + EntityWrapper e(m_World, cModel.ID); + e.AttachComponent("Lifetime"); + e.AttachComponent("Fade"); + e["Fade"]["Loop"] = false; + e["Fade"]["FadeTime"] = 0.5; + e["Fade"]["Time"] = (double)dashEffect["Fade"]["FadeTime"]; } dashEffect.AttachComponent("Lifetime"); dashEffect.AttachComponent("Fade"); From 36185b43eff0f8205eb11aac87d42436e44a652c Mon Sep 17 00:00:00 2001 From: Tleety Date: Sun, 13 Mar 2016 23:30:17 +0100 Subject: [PATCH 49/61] Killfeed in overwatch camera --- resources/Schema/Entities/OverwatchCamera.xml | 152 ++++++++++++------ src/Engine/Rendering/DrawFinalPass.cpp | 1 - 2 files changed, 103 insertions(+), 50 deletions(-) diff --git a/resources/Schema/Entities/OverwatchCamera.xml b/resources/Schema/Entities/OverwatchCamera.xml index e65f6604..dc8d2cfe 100644 --- a/resources/Schema/Entities/OverwatchCamera.xml +++ b/resources/Schema/Entities/OverwatchCamera.xml @@ -8,7 +8,7 @@ - + @@ -69,21 +69,6 @@ - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - - @@ -100,6 +85,21 @@ + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + @@ -157,7 +157,7 @@ AssaultPoseF - + true @@ -173,7 +173,7 @@ Models/Weapons/Blue/AssaultWeaponBlue.mesh - + @@ -556,7 +556,7 @@ DefenderPoseF - + true @@ -572,8 +572,8 @@ Models/Weapons/Blue/DefenderWeaponBlue.mesh - - + + @@ -829,6 +829,22 @@ + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + @@ -860,22 +876,6 @@ - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - - - @@ -917,7 +917,7 @@ SniperPoseF - + true @@ -933,8 +933,8 @@ Models/Weapons/Blue/SecondaryWeaponBlue.mesh - - + + @@ -1534,7 +1534,7 @@ - 7 + 2 Fonts/DroidSans.ttf,64 @@ -1922,6 +1922,60 @@ + + + + + + + + + + + + + + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + @@ -2062,7 +2116,7 @@ AssaultPoseF - + true @@ -2078,7 +2132,7 @@ Models/Weapons/Red/AssaultWeaponRed.mesh - + @@ -2461,7 +2515,7 @@ DefenderPoseF - + true @@ -2477,8 +2531,8 @@ Models/Weapons/Red/DefenderWeaponRed.mesh - - + + @@ -2822,7 +2876,7 @@ SniperPoseF - + true @@ -2838,8 +2892,8 @@ Models/Weapons/Red/SecondaryWeaponRed.mesh - - + + diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index 3d3127fd..19046bf0 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -414,7 +414,6 @@ void DrawFinalPass::ClearBuffer() GLERROR("END"); } - void DrawFinalPass::OnWindowResize() { if (m_FinalPassFrameBuffer->MultiSampling() != (bool)m_MSAA) { From 12d0c68fbf5e3c84a8997306cf4ffd7841d1488c Mon Sep 17 00:00:00 2001 From: William Moberg Date: Sun, 13 Mar 2016 23:57:47 +0100 Subject: [PATCH 50/61] Weapon should fade on dash effect afterimage. --- src/Game/Systems/PlayerMovementSystem.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index 71954a8f..d2a8594a 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -83,26 +83,26 @@ void PlayerMovementSystem::Update(double dt) if (!playerModel.HasComponent("Model")) { continue; } - auto playerEntityModel = playerModel["Model"]; EntityWrapper dashEffect = playerModel.Clone(); - playerEntityModel.Copy(dashEffect["Model"]); for (auto& cAnim : dashEffect.ChildrenWithComponent("Animation")) { cAnim["Animation"]["Play"] = false; } + const double fadeTime = 0.5f; for (auto& cModel : dashEffect.ChildrenWithComponent("Model")) { EntityWrapper e(m_World, cModel.ID); e.AttachComponent("Lifetime"); e.AttachComponent("Fade"); e["Fade"]["Loop"] = false; - e["Fade"]["FadeTime"] = 0.5; - e["Fade"]["Time"] = (double)dashEffect["Fade"]["FadeTime"]; + e["Fade"]["FadeTime"] = fadeTime; + e["Fade"]["Time"] = fadeTime; + e["Lifetime"]["Lifetime"] = fadeTime; } dashEffect.AttachComponent("Lifetime"); dashEffect.AttachComponent("Fade"); dashEffect["Fade"]["Loop"] = false; - dashEffect["Fade"]["FadeTime"] = 0.5; - dashEffect["Fade"]["Time"] = (double)dashEffect["Fade"]["FadeTime"]; - dashEffect["Lifetime"]["Lifetime"] = (double)dashEffect["Fade"]["FadeTime"]; + dashEffect["Fade"]["FadeTime"] = fadeTime; + dashEffect["Fade"]["Time"] = fadeTime; + dashEffect["Lifetime"]["Lifetime"] = fadeTime; dashEffect["Transform"]["Position"] = (glm::vec3)player["Transform"]["Position"]; dashEffect["Transform"]["Orientation"] = (glm::vec3)player["Transform"]["Orientation"]; } From c493ebca8e4b8acdbce596fcf146fd27f72d9f80 Mon Sep 17 00:00:00 2001 From: Tleety Date: Mon, 14 Mar 2016 00:23:51 +0100 Subject: [PATCH 51/61] Viewpunch for sidearm and defender --- .../Schema/Components/DefenderWeapon.xml | 4 +-- resources/Schema/Components/SidearmWeapon.xml | 5 ++- resources/Schema/Components/SidearmWeapon.xsd | 7 ++++ .../Weapon/DefenderWeaponBehaviour.cpp | 34 +++++++++---------- .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 34 +++++++++++++++++++ 5 files changed, 64 insertions(+), 20 deletions(-) diff --git a/resources/Schema/Components/DefenderWeapon.xml b/resources/Schema/Components/DefenderWeapon.xml index 9c3861cd..f2e7b3d9 100755 --- a/resources/Schema/Components/DefenderWeapon.xml +++ b/resources/Schema/Components/DefenderWeapon.xml @@ -10,8 +10,8 @@ 0.174533 9 120 - 0.03 - 0.2 + 0.15 + 0.3 0.5 false 0 diff --git a/resources/Schema/Components/SidearmWeapon.xml b/resources/Schema/Components/SidearmWeapon.xml index a41bc201..6f505d0c 100644 --- a/resources/Schema/Components/SidearmWeapon.xml +++ b/resources/Schema/Components/SidearmWeapon.xml @@ -6,7 +6,9 @@ 20 500 false - 0.01 + 0.05 + 0.174533 + 0.2 1.0 0.5 false @@ -14,4 +16,5 @@ false false 0 + 0 \ No newline at end of file diff --git a/resources/Schema/Components/SidearmWeapon.xsd b/resources/Schema/Components/SidearmWeapon.xsd index 2c1df4a1..fcb40c8f 100644 --- a/resources/Schema/Components/SidearmWeapon.xsd +++ b/resources/Schema/Components/SidearmWeapon.xsd @@ -36,6 +36,12 @@ View punch in radians for each shell fired + + Maximum vertical aim travel angle in radians + + + The speed in radians per second the view returns to its original position after being punched + Time it takes to load ONE SHELL into the weapon in seconds @@ -47,6 +53,7 @@ + diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index 603f6991..945c6071 100644 --- a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp @@ -324,23 +324,23 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi spawnTracers(cWeapon, wi, pattern); // View punch - //if (IsClient) { - // EntityWrapper camera = wi.Player.FirstChildByName("Camera"); - // if (camera.Valid()) { - // glm::vec3& cameraOrientation = camera["Transform"]["Orientation"]; - // float viewPunch = cWeapon["ViewPunch"]; - // float maxTravelAngle = cWeapon["MaxTravelAngle"]; - // float& currentTravel = cWeapon["CurrentTravel"]; - // if (currentTravel < maxTravelAngle) { - // float change = viewPunch; - // if (currentTravel + change > maxTravelAngle) { - // change = maxTravelAngle - currentTravel; - // } - // cameraOrientation.x += change; - // currentTravel += change; - // } - // } - //} + if (IsClient) { + EntityWrapper camera = wi.Player.FirstChildByName("Camera"); + if (camera.Valid()) { + Field cameraOrientation = camera["Transform"]["Orientation"]; + float viewPunch = cWeapon["ViewPunch"]; + float maxTravelAngle = (const float&)cWeapon["MaxTravelAngle"]; + Field currentTravel = cWeapon["CurrentTravel"]; + if (currentTravel < maxTravelAngle) { + float change = viewPunch; + if (currentTravel + change > maxTravelAngle) { + change = maxTravelAngle - currentTravel; + } + cameraOrientation.x(cameraOrientation.x() + change); + currentTravel += change; + } + } + } // Play animation playAnimationAndReturn(wi.FirstPersonEntity, "FinalBlend", "Fire"); diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index 97144b60..57534786 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -69,6 +69,21 @@ void SidearmWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& } } + // Restore view angle + if (IsClient) { + Field currentTravel = cWeapon["CurrentTravel"]; + Field returnSpeed = cWeapon["ViewReturnSpeed"]; + if (currentTravel > 0) { + float change = returnSpeed * dt; + currentTravel = glm::max(0.f, currentTravel - change); + EntityWrapper camera = wi.Player.FirstChildByName("Camera"); + if (camera.Valid()) { + Field cameraOrientation = camera["Transform"]["Orientation"]; + cameraOrientation.x(cameraOrientation.x() - change); + } + } + } + if ((bool)cWeapon["Automatic"] && canFire(cWeapon)) { fireBullet(cWeapon, wi); } @@ -183,6 +198,25 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi magAmmo -= 1; } + // View punch + if (IsClient) { + EntityWrapper camera = wi.Player.FirstChildByName("Camera"); + if (camera.Valid()) { + Field cameraOrientation = camera["Transform"]["Orientation"]; + float viewPunch = cWeapon["ViewPunch"]; + float maxTravelAngle = cWeapon["MaxTravelAngle"]; + Field currentTravel = cWeapon["CurrentTravel"]; + if (currentTravel < maxTravelAngle) { + float change = viewPunch; + if (currentTravel + change > maxTravelAngle) { + change = maxTravelAngle - currentTravel; + } + cameraOrientation.x(cameraOrientation.x() + change); + currentTravel += change; + } + } + } + // Get weapon model based on current person EntityWrapper weaponModelEntity = getRelevantWeaponEntity(wi); if (!weaponModelEntity.Valid()) { From fd482dd67011e93b3c1953b9f14c3c92997e5a76 Mon Sep 17 00:00:00 2001 From: Tleety Date: Mon, 14 Mar 2016 00:37:29 +0100 Subject: [PATCH 52/61] Axyz logo in menu --- assets | 2 +- resources/Schema/Entities/StartMenu.xml | 7493 +++++++++-------- .../Schema/Entities/StartMenu_simple.xml | 114 +- 3 files changed, 3834 insertions(+), 3775 deletions(-) diff --git a/assets b/assets index 2c75d24d..b6027bf4 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 2c75d24ddfeb29c266d98a6d637b6c5768c5cafe +Subproject commit b6027bf49fead547fb212c6a70f03015af3b92df diff --git a/resources/Schema/Entities/StartMenu.xml b/resources/Schema/Entities/StartMenu.xml index 86ee626e..ae7744aa 100644 --- a/resources/Schema/Entities/StartMenu.xml +++ b/resources/Schema/Entities/StartMenu.xml @@ -22,7 +22,7 @@ - 0.53338721940212963 + 1.1666849700106923 @@ -54,8 +54,7 @@ - Models/Props/Walls/SciFiWallBig.mesh - true + Models/Props/Walls/SciFiWallMedium.mesh @@ -65,7 +64,8 @@ - Models/Props/Walls/SciFiWallMedium.mesh + Models/Props/Walls/SciFiWallBig.mesh + true @@ -697,6 +697,19 @@ + + + + + Models/Highgrounds/Hg17.mesh + + + + + + + + @@ -757,19 +770,6 @@ - - - - - Models/Highgrounds/Hg17.mesh - - - - - - - - @@ -1436,6 +1436,2474 @@ + + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridge1Blue.mesh + + + + + + + + + + + + Models/Props/Pillars/SciFiBridgePillar1.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridge1Blue.mesh + + + + + + + + + + + + Models/Props/Pillars/SciFiBridgePillar1.mesh + + + + + + + + + + + + + + + + + Models/Props/Pillars/SciFiBridgePillar1.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridge1Blue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridge1Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + + Models/Core/UnitPlane.mesh + + true + + + + + + + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 5 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 4 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 2 + 1 + + + + + + + + + + + + 2 + + + + + + + + + + + + 3 + + + + + + + + + + + + + + 4 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Flora/SpecialRoot.mesh + + + + + + + + + + + + + + Models/Props/Flora/SpecialRoot.mesh + + + + + + + + + + + + + + Models/Props/Flora/SpecialRoot.mesh + + + + + + + + + + + + + Models/Props/Flora/SpecialRoot.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + @@ -2698,6 +5166,21 @@ + + + + Models/Core/UnitPlane.mesh + + true + + + + + + + + + @@ -2818,7 +5301,6 @@ - 8 @@ -2828,9 +5310,10 @@ - + + @@ -2860,7 +5343,6 @@ - 8 @@ -2870,9 +5352,10 @@ - + + @@ -2902,7 +5385,6 @@ - 8 @@ -2912,9 +5394,10 @@ - + + @@ -2944,7 +5427,6 @@ - 8 @@ -2954,9 +5436,10 @@ - + + @@ -2986,7 +5469,6 @@ - 8 @@ -2996,9 +5478,10 @@ - + + @@ -3028,7 +5511,6 @@ - 8 @@ -3038,9 +5520,10 @@ - + + @@ -3070,7 +5553,6 @@ - 8 @@ -3080,9 +5562,10 @@ - + + @@ -3112,7 +5595,6 @@ - 8 @@ -3122,9 +5604,10 @@ - + + @@ -3154,7 +5637,6 @@ - 8 @@ -3164,9 +5646,10 @@ - + + @@ -3227,6 +5710,450 @@ + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + @@ -3294,20 +6221,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3322,20 +6235,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -3350,19 +6249,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3377,19 +6263,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -3404,20 +6277,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3432,19 +6291,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3458,20 +6304,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3486,19 +6318,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3512,19 +6331,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3538,19 +6344,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -3565,20 +6358,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3592,20 +6371,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3620,19 +6385,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3647,19 +6399,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -3673,20 +6412,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3700,18 +6425,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - @@ -3725,20 +6438,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -3753,20 +6452,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3780,20 +6465,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3807,19 +6478,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - @@ -3833,19 +6491,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3860,19 +6505,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3940,20 +6572,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3968,20 +6586,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3996,19 +6600,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -4022,20 +6613,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - @@ -4050,19 +6627,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -4076,20 +6640,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - @@ -4103,19 +6653,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -4130,20 +6667,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - @@ -4157,19 +6680,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -4184,20 +6694,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -4212,19 +6708,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -4240,26 +6723,37 @@ - - - - Models/Core/UnitPlane.mesh - - true - - - - - - - - - + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + @@ -4286,19 +6780,6 @@ - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - @@ -4312,19 +6793,6 @@ - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - @@ -4332,6 +6800,20 @@ + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + @@ -4345,6 +6827,165 @@ + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + @@ -4358,19 +6999,6 @@ - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -4385,19 +7013,6 @@ - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - @@ -4411,20 +7026,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -4438,19 +7039,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - @@ -4519,20 +7107,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -4573,20 +7147,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -4600,20 +7160,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -4628,19 +7174,6 @@ - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - @@ -4655,45 +7188,6 @@ - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - @@ -4708,19 +7202,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - @@ -4735,19 +7216,6 @@ - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -4776,8 +7244,8 @@ Models/Props/Walls/SpecialWall1.mesh - - + + @@ -4790,8 +7258,8 @@ Models/Props/Walls/SpecialWall1.mesh - - + + @@ -4820,6 +7288,43 @@ + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + @@ -4832,8 +7337,8 @@ Models/Props/Stones/AssaultHolder.mesh - - + + @@ -4845,9 +7350,8 @@ Models/Props/Stones/AssaultHolder.mesh - - - + + @@ -4859,48 +7363,8 @@ Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - + + @@ -4926,8 +7390,35 @@ Models/Props/Stones/AssaultHolder.mesh - - + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + @@ -4952,9 +7443,8 @@ Models/Props/Stones/AssaultHolder.mesh - - - + + @@ -4966,8 +7456,62 @@ Models/Props/Stones/AssaultHolder.mesh - - + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + @@ -4999,19 +7543,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -5026,19 +7557,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -5053,19 +7571,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -5073,6 +7578,75 @@ + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/smallWall3.mesh + + + + + + + + + @@ -5099,20 +7673,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -5126,20 +7686,6 @@ - - - - - Models/Props/Walls/smallWall3.mesh - - - - - - - - - @@ -5154,19 +7700,6 @@ - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -5180,20 +7713,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -5208,20 +7727,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -5251,7 +7756,6 @@ - 8 @@ -5261,9 +7765,10 @@ - + + @@ -5293,7 +7798,6 @@ - 8 @@ -5303,9 +7807,10 @@ - + + @@ -5315,48 +7820,24 @@ - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + @@ -5375,12 +7856,12 @@ - Models/Props/Stones/MediumStone2.mesh + Models/Props/Stones/SmallStone2.mesh - - - + + + @@ -5392,8 +7873,88 @@ Models/Props/Stones/SmallStone1.mesh - - + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + @@ -5437,19 +7998,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -5516,19 +8064,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -5543,19 +8078,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -5570,19 +8092,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -5596,20 +8105,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -5624,19 +8119,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -5651,20 +8133,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5683,2474 +8151,6 @@ - - - - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 5 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 4 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 2 - - - - - - - - - - - - 3 - - - - - - - - - - - - 2 - 1 - - - - - - - - - - - - - - 4 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar1Blue.mesh - - - - - - - - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridge1Blue.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFiBridge1Blue.mesh - - - - - - - - - - - - Models/Props/Pillars/SciFiBridgePillar1.mesh - - - - - - - - - - - - - - - Models/Props/Pillars/SciFiBridgePillar1.mesh - - - - - - - - - - - - - - - Models/Props/Pillars/SciFiBridgePillar1.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridge1Blue.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridge1Blue.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/Flora/SpecialRoot.mesh - - - - - - - - - - - - - - Models/Props/Flora/SpecialRoot.mesh - - - - - - - - - - - - - Models/Props/Flora/SpecialRoot.mesh - - - - - - - - - - - - - - Models/Props/Flora/SpecialRoot.mesh - - - - - - - - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - - Models/Core/UnitPlane.mesh - - true - - - - - - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - @@ -8161,6 +8161,49 @@ + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + @@ -8205,20 +8248,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - @@ -8262,20 +8291,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - @@ -8319,21 +8334,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - @@ -8373,6 +8373,18 @@ + + + + + 10 + + + + + + + @@ -8406,18 +8418,6 @@ - - - - - 10 - - - - - - - @@ -8459,7 +8459,11 @@ - + + Schema/Entities/PlayerAssaultBlue.xml + Schema/Entities/PlayerDefenderBlue.xml + + Schema/Entities/PlayerAssaultRed.xml @@ -8468,6 +8472,19 @@ + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + @@ -8507,211 +8524,6 @@ - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 3 - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 15 - 1 - - - - - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - - - - - - - - - - -15 - - - - 4 - - - - - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 15 - 2 - - - - - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointRed.mesh - - - - - - - - - - 15 - - - - - - - - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - @@ -8721,7 +8533,11 @@ - + + Schema/Entities/PlayerAssaultBlue.xml + Schema/Entities/PlayerDefenderBlue.xml + + Schema/Entities/PlayerAssaultBlue.xml @@ -8730,6 +8546,18 @@ + + + + + Models/Core/UnitCube.mesh + + + + + + + @@ -8764,17 +8592,197 @@ + + + + + + + - + - Models/Core/UnitCube.mesh + Models/Props/CapturePoint/CapturePointNeutral.mesh - + - + + + + + 15 + 1 + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 15 + 2 + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 3 + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + + + + + + + + + + -15 + + + + 4 + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + + + + + + + + + + 15 + + + + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + @@ -8796,7 +8804,7 @@ - + @@ -8808,7 +8816,7 @@ - + @@ -8825,6 +8833,21 @@ + + + + Models/Core/UnitQuad.mesh + + Textures/Icons/AxyzWhite-01.png + true + + + + + + + + diff --git a/resources/Schema/Entities/StartMenu_simple.xml b/resources/Schema/Entities/StartMenu_simple.xml index 944c51b5..d6a31372 100644 --- a/resources/Schema/Entities/StartMenu_simple.xml +++ b/resources/Schema/Entities/StartMenu_simple.xml @@ -34,7 +34,7 @@ - + @@ -46,7 +46,7 @@ - + @@ -92,42 +92,6 @@ - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - - - - - - - - - - - @@ -149,6 +113,44 @@ + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + @@ -218,6 +220,7 @@ Models/Core/UnitQuad.mesh Textures/HUD/ButtonCorner_16.png + false @@ -233,6 +236,7 @@ Models/Core/UnitQuad.mesh Textures/HUD/ButtonCorner_16.png + false @@ -263,6 +267,7 @@ Models/Core/UnitQuad.mesh Textures/HUD/ButtonCorner_16.png + false @@ -277,6 +282,7 @@ Models/Core/UnitQuad.mesh Textures/HUD/ButtonCorner_16.png + false @@ -299,6 +305,10 @@ true + + Options + 1 + @@ -308,7 +318,7 @@ - Option + Options Fonts/DroidSans.ttf,64 @@ -374,6 +384,7 @@ Models/Core/UnitQuad.mesh Textures/HUD/ButtonCorner_16.png + false @@ -389,6 +400,7 @@ Models/Core/UnitQuad.mesh Textures/HUD/ButtonCorner_16.png + false @@ -419,12 +431,36 @@ + + + + Schema/Entities/OptionMenu.xml + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Test/SmallDiff.png + true + + + + + + + + From 33ed59fc3a34f5b7298198768767099eaa758e72 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Mon, 14 Mar 2016 00:45:09 +0100 Subject: [PATCH 53/61] Added files for setup creation --- assets | 2 +- deps | 2 +- resources/Axyz.ico | Bin 0 -> 50447 bytes resources/Inno Setup Script.iss | 127 ++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 2 deletions(-) create mode 100755 resources/Axyz.ico create mode 100755 resources/Inno Setup Script.iss diff --git a/assets b/assets index 2c75d24d..6ec80c4e 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 2c75d24ddfeb29c266d98a6d637b6c5768c5cafe +Subproject commit 6ec80c4e0beb75068763696fe84bb839616b8f06 diff --git a/deps b/deps index ed45883a..49ef5853 160000 --- a/deps +++ b/deps @@ -1 +1 @@ -Subproject commit ed45883a444c6de548b6211a83a079ff2ecfce15 +Subproject commit 49ef5853662500ec9634af75b73b61f8168a14f9 diff --git a/resources/Axyz.ico b/resources/Axyz.ico new file mode 100755 index 0000000000000000000000000000000000000000..b033831f8016a722ffb290c34a1c224b200b98ea GIT binary patch literal 50447 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

    `v_Wi4)7y|-OwJO zS5;95YY|hy1Chc43(#*^UVA%7cqoXe(B#qd0IaW1AcG(mGN*!>Hk1WT4=UC_FQA8Q zFzC7gsC-@t4-UxCKj2;C4~QAaIX> + // Function for Inno Setup Compiler + // 13 November 2015 + // Returns True if Microsoft Visual C++ Redistributable is installed, otherwise False. + // The programmer may set the year of redistributable to find; see below. + var + names: TArrayOfString; + i: Integer; + dName, key, year: String; + begin + // Year of redistributable to find; leave null to find installation for any year. + year := ''; + Result := False; + key := 'Software\Microsoft\Windows\CurrentVersion\Uninstall'; + // Get an array of all of the uninstall subkey names. + if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, key, names) then + // Uninstall subkey names were found. + begin + i := 0 + while ((i < GetArrayLength(names)) and (Result = False)) do + // The loop will end as soon as one instance of a Visual C++ redistributable is found. + begin + // For each uninstall subkey, look for a DisplayName value. + // If not found, then the subkey name will be used instead. + if not RegQueryStringValue(HKEY_LOCAL_MACHINE, key + '\' + names[i], 'DisplayName', dName) then + dName := names[i]; + // See if the value contains both of the strings below. + Result := (Pos(Trim('Visual C++ ' + year),dName) * Pos('Redistributable',dName) <> 0) + i := i + 1; + end; + end; + end; + + procedure InitializeWizard(); +begin + // Welcome page + // Hide the labels + WizardForm.WelcomeLabel1.Visible := False; + WizardForm.WelcomeLabel2.Visible := False; + // Stretch image over whole page + WizardForm.WizardBitmapImage.Width := WizardForm.WizardBitmapImage.Parent.Width; + + // Finished page + // Hide the labels + WizardForm.FinishedLabel.Visible := False; + WizardForm.FinishedHeadingLabel.Visible := False; + // Stretch image over whole page + WizardForm.WizardBitmapImage2.Width := WizardForm.WizardBitmapImage2.Parent.Width; +end; From fe6f2949860dcd7dcbb811070708b9411d48e12e Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Mon, 14 Mar 2016 00:52:03 +0100 Subject: [PATCH 54/61] Moved installer script to subdir --- resources/{ => Setup}/Inno Setup Script.iss | 61 ++++++++------------- 1 file changed, 22 insertions(+), 39 deletions(-) rename resources/{ => Setup}/Inno Setup Script.iss (60%) diff --git a/resources/Inno Setup Script.iss b/resources/Setup/Inno Setup Script.iss similarity index 60% rename from resources/Inno Setup Script.iss rename to resources/Setup/Inno Setup Script.iss index ddaf61d0..b10e1d5b 100755 --- a/resources/Inno Setup Script.iss +++ b/resources/Setup/Inno Setup Script.iss @@ -20,7 +20,7 @@ AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\{#MyAppName} DisableProgramGroupPage=yes OutputBaseFilename=Axyz Setup -SetupIconFile=Axyz.ico +SetupIconFile=..\Axyz.ico Compression=lzma2 SolidCompression=yes ; "ArchitecturesAllowed=x64" specifies that Setup cannot run on @@ -33,7 +33,7 @@ ArchitecturesInstallIn64BitMode=x64 OutputDir=. DisableWelcomePage=false ;WizardSmallImageFile= - +WizardImageFile=Setup Banner.bmp [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" @@ -41,25 +41,25 @@ Name: "english"; MessagesFile: "compiler:Default.isl" Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] -Source: "..\bin\Audio\*"; DestDir: "{app}\Audio\"; Flags: ignoreversion createallsubdirs recursesubdirs -Source: "..\bin\Fonts\*"; DestDir: "{app}\Fonts\"; Flags: ignoreversion createallsubdirs recursesubdirs -Source: "..\bin\Licenses\*"; DestDir: "{app}\Licenses\"; Flags: ignoreversion createallsubdirs recursesubdirs -Source: "..\bin\Models\*"; DestDir: "{app}\Models\"; Flags: ignoreversion createallsubdirs recursesubdirs -Source: "..\bin\Schema\*"; DestDir: "{app}\Schema\"; Flags: ignoreversion createallsubdirs recursesubdirs -Source: "..\bin\Shaders\*"; DestDir: "{app}\Shaders\"; Flags: ignoreversion createallsubdirs recursesubdirs -Source: "..\bin\Textures\*"; DestDir: "{app}\Textures\"; Flags: ignoreversion createallsubdirs recursesubdirs -Source: "..\bin\assimp.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\bin\DefaultConfig.ini"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\bin\DefaultInput.ini"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\bin\glew32.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\bin\glfw3.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\bin\imgui.ini"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\bin\Input.ini"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\bin\libpng16.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\bin\TacticalZ.exe"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\bin\xerces-c_3_1.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\bin\zlib.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\deps\redist\VC_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall +Source: "..\..\bin\Audio\*"; DestDir: "{app}\Audio\"; Flags: ignoreversion createallsubdirs recursesubdirs +Source: "..\..\bin\Fonts\*"; DestDir: "{app}\Fonts\"; Flags: ignoreversion createallsubdirs recursesubdirs +Source: "..\..\bin\Licenses\*"; DestDir: "{app}\Licenses\"; Flags: ignoreversion createallsubdirs recursesubdirs +Source: "..\..\bin\Models\*"; DestDir: "{app}\Models\"; Flags: ignoreversion createallsubdirs recursesubdirs +Source: "..\..\bin\Schema\*"; DestDir: "{app}\Schema\"; Flags: ignoreversion createallsubdirs recursesubdirs +Source: "..\..\bin\Shaders\*"; DestDir: "{app}\Shaders\"; Flags: ignoreversion createallsubdirs recursesubdirs +Source: "..\..\bin\Textures\*"; DestDir: "{app}\Textures\"; Flags: ignoreversion createallsubdirs recursesubdirs +Source: "..\..\bin\assimp.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\DefaultConfig.ini"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\DefaultInput.ini"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\glew32.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\glfw3.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\imgui.ini"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\Input.ini"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\libpng16.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\TacticalZ.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\xerces-c_3_1.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\zlib.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\deps\redist\VC_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall [Icons] Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" @@ -107,21 +107,4 @@ function VCinstalled: Boolean; i := i + 1; end; end; - end; - - procedure InitializeWizard(); -begin - // Welcome page - // Hide the labels - WizardForm.WelcomeLabel1.Visible := False; - WizardForm.WelcomeLabel2.Visible := False; - // Stretch image over whole page - WizardForm.WizardBitmapImage.Width := WizardForm.WizardBitmapImage.Parent.Width; - - // Finished page - // Hide the labels - WizardForm.FinishedLabel.Visible := False; - WizardForm.FinishedHeadingLabel.Visible := False; - // Stretch image over whole page - WizardForm.WizardBitmapImage2.Width := WizardForm.WizardBitmapImage2.Parent.Width; -end; + end; \ No newline at end of file From c61d33ebd9d63a7833d4d7c7303c73cc5d654e07 Mon Sep 17 00:00:00 2001 From: Teejoon Date: Mon, 14 Mar 2016 01:08:22 +0100 Subject: [PATCH 55/61] NewScorebord --- resources/Schema/Entities/CP_Rocky2.xml | 12175 ++++++++-------- resources/Schema/Entities/ScoreBoard_Main.xml | 334 +- 2 files changed, 6467 insertions(+), 6042 deletions(-) diff --git a/resources/Schema/Entities/CP_Rocky2.xml b/resources/Schema/Entities/CP_Rocky2.xml index 6eb85547..cd56e869 100644 --- a/resources/Schema/Entities/CP_Rocky2.xml +++ b/resources/Schema/Entities/CP_Rocky2.xml @@ -3,7 +3,7 @@ - 7.4313138789702364 + 7.7050251588169658 @@ -33,6 +33,17 @@ + + + + + 2 + Models/Props/Walls/SciFiWallSmall2.mesh + + + + + @@ -82,17 +93,6 @@ - - - - - 2 - Models/Props/Walls/SciFiWallSmall2.mesh - - - - - @@ -689,6 +689,18 @@ + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + @@ -790,18 +802,6 @@ - - - - - Models/Highgrounds/Hg19.mesh - - - - - - - @@ -1620,11 +1620,11 @@ 12 - + - + @@ -1676,11 +1676,11 @@ 12 - + - + @@ -1748,11 +1748,11 @@ 12 - + - + @@ -2825,6 +2825,170 @@ + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + @@ -3011,6 +3175,19 @@ + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + @@ -3348,20 +3525,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3375,19 +3538,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -3401,19 +3551,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3428,20 +3565,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3456,20 +3579,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3483,20 +3592,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - @@ -3510,20 +3605,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3537,20 +3618,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3564,19 +3631,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3591,19 +3645,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3618,20 +3659,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3646,20 +3673,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -3673,19 +3686,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3693,6 +3693,19 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -3719,19 +3732,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -3758,6 +3758,113 @@ + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + @@ -3775,11 +3882,11 @@ 2 - + - + @@ -3801,7 +3908,7 @@ - + @@ -3829,11 +3936,11 @@ 2 - + - + @@ -3855,60 +3962,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -3935,11 +3989,11 @@ 2 - + - + @@ -3961,61 +4015,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -4043,11 +4043,11 @@ 2 - + - + @@ -4069,7 +4069,7 @@ - + @@ -4100,9 +4100,9 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + + @@ -4112,53 +4112,12 @@ 2 - Models/Props/Pillars/SciFiPillar2Red.mesh + Models/Props/Pillars/SciFiPillar1Red.mesh - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - + + + @@ -4186,38 +4145,8 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - + + @@ -4241,12 +4170,11 @@ 2 - Models/Props/Pillars/SciFiPillar3Red.mesh + Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + @@ -4256,12 +4184,84 @@ 2 - Models/Props/Pillars/SciFiPillar1Red.mesh + Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + @@ -4295,8 +4295,9 @@ Models/Props/Stones/AssaultHolder.mesh - - + + + @@ -4315,131 +4316,6 @@ - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - @@ -4463,9 +4339,22 @@ Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh + + + + @@ -4488,12 +4377,24 @@ - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh + Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh - - + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh + + + + @@ -4508,10 +4409,12 @@ Models/Props/Flora/HangingBush4.mesh true + false - - + + + @@ -4532,13 +4435,12 @@ - Models/Props/Flora/HangingBush2.mesh + Models/Props/Flora/HangingBush4.mesh true - - - + + @@ -4546,14 +4448,13 @@ - Models/Props/Flora/HangingBush4.mesh + Models/Props/Flora/HangingBush2.mesh true - false - - - + + + @@ -4567,8 +4468,38 @@ Models/Props/Stones/AssaultHolder.mesh - - + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + @@ -4580,8 +4511,77 @@ Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh - - + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + @@ -4632,6 +4632,718 @@ + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + + + + + + 1.5 + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + 1.5 + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + 1.5 + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + 1.5 + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + + + + 1.5 + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + + + 1.5 + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + + + + + @@ -4695,95 +5407,6 @@ - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar1Red.mesh - - - - - - - - - - - @@ -4808,6 +5431,19 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -4834,19 +5470,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -4864,634 +5487,24 @@ - - - - - - - - - - 1.5 - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh - - - - - - - - - - - - 12 - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - - - - - - - - 1.5 - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - - 1.5 - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - - - - - 12 - - - - - - - - - - - - - 1.5 - Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh - - - - - - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - - - - - 12 - - - - - - - - - - - - - 1.5 - Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh - - - - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - - - - 1.5 - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - + + + + + Models/Props/Bridge_Holder_Red.mesh + + + + + + + + @@ -5518,19 +5531,6 @@ - - - - - Models/Props/Bridge_Holder_Red.mesh - - - - - - - - @@ -5564,6 +5564,87 @@ + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + @@ -5577,6 +5658,385 @@ + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + @@ -5645,19 +6105,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -5671,20 +6118,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -5697,20 +6130,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -5725,20 +6144,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5752,19 +6157,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -5779,20 +6171,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5806,20 +6184,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - @@ -5832,20 +6196,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -5859,20 +6209,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - @@ -5886,20 +6222,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5913,19 +6235,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -5939,20 +6248,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -5994,19 +6289,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -6021,19 +6303,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6047,19 +6316,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6073,19 +6329,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6100,19 +6343,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6127,20 +6357,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6155,20 +6371,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -6182,20 +6384,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6209,20 +6397,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6237,19 +6411,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6263,19 +6424,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6289,19 +6437,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - @@ -6316,19 +6451,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6343,19 +6465,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -6370,20 +6479,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6398,19 +6493,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6424,20 +6506,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -6452,19 +6520,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -6479,20 +6534,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6507,20 +6548,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6535,20 +6562,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6562,19 +6575,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6599,11 +6599,11 @@ 2 - + - + @@ -6625,61 +6625,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -6707,11 +6653,11 @@ 2 - + - + @@ -6733,61 +6679,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -6815,11 +6707,11 @@ 2 - + - + @@ -6841,61 +6733,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -6923,11 +6761,11 @@ 2 - + - + @@ -6949,7 +6787,169 @@ - + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + @@ -6977,11 +6977,11 @@ 2 - + - + @@ -7003,7 +7003,7 @@ - + @@ -7021,6 +7021,19 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -7089,19 +7102,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -7122,6 +7122,36 @@ + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + @@ -7130,8 +7160,21 @@ Models/Props/Walls/Medium_Wall_SciFi_Red.mesh - - + + + + + + + + + + + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + @@ -7150,6 +7193,76 @@ + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Medium_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + + 2 + Models/Props/Walls/Medium_Wall_SciFi_Red.mesh + + + + + + + + @@ -7193,20 +7306,6 @@ - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - @@ -7250,20 +7349,6 @@ - - - - - 2 - Models/Props/Walls/Medium_Wall_SciFi_Red.mesh - - - - - - - - @@ -7308,34 +7393,6 @@ - - - - - 2 - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - 2 - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - @@ -7366,20 +7423,6 @@ - - - - - 2 - Models/Props/Walls/Medium_Wall_SciFi_Red.mesh - - - - - - - - @@ -7422,21 +7465,6 @@ - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - - @@ -7481,19 +7509,6 @@ - - - - - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - @@ -7538,21 +7553,6 @@ - - - - - 2 - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - @@ -7581,8 +7581,8 @@ Models/Props/Flora/Root.mesh - - + + @@ -7595,8 +7595,8 @@ Models/Props/Flora/Root.mesh - - + + @@ -7708,6 +7708,101 @@ + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + @@ -7735,19 +7830,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -7789,20 +7871,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -7843,20 +7911,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -7898,19 +7952,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -7950,20 +7991,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -8044,33 +8071,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -8078,21 +8078,6 @@ - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - - @@ -8107,6 +8092,35 @@ + + + + + 2 + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + @@ -8121,6 +8135,35 @@ + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + @@ -8151,34 +8194,6 @@ - - - - - 2 - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - 2 - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -8223,21 +8238,6 @@ - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - - @@ -8245,6 +8245,59 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -8271,19 +8324,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8325,20 +8365,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - @@ -8378,19 +8404,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8432,19 +8445,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8496,11 +8496,11 @@ 2 - + - + @@ -8522,7 +8522,7 @@ - + @@ -8550,11 +8550,11 @@ 2 - + - + @@ -8576,7 +8576,7 @@ - + @@ -8598,13 +8598,13 @@ - 2 + 3 Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + @@ -8613,13 +8613,13 @@ - 3 + 2 Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + @@ -8640,9 +8640,9 @@ true - - - + + + @@ -8654,9 +8654,9 @@ true - - - + + + @@ -8717,6 +8717,35 @@ + + + + + 1.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 1.5 + Models/Props/Pillars/SciFiPillar3Blue.mesh + + + + + + + + + @@ -8762,20 +8791,6 @@ - - - - - 1.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - @@ -8820,21 +8835,6 @@ - - - - - 1.5 - Models/Props/Pillars/SciFiPillar3Blue.mesh - - - - - - - - - @@ -8898,6 +8898,19 @@ + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + @@ -8937,19 +8950,6 @@ - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - @@ -8976,321 +8976,6 @@ - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - false - - - - - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - @@ -9312,12 +8997,12 @@ 6 - + 0.10000000149011612 - + @@ -9342,12 +9027,12 @@ 6 - + 0.10000000149011612 - + @@ -9372,12 +9057,12 @@ 6 - + 0.10000000149011612 - + @@ -9402,12 +9087,12 @@ 6 - + 0.10000000149011612 - + @@ -9445,13 +9130,13 @@ 20 - + 3 - - + + @@ -9469,38 +9154,6 @@ - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - @@ -9509,13 +9162,13 @@ 10 - + 0.5 - - + + @@ -9540,7 +9193,7 @@ - + @@ -9553,7 +9206,7 @@ false - + @@ -9567,7 +9220,7 @@ false - + @@ -9604,6 +9257,353 @@ + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + false + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + @@ -9632,13 +9632,13 @@ 20 - + 3 - - + + @@ -9662,13 +9662,13 @@ 10 - + 0.5 - - + + @@ -9679,10 +9679,22 @@ - + + + + + 4.5 + 0.5 + + + + + + + @@ -9719,18 +9731,6 @@ - - - - 4.5 - 0.5 - - - - - - - @@ -9755,13 +9755,13 @@ 30 - + 3.5 - - + + @@ -9790,12 +9790,12 @@ 6 - + 0.10000000149011612 - + @@ -9819,12 +9819,12 @@ 6 - + 0.10000000149011612 - + @@ -9848,12 +9848,12 @@ 6 - + 0.10000000149011612 - + @@ -9877,12 +9877,12 @@ 6 - + 0.10000000149011612 - + @@ -9934,311 +9934,6 @@ - - - - - Models/Props/CapturePoint/CapturePointRed.mesh - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - - - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - @@ -10256,38 +9951,6 @@ - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - @@ -10296,13 +9959,13 @@ 10 - + 0.5 - - + + @@ -10313,10 +9976,24 @@ - + + + + + + 4.5 + 0.5 + false + + + + + + + @@ -10345,20 +10022,6 @@ - - - - - 4.5 - 0.5 - false - - - - - - - @@ -10389,6 +10052,38 @@ + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + @@ -10397,13 +10092,13 @@ 20 - + 3 - - + + @@ -10435,12 +10130,12 @@ 6 - + 0.10000000149011612 - + @@ -10465,12 +10160,12 @@ 6 - + 0.10000000149011612 - + @@ -10495,12 +10190,12 @@ 6 - + 0.10000000149011612 - + @@ -10525,12 +10220,12 @@ 6 - + 0.10000000149011612 - + @@ -10555,6 +10250,311 @@ + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + @@ -10572,6 +10572,37 @@ + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + false + + + + + + + @@ -10580,13 +10611,13 @@ 30 - + 3.5 - - + + @@ -10611,13 +10642,13 @@ 10 - + 0.5 - - + + @@ -10641,7 +10672,7 @@ - + @@ -10701,37 +10732,6 @@ - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - false - false - - - - - - - @@ -10745,12 +10745,12 @@ 6 - + 0.10000000149011612 - + @@ -10775,12 +10775,12 @@ 6 - + 0.10000000149011612 - + @@ -10805,12 +10805,12 @@ 6 - + 0.10000000149011612 - + @@ -10835,12 +10835,12 @@ 6 - + 0.10000000149011612 - + @@ -10902,45 +10902,16 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - 6 - + 0.10000000149011612 - + @@ -10960,45 +10931,16 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - 6 - + 0.10000000149011612 - + @@ -11018,6 +10960,64 @@ + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + @@ -11027,6 +11027,36 @@ + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + + + + + + + @@ -11035,13 +11065,13 @@ 10 - + 0.5 - - + + @@ -11052,10 +11082,22 @@ - + + + + + 4.5 + 0.5 + + + + + + + @@ -11092,18 +11134,6 @@ - - - - 4.5 - 0.5 - - - - - - - @@ -11129,13 +11159,13 @@ 20 - + 3 - - + + @@ -11151,6 +11181,257 @@ + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + false + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + @@ -11159,13 +11440,13 @@ 30 - + 3.5 - - + + @@ -11173,6 +11454,40 @@ Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false false @@ -11210,13 +11525,13 @@ 10 - + 0.5 - - + + @@ -11227,10 +11542,24 @@ - + + + + + + 4.5 + 0.5 + false + + + + + + + @@ -11259,20 +11588,6 @@ - - - - - 4.5 - 0.5 - false - - - - - - - @@ -11313,13 +11628,13 @@ 30 - + 3.5 - - + + @@ -11345,13 +11660,13 @@ 20 - + 3 - - + + @@ -11382,12 +11697,12 @@ 6 - + 0.10000000149011612 - + @@ -11408,46 +11723,16 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - 6 - + 0.10000000149011612 - + @@ -11468,16 +11753,46 @@ - + 6 - + 0.10000000149011612 - + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + @@ -11502,321 +11817,6 @@ - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - false - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - @@ -11838,6 +11838,323 @@ + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + false + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + + + @@ -11859,12 +12176,12 @@ 6 - + 0.10000000149011612 - + @@ -11889,12 +12206,12 @@ 6 - + 0.10000000149011612 - + @@ -11919,12 +12236,12 @@ 6 - + 0.10000000149011612 - + @@ -11949,12 +12266,12 @@ 6 - + 0.10000000149011612 - + @@ -11992,16 +12309,28 @@ 10 - + 0.5 - - + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + @@ -12009,7 +12338,7 @@ - + @@ -12071,18 +12400,6 @@ - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - @@ -12093,13 +12410,13 @@ 20 - + 3 - - + + @@ -12125,13 +12442,13 @@ 30 - + 3.5 - - + + @@ -12177,13 +12494,13 @@ 30 - + 3.5 - - + + @@ -12207,13 +12524,13 @@ 20 - + 3 - - + + @@ -12237,13 +12554,13 @@ 10 - + 0.5 - - + + @@ -12254,10 +12571,22 @@ - + + + + + 4.5 + 0.5 + + + + + + + @@ -12282,18 +12611,6 @@ - - - - 4.5 - 0.5 - - - - - - - @@ -12335,12 +12652,12 @@ 6 - + 0.10000000149011612 - + @@ -12360,45 +12677,16 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - 6 - + 0.10000000149011612 - + @@ -12418,16 +12706,45 @@ - + 6 - + 0.10000000149011612 - + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + @@ -12451,323 +12768,6 @@ - - - - - Models/Props/CapturePoint/CapturePointRed.mesh - false - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - @@ -12807,6 +12807,135 @@ + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + @@ -12814,6 +12943,38 @@ + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + @@ -12822,13 +12983,13 @@ 10 - + 0.5 - - + + @@ -12853,7 +13014,7 @@ - + @@ -12913,38 +13074,6 @@ - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - @@ -12953,13 +13082,13 @@ 20 - + 3 - - + + @@ -12979,135 +13108,6 @@ - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - @@ -13126,6 +13126,37 @@ + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + + + + + + + @@ -13134,13 +13165,13 @@ 30 - + 3.5 - - + + @@ -13165,13 +13196,13 @@ 10 - + 0.5 - - + + @@ -13193,7 +13224,7 @@ - + @@ -13253,37 +13284,6 @@ - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - - - - - - - @@ -13297,12 +13297,12 @@ 6 - + 0.10000000149011612 - + @@ -13326,12 +13326,12 @@ 6 - + 0.10000000149011612 - + @@ -13355,12 +13355,12 @@ 6 - + 0.10000000149011612 - + @@ -13384,12 +13384,12 @@ 6 - + 0.10000000149011612 - + @@ -13438,13 +13438,13 @@ 20 - + 3 - - + + @@ -13469,13 +13469,13 @@ 10 - + 0.5 - - + + @@ -13499,10 +13499,22 @@ - + + + + + 4.5 + 0.5 + + + + + + + @@ -13527,18 +13539,6 @@ - - - - 4.5 - 0.5 - - - - - - - @@ -13563,13 +13563,13 @@ 30 - + 3.5 - - + + @@ -13599,12 +13599,12 @@ 6 - + 0.10000000149011612 - + @@ -13629,12 +13629,12 @@ 6 - + 0.10000000149011612 - + @@ -13659,12 +13659,12 @@ 6 - + 0.10000000149011612 - + @@ -13689,12 +13689,12 @@ 6 - + 0.10000000149011612 - + @@ -13739,6 +13739,19 @@ + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + @@ -13765,19 +13778,6 @@ - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - @@ -13795,26 +13795,158 @@ - + + + - + + + + Schema/Entities/ScoreBoard_Red.xml + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + - Models/Core/UnitCube.mesh + 0.80000019073486328 + Models/Props/ScoreBoard/Scoreboard.mesh false - + @@ -13822,12 +13954,13 @@ - Models/Core/UnitCube.mesh + 0.70000028610229492 + Models/Props/ScoreBoard/Spectatorboard.mesh false - + @@ -13847,6 +13980,20 @@ + + + + Models/Core/UnitCube.mesh + + false + + + + + + + + @@ -13862,33 +14009,17 @@ - + - Kills + ID Fonts/DroidSans.ttf,64 - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - + @@ -13910,6 +14041,38 @@ + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + @@ -13926,38 +14089,8 @@ - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - false - - - - - - - - @@ -13974,132 +14107,94 @@ - + - - Schema/Entities/ScoreBoard_Red.xml - - - - + - + - + + + - + - - - - - - - - - - - + + + - + - - Name - Fonts/DroidSans.ttf,64 - - - - - - + - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + false + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + + + + Blue team win! + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + Red team win! + Fonts/DroidSans.ttf,64 + + + + + + + + + - - - - Models/Core/UnitCube.mesh - - false - - - - - - - - @@ -14116,7 +14211,7 @@ - + @@ -14128,6 +14223,336 @@ + + + + 0.20000000298023224 + 300 + + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + 1 + + + + 4 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + 1 + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + + + 1 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToClassPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + @@ -14144,6 +14569,41 @@ + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Sniper-01.png + + + PickClass + 3 + + + + + + + + + + + Sniper + Fonts/DroidSans.ttf,64 + + + + + + + + + + + @@ -14241,41 +14701,6 @@ - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Sniper-01.png - - - PickClass - 3 - - - - - - - - - - - Sniper - Fonts/DroidSans.ttf,64 - - - - - - - - - - - @@ -14331,40 +14756,19 @@ - + - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - PickTeam - 3 - + + Pick Team + Fonts/DroidSans.ttf,64 + + - - + + - - - - - Blue - Fonts/DroidSans.ttf,64 - - - - - - - - - + @@ -14417,19 +14821,40 @@ - + - - Pick Team - Fonts/DroidSans.ttf,64 - - + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 3 + - - + + - + + + + + Blue + Fonts/DroidSans.ttf,64 + + + + + + + + + @@ -14505,336 +14930,6 @@ - - - - 0.20000000298023224 - 300 - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - SwapToTeamPick - 1 - - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - Team - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - SwapToClassPick - 1 - - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - Class - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - 1 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 1 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 3 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 1 - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 2 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - 1 - - - - 4 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - - @@ -14844,6 +14939,29 @@ + + + + + 10 + + + + + + + + + + + 8 + + + + + + + @@ -14866,7 +14984,19 @@ 4 - + + + + + + + + + 4 + 1 + + + @@ -14877,7 +15007,7 @@ 4 - + @@ -14911,7 +15041,40 @@ 4 - + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + @@ -14960,51 +15123,6 @@ - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - 1 - - - - - - - @@ -15063,18 +15181,6 @@ - - - - - 10 - - - - - - - @@ -15086,17 +15192,6 @@ - - - - 8 - - - - - - - @@ -15114,615 +15209,49 @@ - - - - - 15 - 1 - - - - - - - - + - + + + + 10 + 1 + - + - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - + - + + + + 10 + 1 + - + - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - + - + + + + 10 + 1 + - + - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 3 - 1 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 2 - 1 - 0.5 - - - - - - - - - - - - 3 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - + @@ -15877,7 +15406,7 @@ 0.5 - + @@ -15910,6 +15439,20 @@ + + + + + 5 + 1 + 0.5 + + + + + + + @@ -15975,7 +15518,124 @@ 0.5 - + + + + + + + + + + + + + + 15 + 1 + + + + + + + + + + + + + + + + + + + + + + + + 3 + 1 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + @@ -15989,58 +15649,493 @@ 0.5 - + - - - - - - - - + - - - 10 - 1 - - + - + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + - + - - - 10 - 1 - - + - + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + - + - - - 10 - 1 - - + - + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 3 + 1 + 0.5 + + + + + + + + + + + + 2 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + @@ -16062,11 +16157,493 @@ + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 6 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 6 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + @@ -16178,154 +16755,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -16474,43 +16903,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -16548,80 +16940,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -16629,20 +16947,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -16657,15 +16961,6 @@ - - - - - - - - - @@ -16680,20 +16975,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -16748,197 +17029,24 @@ - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 6 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 6 - 2 - 0.5 - - - - - - - - - - - + + + + + 10 + 1 + + + + + + + @@ -16965,19 +17073,6 @@ - - - - - 10 - 1 - - - - - - - diff --git a/resources/Schema/Entities/ScoreBoard_Main.xml b/resources/Schema/Entities/ScoreBoard_Main.xml index 04bf74c9..38db3e4b 100644 --- a/resources/Schema/Entities/ScoreBoard_Main.xml +++ b/resources/Schema/Entities/ScoreBoard_Main.xml @@ -18,7 +18,126 @@ - + + + + + + + + + + Models/Core/UnitCube.mesh + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + @@ -56,7 +175,126 @@ - + + + + + + + + + + Models/Core/UnitCube.mesh + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + @@ -70,6 +308,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + false + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + + + + Blue team win! + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + Red team win! + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + From 51c7e92fcef8c559503e1f14f9e69be631a6c545 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Mon, 14 Mar 2016 00:52:08 +0100 Subject: [PATCH 56/61] Fixed redist install --- resources/Setup/Inno Setup Script.iss | 40 ++------------------------ resources/Setup/Setup Banner.bmp | Bin 0 -> 154544 bytes 2 files changed, 3 insertions(+), 37 deletions(-) create mode 100755 resources/Setup/Setup Banner.bmp diff --git a/resources/Setup/Inno Setup Script.iss b/resources/Setup/Inno Setup Script.iss index b10e1d5b..bc894f6f 100755 --- a/resources/Setup/Inno Setup Script.iss +++ b/resources/Setup/Inno Setup Script.iss @@ -34,6 +34,7 @@ OutputDir=. DisableWelcomePage=false ;WizardSmallImageFile= WizardImageFile=Setup Banner.bmp + [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" @@ -69,42 +70,7 @@ Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: Filename: "{app}\Config.ini"; Section: "Networking"; Key: "Name"; String: "{%USERNAME}"; Flags: createkeyifdoesntexist [Run] -Filename: "{tmp}\VC_redist.x64.exe"; StatusMsg: "Installing Microsoft Visual C++ Redistributable...."; Check: IsWin64 and not VCinstalled +Filename: "{tmp}\VC_redist.x64.exe"; Parameters: "/norestart /passive"; StatusMsg: "Installing Microsoft Visual C++ 2015 x64 Redistributable...."; [ThirdParty] -UseRelativePaths=True - -[Code] -function VCinstalled: Boolean; - // By Michael Weiner - // Function for Inno Setup Compiler - // 13 November 2015 - // Returns True if Microsoft Visual C++ Redistributable is installed, otherwise False. - // The programmer may set the year of redistributable to find; see below. - var - names: TArrayOfString; - i: Integer; - dName, key, year: String; - begin - // Year of redistributable to find; leave null to find installation for any year. - year := ''; - Result := False; - key := 'Software\Microsoft\Windows\CurrentVersion\Uninstall'; - // Get an array of all of the uninstall subkey names. - if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, key, names) then - // Uninstall subkey names were found. - begin - i := 0 - while ((i < GetArrayLength(names)) and (Result = False)) do - // The loop will end as soon as one instance of a Visual C++ redistributable is found. - begin - // For each uninstall subkey, look for a DisplayName value. - // If not found, then the subkey name will be used instead. - if not RegQueryStringValue(HKEY_LOCAL_MACHINE, key + '\' + names[i], 'DisplayName', dName) then - dName := names[i]; - // See if the value contains both of the strings below. - Result := (Pos(Trim('Visual C++ ' + year),dName) * Pos('Redistributable',dName) <> 0) - i := i + 1; - end; - end; - end; \ No newline at end of file +UseRelativePaths=True \ No newline at end of file diff --git a/resources/Setup/Setup Banner.bmp b/resources/Setup/Setup Banner.bmp new file mode 100755 index 0000000000000000000000000000000000000000..69384103c85285a9b37f1c92055af03563435121 GIT binary patch literal 154544 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 z z@oY9%D3+SB43*=0`}(8NL?)efINVzsr8~r&THg*a2G#8hOjxmY(=mw@IwYUTIYGO3 zBb1Y>(KZ~#3T%}QdMuAayApK~`}I`JQiFV@Rdq#XxXt)}w=_u32KG-8YR8KIK)c`O z0v|Ito;KMoo4GZEW5MK@a%sV6(r>oeY*uA7iL5umu4)fbwPT?gaPc~vx8d;Aq`i=k znj8nH_M1g$_xZW_rFopp@;trf{nY)DFFzc7_hIvUpUPH#xLo;z?#j2al`q8q*CU2I zOX5qDI}UX=u3(r)^MA>5VlsMTU-sH!`r4k<<=Gf4E&h0J zCIQ^fPX!T+8Y<{q&=Tc72C4e zd_I%Q4-5^1#C3Ib4wtLk*~Qa2POwf810GEz+S=OPZcjr)1Ae|xD5a9gkT0-HtfgAi zRI^;6O9oPh?EYzkbx=e1scG!l?9doWSj3ENn@U3oM}DvZTcU~@EE$anOSm!?0v} zK7YgWt(&Iz-YHl9aH8^+SmmAgPhMg_eoA^{rg62mVLY|-aF6lWkaMAE+*2~cBhTgZ zvpM}j(X`SBbM08}wxKCyb_$h1ztN`PGAHLH84D!&E?bid^A&xCUcXWu`|Q=Q-ikk zLFf8_Q)4Wv3~drko8D52#B#+_CRfPAH)Qhpe6ct*IuZy5Yin!ai-9$sBO(YA#DGMi z@XHw(ZJAtdV{NeTBrXVs>Lq%rSw%?=lt{Nzj?LE?lz}yx4vEAe65CM%6SXoTu?wg6 zL>Q)_!GX=V&XP3RV7g0s)H^&gMsB`YIxSWnH*g;fr2ipV{$;+m(ldtS*iVg)H)+?0 z4K4tEmEn$Jdc4`Wo7IwT;d>i~H-%YMg!73MBF_lNg&ri*n!*Ry0^-Dy69rDL&7NVN z-8lL|&e|tZ4(FA<$&2%WoBMswt$ROxCGwfej;~%b{o7}Xm2Z|Rp9%f!W9}b5XMW|F z{PPOHr(m&atHJP)E{p>hz^8F2miG?T__wWmD(bqaD&W9HEFj?EsYXOgOq6&TSU!9 znFz%%t4wT@@E5{rxjL*dr?uv^k;$2?IX#`zn6gTJPNvT3ZDVS~Op|05Cj#t|ZtOwJGI+8>z}$ z;a`3#`}2<{zINSmW>h?rp_cm$=XVG9m(9>)`#Nk0yU;I+#?iTgX`yJIN^3h@bzQEe zE_YprtETMO(Z)!9pRO%>|SBWGX$|=347ED@>(utStwRo=GL4;Im+AA&*$P zRO;yN0@gMgS6^Qb79+4iQWTF8|C&HD1!lZZEIJ%6zu%vXB}57f)nwc$v9?I83W-g{ zze*%ri-c{F*jgpDOu|ScjHuP9F~m(=he8*ZYvY)jB36ZE@=&up(xl3pfwgj^RXW|G z#-yw_FW;!F9IwPmKQTK#qPN{PIq&Fg*UT*TzQJ_QT69qXXyHf~@z>-)E`fN%S#Qj| z+LUJ`#OA3DUX$P&7faGdekIMS6Uhn!dU#4pTxAKd4D;i&gxXZ#;p z(|`7Y<)2>lRlc*Q^4sS=ecpO%sCA*ZZLTCcJ?Y=yX$H8{Im2{bKa0SbT*kwF&Y6N9 zgJ;XmonUP(5xwdq;C|qq$s)UQfn8empBIWh@-7ZJ5SR|QCqQwOi z2(N()iW0yGZhd%c6sQ5aJg#CPlgp+v=};mYO60~n6GpQgV!O~@isFgMWQgg;kF~Yo zwX?6ce|XSnH0|28%O42BRtVM`%oYgF$MSjnXM{sRha*5W=upyqgI$8mcCH{SfW85#ucYQr$tO%z(y zUz02ffqN5ZBFxA|{56P7QfJju_QYRT=cVAFJ%2W{H|n~7Z|uU1_u+l+=hp%+t~;LG zuYBvG`4?~XzxU-+FRZ#R54Wy$HZSJIC&t_dd)PTrx6)1L4O3a;L|QkVQlT?&wn!J) zoh8S%qLa#VF5K9hRg25m#GMkKp z!-JiDJ;1I&5G0Nsm?C$bEw$x42b!8{LH4fR-e>}Wc@|icr=qPbTPk%A4)hH4Yt-t7 z`ub2fT<+|IC?JWlXe=CwA^HQ^@mF~~-e4$TclfC$U=2)#%fP?Et8n3)hGvOLA+ff$ z8ddrz&VZohOrj1*)Hu}@mZ`%ERa9vz8m)se<8FmzS!Pm%!^P!Ff;3!+lTQYy)eO59dX=0Jjir5#LQ1 zy&=yw%s3CXDKVCGU0ICtaC@FQ?0b5}_3$3eC(hbmKj*$Wsk%I@yx6B)D=CijJD2-7 z(0P{h4;!a)#>tFvJgr~uccH&DZ`%e~1*~%{mEouqOFT8MBtxaGREED&7Ah0uJpQoP z>jf8)zKGz?BRwrx@I(^0gu`KAq|vCM!+VAX;Ii{=pf-h8#gVtUVr#_V$6%k@j*~CY3ccHNi;}toc|TK%>|ZfeQ)47^Hx8DCl>(g7DNE zKyM=czBk(>2C>8Rsm?gL>-c9!Xg!XeOO^BDfC&Hs-QQ|E3|WR{eCG{ zZJLi*-Dhd%83TL7!tJ%PvnFG%I#;23;(qf8HnzIlmEzTnY=XdTR+|OVyVr6sHDd>)oQ$ z-MWE5-Dp;g#$XhqXEv~&$QUQH#)G}Ck%T&D+gfsN1$ja0EV0#8nx&F773VJ~G~vPo z)J(|b@rS%#Pb!%TliLoG5xNNmwxhEXN(~svWYYGI^1#?gp}h@QgTg=)G7QKL3=hF9 z0Bfa2)i*GJbQ~-*#1>I;a17=4;mPq_K959-SS*GcFSWHrV$pCk76PSF>WV~yp)fww z>-C3%0f!U3{{O)mPeQFkuMinjDxaS1km;gQ4Ju-of`!={p+WFtRs>|567I*`mWqGW@ zYshcr?iFLGC@vF~3_893u+Qhk-3|qD(-k4?nAP3Y;v-#y&X>it~3N%M|os&G8hWg?b@Z$Xh85>zJR|T z4^<$9&xrzYKR^ye{r-U05{2}wGB+G%p=zkpe3rX zSQF7Q=u!yOid~JWuvXu$GIX1rvpB+Iw9Xos3A1AYsr9JIBg{+TsZIQ~5N!#s_wt&E zv}(1BSL5$bq};XP8@v{%P5iZxOW6?N#ATC+lBrfp91qAa@@&756^~(+xzRuz(IQ0#f+q=;Q>jBlekx z5|~a*O~N4GcV7*)r3TcN$z)EK3mLGko}O}dcUxzs&RqNd}K`szL6T`i(DJ>OgQ%;1lN3gEqLv_^HT2h*8rVAWl!cR`1GMe=<%Bh zA-#EO+>an@xx+LNYA(2T_WBz;JuM4pC2eCSF%qX}o+(;fnjPZplw=#lh^RaixR)4k zcxqq`Qp0)+yuJ%G3A?sfRE=t_0R#&MLtqweJ>KBf6MG(sWU^VHL(>e90$%+?L%^=R zv!k=S3uqQgMVHG3e1S5)nwnc+?Q3`Ll*<(^j|X<3yT5N@dK%GLOG^vHJXAqfPcI}N z+%%r306sB5aK5ud46DMcdXRwB7Ki7aTd%|99`xtWq#s9g$*+J+-L6eX?Msip4I zZr|mSYlsQj+rj(tSZt3Y73+W)&YVzG3GvF zkd!7zJvd{#g1)16y6D(dbnfg9)aM+Hy9*5Zw`Yo`xsoNrHanC%{FY{&bZZ?&wQR*4 za;gn*JE=5BC9HR`2I#SkE5lN>MkK{(W{?)?67oe}0k>epflGI9kH_l)QosudlF6Cf zJ^j7F(c|$b6!M)rcQ!RPH8nRkHa39o_(g?6v8%Qg(jBEqi-m@r2c7Zj5{U$1TDgmO zbGT<%Z~QPp*&p)x0zRJ~F&ASoYxP!21g!rX!~*(C3neyE+wgSlqPDcw)a&Y7?NWK5 zRpO#{7`E3jN@J39_O)t#JDRjDt=0yaU90mO%vqhesAD=%_4et&=;~mcdl2WNEfQ7> z@~oO5-OQV9Or5RT@M^zVwJ&8;p8ZB^3bEn54hPD26Dd`!`LK(i%wsK#ObO^bN5}mD zdQXX2fT515x`T?cuQg$*9f%oEPRD24*tkvXGcl9G z6A=!$tNt2q;Jd9LHC*|2FKg7B7(dh%5@dvCLEfSQYa-HMpAl07BOnF57@Eh z(_`GURP7PTtTLP#(Z&pxtlpH@TiOhCw^L(JGnjToB-!S5*Nl^r2Y>DJVbB+Q3;JrikjhhNpqF8E7h|(nOb%%)S1Vz*N-V^Z!!^szTjXY(1fh1|xKk^+cIqjmeT&G_BwG)ufHV@#y-tF%##DUJScoYS;x>=_#K>%2VHcj2xMsD!^Ji4}#iI3y7oj12NTj)|hvROpTO7Ss!OwyZ!2^EWN+ei2_H_Elt}+ojyg9-D#9i zlARPQr*h7kf^!SRdDgxy!|lj$jcHamNY1gghi5DsrBsw!x7Rd>f_!20^J%7E#LT z>>!>x8pU4?KLIo1@p@fukIUt@+Z`OoIh`D1#&HjaO2Y1tGDLtOS5~KKkeX`=(9IMj zqPA%$8Api>*s*A}mvwZisg>QbMS?RUJ6d#&8W&Y(-Lh4y&;+IM-P(}WoYh-9ZCZPV zXEcB&Zx{hEoU-OksvKe`EZ492{)u4d18 zb|ala{I!7crYaL`I8Y{z`yRMMv~z91xll5XXLREk?LbV!%D2aD(vGm%W0I&^c9_K5 z<4g;5_(Iv<5z@tNqIQ=oO4k@9M5;0^JCgSLpouCtwiliCdAq9MkQX?S$I93^mz}da z9CqAu*iw8EYfb_p-f2f;zzDQeDiwkm2ZBQ*BM8S}&!8%NYna__;v*R&CUBuyJ7%M92UbDrcV;U6P7F4(z z^%N!9exItL5i@}yxkc0#IVI)5cah4@*z&s?Opt{9GoZkb{~D>aM&hWIIjOC(ntHt! zXHT?IBh$fXU0KGP6;Or&XMpcLyoNomYBPb+f+Z((7V>6QVJ75Ks;?X4>`1>E&+h89 zE1};E@=QpOR^=HWt^&=Mx`eQci14a56L_5pfYfAUWeQh{wXgKEh^A+Y7N4P()ztUI zO&vjf&Z7$26s)>M*Fve9D4(%zcfnThsgta@Oe?)ojO9+mvlfj&1Jp z$(?$aS?gsvyVc4#$QMc+U^kC77+%FX3MB?X4!lqVvD-P&95^B$0!RTYZ-l+zGJp#N z5J`d9d@d$Qnp8Qv9c@Jtu>=nQiYCB16alG2K0oxB52VJ2+E~_VWf`l@WHM{z3WG>Z zZP!vYTI^ogS|e!|o40Ni5ljKJ$VSQNT8WWiGCa_Y(BU}RNZqHVTC9x{cfHh8+v1ez z6U}mOqsC`2=V+xnOM3~{0<$yyR;27^v3m2u`*}n0k}6 z#ww>G7AivDXOQS*B8|ynvRYBt#4TrmH@FQHz-)j>0xvKW7)8Qjv81uF$zivng*%Z# z(G%I!2v`i@@OZdgaQDRW3vff%A)$^y+v9fEL#Ma4`n9#xU zKp7noW;26liK1!=c9aIMTPRVJ*u0H|S0J^NYO+vDZcB^SY>A6xZk(GZi+J$;ty)Ti zsVV+ONu*v9f(8r5=26+SDC{AF3qD%Fnz!L_)|>viN^L&Wf&sr9aJ{clfj8qMX+{_g ze@)=Nr%~ZTIp>}ESYqjrGg`|p%Let^& z?TKX9ZH}p0c|Kzi=)8e7Y`Ado)D~t`@<}rRWkT(HbvTbWU;7YdN>{Bn*~M0^b8S>W zAkRQ>FdD%%->X34>kavRw+D%L)^~X=RJ*Ef8d98Bk1hnmXy)h& z$c{8AEh7$3y0eZ3uVHWr*1(O28<|rt>Jg!QArEhkP`a*e7mPM4-6W414*LkSA-v$J zZ~<$=Y+#M34cQoydP}BKsFv03s-w1SvCuR;Hhvv{y8|e@T=*Oqa9)+c&I34n!5|Aj z*KMzrH?-hA9sm)w9m1Q19uuqVG@aVI4PqNQO-yZ9*NE&GP>CUjG6PO-9tfq*vEDTu zy=2f0WEoGE_GD;P+!n;YcYCc?uuLZdIJ-I?t z%0|p3z|9vv1WV2bT;^)tY(tyHgH;*Fu9q3vzZR{vU5dBA8-)A)W%AG3lay`}W#~ zX8o2ecnn*q?HWqXBI2%1f$^znovlhHIFT#0Y#*>=By;=C+hgIHdzy)5DI+tL~?^u7FIFmRD-2K5|F7dkz=>Xew6cH^TZx^gv)=pSw%UAwCI*c0CzK`*hK|RwVJvbbpsVNQ$ED9 zI|g=?5J4~n0}hNJuYd%j4rjgLva2~#(vh+eVw2hjX*1(V4XnupH%)K{ zqxm(9M4N3Ga75D^E_(xOUVcM_^K~ws+I-kWP~Oa?2)ya$iIAf z^v9npzxzb!a}URW_^TIESa6RyHq#}hC!$YsYEE5iRT7<6^s0tZbd+u>dSz`sS=71% z-_$g137YD(Ej4;ES@Y*YL1`QGZjIgPCK(S{>3|=>kWQ&UvYSAKAe}aY=1^d`;F_Vq zh>u1-gghR^(IY}9(u??cpBvRPKS`e|l!Vv!er?;fy+tI#Ga!{hdO>)@Xb>@0vmFr@ zy=@z4+eq!uA)DPIw*zRUK4>sw8w*T5thWqXmUgII4f2@A(5qvYte$Iu#0!Dcn@r$~ zSgp8nf-Gr@d(LN=K#GYY6_&Q}&YGl9c*o5L*U)Cb`ZxWxV8%CU9|F)qGQ64+-@y8A zI)xWz_wt&^Gg1K|YMdA3gwf<8(UvePep7@K1AZ^iM3RwQ~@wVjbuK(jw?>3v@YjS|=aL5~-77BB_S zZrE=qJL2Sti}yH5!qww(d(nH0XQrkG)hJ4%)2h^JL{&94gvlFUJCV}FXF^eL*(Pb0 z)7y9Q5mvo+hk}*M98{~RS>d2UO#oeO zSGad*Au-(>Qv5eUY$0h@O`ui7u8ov9A5&NJWwkc8q1L z1(zbpi8_L+HZOr&+X!K{EzUL@B{gO_k}#A_PC{8|U*T)Z)|%Q~b-+lY1@EZ)w$>nl z0vGId6U&WAT!@>1F@iR@Y!I9Pjy#yl4Fitz1rjl-c#0+Bp8me>-d<<`6h!#H9Ejs{ ztN%a|Q?z`cd4(`{3-YN>0dn5hw&kv3^)u~tLu8tpbI+p6%&RT+(W!r(aS zjNI}jUiGBDW{vz++wgxKJzF_)sHI<|j0<{5gHRj^q2#E8%=0!Ld zElBZ=l(<0ZyQwq6=&AunQwm?gCNBHld^qULlbUDrhAKkX)UD;<=?V92n-y8L zqF3iLidZG3ZH44+p3GVkHc`$aLpTOy9olIs6$3j#i_99?A>`q8-*5SghY~Q{E zHUP;LjZVFD=Po=lJaB*&VhoIKrD|GR73{7$Ft-Ih`aXqCC3TA=u-xjw05UOr9*eG%jet5TXn?8IGRC}x&SsR793|Z8j*S9 zI7Ct|0FIPeBA(n)3uLJs+qc)(!&VDlaQz6P0V`0(o5q^^Bx0?rz7e=LQ`>ag$4Dz#9KHOvkg%*kC-e z+8h4I--Q7Oqp_etnC5+@^2_~|uSS3JdiL9Q;-9{r{@{B2(ySj-$cED9_7LFKcy;x( zY>P#X29*mdfynFm%Fyh8MICENCYNMj#zR;KuxZA5170n1k+^Kb zS@T_mcWWP2ZN^8|RbIdU#0O7sV#cf5Y@^!6$6Ua=+Jhu$v&|^GO6n@mytBSr!p0w= z%3>vVbR-dd>TtO7^ErOo4puCI)BqjVmCBEX|MRnvKYcm%<;UV5zd!rL+`iw*6Gc=p!^*&?cM3zZ%l8j5%9|PQ~oKq1owWwMspSiI&r1zVekwk^fNAk_3 z#du80ttac(HMNui2~|Gq(a6N8i6ML9_5xNnlB-6e*~+jqZB?l>^>tO%`53m>uTd{orJ0`Gz09dbIBy-E7p_fujI>}^` z3|6-gE(?-Oc-_$9Leh+{Uz2#8Pp80ZZyx=qHWmtd0f;c;gKIv%zMD5Ah~J%|!Phja z!i~4+}OZpPFSZ6RgnT~$r=>$Km9i#@tfEz28c&st5|NrEF z{$}EP&n4e_0OO$3u;i;lPRu|X%vd|4h7>0c809AE&WuZpd|H@kY4a7ln?H&@dz7n zlh};hRd7!P_&@hZ-{9^Z(ba9qyMu6dC{EI(xUDt{)JaNJW4z+_nK%IVOeHsHWbMX1 z0iM>t$C^L38a|$*+&xjZe25k;c|)?e(9X>;vQXVxo>z337u&aQqB1m25u)UHP&b!o zanb$;fwz+BDGDCQ3wTc&-WSh94I*z9XAnQ|9h5oUvlqv=7dm}@FmdH9uU^4@y7_tj z`z=3mKK14=471%r#^?)QaHE7m_U+RzyuTN#pC^5w2V-EL@cw;6`g=0bJLAohfBP^z zeS`tNazAg$zdac5`t!o*y1xCx|J9#{UK>IC`s1i;T`=8AW9Ku4ZBoPhDBY$g{Rxih z_qZGwI*!O05#xY$oD+oOMabAMG~=C+TmVX8qmEZj;OJw?WaFFR4oq71{Y&W=@O} z?=W~pg?L8L`lss{<_JH%z$aNv%On@o{B(RTJ>SR3_f@jIB4~ZZq5Wk{PZiq(mn^&= z$M;{jC8rJSh5b=6VrK{UVg&c1_3IXGuU_bsaSw$i8f~)MhNExq-}{~5z5^Nky%_yH znEm?G`}PUzGa$Ub52ueGr?(I59WTxxFP^uT(APiO&sW;llhfOaL1!Ag1_^o(z%+Px zKOdogpu&%)^QSv#oGcozR;ZXP#o3*@gM8IRt?OkIHo8I9W5}E!9J)PZ0yQv*n&pSM zu}_^MdZnJN*P-Q%w@FRJ0FT~bxLT6K7)243T+Q?~&})9nV0 ztnmeLk0*myzO+5up*g!mi|z6@bn2&6%J9lD)_D~>dD&*JQy#44dq)Hhz^o~XUCs5h zMEa%a!th>VY_zXk;$so}m_&H+jVW{=Y52g%kbY70elq3&1-qY;HGm)dj=xtg&-Z%y zzD+!M$bU#kjf?sVqi#%jVYy+3nryP7-ouhEA9^2eo_~M}dmoXWqGVD-S%h+& z+0@oE)CnHMKg{&um2G> zp-)BQq-2je+@vz$XvY74b={o|Cppp{QFpVZK)=~`q0uIG`%Pbkzhg7pToX_Ix4Oy6 zCY>_i47HxGj*}@X9Lk#?+o;_ZT5tDm3lZba3zr)=em)7FRKpSFwM~Yjvs8N~8rKZ7 zj4PJ5WlCxiL?td>wuNht4%7*Vv~7~06fIrF@o+^4X6V9mjEoFjNRlcjRu*87@;8fp zEfGGp2wx4)OA^*UGPIwZ*-y*$FhqFCnFDzP-wFQrzYr~&Y1|ayUvKyRPoMsw9$s88 zKfWiXH@$fM`iB0uPw=|~8SnYBG4$%?!}_l`+sljR?;p!%6Oco{0-Yacc7em z6pf=fhv1@YI1Uf08%8$Tb?p$7`AW&Jp`@)rEB!yxrffKFy$Nxu;^Tk(HF|BzjK8tr zBn?i5XFbIKPNxu0t?WsV5@}Or{LMYmH`j)#e7HL{BhK3Gsi~|uU87>DEh1%tOf|7k z2G=vFkx4i;35O`5*G4TPWn_(texvTua3%HmF8Rf^rhSv-+s7E!40lYe)L}c*nuLhb z7-6=VWtaM)@0QT|C8)w(@({!whgXjE^c)i-*F?|Mhv0p-IC+pmiW3d|j6yFH%3Rh8e_C&H574XE+djPpvEKHJ z?1hIHqyh^m^O3R-b{Tb34pEU8>_zD*7%(tAfEG>XTKl54_hbz4;`;h4uoHMN-HshI z1ktGIW?ob$J94H(w^yY3R_ShAW}ZX51SiIX_oogMu<2q&BCZtIOU zoUFe$*Oa<@K$F6~Zr1ohuA|_Sa@_bLXQ;JYl~bZjkgN8Om%(F9mm%UI)I#F8=W?6z zH|ll=Y^`v{{MUBfrwg?!+Xb^~#nUQf*q01j+hK8ES*$42gt!CLTn{PTJJ-UCSB4@u zmn<+*O~Va163;eU=jPGDKH9rECP(!aY$0%aPPO6-v1T__LVU`6g=MO}CAuidG$ zo*Sf8U`9mkPN%rzaHWcr@4d;Cx)Y>sf8Cul>pA=AvF8Z%Z%^H0!-=!jqNi431kP8* zM5!w5^81JN@VpoRJC|ZNOB|Jj(so;NRJYrhqqLDVegQ_q{gRja<-ct*9-nJi(t=%T z!^f2>Czk4(QX}e;BFbY#>3X_D>Mv(|8TkQq3E~VRQ!DV*34L6$pd@ujh9NxLNQkFv zX^G0<7-jVTmcgu)rAUe_jt zs~Pa33?LUE2cY&JxG_j`8*^lhpi%g^hQpj=Src$HS5jJ71#p4fLEVY`Y#;1m@#v@1#8+qZBJ$xc- ze4&UVYZl_xDj3}nc+c^NI|!$2IGubY^gNY4QdMY_-#=u6XKqE;0ptVZQKJvhn7h^O z#_bk0iXGQTGUNDT-HnafQw#J5CL3{b-_RWK^coBHM`}rzVtZv)}W@_BH$fFClTwfiiC_sq>4bD2uQpXW+o_0p2Vo$I6e&2x3{^^uD3!_gCIv+$`? zvUK=VFtyauDHu9Aojesd(H^_3;|o)(;;79LYO_eQtU(GtW2;hRT?K%w(Q6}X99P}a zGy2f&yWOHj(5UNSz!W<1@&YmZ*C=t(6r_&IzZI#wS{GG~0qsdZdko@WYBZ3hVB_GG2yAbt?C(V%6_!McU`sR-Te;yP%L8<>$QebA!yOQGdNIUifJ`{t%#|59N&`n`Ah=~l4tW~bI8arF zi;BPrXevSKzN>&jCJSSDEn7)Iv(-AD)+o>!g$7(EvBfO0S|oN$l*1~uTcaEnsna5H zn5ktF+YBPBPGHsw%o@H~!!xV7Mm5K%Vi}e0#WpBe_+`)=1X>NxIJsB`7t-K*9^5a2 z*QFHb3IN=E;X7&^7j~jhv$ea%V?RUj@Z6{w zwN}D96{U?ch9Zh=930x1YosH@R4o=7_{vzGanT`IAXc9&NzpTnVn3VI7jY*cZXG?# zL`RJ$Yr@D)bFbtitx76DQ?Y7io5VjcQ1O_YEA{>yK7{t(e z`SCCx?iVM&r%)ZRF{1!tksO~K*TAf^i^`(W(NlNLrOD!CCg8pl$xW|dg`AxnM< z+e@}~kt0hy&q6sjjUv!75~~|dKv%RvDJr@NiW(rj3^FQ+t`T&01!R^&N&zwBO8w_X zzSb;Int5`x=O!*b<+ohp@?y*;$w7))JlrcCBM6q16kVw zvGXJ=E{vZl(bRGxO5}#A3iAr7aTix{M(KEjEub+KhJ2ASnX^ne=-M}+o1thh6gNU< z1*DY`(AYQ{6^)?L#ZzMwAIkJ!O0jp8NNuB*Rj9TIRTcp*rHQ99ag|1{!oX1&xN>}A zAq6fSI(K{$v#->1aZjW(2@U2*vsG$yC|og`xHw%>qB$+envv|tN_A$ZI&;!ox#_X_ zsWEveuG|DmW}GqIrAu*WlI_X_t0LYU9cM!B5~p75(249ipLLKN=P2!LiZv2PdyX41#QnyDBWTn(a_@jwgW-hf>RRRL1?D{y z^z#}Otr>zDwdRg2c~h#SF$E_Jh)NxTVmr6U&PLpLR)SMI^DIovu9(F^wn!S8?VBQP zOqU_?7&$FbLyuRXsA*1lAcD3@F)G8FN)BEp=75{vsRnV~@_EfdIE)Yiok?V1Sf5x(kI z?Ej4WtcKx~0q;?C?J%fphl(Lkil7?^=XTc@ZnuQvZ0L80D73+~WS@@zd@bLIaXBHW4 zSgRy+xK!9olTb#!>2dj)iAC8dB{^xOdFd6!xpkE#O|=zm^_3ktsby(#MajeMDXG)Xo^l1-Utm75$gaf&7wZE1{BJFSX;XtMb0h0?#a=-{Lst|Y_VEO?5} z8URjsnk7Hj5a4X zo1ov9UWxt{IE^*;yux#KO|_p$I)2{Tw$SRUK9pA7O~}wMGS7Bta%I%^(WW2z-0t z1ro&V$Li(5>NSAX%Zt^g9}AmT_|jy-bnO8D=mFl5c);OBHrgr*G)kLvclQl924RPj zFl!*w5lDAnxBn3AbfIdKo977>%h=HeB*trbRe%{$6m zs>+*Nnz|;8pEY&r{HaqHw0DeeY8lp}`iy5QxX^WfqC+0aWEVF#KOnHBc7S7t?S~C2Z3D3}& zqb1LV*QoAFYM~#;7t}b~b2o0JjI8m!5w7Pv*`@hnp={?k*|yQ9NfnwxI}^uvH6}%3 z0ERA5+iJ|PVJ0nI7oK9|+oYlSHjYW+YZm(%A_5Jf04=7` z_;?i|44a7JeUe^%>Am`~-+oW{pMDZ*QmWZ6NISqs)8AL^=_mK|lY0b`kjyt&>m8u? z3^w?N>HA>BaRF0QD>E+QD>t*FPbKEQ!s9Aj2pS_XeBz-7W=k*y zihT2G$v(Oe<1w_@l$%CTXOs~i9iIg{$91LYn9j0Grd=7z866N_7sPF0i${qhlf=ro zQsZ*HV}l`PZD!ioy5ichtcv`^{7hG7swF8=A0MlB#VDOFg~O?E;!B(+E?%FQgzd4N z*;$E&1(_9%bsfWpO&C3T`l>ZsK0STz%(*WQ9X_#O$-2%lGlq?tHneN%=<#z#kDJ}n zKDK`F$h!JYgx*j;tf_I>;Kq@Y+Ozh|uNs(nvUXhLax3n$nEF&{rhjCh1Iuh4~CTqiS z+g0WgI?;MdeGC!)8orN;?kIK?jYXv#W{4MqOuBLP`nb){xya_WVatqnkFx-dCGX>a4q@ znx#SPu7I%GaO_wp86}d>R+?7Z5_e@59xJFiUq9rh)*(A4jGQ>EWn@!jOGRE)QCe|! zTy~m0J;|J$Y)VWtCgMwqEiKKNm6ed6msVPsT~$%mG<^7k@e^k+TDtDbufM-|`KPbG zy>#UG>0_UsUAA`H^aU$tE?m84^RB6LSB#oCclel@BSudjHFn1MiL<6on=@s~+ykqc z?;LITb#K|3^(lL1C^w7|tsEv?&@7r<$sSi2yr7=3dz|9aIhr4qt6m&1!4FArGZP-> z!Yj&>zet4FXw^~I1(XLzy(4Zk=C~cB0=Czc@U#qmFMF`t^y&1dEyE=Z2|nqDfQ}pm zj#QgoZJAnW!qt=#m1kiW+BpSQ^w%hDW**fV5gXfD7V8pHD zc}iJ$*nxR7POpBlcRX!NfBquR1GcG41 zHajaJFFUayFRi37yRx*fzOuZfzG2v?G1JFRn!SF@t}nm2xclIdeIFh>c=VGKr$4{= z!!PH*`tHPMpPxGS<(V(OIq})~{U09Rvg6>UZF@Fv+r44S_HEnWzw!AZc)IrGrLp&p z)n49{eQc>=>qN=&VWL?L!ilBai6!B4YC_*18F_l1{>mCHoWM9O4Q^+{qkMQ(0tkmnO$UKJEgQZ1tVF-NRZQ7 zaqM-Ru+YjudtQojVPe@0iLBOS=Frse&diXm?C`Ek#-w6FYcj1SCa};Pl&lJ{Mh;T) z2K4&3xL03uU#|>r?=g9g)Ko#`p(D;ovPA%TB{FxauZe^pFr%YovZHGit9f=2mqp)S!@?psa}y$D9}% z?MyV(xN)Weu*3q$Cr^CAiE)iQ$`mI7Re^7t?QC= zkJq*TICjRpHCtYuJOjr*g%6M3K6B>6f&GU!ZrHwX{_^o-rw(oHs;_J=FQ_ffsVK^+ z#8pyIQ(lCWo9pX_wziG#8a;jTj75uBGX`t$Cef8BfZ_{oDu zkM7=kaQEK*2ag`(!j~I2Z~c1Z+7Cbdc<%GhFI+fx_wsIdydU5YT%GyyeB+HnIVYAI zHjNX_Z{d$G6O1Y3Of6%~t3}+xa|^V$HyPl3ESb1^JD1>oQ4G&A;9)Gh%%DVrZ_s z!o?b##OX-qjLKzBDq_qor!Q+@Z)%UgHrH#K7~6(LEgvkJRvOxw8CW0dmuK{emHGY4 zE9o6CY~VaRFlQdP zwUkWFOUMIcjR%*=9Vus)Kw=J2 zqozGv|2}+s8GiZ|zWVm%H{U<_`Ij5teShiPxi3HX;K=ILo2E{k+c|uEbK|hOn%3&d zmYS;8x|;TehG9+3U0q|QO_{ZL?&3Aub|3uwtM7ihdgJ1czx;OX1_HhP=U+cxxrW?t z-MLHX-@5bXz59Rub^pner_Y`}fByXGqlXXh>u~e;-yYsL19v_F_!8hW+?@3Ki|Q-; z6OSxXF7M=wuVM|$Wsff4&8^`tY6#svlK;gb-Tmz*_%fctoelR<*G2GGBK#E#&oc?} z*IAUn^WkMSyvTxAW$?5XZj}G|zWUtk=slwqcN~{U83VtKm3KMvXN>6AOgXR>AXI}y|59OjsIpv-(tjb49ia19 zvc$9a(k?o;f+H>oX5xVRWHRPnkj;vy4Q4jcg|it^JEVr6ifYMO6>gt#*NodJoS_z% zPx!{=K~f~b;a5(TX!D#>f4JCA3eHu8=kxKKSv;qo>Ya`0n!UKkq(&{_Mr`XD?s9dU*flv-`iogG=!AJitYO z-Egh-#b^27Z?}IiPc^rd-<%QLloC3jgukpQa&;Sf$7tS#h1!QZtZ*TLsg1dQe zCk5`r!#yM(1CQe2Q4BnZgJ-GmvH+fy!Gj7M{&ju5^!POK+99HGg^bB%xaX4LL>_YT zl`82f(6porW>iKkZ;IU5E<8L@{>>u89~>s zUs@vlcyh%0A?(S;fqu-zOwj?J^b%L`kf#K$0t9-9jsa~lDB~g00zxf_bRaQ;#`aq0 z{8M51T4OuPmEb=$mL1U?#K^(fd?9Qs=tv3Smj#E{g>t4a#Fz&E2BnI)(GjDGMj<0> z1daQt_&lRv=b$b zzm1sudfQ(3}CH|&_XX!W#tE5}b?ICk2C zDRY;v-Lhx%&JWgY-?x3=;ZM$7xb*XHXx^W{c>enJtH%#+zj%BLo?L?`-@xn70WQFk z8E~oe?vdp4>&$zmYbMn2@~wX5&X9?v!u1`BZJiN&#t8`S?N<0a4t`06YZ-7g4sOK3 zA8~Le4j!h$!z6f=3{SI2s_kAL+$w^v(tcSk{%BIfHuW&rr9s~OFozl-539vor8PR_jzqHh<7 z_Kg=9nuo?IDI}9bGV=8#yI}(=aG7{ylGfFtbvmn5VSwj?4b4vh~r}S#az# z`1Lycd2pFTqei>4TH-}&>ek58R_|G-CRspl+Tw|wLKhd()e z>8D@+KDqJfD5_5 z?y(D?_RI2(%KYF^<4h`aglSYnIp0p!*g(Fjk#`dGnug^T2vRcy-WGw zMDd+XcG#(f4mjuc600D#oO}{f3bs5@C4<-oA_MT1uOqeB6{eHnf+fKW4Ce~{!d!tN z_8@vX?zsZ#!$TvM(}ahNv5zx~$aqsEi?_iOa>+dt)N))lU}+B`#z+j8!SSf%l$6(1u)ukVfoI1OH_kp9Iox6GGE}Gwa4<3H?{pDQ; zk1SlZar%N4i&t&jjJEs8CmXlyo;qW3Yx~&7=27m|(mt+p^o(h}2v+Tg=-g%N7q+HfM^B!a)hL zcUn{YrdKf54PoyX$vieS;^qbeoQi=9cKFr_m+bJ13;sxgTeuR4%&*15F9~ot^~rwS z$tmpZo#M$QVMEecEg4w7E3Ap<56KWtEfZ{LkGQbdabu0*i?brVd{$1pQ+t}97Pag`GmAmgU??8}Raj^<917YYy9Lr3Aq~;jLP90P zmVh}EB25r&24mcxLdC&A)(n3}qknjkZ-~V&B;GqP&oi`{#+ysyY*U(Vp>lB!rYjv> zh#R$>P0-^MV`m0l6U8j(3$^7NZsg8z{u-uuQMhO{ja}2<+vyWxV)7D2QLTK%yeQ*d zOY(QgrO!%QVcl*x_YHh}8cux?|*DDKBfOC~vE(YOkvw(cFf_r_GqNe9gw49~?dT{SUujn0D*Nj}LEMdiB>Oxc?BbJ}JSpfYfR*XF;SHG%iqDe-0CF z44{wl56Slmu?5iV{R7kb23OLU6KSmFk?J38$zV+aM=CheyZIt$M30}FTz6&K)8WFc zLA({L$hi#ONZ;`C-d^^;{h}hI`5Z|NJ)%o$+@^AVX3xA6TL{hLVBaw~cpNtFhP{X3 z({oS0z4+kL4|jgOf_tVrx9|S-@X=$`FD~T!>6hOeIC=Wur)MtzdgalRr_W!!`1bNo z8+Po&Y{}A9o2JfM(m85s$FK>lt)r?d+p5Z2s>@poa%%E3tMap|F&$b`&{$F4+Su6D z*)?_M>}6{{PE+-r@xjIG6a#F6)uS zhDmjT5hbz_rPw6SBU#a}Jw1F;eI#y$whd$N?hOBOw&daadiVt6a~pi?f{QM=M6ItK zaMp}RT|X}sZ|Y#otzon#2jdu^vKUT@lhcyQnNfl9w(yS)PB?6buLP8>PN2@wvZ!Dl zld-s4$IJ|7T=A%MBz5lv-`&LV`(U!?Lq-FX4262Up*h4NS8$w%Ux8ofFh9mDM#K?g z3}KB6;o@?n5blDMbLZPfLXXU{JF z^4qDezWMmv1tk9SwHx>yK-Rxpy}t9n;W>*|kDD~7WBB;``r#GjEhUBZ#d)>GxwW-r zEyX!Cc;=NJSC}4Ol$BJPmr+$*&{$VJbZEzf$x{}tShaQUfg^`L{OI#z8~*ry4_w^? zzi)s?3jo#v90r&VPtxJ1^cSDRUfgQlGs`roHga;Eu_j5DqQz9kdv!5BGb;s~hskz! zinb36|9ArL`f4Q{Ho{peoVUT}b~tB+(F^-|Gqa*ZIDp{AFQ4h6v z-){;GnMn}0&w-A)Fl;^y#WfFx%_C3zux$pBdBrFwXd~YZX8|ajpo;^A^;Wp(eP8+* zub{jE0j7a|mj2$U0|RSA!p8?Nm$D^iw2r3;*Mh-70+{1LYkwH2I!hOB3FfQ{6)s{3 zCxx+E`gvu(JJ2{NK<7czi&ZsZ#pnpt5{>hOI`&6f&P!_^ln;Zodtv<^=$r*j<6z>v zdvlgtTC(cg>h&Le^66(MPoFz=_6x-Q@G;4Locs3T{!dQtI(p*x`3pDyyo>u|bm+Ll zn!R|{@KIBmT1M5^53ML|F3PRRO)oFZtSm??Z>(r*sUDi<%!xOpC73f3ZCS~#+>C^x z{EX^~qUPqtk)uY(RnvNUjV-@fIDO1^;CeZ0Phn)JxGR&>5q;$ zFKv(AFkUsMSvj%BiuJbHCPrMeN2$eUVj*)?vt-+F@s1&%q=TtJ=Qv(XkK6z$5qog+`vS(JZ4~!E&*zSPScDRmVn1wnj#rzwd zp&&{GihRfaV~wLe!4Hu*F1+N{T0R_xOd}`}G=aMShA)H>3;%xNCj|Xm@;h}CpsW+} zaQt)wn9@P%0z*6qmFI$33sKtd`Ns4eq#fXA?;DsqD74LoKG`>XL6~5VRP&w2a!+e} z8g015m+YmnSJAl37~;7M!D#=Ws@@*)|LUjl2sU^IYFNS?g>C|0HcxFos)_m0lJ&w- z0L~(qv<$X=2s2hdVH;EqeOcG>earA;o#PIUoxJ@09ea1~-oJD22Ok_g@$ID_QP(&B z{1aodQy0Ge1aO3d0sv)KMwZ++0CD~Q^DW#b)dBtfJ zHHD4I)=Y9EMH%lr6Xb z83xZ#P4fZv0?Z{&^FbDTpZe&CxG!{d3sER#OnCcD2$etA*kfsvsr8iM9kGsfhFRXRK~bv`&Bq|h4HmCIVw z%KC1x3XUbfB^A8XP@xwZZA_WE{ryPpo{y>oc=PV2yFS#G!fSBgVj4>@Hj}t=&|~GTG8Rc+5_1o7(Y)~ zv24wtD=fATY@GXcUj;6@bj*Nho{e5HneNf;HJ*1ik7m%hN|Mm z^8C8O^zw|D+yqlff-xn-nVlVz=a9#mC3cg*HXYm-jVwvB6IwOA#=j^+)_2NHt0ejZhNK(DwAU^?2PuS_QLuJDY}gN@=0Xx?S!-U!7hFip zKjcVXskOD$*AAIAZSKtJ^JmPMKV`=JS@V`{*|`^uIcoXJwHt?yezJ7UW<2I-Z696V zFtoC)sVJu^H?=e;sVFlpFV&VAt4nmLaGGF3f-c!6b6O(pc$L&3wCF_^gUDu#bl{~U zi!3fylbUGFPO;}@#FeDF(&n_s9$#Mg?e@akALqf}$tX~ncj1%8u@ z!$#)PTT;TaG<{8I{BK>PL}hc_+PJG7F96ZGhxU&q}jrCKys;)bRu^QI*$=&nE2@?cD&p>Df+(+@qtrH#Ph1eQ;Rqg3h3kVSwquV z4GHuV#ebbq{WA>MrkGx23mcVB-!g*x$7U;>bHQB|Wxdgu;K4UqZxl5`M3in7BiuKj z-{5u=C(<4=gM?n_l+jjqgI)?FdqBT=LHfkJFCxF(G!2@jLgNIe7!D51v0y^g@uxtx zBZxVozklkx1ETv367~0$_kLU6yRW`qaAIJ1K~PAcZ&-nEcursMn77_j_wK8B&s#Cb zUmhHy_YJnv1*LlDswl&Led6!dY=|i)2^{nk%Xh)n!?0{S`Cj4fKBfGbE9*;V<{`Ot zj#%By=i3TX3(IrLs|stXOX~;Mv<>eV-Pt*Q?6_$YC(i2Zn$%F=QB&PoQQBCXSDlw$ ziszen`v@s#II`lki7~1;mm(%XmuQW&k^A9zQCwiu@r_!J9&Z9`I9L~8z$@Z-VHk-U z#ZE(n!zgi?rLieS(b8d#ebZeRx8~kGoC!Y_!s`O+R>^9B15~J1OEy6-a^Y(Fqoc7W zmuU9Rit8wll*jQ)V?=32X0o2`i1Nb$JvsV*tts603{HC*yFFc4<_L+6de<5;055;W zD#H>~A?41n$))rUCr3Tm8w20!;H8B!-AEZXQ$wh_Fa(W?{wLz;l&JCPesQx#?T zacOpWb#ZN7MN?<{=;0k>I@(6oSGVC&W^ry+enx3_a#4D0c9JbU!H|?bS@%j?5V_!UK+ zM!5;xKI6hT0oCgE&Zy#lB7OtFHR0%Xx{bU_wf?F^&iGt|K`5aSMZ;=+5hP;dfO+; z(_iV$Fa$GgzM*EH@D!zaj?Q&R<^0)|M@%>BH@6KIZiDxa!`7oPbtPmBCRw}q!pE-c zug$4@CED>qS#2OY(IPkFWwXNMyuy@%qSV5|w8FBSil*w;QA5YJ)^}7C)a0cV=Oh(m z#^$6tGLpv*VZ9Ts*`Wj;DmzDJe$ zsN5AFOj7-U1G(C=qZhQ;HjS}wlD6sJw zQdoB*F*H* zff4`eFZ|D-$bP{Jk6=|$xH&M~>KkP63677}Pd3CJP}(lrb07{+Ht~W=E6mvpJ3fK! z$6?9)P%;8iFf(8F+Le1XHt%$_X`V>Y#EQtJhpQ6xF{!463|nfZJuNFH6K@}tWR$d2 zw@n>0by)L=vh0d+Fy6uma z9CN211FWDTDAao%T*>@>r}6yi_?2CjiUe-4OIVd4E{}=Gw(+xU0vr#a<9J}tx>$Lb zIVv#CEU3%SXX?>kvs$xpFe~@`0wtV?f!lbZftMUQDAuTG^wcQoH$dIeoSsA~m!&ny2F0c!#5+v9^A>GJGH*w12 zB{_CMj3PA6#BRtoB&$LlvXI&gO?!@LK_l<{{Al3Y<17`+n4tRhcbV^_k2RWN)GBv%1CS!3cu zzI;E8H^wtCH89jH5Xbrki2_3jZr@fqa-LZimcz z-j?|?u?&)HAiW7Dt%6;j!uuy-+c6lkn0%7i2yulkV{(46rF|e$kHd}};oQ{V5N)a< zHcoDhQ`+Ly_BfS2R^^CSyApMAX_l12r2LAk@>EL-b(_>_m*L1Ut5sq)iA|)EOJuY} zm<)V9`e>`frswH3Y%NhVRh&z#HaZKVj|d@`O1p+Ok+qzMWU( z6k@GqvYwe@;H2mnNjg?Tjxkxw#-TrDN%8^*w>FVIuQB4&+0vKC;>hVI;B_^$;qIv0 zZNO&&;6k|nZ^~|U<9`hPK7KdGVbTm)V_J;txq8fax31mR8zsCP#vtF-Fm5f3T?6CR zz~uEXe>)7D4T%*HUyR$XKe^G{!+D+F;mL!1WZ`rZPaN;%!wF>?MbX(lG^K~1#4A|s z6M&@zDxV-5PugaR->R^DX32P#TnWjwklqYqmcq_YVaF-hbqeNef`VbhQzw^$BkQ&^ z>y*?qmn&(fJL`_ULslUdh!U9{OXk6I#%H7D0YLeq_LrR{w zNGA=1E@f~Br%A?F80IyZ_DyqL-;?|56y7?(q$R4m4qyod8Z9{zM;7kjt?0$qNtf5_ zPb^KI*{Cgv;bdF**;YZeg`23QryAK!xyB5O0I&F#CCZCj!b}4LN2SlG6&;-}ee#iu zTwx;TS!lx-QGX_?6=}`}nAL+De{@5CgC0L|iyGtb@l_*604Fblp(rdT6x+z@RAI8Iq|4AoFs-MF89 zp7iY+{qe=AQ|oobG3;C`Ho4+uSvbwPhCHW4&haiyl$OUw;jQmHD-TbuCsjo3pB#N} zpB3)l7YXC=!2lZpR`v)Pqd{Cq+^z0^;>LHks0nDa`RR2eAC3nfC~cBDTSzRq+lCVd zy&OhSiXOiXCT@g@8wl>XyI}WO*meS{$B+m)sRR_Z@3^uh;oO>_FuPZ<)&oy5{II|? zp2@d+_^^c1be=fP!(ZVUY!S$tEQuQx)+45rdk8wEmVm~8_4}W|t~1?#EdGd&JF5xe zumB|MS5xx-2=y4Av?7F;LJM=!L!`C{ja7twhtyV~*1fQv%PP`ZL^@n3@Kj@BvM$aM zWp+fN-fi|MGnRp%>Bg!qd|Jh3lfa-y+-yRb>ajp5W8Xq-rr~atLs7=43=KFXZS0lN zW5eD3&9JkXUdXCRiWpU*omOjF*J=4?L*}!ic((*&@>9etvcMcl=B zS@iL#gfCYaK3kyp&2~_v>yJ-2zg#O z%YZ$H`O+*utP$6ASQ9rWtcOggcM{9H6^&cNm7CaF0UKywcLn03iK5l+9+mDs!)`@)6Mtj9u{{n6(y&tOyKIQ299cn@Z7g!D$pX#{)LJ&AEIM>3Aa%JrpN0~pxw%IqIzM%F@U z29ssRwj0LSk%pLQmZVKG%Rx)p?W9U_$0?%;8YaVrBe3^#*zp_q&w1O}dC{JTqV}zn)oUsPi+#YOnkMGkLXF^ zo=H z&NFb~23-CNc7I0BH!}xAb{!a!eiZ4}a3mceoOC~iJpfzSh1mkJPY&IrG1mk!4S|dp zW9)2w%(`gvK}XhKDOi4sJE<0^od~NA!rt?+<1Fks58F>d+e{Lq<+ea#F^c*(W8xm6 zdNiiU!g=Zbp?1GeI}aypl3IKBqRQ<#asyXE>aWQY3$axOTs*abi;KJ?Vr-p3nku+^ zXpl}R*cC_RZjYm8st9QJ7zonqjI!ZqxBofV1$F&qz#>sJ)$@w#PAOxF%Hjld$&q7A z^;4^jYdbApuE}_MI2rEbQYmY+w_VhB8`X_L8mfB}l}$x?7Q@rx$EQ+0TcSQN*R^G0 zVy2aj>C>roaV0JSx+-2&oe+U_xUHFzS&j08Gc|wibHOeA1MyEr;(Gypq%Jq2xj>zW1H48H9$xSoNa^oE&Or~LQjyV=Q=tSI;*TS;B zaNs4Kp@FDIRpDZK`48FwuyCnUz% z+^9OHFb6|2pCD5p&8TNf-JnTF1=3WZyR`yV*<*JF19B&eG*akUq(=%?+#_ggnL@ha zkoHH^lTfBQ7E*HV5jE*(hoDJ+Ginwa#@^jyAV@nq)HQ}@l&I;XZ=p0yjb*UdRdQ&a za(t;_R)cBhB&8TMC$>K`rC==W~FMs5BjV zYPVk=Pn}?nqLQc>wBvt69su5LlPayhDQqBjf;s^lIV9~|(gF43pm_?k;C5^#bS;3% zt6=sfVzhA^UffAcH!8ZI74jOun(Vi=V?0 zx2l}m4DnyM@?N6p#%)wq8`MpLrTd7Ycb$VBX9)47d!ZP=Kh5OYn=9vqHRWrSeGOmU z#*WAj<0bos+Ps6U{=R%8Cz@K=JEdo_W!()lNE;38u0XX`=q|L!1`9}8sly%`q>Y9W zTbmNlsA~%J-)$;M3vqW3LqeHqWJg8dl)Ae`O&M^q#U^nY=~0Q$5w}{vD2?IQr9_S_ z(oHBgE^0BNCBL&f6)vauSn~S+hq5;*+}-^26^%QWxK{Sq_b#tn(quoO-L zy8yP2crV=$`N6*UNB6aI?|^rJ1?&dRKbI2YAk3i32G9e_U`7~`*Hfeq2EUg3YnXcr zN}>^4@ZM17%}C?Fqs?5TnTxh#>tO3bZg3s96o#Cf!L8kct!NA2)RooPXbP+xUeC?l z!1b-<8VBF-WpB5I&M>)Fsw{m9Qs{3%5PatvQR&oHPz|+3w$`TOYIpcIsUVl%}og1T42VYdGmmO`)Kscr7&4E{o-{!e|@9_ zH)&!g7%&m6=mP{aDDxi>!S5zeK*cTO{%4T;W&5A+u7Bvf)EUcN``6X2@9_bn*LQn2 z_V_mS!r1|Vy^BNFo)mxlqSR*(b#rg8;Qk3vf+dF#teLLxXS0R^J*a=dpBDTLv~gUL z`&*d%Aj-W`!#&>c;eq-p-5Gi}%=G?wr2b=QC`z_-@is2f%Eddm+93{nE9haUJ=G6$ ztqZtb*vGL7QEnamORV)5uG9_I&>oX-ozXQj;7aq&2#5|4q%EgW{IgYkwya2S&UBU5Ms z5+ROoUBR4!811?IT;1#gO$cy*aQEj=|UNw1X);y5Z!5EX( z-OjCp!5yQ~eJc}ppI-O=z4N%II=IgPZg8@I1vpax`W`BCKg@AYlRgI~j^J1SI>Nos z@yUHHx9|4ew6pG<6-k(fv$5B=WlrG4zTipy!Bgi(_N|Csw=MeU`H6S$sQ(J;<{z%) z{tg76M+ufJb%u8$?q6lOzlXWcBHSM{+;5t>=i2}FgQnN7N!@>jr$Po>FHcsOE;73B z_Qrn|Y4|AJ{_ji|m+FLy2DY8VS~24dfmIhoNej8Ap}!>BUh|~yw}vk@`9L_W&^qVp zT|)-vfY#Bkx4{}w+m=V`E(z7%8Lazd(+CHqd(JwHqtCd8d-_f8r*EL}2B2?$3Pm^o z4PS-cRM=?}YyB+Q`c!lOeJ1~Ajdeh-ZLLt&m&&tMvUF)>KxSyP2Ukv=sxwungbBmQ zZWwS!BMo8Z6&?z}7S6_jAxN|U<){wk!^4r9G^Ub2=7XJe&I65ehI70|1J2|b#Mg*5 zLCh!3(0WJJWkyrQ4vKv#}3Qcq>@@tUGp(IdGZ5x7*-er?bt|Sm$W1y*m4l(Y?^(S!VIB(R;UB z0~a>*J{fI#y|(|~P#l2_7%=+G>$t~X<9_%OcgNG*?U3<)lDqsq>~iTkfoq(Pe@^kX zf5cjT=?LvlG@PGk+@;X9S1ap4+EplPxOF^HWI~)@;NX zOg5vj((E`kb^yddhxnik&z~X=b{ma3Icw2h1LA1I1!{`{m%2=EET6Q#&E6l^WGyp$ zyrund<-&UNs!r#IIi3@Tf;aByzjbHp%{v1h+}Q*pP`D3)cdZmIZJZ~6BVL)>$t+)rD%A2)G7?fu)sogds@|MKP0NA|jJJkff=3d^aZ zkOwdxU+S4!nJAVu&Q|nSDptyL+hm5bWoFodeVae|!(`L5$<}AWwLfx24wyYxXr1S% z>>$HVP+RA!EZr(|H*|g)919KZ)n@<6mf&7X=n_xrK-c*l9kH*?=_AH(>Noy=uvZMEKkR48w=Eqcu)P@Hznv$PR$wm#c*|Tg2 zEsr%qjE8-o_2%PiVl+`Z4`{yBrHX3cc*EHf*S1*~)LWC5;yHnec2{wWXZCOnbQzh~ z_P94eb$dhmo~6l))`lLxpytgRqF+Mw`Q18#8wAxN5>ZzW$8RC44w~%@l3S2wnTPG- zKb!Z_gTv2UkiKVU?1rte%T~wET@u+nFSKni1Xg`ZpZAmz|CvjJm#p*Oc(U)_UH+f$ zi@tPa!<#pC{r1ML=P%7XdZz!tDbDY0u%Ex&aq3(vOhH`SWE#qvXO()VmUxRQLbIju za%p|Ja!!?YQMGQZRCl7>xYJ?#*S%@L3*q)@3p2as z`>$T_yKSfQCl}a0yD!AOTEl(WM5+lS`V#6O0>rPU1)!h8agZ4s<-Q!?-s=cwnbCEoojJ(sO@e{WOZ z>P@~&*Ela&>Ds%q|E0cki zo&yK6NVTKY%2AnSSgPx*&~-_*osck5ndWLNtJL;Ww4QS;!K?l0`)WFV-aPnD$LL?$ zp;c^{tA{;$ORydd3tE*fyNkQzZc3Xx!<~8=*8(Z@Nz) zvaHeA7dm`H&d?(GLC``hQ$#GTE}6EWsN7dljXg^;O=GzX^K$<5T8*{eP=Qzj#5j)> zAK-LKws;%Ps4b8h5I|K(9@sCZ8 z;@&`ctE;5mR+`Yy>J3(|Z1?mgY+DDtJLiY?EX|%c9NxRYw|k!PoRx}u_nP0l(ZfBJ z;Qm<0{kxr71mSub>GK;n?kXy0fLwPE3S5c){~=!@^*F1eGt z}|w53cwQmyTE1m?LTb9MINDs_{#8csZS zg*7gAym9Sy+GsHBmksK5bkt-x!V z5})s{bLVrBLJN@NCX`8-k-w%)c*I&|K66QW(?B?Fn%M`|+g;M+Dy_AZ)|iVHXEk1R z7|!5JSdClyJ!dXUpR%B4_rk==CjDq;_V#(wD^Jutdx`7w2g2OTHQW~vD}gWAK9(yf0RrrXENeISmk#b-X#VfyUhe09Il?_T{P{zDZ{6Jd^!~&>yF%A)@n5*g z5664$nCm%d$bHhF7vMf|(6y=0wZ6x`s@uMz&9bD$w5Z9rpwToJQtRy=m7&cYS?La* z;0Ua4dYaa!%Ja1I0P=zP7Kdu4!oe)y}$2R^>P>o?aoJb6Lv{@uP?wt27F>c4VR;Ij4pi`V)t zSnb}o!g?(A#1(XCwld;}VLjALyd`?F6OeU~cqo6D-ZX3X|VCL702ah9uM zDnqNhIv7-08PHCtZsJ6x#?m@l4p>J^rKu`ajZ95uT$}MkmOACYYY}KP=0I)HdK0x# zjT6>DZNmCcQiC?jgIkEN#Reoa;QYdLnN8|AeQ6z>#L?)S(Gx6fb(b=%!Je;ZH`yvC z>nrUZC7iICu*(7+5erDQX1^*ZpK7g^gzU%nXNtFvDz4dXdgc1iKYpCXt+@Y!pcoK` ze9JyE<2P{}EHLTklS5xk9jX9&3y#|Os09aLLPm~2|M!yvpFh<7-W?6UxhC<_72)SE zi~j7A__G(spT0Qt#Dz6K-k*JVU*@he(l>02U$icC>U?*#c8$WkM`^iAYrjkHecTv) z!4-eYpZOrx@JXWi^Hl5q#9O{hb^HxXblZHcWtdnD6z<~UUC3pazyOK#CEK{IXLF}t z#+`dDqI}sM+(l6AzMR{5CO3C8_5jy{Rfj8hZHCll3Oqys7sOdC@}kt47;vF51FSvD;I{cSeQ84j zVqMbeDFqu2ysop(0$$hq-V!C-<5dxrtm9Q`X4{fbI&f@_+M=!8hCSS= z7jk>AxG(>fTwYV}`T%D*?fhwz&Ldvu% zY;^QF?X6_GA)SJZCV3_bGZtUxks8^}P!`fDxzl_AZi>0Yu!|C;EV#~#uMuwW+Vh*@ zt9$(^%k-YW><(XPi@UVmQJOZ+oS#vhzM{^pC@P&?>`|g6hZWEpxH4nO$8D|NL@Ax~M7+SE)K%t!k`P z)WUFMmwz~4ljl?%H>58RfVJ>Fyr(^u4_*AKX`8NmFp9qJdpbLQ-Dq*_Xn7d)Xx2_h5HJk zGbY|3^$jQk=sV2+=z2QyJ5kkU)T$|3b#B1ps--S^ZL_KYr!+CPUTMC$DMW&+UK*c=FWlk zq>H#Ur*T7TQChr^&#~+Y;6I>DEeVn@pXlRs%1rX}!x@rL0nhUEzfaU1LdQyhIASI5SdJ17V#q zItTnJu-=p)W!elNCb-#E5aD7j1xbyFV`Lpff-_adUonNk=Tby7&La*e3t<=8aJ1yG zw7#`-{Ee=X?m%&uzZ5KagA>&F%;BW;tP|>bQYLko1q`@d;p&bmdg8`@m)t9zV5sEb zmQ9zyz{nM?mUCA|E?n!meRue=3u7-|8~fv($-g|D`s(Q#?&St#I(X+V8@R9PiN#RF z1kfSn0&rhQG(U^FO*T-m<75)>pz&axM5S}6s(^7A#(ev~Mz}W;|9&vwi2MeoS~U!E zYfnWe0XRT*^I5pFX3IG!w6>kkowA?Xc@etfJ(qK5Ud5dS%_b;&%*!;Ep+I6qNmZ1N--R*tx``F$aWmD^ z%aU4Sk3yG$q-aoO0b!=8G&)10N_`82T1A!dG9`3Afc0)HmnIDM4wuFc88bSGPbhyN zyTO2qyrx77eR_id@W$Lq0re z@h)j~*V$)v`%BurL~R>nRAwxy)1JO8>r(51*A980EmYN=GA^pI*Q#g0*|kok#9S%S z!qL@}C0XOFU8C_G^Ze(m3|z4(blcA8L;K>-U7q;u&8a`#ll~GW&p(~vUam*|_Hh&U zH$c3O%=-etrvvC05%d>O;0Co7XjcFWu$%q{b_&H!Kz|$e*ADI}k3I4SM}q5F%&pwc zE!&R0XRA)*)BAcxzjGjwf#JTcs=gXNX{YO-HDs-6Hq8={#&H+ zgJ|QgL$yzN(+{{4H(7!g>0G;X_RV_dDy3yesmuD~OLUGNJlb)BMKV@5W~O>pnQ3CN zrBdFZF}G;U?FOkG3^?%GtcyAPqqD1_M-h$&OH`>dGIaxds?gUt3`qnUNew<4Pv&C& zng{x@m`ez_1YQd|TmV{NG>AGI6@xP!%pT0}QVZpTS?pu^)GK;*9yV5^&c7j1YxSo=eF;$~~$Vx4=p z*1l0|JwfeQsx%TFwn`*g$t0I#qI^uLW^A!~MtMf1htztLOw$t6 z*Z^zbwZoWzuo|>?Np&3JEGT@G%Tkq!q{G*X$1LIje86a0ggAL>RA_>~7PT2~#wk-u zHk^uFV99w;olBYtycWzjg=U8#u>|-bX|!M zMcGM*JUk~R8>+W1NIB{>MW$+rNh;BnNdnTb)?$gLYW(hzWN*yjR9I`A-c#lVFIW{j ze-+>!zJ6Qmo;``j_NQOGCiC7M*)P7I`RWOnlGMokwvqd=h5HKxYZ(D_@Y+E3l_cjF zvcP2knk@$RGVZmA$Gj`rh$H&pbd^D|0vgJR@prz+WTKqCA6SIHbgR1Ab`0CFIRmjub>1 zLz%zE($4TXYnr3xqE>eiIPMltY1&jY5UXmBxIv1$RY{p6txBACLip14;ag5kK6Gy8 z=}S_tU7Pyg&g_>DWw|G^+zSodTQn8z^E&SD8SdX%!X4yXE5&Yo13^K4xRC*luS^<0e`Td z#3q$>DK)i52Q)eK3#0}c?zEZUP|hX@wW?KFnYyXCBA~OhhvUog&rW63rgRyl&ID2; z+&apr@cudwWx|ZEhc+s(L+y#(7*_MyQOuhi9A5*kG2p^R1z18KDfA%iS=qUy!y7kE zpA$q)USlpEh{7qxZf3(>%7jx9U0ADI)a>X_TL)c=pllLgZInrLWfD`dqzWy$_L4O% zDf4VyrQfbd+Z7p?+SlZFoj45T%j9_{M9*Ipx@t@8_MP#E&Q3ggS^C%4rQf|Z_Lm3K z+*6I*^NrlA4cwdc+OG4h={MI-Q2Bibc$R z==g;p{4K6o?SQqVXeci0j(bI3yOl||+PbpYG*V}t6E_Vw6>jN7I0VmFEm6;wC}&8j zCQIhk827Jgtan$cOH6h}4J;e3co+`Bs`c(!54DWFQcQajg5>X7*^*wDJP9eN$7 zL24y!2CS>Q;~vCXST1GKqqVMRGA)2zT2W)aQ|_xi9!{_Y-wkj}r%TGGNZNc==Ps`w zjLOvIE}*teSXOz)p$ygfJ)8PN=Ppm}Tah>yCW^0%UVC!#wwdj8R@WDo`7G{!Pk5!x=4N}%A?AFb+1 z5U+Wx!D}Z0Zin2lwAlzVk>*4U!yZ*wJ_+D9R7*6a68TI?$wWzqx8kz3EoqAauqJ8? zh|4oJdDf~(`Ssp`8s8ZUW9O|*p1&q_(b}5JH>9uLlD_`r^sT3)?%Y*#&lxrMoe{r( zPw3&ZLOK!L(09NZt zwPC(W+pp5LtF-lMb&XaX)2YLHRn)3iEuNZ-7-zI;beueljvNI zCrwOM!hy?^W`(MyWV)SmG?spk!c+r58xU)F0NGInH~4GBx{_h-HM`)15P;r8}$}ax3GCDFC;wTB0hI z=t?A|<0ZpU^(CvCjMZ*}o3NH=tO@`cgl?8rtxXlKad|sq-mZkVuf{V{=Ud$3U(+4j zIuzbDKXT5B*#5Qgi`Paj+Yq_-#MJfMGG{Gu2Tfsvv;lyoWr(V6LA5)kbHp^3n8uXU z8EbULtln5>G}fDp4JK0~UEx8!ku5+Ou_lz+6%07paD&Ak8nFfzN+eSV>nh1~rDVGH z`04iY>N=S!V{i^acX2>zCPpKj(*|b7nGJVZbqQz^MjMX2_L!V=oWaE+uLVXkQnSOa zg_>s0U-MEtUx!mElc9`PK9PdFCYO!8roI$DX@)kOIcuKUXvT%Dn%E+aF54pY>|Byr zKbQ!sd8`Mb(w2ZjFyM^T3Bo$%R3xo39~`5$0FJ&5YTB(*U)6Eu>M?p!=G9YB)2wT= zt?x!sM-k44UHAahIJ#^>is$4Rv*CP7Jiqplk2M0#SF!m78v1C$mwF3@fQwQn zq{hj5Gpwyr@3#5r^+U-J@j7EI?h01cx-5bY=dpGxQw(mnI^?0Quzqoau`R62n&kG< zv1Y)!Qev1bkxi2rN+jpZk9)Ks^xA|q@EWnkRm-Rihy&aJG=h$B*Wr@Yo8zvEBXrqx`|qGf-LUU|3^(O*Wk8wF?ke0J~E*d9*jCUtDhFiQ z!EuYEW)F;wMq>jkwB86e!y0UOgTQF=)Vu*l#0{2!&S7v3NhISXlBtqOD#n3E2-0IyZG(4SDHt}iO{n4NRn;YEP8z-uBk z%bT$rDS2(?vKgsk0Cz6tB83L{ighkZr(hyCvrvow<> zcA3N=l~hbb&$qh6<}(DDB^Nw3`D+CaG{7y;xsEtaSR>-dXrMOGnW&AtHp&_evc_h! zPBh~TalwW&GY)Wr-3G*Sqy`%faEk^U;WnT)BN1-#`iF{UJ0$oal^m}}peJiRkx`>} z1kMEUDvcQfB-03Mlw^oF0iE;LkR!F};#KN~lFBe*UGA~E`rM&K(62(IM)^$&oX?vH zDRHQ2BD)0xPJuQLcV11CvZE|VN@-H&sY!}s?L%d)H#jr5ds?CuNul66OUIxyP(BCBG+}=F=YyixoO60-d~F` z7w{UwF1s#D+6?@ALvgv!=(MqvXQbw@fNwoB-~co{04^ikXvV==GsJV2oIEueaGu&I%*+j7%o)~v z%*C)qYP@cWgSigTA+45)=njl zH5hY%+o4Q(wZ?&1#i~y4%C4}bWUR7CqAZadCy@kXQ&)6^QJ%4A3%xetOIHDFSsky< zP>Pd06SSEi%oyB_2C2YnL>VAP(3?y~SPW&n8cBp30d6wm%z)z+Nezr9QX{WJI-AKo zmw<-9N;#xZpyAWzACl=hv?oW3+|xjH=kIS0QJ;QH1Bgja3h((9l!!sk4|<9$4EKgprbIGhuBh z8cE5sPFKDGXL&P{WCE#4q&XP13GR$TF~3%~Wp37|oK`tgBAqFj0Mu4aUCMcwnsj;$|&ubzzN^#I>V8emeH9&2v zEZ7~c*fsM9#0ca-4 za?YB`Gs2o8FRm9{OQB2pU#M(a_S0k6g2Ixps8+6;BLO&wI37_aNlhTA*M z?%t@z!5eUhxe#IjXlBD%B85_C2PE;fG%n?;4(c1xH0Auc+Gol zt1QqJEGJkUUA(O*+W1+eDbG;hW+;NsP|#h|a5Frk>Ru98S5Pdu*F8Cd`m$&@l6 zwUy*I`fFr2%Zs8m17XG^esCfMn!}woRX}Y7e+~8Pdc@k=X>fN(@~|eLS+oV9Q~86( zni=qXQVW&q+};3<`)HAgm_MhlNzVU3xTdj(0Kz6B0Q`y zmsiIKXz%Ohtbwayyg=rm`h>Q78E!oQbeG6teGUEIv0={LFdaK)Tkivn(slvS$0&v z#`sz&UNg7_11@6CJ8Q&R5nk36T249~u{IYE#^iCcmDgtAtcllx%gzUy#au*cu=)hI zMdt5`ly4e}w#V#Xz@h#%nW)|DF1IT~dCrcp%tt%#K3Rj9fMV%`7=@z@cDGUb`k`l`m;Dt{YAjA2)IOc!>fk{}M^%^a=GI z1H+mToES~f79mcI#`qd5Ap8nb(IFOnU&lNr>^5UaxpfeCW4`@OhcumxfY0Z_& z8X`4#YLMTODyhSP8>l;iDr2pY0ZnFH&mL3K46V2D07N)M)&kIkwbQ2b$*4ITY&c{} zt=>U{xg)9ttofuF4>V&p`e?q+6+H-UfEWo*?B?Ye);>^;Bg$ev9OXB|no(P@;X-Q) zsWOC{f@`wgOov0Sf?F9~)Z$w|7)zR_cX&$x>;8x=Y#^*Lmx3WSmOn^}qbj4?hY(^T z+)SPkuR)>J0JZyLm0RW}8iNM-eacHDlgHvOxGPv~Q%0B+hb!4|^4eg-8Qgh{W^^Xd zd0z8%EQhsvEAXvAH-cpHnDOI4FzXzH3V9f;H*}p5 zshJrURT&v@OosFMaFS=J!x_-PYlq4wH&U+x*l^fw9T+xQyJA|5tPkcjxonc+OoWTP zrZg#{%wtW76dq{ak|Wks!WNR@1T?eWyvwH9vpEBfX;KkxmJ*M7RFS1^!ObJd81^8Q zKt8-bE(`1IBCn}YfniO&MmqD0>2OqNw20c+YzEX`+Gtukl$<_s{PYRfwE`ce%1JFD zJCRzDXFSRR*1RPbd5!XnH{epJb2SR2raBj&LLtzpxQUE5BCoN?#cVh}0B4Pe$FwHc z4UO*ut6ECNKAg&$fHm{ieAty2Ukm>F;M7^3vlfIIi?+~N zBei+B5o<8x9%XcSXJpH0O;kUv-CL4`KGLK-tP^_`SXP`VG={YhaPbhcunS`@K$%^E z+5P;qtHZ*k>)TZGB5@qC4K3p2tc9=( zv!e%vUC3ynIRhPd?NqzfrXJMcn#STXzr#P*V(*FTTtI3TU+4Ta1zcFoghUGFQt$!d zD*%nuhTxhqW`Z^obvQMVLUTBqTS%5%u-l@`7Sp6Giy~l6jvH*aM-^Sx6+UTxCaj+U zxs;T7)=*j*(NjJgYaa|{cmP1NjLJd022%69R)W7qQp18KQlK`Rd3{1}eDc_FC6gs` zh`}J%mQAT~St0l$1D<86QFPpbJmWnz>2Se}=iugf&8JfYZH77=xJ-2}fEXEVM8uKQ zxav)&gw{~0td(H64-5bNN@uI>;l)yYryo2uwig1I!Fn?T4v+IhIBGMtC~wBAao%e~ z%mrA(yxHQa7-C)Shy0t>-Yq0ZMO6mu=A$hNyLhZwE=9Of1%wnhWmK3dqw7H~`(S@f zQMQmv5#28cPyz7>t}ZQXQwT*=BAY)hBaU6;*(}r&BT~G&w%5n zya8uko52nB4vX9e)IM=;B5a0op~P5$DN|UTp=z@{1}O83@mj#zj41PcDMHMZ%cY3C zrr?@IUI=s!Ym*VcrA7s$c0DaH<0h4FDxdu>rCgcBWN(KCV1*(=ZNrFitsug4QXHdf z3a*912Q?P*(U!n#r&9%3cO%wV#rAn(i*5E!0c(_JY~>fGpua2F6j&(H%3xD3tNlf!>yPawVOp@Mh{p6 zQl1Fsc`YPJSw39sL88J3;7+Ox%{cjJc13>;a0Ac`Yj~X287ox{k}=?>;R92nMI{P* zaG}i5ReqgQ$dRHM7p=F8QJb_G;Vbf*54d<6PHkounGagc zHxEUe|VrRc01! zI4{fqZdk-?li8vPPA!IAc<=$~vNHIe!P;za&yy=+&>zltjb{7^yhcxr{#qVprZk&fJ+R!ShR(ia3LSg z*SRpb=5=@uZa|rDK;qdgx@@%JVu-z{J#y;OhNy8ytG761E}CDX2^l?vHPt>K;L4>* zbIzKKIjenu87HijyuW6hW_Ecd-P`^3;4M60y5RZ-nvh0;$oP6qhROp~X^Tw+~}#+Tg>0 z&J*ETJ@Hy^W05uTT5lI58RIox!CAxAuL~+IJut!!c4R}2)aIXOwX}#;kDLuhK`tgp zMPbI$DU=T|76<8lBufwS+1+ivkoQZI> z-nbBMkYsc0@eIKa7qAv=I8d8kBEb=5TByTmf$3&37Y#SVfD0L&mq-zV zYbMWdqrHGNI%`3pq4ma?i`QnD2?x*_*8O$9_5I;mdr`9+Vy;HRNP*hK zZs=9OK2jZ%;*8X+{J{#E`SJ{1Hu>uelDdfkYWNdFPd%epY7H)w8@s_%^FU+gFko#v z*o=b?XD*xNQpD65(3!1V_ROyj8eOBsRq;wi7LFJItS#nxz?z1K^Ew>OI19L__Q8i; zd1jmB8nMRUOP(HEo3$aK0%u`0@3NUCM>8JK2dwUeWw5^&~%o(W+WnsLG!faco^(O<`h>cX4mCZWRB<}0st%v#swj9Ehm z)ilwV6Uszq>>0*BQc;AH%SK@)AddZnuzioPRv@)U64Fh>khiIX_FUMw4b+BAT7Oby zlBaX6Db$oA@LJGj5O86F6mz6P6DdH63@+ecxCFV%MU;8y)t);KDDp93uD1!z? z->}(Kj}YsL)VcVYfaY_gxtNQ2>YNQ{xfC+s2s*m#e7I?r9mZT($^>W4QsQL8`S@CZ zTTF&i_Dm>s^`!$FM`9UUNxQ!yW1k6Cs<0^_^cFHkBhYz_W)%>zT>(Y7m^4FP%gKP_ zZcTt2+RQRphhklqeO_yD9Q1;K*CuK^6f>e04|;8M*4S9c6ga{yP#dLqetb>xj78S0 zHHBr&cpFaI3`kvTG*&5D^9g{gg#V_`sBnaq$c?>7Y6JF%)8bVbQd`hwf~Uq3HegLj zGcw?Z23&j_l3(MN8#`eJX|)piNE7zpT(h}Oz*@j({)Gy86q}I< zXvm_F8Rw~;A76u;&JxgkaE&^gtarXJGG-$IrgAvX+mPn|QDpA0X zn^9ct3?r%iN&~it3)_71wHeEp3D?0c$uFXjT>M>Z&iR zirYLR7Gnyv8QSn1)>!Srq#5Hi+v6h$GX$N_rBFtN_t%s+Lmhq)(7Y69jS6VY^9^{; zWn;U7P}UTBhJoEZi2&$i$d0!8$`U3RR;do^0!*8Um1{EKg3AV!aRJaQxaP0muk$Q9 zVU3QPZw?2qJqpwwf%yg%z-ee%fh(*!kK8QF3f7zFHK{TYXforFBNgLoUXQVsGbYK{ z6@(d(+BJLM3ga|f;m#W^6~W%{52-fSir^nHKoqf0J@;V(T0=Drm#y4 zu?3*PhEoHQSkT0d1-=5(74xkhj-d?)UYlkvsy9F!0XCe;Gk}{HW~9JbQwo`G6yYS& z7}jFa3`{pY7O4$;a;ZhU)+Jxl;ec2h_F71%Ns1u7g2k`t0iB0jHt(-lE(Hv@sKY7d z60{j0&cZHAkdp5f;D$ts(NLv~OU8mOfDddwnKrB17ML$L&LR0Ncxpy%1~KJQ^2;9p zG3OomQKGqCqLYb%y2Aryy zVvdwjC;&7|rwG~%d%}geg+dkuK+of~Smz>PhB_P#I07x?!&^f>s8G~csv2GLn6Z4M z#um_pk=G=@A$ta-rkZA6uY!m&nDJaXg+WYMi$L?d#_a%*MgwZEAB?ya<+!zmI=?24 zlQf~%rfs<>#l01i9`4`W9uBrZW{xT_Fv8rFw%U(0cUf0WBv8rCuO5e@D;pmS~vt`eB+6r8A zd{wL3Z1dZLpv2|VB-4r70bS8rmjPa3hi^cTXN=S=X@=Si)HvJs0nS?7WlvZG(4sIi z>P^k##?p(Dr!Fedxx-5o#$K-iVruA7LF;|p{tFBFMIC<6laKxwBQNsTfHEzYU+Xg1 z`eFYy=EJ3M3fllE+oym0)5E|0>z?`Iv(GcO_=5-T`??#x_4C(U`PtF2JEpH%Wp5OS zGP`Y+Su>JSoIF1rHpn5?hFyN}F=_nR1xe$q^9=Mk3ar)zrDAA`-bSOQJc|zuAs(cun&|} z!GKDPxg5Tchz{(=JB9yydl^Bl%RSn&!4+v@5Y5|j`*ejboDh1CCJ7Xt~S(&81^-Fbv{fS!cwfde=4S9oyPy7Rz|2dzD)JT|B8 z)g!K6dLFLduv+N`xVFAJ*!=8Ck(K<4t~?2r_~|!2=m@A*cRE(~C61GfnL0)?l>*`h zPo-BMVdW1ZwcxLj-MOA&GUkFMCxvFRG>x4|4Q&!6^{is0GrU-C>hXZ5CQ^6#0`I-^ z`$K-o-{RAIZ@!J$a8ZZD0X-(~+){bEO4V3aoe25*?!D#C!e9Bfuf2XyIt7bdv?n*0 z49{;@z*rk%YTEsQ+xHG>FBH-#m>6f3YkyvF4RtQI;1o7t(GgvIO;hYQV?D!EyvBYr zOqvPZ!myd^kn)F+AQeho{1^>3OoQeszyT9ODf!mXbjS$1FeEdn_ElLgin|EFA;Mo zQ0iifZM47svg;1N|L|uZlxvA}vIZoUH@oJN>kq%}@MkXAdl{9wc&wj)?uEneIo4<9 zwYgVyI2W`A0OuLwK%OC54Q`oR7tOQeybh;a3e8nu@pT^7HcR92Q=r2iK0tntnLMS$ z>={;>d)!J3^(~m@)z*LZ$tTD9_KtY}hws0C-j3a{_R;mc9jEU-X~*UhPT6w8)@^IH z?O3;M&(>Xk`ryMOe(w>V+<*GM&5PF^{-pyq+fAWJL9P4}g&hB3`vf}b{FFyRoefa(d zDRW$8v@nk}xME=W;Wr=gndO741*|bm3hNlL<}G>F-~GkspC9o@6#gWj_kw8qDe)${4~8jfE_}rrtuaSAn|Dpzwj!F1x*HCY*?eACNpbPBM0k!qB9( z4ZD^`Gvow@BYqaU-m~2{_u!DcgwQPlo%IFT~O}`-f`XSN4)uvCx89&YkmzS z!-Y&ZG$0j-^?qi<`3e`7tsj5%sY71>TYP%s)t4-3(Dv6@j+;0h662M$709EW*SYcKp4+|9T6 zrxo%ozkBm-sDr@uh&Mlc-$REKG-Iat2Y-D3h&LbdcS#O;aG#e27JXL z7d$?B-5H0x{*1rk&jP;$UVA~aV@;QHDV*VQI*O(*Kk;~@y0(iac zMHL?S7TRVzWy;hNS8$Qa+V4P5jV0^`3@1zeZM2!N?}Hro>V^M>OccDs>#n$PK}NlGZbDg63Mo_A z4Fn${Q^{~PCK_;l_AJHMkQYrGjCwnagN6^-{i%lk=`3~jz>;cB4Fh^{QxiA{@t^;H z^Fe2{3F7Oczqif=oK%b{l#^E#^xJ;=@n=}KFyAFkJ;UFM*Srp=2Bef%SNp*qKREhZ zE##}MhQE=)aAvHRFP5fOH($b zE#hWo9C$6x4^Qij73u^54GLTe4>ZP%$+r+rBCa=L-@>-Vi;wcN{*Qd=@rNI)btJy= z&Aj%~t3c{HcP%jD8*l#o+wX)8iG#34H4gq7cXbsQa|zmvq&OIGej`9?e(&mUd;^8t z@X5y?&uz4=?{@Xox&b>?kz^vp+8sfuNuC0224zjYer?vn5tfstqi$z|2d7LevIiF_ zEpwboGXULUv;XFmR|@%||9|hf`hv@s^)4vnJ`Ngfj>E%o0|?vt z0Z}$D&kDzy#a#T%D*&yQlqS&1>x}Z+wvb|DkEbW=0tB_CxWx}X`eQn?B8~ZQ z!rE(1Pb+3qZlGu~b<&g~yMG>$8e(c=e<<{)_Y2B4eB-a~fBS|x>2^q@Jof!>_QH@q zDdbP$!8;$sIv4KKBt}zYO?{+jz>g7YI@krRH!d1@g;@90FD&ravUBTs3}s;y5(16g z!fZT_yw0w6&ChB!4o1sn&zK?%%d%9@Xz~Xz<}&GOjRu{w7ykk<>4LRynJ#ScE#N)1 z(RkN&*B1C@{*&AO^uY&I{x}`4r<{&!2VVdDr#}_=vXJhM>->QAnz=`duM2!NcH81P z%gJY`C}u`{fs2E#zH2`{XZZmK{49fCgv~sfB$X zbw*ijTTs5f$K4XM1CDw)X&hmd%x|!mWEtRf(4L-I?x5#juTaT^HXg*#S3}amw)wgKtsC# z*j7#2^ubGU+V=rwyg;leA5H-m^VB55k=nHN*`2;Kl|e! z7x*^*^V{Y%c48|jztaZ?EG%f5Q~1kXcgfW_JB44n1zEOd-E7XVkzwSL8^8CI%R|p224aNbu$&BMZOoMZxyK&h;@BB@nS(lWF;>~FpP`XN8-fAv#n zJQH~BOyZP6*A?d+Lrs6EuA7Dy@_TY`{oYOg$-BMbiW_0KChx3iXD$LQE_B)7LYpDb z%xg0d&Ug)ud&lOp3VgRcjmrcPj&QTxJ-96wcjjVCAyB(3EZflIjnarqhg33dEbif* zUFj#Rf$AmW#*H`GJ9V~Un;c?l!xek}3q`jA-#@$U-kWb1v1ZhM@Q%9+d<95rC-i}Q ztOx6Q3jE$9-qxGxgI!%H!iBIpXTZgnOC7uaz=KEp_Cub$`IR5&yur7f6aE|!T}IZ z{^%IC1?B&sCw}wiA zOTqQ<1CQmuhp&4KNfn#29^ocSF8XVLnDLrXyE`IZ-|Y=Jsjg8f8Bb|6N|a3hZ_}b9be$FQ z<~J_h#5^_cuQ9kLxLK4ZR#8+8ISV2LTa`J7Ryx4pv)Q8?GD>_?5_cZ z&R~j#T}i#GCt6nsF6^G&n@-`UA+ZTLw9!6c2)*^&Hw%9ecIVq~ydBZUf&!xjUh`NB z*-^};JojWlf{MNDqd)iwd1`)^9hh!hWXS<&m=zx|H5RBRZ@uBZJYMH=DFUw{hlXCe zJ0jcM7YMr$UlZiN$4ez+i^qxFwSVq-MOfal3GQJ7KpQCGUqK#9FR zBsrm_5QvPC7fYS7>>0uh{o%Oz`oPWKP>p3T_2K&;x^>L}HwZJZlE@=x)7&oyPH))vw^wKho&A(WxYOFW#q^7|*Sl;?B<7@bboUv(};ICb0pM2UO zD16+iTC9HSwBkINJ+=1{_8B<>y`X zb?@ivo#UnAVW>$FRqefOO|M~T<`;nytSI+)kkFznD+ zSGJhuwfM%2#dIl*gSPq?%G6D@daYo<587*g*R|h8KAiode)PZ(5NopGk3anA*ZoTm zdH&8DZaV~PHcSHtXlVRDeyAXQ%U<*8pFG7#O{0*)Q1!_7*O(6{VYXuUTW$g!Y*|WX zoK--CZ9bSz;kWr*b6G*-BR>7))1a*rGU5CzJ0{GC+JYH}-qCsk#M)6vqxl^=1(Mp* zhNKofHBg)Shl$!aNuxjf-PO5XfB97myC_Zi=Ig&b1knl}q5vk~HC!x3xP4gh0@mNuK_HG3+gE}KAVsDm(G1HSM8u53YB^Wt5F zy3QlMtHPgzdU4k51GsB#!9r?|?3I^vkLL55nQ<0n-+oO&G|7L5_up~9Fy9P^Us1G$ zfi~nw8L3l_Lc{9(mt~JB(5}N!i{HDKv*e)7z@Edb!q;Cd=#TuTk3EZ63$tg@fFrN- z$6jGuxIvofh)CDZ2{?oEbv78h0P-7~7ING7Xve((x2g3z>`NJ`Z38ntuc`a+U(^ww zf&Fw@dlc}c_?oYMuzi}1o=kylqWP~3e{XHE4kC4!N|^{Wt7)RYRz-JiK0W{bV|~1F z*(roIZ^i{-RznX^jbCtPp{lPYFo*?BEPwFB!vzD*lBGm#S%XV!UQlOnhL=fI4Rr?a z)T~il*s95oRsd?#z8;ft`*+oEwq?;u!20B6YYY4xzWU3LLFB3%g)wVRK?`fiJjs=Oq|+ zk+TL~BdN)lvvdlOnxA=9oox$MX{`NbIZTD7je9v8&JfSpaMm;Y-Sm;}-*qNned(En z!gSwlcd>DHEE&$=2CS2&@Yn71`NrQQ6uD{~wE+z=nvoh%rgnwy%)rsV9d>iP|K8Es zc)&M7pw0SHSkjE7I5XhLYZxB>vuA#J^q<1M`oi;%(=gdag)ql;Vgr23%KO@C~~m9)IMC2k!cYO|0kax|pzrPz&3T$W05p z#-vJS_qOwo_^u9rvNf}q&!w<4Aab+p*tT5U@d3?d`sx~!(vEJLIcxOMqCCrKGw|BT zYcS>}(;ZiR!@u7dJp1?)(3J9g!JF$>_AerQ^E|ZKxcl@fXbAw7xHX}zpKNax%j;61gx>F ziPoDUFDAt?uR=|vu%9cd*YH>q&^Qf=54eQcvjDUx$c?7&U_aL%-~9um&R_%n;s359 zKGWbz2*XH4YWo*=&pYDH$MochC!CD&HOr-tr(QYo%_^e5X+c}!o71O5?aLUWMFYo+kD`A|NPNMNB=3m`uVQ}UX!y{MejfG zz|p_uy?5X9YH;c-n1!R?dDGQ*2w@lI&4|=OVjRzQ$!u9wsM;U;f6ZO}ZqCrIx%rqJ?vY_jXPKRGh z_JdQSak{zb4`$h)u@Gb%;jfV$Rhl%e!Duz^ML@n{Q}?3xUqALh+c~0tcA^;YXXdHal;*Gvn~fuIb(IzostQS6@7Vsk0c8^TN@W=f)Zv?SWvO z8J-PZwE4f^w>lhu?(j>%8bP?OCbjll=s~WIx|NUJrT=8sJ(_d?V z2K%p5v&o(sSEH;1T9|QXR0y=N#&iYDy!wI6OWA$f9R!*>KB4z9ysFilg!^{wL;K$6 zpEUn5e=>Zl;J*B$Q_b7zje}dH{xEdi>Si~Dqsj80WS%!We{r9%u9F%ldnpvJbbO?^ zM^e*YGZSu0E*q}RH9fUSjVmURF5n!b`FzaHKN=RDfpw62eBW5(3nJAv(zhP%d(TWh z-T3hDpM3#X-+XOzxb^ABpLxXDrI>ZLWZmD}Rroi)fi@4k^5W}^#!2l8Zuo1uY)kpr zUjtumyEFtzHay_Y@SD7r=?1SsYGSQfcE_fs+Psa$d*+{CekH*s^O|rEEo;>U@WH$9 zyZ?Io4b9F7K6?G?O;0`2yxDy2$zzmO)RcJK965As@jm-$uME#Vu<}OwYizi*=W=)! z{#sreAsPL3z zLyv;gSc6?_|MB^kjsIlo;X{qvYP`tZ+xPUrSue#R;&*TRP2(#s-~)ShJ(%G)sLkD$ zoi+E@ip{vW7O6Sy3e$!&OrM;JX66#=Xt>#+BXkpEKO}DbDo3o*lc4vT`Z?w{2|I5QN_O z%Tm-HmV8?aGk&HwQ2+jWZ@*7xtsvZH9Fi^{{^hUrXBPFIO}l-!6lzBnMb;ZRQukkb z?3DsXbIW2(yI&vHdm1 zXbg4@wlU+4uRJ+E1+1~*qRY0|UUKCV6U|<}@s-;@uz&QCa?a%-yu@a3+%n*#vt70j z_aRpTErCS=EozI`MwwSh156)3-v0e8)RP#ELIW<5TzKlu1J|~!A>6z3*95wY{#we{ zYmPjz07X_?Z@gVWxP}ZT);oT>Fe5Tr{?R@>^|w;1V64q<_-kMtftk;_G6=Wzu536A zxR*#Bj8=FCVHd2e^U(Wf`6*^T_UAX=OlM8RA0IzB^O>37fmdDMdrie_!M$V4j+sxM z)py{~2fD6;0p~KWbw#g7%m0CA_3P$%cw}gM#^G^z?NA(Wmms{HaKVPF(hOI*=>Qsb zn`;BE%U8;VQx`xwK2&%)XC0q8-uB!-divlLGvU%V%%+Hb!8*WAzhr|8ihl(SB_ zp~bd#kaLF5x+t{%>rNhjqi-p6Y?&Q}0XM-du=v&=TODE4Uu{136XS<-x1~5-jF!I+ zeJ%nGQYWt!m?>$d7HokYSSu={%dP=U#Lrou>zqH==pFY4uerCuFPzKoz zQd*H_9MSmELq}V_!mN*t{dOD^;{`FZC|-)tt~@X{%f#bZUt~eP`PnC5B(Hgz>1`MH zT%HxL@SFac$C_mcYf+m)IO*)=sLWVHnTtScSyGeA*OFG$RnqpUrwL7DOJGYX7h;;y zPUUr3Z(Z-hJw7N`K;N#BNLZaHmO?4_8&8TDmB7P9;r?sA^Dr zC@n^878;AGlS@J55Z!Z+Pe;M9`#w~1=H_cP1wa=7&AACQNv(8Br3+BBQ`LU@=5gtE3szq(U6WABLOt;VKa)))Ih7#q*5ABRr!er!2C%0P-4@;VMdr zI#Sf7u#_}Fx6ERNbw8c8mUmtR9qNkfE?H{0+1;a-E)@*3&4(2!S}0T~H$3D5zPwUt z5!$H*WluoD6>xiohK4G*-i+7ST#L>dR>*+EU&DrTmYpk7m{DPllzT2NZ?0=D8>BY7 zb90?oGd810F0lrwp@!@miC-tsf;;pyLpwDUa)q^Z_o&a6aHF3K_a=4lT1uLsrztL5 zI5k{$Is4F27wb~60_f^yORfeQ` zBvM-nsuk7&cg=>E-aXX}M?SoE{J|icK#SMPkpf&LOAD`wHA6CI!g+)06!~ji5u1%L zJfo7Pg0xBy8Q(G1M7h&nr`9Nad^&76P^R*AMQUK}oizzAxbday z!vknJZt(hYb$<|LId18FSj0!N$n@7%L)O)T$f19oHoVfck9jHXwKt=26{&f(*XAKt z@!Ay0E&f^toW+D%0-Y$kY&c3&Ty-W-EfF7x+NUL_R4$gSH>k~Cdo3Ps`H)M6g|(wD zB}kPz1L%U7+0jmCjp`KoYY|*ENCj)73`-vSYq)FyEkR@&b73t~_Y_@wh}vsqY{q!3 zIBOa3Wrft)XfFd!GhPK|;5A~iblKLww(_+zDqZ~qI{L3`n#j^@qV+bTBSBi^&M5gHk`GEj>_b( z&xZ{Ul!Y}(ouiP{xEDv6bk^iGZFnh0$}>%AB71*bd1`OFw8gGdyULpZYnky8*>I6M z;&55-u;F3AsdbL!@XY>Nq^1h?#aN2XdVzad@9@`l+>XtzVqiwZPqX1-w1V(VozZ2B z&grrhij&UixG8>3Qs?Hn+H+B#OZwOD(3~l4uVyasIs-GXdp4|f&J}K&&KmgoN}wH^ z6>3+p83Qv-(qIq{V-A0frT{Qn1{_%P##jftIY2`P)(pvfa_vTd2*u&4b=qYEUd4O;>#u`}^+{ltUi=yzX?7S3>i`R77?AlZB9_FP~wS@#dYlcN?AZ}-^ gfSl2IVr?@X)CS5`F93L5F*=J<6pC9r^}O@`4{(~RS^xk5 literal 0 HcmV?d00001 From d492b546873cf633f4a39faa1da9d35c6d1b11a7 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Mon, 14 Mar 2016 01:42:14 +0100 Subject: [PATCH 57/61] Added executable icon to CMakeLists --- resources/TacticalZ.rc | Bin 0 -> 82 bytes src/Game/CMakeLists.txt | 1 + 2 files changed, 1 insertion(+) create mode 100755 resources/TacticalZ.rc diff --git a/resources/TacticalZ.rc b/resources/TacticalZ.rc new file mode 100755 index 0000000000000000000000000000000000000000..640a949021933c6ccaa31a307e259bab57ee1c13 GIT binary patch literal 82 zcmezW&y&H0!IL2#h@Bby8T=Rw85H1b1qLMsJs^w$!Xk!LhGK?%hEgCa8O#QWIx Date: Mon, 14 Mar 2016 01:53:20 +0100 Subject: [PATCH 58/61] Executable name updated to "Axyz" --- resources/Setup/Inno Setup Script.iss | 4 ++-- src/Game/CMakeLists.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/Setup/Inno Setup Script.iss b/resources/Setup/Inno Setup Script.iss index bc894f6f..d271967d 100755 --- a/resources/Setup/Inno Setup Script.iss +++ b/resources/Setup/Inno Setup Script.iss @@ -4,7 +4,7 @@ #define MyAppName "Axyz" #define MyAppVersion "1.0" #define MyAppURL "https://github.com/teamfisk/TacticalZ" -#define MyAppExeName "TacticalZ.exe" +#define MyAppExeName "Axyz.exe" [Setup] ; NOTE: The value of AppId uniquely identifies this application. @@ -57,7 +57,7 @@ Source: "..\..\bin\glfw3.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\..\bin\imgui.ini"; DestDir: "{app}"; Flags: ignoreversion Source: "..\..\bin\Input.ini"; DestDir: "{app}"; Flags: ignoreversion Source: "..\..\bin\libpng16.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\..\bin\TacticalZ.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\bin\Axyz.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "..\..\bin\xerces-c_3_1.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\..\bin\zlib.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\..\deps\redist\VC_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall diff --git a/src/Game/CMakeLists.txt b/src/Game/CMakeLists.txt index 9dc67a78..a9aa829f 100644 --- a/src/Game/CMakeLists.txt +++ b/src/Game/CMakeLists.txt @@ -53,11 +53,11 @@ target_link_libraries(Game ${LIBRARIES} ) -add_executable(TacticalZ +add_executable(Axyz main.cpp ${CMAKE_SOURCE_DIR}/resources/TacticalZ.rc ) -target_link_libraries(TacticalZ +target_link_libraries(Axyz Game ${LIBRARIES} ) From 0b485163c94a783f33690e81dcf42f9d49cb05ad Mon Sep 17 00:00:00 2001 From: Tleety Date: Mon, 14 Mar 2016 01:59:33 +0100 Subject: [PATCH 59/61] Changes to menu --- .../Schema/Entities/Resolution_Options.xml | 28 +- resources/Schema/Entities/StartMenu.xml | 8042 ++++++++--------- 2 files changed, 4035 insertions(+), 4035 deletions(-) diff --git a/resources/Schema/Entities/Resolution_Options.xml b/resources/Schema/Entities/Resolution_Options.xml index 3aaa32e5..cdebfc55 100644 --- a/resources/Schema/Entities/Resolution_Options.xml +++ b/resources/Schema/Entities/Resolution_Options.xml @@ -18,8 +18,8 @@ - - + + @@ -40,8 +40,8 @@ - - + + @@ -56,8 +56,8 @@ - - + + @@ -80,8 +80,8 @@ - - + + @@ -96,8 +96,8 @@ - - + + @@ -120,8 +120,8 @@ - - + + @@ -136,8 +136,8 @@ - - + + diff --git a/resources/Schema/Entities/StartMenu.xml b/resources/Schema/Entities/StartMenu.xml index ae7744aa..2bcd7118 100644 --- a/resources/Schema/Entities/StartMenu.xml +++ b/resources/Schema/Entities/StartMenu.xml @@ -22,7 +22,7 @@ - 1.1666849700106923 + 5.9332086658013736 @@ -54,7 +54,8 @@ - Models/Props/Walls/SciFiWallMedium.mesh + Models/Props/Walls/SciFiWallBig.mesh + true @@ -64,8 +65,7 @@ - Models/Props/Walls/SciFiWallBig.mesh - true + Models/Props/Walls/SciFiWallMedium.mesh @@ -697,6 +697,18 @@ + + + + + Models/Highgrounds/Hg7.mesh + + + + + + + @@ -758,18 +770,6 @@ - - - - - Models/Highgrounds/Hg7.mesh - - - - - - - @@ -1787,6 +1787,402 @@ + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + @@ -2062,6 +2458,66 @@ + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + @@ -2965,7 +3421,7 @@ - + @@ -3007,7 +3463,7 @@ - + @@ -3049,7 +3505,7 @@ - + @@ -3091,7 +3547,7 @@ - + @@ -3133,7 +3589,7 @@ - + @@ -3175,7 +3631,7 @@ - + @@ -3217,7 +3673,7 @@ - + @@ -3235,6 +3691,21 @@ + + + + + 6 + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + @@ -3302,21 +3773,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar1Blue.mesh - - - - - - - - - @@ -3324,6 +3780,19 @@ + + + + + Models/Props/Flora/SpecialRoot.mesh + + + + + + + + @@ -3352,19 +3821,6 @@ - - - - - Models/Props/Flora/SpecialRoot.mesh - - - - - - - - @@ -3381,403 +3837,7 @@ - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - + @@ -3789,12 +3849,684 @@ Models/Props/Stones/AssaultHolder.mesh - - + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + + + @@ -3835,9 +4567,1073 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + - + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + @@ -3883,11 +5679,24 @@ - + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + @@ -3895,524 +5704,70 @@ Models/Props/Pillars/StonePillar.mesh - + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + - - - - - - - - - - - - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar1Blue.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar1Red.mesh - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar1Red.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar3Red.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar3Red.mesh - - - - - - - - - - - - - - - - @@ -4475,11 +5830,217 @@ + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + + + 4 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 3 + + + + + + + + + + + + 2 + + + + + + + + + + + + 2 + 1 + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 4 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + @@ -4545,21 +6106,6 @@ - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -4603,75 +6149,6 @@ - - - - - 4 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - - - - - - - - - - - - 3 - - - - - - - - - - - - 2 - 1 - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -4687,22 +6164,6 @@ - - - - - 4 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - @@ -4718,21 +6179,6 @@ - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -4747,21 +6193,6 @@ - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -4777,19 +6208,6 @@ - - - - - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - @@ -4809,6 +6227,45 @@ + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiBridgePillar1.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + @@ -4849,19 +6306,6 @@ - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - @@ -4875,19 +6319,6 @@ - - - - - Models/Props/Pillars/SciFiBridgePillar1.mesh - - - - - - - - @@ -4901,19 +6332,6 @@ - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - @@ -5077,95 +6495,6 @@ - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar1Red.mesh - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - @@ -5181,1625 +6510,107 @@ - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + @@ -6840,20 +6651,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -6893,20 +6690,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -6946,20 +6729,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -6999,20 +6768,6 @@ - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - @@ -7053,19 +6808,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - @@ -7107,19 +6849,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - @@ -7160,20 +6889,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -7218,7 +6933,7 @@ - + @@ -7227,12 +6942,11 @@ - Models/Props/Walls/SpecialWall1.mesh + Models/Props/SciFiHolder1.mesh - - - + + @@ -7241,12 +6955,11 @@ - Models/Props/Walls/SpecialWall1.mesh + Models/Props/SciFiHolder1.mesh - - - + + @@ -7255,26 +6968,37 @@ - Models/Props/Walls/SpecialWall1.mesh + Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - + - + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + @@ -7283,871 +7007,279 @@ - + - + - + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - + - + - + + + Models/Props/Stones/AssaultHolder.mesh + + + + + - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - + - + - + + + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/smallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - + - + - + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - + - + - + + + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - + + + + + + + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + @@ -8161,6 +7293,49 @@ + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + @@ -8204,21 +7379,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - @@ -8262,20 +7422,6 @@ - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - @@ -8320,20 +7466,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - @@ -8366,6 +7498,874 @@ + + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/smallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + @@ -8373,6 +8373,17 @@ + + + + 10 + + + + + + + @@ -8407,17 +8418,6 @@ - - - - 10 - - - - - - - @@ -8472,6 +8472,19 @@ + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + @@ -8511,19 +8524,6 @@ - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - @@ -8546,6 +8546,16 @@ + + + + + Models/Core/UnitCube.mesh + + + + + @@ -8570,16 +8580,6 @@ - - - - - Models/Core/UnitCube.mesh - - - - - @@ -8804,7 +8804,7 @@ - + @@ -8816,7 +8816,7 @@ - + @@ -8842,8 +8842,8 @@ true - - + + @@ -8872,12 +8872,14 @@ - + - + + + - + @@ -8888,21 +8890,48 @@ true - - Play - 1 - + + + + Quit + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + @@ -8919,39 +8948,8 @@ - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - - - - - - Play - Fonts/DroidSans.ttf,64 - - - - - - - - - - - @@ -9034,6 +9032,88 @@ + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + Play + 1 + + + + + + + + + + + Play + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + @@ -9118,86 +9198,6 @@ - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/White.png - true - - - - - - - - - - - - Quit - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - - - - - - - @@ -9207,19 +9207,19 @@ - + - Schema/Entities/ServerList.xml + Schema/Entities/OptionMenu.xml - + - Schema/Entities/OptionMenu.xml + Schema/Entities/ServerList.xml From eb2e79e4cb672ae416f3124a01d1dd0e7e43d97a Mon Sep 17 00:00:00 2001 From: Teejoon Date: Mon, 14 Mar 2016 02:15:56 +0100 Subject: [PATCH 60/61] Players now got lights on them --- .../Schema/Entities/PlayerAssaultBlue.xml | 265 ++++++++++++- .../Schema/Entities/PlayerDefenderBlue.xml | 354 ++++++++++++++++-- 2 files changed, 564 insertions(+), 55 deletions(-) diff --git a/resources/Schema/Entities/PlayerAssaultBlue.xml b/resources/Schema/Entities/PlayerAssaultBlue.xml index 76f1718c..abe21a01 100644 --- a/resources/Schema/Entities/PlayerAssaultBlue.xml +++ b/resources/Schema/Entities/PlayerAssaultBlue.xml @@ -572,6 +572,7 @@ + 2.5 Models/Characters/Assault/AssaultBlue.mesh @@ -586,8 +587,8 @@ Schema/Entities/WeaponAssaultBlueWorld.xml - - + + AssaultWeapon @@ -607,8 +608,8 @@ Schema/Entities/SidearmWeaponBlueWorld.xml - - + + SidearmWeapon @@ -675,7 +676,7 @@ CrouchStrafeLeftF - + true @@ -686,7 +687,7 @@ CrouchStrafeRightF - + true @@ -699,7 +700,7 @@ CrouchWalkF - + true @@ -712,7 +713,7 @@ CrouchF - + true @@ -755,7 +756,7 @@ WalkF - + true @@ -766,7 +767,7 @@ RunF - + 2 true @@ -790,7 +791,7 @@ StrafeLeftF - + 2 true @@ -802,7 +803,7 @@ StrafeRightF - + 2 true @@ -818,7 +819,7 @@ IdleF - + true @@ -907,10 +908,10 @@ - + - DashRightF + DashLeftF 1.7999999523162842 false @@ -919,10 +920,10 @@ - + - DashLeftF + DashRightF 1.7999999523162842 false @@ -944,7 +945,7 @@ AssaultWeapon SidearmWeapon - 1 + 0 true @@ -1005,7 +1006,7 @@ IdleAssaultRifleU - + true true @@ -1108,6 +1109,232 @@ + + + + + + + + + L_Elbow + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + + R_Elbow + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + + Head + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + + L_Leg_Top + + + + + 0.10000000149011612 + + + + + + + + + + + + R_Leg_Top + + + + + 0.10000000149011612 + + + + + + + + + + + + L_Leg_Bottomdw + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + + R_Leg_Bottom + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index dd8992be..12e136d1 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -579,6 +579,7 @@ + 2.5 Models/Characters/Defender/DefenderBlue.mesh @@ -593,7 +594,7 @@ Schema/Entities/WeaponDefenderBlueWorld.xml - + @@ -614,7 +615,7 @@ Schema/Entities/SidearmWeaponBlueWorld.xml - + @@ -888,6 +889,40 @@ + + + + Fire + Reload + 0 + + + + + + + + ShootgunReloadU + + 0.5 + + + + + + + + + ShootRifleU + + false + + + + + + + @@ -923,40 +958,6 @@ - - - - Fire - Reload - 0 - - - - - - - - ShootgunReloadU - - 0.5 - - - - - - - - - ShootRifleU - - false - - - - - - - @@ -1064,6 +1065,287 @@ + + + + + + + + + Head + + + + + + + + + + + + 0.5 + 0.20000000298023224 + + + + + + + + + + + + 0.5 + 0.20000000298023224 + + + + + + + + + + + + 0.20000000298023224 + + + + + + + + + + + + + L_Shoulder_Armor_Joint + + + + + + + + + + + + 0.20000000298023224 + + + + + + + + + + + + + R_Shoulder_Armor_Joint + + + + + + + + + + + + 0.20000000298023224 + + + + + + + + + + + + + L_Elbow + + + + + + + + + + + + 0.20000000298023224 + + + + + + + + + + + + 0.20000000298023224 + + + + + + + + + + + + + R_Elbow + + + + + + + + + + + + 0.20000000298023224 + + + + + + + + + + + + 0.20000000298023224 + + + + + + + + + + + + + Spine_3 + + + + + + + + + + + + 0.20000000298023224 + + + + + + + + + + + + + L_Leg_Bottom + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + + R_Leg_Bottom + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + From a4c35e5908be1baddcf9187fedd5090fc9afe91b Mon Sep 17 00:00:00 2001 From: Teejoon Date: Mon, 14 Mar 2016 02:38:26 +0100 Subject: [PATCH 61/61] Lower Glow intensity on players --- .../Schema/Entities/PlayerAssaultBlue.xml | 62 ++++---- .../Schema/Entities/PlayerDefenderBlue.xml | 132 +++++++++--------- 2 files changed, 97 insertions(+), 97 deletions(-) diff --git a/resources/Schema/Entities/PlayerAssaultBlue.xml b/resources/Schema/Entities/PlayerAssaultBlue.xml index abe21a01..19a8a717 100644 --- a/resources/Schema/Entities/PlayerAssaultBlue.xml +++ b/resources/Schema/Entities/PlayerAssaultBlue.xml @@ -572,7 +572,7 @@ - 2.5 + 2.2000000476837158 Models/Characters/Assault/AssaultBlue.mesh @@ -587,8 +587,8 @@ Schema/Entities/WeaponAssaultBlueWorld.xml - - + + AssaultWeapon @@ -608,8 +608,8 @@ Schema/Entities/SidearmWeaponBlueWorld.xml - - + + SidearmWeapon @@ -676,7 +676,7 @@ CrouchStrafeLeftF - + true @@ -687,7 +687,7 @@ CrouchStrafeRightF - + true @@ -700,7 +700,7 @@ CrouchWalkF - + true @@ -713,7 +713,7 @@ CrouchF - + true @@ -756,7 +756,7 @@ WalkF - + true @@ -767,7 +767,7 @@ RunF - + 2 true @@ -791,7 +791,7 @@ StrafeLeftF - + 2 true @@ -803,7 +803,7 @@ StrafeRightF - + 2 true @@ -819,7 +819,7 @@ IdleF - + true @@ -908,10 +908,10 @@ - + - DashLeftF + DashRightF 1.7999999523162842 false @@ -920,10 +920,10 @@ - + - DashRightF + DashLeftF 1.7999999523162842 false @@ -1006,7 +1006,7 @@ IdleAssaultRifleU - + true true @@ -1120,8 +1120,8 @@ L_Elbow - - + + @@ -1157,8 +1157,8 @@ R_Elbow - - + + @@ -1194,8 +1194,8 @@ Head - - + + @@ -1236,8 +1236,8 @@ 0.10000000149011612 - - + + @@ -1253,8 +1253,8 @@ 0.10000000149011612 - - + + @@ -1302,8 +1302,8 @@ R_Leg_Bottom - - + + diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index 12e136d1..965fe839 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -579,7 +579,7 @@ - 2.5 + 2.2000000476837158 Models/Characters/Defender/DefenderBlue.mesh @@ -594,8 +594,8 @@ Schema/Entities/WeaponDefenderBlueWorld.xml - - + + DefenderWeapon @@ -615,8 +615,8 @@ Schema/Entities/SidearmWeaponBlueWorld.xml - - + + SidearmWeapon @@ -683,7 +683,7 @@ CrouchStrafeLeftF - + true @@ -694,7 +694,7 @@ CrouchStrafeRightF - + true @@ -707,7 +707,7 @@ CrouchWalkF - + true @@ -720,7 +720,7 @@ CrouchF - + true @@ -763,7 +763,7 @@ WalkF - + true @@ -774,7 +774,7 @@ RunF - + 2 true @@ -798,7 +798,7 @@ StrafeLeftF - + 2 true @@ -810,7 +810,7 @@ StrafeRightF - + 2 true @@ -826,7 +826,7 @@ IdleF - + true @@ -889,6 +889,41 @@ + + + + ActivateShield + SheildFront + 1 + + + + + + + + ActivateShieldU + + 2 + false + + + + + + + + + ShieldFrontU + + true + + + + + + + @@ -923,48 +958,13 @@ - - - - ActivateShield - SheildFront - 1 - - - - - - - - ActivateShieldU - - 2 - false - - - - - - - - - ShieldFrontU - - true - - - - - - - IdleAssaultRifleU - + true true @@ -1076,8 +1076,8 @@ Head - - + + @@ -1127,8 +1127,8 @@ L_Shoulder_Armor_Joint - - + + @@ -1152,8 +1152,8 @@ R_Shoulder_Armor_Joint - - + + @@ -1177,8 +1177,8 @@ L_Elbow - - + + @@ -1214,8 +1214,8 @@ R_Elbow - - + + @@ -1251,8 +1251,8 @@ Spine_3 - - + + @@ -1276,8 +1276,8 @@ L_Leg_Bottom - - + + @@ -1313,8 +1313,8 @@ R_Leg_Bottom - - + +