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

View File

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

View File

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

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

View File

@ -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<std::tuple<Creature*, ::cs::MFShot>> shots_;
std::vector<std::tuple<Creature*, ::cs::MFBullet>> bullets_;
std::vector<std::tuple<CreatureWeakPtr, ::cs::MFShot>> shots_;
std::vector<std::tuple<CreatureWeakPtr, ::cs::MFBullet>> bullets_;
std::vector<std::tuple<CreatureWeakPtr, ::cs::MFExplosion>> explosions_;
std::vector<std::tuple<CreatureWeakPtr, ::cs::MFSmoke>> smokes_;
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<Human*, int, int>> chged_items_;
std::vector<Human*> chged_bullet_nums_;
std::vector<std::tuple<Human*, int, int>> chged_weapon_ammo_;
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_items_;
std::vector<CreatureWeakPtr> chged_bullet_nums_;
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_weapon_ammo_;
std::vector<CreatureWeakPtr> chged_hps_;
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skillcds_;
std::vector<std::tuple<CreatureWeakPtr, int, int>> chged_skill_curr_times_;
std::vector<Human*> chged_zombieids_;
std::vector<Human*> chged_cars_;
std::vector<CreatureWeakPtr> chged_zombieids_;
std::vector<CreatureWeakPtr> chged_cars_;
std::vector<std::tuple<int, int, int>> dead_alive_objs_;
friend class FrameMaker;

View File

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

View File

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

View File

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