From b8362a875441a1a02e246a3baacf2c1618f5f982 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 15 Jul 2019 13:16:01 +0800 Subject: [PATCH] 1 --- server/gameserver/bullet.cc | 54 +++++++++++++++++++++++++++++++---- server/gameserver/bullet.h | 1 + server/gameserver/constant.h | 3 ++ server/gameserver/entity.cc | 11 +++++++ server/gameserver/entity.h | 1 + server/gameserver/obstacle.cc | 1 + server/gameserver/room.cc | 9 ++++++ server/gameserver/room.h | 1 + 8 files changed, 76 insertions(+), 5 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 33ba5c2..fcb43d9 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -134,8 +134,6 @@ void Bullet::ProcBomb() } } }//end for - - room->RemoveObjectLater(this); } bool Bullet::IsBomb() @@ -150,9 +148,9 @@ void Bullet::MapServiceUpdate() if (room->OverBorder(pos, meta->i->bullet_rad())) { if (IsBomb()) { ProcBomb(); - } else { - room->RemoveObjectLater(this); } + PostAttack(); + room->RemoveObjectLater(this); } else { room->grid_service.MoveBullet(this); std::set objects; @@ -186,8 +184,54 @@ void Bullet::MapServiceUpdate() if (!objects.empty()) { OnHit(objects); } - room->RemoveObjectLater(this); } + PostAttack(); + room->RemoveObjectLater(this); + } + } +} + +void Bullet::PostAttack() +{ + auto fire_func = + [] (const a8::XParams& param) + { + Obstacle* obstacle = (Obstacle*)param.sender.GetUserData(); + Human* sender = (Human*)param.param1.GetUserData(); + if (obstacle->room->IsGameOver()) { + return; + } + std::set grid_list; + obstacle->room->grid_service.GetAllCellsByXy(obstacle->pos.x, obstacle->pos.y, grid_list); + for (auto& grid : grid_list) { + for (Human* hum: grid->human_list) { + if (hum->pos.Distance(obstacle->pos) < obstacle->meta->i->damage_dia()) { + hum->DecHP(obstacle->meta->i->damage(), sender->entity_uniid, sender->name, 0); + } + } + } + }; + + if (meta->i->equip_subtype() == BulletType_FireBomb) { + //燃烧弹火墙 + Obstacle* obstacle = room->CreateObstacle(FIRE_WALL_EQUIP_ID, pos.x, pos.y); + if (obstacle) { + room->xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE, + a8::XParams() + .SetSender(obstacle) + .SetParam1(player), + fire_func, + &obstacle->xtimer_attacher.timer_list_); + room->xtimer.AddDeadLineTimerAndAttach(meta->i->time() * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(obstacle), + [] (const a8::XParams& param) + { + Obstacle* obstacle = (Obstacle*)param.sender.GetUserData(); + obstacle->NotifyDelObject(); + obstacle->room->RemoveObjectLater(obstacle); + }, + &obstacle->xtimer_attacher.timer_list_); } } } diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 2701272..b4459bd 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -34,6 +34,7 @@ class Bullet : public Entity void ProcBomb(); bool IsBomb(); void MapServiceUpdate(); + void PostAttack(); private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 1a5fd2d..d2726b0 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -279,3 +279,6 @@ const int MAX_TEAM_NUM = 4; const int WEAPON_SLOT = 0; const int ROOM_MAX_PLAYER_NUM = 10; + +const int FIRE_WALL_EQUIP_ID = 61401; + diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index 8e748e5..0494b20 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -180,3 +180,14 @@ void Entity::AddCollider(ColliderComponent* collider) { colliders.push_back(collider); } + +void Entity::NotifyDelObject() +{ + std::set grid_list; + room->grid_service.GetAllCellsByXy(pos.x, pos.y, grid_list); + for (auto& grid : grid_list) { + for (Human* hum: grid->human_list) { + hum->RemoveObjects(this); + } + } +} diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index 0636104..6cc60bc 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -47,6 +47,7 @@ class Entity void BroadcastFullState(); void BroadcastDeleteState(); void AddCollider(ColliderComponent* collider); + void NotifyDelObject(); private: std::list colliders; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index b8daa45..7d8d983 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -244,5 +244,6 @@ void Obstacle::Explosion() self_collider_->rad = old_rad; } explosioned = true; + NotifyDelObject(); room->RemoveObjectLater(this); } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 1587d7d..3aa5bde 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -480,6 +480,11 @@ Obstacle* Room::CreateObstacle(int id, float x, float y) return entity; } +bool Room::IsGameOver() +{ + return game_over; +} + Hero* Room::CreateHero(Human* hum) { a8::Vec2 pos = hum->pos; @@ -592,6 +597,10 @@ void Room::RemoveObjectLater(Entity* entity) entity->room->human_hash_.erase(entity->entity_uniid); } break; + case ET_Obstacle: + { + } + break; default: { abort(); diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 8d8e5a3..cf42834 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -89,6 +89,7 @@ public: bool CanJoin(const std::string& accountid); void OnPlayerOffline(Player* hum); Obstacle* CreateObstacle(int id, float x, float y); + bool IsGameOver(); private: int AllocUniid();