Viewpunch for sidearm and defender
This commit is contained in:
@@ -10,8 +10,8 @@
|
|||||||
<MaxTravelAngle>0.174533</MaxTravelAngle> <!-- 0.174533 = 10 degrees -->
|
<MaxTravelAngle>0.174533</MaxTravelAngle> <!-- 0.174533 = 10 degrees -->
|
||||||
<NumPellets>9</NumPellets>
|
<NumPellets>9</NumPellets>
|
||||||
<RPM>120</RPM>
|
<RPM>120</RPM>
|
||||||
<ViewPunch>0.03</ViewPunch>
|
<ViewPunch>0.15</ViewPunch>
|
||||||
<ViewReturnSpeed>0.2</ViewReturnSpeed>
|
<ViewReturnSpeed>0.3</ViewReturnSpeed>
|
||||||
<ReloadTime>0.5</ReloadTime>
|
<ReloadTime>0.5</ReloadTime>
|
||||||
<TriggerHeld>false</TriggerHeld>
|
<TriggerHeld>false</TriggerHeld>
|
||||||
<FireCooldown>0</FireCooldown>
|
<FireCooldown>0</FireCooldown>
|
||||||
|
|||||||
@@ -6,7 +6,9 @@
|
|||||||
<BaseDamage>20</BaseDamage>
|
<BaseDamage>20</BaseDamage>
|
||||||
<RPM>500</RPM>
|
<RPM>500</RPM>
|
||||||
<Automatic>false</Automatic>
|
<Automatic>false</Automatic>
|
||||||
<ViewPunch>0.01</ViewPunch>
|
<ViewPunch>0.05</ViewPunch>
|
||||||
|
<MaxTravelAngle>0.174533</MaxTravelAngle> <!-- 0.174533 = 10 degrees -->
|
||||||
|
<ViewReturnSpeed>0.2</ViewReturnSpeed>
|
||||||
<ReloadTime>1.0</ReloadTime>
|
<ReloadTime>1.0</ReloadTime>
|
||||||
<EquipTime>0.5</EquipTime>
|
<EquipTime>0.5</EquipTime>
|
||||||
<TriggerHeld>false</TriggerHeld>
|
<TriggerHeld>false</TriggerHeld>
|
||||||
@@ -14,4 +16,5 @@
|
|||||||
<ReloadQueued>false</ReloadQueued>
|
<ReloadQueued>false</ReloadQueued>
|
||||||
<IsReloading>false</IsReloading>
|
<IsReloading>false</IsReloading>
|
||||||
<ReloadTimer>0</ReloadTimer>
|
<ReloadTimer>0</ReloadTimer>
|
||||||
|
<CurrentTravel>0</CurrentTravel>
|
||||||
</SidearmWeapon>
|
</SidearmWeapon>
|
||||||
@@ -36,6 +36,12 @@
|
|||||||
<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="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="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>
|
||||||
@@ -47,6 +53,7 @@
|
|||||||
<xs:element name="ReloadQueued" type="t:bool" minOccurs="0"/>
|
<xs:element name="ReloadQueued" type="t:bool" 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>
|
||||||
|
|||||||
@@ -324,23 +324,23 @@ void DefenderWeaponBehaviour::fireShell(ComponentWrapper cWeapon, WeaponInfo& wi
|
|||||||
spawnTracers(cWeapon, wi, pattern);
|
spawnTracers(cWeapon, wi, pattern);
|
||||||
|
|
||||||
// View punch
|
// View punch
|
||||||
//if (IsClient) {
|
if (IsClient) {
|
||||||
// EntityWrapper camera = wi.Player.FirstChildByName("Camera");
|
EntityWrapper camera = wi.Player.FirstChildByName("Camera");
|
||||||
// if (camera.Valid()) {
|
if (camera.Valid()) {
|
||||||
// glm::vec3& cameraOrientation = camera["Transform"]["Orientation"];
|
Field<glm::vec3> cameraOrientation = camera["Transform"]["Orientation"];
|
||||||
// float viewPunch = cWeapon["ViewPunch"];
|
float viewPunch = cWeapon["ViewPunch"];
|
||||||
// float maxTravelAngle = cWeapon["MaxTravelAngle"];
|
float maxTravelAngle = (const float&)cWeapon["MaxTravelAngle"];
|
||||||
// float& currentTravel = cWeapon["CurrentTravel"];
|
Field<float> currentTravel = cWeapon["CurrentTravel"];
|
||||||
// if (currentTravel < maxTravelAngle) {
|
if (currentTravel < maxTravelAngle) {
|
||||||
// float change = viewPunch;
|
float change = viewPunch;
|
||||||
// if (currentTravel + change > maxTravelAngle) {
|
if (currentTravel + change > maxTravelAngle) {
|
||||||
// change = maxTravelAngle - currentTravel;
|
change = maxTravelAngle - currentTravel;
|
||||||
// }
|
}
|
||||||
// cameraOrientation.x += change;
|
cameraOrientation.x(cameraOrientation.x() + change);
|
||||||
// currentTravel += change;
|
currentTravel += change;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
|
|
||||||
// Play animation
|
// Play animation
|
||||||
playAnimationAndReturn(wi.FirstPersonEntity, "FinalBlend", "Fire");
|
playAnimationAndReturn(wi.FirstPersonEntity, "FinalBlend", "Fire");
|
||||||
|
|||||||
@@ -69,6 +69,21 @@ void SidearmWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo&
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Restore view angle
|
||||||
|
if (IsClient) {
|
||||||
|
Field<float> currentTravel = cWeapon["CurrentTravel"];
|
||||||
|
Field<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()) {
|
||||||
|
Field<glm::vec3> cameraOrientation = camera["Transform"]["Orientation"];
|
||||||
|
cameraOrientation.x(cameraOrientation.x() - change);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((bool)cWeapon["Automatic"] && canFire(cWeapon)) {
|
if ((bool)cWeapon["Automatic"] && canFire(cWeapon)) {
|
||||||
fireBullet(cWeapon, wi);
|
fireBullet(cWeapon, wi);
|
||||||
}
|
}
|
||||||
@@ -183,6 +198,25 @@ void SidearmWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi
|
|||||||
magAmmo -= 1;
|
magAmmo -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// View punch
|
||||||
|
if (IsClient) {
|
||||||
|
EntityWrapper camera = wi.Player.FirstChildByName("Camera");
|
||||||
|
if (camera.Valid()) {
|
||||||
|
Field<glm::vec3> cameraOrientation = camera["Transform"]["Orientation"];
|
||||||
|
float viewPunch = cWeapon["ViewPunch"];
|
||||||
|
float maxTravelAngle = cWeapon["MaxTravelAngle"];
|
||||||
|
Field<float> 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
|
// Get weapon model based on current person
|
||||||
EntityWrapper weaponModelEntity = getRelevantWeaponEntity(wi);
|
EntityWrapper weaponModelEntity = getRelevantWeaponEntity(wi);
|
||||||
if (!weaponModelEntity.Valid()) {
|
if (!weaponModelEntity.Valid()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user