DefenderWeapon view punch and crosshair travel with return
This commit is contained in:
+1
-1
Submodule assets updated: 72530423ad...b8baf48e5e
@@ -1,6 +1,7 @@
|
|||||||
#include "WeaponBehaviour.h"
|
#include "WeaponBehaviour.h"
|
||||||
#include "Collision/Collision.h"
|
#include "Collision/Collision.h"
|
||||||
#include "Core/EPlayerDamage.h"
|
#include "Core/EPlayerDamage.h"
|
||||||
|
#include "Sound/EPlaySoundOnEntity.h"
|
||||||
|
|
||||||
class DefenderWeaponBehaviour : public WeaponBehaviour<DefenderWeaponBehaviour>
|
class DefenderWeaponBehaviour : public WeaponBehaviour<DefenderWeaponBehaviour>
|
||||||
{
|
{
|
||||||
@@ -16,6 +17,7 @@ public:
|
|||||||
void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
|
void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
|
||||||
void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
|
void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
|
||||||
void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) override;
|
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;
|
bool OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -6,13 +6,16 @@
|
|||||||
<MaxAmmo>64</MaxAmmo>
|
<MaxAmmo>64</MaxAmmo>
|
||||||
<BaseDamage>90</BaseDamage>
|
<BaseDamage>90</BaseDamage>
|
||||||
<SpreadAngle>0.174533</SpreadAngle> <!-- 0.174533 = 10 degrees -->
|
<SpreadAngle>0.174533</SpreadAngle> <!-- 0.174533 = 10 degrees -->
|
||||||
|
<MaxTravelAngle>0.174533</MaxTravelAngle> <!-- 0.174533 = 10 degrees -->
|
||||||
<NumPellets>10</NumPellets>
|
<NumPellets>10</NumPellets>
|
||||||
<RPM>120</RPM>
|
<RPM>120</RPM>
|
||||||
<ViewPunch>0.01</ViewPunch>
|
<ViewPunch>0.03</ViewPunch>
|
||||||
|
<ViewReturnSpeed>0.2</ViewReturnSpeed>
|
||||||
<ReloadTime>0.5</ReloadTime>
|
<ReloadTime>0.5</ReloadTime>
|
||||||
<Slot><Primary/></Slot>
|
<Slot><Primary/></Slot>
|
||||||
<TriggerHeld>false</TriggerHeld>
|
<TriggerHeld>false</TriggerHeld>
|
||||||
<FireCooldown>0</FireCooldown>
|
<FireCooldown>0</FireCooldown>
|
||||||
<IsReloading>false</IsReloading>
|
<IsReloading>false</IsReloading>
|
||||||
<ReloadTimer>0</ReloadTimer>
|
<ReloadTimer>0</ReloadTimer>
|
||||||
|
<CurrentTravel>0</CurrentTravel>
|
||||||
</DefenderWeapon>
|
</DefenderWeapon>
|
||||||
@@ -37,6 +37,9 @@
|
|||||||
<xs:element name="SpreadAngle" type="t:float" minOccurs="0">
|
<xs:element name="SpreadAngle" type="t:float" minOccurs="0">
|
||||||
<xs:annotation><xs:documentation>Spread angle in radians</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>Spread angle in radians</xs:documentation></xs:annotation>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
<xs:element name="MaxTravelAngle" type="t:float" minOccurs="0">
|
||||||
|
<xs:annotation><xs:documentation>Maximum vertical aim travel angle in radians</xs:documentation></xs:annotation>
|
||||||
|
</xs:element>
|
||||||
<xs:element name="NumPellets" type="t:int" minOccurs="0"/>
|
<xs:element name="NumPellets" type="t:int" minOccurs="0"/>
|
||||||
<xs:element name="RPM" type="t:double" minOccurs="0">
|
<xs:element name="RPM" type="t:double" minOccurs="0">
|
||||||
<xs:annotation><xs:documentation>Rate of fire in rounds per minute</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>Rate of fire in rounds per minute</xs:documentation></xs:annotation>
|
||||||
@@ -44,6 +47,9 @@
|
|||||||
<xs:element name="ViewPunch" type="t:float" minOccurs="0">
|
<xs:element name="ViewPunch" type="t:float" minOccurs="0">
|
||||||
<xs:annotation><xs:documentation>View punch in radians for each shell fired</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>View punch in radians for each shell fired</xs:documentation></xs:annotation>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
<xs:element name="ViewReturnSpeed" type="t:float" minOccurs="0">
|
||||||
|
<xs:annotation><xs:documentation>The speed in radians per second the view returns to its original position after being punched</xs:documentation></xs:annotation>
|
||||||
|
</xs:element>
|
||||||
<xs:element name="ReloadTime" type="t:double" minOccurs="0">
|
<xs:element name="ReloadTime" type="t:double" minOccurs="0">
|
||||||
<xs:annotation><xs:documentation>Time it takes to load ONE SHELL into the weapon in seconds</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>Time it takes to load ONE SHELL into the weapon in seconds</xs:documentation></xs:annotation>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
@@ -52,6 +58,7 @@
|
|||||||
<xs:element name="FireCooldown" type="t:double" minOccurs="0"/>
|
<xs:element name="FireCooldown" type="t:double" minOccurs="0"/>
|
||||||
<xs:element name="IsReloading" type="t:bool" minOccurs="0"/>
|
<xs:element name="IsReloading" type="t:bool" minOccurs="0"/>
|
||||||
<xs:element name="ReloadTimer" type="t:double" minOccurs="0"/>
|
<xs:element name="ReloadTimer" type="t:double" minOccurs="0"/>
|
||||||
|
<xs:element name="CurrentTravel" type="t:float" minOccurs="0"/>
|
||||||
</xs:all>
|
</xs:all>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:SpawnPoint/>
|
<c:SpawnPoint/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/Characters/Assault/AssaultTPose.mesh</Resource>
|
<Resource>Models/Characters/Assault/AssaultRed.mesh</Resource>
|
||||||
<Color A="1" B="0" G="0" R="1"/>
|
<Color A="1" B="0" G="0" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:SpawnPoint/>
|
<c:SpawnPoint/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/Characters/Assault/AssaultTPose.mesh</Resource>
|
<Resource>Models/Characters/Assault/AssaultRed.mesh</Resource>
|
||||||
<Color A="1" B="0.0117647061" G="0" R="1"/>
|
<Color A="1" B="0.0117647061" G="0" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
@@ -94,11 +94,11 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:SpawnPoint/>
|
<c:SpawnPoint/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/Characters/Assault/AssaultTPose.mesh</Resource>
|
<Resource>Models/Characters/Assault/AssaultBlue.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.254901975" R="0"/>
|
<Color A="1" B="1" G="0.254901975" R="0"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="0.800000012" Y="0" Z="0"/>
|
<Position X="-0.600000024" Y="0" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
@@ -107,11 +107,11 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:SpawnPoint/>
|
<c:SpawnPoint/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/Characters/Assault/AssaultTPose.mesh</Resource>
|
<Resource>Models/Characters/Assault/AssaultBlue.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.254901975" R="0"/>
|
<Color A="1" B="1" G="0.254901975" R="0"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="-0.600000024" Y="0" Z="0"/>
|
<Position X="0.800000012" Y="0" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
|
|||||||
@@ -458,7 +458,7 @@
|
|||||||
<AnimationName3></AnimationName3>
|
<AnimationName3></AnimationName3>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/Characters/Assault/FirstPerson.mesh</Resource>
|
<Resource>Models/Characters/Assault/Test/FirstPerson.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.309803933" R="0"/>
|
<Color A="1" B="1" G="0.309803933" R="0"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -524,8 +524,7 @@
|
|||||||
<Entity name="PlayerModel">
|
<Entity name="PlayerModel">
|
||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName1>Idle</AnimationName1>
|
<AnimationName1>IdleF</AnimationName1>
|
||||||
<Time1>0.013134522267137072</Time1>
|
|
||||||
<Speed1>1</Speed1>
|
<Speed1>1</Speed1>
|
||||||
<AnimationName2></AnimationName2>
|
<AnimationName2></AnimationName2>
|
||||||
<AnimationName3></AnimationName3>
|
<AnimationName3></AnimationName3>
|
||||||
@@ -537,8 +536,8 @@
|
|||||||
<c:Shielded/>
|
<c:Shielded/>
|
||||||
<c:HiddenForLocalPlayer/>
|
<c:HiddenForLocalPlayer/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/Characters/Assault/AssaultAnimations.mesh</Resource>
|
<Resource>Models/Characters/Assault/AssaultBlue.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.309803933" R="0"/>
|
<Color A="1" B="1" G="0.952941179" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -573,8 +572,8 @@
|
|||||||
<EntityFile>Schema/Entities/SidearmWeaponWorld.xml</EntityFile>
|
<EntityFile>Schema/Entities/SidearmWeaponWorld.xml</EntityFile>
|
||||||
</c:Spawner>
|
</c:Spawner>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="0.156846598" Y="1.03287792" Z="-0.216207206"/>
|
<Position X="0.15691258" Y="1.04389966" Z="-0.213815808"/>
|
||||||
<Orientation X="-0.0626498386" Y="-0.0301200207" Z="0.12067578"/>
|
<Orientation X="-0.00425229501" Y="-0.0330814682" Z="0.137528151"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
|
|||||||
@@ -10,9 +10,11 @@ void DefenderWeaponBehaviour::UpdateComponent(EntityWrapper& entity, ComponentWr
|
|||||||
|
|
||||||
void DefenderWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt)
|
void DefenderWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt)
|
||||||
{
|
{
|
||||||
|
// Decrement reload timer
|
||||||
double& reloadTimer = cWeapon["ReloadTimer"];
|
double& reloadTimer = cWeapon["ReloadTimer"];
|
||||||
reloadTimer = glm::max(0.0, reloadTimer - dt);
|
reloadTimer = glm::max(0.0, reloadTimer - dt);
|
||||||
|
|
||||||
|
// Handle reloading
|
||||||
double reloadTime = cWeapon["ReloadTime"];
|
double reloadTime = cWeapon["ReloadTime"];
|
||||||
bool& isReloading = cWeapon["IsReloading"];
|
bool& isReloading = cWeapon["IsReloading"];
|
||||||
if (isReloading && reloadTimer <= 0.0) {
|
if (isReloading && reloadTimer <= 0.0) {
|
||||||
@@ -23,11 +25,31 @@ void DefenderWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo&
|
|||||||
ammo -= 1;
|
ammo -= 1;
|
||||||
magAmmo += 1;
|
magAmmo += 1;
|
||||||
reloadTimer = reloadTime;
|
reloadTimer = reloadTime;
|
||||||
|
Events::PlaySoundOnEntity e;
|
||||||
|
e.EmitterID = wi.Player.ID;
|
||||||
|
e.FilePath = "Audio/weapon/Zoom.wav";
|
||||||
|
m_EventBroker->Publish(e);
|
||||||
} else {
|
} else {
|
||||||
isReloading = false;
|
isReloading = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Restore view angle
|
||||||
|
if (IsClient) {
|
||||||
|
float& currentTravel = cWeapon["CurrentTravel"];
|
||||||
|
float& returnSpeed = cWeapon["ViewReturnSpeed"];
|
||||||
|
if (currentTravel > 0) {
|
||||||
|
float change = returnSpeed * dt;
|
||||||
|
currentTravel = glm::max(0.f, currentTravel - change);
|
||||||
|
EntityWrapper camera = wi.Player.FirstChildByName("Camera");
|
||||||
|
if (camera.Valid()) {
|
||||||
|
glm::vec3& cameraOrientation = camera["Transform"]["Orientation"];
|
||||||
|
cameraOrientation.x -= change;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fire if we're able to fire
|
||||||
if (canFire(cWeapon, wi)) {
|
if (canFire(cWeapon, wi)) {
|
||||||
fireShell(cWeapon, wi);
|
fireShell(cWeapon, wi);
|
||||||
}
|
}
|
||||||
@@ -71,6 +93,16 @@ void DefenderWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi)
|
|||||||
reloadTimer = reloadTime;
|
reloadTimer = reloadTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DefenderWeaponBehaviour::OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi)
|
||||||
|
{
|
||||||
|
// Make sure the trigger is released if weapon is holstered while firing
|
||||||
|
cWeapon["TriggerHeld"] = false;
|
||||||
|
|
||||||
|
// Cancel any reload
|
||||||
|
cWeapon["IsReloading"] = false;
|
||||||
|
cWeapon["ReloadTimer"] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
bool DefenderWeaponBehaviour::OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e)
|
bool DefenderWeaponBehaviour::OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e)
|
||||||
{
|
{
|
||||||
if (e.Command == "SpecialAbility" && IsServer) {
|
if (e.Command == "SpecialAbility" && IsServer) {
|
||||||
@@ -114,11 +146,29 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi
|
|||||||
std::vector<glm::vec2> pelletAngles;
|
std::vector<glm::vec2> pelletAngles;
|
||||||
for (int i = 0; i < numPellets; i++) {
|
for (int i = 0; i < numPellets; i++) {
|
||||||
pelletAngles.push_back(glm::vec2(randomSpreadAngle(m_RandomEngine), randomSpreadAngle(m_RandomEngine)));
|
pelletAngles.push_back(glm::vec2(randomSpreadAngle(m_RandomEngine), randomSpreadAngle(m_RandomEngine)));
|
||||||
LOG_DEBUG("%f %f", pelletAngles[i].x, pelletAngles[i].y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double pelletDamage = (double)cWeapon["BaseDamage"] / numPellets;
|
double pelletDamage = (double)cWeapon["BaseDamage"] / numPellets;
|
||||||
|
|
||||||
|
// View punch
|
||||||
|
if (IsClient) {
|
||||||
|
EntityWrapper camera = wi.Player.FirstChildByName("Camera");
|
||||||
|
if (camera.Valid()) {
|
||||||
|
glm::vec3& cameraOrientation = camera["Transform"]["Orientation"];
|
||||||
|
float viewPunch = cWeapon["ViewPunch"];
|
||||||
|
float maxTravelAngle = cWeapon["MaxTravelAngle"];
|
||||||
|
float& currentTravel = cWeapon["CurrentTravel"];
|
||||||
|
if (currentTravel < maxTravelAngle) {
|
||||||
|
float change = viewPunch;
|
||||||
|
if (currentTravel + change > maxTravelAngle) {
|
||||||
|
change = maxTravelAngle - currentTravel;
|
||||||
|
}
|
||||||
|
cameraOrientation.x += change;
|
||||||
|
currentTravel += change;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Tracers
|
// Tracers
|
||||||
EntityWrapper weaponModelEntity;
|
EntityWrapper weaponModelEntity;
|
||||||
if (wi.Player == LocalPlayer) {
|
if (wi.Player == LocalPlayer) {
|
||||||
@@ -140,6 +190,12 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi
|
|||||||
dealDamage(cWeapon, wi, direction, pelletDamage);
|
dealDamage(cWeapon, wi, direction, pelletDamage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sound
|
||||||
|
Events::PlaySoundOnEntity e;
|
||||||
|
e.EmitterID = wi.Player.ID;
|
||||||
|
e.FilePath = "Audio/weapon/Blast.wav";
|
||||||
|
m_EventBroker->Publish(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, glm::vec3 direction, double damage)
|
void DefenderWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, glm::vec3 direction, double damage)
|
||||||
@@ -206,7 +262,6 @@ bool DefenderWeaponBehaviour::canFire(ComponentWrapper cWeapon, WeaponInfo& wi)
|
|||||||
bool triggerHeld = cWeapon["TriggerHeld"];
|
bool triggerHeld = cWeapon["TriggerHeld"];
|
||||||
bool cooldownPassed = (double)cWeapon["FireCooldown"] <= 0.0;
|
bool cooldownPassed = (double)cWeapon["FireCooldown"] <= 0.0;
|
||||||
bool isNotShielding = wi.Player.ChildrenWithComponent("Shield").size() == 0;
|
bool isNotShielding = wi.Player.ChildrenWithComponent("Shield").size() == 0;
|
||||||
// TODO: Ammo checks
|
|
||||||
return triggerHeld && cooldownPassed && isNotShielding;
|
return triggerHeld && cooldownPassed && isNotShielding;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,6 @@ void SidearmWeaponBehaviour::OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi)
|
|||||||
// Cancel any reload
|
// Cancel any reload
|
||||||
cWeapon["IsReloading"] = false;
|
cWeapon["IsReloading"] = false;
|
||||||
cWeapon["ReloadTimer"] = 0.0;
|
cWeapon["ReloadTimer"] = 0.0;
|
||||||
|
|
||||||
LOG_DEBUG("HOLSTER");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi)
|
void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi)
|
||||||
|
|||||||
Reference in New Issue
Block a user