From e111fd15f9b9298d7ee9845f728655c7cb27b4b1 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 25 Jun 2021 14:31:31 +0800 Subject: [PATCH 1/8] =?UTF-8?q?1.=E6=B1=BD=E6=B2=B9=E6=A1=B6=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=89=93=E7=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 02721a8..da36d76 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -313,15 +313,13 @@ void Bullet::Check(float distance) std::set colliders; room->map_service->GetColliders(room, GetX(), GetY(), colliders); for (ColliderComponent* collider : colliders) { - if (TestCollision(room, collider) && - !a8::HasBitFlag(collider->tag, kHalfWallTag)) { - if (collider->owner->IsEntityType(ET_Obstacle)) { - Obstacle* obstacle = (Obstacle*)collider->owner; - if (obstacle->CanThroughable(this)) { - continue; + if (collider->owner->IsEntityType(ET_Obstacle)) { + Obstacle* obstacle = (Obstacle*)collider->owner; + if (!obstacle->CanThroughable(this)) { + if (TestCollision(room, collider)) { + objects.insert(collider->owner); } } - objects.insert(collider->owner); } } } From 594aa6b61c8063d821ba350bab7ec9d180ee9a38 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 25 Jun 2021 14:40:19 +0800 Subject: [PATCH 2/8] =?UTF-8?q?2.=E6=9C=BA=E7=94=B2=E5=AD=90=E5=BC=B9?= =?UTF-8?q?=E5=B0=84=E5=87=BB=E7=89=A9=E8=B5=84=E7=AE=B1=EF=BC=8C=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=89=93=E7=A0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/car.cc | 8 ++++++++ server/gameserver/car.h | 1 + 2 files changed, 9 insertions(+) diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 31e1e8d..3a5ee3b 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -12,6 +12,7 @@ #include "typeconvert.h" #include "bullet.h" #include "explosion.h" +#include "obstacle.h" Car::Car():Creature() { @@ -392,3 +393,10 @@ float Car::GetMaxOil() { return meta->i->max_oil(); } + +void Car::DropItems(Obstacle* obstacle) +{ + if (obstacle->meta->i->drop() != 0) { + room->ScatterDrop(obstacle->GetPos(), obstacle->meta->i->drop()); + } +} diff --git a/server/gameserver/car.h b/server/gameserver/car.h index 36ddc4e..a7edae4 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -43,6 +43,7 @@ class Car : public Creature virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) override; virtual void SendDebugMsg(const std::string& debug_msg) override; virtual void SetAttackDir(const a8::Vec2& attack_dir) override; + virtual void DropItems(Obstacle* obstacle) override; private: int AllocSeat(); From 66c45210c9a3b44e7760da8a89741de94b671c07 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 25 Jun 2021 15:12:27 +0800 Subject: [PATCH 3/8] =?UTF-8?q?3.=E6=9C=BA=E7=94=B2=E7=88=86=E7=82=B8?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E5=B0=8F=E5=9C=B0=E5=9B=BE=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=BB=8D=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/car.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 3a5ee3b..f0b4cef 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -344,6 +344,7 @@ void Car::BeKill(int killer_id, const std::string& killer_name, int weapon_id) meta->i->explosion_effect(), meta->i->atk() ); + room->NotifyUiUpdate(); } void Car::GetAabbBox(AabbCollider& aabb_box) From 31c1c73ec76446dfe3c06ec41f20c62ff92f5a5f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 25 Jun 2021 16:55:13 +0800 Subject: [PATCH 4/8] 1 --- server/gameserver/room.cc | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 3f9538a..a76f37f 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -3969,14 +3969,16 @@ void Room::AirRaid(int airraid_id) ); a8::Vec2 dir = a8::Vec2::UP; dir.Rotate(a8::RandAngle()); - a8::Vec2 pos = center + dir * (50 + rand() % 100);; - RoomObstacle* obstacle = room->CreateObstacle - ( - raid_meta->i->bomb_id(), - pos.x, - pos.y - ); - obstacle->Active(); + a8::Vec2 pos = center + dir * (50 + rand() % 100); + if (room->grid_service->CanAdd(pos.x, pos.y)) { + RoomObstacle* obstacle = room->CreateObstacle + ( + raid_meta->i->bomb_id(), + pos.x, + pos.y + ); + obstacle->Active(); + } }; Room* room = (Room*)param.sender.GetUserData(); if (room->IsGameOver()) { From 62b560e3bf11d8c097031a962998ebe445d35b45 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 25 Jun 2021 16:57:13 +0800 Subject: [PATCH 5/8] =?UTF-8?q?4.=E7=A9=BA=E8=A2=AD=EF=BC=8C=E6=8C=82?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/roomobstacle.cc | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index af8a9ec..5034479 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -183,14 +183,16 @@ void RoomObstacle::SpecExplosion() bomb_born_offset.Rotate(a8::RandAngle()); bomb_born_offset = bomb_born_offset * a8::RandEx(1, std::max(2, meta->i->explosion_float())); a8::Vec2 bomb_pos = GetPos() + bomb_born_offset; - Explosion explosion; - explosion.IndifferenceAttack( - room, - bomb_pos, - meta->i->damage_dia(), - meta->i->explosion_effect(), - meta->i->damage() - ); + if (room->grid_service->CanAdd(bomb_pos.x, bomb_pos.y)) { + Explosion explosion; + explosion.IndifferenceAttack( + room, + bomb_pos, + meta->i->damage_dia(), + meta->i->explosion_effect(), + meta->i->damage() + ); + } } if (explosion_times_ >= meta->i->explosion_times()) { room->xtimer.DeleteTimer(room->xtimer.GetRunningTimer()); From 9ca49272d43aa48d991df02dc413536bab962f1d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 25 Jun 2021 20:28:50 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E5=9C=BA=E6=99=AF=E5=86=85=E5=BB=BA?= =?UTF-8?q?=E7=AD=91=EF=BC=8C=E8=A2=AB=E5=AD=90=E5=BC=B9=E5=91=BD=E4=B8=AD?= =?UTF-8?q?=E8=BE=B9=E6=B6=88=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/obstacle.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 3b464f4..da739ba 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -469,6 +469,9 @@ void Obstacle::SetMasterId(Room* room, int master_id) void Obstacle::OnBulletHit(Bullet* bullet) { + if (meta->i->bullet_hit() == kBulletHitEatDmg) { + return; + } if (!IsDead(bullet->room) && !IsTerminatorAirDropBox(bullet->room)) { if (meta->receive_special_damage_type != 0 && From 3c108eadad8bdd3389467301301a4eb1a2d7f9c9 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 25 Jun 2021 20:47:38 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E6=B1=BD=E6=B2=B9=E6=A1=B6=E6=89=93?= =?UTF-8?q?=E7=88=86=E4=BA=86=EF=BC=8C=E6=B2=A1=E6=9C=89=E5=8F=AC=E5=94=A4?= =?UTF-8?q?=E7=87=83=E7=83=A7=E5=BC=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/obstacle.cc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index da739ba..d730135 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -513,6 +513,17 @@ void Obstacle::OnBulletHit(Bullet* bullet) if (IsDead(bullet->room)) { ProcDieExplosion(bullet->room); bullet->sender.Get()->DropItems(this); + if (meta->i->thing_type() == kObstacleOilBucket) { + MetaData::MapThing* bomb_meta = MetaMgr::Instance()->GetMapThing(meta->int_param1); + if (bomb_meta) { + RoomObstacle* obstacle = bullet->room->CreateObstacle + ( + bomb_meta->i->thing_id(), + GetPos().x, + GetPos().y + ); + } + } } BroadcastFullState(bullet->room); #ifdef DEBUG @@ -556,6 +567,17 @@ void Obstacle::OnExplosionHit(Explosion* e) if (meta->i->drop() != 0) { e->GetRoom()->ScatterDrop(GetPos(), meta->i->drop()); } + if (meta->i->thing_type() == kObstacleOilBucket) { + MetaData::MapThing* bomb_meta = MetaMgr::Instance()->GetMapThing(meta->int_param1); + if (bomb_meta) { + RoomObstacle* obstacle = e->GetRoom()->CreateObstacle + ( + bomb_meta->i->thing_id(), + GetPos().x, + GetPos().y + ); + } + } } BroadcastFullState(e->GetRoom()); } From 8252c6a63cc34d9aacff352abe2ea7b707e00d63 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 25 Jun 2021 21:48:51 +0800 Subject: [PATCH 8/8] 1 --- server/gameserver/explosion.cc | 6 ++++++ server/gameserver/explosion.h | 1 + server/gameserver/roomobstacle.cc | 1 + 3 files changed, 8 insertions(+) diff --git a/server/gameserver/explosion.cc b/server/gameserver/explosion.cc index 2918cbb..68b16e5 100644 --- a/server/gameserver/explosion.cc +++ b/server/gameserver/explosion.cc @@ -73,6 +73,9 @@ void Explosion::InternalAttack() grid_list, [this, &objects] (Creature* c, bool& stop) { + if (c->GetUniId() == exclude_uniid) { + return; + } if (!c->Attackable(room_)) { return; } @@ -98,6 +101,9 @@ void Explosion::InternalAttack() grid_list, [this, &objects] (Entity* entity, bool& stop) { + if (entity->GetUniId() == exclude_uniid) { + return; + } if (!entity->Attackable(room_)) { return; } diff --git a/server/gameserver/explosion.h b/server/gameserver/explosion.h index 92b3966..4856975 100644 --- a/server/gameserver/explosion.h +++ b/server/gameserver/explosion.h @@ -6,6 +6,7 @@ class Room; class Explosion { public: + int exclude_uniid = 0; Room* GetRoom() { return room_; }; CreatureWeakPtr GetSender() { return sender_; }; diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index 5034479..75531e4 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -185,6 +185,7 @@ void RoomObstacle::SpecExplosion() a8::Vec2 bomb_pos = GetPos() + bomb_born_offset; if (room->grid_service->CanAdd(bomb_pos.x, bomb_pos.y)) { Explosion explosion; + explosion.exclude_uniid = GetUniId(); explosion.IndifferenceAttack( room, bomb_pos,