frameevent重构ok

This commit is contained in:
aozhiwei 2021-06-08 18:57:27 +08:00
parent 3f62f0cadd
commit 1036102409
8 changed files with 83 additions and 78 deletions

View File

@ -103,7 +103,7 @@ void Car::GetDown(Human* passenger)
passenger->CancelAction(); passenger->CancelAction();
passenger->RemoveBuffByEffectId(kBET_Driver); passenger->RemoveBuffByEffectId(kBET_Driver);
passenger->RemoveBuffByEffectId(kBET_Passenger); passenger->RemoveBuffByEffectId(kBET_Passenger);
room->frame_event.AddCarChg(passenger); room->frame_event.AddCarChg(passenger->GetWeakPtrRef());
if (passengers_.empty()) { if (passengers_.empty()) {
team_id = 0; team_id = 0;
room->TakeOffCarObject(GetUniId(), GetPos()); room->TakeOffCarObject(GetUniId(), GetPos());
@ -167,7 +167,7 @@ void Car::GetOn(Human* passenger)
passenger->TryAddBuff(passenger, meta->i->buffid()); passenger->TryAddBuff(passenger, meta->i->buffid());
} }
passenger->CancelAction(); passenger->CancelAction();
room->frame_event.AddCarChg(passenger); room->frame_event.AddCarChg(passenger->GetWeakPtrRef());
if (passengers_.size() == 1) { if (passengers_.size() == 1) {
RemoveBuffByEffectId(kBET_CarDeactive); RemoveBuffByEffectId(kBET_CarDeactive);
TryAddBuff(this, meta->car_active_buff_id); TryAddBuff(this, meta->car_active_buff_id);
@ -198,7 +198,7 @@ void Car::SwitchSeat(Human* passenger, int seat)
passenger->SetSeat(seat); passenger->SetSeat(seat);
driver_ = passenger; driver_ = passenger;
passenger->MustBeAddBuff(passenger, DRIVER_BUFFID); passenger->MustBeAddBuff(passenger, DRIVER_BUFFID);
room->frame_event.AddCarChg(passenger); room->frame_event.AddCarChg(passenger->GetWeakPtrRef());
SyncAroundPlayers(__FILE__, __LINE__, __func__); 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->CancelAction();
passenger->RemoveBuffByEffectId(kBET_Driver); passenger->RemoveBuffByEffectId(kBET_Driver);
passenger->RemoveBuffByEffectId(kBET_Passenger); passenger->RemoveBuffByEffectId(kBET_Passenger);
room->frame_event.AddCarChg(passenger); room->frame_event.AddCarChg(passenger->GetWeakPtrRef());
} }
Explosion(team_id); Explosion(team_id);
} }

View File

@ -43,7 +43,7 @@ void InternalShot(Creature* c,
} }
} }
if (skill_id == 0) { 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) { for (auto& tuple : weapon_meta->bullet_born_offset) {
a8::Vec2 bullet_born_offset = a8::Vec2(std::get<0>(tuple), std::get<1>(tuple)); 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); bullet_dir.Rotate(bullet_angle / 180.0f);
c->room->frame_event.AddBullet(c, c->room->frame_event.AddBullet(c->GetWeakPtrRef(),
weapon_meta, weapon_meta,
weapon_lv, weapon_lv,
bullet_born_pos, 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(); last_shot_frameno_ = room->GetFrameNo();
if (!need_sync_active_player && IsPlayer()) { if (!need_sync_active_player && IsPlayer()) {
room->frame_event.AddBulletNumChg((Human*)this); room->frame_event.AddBulletNumChg(GetWeakPtrRef());
room->frame_event.AddWeaponAmmoChg((Human*)this); room->frame_event.AddWeaponAmmoChg(GetWeakPtrRef());
} }
shot_ok = true; shot_ok = true;
} }

View File

@ -124,6 +124,7 @@ class Creature : public MoveableEntity
bool IsAndroid() const; bool IsAndroid() const;
bool IsHuman() const; bool IsHuman() const;
bool IsCar() 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) {}; virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) {};
void AddHp(float hp); void AddHp(float hp);

