diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 0a48bd22..5979b9bd 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -105,6 +105,22 @@ static void InternalCreateBullet(BulletInfo& bullet_info) bullet_info.bullet_born_pos, bullet_info.bullet_dir, bullet_info.fly_distance); + if (bullet_uniid && bullet_info.trace_target_uniid) { + Entity* entity = c->room->GetEntityByUniId(bullet_uniid); + if (entity->GetEntityType() == ET_Bullet) { + Bullet* bullet = (Bullet*)bullet; + Entity* target = c->room->GetEntityByUniId(bullet_info.trace_target_uniid); + if (target->IsCreature(c->room)) { + float finaly_dmg = ((Creature*)target)->GetBattleContext()->CalcDmg((Creature*)target, bullet); + c->AddTraceBullet( + bullet_uniid, + bullet_info.trace_target_uniid, + bullet_info.weapon_meta->i->id(), + finaly_dmg + ); + } + } + } } else { BulletInfo* info_copy = new BulletInfo(); *info_copy = bullet_info; @@ -3556,7 +3572,7 @@ void Creature::AutoNavigation(a8::Vec2 target_pos, float speed) } -void Creature::AddTraceBullet(int bullet_uniid, int target_uniid, float dmg) +void Creature::AddTraceBullet(int bullet_uniid, int target_uniid, int gun_id, float dmg) { - trace_bullet_hash_[bullet_uniid] = std::make_tuple(target_uniid, dmg); + trace_bullet_hash_[bullet_uniid] = std::make_tuple(target_uniid, gun_id, dmg); } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index ccfd9d59..6804b829 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -276,7 +276,7 @@ class Creature : public MoveableEntity float GetAttrRate(int attr_id); void RecalcDtoAttr(); void AutoNavigation(a8::Vec2 target_pos, float speed); - void AddTraceBullet(int bullet_uniid, int target_uniid, float dmg); + void AddTraceBullet(int bullet_uniid, int target_uniid, int gun_id, float dmg); protected: virtual void OnBuffRemove(Buff& buff); @@ -322,7 +322,8 @@ protected: long long last_follow_move_frameno_ = 0; int follow_target_last_chg_move_dir_times_ = -1; xtimer_list* follow_target_timer_ = nullptr; - std::map> trace_bullet_hash_; + //target_uniid, gun_id, dmg + std::map> trace_bullet_hash_; private: CreatureWeakPtr weak_ptr_;