diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 703a3d3..9b0d68e 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -104,7 +104,7 @@ void Bullet::OnHit(std::set& objects) if (hum != player && !hum->dead && (hum->team_id == 0 || master->team_id != hum->team_id)) { #endif - float power = meta->i->atk() + master->ability.atk; + float power = meta->i->atk() + master->ability.atk + master->GetSkillAtkAdd(skill_id); float def = hum->ability.def; float finaly_dmg = power * (1 - def/MetaMgr::Instance()->K); master->stats.damage_amount_out += finaly_dmg; @@ -122,7 +122,7 @@ void Bullet::OnHit(std::set& objects) { Obstacle* obstacle = (Obstacle*)target; if (!obstacle->dead && obstacle->meta->i->attack_type() == 1) { - float dmg = meta->i->atk() + master->ability.atk; + float dmg = meta->i->atk() + master->ability.atk + master->GetSkillAtkAdd(skill_id); float def = 0; float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); #if 0 @@ -157,6 +157,7 @@ void Bullet::PostAttack() { Obstacle* obstacle = (Obstacle*)param.sender.GetUserData(); Human* sender = (Human*)param.param1.GetUserData(); + int skill_id = param.param2; if (obstacle->room->IsGameOver()) { return; } @@ -167,7 +168,8 @@ void Bullet::PostAttack() if (hum->pos.Distance(obstacle->pos) < obstacle->meta->i->damage_dia()) { hum->OnHit(); if (!hum->HasBuffEffect(kBET_Invincible)) { - float power = obstacle->meta->i->damage() + sender->ability.atk; + float power = obstacle->meta->i->damage() + sender->ability.atk + + sender->GetSkillAtkAdd( skill_id); float def = hum->ability.def; float finally_dmg = power * (1 - def/MetaMgr::Instance()->K); sender->stats.damage_amount_out += finally_dmg; @@ -185,7 +187,8 @@ void Bullet::PostAttack() room->xtimer.AddDeadLineTimerAndAttach(kSERVER_FRAME_RATE, a8::XParams() .SetSender(obstacle) - .SetParam1(master), + .SetParam1(master) + .SetParam2(skill_id), fire_func, &obstacle->xtimer_attacher.timer_list_); room->xtimer.AddDeadLineTimerAndAttach(meta->i->time() * kSERVER_FRAME_RATE, @@ -208,7 +211,9 @@ void Bullet::ProcMissible(const a8::XParams& param) MetaData::Equip* bullet_meta = MetaMgr::Instance()->GetEquip(param.param1); if (sender && bullet_meta && !sender->room->IsGameOver()) { a8::Vec2 src_pos(a8::Low32(param.param3.GetInt64()), a8::High32(param.param3.GetInt64())); - Human* target = sender->room->GetHumanByUniId(param.param2); + int target_id = a8::High32(param.param1.GetInt64()); + int skill_id = a8::Low32(param.param1.GetInt64()); + Human* target = sender->room->GetHumanByUniId(target_id); if (target && !target->dead) { if (bullet_meta->i->equip_subtype() == kBulletType_Trace) { float bullet_range = bullet_meta->i->range() + @@ -217,7 +222,7 @@ void Bullet::ProcMissible(const a8::XParams& param) if (src_pos.Distance(target->pos) < bullet_range) { target->OnHit(); if (!target->HasBuffEffect(kBET_Invincible)) { - float power = bullet_meta->i->atk() + sender->ability.atk; + float power = bullet_meta->i->atk() + sender->ability.atk + sender->GetSkillAtkAdd(skill_id); float def = target->ability.def; float finally_dmg = power * (1 - def/MetaMgr::Instance()->K); sender->stats.damage_amount_out += finally_dmg; @@ -231,7 +236,7 @@ void Bullet::ProcMissible(const a8::XParams& param) } else { target->OnHit(); if (!target->HasBuffEffect(kBET_Invincible)) { - float power = bullet_meta->i->atk() + sender->ability.atk; + float power = bullet_meta->i->atk() + sender->ability.atk + sender->GetSkillAtkAdd(skill_id); float def = target->ability.def; float finally_dmg = power * (1 - def/MetaMgr::Instance()->K); sender->stats.damage_amount_out += finally_dmg; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index aac1e67..adcc6f8 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -196,7 +196,7 @@ void Human::Shot() a8::XParams() .SetSender(this) .SetParam1(curr_weapon->meta->i->id()) - .SetParam2(shot_target_id) + .SetParam2(a8::MakeInt64(shot_target_id, 0)) .SetParam3(a8::MakeInt64(pos.x, pos.y)), Bullet::ProcMissible, &xtimer_attacher.timer_list_); @@ -1143,6 +1143,21 @@ int Human::GetSkillCd() } } +float Human::GetSkillAtkAdd(int skill_id) +{ + if (!skill_meta_) { + return 0.0f; + } + if (skill_meta_->i->skill_id() != skill_id) { + return 0.0f; + } + if (skill_lv_ > 0) { + return skill_meta_->value_up * skill_lv_; + } else { + return 0.0f; + } +} + void Human::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) { if (target->entity_type != kET_Player) { @@ -2055,7 +2070,7 @@ void Human::ProcSkillPhase(MetaData::SkillPhase* phase) Obstacle* obstacle = (Obstacle*)param.sender.GetUserData(); if (!obstacle->dead) { obstacle->dead = true; - obstacle->Explosion(); + obstacle->Explosion(param.param1); } }; @@ -2083,7 +2098,10 @@ void Human::ProcSkillPhase(MetaData::SkillPhase* phase) a8::XParams() .SetSender(this) .SetParam1(phase->param1.GetInt()) - .SetParam2(skill_target_id) + .SetParam2(a8::MakeInt64(skill_target_id, + CurrentSkillMeta()->i->skill_id() + ) + ) .SetParam3(a8::MakeInt64(pos.x, pos.y)), Bullet::ProcMissible, &xtimer_attacher.timer_list_); @@ -2103,7 +2121,8 @@ void Human::ProcSkillPhase(MetaData::SkillPhase* phase) &obstacle->xtimer_attacher.timer_list_); room->xtimer.AddDeadLineTimerAndAttach(kSERVER_FRAME_RATE * 5, a8::XParams() - .SetSender(obstacle), + .SetSender(obstacle) + .SetParam1(skill_lv_), explosion_check_func, &obstacle->xtimer_attacher.timer_list_); } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index ed69115..e1773c7 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -181,6 +181,7 @@ class Human : public Entity MetaData::Skill* CurrentSkillMeta(); int GetSkillLeftTime(); int GetSkillCd(); + float GetSkillAtkAdd(int skill_id); void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type); void TriggerBuff(std::set& target_list, BuffTriggerType_e trigger_type); void AddBuff(MetaData::Buff* buff_meta); diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index aafbfbf..d030207 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -164,6 +164,7 @@ namespace MetaData void Init(); + float value_up = 0.0f; std::set buff_list; std::map> trigger_type_buffs; std::vector phases; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 3496ef5..d8c86f5 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -160,7 +160,7 @@ void Obstacle::GetCircleBox(CircleCollider& circle_box) } -void Obstacle::Explosion() +void Obstacle::Explosion(int skill_id) { if (explosioned) { return; @@ -207,6 +207,7 @@ void Obstacle::Explosion() float dmg = meta->i->damage(); if (master) { dmg += master->ability.atk; + dmg += master->GetSkillAtkAdd(skill_id); } float def = hum->ability.def; float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index a7ccb1d..518da28 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -45,7 +45,7 @@ class Obstacle : public Entity virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override; virtual void GetAabbBox(AabbCollider& aabb_box) override; virtual void GetCircleBox(CircleCollider& circle_box) override; - void Explosion(); + void Explosion(int skill_id = 0); private: CircleCollider* self_collider_ = nullptr;