diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index c50a702..403d987 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -648,6 +648,26 @@ void Creature::RecalcBuffAttr() } } } + for (auto& tuple : talent_list) { + auto talent_meta = MetaMgr::Instance()->GetTalent(std::get<0>(tuple), std::get<1>(tuple)); + if (talent_meta) { + for (auto& tuple1 : talent_meta->addattr) { + int attr_type = std::get<0>(tuple1); + int attr_val = std::get<1>(tuple1); + if (talent_meta->i->addtype() == 0) { + float* p = ability_->GetBuffAttrAbsPtr(attr_type); + if (p) { + *p += attr_val; + } + } else if (talent_meta->i->addtype() == 1) { + float* p = ability_->GetBuffAttrRatePtr(attr_type); + if (p) { + *p += attr_val; + } + } + } + } + } if (need_refresh_hp) { SetHP(GetMaxHP()); GetTrigger()->HpChg(); diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 2e6e8bf..b034631 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -94,6 +94,8 @@ class Creature : public MoveableEntity a8::Vec2 context_dir; std::shared_ptr context_ability; + std::vector> talent_list; + bool need_sync_active_player = false; std::function on_loading_bullet; CreatureWeakPtr follow_target; diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index a022daf..48a30d9 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -127,6 +127,11 @@ Player* PlayerMgr::CreatePlayerByCMJoin(Player* hum, #else hum->SetSkinInfo(msg.baseskin()); #endif + for (auto& pair : msg.talent_list()) { + hum->talent_list.push_back( + std::make_tuple(pair.key(), pair.value()) + ); + } socket_hash_[socket] = hum; return hum; }