This commit is contained in:
aozhiwei 2019-07-10 10:25:55 +08:00
parent af66554d4d
commit ef34df3e7d
8 changed files with 181 additions and 18 deletions

View File

@ -0,0 +1,24 @@
#include "precompile.h"
#include "buff.h"
#include "metamgr.h"
#include "human.h"
#include "room.h"
int Buff::GetLeftTime()
{
int passed_ms = (owner->room->frame_no - add_frameno) * FRAME_RATE_MS;
return std::max(GetLastingTime() - passed_ms, 0);
}
int Buff::GetLastingTime()
{
return meta->i->duration_time() * 1000;
}
void Buff::FillMFBuff(cs::MFBuff* buff_pb)
{
buff_pb->set_buff_id(meta->i->buff_id());
buff_pb->set_left_time(GetLeftTime());
buff_pb->set_lasting_time(GetLastingTime());
}

View File

@ -10,6 +10,11 @@ namespace MetaData
struct Buff;
}
namespace cs
{
class MFBuff;
}
class Human;
class Buff
{
@ -20,4 +25,7 @@ class Buff
a8::XTimerAttacher xtimer_attacher;
long long add_frameno = 0;
int GetLeftTime();
int GetLastingTime();
void FillMFBuff(cs::MFBuff* buff_pb);
};

View File

@ -183,6 +183,39 @@ void FrameEvent::AddRevive(Human* hum)
}
}
void FrameEvent::AddBuff(Human* hum, Buff* buff)
{
{
cs::MFAddBuff add_buff_pb;
add_buff_pb.set_obj_id(hum->entity_uniid);
buff->FillMFBuff(add_buff_pb.mutable_buff());
add_buffs_.push_back(std::make_tuple(hum, add_buff_pb));
}
{
int idx = add_buffs_.size() - 1;
for (auto& cell : hum->grid_list) {
for (auto& hum : cell->human_list) {
hum->add_buffs_.push_back(idx);
}
}
}
}
void FrameEvent::RemoveBuff(Human* hum, int buff_id)
{
{
remove_buffs_.push_back(std::make_tuple(hum->entity_uniid, buff_id));
}
{
int idx = remove_buffs_.size() - 1;
for (auto& cell : hum->grid_list) {
for (auto& hum : cell->human_list) {
hum->remove_buffs_.push_back(idx);
}
}
}
}
void FrameEvent::Clear()
{
if (!explosions_.empty()) {

View File

@ -4,6 +4,7 @@
class Bullet;
class Human;
class Buff;
struct FrameEvent
{
public:
@ -16,6 +17,8 @@ public:
void AddExplosionEx(Human* sender, int item_id, a8::Vec2 bomb_pos, int effect);
void AddDead(Human* hum);
void AddRevive(Human* hum);
void AddBuff(Human* hum, Buff* buff);
void RemoveBuff(Human* hum, int buff_id);
void Clear();
private:
@ -25,8 +28,8 @@ 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<std::tuple<Human*, ::cs::MFBuff>> add_buffs_;
std::vector<int> remove_buffs_;
std::vector<std::tuple<Human*, ::cs::MFAddBuff>> add_buffs_;
std::vector<std::tuple<int, int>> remove_buffs_;
std::vector<int> revive_objs_;
std::vector<std::tuple<int, int>> dead_objs_;

View File

@ -75,6 +75,19 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum)
p->add_values(std::get<1>(room->frame_event.dead_objs_[idx]));
}
}
for (int idx : hum->add_buffs_) {
if (idx < room->frame_event.add_buffs_.size()) {
auto p = msg->add_add_buff_list();
*p = std::get<1>(room->frame_event.add_buffs_[idx]);
}
}
for (int idx : hum->remove_buffs_) {
if (idx < room->frame_event.remove_buffs_.size()) {
auto p = msg->add_remove_buff_list();
p->set_key(std::get<0>(room->frame_event.remove_buffs_[idx]));
p->set_value(std::get<1>(room->frame_event.remove_buffs_[idx]));
}
}
if (room->frame_event.airdrops_.size() > 0) {
*msg->mutable_airdrop() = room->frame_event.airdrops_.Get(0);
}

View File

