static void Postfix(RegionViewer __instance, ItemPutInfo info, ref Transform transform)
            {
                if (!enabled || Module <ScenarioModule> .Self.CurrentScenarioName != "Main" || !(__instance is FarmViewer) || !outsideUnits.ContainsKey(info.cellIndex))
                {
                    return;
                }

                Vector3 vector = GetValidPos(transform.position);

                if (vector != Vector3.zero)
                {
                    transform.position = vector;
                }
            }
            static void Postfix(RegionViewer __instance, UnitObjInfo objInfo)
            {
                if (!enabled || Module <ScenarioModule> .Self.CurrentScenarioName != "Main" || !(__instance is FarmViewer))
                {
                    return;
                }
                Vector3 pos = objInfo.go.transform.position;

                pos = GetValidPos(pos);
                if (pos != Vector3.zero)
                {
                    objInfo.go.transform.position = pos;
                }
            }
            static void Postfix(RegionViewer __instance, ref Vector3 worldPos, ref float dis, ref CellIndex __result, float ___ceilWidth)
            {
                if (!enabled || Module <ScenarioModule> .Self.CurrentScenarioName != "Main" || !(__instance is FarmViewer))
                {
                    return;
                }
                Vector3 vector = GetValidPos(worldPos);

                if (vector != Vector3.zero)
                {
                    dis = (worldPos - vector).y;
                }
                if (__result == CellIndex.Invalid)
                {
                    Vector3 vector2 = __instance.transform.InverseTransformPoint(worldPos);
                    __result = new CellIndex((int)(vector2.x / ___ceilWidth), (int)(-vector2.z / ___ceilWidth));
                }
            }
            static bool Prefix(RegionViewer __instance, string path, Area area, ItemPutInfo info, ref GameObject __result, bool isFloorLayer)
            {
                if (!enabled || Module <ScenarioModule> .Self.CurrentScenarioName != "Main" || !outsideUnits.ContainsKey(info.cellIndex))
                {
                    return(true);
                }


                GameObject gameObject = (GameObject)typeof(RegionViewer).GetMethod("CreateGameObj", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string) }, new ParameterModifier[0]).Invoke(__instance, new object[] { path });

                typeof(RegionViewer).GetMethod("FreshLocalPosition", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { gameObject.transform, info, area });
                typeof(RegionViewer).GetMethod("FreshLocalRotation", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { gameObject.transform, info });

                UnitViewer unitViewer = gameObject.GetComponentInChildren <UnitViewer>();

                if (unitViewer == null)
                {
                    unitViewer = gameObject.AddComponent <UnitViewer>();
                }
                if (unitViewer != null)
                {
                    Unit unitByCell = outsideUnits[info.cellIndex].unit;

                    unitViewer.SetUnit(unitByCell);
                    typeof(RegionViewer).GetMethod("SetRegionName", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { unitViewer });

                    if (!unitByCell.immobile && !(unitByCell is FloorCell))
                    {
                        MethodInfo    method = __instance.GetType().GetMethod("TakeUpHomeItem", BindingFlags.NonPublic | BindingFlags.Instance);
                        Action <Unit> action = (Action <Unit>)Delegate.CreateDelegate(typeof(Action <Unit>), __instance, method);
                        unitViewer.InitHomeItemThing(action);
                    }
                    if (!unitByCell.immobile && unitByCell.CustomColorCount > 0)
                    {
                        unitViewer.InitColorChange();
                    }
                }
                gameObject.SetActive(true);
                __result = gameObject;
                return(false);
            }