This commit is contained in:
aozhiwei 2021-05-14 20:09:42 +08:00
parent 89aeefdab0
commit 796e9e02f4
3 changed files with 56 additions and 11 deletions

View File

@ -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<Creature*> 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;
}
}
}

View File

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

View File

@ -213,6 +213,22 @@ namespace MetaData
}
}
}
if (i->equip_type() == EQUIP_TYPE_CAR) {
std::vector<std::string> strings;
a8::Split(i->param1(), strings, '|');
for (auto& str : strings) {
std::vector<std::string> 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()