diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 9ad4b0c8..47eff662 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -793,6 +793,7 @@ void Bullet::ClearBuffList() sender.Get()->RemoveBuffByUniId(buff_uniid); } } + buff_list_.clear(); } void Bullet::ProcFlyHook(Entity* target) @@ -830,7 +831,9 @@ void Bullet::ProcFlyHook(Entity* target) void Bullet::ForceRemove() { - ClearBuffList(); - room->RemoveObjectLater(this); - later_removed_ = true; + if (!later_removed_) { + ClearBuffList(); + room->RemoveObjectLater(this); + later_removed_ = true; + } } diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 3b1c57fd..0e5dd246 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -89,7 +89,8 @@ static void InternalCreateBullet(BulletInfo& bullet_info) bullet_info.bullet_born_pos, bullet_info.bullet_dir, bullet_info.fly_distance, - bullet_info.weapon_uniid); + bullet_info.weapon_uniid, + bullet_info.trace_target_uniid); #ifdef DEBUG1 if (bullet_info.c.Get()->IsPlayer()) { bullet_info.c.Get()->SendDebugMsg(a8::Format("CreateBullet id:%d", @@ -105,21 +106,14 @@ static void InternalCreateBullet(BulletInfo& bullet_info) bullet_info.weapon_lv, bullet_info.bullet_born_pos, bullet_info.bullet_dir, - bullet_info.fly_distance); + bullet_info.fly_distance, + bullet_info.trace_target_uniid); 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)) { - bullet->trace_target_id = bullet_info.trace_target_uniid; - c->AddTraceBullet( - bullet_uniid, - bullet_info.trace_target_uniid, - bullet_info.weapon_meta->i->id() - ); - } - } + c->AddTraceBullet( + bullet_uniid, + bullet_info.trace_target_uniid, + bullet_info.weapon_meta->i->id() + ); } } else { BulletInfo* info_copy = new BulletInfo(); @@ -332,8 +326,10 @@ void InternalShot(Creature* c, bullet_born_pos = c->GetPos() + bullet_born_offset; if (c->IsPlayer() || c->IsCar()) { #ifdef DEBUG - a8::XPrintf("offset:%f,%f angle:%f old_angle:%f angle_xy:%f,%f %f %f gun_muzzle_position:%f,%f,%f pos:%f,%f gun_id:%d\n", - {bullet_born_offset.x, + a8::XPrintf("idx:%d offset:%f,%f angle:%f old_angle:%f angle_xy:%f,%f %f %f gun_muzzle_position:%f,%f,%f pos:%f,%f gun_id:%d\n", + { + i, + bullet_born_offset.x, bullet_born_offset.y, bullet_born_angle, old_bullet_born_angle, @@ -3587,7 +3583,7 @@ void Creature::AddTraceBullet(int bullet_uniid, int target_uniid, int gun_id) c->trace_bullet_hash_.erase(param.param1); Entity* entity = c->room->GetEntityByUniId(param.param1); if (entity && entity->GetEntityType() == ET_Bullet) { - Bullet* bullet = (Bullet*)bullet; + Bullet* bullet = (Bullet*)entity; bullet->ForceRemove(); } }, diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 446c9bd6..7f0b4c78 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -81,7 +81,8 @@ void FrameEvent::AddBullet(int bullet_uniid, int weapon_lv, a8::Vec2 born_pos, a8::Vec2 dir, - float fly_distance) + float fly_distance, + int trace_target_id) { #if DEBUG if (sender.Get()->IsPlayer()) { @@ -104,6 +105,9 @@ void FrameEvent::AddBullet(int bullet_uniid, p.set_gun_id(weapon_meta->i->id()); p.set_gun_lv(weapon_lv); p.set_fly_distance(fly_distance); + if (trace_target_id) { + p.set_trace_target_uniid(trace_target_id); + } } { int bullet_idx = bullets_.size() - 1; diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index f8cf8b82..068cc3d4 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -28,7 +28,8 @@ public: int weapon_lv, a8::Vec2 born_pos, a8::Vec2 dir, - float fly_distance); + float fly_distance, + int trace_target_id); void RemoveBullet(a8::Vec2 pos, int bullet_uniid); void AddExplosion(Bullet* bullet, int item_id, a8::Vec2 bomb_pos); void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos, float time_addition); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index a1db120a..aad10152 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -595,7 +595,8 @@ int Room::CreateBullet(Creature* sender, a8::Vec2 pos, a8::Vec2 dir, float fly_distance, - long long weapon_uniid) + long long weapon_uniid, + int trace_target_id) { int bullet_uniid = 0; if (grid_service->CanAdd(pos.x, pos.y)) { @@ -614,6 +615,7 @@ int Room::CreateBullet(Creature* sender, bullet->born_pos = pos; bullet->born_dir = dir; bullet->fly_distance = fly_distance; + bullet->trace_target_id = trace_target_id; bullet->Initialize(); AddObjectLater(bullet); bullet_uniid = bullet->GetUniId(); diff --git a/server/gameserver/room.h b/server/gameserver/room.h index f27f8b58..6d84841a 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -170,7 +170,8 @@ public: a8::Vec2 pos, a8::Vec2 dir, float fly_distance, - long long weapon_uniid); + long long weapon_uniid, + int trace_target_id); Car* CreateCar(Human* driver, int car_uniid, MetaData::Equip* meta,