From d682d27422201996c349b3334a183ed15743654f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 23 Jul 2021 11:12:38 +0800 Subject: [PATCH 1/3] 1 --- server/gameserver/creature.cc | 21 ++++++++++++++++++++- server/tools/protobuild/metatable.proto | 1 + 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index c7f12fd..717c3e6 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1626,7 +1626,26 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance) } if (GetCurrWeapon()->weapon_idx != 0 && GetCurrWeapon()->ammo <= 0) { - AutoLoadingBullet(); + if (GetCurrWeapon()->meta->i->reload_delay_time() > 0) { + room->xtimer.AddDeadLineTimerAndAttach + ( + GetCurrWeapon()->meta->i->reload_delay_time() / FRAME_RATE_MS, + a8::XParams() + .SetSender(this) + .SetParam1(GetCurrWeapon()->weapon_id), + [] (const a8::XParams& param) + { + Creature* c = (Creature*)param.sender.GetUserData(); + int weapon_id = param.param1; + if (c->GetCurrWeapon()->weapon_id == weapon_id) { + c->AutoLoadingBullet(); + } + }, + &xtimer_attacher.timer_list_ + ); + } else { + AutoLoadingBullet(); + } } last_shot_frameno_ = room->GetFrameNo(); if ((IsPlayer() || IsCar())) { diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 2b18247..aee166b 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -139,6 +139,7 @@ message Equip optional int32 use_scene = 60; optional int32 ispenetrate = 61; optional int32 is_penetrate_thing = 62; + optional int32 reload_delay_time = 63; optional string inventory_slot = 31; //库存槽位 optional int32 _inventory_slot = 32; //库存槽位 From 43746866ef1ea9758e03ad8453f44c5fc54d98ab Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 23 Jul 2021 15:57:20 +0800 Subject: [PATCH 2/3] 1 --- server/gameserver/human.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index f1b1176..f0bd3f8 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3560,10 +3560,12 @@ void Human::OnBulletHit(Bullet* bullet) } #ifdef DEBUG bullet->sender.Get()->SendDebugMsg - (a8::Format("bullet weapon_id:%d atk:%f", + (a8::Format("bullet weapon_id:%d atk:%f def:%f finaly_dmg:%f", { bullet->gun_meta->i->id(), - bullet->GetAtk() + bullet->GetAtk(), + def, + finaly_dmg }) ); #endif From a2b541ca2cf23c48fcfd53d9f364c586b08b732f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 23 Jul 2021 16:22:30 +0800 Subject: [PATCH 3/3] 1 --- server/gameserver/bullet.cc | 9 ++++++--- server/gameserver/human.cc | 10 ++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index d34b722..4de1627 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -429,10 +429,13 @@ void Bullet::Check(float distance) } bool need_remove = true; if (distance < bullet_range) { - if (!gun_meta->i->is_penetrate_thing() && t_hit_num > 0 || - !gun_meta->i->ispenetrate() && c_hit_num > 0) { + if (!gun_meta->i->is_penetrate_thing() && !gun_meta->i->ispenetrate()) { } else { - need_remove = false; + if ((!gun_meta->i->is_penetrate_thing() && (t_hit_num > 0)) || + (!gun_meta->i->ispenetrate() && (c_hit_num > 0))) { + } else { + need_remove = false; + } } } if (need_remove) { diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index f0bd3f8..630a157 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3536,6 +3536,8 @@ void Human::OnBulletHit(Bullet* bullet) return; } if (!dead && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { + float old_hp = GetHP(); + float old_max_hp = GetMaxHP(); float dmg = bullet->GetAtk(); float def = GetDef() * (1 + GetAbility()->GetAttrRate(kHAT_Def)) + GetAbility()->GetAttrAbs(kHAT_Def); @@ -3560,12 +3562,16 @@ void Human::OnBulletHit(Bullet* bullet) } #ifdef DEBUG bullet->sender.Get()->SendDebugMsg - (a8::Format("bullet weapon_id:%d atk:%f def:%f finaly_dmg:%f", + (a8::Format("bullet uniid:%d weapon_id:%d atk:%f def:%f finaly_dmg:%f old_hp:%f old_maxhp:%f cur_hp:%f", { + bullet->GetUniId(), bullet->gun_meta->i->id(), bullet->GetAtk(), def, - finaly_dmg + finaly_dmg, + old_hp, + old_max_hp, + GetHP() }) ); #endif