From c1d79c7dd2b58a5402b0ce7b5bd980e9ef7d7a7f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 6 Apr 2023 14:52:53 +0800 Subject: [PATCH] 1 --- server/gameserver/bullet.h | 1 + server/gameserver/collision.cc | 8 +++++--- server/gameserver/mt/Hero.cc | 10 ++++++++++ server/gameserver/types.h | 1 + server/gameserver/virtualbullet.h | 1 + 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index c71074a9..8b5696bd 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -45,6 +45,7 @@ class Bullet : public MoveableEntity, public IBullet void TriggerHitBuff(Entity* e); bool IsFlyHook(); + virtual const glm::vec3& GetDir() override { return dir; }; virtual float GetStrengthenWall() override { return strengthen_wall; }; virtual long long GetWeaponUniId() override { return weapon_uniid; }; virtual const mt::Skill* GetSkillMeta() override {return skill_meta; }; diff --git a/server/gameserver/collision.cc b/server/gameserver/collision.cc index a734cc3a..1c4a26e2 100644 --- a/server/gameserver/collision.cc +++ b/server/gameserver/collision.cc @@ -14,15 +14,17 @@ bool Collision::CheckBullet(IBullet* bullet, Creature* c) { + glm::vec3 bullet_real_pos = bullet->GetPos().ToGlmVec3() - bullet->GetDir() * bullet->GetHitRadius(); return a8::IntersectCylinderCylinder ( - bullet->GetPos().ToGlmVec3(), bullet->GetHitRadius() * 1.0, 10, + bullet_real_pos, bullet->GetHitRadius() * 1.0, 10, c->GetPos().ToGlmVec3(), c->GetHitRadius(), 10 ); } bool Collision::CheckBullet(IBullet* bullet, Entity* e) { + glm::vec3 bullet_real_pos = bullet->GetPos().ToGlmVec3() - bullet->GetDir() * bullet->GetHitRadius(); if (e->IsEntityType(ET_Obstacle) && ((Obstacle*)e)->IsRoomObstacle()) { RoomObstacle* ob = (RoomObstacle*)e; float distance = std::fabs(bullet->GetPos().GetX() - e->GetPos().GetX()) + std::fabs(bullet->GetPos().GetZ() - e->GetPos().GetZ()); @@ -33,13 +35,13 @@ bool Collision::CheckBullet(IBullet* bullet, Entity* e) auto wobj = ob->init_args->Get>(0); return a8::IntersectCylinderCylinder ( - bullet->GetPos().ToGlmVec3(), bullet->GetHitRadius() * 0.6, 10, + bullet_real_pos, bullet->GetHitRadius() * 1.0, 10, e->GetPos().ToGlmVec3(), std::max(wobj->size.x/2.0f, wobj->size.z/2.0f), 10 ); } else { return a8::IntersectCylinderCylinder ( - bullet->GetPos().ToGlmVec3(), bullet->GetHitRadius() * 0.6, 10, + bullet_real_pos, bullet->GetHitRadius() * 1.0, 10, e->GetPos().ToGlmVec3(), ob->meta->width(), 10 ); } diff --git a/server/gameserver/mt/Hero.cc b/server/gameserver/mt/Hero.cc index c7eb6ce4..5a216eb6 100644 --- a/server/gameserver/mt/Hero.cc +++ b/server/gameserver/mt/Hero.cc @@ -152,6 +152,16 @@ namespace mt int hero_id = a8::XValue(key); std::vector keys2; hero_xobj->GetKeys(keys2); + #if 1 + { + const mt::Hero* hero_meta = Hero::GetById(hero_id); + if (hero_meta) { + mt::Hero* mut_hero_meta = (mt::Hero*)hero_meta; + auto size_xobj = hero_xobj->At("size"); + mut_hero_meta->hit_radius_ = size_xobj->At("radius")->AsXValue().GetDouble() * 10; + } + } + #endif for (auto& key2 : keys2) { auto anim_xobj = hero_xobj->At(key2); diff --git a/server/gameserver/types.h b/server/gameserver/types.h index eb0aac8e..2218bab0 100644 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -79,6 +79,7 @@ class IBullet { public: virtual const Position& GetPos() = 0; + virtual const glm::vec3& GetDir() = 0; virtual float GetStrengthenWall() = 0; virtual long long GetWeaponUniId() = 0; virtual const mt::Skill* GetSkillMeta() = 0; diff --git a/server/gameserver/virtualbullet.h b/server/gameserver/virtualbullet.h index 4e0973a9..98b573b9 100644 --- a/server/gameserver/virtualbullet.h +++ b/server/gameserver/virtualbullet.h @@ -21,6 +21,7 @@ class VirtualBullet : public IBullet, public ITask glm::vec3 born_dir = GlmHelper::ZERO; float strengthen_wall = 0; + virtual const glm::vec3& GetDir() override { return dir; }; virtual float GetStrengthenWall() override; virtual long long GetWeaponUniId() override; virtual const mt::Skill* GetSkillMeta() override;