From d145ffaa65d6483cc974a98cca35317f1decabce Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 2 Apr 2023 16:23:04 +0800 Subject: [PATCH] 1 --- server/gameserver/bullet.cc | 3 +++ server/gameserver/gridcell.cc | 18 ++++++++++++++++++ server/gameserver/gridcell.h | 5 +++++ server/gameserver/gridservice.cc | 13 +++++++++++++ server/gameserver/gridservice.h | 4 ++++ 5 files changed, 43 insertions(+) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 0652855d..f17553a5 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -1033,6 +1033,9 @@ void Bullet::ProcRequestBulletDmg(int shield_hit, int strength_wall_uniid, int t float distance = GlmHelper::Norm(GetPos().ToGlmVec3() - born_pos.ToGlmVec3()); BulletCheckResult result; result.flyed_distance = distance; + if (result.flyed_distance > gun_meta->range() * 5) { + return; + } if (trace_target_id) { if (trace_target_id == target_uniid) { diff --git a/server/gameserver/gridcell.cc b/server/gameserver/gridcell.cc index f2f9c062..9958e264 100644 --- a/server/gameserver/gridcell.cc +++ b/server/gameserver/gridcell.cc @@ -60,6 +60,18 @@ void GridCell::TraverseCreatures(std::function& func, --Global::Instance()->traversing_cell_creature_count; } +void GridCell::TraverseObstacles(std::function& func, + int room_idx, + bool& stop) +{ + for (Obstacle* ob : obstacles_[room_idx]) { + func(ob, stop); + if (stop) { + return; + } + } +} + void GridCell::AddPermanentEntity(Entity* entity) { entitys_[0].insert(entity); @@ -68,11 +80,17 @@ void GridCell::AddPermanentEntity(Entity* entity) void GridCell::AddRoomEntity(Room* room, Entity* entity) { entitys_[room->GetRoomIdx()].insert(entity); + if (entity->IsEntityType(ET_Obstacle)) { + obstacles_[room->GetRoomIdx()].insert((Obstacle*)entity); + } } void GridCell::RemoveRoomEntity(Room* room, Entity* entity) { entitys_[room->GetRoomIdx()].erase(entity); + if (entity->IsEntityType(ET_Obstacle)) { + obstacles_[room->GetRoomIdx()].erase((Obstacle*)entity); + } } bool GridCell::EntityExists(Room* room, Entity* entity) diff --git a/server/gameserver/gridcell.h b/server/gameserver/gridcell.h index 24f1e018..55d66351 100644 --- a/server/gameserver/gridcell.h +++ b/server/gameserver/gridcell.h @@ -1,6 +1,7 @@ #pragma once class Entity; +class Obstacle; class Human; class Room; class Creature; @@ -18,6 +19,9 @@ public: void TraverseCreatures(std::function& func, int room_idx, bool& stop); + void TraverseObstacles(std::function& func, + int room_idx, + bool& stop); void AddCreature(Creature* c); void RemoveCreature(Creature* c); @@ -37,5 +41,6 @@ public: private: std::vector> entitys_; + std::vector> obstacles_; std::vector> creatures_; }; diff --git a/server/gameserver/gridservice.cc b/server/gameserver/gridservice.cc index 8f3ff547..0fe6bd60 100644 --- a/server/gameserver/gridservice.cc +++ b/server/gameserver/gridservice.cc @@ -361,6 +361,19 @@ void GridService::TraverseCreatures(int room_idx, } } +void GridService::TraverseObstacles(int room_idx, + std::set& grid_list, + std::function func) +{ + bool stop = false; + for (auto& cell : grid_list) { + cell->TraverseObstacles(func, room_idx, stop); + if (stop) { + return; + } + } +} + void GridService::DeatchHuman(Human* target) { for (auto& cell : target->GetGridList()) { diff --git a/server/gameserver/gridservice.h b/server/gameserver/gridservice.h index 2548f38e..6881f3dd 100644 --- a/server/gameserver/gridservice.h +++ b/server/gameserver/gridservice.h @@ -2,6 +2,7 @@ class Human; class Entity; +class Obstacle; class Room; class Creature; class GridCell; @@ -50,6 +51,9 @@ class GridService void TraverseCreatures(int room_idx, std::set& grid_list, std::function func); + void TraverseObstacles(int room_idx, + std::set& grid_list, + std::function func); void DeatchHuman(Human* hum); private: