完成buff 功能
This commit is contained in:
parent
912bd0593a
commit
f07664bf2f
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -195,7 +195,7 @@ enum BuffEffectType_e
|
||||
BET_Hide = 6, //隐身
|
||||
BET_Dcgr = 7, //电磁干扰
|
||||
BET_ReleaseDcgr = 8, //释放电磁干扰
|
||||
BET_ReleaseFireBomb = 9, //释放燃烧弹
|
||||
BET_ReleaseFireBomb = 9, //喷火
|
||||
BET_End
|
||||
};
|
||||
|
||||
|
@ -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_
|
||||
);
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -136,6 +136,7 @@ namespace MetaData
|
||||
float param1 = 0.0f;
|
||||
float param2 = 0.0f;
|
||||
float param3 = 0.0f;
|
||||
float param4 = 0.0f;
|
||||
};
|
||||
|
||||
struct SkillPhase
|
||||
|
@ -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
|
||||
|
2
third_party/a8engine
vendored
2
third_party/a8engine
vendored
@ -1 +1 @@
|
||||
Subproject commit 88b75d811aecd688865fddf4d47413a50f953d34
|
||||
Subproject commit 287a824201d2aac638b5a8b2b0c01e87973dc685
|
Loading…
x
Reference in New Issue
Block a user