private static void Postfix(Door __instance, ref ZNetView ___m_nview)
            {
                if (!isEnabled.Value) // MODが無効化されている
                {
                    return;
                }

                // ログイン中はインスタンスが取得できないので何もしない
                Player localPlayer = Player.m_localPlayer;

                if (localPlayer == null || __instance == null || ___m_nview == null)
                {
                    return;
                }

                String doorName = ___m_nview.GetPrefabName();
                int    hashCode = ___m_nview.GetHashCode();

                if (__instance.m_keyItem != null ||                             // 対象のドアに鍵が必要
                    (disableAutomaticDoorOpenInCrypt.Value && isInsideCrypt) || // プレイヤーがCrypt内にいる
                    !toggleSwitch)                                              // トグルスイッチでMODが無効化されている
                {
                    return;
                }

                // すでにドアが開いているときは一定時間後に閉じる処理を起動
                if (___m_nview.GetZDO().GetInt("state", 0) != 0)
                {
                    if (!coroutinePairs.ContainsKey(hashCode) && // まだコルーチンが起動していない
                        !isInsideCrypt &&                        // プレイヤーがCrypt内にいない
                        !doorName.StartsWith("dungeon_"))        // ドアのプレハブ名がdungeon_で始まってない
                    {
                        Coroutine coroutine = ___m_nview.StartCoroutine(AutomaticDoorClose.AutoCloseEnumerator(__instance, ___m_nview));
                        coroutinePairs[hashCode] = coroutine;
                    }
                    return;
                }

                // ドア種別ごとのdistanceサポート
                float distanceSetting = Utils.GetSettingRangeByDoor(doorName, true);

                // プレイヤーがドアの範囲内にいる、かつ、初めてプレイヤーが近づいたときにドアを開く
                float distance = Utils.GetPlayerDistance(__instance.m_doorObject);

                isAlreadyEnteredDict.TryGetValue(hashCode, out bool result);
                if (distance <= distanceSetting && !result)
                {
                    __instance.Interact(localPlayer, false);
                    isAlreadyEnteredDict[hashCode] = true;
                }
                else if (distance > distanceSetting)
                {
                    isAlreadyEnteredDict[hashCode] = false;
                }
            }
Esempio n. 2
0
            private static void Postfix(ref Door __instance, ZNetView ___m_nview)
            {
                if (!AutomaticDoorModPlugin.isEnabled.Value || // when mod is disabled
                    __instance.m_keyItem != null ||            // when target door needs keyItem (e.g. CryptKey)
                    isInsideCrypt ||                           // when player is in Crypt
                    !toggleSwitch)                             // when a player manually disables a mod
                {
                    return;
                }

                IEnumerator enumerator = DoorCloseDelay(AutomaticDoorModPlugin.waitForDoorToCloseSeconds.Value, () =>
                {
                    ___m_nview.GetZDO().Set("state", 0);
                });

                ___m_nview.StopAllCoroutines();
                ___m_nview.StartCoroutine(enumerator);
            }
            private static void Postfix(ref Door __instance, ZNetView ___m_nview)
            {
                if (!isEnabled.Value ||             // MODが無効化されている
                    __instance.m_keyItem != null || // 対象のドアに鍵が必要
                    isInsideCrypt ||                // プレイヤーがCrypt内にいる
                    !toggleSwitch)                  // トグルスイッチでMODが無効化されている
                {
                    return;
                }

                if (coroutinePairs.ContainsKey(___m_nview.GetHashCode()))
                {
                    ___m_nview.StopCoroutine(coroutinePairs[___m_nview.GetHashCode()]);
                }

                Coroutine coroutine = ___m_nview.StartCoroutine(AutoCloseEnumerator(__instance, ___m_nview));

                coroutinePairs[___m_nview.GetHashCode()] = coroutine;
            }