//==================================================== // すべてのMODが読み込まれた後に呼ばれる //==================================================== virtual void OnModLoaded() { // TopicInfoイベントを受け取るラムダ関数 auto onTopicInfo = [](TESTopicInfoEvent* e) -> EventResult { if (!e->speaker) return kEvent_Continue; // 会話中に頭をでかくする static BSFixedString nodeName = "NPC Head [Head]"; NiAVObject* node = (NiAVObject*)e->speaker->GetNiNode(); if(node) { node = node->GetObjectByName(&nodeName.data); if (node) { // 会話開始で倍率を2.0に、会話終了で1.0に戻す node->m_localTransform.scale = (e->flag) ? 1.0 : 2.0; } } return kEvent_Continue; }; // イベントの送信元 (ソース) をイベントの受信側 (シンク) と接続する // 受信側には、関数・ラムダ関数・関数オブジェクトを指定可能 g_topicInfoEventSource += onTopicInfo; // ラムダ g_hitEventSource += OnHit; // 関数 static SwitchRaceCompleteEventFunctor switchRaceFunctor; g_switchRaceCompleteEventSource += switchRaceFunctor; // 関数オブジェクト // -= で切断 g_switchRaceCompleteEventSource -= switchRaceFunctor; g_topicInfoEventSource -= onTopicInfo; }
NiAVObject * ResolveNode(TESObjectREFR * obj, BSFixedString nodeName, bool firstPerson) { if(!obj) return NULL; NiAVObject * result = obj->GetNiNode(); // special-case for the player, switch between first/third-person PlayerCharacter * player = DYNAMIC_CAST(obj, TESObjectREFR, PlayerCharacter); if(player && player->loadedState) result = firstPerson ? player->firstPersonSkeleton : player->loadedState->node; // name lookup if(nodeName.data[0] && result) result = result->GetObjectByName(&nodeName.data); return result; }