2019-07-10 18:02:42 +08:00

85 lines
2.6 KiB
C++

#include "precompile.h"
#include "buff.h"
#include "metamgr.h"
#include "human.h"
#include "room.h"
#include "collider.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());
}
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
);
}
}
}
}
}
}