完成buff 功能

This commit is contained in:
aozhiwei 2019-07-10 18:02:42 +08:00
parent 912bd0593a
commit f07664bf2f
10 changed files with 144 additions and 17 deletions

View File

@ -4,6 +4,7 @@
#include "metamgr.h"
#include "human.h"
#include "room.h"
#include "collider.h"
int Buff::GetLeftTime()
{
@ -22,3 +23,62 @@ void Buff::FillMFBuff(cs::MFBuff* buff_pb)
buff_pb->set_left_time(GetLeftTime());
buff_pb->set_lasting_time(GetLastingTime());
}
void Buff::ProcLastBurn(const a8::XParams& param)
{
Human* hum = (Human*)param.sender.GetUserData();
Buff* buff = (Buff*)param.param1.GetUserData();
if (!hum->dead && !hum->HasBuffEffect(BET_Invincible)) {
hum->DecHP(buff->meta->param1,
hum->last_attacker_id,
hum->last_attacker_name,
hum->last_attacker_weapon_id);
}
}
void Buff::ProcReleaseDcgr(const a8::XParams& param)
{
Human* sender = (Human*)param.sender.GetUserData();
Buff* buff = (Buff*)param.param1.GetUserData();
MetaData::Buff* add_buff = MetaMgr::Instance()->GetBuff(buff->meta->param2);
if (!sender->dead && add_buff) {
CircleCollider collider;
collider.owner = sender;
collider.rad = buff->meta->param2;
for (auto& cell : sender->grid_list) {
for (Human* hum : cell->human_list) {
if (hum != sender && !hum->HasBuffEffect(BET_Invincible)) {
if (hum->TestCollision(&collider)) {
hum->AddBuff(add_buff);
}
}
}
}
}
}
void Buff::ProcReleaseFireBomb(const a8::XParams& param)
{
Human* sender = (Human*)param.sender.GetUserData();
Buff* buff = (Buff*)param.param1.GetUserData();
if (!sender->dead) {
SectorCollider collider;
collider.owner = sender;
collider.angle = buff->meta->param2;
collider.rad = buff->meta->param3;
for (auto& cell : sender->grid_list) {
for (Human* hum : cell->human_list) {
if (hum != sender && !hum->dead && !hum->HasBuffEffect(BET_Invincible)) {
if (hum->TestCollision(&collider)) {
hum->DecHP(
buff->meta->param4,
sender->entity_uniid,
sender->name,
0
);
}
}
}
}
}
}

View File

@ -28,4 +28,8 @@ class Buff
int GetLeftTime();
int GetLastingTime();
void FillMFBuff(cs::MFBuff* buff_pb);
static void ProcLastBurn(const a8::XParams& param);
static void ProcReleaseDcgr(const a8::XParams& param);
static void ProcReleaseFireBomb(const a8::XParams& param);
};

View File

@ -90,6 +90,37 @@ bool ColliderComponent::Intersect(ColliderComponent* b)
b_circle->rad);
}
break;
case CT_Sector:
{
SectorCollider* b_sector = (SectorCollider*)b;
return a8::IntersectSectorCircle(
b_sector->owner->pos + b_sector->pos,
b_sector->angle,
b_sector->rad,
a_circle->owner->pos + a_circle->pos,
a_circle->rad);
}
break;
}
}
break;
case CT_Sector:
{
SectorCollider* a_sector = (SectorCollider*)this;
switch (b->type) {
case CT_None:
break;
case CT_Circle:
{
CircleCollider* b_circle = (CircleCollider*)b;
return a8::IntersectSectorCircle(
a_sector->owner->pos + a_sector->pos,
a_sector->angle,
a_sector->rad,
b_circle->owner->pos + b_circle->pos,
b_circle->rad);
}
break;
}
}
break;
@ -177,6 +208,11 @@ void DestoryCollider(ColliderComponent* collider)
delete (CircleCollider*)collider;
}
break;
case CT_Sector:
{
delete (SectorCollider*)collider;
}
break;
default:
{
delete collider;

View File

@ -4,7 +4,8 @@ enum ColliderType_e
{
CT_None,
CT_Aabb,
CT_Circle
CT_Circle,
CT_Sector
};
class Entity;
@ -38,4 +39,14 @@ public:
CircleCollider() { type = CT_Circle; };
};
class SectorCollider : public ColliderComponent
{
public:
a8::Vec2 pos;
float rad = 0.0f;
float angle = 0.0f;
SectorCollider() { type = CT_Sector; };
};
void DestoryCollider(ColliderComponent* collider);

