Beispiel #1
0
    //====================================================
    // すべての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;
}