From 854e168ae700f93188bbf706d27eb4e3ad8f4d16 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 23 Apr 2019 20:28:27 +0800 Subject: [PATCH] AddToNewObjects --- server/gameserver/bullet.cc | 8 +-- server/gameserver/entity.cc | 13 +++++ server/gameserver/entity.h | 5 ++ server/gameserver/gridservice.cc | 2 +- server/gameserver/gridservice.h | 4 +- server/gameserver/human.cc | 26 +++++++++ server/gameserver/human.h | 2 +- server/gameserver/player.cc | 2 - server/gameserver/room.cc | 92 ++++++++++++++------------------ server/gameserver/room.h | 3 ++ 10 files changed, 94 insertions(+), 63 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index f9c4712..16d9b25 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -95,13 +95,7 @@ void Bullet::OnHit(std::vector& objects) obstacle->ClearColliders(); room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop()); } - room->TouchPlayerList(a8::XParams() - .SetSender(obstacle), - [] (Player* hum, a8::XParams& param) - { - Obstacle* obstacle = (Obstacle*)param.sender.GetUserData(); - hum->AddToNewObjects(obstacle); - }); + obstacle->BroadcastFullState(); } } break; diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index 3229dac..9159b15 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -80,3 +80,16 @@ void Entity::FindLocationWithTarget(Entity* target) DestoryCollider(target_collider); DestoryCollider(a_collider); } + +void Entity::BroadcastFullState() +{ +#if 0 + room->TouchPlayerList(a8::XParams() + .SetSender(obstacle), + [] (Player* hum, a8::XParams& param) + { + Obstacle* obstacle = (Obstacle*)param.sender.GetUserData(); + hum->AddToNewObjects(obstacle); + }); +#endif +} diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index f5be628..361e45b 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -1,5 +1,7 @@ #pragma once +#include "gridservice.h" + namespace cs { class MFObjectPart; @@ -48,6 +50,8 @@ class Entity bool deleted = false; a8::XTimerAttacher xtimer_attacher; + int grid_id = 0; + std::set grid_list; Obstacle* last_collision_door = nullptr; Entity(); @@ -61,5 +65,6 @@ class Entity bool TestCollision(Entity* b); void ClearColliders(); void FindLocationWithTarget(Entity* target); + void BroadcastFullState(); }; diff --git a/server/gameserver/gridservice.cc b/server/gameserver/gridservice.cc index 486ad5d..4f6cc8f 100644 --- a/server/gameserver/gridservice.cc +++ b/server/gameserver/gridservice.cc @@ -111,7 +111,7 @@ void GridService::MoveHuman(Human* hum, float x, float y, } -void GridService::AddEntity(Entity* entity) +void GridService::AddEntity(Entity* entity, std::set& inc_grid_list) { } diff --git a/server/gameserver/gridservice.h b/server/gameserver/gridservice.h index 2990652..16d53a4 100644 --- a/server/gameserver/gridservice.h +++ b/server/gameserver/gridservice.h @@ -1,10 +1,12 @@ #pragma once +class Entity; class Human; struct GridCell { std::set human_list; + std::set entity_list; }; /* @@ -37,7 +39,7 @@ class GridService std::set& dec_grid_list ); - void AddEntity(Entity* entity); + void AddEntity(Entity* entity, std::set& inc_grid_list); private: inline void GetGridList(int grid_id, int offset, diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 5b067c4..e7af83b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -663,3 +663,29 @@ void Human::FindLocation() FindLocationWithTarget(target); } } + +void Human::RefreshView() +{ + for (auto& cell : grid_list) { + for (Human* hum : cell->human_list) { + hum->AddToNewObjects(this); + hum->AddToPartObjects(this); + AddToNewObjects(hum); + AddToPartObjects(hum); + } + for (Entity* entity : cell->entity_list) { + switch (entity->entity_type) { + case ET_Building: + case ET_Obstacle: + { + AddToNewObjects(entity); + } + break; + default: + { + } + break; + } + } + } +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 07838a6..acca250 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -29,7 +29,6 @@ class Human : public Entity MetaData::Player* meta = nullptr; MetaData::Equip* helmet_meta = nullptr; MetaData::Equip* chest_meta = nullptr; - int grid_id = 0; Vector2D move_dir; Vector2D attack_dir; @@ -122,6 +121,7 @@ class Human : public Entity void Land(); void DoJump(); void FindLocation(); + void RefreshView(); protected: diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index d2c6f7c..65c58d1 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -550,7 +550,6 @@ void Player::ObstacleInteraction(Obstacle* entity) } return true; }); - } else { } } @@ -989,4 +988,3 @@ void Player::FillMFGasData(cs::MFGasData* gas_data) gas_data->set_rad_old(room->gas_data.rad_old); gas_data->set_rad_new(room->gas_data.rad_new); } - diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index d76c418..d0ac7a4 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -263,39 +263,12 @@ void Room::AddPlayer(Player* hum) accountid_hash_[hum->account_id] = hum; human_hash_[hum->entity_uniid] = hum; ++alive_count_; - hum->AddToNewObjects(hum); - hum->AddToPartObjects(hum); - for (auto& pair : human_hash_) { - if (pair.second != hum) { - pair.second->AddToNewObjects(hum); - pair.second->AddToPartObjects(hum); - hum->AddToNewObjects(pair.second); - hum->AddToPartObjects(pair.second); - if (!hum->team_uuid.empty() && pair.second->team_uuid == hum->team_uuid) { - if (!pair.second->team_members) { - pair.second->team_id = NewTeam(); - pair.second->team_members = &team_hash_[pair.second->team_id]; - pair.second->team_members->insert(pair.second); - } - pair.second->team_members->insert(hum); - hum->team_id = pair.second->team_id; - } - } - } - for (auto& pair : uniid_hash_) { - switch (pair.second->entity_type) { - case ET_Building: - case ET_Obstacle: - { - hum->AddToNewObjects(pair.second); - } - break; - default: - { - } - break; - } + { + std::set inc_grid_list; + grid_service.AddHuman(hum, inc_grid_list); + hum->RefreshView(); } + MatchTeam(hum); } unsigned short Room::AllocUniid() @@ -332,14 +305,10 @@ void Room::ShuaAndroid() moveable_hash_[hum->entity_uniid] = hum; human_hash_[hum->entity_uniid] = hum; ++alive_count_; - - for (auto& pair : human_hash_) { - if (pair.second != hum) { - pair.second->AddToNewObjects(hum); - pair.second->AddToPartObjects(hum); - hum->AddToNewObjects(pair.second); - hum->AddToPartObjects(pair.second); - } + { + std::set inc_grid_list; + grid_service.AddHuman(hum, inc_grid_list); + hum->RefreshView(); } } } @@ -568,8 +537,9 @@ void Room::DropItem(Vector2D pos, int item_id, int item_count) entity->count = item_count; entity->Initialize(); uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : human_hash_) { - pair.second->AddToNewObjects(entity); + { + std::set inc_grid_list; + grid_service.AddEntity(entity, inc_grid_list); } } } @@ -595,8 +565,9 @@ void Room::CreateDoor(Building* building, int door_idx) building->pos.y + entity->door_state0->y() - building->meta->i->tileheight() / 2.0); entity->Initialize(); uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : human_hash_) { - pair.second->AddToNewObjects(entity); + { + std::set inc_grid_list; + grid_service.AddEntity(entity, inc_grid_list); } } } @@ -615,8 +586,9 @@ void Room::CreateHouseObstacle(Building* building, int id, float x, float y) building->pos.y + y - building->meta->i->tileheight() / 2.0); entity->Initialize(); uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : human_hash_) { - pair.second->AddToNewObjects(entity); + { + std::set inc_grid_list; + grid_service.AddEntity(entity, inc_grid_list); } } } @@ -636,8 +608,9 @@ void Room::CreateObstacle(int id, float x, float y) entity->pos = Vector2D(x, y); entity->Initialize(); uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : human_hash_) { - pair.second->AddToNewObjects(entity); + { + std::set inc_grid_list; + grid_service.AddEntity(entity, inc_grid_list); } } } @@ -655,8 +628,9 @@ void Room::CreateLoot(int equip_id, Vector2D pos, int count) entity->count = count; entity->Initialize(); uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : human_hash_) { - pair.second->AddToNewObjects(entity); + { + std::set inc_grid_list; + grid_service.AddEntity(entity, inc_grid_list); } } } @@ -1063,6 +1037,23 @@ void Room::AutoMatchTeam() #endif } +void Room::MatchTeam(Human* hum) +{ + for (auto& pair : human_hash_) { + if (pair.second != hum) { + if (!hum->team_uuid.empty() && pair.second->team_uuid == hum->team_uuid) { + if (!pair.second->team_members) { + pair.second->team_id = NewTeam(); + pair.second->team_members = &team_hash_[pair.second->team_id]; + pair.second->team_members->insert(pair.second); + } + pair.second->team_members->insert(hum); + hum->team_id = pair.second->team_id; + } + } + } +} + void Room::InitAirDrop() { std::list& air_drops = MetaMgr::Instance()->GetAirDrops(); @@ -1152,5 +1143,4 @@ void Room::ShuaPlane() hum->AddToPartObjects(pair.second); } } - } diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 7bc538a..cb5787d 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -5,6 +5,7 @@ #include "frameevent.h" #include "framemaker.h" +#include "gridservice.h" namespace MetaData { @@ -39,6 +40,7 @@ public: RoomProfile profile; a8::XTimer xtimer; Plane plane; + GridService grid_service; ~Room(); void Init(); @@ -95,6 +97,7 @@ private: Vector2D& out_pos); void OutputDebugLog(); void AutoMatchTeam(); + void MatchTeam(Human* hum); void InitAirDrop(); void AirDrop(int appear_time, int box_id); void ShuaPlane();