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; } }
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; }