diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index a543565..00d1279 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -232,9 +232,6 @@ void Car::OnBulletHit(Bullet* bullet) void Car::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) { - #ifdef DEBUG - dec_hp *= 5; - #endif if (dec_hp < 0.001f) { return; } @@ -247,13 +244,13 @@ void Car::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int room->frame_event.AddHpChg(GetWeakPtrRef()); float hp_rate = GetHP() / GetMaxHP(); int new_buff_idx = cur_buff_idx_; - while (new_buff_idx < meta->car_buff_list.size()) { - if (hp_rate > std::get<0>(meta->car_buff_list[new_buff_idx])) { + while (new_buff_idx + 1 < meta->car_buff_list.size()) { + if (hp_rate > std::get<0>(meta->car_buff_list[new_buff_idx + 1])) { break; } ++new_buff_idx; } - if (new_buff_idx != cur_buff_id_) { + if (new_buff_idx != cur_buff_idx_) { if (cur_buff_id_ != 0) { RemoveBuffById(cur_buff_id_); } @@ -272,11 +269,13 @@ void Car::BeKill(int killer_id, const std::string& killer_name, int weapon_id) RemoveFromAroundPlayers(room); room->grid_service->RemoveCreature(this); room->RemoveObjectLater(this); + int team_id = 0; for (Human* passenger : passengers_) { if (meta->i->buffid()) { passenger->RemoveBuffById(meta->i->buffid()); passenger->RecalcSelfCollider(); } + team_id = passenger->team_id; passenger->SetCar(nullptr); passenger->SetSeat(0); passenger->second_weapon = Weapon(); @@ -285,7 +284,7 @@ void Car::BeKill(int killer_id, const std::string& killer_name, int weapon_id) passenger->RemoveBuffByEffectId(kBET_Passenger); room->frame_event.AddCarChg(passenger); } - Explosion(); + Explosion(team_id); } void Car::GetAabbBox(AabbCollider& aabb_box) @@ -298,12 +297,42 @@ void Car::GetAabbBox(AabbCollider& aabb_box) aabb_box._max.y = hero_meta_->i->radius(); } -void Car::Explosion() +void Car::Explosion(int team_id) { + if (meta->i->explosion_range() <= 0) { + return; + } + std::set objects; TouchProperTargets ( - [] (Creature* c, bool& stop) + [this, &objects, team_id] (Creature* c, bool& stop) { - + float distance = (c->GetPos() - GetPos()).Norm(); + if (team_id != c->team_id && distance < meta->i->explosion_range()) { + objects.insert(c); + } }); + room->frame_event.AddExplosionEx(GetWeakPtrRef(), + 0, + GetPos(), + meta->i->explosion_effect()); + for (auto& target : objects) { + switch (target->GetEntityType()) { + case ET_Player: + { + Human* hum = (Human*)target; + if (!hum->dead) { + float dmg = meta->i->atk(); + float def = hum->ability.def; + float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); + hum->DecHP(finaly_dmg, VP_Mine, TEXT("battle_server_killer_mine", "地雷"), VW_Mine); + } + } + break; + default: + { + } + break; + } + } } diff --git a/server/gameserver/car.h b/server/gameserver/car.h index 5c2f5ef..fee99a7 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -38,7 +38,7 @@ class Car : public Creature private: int AllocSeat(); void BeKill(int killer_id, const std::string& killer_name, int weapon_id); - void Explosion(); + void Explosion(int team_id); private: long long born_frameno_ = 0; diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 2a14093..cb74dde 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -213,6 +213,22 @@ namespace MetaData } } } + if (i->equip_type() == EQUIP_TYPE_CAR) { + std::vector strings; + a8::Split(i->param1(), strings, '|'); + for (auto& str : strings) { + std::vector strings2; + a8::Split(str, strings2, ':'); + if (strings2.size() >= 2) { + car_buff_list.push_back + (std::make_tuple + ( + (float)a8::XValue(strings2[0]).GetDouble(), + a8::XValue(strings2[1]).GetInt()) + ); + } + } + } } int Equip::GetWeaponIdx()