diff --git a/server/gameserver/mapservice.cc b/server/gameserver/mapservice.cc index 34752eb..8c8ef28 100644 --- a/server/gameserver/mapservice.cc +++ b/server/gameserver/mapservice.cc @@ -57,6 +57,9 @@ void MapService::Init(int width, int height, int cell_width) map_cells_ = (list_head*)malloc(sizeof(list_head) * width * height); memset(map_cells_, 0, sizeof(list_head) * width * height); + for (int i = 0; i < max_grid_id_; ++i) { + INIT_LIST_HEAD(&map_cells_[i]); + } } void MapService::UnInit() @@ -121,9 +124,6 @@ void MapService::AddCollider(ColliderComponent* collider) for (int y = min_grid_y; y <= max_grid_y; ++y) { int grid_id = x + y * map_width_; list_head* head = &map_cells_[grid_id]; - if (head->next == nullptr && head->prev == nullptr) { - INIT_LIST_HEAD(head); - } CellNode* node = new CellNode(); node->collider = collider; list_add_tail(&node->entry, head); @@ -179,7 +179,7 @@ void MapService::GetColliders(Room* room, int grid_id = center_grid_id + grid_offset_arr_[i]; if (grid_id >= 0 && grid_id < max_grid_id_) { list_head* head = &map_cells_[grid_id]; - if (head->next == nullptr && head->prev == nullptr) { + if (list_empty(head)) { continue; } struct CellNode *node, *tmp; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 7aa58f2..6eae702 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -111,20 +111,25 @@ void Obstacle::FillMFObjectFull(Room* room, cs::MFObjectFull* full_data) p->set_scale(1.0f); p->set_obstacle_id(meta->i->thing_id()); - p->set_health(health_); - p->set_dead(dead_); - p->set_dead_at_thisframe(IsDead(room) ? dead_frameno_ <= room->frame_no : false); + p->set_health(GetHealth(room)); + p->set_dead(IsDead(room)); + p->set_dead_at_thisframe(IsDead(room) ? GetDeadFrameNo(room) <= room->frame_no : false); p->set_is_door(is_door_); - #if 0 - if (is_door_) { + if (is_door_ && IsPermanent()) { + ObstacleData* data = room->GetPermanentObstacleData(entity_uniid); + if (!a8::HasBitFlag(data->flags, kHealth)) { + data->health = health_; + a8::SetBitFlag(data->flags, kHealth); + } + p->set_door_id(door_id_); - p->set_door_open_times(door_open_times_); - p->set_door_old_state((int)door_state_); - p->set_door_new_state((int)door_state_); + p->set_door_open_times(data->door_open_times); + p->set_door_old_state((int)data->door_state); + p->set_door_new_state((int)data->door_state); p->set_door_house_uniid(door_house_uniid_); p->set_door_house_id(building_->meta->i->mapid()); - if (door_state_ == DoorStateClose) { + if (data->door_state == DoorStateClose) { p->set_door_width(door_state0_->width()); p->set_door_height(door_state0_->height()); } else { @@ -132,7 +137,6 @@ void Obstacle::FillMFObjectFull(Room* room, cs::MFObjectFull* full_data) p->set_door_height(door_state1_->height()); } } - #endif } void Obstacle::GetAabbBox(AabbCollider& aabb_box) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 0b6a67c..e960839 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1572,7 +1572,7 @@ void Room::NotifyGameStart() void Room::InitObstacleDatas() { - obstacle_datas_.reserve(FIXED_OBJECT_MAXID); + obstacle_datas_.resize(FIXED_OBJECT_MAXID); memset(&obstacle_datas_[0], 0, sizeof(ObstacleData) * FIXED_OBJECT_MAXID); }