This commit is contained in:
aozhiwei 2019-07-09 18:00:57 +08:00
parent 36984c1e30
commit af66554d4d
10 changed files with 176 additions and 34 deletions

View File

@ -184,6 +184,17 @@ enum BuffTriggerType_e
BTT_UseItem = 6 //使用道具触发
};
enum BuffEffectType_e
{
BET_ChgAttr = 1, //改变属性
BET_Vertigo = 2, //眩晕
BET_LastDmg = 3, //持续伤害
BET_LastBurn = 4, //持续灼烧
BET_Invincible = 5, //无敌
BET_Hide = 6, //隐身
BET_Dcgr = 7, //电磁干扰
};
enum SkillFunc_e
{
Skill_FuncNone = 0,

View File

@ -148,19 +148,39 @@ void FrameEvent::AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos)
}
}
void FrameEvent::AddDead(Human* sender)
void FrameEvent::AddDead(Human* hum)
{
dead_objs_.push_back(
std::make_tuple(
sender->entity_uniid,
MetaMgr::Instance()->revive_time * 1000
)
);
{
dead_objs_.push_back(
std::make_tuple(
hum->entity_uniid,
MetaMgr::Instance()->revive_time * 1000
)
);
}
{
int dead_idx = dead_objs_.size() - 1;
for (auto& cell : hum->grid_list) {
for (auto& hum : cell->human_list) {
hum->dead_objs_.push_back(dead_idx);
}
}
}
}
void FrameEvent::AddRevive(Human* sender)
void FrameEvent::AddRevive(Human* hum)
{
revive_objids_.push_back(sender->entity_uniid);
{
revive_objs_.push_back(hum->entity_uniid);
}
{
int revive_idx = revive_objs_.size() - 1;
for (auto& cell : hum->grid_list) {
for (auto& hum : cell->human_list) {
hum->revive_objs_.push_back(revive_idx);
}
}
}
}
void FrameEvent::Clear()
@ -183,8 +203,8 @@ void FrameEvent::Clear()
if (airdrops_.size() > 0) {
airdrops_.Clear();
}
if (!revive_objids_.empty()) {
revive_objids_.clear();
if (!revive_objs_.empty()) {
revive_objs_.clear();
}
if (!dead_objs_.empty()) {
dead_objs_.clear();

View File

@ -14,8 +14,8 @@ public:
void AddExplosion(Bullet* bullet, int item_id, a8::Vec2 bomb_pos);
void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos);
void AddExplosionEx(Human* sender, int item_id, a8::Vec2 bomb_pos, int effect);
void AddDead(Human* sender);
void AddRevive(Human* sender);
void AddDead(Human* hum);
void AddRevive(Human* hum);
void Clear();
private:
@ -25,7 +25,9 @@ private:
std::vector<std::tuple<Human*, ::cs::MFExplosion>> explosions_;
std::vector<std::tuple<Human*, ::cs::MFSmoke>> smokes_;
std::vector<std::tuple<Human*, ::cs::MFEmote>> emotes_;
std::vector<int> revive_objids_;
std::vector<std::tuple<Human*, ::cs::MFBuff>> add_buffs_;
std::vector<int> remove_buffs_;
std::vector<int> revive_objs_;
std::vector<std::tuple<int, int>> dead_objs_;
friend class FrameMaker;

View File

@ -63,13 +63,17 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum)
}
}
}
for (int objid : room->frame_event.revive_objids_) {
msg->add_revive_objids(objid);
for (int idx : hum->revive_objs_) {
if (idx < room->frame_event.revive_objs_.size()) {
msg->add_revive_objids(room->frame_event.revive_objs_[idx]);
}
}
for (auto& tuple : room->frame_event.dead_objs_) {
auto p = msg->add_dead_objs();
p->add_values(std::get<0>(tuple));
p->add_values(std::get<1>(tuple));
for (int idx : hum->dead_objs_) {
if (idx < room->frame_event.dead_objs_.size()) {
auto p = msg->add_dead_objs();
p->add_values(std::get<0>(room->frame_event.dead_objs_[idx]));
p->add_values(std::get<1>(room->frame_event.dead_objs_[idx]));
}
}
if (room->frame_event.airdrops_.size() > 0) {
*msg->mutable_airdrop() = room->frame_event.airdrops_.Get(0);

View File

@ -1299,7 +1299,53 @@ int Human::GetSkillCd()
void Human::TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type)
{
auto itr = skill_meta->trigger_type_buffs.find(trigger_type);
if (itr != skill_meta->trigger_type_buffs.end()) {
for (MetaData::Buff* buff_meta : itr->second) {
for (Entity* entity : target_list) {
if (entity->entity_type != ET_Player) {
continue;
}
Human* hum = (Human*)entity;
switch (buff_meta->i->buff_target()) {
case 1: //自己
{
if (hum == this) {
hum->AddBuff(buff_meta);
}
}
break;
case 2: //友军
{
if (hum->team_id == team_id) {
hum->AddBuff(buff_meta);
}
}
break;
case 3: //敌军
{
if (hum->team_id != team_id) {
hum->AddBuff(buff_meta);
}
}
break;
}
}//end for target_list
}//end for buff_list
}
}
void Human::AddBuff(MetaData::Buff* buff_meta)
{
if (!buff_meta->EffectCanStack()) {
Buff* buff = GetBuffByEffectId(buff_meta->i->buff_effect());
if (buff) {
return;
}
}
Buff* buff = &a8::FastAppend(buff_list_);
buff->meta = buff_meta;
buff_effect_hash_[buff->meta->i->buff_id()] = buff;
}
void Human::_UpdateMove(int speed)
@ -1356,6 +1402,18 @@ void Human::ClearFrameData()
if (!emotes_.empty()) {
emotes_.clear();
}
if (!add_buffs_.empty()) {
add_buffs_.clear();
}
if (!remove_buffs_.empty()) {
remove_buffs_.clear();
}
if (!revive_objs_.empty()) {
revive_objs_.clear();
}
if (!dead_objs_.empty()) {
dead_objs_.clear();
}
}
void Human::DeadDrop()
@ -1394,3 +1452,19 @@ void Human::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& ta
{
}
Buff* Human::GetBuffById(int buff_id)
{
for (Buff& buff : buff_list_) {
if (buff.meta->i->buff_id() == buff_id) {
return &buff;
}
}
return nullptr;
}
Buff* Human::GetBuffByEffectId(int effect_id)
{
auto itr = buff_effect_hash_.find(effect_id);
return itr != buff_effect_hash_.end() ? itr->second : nullptr;
}

View File

@ -199,6 +199,7 @@ class Human : public Entity
int GetSkillLeftTime();
int GetSkillCd();
void TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type);
void AddBuff(MetaData::Buff* buff_meta);
protected:
void _UpdateMove(int speed);
@ -208,6 +209,8 @@ private:
void DeadDrop();
void Revive();
void SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& target_list);
Buff* GetBuffById(int buff_id);
Buff* GetBuffByEffectId(int effect_id);
protected:
long long last_shot_frameno_ = 0;
@ -234,6 +237,10 @@ protected:
std::vector<int> bullets_;
std::vector<int> smokes_;
std::vector<int> explosions_;
std::vector<int> add_buffs_;
std::vector<int> remove_buffs_;
std::vector<int> revive_objs_;
std::vector<int> dead_objs_;
std::set<Human*> observers_;
Human* follow_target_ = nullptr;
bool follow_synced_active_player = false;
@ -242,6 +249,7 @@ private:
CircleCollider* self_collider_ = nullptr;
long long last_sync_gas_frameno = 0;
std::list<Buff> buff_list_;
std::map<int, Buff*> buff_effect_hash_;
bool already_report_battle_ = false;
bool sent_game_end_ = false;

