1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-10-06 09:07:19 +02:00

Implement melee weapon damage

This commit is contained in:
Daniel Evans 2019-01-01 22:14:55 +00:00
parent 62637ccc29
commit c307a1c5e3
5 changed files with 32 additions and 8 deletions

View File

@ -700,7 +700,7 @@ bool Activities::UseItem::update(CharacterObject *character,
auto currentTime = animator->getAnimationTime(AnimIndexAction);
if (currentTime >= fireTime && !fired) {
/// @todo weapon hit here
Weapon::meleeHit(weapon, character);
fired = true;
}

View File

@ -23,6 +23,8 @@
#include "ai/PlayerController.hpp"
#include "ai/TrafficDirector.hpp"
#include "dynamics/HitTest.hpp"
#include "data/CutsceneData.hpp"
#include "data/InstanceData.hpp"
@ -566,12 +568,22 @@ void GameWorld::destroyEffect(VisualFX& effect) {
}
void GameWorld::doWeaponScan(const WeaponScan& scan) {
RW_CHECK(scan.type != WeaponScan::RADIUS,
"Radius scans not implemented yet");
if (scan.type == WeaponScan::RADIUS) {
// TODO
// Requires custom ConvexResultCallback
HitTest test {*dynamicsWorld};
const auto result = test.sphereTest(scan.center, scan.radius);
for(const auto& target : result) {
if (!scan.doesDamage(target.object)) {
continue;
}
GameObject::DamageInfo di;
di.damageSource = scan.center;
di.type = GameObject::DamageInfo::Melee;
di.hitpoints = scan.damage;
target.object->takeDamage(di);
}
} else if (scan.type == WeaponScan::HITSCAN) {
btVector3 from(scan.center.x, scan.center.y, scan.center.z),
to(scan.end.x, scan.end.y, scan.end.z);

View File

@ -22,7 +22,7 @@ void Weapon::fireHitscan(WeaponData* weapon, CharacterObject* owner) {
auto fireOrigin = glm::vec3(handMatrix[3]);
float dmg = static_cast<float>(weapon->damage);
owner->engine->doWeaponScan({dmg, fireOrigin, rayend, weapon});
owner->engine->doWeaponScan({dmg, fireOrigin, rayend, weapon, owner});
}
void Weapon::fireProjectile(WeaponData* weapon, CharacterObject* owner,
@ -49,3 +49,14 @@ void Weapon::fireProjectile(WeaponData* weapon, CharacterObject* owner,
pool.insert(std::move(projectile));
owner->engine->allObjects.push_back(ptr);
}
void Weapon::meleeHit(WeaponData* weapon, CharacterObject* character) {
const auto center = character->getPosition() + character->getRotation()
* weapon->fireOffset;
auto e = character->engine;
e->doWeaponScan({
static_cast<float>(weapon->damage),
center, weapon->meleeRadius, weapon,
character
});
}

View File

@ -57,6 +57,7 @@ struct WeaponScan {
namespace Weapon {
void fireProjectile(WeaponData* weapon, CharacterObject* character, float force);
void fireHitscan(WeaponData *weapon, CharacterObject* character);
void meleeHit(WeaponData *weapon, CharacterObject* character);
}
#endif

View File

@ -164,7 +164,7 @@ public:
}
struct DamageInfo {
enum DamageType { Explosion, Burning, Bullet, Physics };
enum DamageType { Explosion, Burning, Bullet, Physics, Melee };
/**
* World position of damage