diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 6f47fea..655ea10 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -103,7 +103,7 @@ void Car::GetDown(Human* passenger) passenger->CancelAction(); passenger->RemoveBuffByEffectId(kBET_Driver); passenger->RemoveBuffByEffectId(kBET_Passenger); - room->frame_event.AddCarChg(passenger); + room->frame_event.AddCarChg(passenger->GetWeakPtrRef()); if (passengers_.empty()) { team_id = 0; room->TakeOffCarObject(GetUniId(), GetPos()); @@ -167,7 +167,7 @@ void Car::GetOn(Human* passenger) passenger->TryAddBuff(passenger, meta->i->buffid()); } passenger->CancelAction(); - room->frame_event.AddCarChg(passenger); + room->frame_event.AddCarChg(passenger->GetWeakPtrRef()); if (passengers_.size() == 1) { RemoveBuffByEffectId(kBET_CarDeactive); TryAddBuff(this, meta->car_active_buff_id); @@ -198,7 +198,7 @@ void Car::SwitchSeat(Human* passenger, int seat) passenger->SetSeat(seat); driver_ = passenger; passenger->MustBeAddBuff(passenger, DRIVER_BUFFID); - room->frame_event.AddCarChg(passenger); + room->frame_event.AddCarChg(passenger->GetWeakPtrRef()); SyncAroundPlayers(__FILE__, __LINE__, __func__); } } @@ -328,7 +328,7 @@ void Car::BeKill(int killer_id, const std::string& killer_name, int weapon_id) passenger->CancelAction(); passenger->RemoveBuffByEffectId(kBET_Driver); passenger->RemoveBuffByEffectId(kBET_Passenger); - room->frame_event.AddCarChg(passenger); + room->frame_event.AddCarChg(passenger->GetWeakPtrRef()); } Explosion(team_id); } diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index a468b4c..92fd0b5 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -43,7 +43,7 @@ void InternalShot(Creature* c, } } if (skill_id == 0) { - c->room->frame_event.AddShot(c); + c->room->frame_event.AddShot(c->GetWeakPtrRef()); } for (auto& tuple : weapon_meta->bullet_born_offset) { a8::Vec2 bullet_born_offset = a8::Vec2(std::get<0>(tuple), std::get<1>(tuple)); @@ -58,7 +58,7 @@ void InternalShot(Creature* c, } } bullet_dir.Rotate(bullet_angle / 180.0f); - c->room->frame_event.AddBullet(c, + c->room->frame_event.AddBullet(c->GetWeakPtrRef(), weapon_meta, weapon_lv, bullet_born_pos, @@ -1342,8 +1342,8 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance) } last_shot_frameno_ = room->GetFrameNo(); if (!need_sync_active_player && IsPlayer()) { - room->frame_event.AddBulletNumChg((Human*)this); - room->frame_event.AddWeaponAmmoChg((Human*)this); + room->frame_event.AddBulletNumChg(GetWeakPtrRef()); + room->frame_event.AddWeaponAmmoChg(GetWeakPtrRef()); } shot_ok = true; } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 1d656ea..fabe67e 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -124,6 +124,7 @@ class Creature : public MoveableEntity bool IsAndroid() const; bool IsHuman() const; bool IsCar() const; + Human* AsHuman() { return IsHuman() ? (Human*)this : nullptr; }; virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) {}; void AddHp(float hp); diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 05c0643..45255c7 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -18,7 +18,7 @@ void FrameEvent::AddAirDrop(int appear_time, int box_id, a8::Vec2 box_pos) TypeConvert::ToPb(box_pos, airdrop->mutable_pos()); } -void FrameEvent::AddEmote(Human* sender, int emote_id) +void FrameEvent::AddEmote(CreatureWeakPtr& sender, int emote_id) { { auto& tuple = a8::FastAppend(emotes_); @@ -26,11 +26,11 @@ void FrameEvent::AddEmote(Human* sender, int emote_id) auto& p = std::get<1>(tuple); p.set_emote_id(emote_id); - p.set_player_id(sender->GetUniId()); + p.set_player_id(sender.Get()->GetUniId()); } { int emote_idx = emotes_.size() - 1; - sender->TraverseAllLayerHumanList + sender.Get()->TraverseAllLayerHumanList ( [emote_idx] (Human* hum, bool& stop) { @@ -39,26 +39,26 @@ void FrameEvent::AddEmote(Human* sender, int emote_id) } } -void FrameEvent::AddShot(Creature* sender) +void FrameEvent::AddShot(CreatureWeakPtr& sender) { { auto& tuple = a8::FastAppend(shots_); std::get<0>(tuple) = sender; auto& p = std::get<1>(tuple); - p.set_player_id(sender->GetUniId()); - if (sender->second_weapon.meta) { - sender->second_weapon.ToPB(p.mutable_weapon()); + p.set_player_id(sender.Get()->GetUniId()); + if (sender.Get()->second_weapon.meta) { + sender.Get()->second_weapon.ToPB(p.mutable_weapon()); } else { - sender->GetCurrWeapon()->ToPB(p.mutable_weapon()); + sender.Get()->GetCurrWeapon()->ToPB(p.mutable_weapon()); } - if (sender->IsCar()) { - p.set_hole(sender->shot_hole); + if (sender.Get()->IsCar()) { + p.set_hole(sender.Get()->shot_hole); } } { int shot_idx = shots_.size() - 1; - sender->TraverseAllLayerHumanList + sender.Get()->TraverseAllLayerHumanList ( [shot_idx] (Human* hum, bool& stop) { @@ -67,7 +67,7 @@ void FrameEvent::AddShot(Creature* sender) } } -void FrameEvent::AddBullet(Creature* sender, +void FrameEvent::AddBullet(CreatureWeakPtr& sender, MetaData::Equip* weapon_meta, int weapon_lv, a8::Vec2 born_pos, @@ -79,7 +79,7 @@ void FrameEvent::AddBullet(Creature* sender, std::get<0>(tuple) = sender; auto& p = std::get<1>(tuple); - p.set_player_id(sender->GetUniId()); + p.set_player_id(sender.Get()->GetUniId()); p.set_bullet_id(weapon_meta->i->use_bullet()); TypeConvert::ToPb(born_pos, p.mutable_pos()); TypeConvert::ToPb(dir, p.mutable_dir()); @@ -92,7 +92,7 @@ void FrameEvent::AddBullet(Creature* sender, } { int bullet_idx = bullets_.size() - 1; - sender->TraverseAllLayerHumanList + sender.Get()->TraverseAllLayerHumanList ( [bullet_idx] (Human* hum, bool& stop) { @@ -132,11 +132,13 @@ void FrameEvent::AddExplosionEx(CreatureWeakPtr& sender, int item_id, a8::Vec2 b } } -void FrameEvent::AddBulletNumChg(Human* hum) +void FrameEvent::AddBulletNumChg(CreatureWeakPtr& sender) { - chged_bullet_nums_.push_back(hum); - int idx = chged_bullet_nums_.size() - 1; - hum->chged_bullet_nums_.push_back(idx); + if (sender.Get()->IsHuman()) { + chged_bullet_nums_.push_back(sender); + int idx = chged_bullet_nums_.size() - 1; + ((Human*)sender.Get())->chged_bullet_nums_.push_back(idx); + } } void FrameEvent::AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos) @@ -199,18 +201,18 @@ void FrameEvent::AddHpChg(CreatureWeakPtr& sender) }); } -void FrameEvent::AddWeaponAmmoChg(Human* hum) +void FrameEvent::AddWeaponAmmoChg(CreatureWeakPtr& sender) { - if (hum->GetCurrWeapon()) { + if (sender.Get()->GetCurrWeapon() && sender.Get()->IsHuman()) { chged_weapon_ammo_.push_back ( - std::make_tuple(hum, - hum->GetCurrWeapon()->weapon_idx, - hum->GetCurrWeapon()->ammo + std::make_tuple(sender, + sender.Get()->GetCurrWeapon()->weapon_idx, + sender.Get()->GetCurrWeapon()->ammo ) ); int idx = chged_weapon_ammo_.size() - 1; - hum->chged_weapon_ammo_.push_back(idx); + sender.Get()->AsHuman()->chged_weapon_ammo_.push_back(idx); } } @@ -272,19 +274,21 @@ void FrameEvent::AddSkillCurrTimesChg(CreatureWeakPtr sender, int skill_id, int } } -void FrameEvent::AddItemChg(Human* hum, int item_id, int item_num) +void FrameEvent::AddItemChg(CreatureWeakPtr& sender, int item_id, int item_num) { - chged_items_.push_back(std::make_tuple(hum, item_id, item_num)); - int idx = chged_items_.size() - 1; - hum->chged_items_.push_back(idx); + if (sender.Get()->IsHuman()) { + chged_items_.push_back(std::make_tuple(sender, item_id, item_num)); + int idx = chged_items_.size() - 1; + ((Human*)sender.Get())->chged_items_.push_back(idx); + } } -void FrameEvent::AddZombieIdChg(Human* sender) +void FrameEvent::AddZombieIdChg(CreatureWeakPtr& sender) { chged_zombieids_.push_back(sender); int idx = chged_zombieids_.size() - 1; { - sender->TraverseAllLayerHumanList + sender.Get()->TraverseAllLayerHumanList ( [idx] (Human* hum, bool& stop) { @@ -342,11 +346,11 @@ void FrameEvent::AddRevive(CreatureWeakPtr& sender) } } -void FrameEvent::AddCarChg(Human* sender) +void FrameEvent::AddCarChg(CreatureWeakPtr& sender) { chged_cars_.push_back(sender); int idx = chged_cars_.size() - 1; - sender->TraverseAllLayerHumanList + sender.Get()->TraverseAllLayerHumanList ( [idx] (Human* hum, bool& stop) { diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index 31d5c64..e48d7c7 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -12,9 +12,9 @@ struct FrameEvent { public: void AddAirDrop(int appear_time, int box_id, a8::Vec2 box_pos); - void AddEmote(Human* hum, int emote_id); - void AddShot(Creature* sender); - void AddBullet(Creature* sender, + void AddEmote(CreatureWeakPtr& sender, int emote_id); + void AddShot(CreatureWeakPtr& sender); + void AddBullet(CreatureWeakPtr& sender, MetaData::Equip* weapon_meta, int weapon_lv, a8::Vec2 born_pos, @@ -24,37 +24,37 @@ public: void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos); void AddPlaySkill(CreatureWeakPtr& sender, int skill_id); void AddExplosionEx(CreatureWeakPtr& sender, int item_id, a8::Vec2 bomb_pos, int effect); - void AddBulletNumChg(Human* hum); + void AddBulletNumChg(CreatureWeakPtr& sender); void AddHpChg(CreatureWeakPtr& sender); - void AddWeaponAmmoChg(Human* hum); + void AddWeaponAmmoChg(CreatureWeakPtr& sender); void AddBuff(CreatureWeakPtr& sender, Buff* buff); void RemoveBuff(CreatureWeakPtr& sender, int buff_id); void AddSkillCdChg(CreatureWeakPtr sender, int skill_id, int left_time); void AddSkillCurrTimesChg(CreatureWeakPtr sender, int skill_id, int curr_times); - void AddItemChg(Human* hum, int item_id, int item_num); - void AddZombieIdChg(Human* hum); + void AddItemChg(CreatureWeakPtr& sender, int item_id, int item_num); + void AddZombieIdChg(CreatureWeakPtr& sender); void AddDead(CreatureWeakPtr& sender, int revive_time); void AddRevive(CreatureWeakPtr& sender); - void AddCarChg(Human* sender); + void AddCarChg(CreatureWeakPtr& sender); void Clear(); private: ::google::protobuf::RepeatedPtrField<::cs::MFAirDrop> airdrops_; - std::vector> shots_; - std::vector> bullets_; + std::vector> shots_; + std::vector> bullets_; std::vector> explosions_; std::vector> smokes_; std::vector> play_skills_; - std::vector> emotes_; + std::vector> emotes_; std::vector> chged_buffs_; - std::vector> chged_items_; - std::vector chged_bullet_nums_; - std::vector> chged_weapon_ammo_; + std::vector> chged_items_; + std::vector chged_bullet_nums_; + std::vector> chged_weapon_ammo_; std::vector chged_hps_; std::vector> chged_skillcds_; std::vector> chged_skill_curr_times_; - std::vector chged_zombieids_; - std::vector chged_cars_; + std::vector chged_zombieids_; + std::vector chged_cars_; std::vector> dead_alive_objs_; friend class FrameMaker; diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 9a9afe3..3cb5399 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -92,7 +92,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) for (size_t idx : hum->shots_) { if (idx < room->frame_event.shots_.size()) { auto& tuple = room->frame_event.shots_[idx]; - if (hum->CanSee(std::get<0>(tuple))) { + if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { *msg->add_shots() = std::get<1>(tuple); } else { #ifdef DEBUG1 @@ -108,7 +108,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) for (size_t idx : hum->bullets_) { if (idx < room->frame_event.bullets_.size()) { auto& tuple = room->frame_event.bullets_[idx]; - if (hum->CanSee(std::get<0>(tuple))) { + if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { *msg->add_bullets() = std::get<1>(tuple); } } @@ -144,19 +144,19 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) for (size_t idx : hum->emotes_) { if (idx < room->frame_event.emotes_.size()) { auto& tuple = room->frame_event.emotes_[idx]; - if (hum->CanSee(std::get<0>(tuple))) { + if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { *msg->add_emotes() = std::get<1>(tuple); } } } for (size_t idx : hum->chged_bullet_nums_) { if (idx < room->frame_event.chged_bullet_nums_.size()) { - Human* target = room->frame_event.chged_bullet_nums_[idx]; - if (target->GetCurrWeapon()) { + CreatureWeakPtr& target = room->frame_event.chged_bullet_nums_[idx]; + if (target.Get()->GetCurrWeapon()) { auto p = msg->add_chged_property_list(); - p->set_obj_id(target->GetUniId()); + p->set_obj_id(target.Get()->GetUniId()); p->set_property_type(kPropBulletNum); - p->set_value(target->GetCurrWeapon()->ammo); + p->set_value(target.Get()->GetCurrWeapon()->ammo); } } } @@ -253,7 +253,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) auto& tuple = room->frame_event.chged_items_[idx]; { auto p = msg->add_chged_property_list(); - p->set_obj_id((std::get<0>(tuple))->GetUniId()); + p->set_obj_id((std::get<0>(tuple)).Get()->GetUniId()); p->set_property_type(kPropItem); p->set_property_subtype(std::get<1>(tuple)); p->set_value(std::get<2>(tuple)); @@ -265,7 +265,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) auto& tuple = room->frame_event.chged_weapon_ammo_[idx]; { auto p = msg->add_chged_property_list(); - p->set_obj_id((std::get<0>(tuple))->GetUniId()); + p->set_obj_id((std::get<0>(tuple)).Get()->GetUniId()); p->set_property_type(kPropWeaponAmmo); p->set_property_subtype(std::get<1>(tuple)); p->set_value(std::get<2>(tuple)); @@ -277,9 +277,9 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) auto& chg_hum = room->frame_event.chged_zombieids_[idx]; { auto p = msg->add_chged_property_list(); - p->set_obj_id(chg_hum->GetUniId()); + p->set_obj_id(chg_hum.Get()->GetUniId()); p->set_property_type(kPropZombieId); - p->set_value(chg_hum->meta->i->id()); + p->set_value(chg_hum.Get()->AsHuman()->meta->i->id()); } } } @@ -293,14 +293,14 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) } for (size_t idx : hum->chged_cars_) { if (idx < room->frame_event.chged_cars_.size()) { - Human* target = room->frame_event.chged_cars_[idx]; - if (hum->CanSee(target)) { + CreatureWeakPtr& target = room->frame_event.chged_cars_[idx]; + if (target.Get() && target.Get()->IsHuman() && hum->CanSee(target.Get())) { auto p = msg->add_chged_property_list(); - p->set_obj_id(target->GetUniId()); + p->set_obj_id(target.Get()->GetUniId()); p->set_property_type(kPropCar); - if (target->GetCar()) { - p->set_property_subtype(target->GetCar()->meta->i->id()); - p->set_value(target->GetSeat()); + if (target.Get()->AsHuman()->GetCar()) { + p->set_property_subtype(target.Get()->AsHuman()->GetCar()->meta->i->id()); + p->set_value(target.Get()->AsHuman()->GetSeat()); } else { p->set_property_subtype(0); p->set_value(0); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 3f6ffa0..fab0a84 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1824,7 +1824,7 @@ void Human::ChangeToRace(RaceType_e race, int level) void Human::ChangeToRaceAndNotify(RaceType_e race, int level) { ChangeToRace(race, level); - room->frame_event.AddZombieIdChg(this); + room->frame_event.AddZombieIdChg(GetWeakPtrRef()); } void Human::WinExp(Human* sender, int exp) @@ -1866,7 +1866,7 @@ void Human::WinExp(Human* sender, int exp) } } while (true); if (old_meta != meta) { - room->frame_event.AddZombieIdChg(this); + room->frame_event.AddZombieIdChg(GetWeakPtrRef()); OnMetaChange(); if (GetRace() == kZombieRace && meta->i->level() == 3) { room->OnZombieAppear(this); @@ -2654,7 +2654,7 @@ void Human::AddItem(int item_id, int item_num) } if (room && room->GetFrameNo() > join_frameno) { - room->frame_event.AddItemChg(this, item_id, items_[item_id]); + room->frame_event.AddItemChg(GetWeakPtrRef(), item_id, items_[item_id]); } else { if (item_num <= 0) { battling_items_.insert(item_id); @@ -2667,7 +2667,7 @@ void Human::DecItem(int item_id, int item_num) auto itr = items_.find(item_id); if (itr != items_.end()) { itr->second -= item_num; - room->frame_event.AddItemChg(this, item_id, std::max(0, itr->second)); + room->frame_event.AddItemChg(GetWeakPtrRef(), item_id, std::max(0, itr->second)); if (itr->second <= 0) { if (battling_items_.find(item_id) == battling_items_.end()) { items_.erase(itr); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index b73b19c..3e39e59 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -380,7 +380,7 @@ void Player::UpdateSpectate() void Player::UpdateEmote() { - room->frame_event.AddEmote(this, emote_id); + room->frame_event.AddEmote(GetWeakPtrRef(), emote_id); emote = false; emote_id = 0; }