View File

@ -1,6 +1,7 @@
#include "precompile.h"
#include "metadata.h"
#include "metamgr.h"
namespace MetaData
{
@ -395,12 +396,31 @@ namespace MetaData
}
}
}
{
for (int buff_id : buff_list) {
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
if (!buff_meta) {
abort();
}
auto itr = trigger_type_buffs.find(buff_meta->i->buff_id());
if (itr != trigger_type_buffs.end()) {
itr->second.insert(buff_meta);
} else {
trigger_type_buffs[buff_meta->i->buff_id()] = std::set<MetaData::Buff*>({buff_meta});
}
}
}
}
void Buff::Init()
{
}
bool Buff::EffectCanStack()
{
return i->buff_effect() == BET_ChgAttr;
}
void Dress::Init()
{
for (size_t j = 0; j < i->max_lv(); ++j) {

View File

@ -126,6 +126,14 @@ namespace MetaData
int rand_space = 0;
};
struct Buff
{
const metatable::Buff* i = nullptr;
void Init();
bool EffectCanStack();
};
struct SkillPhase
{
int phase_idx = 0;
@ -146,16 +154,10 @@ namespace MetaData
void Init();
std::set<int> buff_list;
std::map<int, std::set<MetaData::Buff*>> trigger_type_buffs;
std::vector<MetaData::SkillPhase> phases;
};
struct Buff
{
const metatable::Buff* i = nullptr;
void Init();
};
struct Dress
{
const metatable::Dress* i = nullptr;

View File

@ -247,13 +247,6 @@ private:
dress_hash[item.i->id()] = &item;
}
for (auto& meta : skill_meta_list) {
MetaData::Skill& item = a8::FastAppend(skill_list);
item.i = &meta;
item.Init();
skill_hash[item.i->skill_id()] = &item;
}
for (auto& meta : buff_meta_list) {
MetaData::Buff& item = a8::FastAppend(buff_list);
item.i = &meta;
@ -261,6 +254,13 @@ private:
buff_hash[item.i->buff_id()] = &item;
}
for (auto& meta : skill_meta_list) {
MetaData::Skill& item = a8::FastAppend(skill_list);
item.i = &meta;
item.Init();
skill_hash[item.i->skill_id()] = &item;
}
for (auto& meta : attr_meta_list) {
MetaData::Attr& item = a8::FastAppend(attr_list);
item.i = &meta;

View File

@ -466,6 +466,7 @@ message MFBullet
//
optional int32 bullet_uniid = 7; //id
optional int32 target_id = 8; //id
optional int32 hit_time = 9; //
optional int32 gun_id = 10; //id
optional float fly_distance = 11; //