This commit is contained in:
aozhiwei 2022-09-27 13:19:37 +08:00
parent cacdd34267
commit 340a786f02
6 changed files with 32 additions and 25 deletions

View File

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

View File

@ -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();
}
},

View File

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

View File

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

View File

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

View File

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