diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 540d94d..fe2acbd 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -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 + ); + } + } + } + } + } +} diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index a7f2d7a..5516905 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -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); }; diff --git a/server/gameserver/collider.cc b/server/gameserver/collider.cc index 0542074..f322d71 100644 --- a/server/gameserver/collider.cc +++ b/server/gameserver/collider.cc @@ -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; diff --git a/server/gameserver/collider.h b/server/gameserver/collider.h index 148a2f8..1ebc8cb 100644 --- a/server/gameserver/collider.h +++ b/server/gameserver/collider.h @@ -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); diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 2b5aa25..dc10cbe 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -195,7 +195,7 @@ enum BuffEffectType_e BET_Hide = 6, //隐身 BET_Dcgr = 7, //电磁干扰 BET_ReleaseDcgr = 8, //释放电磁干扰 - BET_ReleaseFireBomb = 9, //释放燃烧弹 + BET_ReleaseFireBomb = 9, //喷火 BET_End }; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 0b2f2d9..6801b61 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -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_ ); } diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 9f0b346..218fb7d 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -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() diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 02b8dad..d6954d2 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -136,6 +136,7 @@ namespace MetaData float param1 = 0.0f; float param2 = 0.0f; float param3 = 0.0f; + float param4 = 0.0f; }; struct SkillPhase diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 3818540..03f5677 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -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 diff --git a/third_party/a8engine b/third_party/a8engine index 88b75d8..287a824 160000 --- a/third_party/a8engine +++ b/third_party/a8engine @@ -1 +1 @@ -Subproject commit 88b75d811aecd688865fddf4d47413a50f953d34 +Subproject commit 287a824201d2aac638b5a8b2b0c01e87973dc685