diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index fc744a0..7fa25e0 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -884,8 +884,13 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) case kBET_FlashMove: { a8::Vec2 old_pos = GetPos(); - a8::Vec2 new_pos = GetPos() + skill_dir_ * skill_distance_; + a8::Vec2 new_pos = GetPos() + skill_dir_ * std::max(skill_distance_, 300.0f); SetPos(new_pos); + if (CollisonDetection()) { + SetPos(old_pos); + } else { + room->grid_service->MoveCreature(this); + } } break; default: @@ -1347,7 +1352,6 @@ RoomObstacle* Creature::SummonObstacle(int id, const a8::Vec2& pos) bool Creature::CollisonDetection() { - #if 0 if (room->OverBorder(GetPos(), GetRadius())){ return true; } @@ -1367,10 +1371,8 @@ bool Creature::CollisonDetection() { Obstacle* obstacle = (Obstacle*)collider->owner; if (!obstacle->IsDead(room) && - ( - (collider->type == CT_Aabb && aabb_box.Intersect((ColliderComponent*)collider)) || - (collider->type == CT_Circle && self_collider_->Intersect((ColliderComponent*)collider)) - )) { + (collider->type == CT_Aabb && aabb_box.Intersect((ColliderComponent*)collider)) + ) { return true; } } @@ -1378,10 +1380,7 @@ bool Creature::CollisonDetection() case ET_Building: { if ( - ( - (collider->type == CT_Aabb && aabb_box.Intersect((ColliderComponent*)collider)) || - (collider->type == CT_Circle && self_collider_->Intersect((ColliderComponent*)collider)) - ) + (collider->type == CT_Aabb && aabb_box.Intersect((ColliderComponent*)collider)) ) { return true; } @@ -1391,6 +1390,5 @@ bool Creature::CollisonDetection() break; } } - #endif return false; } diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index e246307..774bcf1 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -56,19 +56,6 @@ void Hero::Update(int delta_time) ++updated_times_; } -void Hero::GetAabbBox(AabbCollider& aabb_box) -{ - if (!meta) { - abort(); - } - aabb_box.active = true; - aabb_box.owner = this; - aabb_box._min.x = -meta->i->radius(); - aabb_box._min.y = -meta->i->radius(); - aabb_box._max.x = meta->i->radius(); - aabb_box._max.y = meta->i->radius(); -} - float Hero::GetSpeed() { float speed = meta->i->move_speed(); @@ -193,3 +180,34 @@ float Hero::GetRadius() { return meta->i->radius(); } + +float Hero::GetHitRadius() +{ + return meta->i->hit_radius(); +} + +void Hero::GetAabbBox(AabbCollider& aabb_box) +{ + if (!meta) { + abort(); + } + aabb_box.active = true; + aabb_box.owner = this; + aabb_box._min.x = -GetRadius(); + aabb_box._min.y = -GetRadius(); + aabb_box._max.x = GetRadius(); + aabb_box._max.y = GetRadius(); +} + +void Hero::GetHitAabbBox(AabbCollider& aabb_box) +{ + if (!meta) { + abort(); + } + aabb_box.active = true; + aabb_box.owner = this; + aabb_box._min.x = -GetHitRadius(); + aabb_box._min.y = -GetHitRadius(); + aabb_box._max.x = GetHitRadius(); + aabb_box._max.y = GetHitRadius(); +} diff --git a/server/gameserver/hero.h b/server/gameserver/hero.h index b6c4a48..98247dd 100644 --- a/server/gameserver/hero.h +++ b/server/gameserver/hero.h @@ -27,11 +27,12 @@ public: virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override; virtual void Update(int delta_time) override; - virtual void GetAabbBox(AabbCollider& aabb_box) override; virtual float GetSpeed() override; virtual float GetRadius() override; - + virtual float GetHitRadius() override; + virtual void GetAabbBox(AabbCollider& aabb_box) override; + virtual void GetHitAabbBox(AabbCollider& aabb_box) override; protected: virtual void _UpdateMove(int speed) override; void InternalUpdateMove(float speed);