View File

@ -195,7 +195,7 @@ enum BuffEffectType_e
BET_Hide = 6, //隐身
BET_Dcgr = 7, //电磁干扰
BET_ReleaseDcgr = 8, //释放电磁干扰
BET_ReleaseFireBomb = 9, //释放燃烧弹
BET_ReleaseFireBomb = 9, //喷火
BET_End
};

View File

@ -81,7 +81,7 @@ float Human::GetSpeed()
}
}
speed = (speed + buff_attr_abs_[HAT_Speed]) * (1 + buff_attr_rate_[HAT_Speed]);
return std::min(speed, 1.0f);
return std::max(speed, 1.0f);
}
float Human::GetSpeed4()
@ -1430,17 +1430,31 @@ void Human::ProcBuffEffect(Buff* buff)
a8::XParams()
.SetSender(this)
.SetParam1(buff),
[] (const a8::XParams& param)
{
Human* hum = (Human*)param.sender.GetUserData();
Buff* buff = (Buff*)param.param1.GetUserData();
if (!hum->dead) {
hum->DecHP(buff->meta->param1,
hum->last_attacker_id,
hum->last_attacker_name,
hum->last_attacker_weapon_id);
}
},
Buff::ProcLastBurn,
&buff->xtimer_attacher.timer_list_
);
}
break;
case BET_ReleaseDcgr:
{
room->xtimer.AddRepeatTimerAndAttach(
buff->meta->param1* 1000 / FRAME_RATE_MS,
a8::XParams()
.SetSender(this)
.SetParam1(buff),
Buff::ProcReleaseDcgr,
&buff->xtimer_attacher.timer_list_
);
}
break;
case BET_ReleaseFireBomb:
{
room->xtimer.AddRepeatTimerAndAttach(
buff->meta->param1* 1000 / FRAME_RATE_MS,
a8::XParams()
.SetSender(this)
.SetParam1(buff),
Buff::ProcReleaseFireBomb,
&buff->xtimer_attacher.timer_list_
);
}

View File

@ -417,6 +417,7 @@ namespace MetaData
param1 = a8::XValue(i->buff_param1()).GetDouble();
param2 = a8::XValue(i->buff_param2()).GetDouble();
param3 = a8::XValue(i->buff_param3()).GetDouble();
param4 = a8::XValue(i->buff_param4()).GetDouble();
}
bool Buff::EffectCanStack()

View File

@ -136,6 +136,7 @@ namespace MetaData
float param1 = 0.0f;
float param2 = 0.0f;
float param3 = 0.0f;
float param4 = 0.0f;
};
struct SkillPhase

View File

@ -150,11 +150,11 @@ message Buff
required int32 buff_target = 2;
required int32 buff_effect = 3;
required int32 trigger_type = 4;
required int32 trigger_chance = 5;
required string buff_param1 = 6;
required string buff_param2 = 7;
required string buff_param3 = 8;
required int32 duration_time = 9;
required string buff_param4 = 9;
required int32 duration_time = 10;
}
message Drop

@ -1 +1 @@
Subproject commit 88b75d811aecd688865fddf4d47413a50f953d34
Subproject commit 287a824201d2aac638b5a8b2b0c01e87973dc685