From 34661d26d94d714281e3cc0a028f38a33f2ae414 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 23 Jun 2021 07:12:12 +0000 Subject: [PATCH] 1 --- server/gameserver/car.cc | 5 ++-- server/gameserver/frameevent.cc | 36 ++++++++++++++++++++++++++--- server/gameserver/frameevent.h | 2 ++ server/gameserver/framemaker.cc | 16 ++++++++----- server/gameserver/human.cc | 38 ++++++++++++++----------------- server/gameserver/obstacle.cc | 7 +++--- server/gameserver/room.cc | 2 ++ server/gameserver/roomobstacle.cc | 11 +++++++-- 8 files changed, 80 insertions(+), 37 deletions(-) diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 1e9a618..31e1e8d 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -340,8 +340,9 @@ void Car::BeKill(int killer_id, const std::string& killer_name, int weapon_id) room, GetPos(), meta->i->explosion_range(), - meta->i->atk(), - meta->i->explosion_effect()); + meta->i->explosion_effect(), + meta->i->atk() + ); } void Car::GetAabbBox(AabbCollider& aabb_box) diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 32ae729..1241073 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -116,23 +116,53 @@ void FrameEvent::AddExplosion(Bullet* bullet, int item_id, a8::Vec2 bomb_pos) void FrameEvent::AddExplosionEx(CreatureWeakPtr& sender, int item_id, a8::Vec2 bomb_pos, int effect) { + #if 0 if (!sender.Get()) { return; } + #endif + #if 1 + Player* hum = room->GetOneAlivePlayer(); + sender.Attach((Creature*)hum); + item_id = 66001; +#ifdef DEBUG + a8::XPrintf("AddExplosion pos=%d,%d effect:%d\n", + { + bomb_pos.x, + bomb_pos.y, + effect + }); +#endif + #endif { auto& tuple = a8::FastAppend(explosions_); - std::get<0>(tuple).Attach(sender.Get()); + if (sender.Get()) { + std::get<0>(tuple).Attach(sender.Get()); + } auto& p = std::get<1>(tuple); p.set_item_id(item_id); TypeConvert::ToPb(bomb_pos, p.mutable_pos()); + #if 0 p.set_player_id(sender.Get()->GetUniId()); + #endif p.set_effect(effect); } { - int explosion_idx = explosions_.size() - 1; - sender.Get()->TraverseAllLayerHumanList + std::set grid_list; + room->grid_service->GetAllCellsByXy ( + room, + bomb_pos.x, + bomb_pos.y, + grid_list + ); + + int explosion_idx = explosions_.size() - 1; + room->grid_service->TraverseAllLayerHumanList + ( + room->GetRoomIdx(), + grid_list, [explosion_idx] (Human* hum, bool& stop) { hum->explosions_.push_back(explosion_idx); diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index b80d3ce..65b0434 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -11,6 +11,8 @@ class Creature; struct FrameEvent { public: + Room* room = nullptr; + void AddAirDrop(int appear_time, int box_id, a8::Vec2 box_pos); void AddAirRaid(int appear_time, const a8::Vec2& raid_pos, float raid_rad); void AddEmote(CreatureWeakPtr& sender, int emote_id); diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index f4c6289..79a7983 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -117,13 +117,17 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) for (size_t idx : hum->explosions_) { if (idx < room->frame_event.explosions_.size()) { auto& tuple = room->frame_event.explosions_[idx]; -#if 1 - { -#else - if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { + *msg->add_explosions() = std::get<1>(tuple); +#ifdef DEBUG + a8::XPrintf("AddExplosion %d, %s pos=%d,%d effect:%d\n", + { + hum->GetUniId(), + hum->name, + std::get<1>(tuple).pos().x(), + std::get<1>(tuple).pos().y(), + std::get<1>(tuple).effect() + }); #endif - *msg->add_explosions() = std::get<1>(tuple); - } } } for (size_t idx : hum->smokes_) { diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index a23af89..3d23bad 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -33,6 +33,7 @@ #include "skill.h" #include "incubator.h" #include "team.h" +#include "explosion.h" const int kReviveTimeAdd = 12; const int kSkinNum = 4; @@ -3503,7 +3504,7 @@ void Human::OnBulletHit(Bullet* bullet) } } -void Human::OnExplosionHit(Explosion* explosion) +void Human::OnExplosionHit(Explosion* e) { if (IsInvincible()) { return; @@ -3511,26 +3512,21 @@ void Human::OnExplosionHit(Explosion* explosion) if (dead) { return; } -#if 0 - if (target->IsInvincible()) { - continue; - } - if (sender.Get()->room->GetRoomMode() == kZombieMode && - sender.Get()->GetRace() == target->GetRace()) { - continue; - } - if (!target->dead) { - float dmg = GetAtk() * (1 + sender.Get()->GetAttrRate(kHAT_Atk)) + - sender.Get()->GetAttrAbs(kHAT_Atk); - float def = target->ability.def * (1 + target->GetAttrRate(kHAT_Def)) + - target->GetAttrAbs(kHAT_Def); - float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); - finaly_dmg = std::max(finaly_dmg, 0.0f); - target->DecHP(finaly_dmg, - sender.Get()->GetUniId(), - sender.Get()->GetName(), - gun_meta->i->id()); - } + float dmg = e->GetDmg(); + float def = ability.def * (1 + GetAttrRate(kHAT_Def)) + + GetAttrAbs(kHAT_Def); + float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); + finaly_dmg = std::max(finaly_dmg, 0.0f); +#if 1 + DecHP(finaly_dmg, + 1, + "", + 1); +#else + DecHP(finaly_dmg, + sender.Get()->GetUniId(), + sender.Get()->GetName(), + gun_meta->i->id()); #endif } diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index e912add..3b464f4 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -867,8 +867,8 @@ bool Obstacle::ProcSpecEvent(Creature* c, ColliderComponent* collider) Die(c->room); ProcDieExplosion(c->room); BroadcastFullState(c->room); - return true; } + return true; } break; default: @@ -887,7 +887,8 @@ void Obstacle::ProcDieExplosion(Room* room) room, GetPos(), meta->i->damage_dia(), - meta->i->damage(), - meta->i->explosion_effect()); + meta->i->explosion_effect(), + meta->i->damage() + ); } } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 469eb44..f20d0b0 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -79,6 +79,8 @@ void Room::Init() xtimer.Init(RoomXGetTickCount, this, 100, 100); xtimer_attacher_.xtimer = &xtimer; + frame_event.room = this; + CreateSpawnPoints(); CreateMonsterSpawnPoints(); CreateLoots(); diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index bc2c129..f4b8cb8 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -183,13 +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; + #if 0 Explosion explosion; explosion.IndifferenceAttack( room, bomb_pos, meta->i->damage_dia(), - meta->i->damage(), - meta->i->explosion_effect()); + meta->i->explosion_effect(), + meta->i->damage() + ); + #endif } if (explosion_times_ >= meta->i->explosion_times()) { room->xtimer.DeleteTimer(room->xtimer.GetRunningTimer()); @@ -208,12 +211,16 @@ void RoomObstacle::Active() break; case kObstacleMine: { + #if 0 ActiveMine(); + #endif } break; case kObstacleTrap: { + #if 0 ActiveTrap(); + #endif } break; case kObstaclePosionGas: