diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index e09d56e..ff1ca0e 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -361,15 +361,12 @@ void Buff::ProcSprint() Buff* buff = (Buff*)param.sender.GetUserData(); std::set* hited_objects = (std::set*)param.param1.GetUserData(); std::set enemys; - buff->owner->GetHitEnemys(enemys, buff->meta->param4); + buff->owner->GetHitEnemys(enemys, buff->meta->param2); for (auto& enemy : enemys) { - if (!buff->meta->int_param5 && enemy->IsEntityType(ET_Car)) { + if (enemy->IsEntityType(ET_Car)) { continue; } - if (enemy->IsHuman() && enemy->AsHuman()->GetCar()) { - continue; - } - if (hited_objects->find(enemy->GetUniId()) == hited_objects->end()) { + if (hited_objects->find(enemy->GetUniId()) != hited_objects->end()) { hited_objects->insert(enemy->GetUniId()); for (int buff_id : buff->meta->param3_int_list) { enemy->TryAddBuff(buff->owner, buff_id); diff --git a/server/gameserver/framedata.cc b/server/gameserver/framedata.cc index c51f310..d2c44ee 100644 --- a/server/gameserver/framedata.cc +++ b/server/gameserver/framedata.cc @@ -82,15 +82,6 @@ void FrameData::ClearFrameData(Human* hum) if (!chged_weapon_ammo_.empty()) { chged_weapon_ammo_.clear(); } - if (!chged_level_.empty()) { - chged_level_.clear(); - } - if (!chged_exp_.empty()) { - chged_exp_.clear(); - } - if (!chged_race_.empty()) { - chged_race_.clear(); - } if (!dead_alive_objs_.empty()) { dead_alive_objs_.clear(); } diff --git a/server/gameserver/framedata.h b/server/gameserver/framedata.h index 3d580d3..54c2047 100644 --- a/server/gameserver/framedata.h +++ b/server/gameserver/framedata.h @@ -35,9 +35,6 @@ class FrameData std::vector chged_skill_curr_times_; std::vector chged_items_; std::vector chged_weapon_ammo_; - std::vector chged_level_; - std::vector chged_exp_; - std::vector chged_race_; std::vector dead_alive_objs_; std::vector chged_cars_; std::vector chged_props_; diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index efa329a..34d9f28 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -70,337 +70,31 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) { FrameData* framedata = &hum->framedata_; cs::SMUpdate* msg = new cs::SMUpdate; + Room* room = hum->room; + { + } + SerializeNewObjects(msg, room, hum, framedata); + SerializePartObjects(msg, room, hum, framedata); + SerializeDelObjects(msg, room, hum, framedata); + SerializeOutObjects(msg, room, hum, framedata); + SerializeShots(msg, room, hum, framedata); + SerializeBullets(msg, room, hum, framedata); + SerializeDelBullets(msg, room, hum, framedata); + SerializeExplosions(msg, room, hum, framedata); + SerializeSmokes(msg, room, hum, framedata); + SerializePlaySkills(msg, room, hum, framedata); + SerializeEmotes(msg, room, hum, framedata); + SerializeChgedBulletNums(msg, room, hum, framedata); + SerializeChgedBuffs(msg, room, hum, framedata); + SerializeChgedSkillCds(msg, room, hum, framedata); + SerializeChgedSkillCurrTimes(msg, room, hum, framedata); + SerializeChgedHps(msg, room, hum, framedata); + SerializeChgedItems(msg, room, hum, framedata); + SerializeChgedWeaponAmmo(msg, room, hum, framedata); + SerializeDeadAliveObjs(msg, room, hum, framedata); + SerializeChgedCars(msg, room, hum, framedata); + SerializeChgedProps(msg, room, hum, framedata); { - Room* room = hum->room; - msg->set_frameno(room->GetFrameNo() / 2); - if (room->GetGasData().gas_mode == GasJump) { - cs::MFPlane* p = msg->mutable_plane(); - TypeConvert::ToPb(room->plane.start_point, p->mutable_start_point()); - TypeConvert::ToPb(room->plane.end_point, p->mutable_end_point()); - TypeConvert::ToPb(room->plane.curr_pos, p->mutable_pos()); - } -#ifdef DEBUG - Debug_FullObject(hum); -#endif - for (auto& pair : framedata->new_objects) { - Entity* e = pair.second.Get(); - if (!e) { - continue; - } -#ifdef DEBUG - if (framedata->del_objects.find(e->GetUniId()) != framedata->del_objects.end()) { - abort(); - } -#endif - if (e != hum && - e->GetEntityType() == ET_Player && - ((Human*)e)->HasBuffEffect(kBET_Fly)){ - continue; - } - if ((hum->IsPlayer() || hum->HasObserver()) && e->CanSeeMe(hum)) { - e->FillMFObjectFull(room, (Human*)hum, msg->add_full_objects()); -#ifdef DEBUG - if (e->GetEntityType() == ET_Car) { - hum->SendDebugMsg(a8::Format("载具出现", {})); - } -#endif - } - #ifdef DEBUG - if (App::Instance()->HasFlag(2) && e->GetEntityType() == ET_Player) { - room->BroadcastDebugMsg(a8::Format("投放 %d pos:%d,%d 出现", - { - e->GetUniId(), - e->GetPos().x, - e->GetPos().y, - })); - } - #endif - } - { - int deleted_uniid = 0; - for (auto& pair : framedata->part_objects) { - Entity* entity = pair.second.object.Get(); - if (!entity) { -#ifdef DEBUG - abort(); -#endif - deleted_uniid = pair.first; - continue; - } - if (entity->IsDead(room) && - hum->room->GetFrameNo() - entity->GetDeadFrameNo(room) > 10) { - continue; - } else { - if (room->GetGasData().gas_mode == GasJump && - entity != hum && - entity->GetEntityType() == ET_Player && - ((Human*)entity)->HasBuffEffect(kBET_Fly)) { - continue; - } - } -#if 0 - if (((Human*)hum)->GetPos().ManhattanDistance(entity->GetPos()) > VIEW_RANGE + 300) { - continue; - } -#endif - entity->FillMFObjectPart(room, (Human*)hum, msg->add_part_objects()); - } - if (deleted_uniid > 0) { - framedata->part_objects.erase(deleted_uniid); - } - } - for (auto& itr : framedata->del_objects) { - msg->add_del_objids(itr); - #ifdef DEBUG - if (App::Instance()->HasFlag(2)) { - room->BroadcastDebugMsg(a8::Format("投放 删除对象%d", - { - itr - })); - } - #endif - } -#ifdef DEBUG - Debug_OutObject(hum); -#endif - for (auto& itr : framedata->out_objects) { - msg->add_out_objids(itr); - #ifdef DEBUG - if (App::Instance()->HasFlag(2)) { - room->BroadcastDebugMsg(a8::Format("投放 移除视野对象%d", - { - itr - })); - } - #endif - } - for (size_t idx : framedata->shots_) { - if (idx < room->frame_event.shots_.size()) { - auto& tuple = room->frame_event.shots_[idx]; - if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { - *msg->add_shots() = std::get<1>(tuple); - } else { -#ifdef DEBUG1 - abort(); -#endif - } - } else { -#ifdef DEBUG - abort(); -#endif - } - } - for (size_t idx : framedata->bullets_) { - if (idx < room->frame_event.bullets_.size()) { - auto& tuple = room->frame_event.bullets_[idx]; - if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { - *msg->add_bullets() = std::get<1>(tuple); - } - } - } - for (size_t idx : framedata->del_bullets_) { - if (idx < room->frame_event.del_bullets_.size()) { - int bullet_uniid = room->frame_event.del_bullets_[idx]; - msg->add_del_bullets(bullet_uniid); - } - } - for (size_t idx : framedata->explosions_) { - if (idx < room->frame_event.explosions_.size()) { - auto& tuple = room->frame_event.explosions_[idx]; - *msg->add_explosions() = std::get<1>(tuple); -#ifdef DEBUG - a8::XPrintf("AddExplosion %d, %s pos=%d,%d effect:%d\n", - { - hum->GetUniId(), - hum->name, - std::get<1>(tuple).pos().x(), - std::get<1>(tuple).pos().y(), - std::get<1>(tuple).effect() - }); -#endif - } - } - for (size_t idx : framedata->smokes_) { - if (idx < room->frame_event.smokes_.size()) { - auto& tuple = room->frame_event.smokes_[idx]; - if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { - *msg->add_smokes() = std::get<1>(tuple); - } - } - } - for (size_t idx : framedata->play_skills_) { - if (idx < room->frame_event.play_skills_.size()) { - auto& tuple = room->frame_event.play_skills_[idx]; - if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { - *msg->add_play_skill_list() = std::get<1>(tuple); - } - } - } - for (size_t idx : framedata->emotes_) { - if (idx < room->frame_event.emotes_.size()) { - auto& tuple = room->frame_event.emotes_[idx]; - if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { - *msg->add_emotes() = std::get<1>(tuple); - } - } - } - for (size_t idx : framedata->chged_bullet_nums_) { - if (idx < room->frame_event.chged_bullet_nums_.size()) { - 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.Get()->GetUniId()); - p->set_property_type(kPropBulletNum); - p->set_value(target.Get()->GetCurrWeapon()->ammo); - } - } - } - #if 0 - for (size_t idx : hum->chged_tank_bullet_nums_) { - if (idx < room->frame_event.chged_tank_bullet_nums_.size()) { - Human* target = room->frame_event.chged_tank_bullet_nums_[idx]; - if (target->GetCurrWeapon()) { - auto p = msg->add_chged_property_list(); - p->set_obj_id(target->GetUniId()); - p->set_property_type(kPropTankBulletNum); - p->set_value(target->tank_weapon.ammo); - } - } - } - for (size_t idx : hum->chged_tank_oil_max_) { - if (idx < room->frame_event.chged_tank_oil_max_.size()) { - Human* target = room->frame_event.chged_tank_oil_max_[idx]; - auto p = msg->add_chged_property_list(); - p->set_obj_id(target->GetUniId()); - p->set_property_type(kPropTankOil); - p->set_property_subtype(1); - p->set_value(target->tank_oil_max); - } - } - for (size_t idx : hum->chged_tank_oil_value_) { - if (idx < room->frame_event.chged_tank_oil_value_.size()) { - Human* target = room->frame_event.chged_tank_oil_value_[idx]; - auto p = msg->add_chged_property_list(); - p->set_obj_id(target->GetUniId()); - p->set_property_type(kPropTankOil); - p->set_property_subtype(0); - p->set_value(target->tank_oil_value); - } - } - #endif - for (size_t idx : framedata->chged_buffs_) { - if (idx < room->frame_event.chged_buffs_.size()) { - auto p = msg->add_chged_buff_list(); - *p = std::get<1>(room->frame_event.chged_buffs_[idx]); - } - } - for (size_t idx : framedata->chged_skillcds_) { - if (idx < room->frame_event.chged_skillcds_.size()) { - auto tuple = room->frame_event.chged_skillcds_[idx]; - CreatureWeakPtr target = std::get<0>(tuple); - int skill_id = std::get<1>(tuple); - int left_time = std::get<2>(tuple); - if (target.Get()) { - auto p = msg->add_chged_property_list(); - p->set_obj_id(target.Get()->GetUniId()); - p->set_property_type(kPropSkillLeftTime); - p->set_property_subtype(skill_id); - p->set_value(left_time); - } - } - } - for (size_t idx : framedata->chged_skill_curr_times_) { - if (idx < room->frame_event.chged_skill_curr_times_.size()) { - auto tuple = room->frame_event.chged_skill_curr_times_[idx]; - CreatureWeakPtr& target = std::get<0>(tuple); - int skill_id = std::get<1>(tuple); - int curr_times = std::get<2>(tuple); - if (target.Get()) { - auto p = msg->add_chged_property_list(); - p->set_obj_id(target.Get()->GetUniId()); - p->set_property_type(kPropSkillCurrTimes); - p->set_property_subtype(skill_id); - p->set_value(curr_times); - } - } - } - for (size_t idx : framedata->chged_hps_) { - if (idx < room->frame_event.chged_hps_.size()) { - CreatureWeakPtr& target = room->frame_event.chged_hps_[idx]; - if (target.Get() && hum->CanSee(target.Get())) { - { - auto p = msg->add_chged_property_list(); - p->set_obj_id(target.Get()->GetUniId()); - p->set_property_type(kPropHp); - p->set_value(target.Get()->GetHP()); - } - { - auto p = msg->add_chged_property_list(); - p->set_obj_id(target.Get()->GetUniId()); - p->set_property_type(kPropMaxHp); - p->set_value(target.Get()->GetMaxHP()); - } - } - } - } - for (size_t idx : framedata->chged_items_) { - if (idx < room->frame_event.chged_items_.size()) { - auto& tuple = room->frame_event.chged_items_[idx]; - { - auto p = msg->add_chged_property_list(); - 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)); - } - } - } - for (size_t idx : framedata->chged_weapon_ammo_) { - if (idx < room->frame_event.chged_weapon_ammo_.size()) { - auto& tuple = room->frame_event.chged_weapon_ammo_[idx]; - { - auto p = msg->add_chged_property_list(); - 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)); - } - } - } - for (size_t idx : framedata->dead_alive_objs_) { - if (idx < room->frame_event.dead_alive_objs_.size()) { - auto p = msg->add_dead_alive_objs(); - p->add_values(std::get<0>(room->frame_event.dead_alive_objs_[idx])); - p->add_values(std::get<1>(room->frame_event.dead_alive_objs_[idx])); - p->add_values(std::get<2>(room->frame_event.dead_alive_objs_[idx])); - } - } - for (size_t idx : framedata->chged_cars_) { - if (idx < room->frame_event.chged_cars_.size()) { - 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.Get()->GetUniId()); - p->set_property_type(kPropCar); - 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); - } - } - } - } - for (size_t idx : framedata->chged_props_) { - if (idx < room->frame_event.chged_props_.size()) { - auto& p = room->frame_event.chged_props_[idx]; - auto& target = std::get<0>(p); - if (target.Get()) { - *msg->add_chged_property_list() = std::get<1>(p); - } - } - } if (room->frame_event.airdrops_.size() > 0) { *msg->mutable_airdrop() = room->frame_event.airdrops_.Get(0); } @@ -418,3 +112,398 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) } return msg; } + +void FrameMaker::SerializeNewObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + #if 0 + msg->set_frameno(hum->room->GetFrameNo() / 2); + if (hum->room->GetGasData().gas_mode == GasJump) { + cs::MFPlane* p = msg->mutable_plane(); + TypeConvert::ToPb(hum->room->plane.start_point, p->mutable_start_point()); + TypeConvert::ToPb(hum->room->plane.end_point, p->mutable_end_point()); + TypeConvert::ToPb(hum->room->plane.curr_pos, p->mutable_pos()); + } + #endif +#ifdef DEBUG + Debug_FullObject(hum); +#endif + for (auto& pair : framedata->new_objects) { + Entity* e = pair.second.Get(); + if (!e) { + continue; + } +#ifdef DEBUG + if (framedata->del_objects.find(e->GetUniId()) != framedata->del_objects.end()) { + abort(); + } +#endif + if (e != hum && + e->GetEntityType() == ET_Player && + ((Human*)e)->HasBuffEffect(kBET_Fly)){ + continue; + } + if ((hum->IsPlayer() || hum->HasObserver()) && e->CanSeeMe(hum)) { + e->FillMFObjectFull(room, (Human*)hum, msg->add_full_objects()); +#ifdef DEBUG + if (e->GetEntityType() == ET_Car) { + hum->SendDebugMsg(a8::Format("载具出现", {})); + } +#endif + } +#ifdef DEBUG + if (App::Instance()->HasFlag(2) && e->GetEntityType() == ET_Player) { + hum->room->BroadcastDebugMsg(a8::Format("投放 %d pos:%d,%d 出现", + { + e->GetUniId(), + e->GetPos().x, + e->GetPos().y, + })); + } +#endif + } +} + +void FrameMaker::SerializePartObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + int deleted_uniid = 0; + for (auto& pair : framedata->part_objects) { + Entity* entity = pair.second.object.Get(); + if (!entity) { +#ifdef DEBUG + abort(); +#endif + deleted_uniid = pair.first; + continue; + } + if (entity->IsDead(room) && + hum->room->GetFrameNo() - entity->GetDeadFrameNo(room) > 10) { + continue; + } else { + if (room->GetGasData().gas_mode == GasJump && + entity != hum && + entity->GetEntityType() == ET_Player && + ((Human*)entity)->HasBuffEffect(kBET_Fly)) { + continue; + } + } +#if 0 + if (((Human*)hum)->GetPos().ManhattanDistance(entity->GetPos()) > VIEW_RANGE + 300) { + continue; + } +#endif + entity->FillMFObjectPart(room, (Human*)hum, msg->add_part_objects()); + } + if (deleted_uniid > 0) { + framedata->part_objects.erase(deleted_uniid); + } +} + +void FrameMaker::SerializeDelObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (auto& itr : framedata->del_objects) { + msg->add_del_objids(itr); +#ifdef DEBUG + if (App::Instance()->HasFlag(2)) { + room->BroadcastDebugMsg(a8::Format("投放 删除对象%d", + { + itr + })); + } +#endif + } +} + +void FrameMaker::SerializeOutObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ +#ifdef DEBUG + Debug_OutObject(hum); +#endif + for (auto& itr : framedata->out_objects) { + msg->add_out_objids(itr); + #ifdef DEBUG + if (App::Instance()->HasFlag(2)) { + room->BroadcastDebugMsg(a8::Format("投放 移除视野对象%d", + { + itr + })); + } + #endif + } +} + +void FrameMaker::SerializeShots(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->shots_) { + if (idx < room->frame_event.shots_.size()) { + auto& tuple = room->frame_event.shots_[idx]; + if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { + *msg->add_shots() = std::get<1>(tuple); + } else { +#ifdef DEBUG1 + abort(); +#endif + } + } else { +#ifdef DEBUG + abort(); +#endif + } + } +} + +void FrameMaker::SerializeEmotes(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->emotes_) { + if (idx < room->frame_event.emotes_.size()) { + auto& tuple = room->frame_event.emotes_[idx]; + if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { + *msg->add_emotes() = std::get<1>(tuple); + } + } + } +} + +void FrameMaker::SerializeBullets(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->bullets_) { + if (idx < room->frame_event.bullets_.size()) { + auto& tuple = room->frame_event.bullets_[idx]; + if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { + *msg->add_bullets() = std::get<1>(tuple); + } + } + } +} + +void FrameMaker::SerializeSmokes(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->smokes_) { + if (idx < room->frame_event.smokes_.size()) { + auto& tuple = room->frame_event.smokes_[idx]; + if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { + *msg->add_smokes() = std::get<1>(tuple); + } + } + } +} + +void FrameMaker::SerializePlaySkills(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->play_skills_) { + if (idx < room->frame_event.play_skills_.size()) { + auto& tuple = room->frame_event.play_skills_[idx]; + if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { + *msg->add_play_skill_list() = std::get<1>(tuple); + } + } + } +} + +void FrameMaker::SerializeExplosions(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->explosions_) { + if (idx < room->frame_event.explosions_.size()) { + auto& tuple = room->frame_event.explosions_[idx]; + *msg->add_explosions() = std::get<1>(tuple); +#ifdef DEBUG + a8::XPrintf("AddExplosion %d, %s pos=%d,%d effect:%d\n", + { + hum->GetUniId(), + hum->name, + std::get<1>(tuple).pos().x(), + std::get<1>(tuple).pos().y(), + std::get<1>(tuple).effect() + }); +#endif + } + } +} + +void FrameMaker::SerializeChgedBuffs(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->chged_buffs_) { + if (idx < room->frame_event.chged_buffs_.size()) { + auto p = msg->add_chged_buff_list(); + *p = std::get<1>(room->frame_event.chged_buffs_[idx]); + } + } +} + +void FrameMaker::SerializeChgedBulletNums(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->chged_bullet_nums_) { + if (idx < room->frame_event.chged_bullet_nums_.size()) { + 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.Get()->GetUniId()); + p->set_property_type(kPropBulletNum); + p->set_value(target.Get()->GetCurrWeapon()->ammo); + } + } + } +} + +void FrameMaker::SerializeChgedHps(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->chged_hps_) { + if (idx < room->frame_event.chged_hps_.size()) { + CreatureWeakPtr& target = room->frame_event.chged_hps_[idx]; + if (target.Get() && hum->CanSee(target.Get())) { + { + auto p = msg->add_chged_property_list(); + p->set_obj_id(target.Get()->GetUniId()); + p->set_property_type(kPropHp); + p->set_value(target.Get()->GetHP()); + } + { + auto p = msg->add_chged_property_list(); + p->set_obj_id(target.Get()->GetUniId()); + p->set_property_type(kPropMaxHp); + p->set_value(target.Get()->GetMaxHP()); + } + } + } + } +} + +void FrameMaker::SerializeChgedSkillCds(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->chged_skillcds_) { + if (idx < room->frame_event.chged_skillcds_.size()) { + auto tuple = room->frame_event.chged_skillcds_[idx]; + CreatureWeakPtr target = std::get<0>(tuple); + int skill_id = std::get<1>(tuple); + int left_time = std::get<2>(tuple); + if (target.Get()) { + auto p = msg->add_chged_property_list(); + p->set_obj_id(target.Get()->GetUniId()); + p->set_property_type(kPropSkillLeftTime); + p->set_property_subtype(skill_id); + p->set_value(left_time); + } + } + } +} + +void FrameMaker::SerializeChgedSkillCurrTimes(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->chged_skill_curr_times_) { + if (idx < room->frame_event.chged_skill_curr_times_.size()) { + auto tuple = room->frame_event.chged_skill_curr_times_[idx]; + CreatureWeakPtr& target = std::get<0>(tuple); + int skill_id = std::get<1>(tuple); + int curr_times = std::get<2>(tuple); + if (target.Get()) { + auto p = msg->add_chged_property_list(); + p->set_obj_id(target.Get()->GetUniId()); + p->set_property_type(kPropSkillCurrTimes); + p->set_property_subtype(skill_id); + p->set_value(curr_times); + } + } + } +} + +void FrameMaker::SerializeChgedItems(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->chged_items_) { + if (idx < room->frame_event.chged_items_.size()) { + auto& tuple = room->frame_event.chged_items_[idx]; + { + auto p = msg->add_chged_property_list(); + 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)); + } + } + } +} + +void FrameMaker::SerializeChgedWeaponAmmo(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->chged_weapon_ammo_) { + if (idx < room->frame_event.chged_weapon_ammo_.size()) { + auto& tuple = room->frame_event.chged_weapon_ammo_[idx]; + { + auto p = msg->add_chged_property_list(); + 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)); + } + } + } +} + +void FrameMaker::SerializeChgedLevel(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + +} + +void FrameMaker::SerializeChgedExp(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + +} + +void FrameMaker::SerializeChgedRace(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + +} + +void FrameMaker::SerializeDeadAliveObjs(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->dead_alive_objs_) { + if (idx < room->frame_event.dead_alive_objs_.size()) { + auto p = msg->add_dead_alive_objs(); + p->add_values(std::get<0>(room->frame_event.dead_alive_objs_[idx])); + p->add_values(std::get<1>(room->frame_event.dead_alive_objs_[idx])); + p->add_values(std::get<2>(room->frame_event.dead_alive_objs_[idx])); + } + } +} + +void FrameMaker::SerializeChgedCars(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->chged_cars_) { + if (idx < room->frame_event.chged_cars_.size()) { + 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.Get()->GetUniId()); + p->set_property_type(kPropCar); + 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); + } + } + } + } +} + +void FrameMaker::SerializeChgedProps(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->chged_props_) { + if (idx < room->frame_event.chged_props_.size()) { + auto& p = room->frame_event.chged_props_[idx]; + auto& target = std::get<0>(p); + if (target.Get()) { + *msg->add_chged_property_list() = std::get<1>(p); + } + } + } +} + +void FrameMaker::SerializeDelBullets(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (size_t idx : framedata->del_bullets_) { + if (idx < room->frame_event.del_bullets_.size()) { + int bullet_uniid = room->frame_event.del_bullets_[idx]; + msg->add_del_bullets(bullet_uniid); + } + } +} diff --git a/server/gameserver/framemaker.h b/server/gameserver/framemaker.h index a8949d6..92f7d23 100644 --- a/server/gameserver/framemaker.h +++ b/server/gameserver/framemaker.h @@ -4,6 +4,7 @@ class Human; class Room; +class FrameData; class FrameMaker { public: @@ -13,4 +14,29 @@ class FrameMaker private: void Debug_FullObject(Human* hum); void Debug_OutObject(Human* hum); + + void SerializeNewObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializePartObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeDelObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeOutObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeShots(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeEmotes(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeBullets(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeSmokes(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializePlaySkills(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeExplosions(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedBuffs(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedBulletNums(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedHps(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedSkillCds(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedSkillCurrTimes(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedItems(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedWeaponAmmo(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedLevel(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedExp(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedRace(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeDeadAliveObjs(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedCars(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeChgedProps(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeDelBullets(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); };