完成buff 功能
This commit is contained in:
parent
912bd0593a
commit
f07664bf2f
@ -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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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) {
|
break;
|
||||||
hum->DecHP(buff->meta->param1,
|
case BET_ReleaseDcgr:
|
||||||
hum->last_attacker_id,
|
{
|
||||||
hum->last_attacker_name,
|
room->xtimer.AddRepeatTimerAndAttach(
|
||||||
hum->last_attacker_weapon_id);
|
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_
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
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