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/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/Engine/Input/FirstPersonInputController.h b/include/Engine/Input/FirstPersonInputController.h index e2323bad..67e7270e 100644 --- a/include/Engine/Input/FirstPersonInputController.h +++ b/include/Engine/Input/FirstPersonInputController.h @@ -166,6 +166,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); } @@ -175,6 +176,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); @@ -210,14 +212,41 @@ 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); + } + } + } } } } - //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; @@ -236,10 +265,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; @@ -251,8 +278,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/Network/Client.h b/include/Engine/Network/Client.h index cb1803cf..f79feb8d 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -10,6 +10,7 @@ #include #include +#include "Network/EKillDeath.h" #include "Core/World.h" #include "Core/EntityFile.h" #include "Core/EventBroker.h" @@ -105,6 +106,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/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/include/Engine/Rendering/SpriteJob.h b/include/Engine/Rendering/SpriteJob.h index 7b87f7f1..c2fbd9fb 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; @@ -55,7 +55,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; @@ -91,8 +91,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; bool ClampToBorder = false; 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/EndScreenSystem.h b/include/Game/Systems/EndScreenSystem.h new file mode 100644 index 00000000..1dabbb5e --- /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& e); +}; + +#endif \ No newline at end of file diff --git a/include/Game/Systems/FadeSystem.h b/include/Game/Systems/FadeSystem.h new file mode 100644 index 00000000..e2e930df --- /dev/null +++ b/include/Game/Systems/FadeSystem.h @@ -0,0 +1,22 @@ +#ifndef FadeSystem_h__ +#define FadeSystem_h__ + +#include "Core/System.h" +#include "GLM.h" + +class FadeSystem : public PureSystem +{ +public: + FadeSystem(SystemParams params) + : System(params) + , PureSystem("Fade") + { + + } + + virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cFadeOut, double dt) override; + +private: +}; + +#endif \ No newline at end of file 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/include/Game/Systems/PlayerMovementSystem.h b/include/Game/Systems/PlayerMovementSystem.h index 858e3c26..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 @@ -46,4 +48,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/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/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h b/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h index d577e22f..5783cf31 100644 --- a/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h @@ -31,12 +31,14 @@ 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); // Utility //Camera cameraFromEntity(EntityWrapper camera); + + void CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi); + }; #endif \ No newline at end of file diff --git a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h index 0623ac2b..178f4eaf 100644 --- a/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/DefenderWeaponBehaviour.h @@ -6,6 +6,7 @@ #include "Core/EPlayerDamage.h" #include "Sound/EPlaySoundOnEntity.h" #include "Sound/EPlaySoundOnEntity.h" +#include class DefenderWeaponBehaviour : public WeaponBehaviour { @@ -23,18 +24,24 @@ 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; 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); + void spawnTracers(ComponentWrapper cWeapon, WeaponInfo& wi, std::vector pattern); bool canFire(ComponentWrapper cWeapon, WeaponInfo& wi); // Utility Camera cameraFromEntity(EntityWrapper camera); + void CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi); }; #endif \ No newline at end of file diff --git a/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h b/include/Game/Systems/Weapon/SidearmWeaponBehaviour.h index 10e6105a..7eaca082 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,16 @@ 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 spawnTracer(ComponentWrapper cWeapon, WeaponInfo& wi); + + void CheckAmmo(ComponentWrapper cWeapon, WeaponInfo& wi); + void RemoveFrindlyAmmoHUD(WeaponInfo& wi); + + //float traceRayDistance(glm::vec3 origin, glm::vec3 direction); }; diff --git a/include/Game/Systems/Weapon/WeaponBehaviour.h b/include/Game/Systems/Weapon/WeaponBehaviour.h index b09bf77e..bafc907e 100644 --- a/include/Game/Systems/Weapon/WeaponBehaviour.h +++ b/include/Game/Systems/Weapon/WeaponBehaviour.h @@ -306,6 +306,8 @@ private: wi.ThirdPersonEntity = thirdPersonWeapon; wi.ThirdPersonPlayerModel = thirdPersonWeapon.FirstParentWithComponent("Model"); + player["Player"]["CurrentWeapon"] = cWeapon.Info.Name; + OnEquip(cWeapon, wi); } diff --git a/resources/Axyz.ico b/resources/Axyz.ico new file mode 100755 index 00000000..b033831f Binary files /dev/null and b/resources/Axyz.ico differ diff --git a/resources/DefaultConfig.ini b/resources/DefaultConfig.ini index 92e7bad3..a4deff88 100644 --- a/resources/DefaultConfig.ini +++ b/resources/DefaultConfig.ini @@ -39,6 +39,7 @@ ResourceLoading=true [Sound] BGMVolume=1.0 SFXVolume=1.0 +AnnouncerVolume=1.0 Announcer=female [SSAO] @@ -75,13 +76,16 @@ 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 + +[MSAA] +Level = 0; diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index 5bd82ee2..d4386cc0 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -71,4 +71,6 @@ + + \ No newline at end of file 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/DefenderWeapon.xml b/resources/Schema/Components/DefenderWeapon.xml index b01955bc..f2e7b3d9 100755 --- a/resources/Schema/Components/DefenderWeapon.xml +++ b/resources/Schema/Components/DefenderWeapon.xml @@ -1,17 +1,17 @@ - 8 + 9999 8 64 64 90 - 0.174533 + 10 0.174533 - 10 + 9 120 - 0.03 - 0.2 + 0.15 + 0.3 0.5 false 0 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/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/Components/Fade.xml b/resources/Schema/Components/Fade.xml new file mode 100644 index 00000000..2383b2a4 --- /dev/null +++ b/resources/Schema/Components/Fade.xml @@ -0,0 +1,8 @@ + + + 1 + + true + true + false + \ 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..c019678c --- /dev/null +++ b/resources/Schema/Components/Fade.xsd @@ -0,0 +1,23 @@ + + + + + + + + + + + + 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. + + + + + \ No newline at end of file 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/Components/SidearmWeapon.xml b/resources/Schema/Components/SidearmWeapon.xml index bc90c067..6f505d0c 100644 --- a/resources/Schema/Components/SidearmWeapon.xml +++ b/resources/Schema/Components/SidearmWeapon.xml @@ -6,11 +6,15 @@ 20 500 false - 0.01 - 0.5 + 0.05 + 0.174533 + 0.2 + 1.0 0.5 false 0 + 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 514bf354..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 @@ -44,8 +50,10 @@ + + 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/AmmoShareEffectView.xml b/resources/Schema/Entities/AmmoShareEffectView.xml new file mode 100644 index 00000000..28997ab0 --- /dev/null +++ b/resources/Schema/Entities/AmmoShareEffectView.xml @@ -0,0 +1,34 @@ + + + + + + 1.2000000476837158 + + + + + 1.2000000476837158 + -1 + 1.2000000476837158 + + true + true + + + 16.040000915527344 + Models/Effects/JumpEffectHexagon.mesh + + true + + + + + + + + + + + + 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/resources/Schema/Entities/DefenderShield.xml b/resources/Schema/Entities/DefenderShield.xml index 5cb72116..d2cca1da 100755 --- a/resources/Schema/Entities/DefenderShield.xml +++ b/resources/Schema/Entities/DefenderShield.xml @@ -1,39 +1,96 @@ - + - - Deploy - Idle - 0 - - - Models/Characters/Defender/DefenderShield.mesh - - + - - ActivateDeactiveShieldF - - 1 - + + Deploy + Idle + 0 + + + + Models/Characters/Defender/DefenderShieldBack.mesh + + false + true + false + false + false + false + - + + + + + ActivateShieldU + false + + + + + + + + + ShieldFrontU + true + + + + + + - + - - ShieldFrontF - 1 - + + Deploy + Idle + 0 + + + Models/Characters/Defender/DefenderShieldFront.mesh + + false + true + false + false + false + false + + - + + + + + ActivateShieldU + false + + + + + + + + + ShieldFrontU + false + + + + + + diff --git a/resources/Schema/Entities/EndScreen.xml b/resources/Schema/Entities/EndScreen.xml new file mode 100644 index 00000000..7b8b055f --- /dev/null +++ b/resources/Schema/Entities/EndScreen.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/FriendlyAmmoHUD.xml b/resources/Schema/Entities/FriendlyAmmoHUD.xml new file mode 100644 index 00000000..57209829 --- /dev/null +++ b/resources/Schema/Entities/FriendlyAmmoHUD.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + + + + + + + 88 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + 88 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000..1e0deebb --- /dev/null +++ b/resources/Schema/Entities/FriendlyBoostBlueHUD.xml @@ -0,0 +1,151 @@ + + + + + + 0.5 + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + \1 + Fonts/Hind-Edited.otf,64 + + false + + + + + + + + + + + \1 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + \2 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + \2 + Fonts/Hind-Edited.otf,64 + + false + + + + + + + + + + + + + + + + + + + + + \3 + Fonts/Hind-Edited.otf,64 + + false + + + + + + + + + + + \3 + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/HitTest.xml b/resources/Schema/Entities/HitTest.xml new file mode 100644 index 00000000..4649072b --- /dev/null +++ b/resources/Schema/Entities/HitTest.xml @@ -0,0 +1,27 @@ + + + + + + 10 + + + + 1 + true + true + + + Models/Core/UnitSphere.mesh + + false + true + + + + + + + + + diff --git a/resources/Schema/Entities/MovementTest.xml b/resources/Schema/Entities/MovementTest.xml index 8a99df55..c6e45bb6 100644 --- a/resources/Schema/Entities/MovementTest.xml +++ b/resources/Schema/Entities/MovementTest.xml @@ -2,6 +2,10 @@ + + 0.35657206405745967 + 0.5 + @@ -103,7 +107,7 @@ - + @@ -116,7 +120,7 @@ - + @@ -157,14 +161,3173 @@ 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 + + + + + + + + + + + + + + + + + + 0.014999999664723873 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PickTeam + 1 + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + PickTeam + 1 + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + 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/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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + Blue + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + PickTeam + 1 + + + + + + + + + + + Spectator + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 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 + + + + + + + + + + + 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 + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PickTeam + 1 + + + + + + + + + + + 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/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 + + + + + + + + + + + + + + + + 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/resources/Schema/Entities/MuzzleFlashBlue.xml b/resources/Schema/Entities/MuzzleFlashBlue.xml index 38b62d6d..840a2365 100644 --- a/resources/Schema/Entities/MuzzleFlashBlue.xml +++ b/resources/Schema/Entities/MuzzleFlashBlue.xml @@ -1,101 +1,226 @@ - + - 0.039999999105930328 + 0.08 - + - - Models/Effects/MuzzleFlash/Blue/PlaneRight.mesh - false - true - - + + + + + 0.08 + true + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone1Outside.mesh + false + true + + + + + + + + + 0.08 + true + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone1Inside.mesh + false + true + + + + + + - + - - Models/Effects/MuzzleFlash/Blue/Cone1Outside.mesh - false - true - - + + + - + + + + + 0.08 + true + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone2Inside.mesh + false + true + + + + + + + + + 0.08 + true + + + 2 + Models/Effects/MuzzleFlash/Blue/Cone2Outside.mesh + false + true + + + + + + - + - - Models/Effects/MuzzleFlash/Blue/Cone1Inside.mesh - false - true - - + + + - + + + + + 0.08 + true + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneLeft.mesh + false + true + + + + + + + + + 0.08 + true + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneRight.mesh + false + true + + + + + + + + + 0.08 + true + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneUp.mesh + false + true + + + + + + + + + 0.08 + true + + + 2 + Models/Effects/MuzzleFlash/Blue/PlaneDown.mesh + false + true + + + + + + - + - - Models/Effects/MuzzleFlash/Blue/Cone2Outside.mesh - false - true - - - - - - - Models/Effects/MuzzleFlash/Blue/Cone2Inside.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Blue/PlaneUp.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Blue/PlaneDown.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Blue/PlaneLeft.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 index d02a3d1a..c1d47b2a 100644 --- a/resources/Schema/Entities/MuzzleFlashFire.xml +++ b/resources/Schema/Entities/MuzzleFlashFire.xml @@ -9,93 +9,126 @@ - + - - Models/Effects/MuzzleFlash/Fire/PlaneRight.mesh - false - true - - + + + + + 2 + Models/Effects/MuzzleFlash/Fire/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Fire/Cone1Inside.mesh + false + true + + + + + + - + - - Models/Effects/MuzzleFlash/Fire/Cone1Outside.mesh - false - true - - + + + - + + + + + 2 + Models/Effects/MuzzleFlash/Fire/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Fire/Cone2Outside.mesh + false + true + + + + + + - + - - Models/Effects/MuzzleFlash/Fire/Cone1Inside.mesh - false - true - - + + + - - - - - - Models/Effects/MuzzleFlash/Fire/Cone2Outside.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Fire/Cone2Inside.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Fire/PlaneUp.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Fire/PlaneDown.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Fire/PlaneLeft.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 index 062454f8..50b22d6c 100644 --- a/resources/Schema/Entities/MuzzleFlashRed.xml +++ b/resources/Schema/Entities/MuzzleFlashRed.xml @@ -1,5 +1,5 @@ - + @@ -9,93 +9,126 @@ - + - - Models/Effects/MuzzleFlash/Red/PlaneRight.mesh - false - true - - + + + + + 2 + Models/Effects/MuzzleFlash/Red/Cone1Outside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Red/Cone1Inside.mesh + false + true + + + + + + - + - - Models/Effects/MuzzleFlash/Red/Cone1Outside.mesh - false - true - - + + + - + + + + + 2 + Models/Effects/MuzzleFlash/Red/Cone2Inside.mesh + false + true + + + + + + + + + 2 + Models/Effects/MuzzleFlash/Red/Cone2Outside.mesh + false + true + + + + + + - + - - Models/Effects/MuzzleFlash/Red/Cone1Inside.mesh - false - true - - + + + - - - - - - Models/Effects/MuzzleFlash/Red/Cone2Outside.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Red/Cone2Inside.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Red/PlaneUp.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Red/PlaneDown.mesh - false - true - - - - - - - - - Models/Effects/MuzzleFlash/Red/PlaneLeft.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/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/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/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/resources/Schema/Entities/PlayerAssaultBlue.xml b/resources/Schema/Entities/PlayerAssaultBlue.xml index 64141757..19a8a717 100644 --- a/resources/Schema/Entities/PlayerAssaultBlue.xml +++ b/resources/Schema/Entities/PlayerAssaultBlue.xml @@ -14,12 +14,10 @@ - - - - - + + 10 + @@ -30,7 +28,6 @@ - @@ -62,431 +59,450 @@ - - - + + Schema/Entities/PlayerHUD.xml + + - - - - Textures/Weapons/Crosshair/SmallThickHoleDot.png - - false - - - - - - - - - - - - Schema/Entities/HitMarker.xml - - - - - - + - - + - + - Textures/Core/UnitHexagon.png + false + Models/Core/UnitQuad.mesh - + Textures/Weapons/Crosshair/SmallThickHoleDot.png - + + - - - - - - - - 2 - - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - + - + - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - - 3 - - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - 1 - - - - 4 - - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - - 1 - - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - 1 - - - - - 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 - - - - 100/100 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - 1 - - - - - Textures/HealthHUD3.png - - - - - - - - - - - - - - + + - + - - - - Textures/Icons/Boosts/Assault-01.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 + + + + 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/Hind-Edited.otf,64 + + + + + + + + + + + + + Fonts/Hind-Edited.otf,64 + + + + + + - + - - - - - Textures/Icons/Boosts/Defender-01.png - - false - - + + + Fonts/Hind-Edited.otf,64 + + + + - - - - - - - - - - - - - - Textures/Icons/Boosts/Sniper-01.png - - false - - - - - - + - + - - - - - - Textures\Icons\Abilities\Superman-01.png - - false - - + + + + + + + + Models/Widgets/Arrows/ArrowBlue.mesh + - - - + + + + + + + + + + + + - + + + 1 + + + - 0.0 + 100/100 Fonts/DroidSans.ttf,64 - - false + - - - + + + + + + + + + + + 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/Long/Superman-01.png + + + + + + @@ -517,11 +533,11 @@ - Schema/Entities/WeaponDefenderBlueView.xml + Schema/Entities/WeaponSidearmAssaultBlueView.xml - DefenderWeapon + SidearmWeapon @@ -556,6 +572,7 @@ + 2.2000000476837158 Models/Characters/Assault/AssaultBlue.mesh @@ -570,8 +587,8 @@ Schema/Entities/WeaponAssaultBlueWorld.xml - - + + AssaultWeapon @@ -588,11 +605,11 @@ R_Arm_Weapon_Joint - Schema/Entities/SidearmWeaponWorld.xml + Schema/Entities/SidearmWeaponBlueWorld.xml - - + + SidearmWeapon @@ -659,7 +676,7 @@ CrouchStrafeLeftF - + true @@ -670,7 +687,7 @@ CrouchStrafeRightF - + true @@ -683,7 +700,7 @@ CrouchWalkF - + true @@ -696,7 +713,7 @@ CrouchF - + true @@ -739,7 +756,7 @@ WalkF - + true @@ -750,7 +767,7 @@ RunF - + 2 true @@ -774,7 +791,7 @@ StrafeLeftF - + 2 true @@ -786,7 +803,7 @@ StrafeRightF - + 2 true @@ -802,7 +819,7 @@ IdleF - + true @@ -926,7 +943,7 @@ - AssaultWeaponBlend + AssaultWeapon SidearmWeapon 0 true @@ -934,7 +951,7 @@ - + Aim @@ -946,7 +963,7 @@ - MovementBlend + IdleAssault ActionBlend @@ -985,41 +1002,17 @@ - + - - Idle - Run - 0 - + + IdleAssaultRifleU + + true + true + - - - - - IdleAssaultRifleU - - true - true - - - - - - - - - IdleAssaultRifleU - - true - true - - - - - - + @@ -1038,6 +1031,308 @@ + + + + Aim + WeaponBlend + + + + + + + + IdleSidearm + ActionBlend + + + + + + + + Reload + Fire + 1 + + + + + + + + ReloadSwitchU + false + + + + + + + + + ShootSecWepU + false + + + + + + + + + + + IdleSecWepU + true + + + + + + + + + + + AimSecWepA + + false + true + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + @@ -1087,9 +1382,10 @@ - Textures/Icons/Arrow.png - false + Models/Core/UnitQuad.mesh + + Textures/Icons/Arrow.png diff --git a/resources/Schema/Entities/PlayerDefenderBlue.xml b/resources/Schema/Entities/PlayerDefenderBlue.xml index 24bfee2b..965fe839 100644 --- a/resources/Schema/Entities/PlayerDefenderBlue.xml +++ b/resources/Schema/Entities/PlayerDefenderBlue.xml @@ -2,38 +2,39 @@ - - + - 4 - 52 + 120 + 8 + 5 - + + 10 + 150 150 + - - true + 5 - - + @@ -46,7 +47,6 @@ - @@ -63,80 +63,420 @@ - + - - - + - - - - Textures/Weapons/Crosshair/SmallThickHoleDot.png - - false - - - - - - - - - + - Schema/Entities/HitMarker.xml + Schema/Entities/WeaponDefenderBlueView.xml + + DefenderWeapon + - + + + Schema/Entities/WeaponSidearmDefenderBlueView.xml + + + SidearmWeapon + + + + + + + + + + Schema/Entities/PlayerHUD.xml + + + + + + + + + - + - - 1 - - - - Textures/HealthHUD3.png + false + Models/Core/UnitQuad.mesh - + Textures/Weapons/Crosshair/SmallThickHoleDot.png - - - + + + + + + + + + + Schema/Entities/HitMarker.xml + + + + + + + + + + + + + + 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 + + + + 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/Hind-Edited.otf,64 + + + + + + + + + + + + + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + Fonts/Hind-Edited.otf,64 + + + + + + + + + + + + + + + + + + + + + + Models/Widgets/Arrows/ArrowBlue.mesh + + + + + + + + + + + + + + + + + + + + + 1 + + + + + 150/150 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + 1 + + + + + Models/Core/UnitQuad.mesh + + Textures/HealthHUD3.png + + + + + + + + - + + + - + - Textures/Core/White.png - false - + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Assault-01.png + - - + + + @@ -144,17 +484,19 @@ - + - Textures/Core/White.png - false - + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Defender-01.png + - - + + + @@ -162,17 +504,19 @@ - + - Textures/Core/White.png - false - + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Sniper-01.png + - - + + + @@ -183,503 +527,26 @@ + 1 - Textures/Core/White.png - false - - - - - - - - - - - 0.0 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - 1 - - - - 150/150 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - - 2 - - - Textures/Core/UnitHexagon_Rotated.png + Models/Core/UnitQuad.mesh + Textures/Icons/Abilities/Long/SheildDots-01.png + - - - + + + - - - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - - 3 - - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - 1 - - - - 4 - - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - - 1 - - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - 1 - - - - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - - Models/Widgets/Arrows/Arrow5.mesh - - - - - - - - - - - - - - - MovementBlend - FinalBlend - - - Models/Characters/Defender/FirstPersonDefenderBlue.mesh - - - - - - - - R_Arm_Weapon_Joint - - - DefenderWeapon - - - Schema/Entities/WeaponDefenderBlueView.xml - - - - - - - - - - - - R_Arm_Weapon_Joint - - - SidearmWeapon - - - Schema/Entities/SidearmWeaponView.xml - - - - - - - - - - - - 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,15 +572,15 @@ - - BlendTreeAim - BlendTreeAssault - + + BlendTreeUpper + BlendTreeLower + + 2.2000000476837158 Models/Characters/Defender/DefenderBlue.mesh - @@ -723,19 +590,19 @@ R_Arm_Weapon_Joint - - AssaultWeapon - - - - Schema/Entities/WeaponDefenderBlueWorld.xml - - + + + + DefenderWeapon + + + + @@ -744,152 +611,90 @@ R_Arm_Weapon_Joint + + Schema/Entities/SidearmWeaponBlueWorld.xml + + + + + SidearmWeapon - - Schema/Entities/SidearmWeaponWorld.xml - - - - - - + - AimPrimary - AimSecondary + MovementBlend + Jump 0 true - - - - - AimSecWepA - - false - true - - - - - - - - - AimRifleA - - false - true - - - - - - - - - - - ReloadSwitchBlend - MovementBlend - - - - StandCrouchBlend - JumpDashBlend - 2.5146881298480398e-63 + StandMovement + CrouchMovement + 0 true - + - StandMovement - CrouchMovement - 0 - true + DirectionBlend + Idle + 1 - + - MovementBlend - Idle - 1 + Walk + StrafeLRBlend + 0 - + - Walk - StrafeLRBlend - 0 + Left + Right + 0.033793529385008014 - - - - Left - Right - 0.033793529385008014 - - - - - - - - CrouchStrafeRightF - - 1 - true - - - - - - - - - CrouchStrafeLeftF - - 1 - true - - - - - - - - + - CrouchWalkF - - 1 + CrouchStrafeLeftF + + true + + + + + + + + + CrouchStrafeRightF + true @@ -898,119 +703,11 @@ - + - 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 + CrouchWalkF + true @@ -1019,70 +716,67 @@ - - - - - - Jump - DashBlend - 1 - true - - - - - + - JumpF - - 1 - false + CrouchF + + true - + + + + + + DirectionBlend + Idle + 1 + + + + + - DashFBBlend - DashLRBlend - 0.014621149736541383 + RunWalkBlend + StrafeLRBlend + 2.4565650245976452e-16 - + - DashForward - DashBackward - 0.014363533804961248 + Walk + Run + 1.2938206818383024e-24 - + - DashForwardF - - 1 - false + WalkF + + true - + - DashBackwardF - - 1 - false + RunF + + 2 + true @@ -1090,35 +784,35 @@ - + - DashLeft - DashRight - 4.3244885367500671e-16 + Left + Right + 0.033793529385008014 - + - DashLeftF - - 1 - false + StrafeLeftF + + 2 + true - + - DashRightF - - 1 - false + StrafeRightF + + 2 + true @@ -1128,71 +822,213 @@ + + + + IdleF + + true + + + + + - + - - ReloadSwitch - WeaponActionBlend - 1 - true - + + JumpF + + false + + + + + + + + + + + DefenderWeapon + SidearmWeapon + 1 + true + + + + + + + + Aim + WeaponBlend + - + + + + IdleDefender + FinalBlend + + + + + + + + ShieldBlend + ActionBlend + 1 + + + + + + + + ActivateShield + SheildFront + 1 + + + + + + + + ActivateShieldU + + 2 + false + + + + + + + + + ShieldFrontU + + true + + + + + + + + + + + Fire + Reload + 0 + + + + + + + + ShootgunReloadU + + 0.5 + + + + + + + + + ShootRifleU + + false + + + + + + + + + + + + + IdleAssaultRifleU + + true + true + + + + + + + + - ReloadSwitchU - - 1 + AimRifleA + + true - + + + + + + Aim + WeaponBlend + + + + + - - IdleBlend - ShootBlend - 0 - + + IdleSidearm + ActionBlend + - + - IdlePrimary - IdleSecondary - 0 + Reload + Fire - + - IdleAssaultRifleU - - 1 - true + ReloadSwitchU + false - + - IdleSecWepU - - 1 - true + ShootSecWepU + false @@ -1200,81 +1036,309 @@ - + - - ShootPrimary - ShootSecondary - 0 - + + IdleSecWepU + true + - - - - - ShootFastRifleU - - 1 - - - - - - - - - ShootSecWepFastU - - - - - - + + + + + AimSecWepA + + 0.10000000149011612 + false + true + + + + + - + - - - + - + - - Deploy - Idle - 0 - - - Models/Characters/Defender/DefenderShield.mesh - - + + Head + + + + + - + - - ActivateDeactiveShieldF - 1 - - + + + 0.5 + 0.20000000298023224 + + + + - + - - ShieldFrontF - 1 - - + + + 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 + + + + @@ -1319,7 +1383,7 @@ - + @@ -1329,9 +1393,10 @@ - Textures/Icons/Arrow.png - false + Models/Core/UnitQuad.mesh + + Textures/Icons/Arrow.png @@ -1351,9 +1416,7 @@ Schema/Entities/DefenderShield.xml - - - + diff --git a/resources/Schema/Entities/PlayerHUD.xml b/resources/Schema/Entities/PlayerHUD.xml index cf07bc56..48123411 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,9 +43,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -61,9 +63,10 @@ 3 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png @@ -78,9 +81,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -98,9 +102,10 @@ 4 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png @@ -115,9 +120,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -134,9 +140,10 @@ 2 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png @@ -151,9 +158,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -170,9 +178,10 @@ 1 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png @@ -187,9 +196,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -205,9 +215,10 @@ - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png @@ -234,7 +245,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -247,7 +258,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -262,7 +273,7 @@ - Fonts/DroidSans.ttf,64 + Fonts/Hind-Edited.otf,64 @@ -284,10 +295,11 @@ - Models/Widgets/Arrows/Arrow5.mesh + Models/Widgets/Arrows/ArrowBlue.mesh + @@ -307,12 +319,12 @@ 1 + 100/100 Fonts/DroidSans.ttf,64 - + - @@ -329,8 +341,9 @@ - Textures/HealthHUD3.png + Models/Core/UnitQuad.mesh + Textures/HealthHUD3.png @@ -350,16 +363,17 @@ - + - Textures/Icons/Boosts/Assault-01.png - false - + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Assault-01.png + - + @@ -369,16 +383,17 @@ - + - Textures/Icons/Boosts/Defender-01.png - false - + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Defender-01.png + - + @@ -388,16 +403,17 @@ - + - Textures/Icons/Boosts/Sniper-01.png - false - + Models/Core/UnitQuad.mesh + + Textures/Icons/Boosts/Sniper-01.png + - + @@ -413,15 +429,16 @@ - Textures/Icons/Abilities/Superman-01.png - false - + Models/Core/UnitQuad.mesh + + Textures/Test/aM4ME4GR.png + - - + + 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/RayAssaultBlue.xml b/resources/Schema/Entities/RayAssaultBlue.xml new file mode 100644 index 00000000..c358a4d5 --- /dev/null +++ b/resources/Schema/Entities/RayAssaultBlue.xml @@ -0,0 +1,50 @@ + + + + + + 0.079999998211860657 + + + + + + + + + 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/RayBlue.xml b/resources/Schema/Entities/RayBlue.xml index 83adbe51..c358a4d5 100644 --- a/resources/Schema/Entities/RayBlue.xml +++ b/resources/Schema/Entities/RayBlue.xml @@ -3,25 +3,26 @@ - 0.10000000149011612 + 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/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/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/ScoreBoard_Main.xml b/resources/Schema/Entities/ScoreBoard_Main.xml index ccc1df68..38db3e4b 100644 --- a/resources/Schema/Entities/ScoreBoard_Main.xml +++ b/resources/Schema/Entities/ScoreBoard_Main.xml @@ -2,41 +2,166 @@ - + + + + - + - - Models/Core/UnitCube.mesh - + + 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 - + + + + + + + + + 0.70000028610229492 + Models/Props/ScoreBoard/Spectatorboard.mesh + false + + + + @@ -44,25 +169,237 @@ - + Schema/Entities/ScoreBoard_Blue.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/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 + + + + + + + + + + + + + + + + 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/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/StartMenu.xml b/resources/Schema/Entities/StartMenu.xml index 86ee626e..2bcd7118 100644 --- a/resources/Schema/Entities/StartMenu.xml +++ b/resources/Schema/Entities/StartMenu.xml @@ -22,7 +22,7 @@ - 0.53338721940212963 + 5.9332086658013736 @@ -697,6 +697,31 @@ + + + + + Models/Highgrounds/Hg7.mesh + + + + + + + + + + + + Models/Highgrounds/Hg17.mesh + + + + + + + + @@ -745,31 +770,6 @@ - - - - - Models/Highgrounds/Hg7.mesh - - - - - - - - - - - - Models/Highgrounds/Hg17.mesh - - - - - - - - @@ -1436,279 +1436,2471 @@ - + - + + + - + + + + + + + + + + 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/Props/Stones/ShinyStoneCrystalBlue.mesh + Models/Core/UnitPlane.mesh + + true - - - + + + - + - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - + - + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + - + - - - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - + - + + + + + + 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 + + + + + + + + + - + - - - Models/Props/Stones/ShinyStoneCrystalBlue.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/Bridges/SciFiBridgeDefense.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/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/Bridges/SciFiBridgeDefense.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/Stones/ShinyStoneCrystalBlue.mesh - - - - - + - + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Blue.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 + + + + + + + + + + - + - - - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - + - + + + + + + Models/Props/Flora/SpecialRoot.mesh + + + + + + + + + + + + + Models/Props/Flora/SpecialRoot.mesh + + + + + + + + + + + + + + Models/Props/Flora/SpecialRoot.mesh + + + + + + + + + + + + + + Models/Props/Flora/SpecialRoot.mesh + + + + + + + + + + - + - - - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - + - + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.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 - - - - - - - - + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + @@ -1725,11 +3917,11 @@ 6 - Models/Props/Pillars/SciFiPillar1Red.mesh + Models/Props/Pillars/SciFiPillar2Red.mesh - - + + @@ -1753,13 +3945,26 @@ - 4 - Models/Props/Pillars/SciFiPillar1Red.mesh + Models/Props/Pillars/SciFiPillar2Blue.mesh - - - + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + @@ -1787,8 +3992,9 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - + + + @@ -1797,12 +4003,55 @@ - Models/Props/Pillars/SciFiPillar2Blue.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 + + + + @@ -1822,20 +4071,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - @@ -1851,20 +4086,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - @@ -1879,20 +4100,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - @@ -1908,21 +4115,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - @@ -1945,6 +4137,1637 @@ + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + 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/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 + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 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 + + + + + + + + + + + @@ -2007,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 + + + + + + + + @@ -2077,21 +6106,6 @@ - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -2135,75 +6149,6 @@ - - - - - 4 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - - - - - - - - - - - - 3 - - - - - - - - - - - - 2 - 1 - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -2219,22 +6164,6 @@ - - - - - 4 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - @@ -2250,21 +6179,6 @@ - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -2279,21 +6193,6 @@ - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -2309,19 +6208,6 @@ - - - - - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - @@ -2341,6 +6227,45 @@ + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiBridgePillar1.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + @@ -2381,19 +6306,6 @@ - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - @@ -2407,19 +6319,6 @@ - - - - - Models/Props/Pillars/SciFiBridgePillar1.mesh - - - - - - - - @@ -2433,19 +6332,6 @@ - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - @@ -2609,1637 +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 - - - - - - - - - - - - - - - - - - - - - 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/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/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.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/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/BigStone.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/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/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.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/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/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/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.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/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - @@ -4255,78 +6510,6 @@ - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - @@ -4339,7 +6522,21 @@ Models/Props/Walls/SmallWall3.mesh - + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + @@ -4349,11 +6546,12 @@ - Models/Props/Walls/MediumWall3.mesh + Models/Props/Walls/SmallWall3.mesh - - + + + @@ -4362,11 +6560,12 @@ - Models/Props/Walls/BigWallRed.mesh + Models/Props/Walls/SmallWall3.mesh - - + + + @@ -4389,11 +6588,11 @@ - Models/Props/Walls/BigWallBlue.mesh + Models/Props/Walls/SmallWall3.mesh - - + + @@ -4402,11 +6601,12 @@ - Models/Props/Walls/MediumWall3.mesh + Models/Props/Walls/SmallWall3.mesh - - + + + @@ -4425,6 +6625,162 @@ + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + @@ -4438,19 +6794,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - @@ -4465,19 +6808,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - @@ -4519,33 +6849,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - @@ -4573,20 +6876,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -4600,47 +6889,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - @@ -4655,45 +6903,6 @@ - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - @@ -4708,19 +6917,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - @@ -4735,22 +6931,9 @@ - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - + @@ -4759,12 +6942,11 @@ - Models/Props/Walls/SpecialWall1.mesh + Models/Props/SciFiHolder1.mesh - - - + + @@ -4773,12 +6955,11 @@ - Models/Props/Walls/SpecialWall1.mesh + Models/Props/SciFiHolder1.mesh - - - + + @@ -4787,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 + + + + @@ -4815,548 +7007,600 @@ + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Stones/ShinyStoneCrystalBlue.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 + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Blue.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/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.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/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - + + + + + 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 + + + + + + + + @@ -5375,12 +7619,12 @@ - Models/Props/Stones/MediumStone2.mesh + Models/Props/Stones/SmallStone2.mesh - - - + + + @@ -5389,11 +7633,51 @@ - Models/Props/Stones/SmallStone1.mesh + Models/Props/Stones/MediumStone2.mesh - - + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + @@ -5424,32 +7708,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -5489,20 +7747,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -5516,19 +7760,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -5543,19 +7774,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -5570,46 +7788,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -5624,19 +7802,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -5651,20 +7816,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5681,1157 +7832,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 - - - - - - - - - - - @@ -6843,8 +7843,8 @@ Models/Props/PickUps/PickUpHolder.mesh - - + + @@ -6852,14 +7852,55 @@ - + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + - 8 @@ -6869,51 +7910,10 @@ - + - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - @@ -6921,696 +7921,6 @@ - - - - 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 - - - - - - - - - @@ -7625,9 +7935,9 @@ Models/Props/Walls/SmallWall3.mesh - - - + + + @@ -7639,7 +7949,35 @@ Models/Props/Walls/SmallWall3.mesh - + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + @@ -7652,8 +7990,35 @@ Models/Props/Walls/SmallWall3.mesh - - + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/smallWall3.mesh + + + + @@ -7666,8 +8031,8 @@ Models/Props/Walls/BigWallBlue.mesh - - + + @@ -7679,34 +8044,8 @@ Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - + + @@ -7718,76 +8057,8 @@ 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 - - - - + + @@ -7800,229 +8071,50 @@ 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 - - - - - - + - + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + @@ -8036,35 +8128,8 @@ Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - + + @@ -8076,294 +8141,229 @@ 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/AssaultHolder.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar3Blue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar1Blue.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar3Blue.mesh - - - - - - - - - @@ -8373,28 +8373,6 @@ - - - - 10 - - - - - - - - - - - 10 - - - - - - - @@ -8418,6 +8396,28 @@ + + + + 10 + + + + + + + + + + + 10 + + + + + + + @@ -8459,7 +8459,11 @@ - + + Schema/Entities/PlayerAssaultBlue.xml + Schema/Entities/PlayerDefenderBlue.xml + + Schema/Entities/PlayerAssaultRed.xml @@ -8468,32 +8472,6 @@ - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - @@ -8520,6 +8498,100 @@ + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + + + + + + + Schema/Entities/PlayerAssaultBlue.xml + Schema/Entities/PlayerDefenderBlue.xml + + + + Schema/Entities/PlayerAssaultBlue.xml + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + @@ -8527,38 +8599,6 @@ - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 3 - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - @@ -8581,7 +8621,6 @@ - Models/Core/UnitCylinder.mesh @@ -8591,6 +8630,76 @@ + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 15 + 2 + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 3 + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + @@ -8621,7 +8730,6 @@ - Models/Core/UnitCylinder.mesh @@ -8631,43 +8739,7 @@ - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 15 - 2 - - - - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - @@ -8697,7 +8769,6 @@ - Models/Core/UnitCylinder.mesh @@ -8707,6 +8778,7 @@ + @@ -8714,70 +8786,6 @@ - - - - - - - - - - Schema/Entities/PlayerAssaultBlue.xml - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - @@ -8796,7 +8804,7 @@ - + @@ -8808,7 +8816,7 @@ - + @@ -8825,6 +8833,21 @@ + + + + Models/Core/UnitQuad.mesh + + Textures/Icons/AxyzWhite-01.png + true + + + + + + + + @@ -8849,12 +8872,14 @@ - + - + + + - + @@ -8865,21 +8890,48 @@ true - - Play - 1 - + + + + Quit + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + @@ -8896,39 +8948,8 @@ - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - - - - - - Play - Fonts/DroidSans.ttf,64 - - - - - - - - - - - @@ -9011,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 + + + + + + + + + + + + + @@ -9095,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 - - - - - - - - - - - - - @@ -9184,19 +9207,19 @@ - + - Schema/Entities/ServerList.xml + Schema/Entities/OptionMenu.xml - + - Schema/Entities/OptionMenu.xml + Schema/Entities/ServerList.xml diff --git a/resources/Schema/Entities/StartMenu_simple.xml b/resources/Schema/Entities/StartMenu_simple.xml new file mode 100644 index 00000000..d6a31372 --- /dev/null +++ b/resources/Schema/Entities/StartMenu_simple.xml @@ -0,0 +1,476 @@ + + + + + + + + + + + + + + + + + Schema/Entities/NewMap2version5NEW.xml + + + + + + + + + + + + + + + + 0.10000000149011612 + + + + + + + + + + + 0.20000000298023224 + + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/MainMenu.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + Play + 1 + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + + 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 + 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/White.png + true + + + + Options + 1 + + + + + + + + + + + Options + 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 + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/ServerList.xml + + + + + + + + + Schema/Entities/OptionMenu.xml + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Test/SmallDiff.png + true + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/WeaponAssaultBlueView.xml b/resources/Schema/Entities/WeaponAssaultBlueView.xml index 520c9906..e1d6b852 100644 --- a/resources/Schema/Entities/WeaponAssaultBlueView.xml +++ b/resources/Schema/Entities/WeaponAssaultBlueView.xml @@ -88,26 +88,15 @@ R_Arm_Weapon_Joint + 1.5 Models/Weapons/Blue/AssaultWeaponBlue.mesh - - + + - - - - Schema/Entities/RayBlue.xml - - - - - - - - @@ -117,6 +106,38 @@ + + + + + + + + + + + + Schema/Entities/MuzzleFlashBlue.xml + + + + + + + + + + + Schema/Entities/RayAssaultBlue.xml + + + + + + + + + @@ -127,17 +148,18 @@ true - - - + + + - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -191,6 +213,17 @@ + + + + Schema/Entities/FriendlyBoostBlueHUD.xml + + + + + + + diff --git a/resources/Schema/Entities/WeaponDefenderBlueView.xml b/resources/Schema/Entities/WeaponDefenderBlueView.xml index c22e7200..9e3d6a51 100644 --- a/resources/Schema/Entities/WeaponDefenderBlueView.xml +++ b/resources/Schema/Entities/WeaponDefenderBlueView.xml @@ -27,7 +27,7 @@ - ActivateDeactivateShieldF + ActivateShieldF false @@ -146,60 +146,26 @@ - - - - R_Arm_Weapon_Joint - - - Models/Weapons/Blue/DefenderWeaponBlue.mesh - - - - - - - - - - - Schema/Entities/RayBlue.xml - - - - - - - - - - - Schema/Entities/ReloadEffectView.xml - - - - - - - R_Ammo_Joint + true - - + + - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh + Textures/Core/UnitHexagon.png @@ -253,6 +219,81 @@ + + + + Schema/Entities/FriendlyBoostBlueHUD.xml + + + + + + + + + + + + + + + + + + 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/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 new file mode 100644 index 00000000..e48cffba --- /dev/null +++ b/resources/Schema/Entities/WeaponSidearmAssaultBlueView.xml @@ -0,0 +1,239 @@ + + + + + + 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_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 + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000..129082ed --- /dev/null +++ b/resources/Schema/Entities/WeaponSidearmDefenderBlueView.xml @@ -0,0 +1,239 @@ + + + + + + MovementBlend + ActionBlend + + + Models/Characters/Defender/FirstPersonDefenderBlue.mesh + + + + + + + + + Idle + Run + 1 + true + + + + + + + + IdleSecF + true + true + + + + + + + + + RunSecF + true + true + + + + + + + + + + + Fire + Reload + 0 + + + + + + + + ShootSecF + false + + + + + + + + + ReloadSwitchSecF + false + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000..bae68bc2 --- /dev/null +++ b/resources/Schema/Entities/WeaponSidearmReloadEffectView.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + 0.5 + 0.5 + -1 + 0.5 + + true + + + 1.5 + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + false + true + + + + + + + + + 0.5 + + + + 0.5 + + true + + + 1.5 + Models/Weapons/Blue/SecondaryWeaponBlue.mesh + false + true + + + + + + + + diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd index b32b193b..51bb8e13 100644 --- a/resources/Schema/Types/Entity.xsd +++ b/resources/Schema/Types/Entity.xsd @@ -71,7 +71,9 @@ + + diff --git a/resources/Setup/Inno Setup Script.iss b/resources/Setup/Inno Setup Script.iss new file mode 100755 index 00000000..d271967d --- /dev/null +++ b/resources/Setup/Inno Setup Script.iss @@ -0,0 +1,76 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +#define MyAppName "Axyz" +#define MyAppVersion "1.0" +#define MyAppURL "https://github.com/teamfisk/TacticalZ" +#define MyAppExeName "Axyz.exe" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. +; Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{38D77EB2-6B56-4B4F-BAAE-43F9E6E1A191} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +;AppVerName={#MyAppName} {#MyAppVersion} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={pf}\{#MyAppName} +DisableProgramGroupPage=yes +OutputBaseFilename=Axyz Setup +SetupIconFile=..\Axyz.ico +Compression=lzma2 +SolidCompression=yes +; "ArchitecturesAllowed=x64" specifies that Setup cannot run on +; anything but x64. +ArchitecturesAllowed=x64 +; "ArchitecturesInstallIn64BitMode=x64" requests that the install be +; done in "64-bit mode" on x64, meaning it should use the native +; 64-bit Program Files directory and the 64-bit view of the registry. +ArchitecturesInstallIn64BitMode=x64 +OutputDir=. +DisableWelcomePage=false +;WizardSmallImageFile= +WizardImageFile=Setup Banner.bmp + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +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\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 + +[Icons] +Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[INI] +Filename: "{app}\Config.ini"; Section: "Networking"; Key: "Name"; String: "{%USERNAME}"; Flags: createkeyifdoesntexist + +[Run] +Filename: "{tmp}\VC_redist.x64.exe"; Parameters: "/norestart /passive"; StatusMsg: "Installing Microsoft Visual C++ 2015 x64 Redistributable...."; + +[ThirdParty] +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 00000000..69384103 Binary files /dev/null and b/resources/Setup/Setup Banner.bmp differ diff --git a/resources/Shaders/Sprite.frag.glsl b/resources/Shaders/Sprite.frag.glsl index eeb2bd2d..6a7169e1 100644 --- a/resources/Shaders/Sprite.frag.glsl +++ b/resources/Shaders/Sprite.frag.glsl @@ -29,10 +29,9 @@ void main() vec4 color_result = Color * diffuseTexel; float pos = ((P * vec4(Input.Position, 1)).y + 1.0)/2.0; + float fillResult = clamp(floor(pos/FillPercentage), 0, 1); - if(pos <= FillPercentage) { - color_result = FillColor*diffuseTexel.a; - } + color_result = FillColor*diffuseTexel.a*(1 - fillResult) + color_result*fillResult; sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1)); diff --git a/resources/TacticalZ.rc b/resources/TacticalZ.rc new file mode 100755 index 00000000..640a9490 Binary files /dev/null and b/resources/TacticalZ.rc differ diff --git a/src/Engine/Core/EntityWrapper.cpp b/src/Engine/Core/EntityWrapper.cpp index c8188e56..ba6cafe0 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/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 94836ece..381c606d 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -173,6 +173,9 @@ void Client::parseMessageType(Packet& packet) case MessageType::RemoveWorld: parseRemoveWorld(packet); break; + case MessageType::KD: + parseKDEvent(packet); + break; default: break; } @@ -357,6 +360,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/Engine/Rendering/AnimationSystem.cpp b/src/Engine/Rendering/AnimationSystem.cpp index 729ed672..895cbc28 100644 --- a/src/Engine/Rendering/AnimationSystem.cpp +++ b/src/Engine/Rendering/AnimationSystem.cpp @@ -76,18 +76,18 @@ void AnimationSystem::UpdateAnimations(double dt) Field res = modelEntity["Model"]["Resource"]; model = ResourceManager::Load<::Model, true>(res); } 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 = (const double&)animationC["Speed"]; @@ -128,8 +128,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(); @@ -159,12 +159,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; } @@ -172,11 +173,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; } @@ -184,6 +187,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; } @@ -194,6 +198,7 @@ bool AnimationSystem::OnAutoAnimationBlend(Events::AutoAnimationBlend& e) subTreeRoot = blendTree->GetSubTreeRoot(e.NodeName); if (!subTreeRoot.Valid()) { + LOG_ERROR("%s, subTreeRoot invalid", e.NodeName); return false; } @@ -238,6 +243,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/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index 3b355078..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) { @@ -1336,7 +1335,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()) { diff --git a/src/Game/CMakeLists.txt b/src/Game/CMakeLists.txt index d8ba8599..a9aa829f 100644 --- a/src/Game/CMakeLists.txt +++ b/src/Game/CMakeLists.txt @@ -53,10 +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} ) diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 4d76797e..875e00ef 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -40,6 +40,8 @@ #include "Game/Systems/MainMenuSystem.h" #include "Game/Systems/ServerListSystem.h" #include "Game/Systems/StartSystem.h" +#include "Game/Systems/EndScreenSystem.h" +#include "Game/Systems/FadeSystem.h" #include "Rendering/TextureSprite.h" @@ -158,6 +160,8 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(updateOrderLevel); 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/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/AbilityCooldownHUDSystem.cpp b/src/Game/Systems/AbilityCooldownHUDSystem.cpp index 6b4537a2..c89b4251 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")) { + (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")) { - entity["Sprite"]["DiffuseTexture"] = "Textures\\Icons\\Abilities\\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")) { - entity["Sprite"]["DiffuseTexture"] = "Textures\\Icons\\Abilities\\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")) { - entity["Sprite"]["DiffuseTexture"] = "Textures\\Icons\\Abilities\\Superman-01.png"; + (Field)entity["Sprite"]["DiffuseTexture"] = "Textures/Icons/Abilities/Long/Superman-01.png"; } } @@ -57,23 +60,23 @@ void AbilityCooldownHUDSystem::Update(double dt) if (cooldownTextEntity.Valid()) { if (cooldownTextEntity.HasComponent("Text")) { - cooldownTextEntity["Text"]["Content"] = std::to_string(currentAbilityCD).substr(0, 3); + (Field)cooldownTextEntity["Text"]["Content"] = std::to_string(currentAbilityCD).substr(0, 3); } } } 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"]; } 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 57d135ae..1f0331e2 100644 --- a/src/Game/Systems/BoostIconsHUDSystem.cpp +++ b/src/Game/Systems/BoostIconsHUDSystem.cpp @@ -5,36 +5,38 @@ 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()) { - assaultEntity["Fill"]["Percentage"] = 1.0; + EntityWrapper assaultBoost = player.FirstChildByName("BoostAssault"); + if (assaultBoost.Valid()) { + (Field)assaultEntity["Fill"]["Percentage"] = 1.0; } else { - assaultEntity["Fill"]["Percentage"] = 0.0; + (Field)assaultEntity["Fill"]["Percentage"] = 0.0; } } } if (defenderEntity.Valid()) { if (defenderEntity.HasComponent("Fill")) { - EntityWrapper parentWithAssaultBoost = defenderEntity.FirstParentWithComponent("BoostDefender"); - if (parentWithAssaultBoost.Valid()) { - defenderEntity["Fill"]["Percentage"] = 1.0; + EntityWrapper defenderBoost = player.FirstChildByName("BoostDefender"); + if (defenderBoost.Valid()) { + (Field)defenderEntity["Fill"]["Percentage"] = 1.0; } else { - defenderEntity["Fill"]["Percentage"] = 0.0; + (Field)defenderEntity["Fill"]["Percentage"] = 0.0; } } } if (sniperEntity.Valid()) { if (sniperEntity.HasComponent("Fill")) { - EntityWrapper parentWithAssaultBoost = sniperEntity.FirstParentWithComponent("BoostSniper"); - if (parentWithAssaultBoost.Valid()) { - sniperEntity["Fill"]["Percentage"] = 1.0; + EntityWrapper sniperBoost = player.FirstChildByName("BoostSniper"); + if (sniperBoost.Valid()) { + (Field)sniperEntity["Fill"]["Percentage"] = 1.0; } else { - 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 c3dc1f2b..5a04e3f8 100644 --- a/src/Game/Systems/BoostSystem.cpp +++ b/src/Game/Systems/BoostSystem.cpp @@ -8,21 +8,16 @@ BoostSystem::BoostSystem(SystemParams params) bool BoostSystem::OnPlayerDamage(Events::PlayerDamage& e) { - if (e.Victim.ID == e.Inflictor.ID) { + + + if (e.Victim == e.Inflictor) { return false; } - if (!e.Victim.Valid() || !LocalPlayer.Valid()) { + if (!e.Victim.Valid() || !e.Inflictor.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"]) { @@ -35,19 +30,27 @@ bool BoostSystem::OnPlayerDamage(Events::PlayerDamage& e) return false; } - //get the XML file, example: "Schema/Entities/BoostclassName.xml" - std::string classXML = "Schema/Entities/" + className + ".xml"; + 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"; - //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); + //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 +58,56 @@ 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) +{ + if (receiver.HasComponent("AssaultWeapon")) { + int magazineSize = receiver["AssaultWeapon"]["MagazineSize"]; + Field magazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; + int prevMagazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; + int maxAmmo = receiver["AssaultWeapon"]["MaxAmmo"]; + Field ammo = receiver["AssaultWeapon"]["Ammo"]; + + int givenAmmo = 20; + + 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"]; + Field magazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; + int prevMagazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; + int maxAmmo = receiver["DefenderWeapon"]["MaxAmmo"]; + Field ammo = receiver["DefenderWeapon"]["Ammo"]; + + 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); + } + } +} diff --git a/src/Game/Systems/EndScreenSystem.cpp b/src/Game/Systems/EndScreenSystem.cpp new file mode 100644 index 00000000..59c261bd --- /dev/null +++ b/src/Game/Systems/EndScreenSystem.cpp @@ -0,0 +1,74 @@ +#include "Systems/EndScreenSystem.h" + + +EndScreenSystem::EndScreenSystem(SystemParams params) + : System(params) + , ImpureSystem() +{ + EVENT_SUBSCRIBE_MEMBER(m_EWin, &EndScreenSystem::OnWin); +} + +void EndScreenSystem::Update(double dt) +{ + +} + +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")) + (Field)redSprite["Sprite"]["Visible"] = true; + if (redText.HasComponent("Text")) + (Field)redText["Text"]["Visible"] = true; + + if (blueSprite.HasComponent("Sprite")) + (Field)blueSprite["Sprite"]["Visible"] = false; + if (blueText.HasComponent("Text")) + (Field)blueText["Text"]["Visible"] = false; + + }else if (e.TeamThatWon == 3) { + //Blue team won + if (redSprite.HasComponent("Sprite")) + (Field)redSprite["Sprite"]["Visible"] = false; + if (redText.HasComponent("Text")) + (Field)redText["Text"]["Visible"] = false; + + if (blueSprite.HasComponent("Sprite")) + (Field)blueSprite["Sprite"]["Visible"] = true; + if (blueText.HasComponent("Text")) + (Field)blueText["Text"]["Visible"] = true; + } else { + //No team won? + if (redSprite.HasComponent("Sprite")) + (Field)redSprite["Sprite"]["Visible"] = false; + if (blueSprite.HasComponent("Sprite")) + (Field)blueSprite["Sprite"]["Visible"] = false; + + if (redText.HasComponent("Text")) + (Field)redText["Text"]["Visible"] = false; + if (blueText.HasComponent("Text")) + (Field)blueText["Text"]["Visible"] = false; + } + } + + + return 1; +} diff --git a/src/Game/Systems/FadeSystem.cpp b/src/Game/Systems/FadeSystem.cpp new file mode 100644 index 00000000..f0e83eb5 --- /dev/null +++ b/src/Game/Systems/FadeSystem.cpp @@ -0,0 +1,49 @@ +#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; + } + + if((bool)cFade["Reverse"]) { + dTime *= 2; + } + + double fadeTime = cFade["FadeTime"]; + Field currentTime = cFade["Time"]; + currentTime += dTime; + + if(currentTime > fadeTime) { + 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 * (bool)cFade["Loop"]; + if ((bool)cFade["Reverse"]) { + (Field)cFade["Out"] = !(bool)cFade["Out"]; + currentTime = 0.0; + } + } + double ratio = currentTime/fadeTime; + + if(entity.HasComponent("Model")){ + ((Field)entity["Model"]["Color"]).w(ratio); + } + if (entity.HasComponent("Sprite")) { + ((Field)entity["Sprite"]["Color"]).w(ratio); + + } +} \ No newline at end of file diff --git a/src/Game/Systems/HealthHUDSystem.cpp b/src/Game/Systems/HealthHUDSystem.cpp index cd8a428f..70ccf465 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"]["MaxHealth"]; 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"]["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; 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; } 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; } 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; diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index af7403fe..d2a8594a 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,21 +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.075f) { 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; @@ -46,20 +83,28 @@ void PlayerMovementSystem::Update(double dt) if (!playerModel.HasComponent("Model")) { continue; } - if (!playerModel.HasComponent("Animation")) { - continue; + EntityWrapper dashEffect = playerModel.Clone(); + for (auto& cAnim : dashEffect.ChildrenWithComponent("Animation")) { + cAnim["Animation"]["Play"] = false; } - 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"]; + 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"] = fadeTime; + e["Fade"]["Time"] = fadeTime; + e["Lifetime"]["Lifetime"] = fadeTime; + } + dashEffect.AttachComponent("Lifetime"); + dashEffect.AttachComponent("Fade"); + dashEffect["Fade"]["Loop"] = false; + 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"]; } } } @@ -82,17 +127,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()); - (Field)aimPrimaryEntity["Animation"]["Time"] = time; - } - } + setAim(playerModel, "SidearmWeapon", time); + setAim(playerModel, "AssaultWeapon", time); + setAim(playerModel, "DefenderWeapon", time); } } @@ -314,6 +357,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")) { + (Field)aim["Animation"]["Time"] = time; + } + } + } + } + } +} + void PlayerMovementSystem::playerStep(double dt, EntityWrapper player) { // Position of the local player, used see how far a player has moved. @@ -373,17 +435,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()) { 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")) { diff --git a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp index a513c145..b58cf158 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) { @@ -36,8 +37,11 @@ void AssaultWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& Field magSize = cWeapon["MagazineSize"]; Field 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; @@ -74,7 +78,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()) { (Field)blend["Blend"]["Weight"] = animationWeight; } @@ -166,6 +170,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) @@ -216,16 +228,25 @@ void AssaultWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi } // Tracer - EntityWrapper tracerSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzle"); + EntityWrapper tracerSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzleRay"); if (tracerSpawner.Valid()) { glm::vec3 origin = TransformSystem::AbsolutePosition(tracerSpawner); glm::vec3 direction = glm::quat(TransformSystem::AbsoluteOrientationEuler(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()) { ((Field)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()) { + ((Field)flash["Transform"]["Orientation"]).z(randomSpreadAngle(m_RandomEngine)); + } + } // Deal damage if (dealDamage(cWeapon, wi)) { @@ -239,6 +260,25 @@ void AssaultWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi m_EventBroker->Publish(e); } } + + // 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; + } + } + } // Play animation playAnimationAndReturn(wi.FirstPersonEntity, "ActionBlend", "Fire"); @@ -321,3 +361,149 @@ 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()) { + 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; + } + } + } + } + } + } + } +} + diff --git a/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp b/src/Game/Systems/Weapon/DefenderWeaponBehaviour.cpp index 1739e795..945c6071 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); @@ -37,6 +38,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); + } + } } @@ -92,7 +103,7 @@ void DefenderWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) } double reloadTime = cWeapon["ReloadTime"]; - Field reloadTimer = cWeapon["ReloadTimer"]; + Field reloadTimer = cWeapon["ReloadTimer"]; // Start reload isReloading = true; @@ -114,6 +125,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) @@ -132,27 +153,81 @@ 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")) { + (Field)wi.Player["ShieldAbility"]["Active"] = true; + } + } + if (IsServer) { 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); } } } } else { attachment.DeleteChildren(); + if (wi.Player.Valid()) { + if (wi.Player.HasComponent("ShieldAbility")) { + (Field)wi.Player["ShieldAbility"]["Active"] = false; + } + } + if (IsClient) { EntityWrapper root = wi.FirstPersonEntity; if (root.Valid()) { @@ -166,6 +241,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 +269,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"]; @@ -190,19 +297,31 @@ 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); + + // Spawn tracers + spawnTracers(cWeapon, wi, pattern); // View punch if (IsClient) { @@ -210,7 +329,7 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi if (camera.Valid()) { Field cameraOrientation = camera["Transform"]["Orientation"]; float viewPunch = cWeapon["ViewPunch"]; - float maxTravelAngle = cWeapon["MaxTravelAngle"]; + float maxTravelAngle = (const float&)cWeapon["MaxTravelAngle"]; Field currentTravel = cWeapon["CurrentTravel"]; if (currentTravel < maxTravelAngle) { float change = viewPunch; @@ -223,37 +342,9 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi } } - // Tracers - EntityWrapper weaponModelEntity; - if (wi.Player == LocalPlayer) { - weaponModelEntity = wi.FirstPersonEntity; - } else { - weaponModelEntity = wi.ThirdPersonEntity; - } - if (weaponModelEntity.Valid()) { - EntityWrapper spawner = weaponModelEntity.FirstChildByName("WeaponMuzzle"); - Events::PlaySoundOnEntity e; - e.Emitter = weaponModelEntity; - e.FilePath = "Audio/weapon/Shotgun/ShotgunFire.wav"; - e.Gain = 1.f; - if (IsClient) { - m_EventBroker->Publish(e); - } - for (auto& angles : pelletAngles) { - glm::vec3 direction = TransformSystem::AbsoluteOrientation(spawner) * glm::quat(glm::vec3(angles, 0.f)) * glm::vec3(0, 0, -1); - float distance = traceRayDistance(TransformSystem::AbsolutePosition(spawner), direction); - EntityWrapper ray = SpawnerSystem::Spawn(spawner); - ((Field)ray["Transform"]["Scale"]).z(distance / 100.f); - Field orientation = ray["Transform"]["Orientation"]; - orientation.x(orientation.x() + angles.x); - orientation.y(orientation.y() + angles.y); - glm::vec3 trajectory = direction * distance; - dealDamage(cWeapon, wi, direction, pelletDamage); - } - } - // Play animation playAnimationAndReturn(wi.FirstPersonEntity, "FinalBlend", "Fire"); + playAnimationAndReturn(wi.ThirdPersonPlayerModel, "FinalBlend", "Fire"); // Sound Events::PlaySoundOnEntity e; @@ -262,7 +353,63 @@ 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::spawnTracers(ComponentWrapper cWeapon, WeaponInfo& wi, std::vector pattern) +{ + 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()) { + ((Field)flash["Transform"]["Orientation"]).z(randomSpreadAngle(m_RandomEngine)); + } + } + + EntityWrapper muzzle = getRelevantWeaponEntity(wi).FirstChildByName("WeaponMuzzleRay"); + if (!muzzle.Valid()) { + 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(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; + glm::vec3 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"]; + Field rayOrigin = cTransform["Position"]; + Field rayOrientation = cTransform["Orientation"]; + Field rayScale = cTransform["Scale"]; + + glm::vec3 muzzlePosition = TransformSystem::AbsolutePosition(muzzle); + glm::quat muzzleOrientation = TransformSystem::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.x(glm::length(muzzleToHit)); + } + } + } +} + +void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, const std::vector& pattern) { // Only deal damage client side if (!IsClient) { @@ -278,47 +425,76 @@ 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 = TransformSystem::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 = (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 * (glm::tan(spreadAngle) * (farClip - nearClip)) * glm::pi(); // ????? Good enough???? + + LOG_DEBUG("Ratio: %f", yRatio); + LOG_DEBUG("fatClip: %f", farClip); + LOG_DEBUG("yMax: %f", yMax); + 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); + (Field)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; + ((Field)hit["Model"]["Color"]).z(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) @@ -343,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; + } + } + } + } + } + } + } +} diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index 179d5bc7..57534786 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -14,6 +14,76 @@ 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 + Field magAmmo = cWeapon["MagazineAmmo"]; + if (m_ConfigAutoReload && magAmmo <= 0) { + OnReload(cWeapon, wi); + } + + // Only start reloading once we're done firing + Field reloadQueued = cWeapon["ReloadQueued"]; + Field fireCooldown = cWeapon["FireCooldown"]; + Field isReloading = cWeapon["IsReloading"]; + if (reloadQueued && fireCooldown <= 0) { + reloadQueued = fireCooldown; + isReloading = true; + } + + // Decrement reload timer + Field reloadTimer = cWeapon["ReloadTimer"]; + if (isReloading) { + reloadTimer = glm::max(0.0, reloadTimer - dt); + } + + // Handle reloading + if (isReloading && reloadTimer <= 0.0) { + Field 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("MovementBlendSidearm"); + if (blend.Valid()) { + (Field)blend["Blend"]["Weight"] = animationWeight; + } + } + + // 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); } @@ -32,9 +102,78 @@ void SidearmWeaponBehaviour::OnCeasePrimaryFire(ComponentWrapper cWeapon, Weapon cWeapon["TriggerHeld"] = false; } + +void SidearmWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) +{ + Field reloadQueued = cWeapon["ReloadQueued"]; + Field isReloading = cWeapon["IsReloading"]; + if (reloadQueued || isReloading) { + return; + } + + Field magAmmo = cWeapon["MagazineAmmo"]; + Field magSize = cWeapon["MagazineSize"]; + if (magAmmo >= magSize) { + return; + } + + double reloadTime = cWeapon["ReloadTime"]; + Field 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.Emitter = wi.Player; + e.FilePath = "Audio/weapon/Assault/AssaultWeaponReload.wav"; + m_EventBroker->Publish(e); +} + 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) @@ -51,27 +190,388 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi { cWeapon["FireCooldown"] = 60.0 / (double)cWeapon["RPM"]; + // Ammo + Field magAmmo = cWeapon["MagazineAmmo"]; + if (magAmmo <= 0) { + return; + } else { + 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()) { return; } - // Tracer - EntityWrapper tracerSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzle"); + //Tracer + EntityWrapper tracerSpawner = weaponModelEntity.FirstChildByName("WeaponMuzzleRay"); if (tracerSpawner.Valid()) { 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); - ((Field)ray["Transform"]["Scale"]).z(distance / 100.f); + EntityWrapper ray = SpawnerSystem::Spawn(tracerSpawner, tracerSpawner); + if (ray.Valid()) { + ((Field)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()){ + ((Field)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.Emitter = wi.Player; + e.FilePath = "Audio/weapon/hitclick.wav"; + m_EventBroker->Publish(e); + } + } + + + // 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); } } bool SidearmWeaponBehaviour::canFire(ComponentWrapper cWeapon) { bool triggerHeld = cWeapon["TriggerHeld"]; - Field 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; + + 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); + } + } + } + } + + spawnTracer(cWeapon, wi); + + // Deal damage! + Events::PlayerDamage ePlayerDamage; + ePlayerDamage.Inflictor = wi.Player; + ePlayerDamage.Victim = victim; + ePlayerDamage.Damage = damage; + m_EventBroker->Publish(ePlayerDamage); + + 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 = TransformSystem::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"]; + Field rayOrigin = cTransform["Position"]; + Field rayOrientation = cTransform["Orientation"]; + Field rayScale = cTransform["Scale"]; + + glm::vec3 muzzlePosition = TransformSystem::AbsolutePosition(muzzle); + glm::quat muzzleOrientation = TransformSystem::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) +{ + 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 = wi.FirstPersonEntity.FirstChildByName("AmmoShareEffectSpawner"); + if(effectSpawner.Valid()) { + if (effectSpawner.HasComponent("Spawner")) { + SpawnerSystem::Spawn(effectSpawner, effectSpawner); + } + } + } +}*/ + +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; + 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()) { + + auto children = m_World->GetDirectChildren(friendlyAmmoHudSpawner.ID); + + if (children.first == children.second) { + 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")) { + (Field)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + } + } + + EntityWrapper ammoTextEntity = friendlyAmmoHud.FirstChildByName("Ammo"); + if (ammoTextEntity.Valid()) { + if (ammoTextEntity.HasComponent("Text")) { + (Field)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + } + } + } + } + } else { + EntityWrapper textEntity = friendlyAmmoHudSpawner.FirstChildByName("MagazineAmmo"); + if (textEntity.Valid()) { + if (textEntity.HasComponent("Text")) { + (Field)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + } + } + + EntityWrapper ammoTextEntity = friendlyAmmoHudSpawner.FirstChildByName("Ammo"); + if (ammoTextEntity.Valid()) { + if (ammoTextEntity.HasComponent("Text")) { + (Field)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + } + } + } + } + } +} + +void SidearmWeaponBehaviour::RemoveFrindlyAmmoHUD(WeaponInfo& wi) +{ + EntityWrapper friendlyAmmoHudSpawner = wi.FirstPersonPlayerModel.FirstChildByName("FriendlyAmmoAttachment"); + if (friendlyAmmoHudSpawner.Valid()) { + friendlyAmmoHudSpawner.DeleteChildren(); + } +}