diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index c973f18..3003692 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -32,7 +32,11 @@ void Bullet::Initialize() void Bullet::Update(int delta_time) { +#if MAP_SERVICE + MapServiceUpdate(); +#else RayDetectionUpdate(); +#endif } void Bullet::RecalcSelfCollider() @@ -221,3 +225,66 @@ void Bullet::RayDetectionUpdate() } } } + +void Bullet::MapServiceUpdate() +{ + pos = pos + dir * gun_meta->i->bullet_speed() / (float)SERVER_FRAME_RATE; + float distance = (pos - born_pos).Norm(); + if (room->OverBorder(pos, gun_meta->i->bullet_rad())) { + if (IsBomb()) { + ProcBomb(); + } else { + room->RemoveObjectLater(this); + } + } else { + room->grid_service.MoveBullet(this); + std::set objects; + for (auto& grid : grid_list) { + for (Human* hum: grid->human_list) { + if (hum != player && !hum->dead && + (hum->team_id == 0 || player->team_id != hum->team_id)) { + if (TestCollision(hum)) { + objects.insert(hum); + } + } + } + }//end for +#if 1 + { + std::set colliders; + room->map_service.GetColliders(pos.x, pos.y, colliders); + for (ColliderComponent* collider : colliders) { + if (TestCollision(collider)) { + objects.insert(collider->owner); +#if 0 + a8::XPrintf("%d,%d collider:%d,%d \n", + { + pos.x, + pos.y, + collider->owner->pos.x, + collider->owner->pos.y + }); +#endif + } + } + } +#endif + float bullet_range = gun_meta->i->range(); + if (gun_upgrade_meta && gun_upgrade_meta->attr[EA_ShotRange] > 0) { + bullet_range += gun_upgrade_meta->attr[EA_ShotRange]; + } + if (!objects.empty() || distance > bullet_range || + (IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance) + ) { + if (IsBomb()) { + ProcBomb(); + } else { + deleted = true; + if (!objects.empty()) { + OnHit(objects); + } + room->RemoveObjectLater(this); + } + } + } +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 790d3bd..2238439 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -38,6 +38,7 @@ class Bullet : public Entity void ProcBomb(); bool IsBomb(); void RayDetectionUpdate(); + void MapServiceUpdate(); private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 0a11120..ad0e204 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -608,7 +608,10 @@ void Room::CreateBullet(Human* hum, Weapon* weapon, bullet->Initialize(); AddObjectLater(bullet); grid_service.AddBullet(bullet); +#if MAP_SERVICE +#else bullet->movement->RayDetection(); +#endif } void Room::RemoveObjectLater(Entity* entity) @@ -844,8 +847,13 @@ void Room::UpdateGas() switch (gas_data.gas_mode) { case GasInactive: { +#if 0 + if (frame_no - gas_data.gas_start_frameno >= + 3 * SERVER_FRAME_RATE) { +#else if (frame_no - gas_data.gas_start_frameno >= MetaMgr::Instance()->gas_inactive_time * SERVER_FRAME_RATE) { +#endif gas_data.gas_mode = GasJump; gas_data.gas_start_frameno = frame_no; if (human_hash_.size() < ROOM_MAX_PLAYER_NUM) {