完成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 "metamgr.h"
#include "human.h" #include "human.h"
#include "room.h" #include "room.h"
#include "collider.h"
int Buff::GetLeftTime() int Buff::GetLeftTime()
{ {
@ -22,3 +23,62 @@ void Buff::FillMFBuff(cs::MFBuff* buff_pb)
buff_pb->set_left_time(GetLeftTime()); buff_pb->set_left_time(GetLeftTime());
buff_pb->set_lasting_time(GetLastingTime()); 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 GetLeftTime();
int GetLastingTime(); int GetLastingTime();
void FillMFBuff(cs::MFBuff* buff_pb); 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); b_circle->rad);
} }
break; 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; break;
@ -177,6 +208,11 @@ void DestoryCollider(ColliderComponent* collider)
delete (CircleCollider*)collider; delete (CircleCollider*)collider;
} }
break; break;
case CT_Sector:
{
delete (SectorCollider*)collider;
}
break;
default: default:
{ {
delete collider; delete collider;

View File

@ -4,7 +4,8 @@ enum ColliderType_e
{ {
CT_None, CT_None,
CT_Aabb, CT_Aabb,
CT_Circle CT_Circle,
CT_Sector
}; };
class Entity; class Entity;
@ -38,4 +39,14 @@ public:
CircleCollider() { type = CT_Circle; }; 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); void DestoryCollider(ColliderComponent* collider);

View File

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

View File

@ -81,7 +81,7 @@ float Human::GetSpeed()
} }
} }
speed = (speed + buff_attr_abs_[HAT_Speed]) * (1 + buff_attr_rate_[HAT_Speed]); 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() float Human::GetSpeed4()
@ -1430,17 +1430,31 @@ void Human::ProcBuffEffect(Buff* buff)
a8::XParams() a8::XParams()
.SetSender(this) .SetSender(this)
.SetParam1(buff), .SetParam1(buff),
[] (const a8::XParams& param) Buff::ProcLastBurn,
{ &buff->xtimer_attacher.timer_list_
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);
} }
}, 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_ &buff->xtimer_attacher.timer_list_
); );
} }

View File

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

View File

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

View File

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

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