From 568cc480b72f0d7dc526ac04ca9c4bdfad95f9c5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 11 Aug 2021 05:10:19 +0000 Subject: [PATCH] 1 --- server/gameserver/bullet.cc | 1 + server/gameserver/creature.cc | 1 + server/gameserver/gridcell.cc | 13 +++++++++ server/gameserver/gridcell.h | 4 +++ server/gameserver/gridservice.cc | 49 ++++++++++++++++++++++++++++++++ server/gameserver/gridservice.h | 5 ++++ 6 files changed, 73 insertions(+) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 336cd78..e357439 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -331,6 +331,7 @@ void Bullet::MapServiceUpdate() } } } else { + room->grid_service->MoveBullet(this); Check(distance); } } while(!later_removed_ && move_length >= 0.0001f); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 23450ea..2f8304b 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -220,6 +220,7 @@ Creature::~Creature() ClearPassiveSkill(); trigger_->UnInit(); A8_SAFE_DELETE(trigger_); + room->grid_service->RemoveCreature(this); } bool Creature::HasBuffEffect(int buff_effect_id) diff --git a/server/gameserver/gridcell.cc b/server/gameserver/gridcell.cc index 1f1268f..58edb8b 100644 --- a/server/gameserver/gridcell.cc +++ b/server/gameserver/gridcell.cc @@ -7,14 +7,17 @@ #include "car.h" #include "hero.h" #include "creature.h" +#include "bullet.h" GridCell::GridCell() { entitys_.reserve(MAX_ROOM_IDX); creatures_.reserve(MAX_ROOM_IDX); + bullets_.reserve(MAX_ROOM_IDX); for (int i = 0; i < MAX_ROOM_IDX; ++i) { entitys_.push_back(std::set()); creatures_.push_back(std::set()); + bullets_.push_back(std::set()); } } @@ -124,3 +127,13 @@ bool GridCell::CreatureExists(Creature* c) { return creatures_[c->room->GetRoomIdx()].find(c) != creatures_[c->room->GetRoomIdx()].end(); } + +void GridCell::AddBullet(Bullet* bullet) +{ + bullets_[bullet->room->GetRoomIdx()].insert(bullet); +} + +void GridCell::RemoveBullet(Bullet* bullet) +{ + bullets_[bullet->room->GetRoomIdx()].erase(bullet); +} diff --git a/server/gameserver/gridcell.h b/server/gameserver/gridcell.h index 24f1e01..3cceb73 100644 --- a/server/gameserver/gridcell.h +++ b/server/gameserver/gridcell.h @@ -2,6 +2,7 @@ class Entity; class Human; +class Bullet; class Room; class Creature; @@ -22,6 +23,8 @@ public: void AddCreature(Creature* c); void RemoveCreature(Creature* c); bool CreatureExists(Creature* c); + void AddBullet(Bullet* bullet); + void RemoveBullet(Bullet* bullet); void AddPermanentEntity(Entity* entity); void AddRoomEntity(Room* room, Entity* entity); void RemoveRoomEntity(Room* room, Entity* entity); @@ -38,4 +41,5 @@ public: private: std::vector> entitys_; std::vector> creatures_; + std::vector> bullets_; }; diff --git a/server/gameserver/gridservice.cc b/server/gameserver/gridservice.cc index 2ab7708..b100956 100644 --- a/server/gameserver/gridservice.cc +++ b/server/gameserver/gridservice.cc @@ -4,6 +4,7 @@ #include "human.h" #include "room.h" #include "gridcell.h" +#include "bullet.h" /* 1 2 3 @@ -371,3 +372,51 @@ void GridService::DeatchHuman(Human* target) target->SetGridId(0); target->GetGridList().clear(); } + +void GridService::AddBullet(Bullet* bullet) +{ + int x = (int)bullet->GetX() + cell_width_; + int y = (int)bullet->GetY() + cell_width_; + if (BroderOverFlow(x, y)) { + abort(); + } + bullet->SetGridId(x/cell_width_ + (y/cell_width_) * cell_count_per_row_); + if (bullet->GetGridId() == 0 || bullet->GetGridId() > max_grid_id_) { + abort(); + } + cells_[bullet->GetGridId()].AddBullet(bullet); + GetAllCells(bullet->room, bullet->GetGridId(), bullet->GetGridList()); +} + +void GridService::MoveBullet(Bullet* bullet) +{ + int new_x = (int)bullet->GetX() + cell_width_; + int new_y = (int)bullet->GetY() + cell_width_; + int new_grid_id = new_x/cell_width_ + (new_y/cell_width_) * cell_count_per_row_; + if (BroderOverFlow(new_x, new_y)) { + abort(); + } + if (new_grid_id == 0 || new_grid_id > max_grid_id_) { + abort(); + } + if (new_grid_id != bullet->GetGridId()) { + std::set inc_grid_list; + std::set dec_grid_list; + std::set old_grid_list = bullet->GetGridList(); + ComputeDiff(bullet->room, + bullet->GetGridId(), + new_grid_id, + bullet->GetGridList(), + inc_grid_list, + dec_grid_list); + cells_[bullet->GetGridId()].RemoveBullet(bullet); + cells_[new_grid_id].AddBullet(bullet); + bullet->SetGridId(new_grid_id); + } +} + +void GridService::DelBullet(Bullet* bullet) +{ + GridCell& cell = cells_[bullet->GetGridId()]; + cell.RemoveBullet(bullet); +} diff --git a/server/gameserver/gridservice.h b/server/gameserver/gridservice.h index bc1b716..7a361c3 100644 --- a/server/gameserver/gridservice.h +++ b/server/gameserver/gridservice.h @@ -5,6 +5,7 @@ class Entity; class Room; class Creature; class GridCell; +class Bullet; class GridService { public: @@ -23,6 +24,10 @@ class GridService void RemoveCreature(Creature* c); void MoveCreature(Creature* c); + void AddBullet(Bullet* bullet); + void MoveBullet(Bullet* bullet); + void DelBullet(Bullet* bullet); + void AddRoomEntity(Room* room, Entity* entity); void DelRoomEntity(Room* room, Entity* entity);