View File

@ -18,7 +18,7 @@ void FrameEvent::AddAirDrop(int appear_time, int box_id, a8::Vec2 box_pos)
TypeConvert::ToPb(box_pos, airdrop->mutable_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_); auto& tuple = a8::FastAppend(emotes_);
@ -26,11 +26,11 @@ void FrameEvent::AddEmote(Human* sender, int emote_id)
auto& p = std::get<1>(tuple); auto& p = std::get<1>(tuple);
p.set_emote_id(emote_id); 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; int emote_idx = emotes_.size() - 1;
sender->TraverseAllLayerHumanList sender.Get()->TraverseAllLayerHumanList
( (
[emote_idx] (Human* hum, bool& stop) [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_); auto& tuple = a8::FastAppend(shots_);
std::get<0>(tuple) = sender; std::get<0>(tuple) = sender;
auto& p = std::get<1>(tuple); auto& p = std::get<1>(tuple);
p.set_player_id(sender->GetUniId()); p.set_player_id(sender.Get()->GetUniId());
if (sender->second_weapon.meta) { if (sender.Get()->second_weapon.meta) {
sender->second_weapon.ToPB(p.mutable_weapon()); sender.Get()->second_weapon.ToPB(p.mutable_weapon());
} else { } else {
sender->GetCurrWeapon()->ToPB(p.mutable_weapon()); sender.Get()->GetCurrWeapon()->ToPB(p.mutable_weapon());
} }
if (sender->IsCar()) { if (sender.Get()->IsCar()) {
p.set_hole(sender->shot_hole); p.set_hole(sender.Get()->shot_hole);
} }
} }
{ {
int shot_idx = shots_.size() - 1; int shot_idx = shots_.size() - 1;
sender->TraverseAllLayerHumanList sender.Get()->TraverseAllLayerHumanList
( (
[shot_idx] (Human* hum, bool& stop) [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, MetaData::Equip* weapon_meta,
int weapon_lv, int weapon_lv,
a8::Vec2 born_pos, a8::Vec2 born_pos,
@ -79,7 +79,7 @@ void FrameEvent::AddBullet(Creature* sender,
std::get<0>(tuple) = sender; std::get<0>(tuple) = sender;
auto& p = std::get<1>(tuple); 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()); p.set_bullet_id(weapon_meta->i->use_bullet());
TypeConvert::ToPb(born_pos, p.mutable_pos()); TypeConvert::ToPb(born_pos, p.mutable_pos());
TypeConvert::ToPb(dir, p.mutable_dir()); TypeConvert::ToPb(dir, p.mutable_dir());
@ -92,7 +92,7 @@ void FrameEvent::AddBullet(Creature* sender,
} }
{ {
int bullet_idx = bullets_.size() - 1; int bullet_idx = bullets_.size() - 1;
sender->TraverseAllLayerHumanList sender.Get()->TraverseAllLayerHumanList
( (
[bullet_idx] (Human* hum, bool& stop) [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); if (sender.Get()->IsHuman()) {
chged_bullet_nums_.push_back(sender);
int idx = chged_bullet_nums_.size() - 1; int idx = chged_bullet_nums_.size() - 1;
hum->chged_bullet_nums_.push_back(idx); ((Human*)sender.Get())->chged_bullet_nums_.push_back(idx);
}
} }
void FrameEvent::AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos) 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 chged_weapon_ammo_.push_back
( (
std::make_tuple(hum, std::make_tuple(sender,
hum->GetCurrWeapon()->weapon_idx, sender.Get()->GetCurrWeapon()->weapon_idx,
hum->GetCurrWeapon()->ammo sender.Get()->GetCurrWeapon()->ammo
) )
); );
int idx = chged_weapon_ammo_.size() - 1; 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)); if (sender.Get()->IsHuman()) {
chged_items_.push_back(std::make_tuple(sender, item_id, item_num));
int idx = chged_items_.size() - 1; int idx = chged_items_.size() - 1;
hum->chged_items_.push_back(idx); ((Human*)sender.Get())->chged_items_.push_back(idx);
}
} }
void FrameEvent::AddZombieIdChg(Human* sender) void FrameEvent::AddZombieIdChg(CreatureWeakPtr& sender)
{ {
chged_zombieids_.push_back(sender); chged_zombieids_.push_back(sender);
int idx = chged_zombieids_.size() - 1; int idx = chged_zombieids_.size() - 1;
{ {
sender->TraverseAllLayerHumanList sender.Get()->TraverseAllLayerHumanList
( (
[idx] (Human* hum, bool& stop) [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); chged_cars_.push_back(sender);
int idx = chged_cars_.size() - 1; int idx = chged_cars_.size() - 1;
sender->TraverseAllLayerHumanList sender.Get()->TraverseAllLayerHumanList
( (
[idx] (Human* hum, bool& stop) [idx] (Human* hum, bool& stop)
{ {

View File

@ -12,9 +12,9 @@ struct FrameEvent
{ {
public: public:
void AddAirDrop(int appear_time, int box_id, a8::Vec2 box_pos); void AddAirDrop(int appear_time, int box_id, a8::Vec2 box_pos);
void AddEmote(Human* hum, int emote_id); void AddEmote(CreatureWeakPtr& sender, int emote_id);
void AddShot(Creature* sender); void AddShot(CreatureWeakPtr& sender);
void AddBullet(Creature* sender, void AddBullet(CreatureWeakPtr& sender,
MetaData::Equip* weapon_meta, MetaData::Equip* weapon_meta,
int weapon_lv, int weapon_lv,
a8::Vec2 born_pos, a8::Vec2 born_pos,
@ -24,37 +24,37 @@ public:
void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos); void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos);
void AddPlaySkill(CreatureWeakPtr& sender, int skill_id); void AddPlaySkill(CreatureWeakPtr& sender, int skill_id);
void AddExplosionEx(CreatureWeakPtr& sender, int item_id, a8::Vec2 bomb_pos, int effect); 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 AddHpChg(CreatureWeakPtr& sender);
void AddWeaponAmmoChg(Human* hum); void AddWeaponAmmoChg(CreatureWeakPtr& sender);
void AddBuff(CreatureWeakPtr& sender, Buff* buff); void AddBuff(CreatureWeakPtr& sender, Buff* buff);
void RemoveBuff(CreatureWeakPtr& sender, int buff_id); void RemoveBuff(CreatureWeakPtr& sender, int buff_id);
void AddSkillCdChg(CreatureWeakPtr sender, int skill_id, int left_time); void AddSkillCdChg(CreatureWeakPtr sender, int skill_id, int left_time);
void AddSkillCurrTimesChg(CreatureWeakPtr sender, int skill_id, int curr_times); void AddSkillCurrTimesChg(CreatureWeakPtr sender, int skill_id, int curr_times);
void AddItemChg(Human* hum, int item_id, int item_num); void AddItemChg(CreatureWeakPtr& sender, int item_id, int item_num);
void AddZombieIdChg(Human* hum); void AddZombieIdChg(CreatureWeakPtr& sender);
void AddDead(CreatureWeakPtr& sender, int revive_time); void AddDead(CreatureWeakPtr& sender, int revive_time);
void AddRevive(CreatureWeakPtr& sender); void AddRevive(CreatureWeakPtr& sender);
void AddCarChg(Human* sender); void AddCarChg(CreatureWeakPtr& sender);
void Clear(); void Clear();
private: private:
::google::protobuf::RepeatedPtrField<::cs::MFAirDrop> airdrops_; ::google::protobuf::RepeatedPtrField<::cs::MFAirDrop> airdrops_;
std::vector<std::tuple<Creature*, ::cs::MFShot>> shots_; std::vector<std::tuple<CreatureWeakPtr, ::cs::MFShot>> shots_;
std::vector<std::tuple<Creature*, ::cs::MFBullet>> bullets_; std::vector<std::tuple<CreatureWeakPtr, ::cs::MFBullet>> bullets_;
std::vector<std::tuple<CreatureWeakPtr, ::cs::MFExplosion>> explosions_; std::vector<std::tuple<CreatureWeakPtr, ::cs::MFExplosion>> explosions_;
std::vector<std::tuple<CreatureWeakPtr, ::cs::MFSmoke>> smokes_; std::vector<std::tuple<CreatureWeakPtr, ::cs::MFSmoke>> smokes_;
std::vector<std::tuple<CreatureWeakPtr, ::cs::MFPlaySkill>> play_skills_; std::vector<std::tuple<CreatureWeakPtr, ::cs::MFPlaySkill>> play_skills_;
std::vector<std::tuple<Creature*, ::cs::MFEmote>> emotes_; std::vector<std::tuple<CreatureWeakPtr, ::cs::MFEmote>> emotes_;
std::vector<std::tuple<CreatureWeakPtr, ::cs::MFBuffChg>> chged_buffs_; std::vector<std::tuple<CreatureWeakPtr, ::cs::MFBuffChg>> chged_buffs_;
std::vector<std::tuple<Human*, int, int>> chged_items_; std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_items_;
std::vector<Human*> chged_bullet_nums_; std::vector<CreatureWeakPtr> chged_bullet_nums_;
std::vector<std::tuple<Human*, int, int>> chged_weapon_ammo_; std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_weapon_ammo_;
std::vector<CreatureWeakPtr> chged_hps_; std::vector<CreatureWeakPtr> chged_hps_;
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skillcds_; std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skillcds_;
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skill_curr_times_; std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skill_curr_times_;
std::vector<Human*> chged_zombieids_; std::vector<CreatureWeakPtr> chged_zombieids_;
std::vector<Human*> chged_cars_; std::vector<CreatureWeakPtr> chged_cars_;
std::vector<std::tuple<int, int, int>> dead_alive_objs_; std::vector<std::tuple<int, int, int>> dead_alive_objs_;
friend class FrameMaker; friend class FrameMaker;

View File

@ -92,7 +92,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum)
for (size_t idx : hum->shots_) { for (size_t idx : hum->shots_) {
if (idx < room->frame_event.shots_.size()) { if (idx < room->frame_event.shots_.size()) {
auto& tuple = room->frame_event.shots_[idx]; 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); *msg->add_shots() = std::get<1>(tuple);
} else { } else {
#ifdef DEBUG1 #ifdef DEBUG1
@ -108,7 +108,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum)
for (size_t idx : hum->bullets_) { for (size_t idx : hum->bullets_) {
if (idx < room->frame_event.bullets_.size()) { if (idx < room->frame_event.bullets_.size()) {
auto& tuple = room->frame_event.bullets_[idx]; 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); *msg->add_bullets() = std::get<1>(tuple);
} }
} }
@ -144,19 +144,19 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum)
for (size_t idx : hum->emotes_) { for (size_t idx : hum->emotes_) {
if (idx < room->frame_event.emotes_.size()) { if (idx < room->frame_event.emotes_.size()) {
auto& tuple = room->frame_event.emotes_[idx]; 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); *msg->add_emotes() = std::get<1>(tuple);
} }
} }
} }
for (size_t idx : hum->chged_bullet_nums_) { for (size_t idx : hum->chged_bullet_nums_) {
if (idx < room->frame_event.chged_bullet_nums_.size()) { if (idx < room->frame_event.chged_bullet_nums_.size()) {
Human* target = room->frame_event.chged_bullet_nums_[idx]; CreatureWeakPtr& target = room->frame_event.chged_bullet_nums_[idx];
if (target->GetCurrWeapon()) { if (target.Get()->GetCurrWeapon()) {
auto p = msg->add_chged_property_list(); 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_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& tuple = room->frame_event.chged_items_[idx];
{ {
auto p = msg->add_chged_property_list(); 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_type(kPropItem);
p->set_property_subtype(std::get<1>(tuple)); p->set_property_subtype(std::get<1>(tuple));
p->set_value(std::get<2>(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& tuple = room->frame_event.chged_weapon_ammo_[idx];
{ {
auto p = msg->add_chged_property_list(); 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_type(kPropWeaponAmmo);
p->set_property_subtype(std::get<1>(tuple)); p->set_property_subtype(std::get<1>(tuple));
p->set_value(std::get<2>(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& chg_hum = room->frame_event.chged_zombieids_[idx];
{ {
auto p = msg->add_chged_property_list(); 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_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_) { for (size_t idx : hum->chged_cars_) {
if (idx < room->frame_event.chged_cars_.size()) { if (idx < room->frame_event.chged_cars_.size()) {
Human* target = room->frame_event.chged_cars_[idx]; CreatureWeakPtr& target = room->frame_event.chged_cars_[idx];
if (hum->CanSee(target)) { if (target.Get() && target.Get()->IsHuman() && hum->CanSee(target.Get())) {
auto p = msg->add_chged_property_list(); 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); p->set_property_type(kPropCar);
if (target->GetCar()) { if (target.Get()->AsHuman()->GetCar()) {
p->set_property_subtype(target->GetCar()->meta->i->id()); p->set_property_subtype(target.Get()->AsHuman()->GetCar()->meta->i->id());
p->set_value(target->GetSeat()); p->set_value(target.Get()->AsHuman()->GetSeat());
} else { } else {
p->set_property_subtype(0); p->set_property_subtype(0);
p->set_value(0); p->set_value(0);

View File

@ -1824,7 +1824,7 @@ void Human::ChangeToRace(RaceType_e race, int level)
void Human::ChangeToRaceAndNotify(RaceType_e race, int level) void Human::ChangeToRaceAndNotify(RaceType_e race, int level)
{ {
ChangeToRace(race, level); ChangeToRace(race, level);
room->frame_event.AddZombieIdChg(this); room->frame_event.AddZombieIdChg(GetWeakPtrRef());
} }
void Human::WinExp(Human* sender, int exp) void Human::WinExp(Human* sender, int exp)
@ -1866,7 +1866,7 @@ void Human::WinExp(Human* sender, int exp)
} }
} while (true); } while (true);
if (old_meta != meta) { if (old_meta != meta) {
room->frame_event.AddZombieIdChg(this); room->frame_event.AddZombieIdChg(GetWeakPtrRef());
OnMetaChange(); OnMetaChange();
if (GetRace() == kZombieRace && meta->i->level() == 3) { if (GetRace() == kZombieRace && meta->i->level() == 3) {
room->OnZombieAppear(this); room->OnZombieAppear(this);
@ -2654,7 +2654,7 @@ void Human::AddItem(int item_id, int item_num)
} }
if (room && room->GetFrameNo() > join_frameno) { 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 { } else {
if (item_num <= 0) { if (item_num <= 0) {
battling_items_.insert(item_id); battling_items_.insert(item_id);
@ -2667,7 +2667,7 @@ void Human::DecItem(int item_id, int item_num)
auto itr = items_.find(item_id); auto itr = items_.find(item_id);
if (itr != items_.end()) { if (itr != items_.end()) {
itr->second -= item_num; 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 (itr->second <= 0) {
if (battling_items_.find(item_id) == battling_items_.end()) { if (battling_items_.find(item_id) == battling_items_.end()) {
items_.erase(itr); items_.erase(itr);

View File

@ -380,7 +380,7 @@ void Player::UpdateSpectate()
void Player::UpdateEmote() void Player::UpdateEmote()
{ {
room->frame_event.AddEmote(this, emote_id); room->frame_event.AddEmote(GetWeakPtrRef(), emote_id);
emote = false; emote = false;
emote_id = 0; emote_id = 0;
} }