This commit is contained in:
aozhiwei 2019-07-15 13:16:01 +08:00
parent 35aed66b55
commit b8362a8754
8 changed files with 76 additions and 5 deletions

View File

@ -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<Entity*> 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<GridCell*> 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_);
}
}
}

View File

@ -34,6 +34,7 @@ class Bullet : public Entity
void ProcBomb();
bool IsBomb();
void MapServiceUpdate();
void PostAttack();
private:
CircleCollider* self_collider_ = nullptr;

View File

@ -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;

View File

@ -180,3 +180,14 @@ void Entity::AddCollider(ColliderComponent* collider)
{
colliders.push_back(collider);
}
void Entity::NotifyDelObject()
{
std::set<GridCell*> 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);
}
}
}

View File

@ -47,6 +47,7 @@ class Entity
void BroadcastFullState();
void BroadcastDeleteState();
void AddCollider(ColliderComponent* collider);
void NotifyDelObject();
private:
std::list<ColliderComponent*> colliders;

View File

@ -244,5 +244,6 @@ void Obstacle::Explosion()
self_collider_->rad = old_rad;
}
explosioned = true;
NotifyDelObject();
room->RemoveObjectLater(this);
}

View File

@ -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();

View File

@ -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();