1
This commit is contained in:
parent
36984c1e30
commit
af66554d4d
@ -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,
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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; //只有手雷和烟雾弹时这个字段才有意义
|
||||
|
Loading…
x
Reference in New Issue
Block a user