@ -1337,15 +1337,48 @@ void Human::TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigge
void Human::AddBuff(MetaData::Buff* buff_meta)
{
if (GetBuffById(buff_meta->i->buff_id())) {
return;
}
if (!buff_meta->EffectCanStack()) {
Buff* buff = GetBuffByEffectId(buff_meta->i->buff_effect());
if (buff) {
return;
RemoveBuff(buff->meta->i->buff_id());
}
}
Buff* buff = &a8::FastAppend(buff_list_);
buff->owner = this;
buff->meta = buff_meta;
//buff->skill_meta
buff->add_frameno = room->frame_no;
buff_effect_hash_[buff->meta->i->buff_id()] = buff;
room->frame_event.AddBuff(this, buff);
{
room->xtimer.AddDeadLineTimerAndAttach(
buff_meta->i->duration_time() / FRAME_RATE_MS,
a8::XParams()
.SetSender(this)
.SetParam1(buff_meta->i->buff_id()),
[] (const a8::XParams& param)
{
Human* hum = (Human*)param.sender.GetUserData();
hum->RemoveBuff(param.param1);
},
&buff->xtimer_attacher.timer_list_
);
}
}
void Human::RemoveBuff(int buff_id)
{
for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) {
if (itr->meta->i->buff_id() == buff_id) {
buff_effect_hash_.erase(itr->meta->i->buff_effect());
buff_list_.erase(itr);
room->frame_event.RemoveBuff(this, buff_id);
break;
}
}
}
void Human::_UpdateMove(int speed)
@ -1450,7 +1483,48 @@ void Human::Revive()
void Human::SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& target_list)
{
switch (skill_meta->i->skill_target()) {
case ST_All:
{
}
break;
case ST_Self:
{
}
break;
case ST_FriendlyIncludeSelf:
{
}
break;
case ST_FriendlyExcludeSelf:
{
}
break;
case ST_EnemySingle:
{
}
break;
case ST_EnemyGroup:
{
}
break;
case ST_EnemyAndObject:
{
}
break;
case ST_EnemyAndSelf:
{
}
break;
}
}
Buff* Human::GetBuffById(int buff_id)

View File

@ -200,6 +200,7 @@ class Human : public Entity
int GetSkillCd();
void TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type);
void AddBuff(MetaData::Buff* buff_meta);
void RemoveBuff(int buff_id);
protected:
void _UpdateMove(int speed);

View File

@ -133,8 +133,6 @@ message MFPlayerPart
optional float max_health = 5; //undefined
optional float health = 6; //undefined
repeated MFBuff add_buff_list = 7; //buff列表
repeated int32 remove_buff_list = 8; //buff列表
}
//-
@ -534,6 +532,13 @@ message MFBuff
optional float lasting_time = 3; //()
}
//add buff
message MFAddBuff
{
optional int32 obj_id = 1; //id
optional MFBuff buff = 2; //buff
}
//end mfmsg
//
@ -678,19 +683,21 @@ message SMUpdate
repeated MFObjectPart part_objects = 4; //-()
optional int32 active_player_id = 5; //id(id)
optional MFActivePlayerData active_player_data = 6; //()
optional int32 game_left_time = 15; //(, )
optional int32 gas_progress = 16; //,(gas_data.mode == moving时才会发进度)
optional MFVec2 gas_pos_old = 30; //
optional MFGasData gas_data = 17; //
repeated MFTeamData team_data = 18; //
repeated MFBullet bullets = 20; //
repeated MFShot shots = 21; //
repeated MFExplosion explosions = 22; //
repeated MFSmoke smokes = 25; //
repeated MFEmote emotes = 23; //
optional MFAirDrop airdrop = 26; //
repeated int32 revive_objids = 27; //
repeated MFTuple dead_objs = 28; //values[0]:objid values[1]:
optional int32 game_left_time = 7; //(, )
optional int32 gas_progress = 8; //,(gas_data.mode == moving时才会发进度)
optional MFVec2 gas_pos_old = 9; //
optional MFGasData gas_data = 10; //
repeated MFTeamData team_data = 11; //
repeated MFBullet bullets = 12; //
repeated MFShot shots = 13; //
repeated MFExplosion explosions = 14; //
repeated MFSmoke smokes = 15; //
repeated MFEmote emotes = 16; //
optional MFAirDrop airdrop = 17; //
repeated int32 revive_objids = 18; //
repeated MFTuple dead_objs = 19; //values[0]:objid values[1]:
repeated MFAddBuff add_buff_list = 20; //buff列表
repeated MFPair remove_buff_list = 21; //buff列表 key:objid value:buff_id
}
//