【绿色地狱】2.9.4 Mod主要功能制作 更新中
沙尔森
编辑于 2025年10月13日 17:20
收录于文集
共30篇

一、上手

1.下载一个dnSpy;

链接

https://github.com/0xd4d/dnSpy/releases

2.打开dnSpy;

3.将目录

Steam\steamapps\common\Green Hell\GH_Data\Manage

下的全部文件拖到dnSpy左侧;

二、如何编辑一段代码

如图所示

三、常用代码以及部分说明

以我自己编辑的Mod举例子

例子格式:

类:XXXXXX

如何修改:XXXX

要点:XXXX

负重 InventoryBackpack.Awake

查找 InventoryBackpack.s_Instance = this;

下面添加 this.m_MaxWeight = 800f;

容器装汤 LiquidContainer.UpdateSlotsActivity

下面整段删除

else if (liquidContainerInfo.m_Amount > 0f && liquidContainerInfo.m_LiquidType != LiquidType.Water && liquidContainerInfo.m_LiquidType != LiquidType.UnsafeWater && liquidContainerInfo.m_LiquidType != LiquidType.DirtyWater)

   {                          

this.m_GetSlot.gameObject.SetActive(false);

 }

叠加倍率 ItemSlotStack.Awake

查找 this.m_StackDummies.Add(base.transform.GetChild(i).gameObject);

改成

for (int i = 0; i < base.transform.childCount; i++)         {             for (int j = 0; j < 2; j++)             {                 this.m_StackDummies.Add(base.transform.GetChild(i).gameObject);             }         }

采收倍率 ItemInfo.LoadParams

查找 this.m_HarvestingResultItems.Add((ItemID)Enum.Parse(typeof(ItemID), array[i]));

改成 

this.m_HarvestingResultItems.Add((ItemID)Enum.Parse(typeof(ItemID), array[i]));

this.m_HarvestingResultItems.Add((ItemID)Enum.Parse(typeof(ItemID), array[i]));

多复制一行就是增加一倍

冰箱 Food.Update

查找 float num = this.m_FInfo.m_SpoilOnlyIfTriggered ? this.m_FirstTriggerTime : this.m_FInfo.m_CreationTime;

在上方添加

        if (base.m_InStorage && this.CanSpoil())         {             this.m_FInfo.m_CreationTime = (float)MainLevel.Instance.m_TODSky.Cycle.GameTime;             this.m_FirstTriggerTime = (float)MainLevel.Instance.m_TODSky.Cycle.GameTime;             return;         }

腐烂设定 FoodInfo.LoadParams

查找 this.m_SpoilTime = key.GetVariable(0).FValue结尾加上 *倍率 f ;

这段改成 if (key.GetName() == "SpoilTime")                 {                         this.m_SpoilTime = key.GetVariable(0).FValue * 2f;                         return;                 }

弓不晃动 BowController.StartShake

查找 Player.Get().StartShake(10f, 1f, 1f);

如果删除该行,则弓不会晃动

如果修改该行,则弓晃动可减少,比如

Player.Get().StartShake(1f, 1f, 1f);

武器工具无限耐久 HUDItemInHand.Update

查找 this.m_HPBar.fillAmount = this.m_Item.m_Info.m_Health / this.m_Item.m_Info.m_MaxHealth;

整段修改为

protected override void Update()     {         if (!this.m_Initialized)         {             return;         }         if (this.ShouldPerformSetup())         {             this.Setup();         }         this.UpdateStateVariables();         if (!this.m_Item)         {             if (SwimController.Get().IsActive() && SwimController.Get().m_AttachedHeavyObjects.Count > 0)             {                 this.m_HPBar.fillAmount = (float)SwimController.Get().m_AttachedHeavyObjects.Count / (float)SwimController.Get().m_MaxNumHeavyObjectsToAttach;             }             else             {                 this.m_HPBar.fillAmount = 1f;             }         }         else if (this.m_Item.m_Info.IsHeavyObject())         {             HeavyObject heavyObject = (HeavyObject)this.m_Item;             this.m_HPBar.fillAmount = (float)(heavyObject.m_Attached.Count + 1) / (float)(heavyObject.m_NumObjectsToAttach + 1);         }         else         {             if (this.m_Item.m_Info.IsWeapon() || this.m_Item.m_Info.IsTool())             {                 this.m_Item.m_Info.m_Health = this.m_Item.m_Info.m_MaxHealth;             }             this.m_HPBar.fillAmount = this.m_Item.m_Info.m_Health / this.m_Item.m_Info.m_MaxHealth;         }         this.UpdateActions();         this.UpdateWeaponSwitchArrows();     } }

护甲不坏 PlayerArmorModule.LateUpdate

查找 if (armorData.m_AttachedArmor.m_Info.m_Health

将 this.OnArmorDestroyed(armorData); 替换成下行

armorData.m_AttachedArmor.m_Info.m_Health = 1f;

护甲修理 PlayerArmorModule.OnRemoveItemFromSlot

查找 ArmorInfo armorInfo = (ArmorInfo)item.m_Info;下面添加

        if (armorInfo.m_Health < armorInfo.m_MaxHealth * 0.5f)         {             armorInfo.m_Health = armorInfo.m_MaxHealth;         }

睡觉清空失眠 Insomnia.UpdateSleeping

整段改成

    public void UpdateSleeping()     {         SleepController.Get().m_LastWakeUpTimeLogical += 20f * this.m_NoSleepTimeToIncreaseLevel;     }

背包显示物品缩小 Item.Initialize

查找 this.m_InventoryLocalScale = Vector3.one * this.m_Info.m_InventoryScale;

整段改成

    public void Initialize(bool im_register)     {         if (this.m_Initialized)         {             return;         }         this.m_Initialized = true;         if (this.m_InventorySlot)         {             this.m_InventorySlot.m_Camera = Inventory3DManager.Get().m_Camera;         }         if (this.m_Info.m_Static && this.m_Info.m_ID != ItemID.Carcass)         {             this.ItemsManagerRegister(false);             this.m_DestroyingOnlyScript = true;             UnityEngine.Object.Destroy(this);             return;         }         if (Item.s_AllItemIDs.ContainsKey((int)this.m_Info.m_ID))         {             Item.s_AllItemIDs[(int)this.m_Info.m_ID] = Item.s_AllItemIDs[(int)this.m_Info.m_ID] + 1;         }         else         {             Item.s_AllItemIDs.Add((int)this.m_Info.m_ID, 1);         }         Item.s_AllItems.Add(this);         this.m_ScenarioItem = false;         if (base.gameObject.scene.IsValid() && GreenHellGame.Instance.m_ScenarioScenes.Contains(base.gameObject.scene.name))         {             this.m_ScenarioItem = true;         }         if (GreenHellGame.ROADSHOW_DEMO)         {             if (this.m_Info.m_BackpackPocket == BackpackPocket.Front || this.m_Info.m_BackpackPocket == BackpackPocket.Right)             {                 this.m_Info.m_BackpackPocket = BackpackPocket.Main;             }             this.m_Info.m_Craftable = false;         }         if (this.m_Info.m_DestroyedPrefabName != string.Empty || this.m_Info.m_ItemsToBackpackOnDestroy.Count > 0 || base.gameObject.GetComponent())         {             if (this.m_Info.m_DestroyedIsFalling)             {                 this.m_DestroyableObject = base.gameObject.AddComponent();             }             else             {                 this.m_DestroyableObject = base.gameObject.AddComponent();             }             this.m_DestroyableObject.m_Item = this;         }         if (this.m_Info.m_CanEquip || this.m_Info.IsHeavyObject())         {             DebugUtils.Assert(this.m_Holder != null, "Missing Holder in item " + this.m_InfoName, true, DebugUtils.AssertType.Info);         }         if (im_register)         {             this.ItemsManagerRegister(true);         }         this.m_DefaultLocalScale = base.transform.localScale;         this.m_InventoryLocalScale = Vector3.one * this.m_Info.m_InventoryScale * 0.7f;         if (this.m_Info.m_ID == ItemID.Tobacco_Leaf || this.m_Info.m_ID == ItemID.Molineria_leaf || this.m_Info.m_ID == ItemID.Plantain_lily_leaf || this.m_Info.m_ID == ItemID.Bone || this.m_Info.m_ID == ItemID.Cassava_bulb || this.m_Info.m_ID == ItemID.Malanga_bulb || this.m_Info.m_ID == ItemID.monstera_deliciosa_fruit || this.m_Info.m_ID == ItemID.Palm_heart)         {             this.m_InventoryLocalScale = Vector3.one * this.m_Info.m_InventoryScale * 0.5f;         }         if (this.m_Info.IsTool() || this.m_Info.IsWeapon() || this.m_Info.IsSeed())         {             this.m_InventoryLocalScale = Vector3.one * this.m_Info.m_InventoryScale;         }         if (this.m_BoxCollider)         {             this.m_DefaultSize = this.m_BoxCollider.size;         }         this.m_ThisRenderer = base.gameObject.GetComponent();         this.m_ChildrenRenderers = base.gameObject.GetComponentsInChildren(true);         this.m_DestroyableFallingObj = base.gameObject.GetComponent();         if (this.m_DestroyableFallingObj != null && this.m_AddAngularVelOnStart)         {             this.m_DestroyableFallingObj.AddAngularVelocityOnStart(this.m_AngularVelocityOnStart, this.m_AddAngularVelocityOnStartDuration);         }     }

 }

生成物品 Player.UpdateInputs

private void UpdateInputs()     {         bool flag = this.m_PlayerControllers[28].IsActive();         bool flag2 = this.CanShowWatch();         if (flag && !flag2)         {             this.StopController(PlayerControllerType.Watch);             flag = false;         }         if (!GreenHellGame.Instance.m_Settings.m_ToggleWatch)         {             if (InputsManager.Get().IsActionActive(InputsManager.InputAction.Watch))             {                 if (!flag && flag2)                 {                     this.StartController(PlayerControllerType.Watch);                     return;                 }             }             else if (flag)             {                 this.StopController(PlayerControllerType.Watch);             }         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Keypad8))         {             this.AddItemToInventory("QuestItem_Map_A");             this.AddItemToInventory("QuestItem_Map_B");             this.AddItemToInventory("QuestItem_Map_C");             this.AddItemToInventory("QuestItem_Map_A_Survi");             this.AddItemToInventory("QuestItem_Map_B_Survi");             this.AddItemToInventory("QuestItem_Map_C_Survi");             this.AddItemToInventory("QuestItem_Map_PVE");             this.AddItemToInventory("QuestItem_Map_PVE2");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Keypad1))         {             this.AddItemToInventory("Molineria_leaf");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Keypad2))         {             this.AddItemToInventory("Charcoal");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Keypad3))         {             this.AddItemToInventory("Tobacco_Leaf");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Keypad4))         {             this.AddItemToInventory("lily_flower");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Keypad5))         {             this.AddItemToInventory("Quassia_Amara_flowers");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Keypad6))         {             this.AddItemToInventory("coca_leafs");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Keypad7))         {             this.AddItemToInventory("Painkillers");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Keypad9))         {             this.AddItemToInventory("monstera_deliciosa_fruit");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Keypad0))         {             this.AddItemToInventory("indigo_blue_leptonia");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Alpha1))         {             this.AddItemToInventory("Beef_Jerky");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Alpha2))         {             this.AddItemToInventory("Juice_Carton");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Alpha3))         {             this.AddItemToInventory("Honeycomb");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Alpha4))         {             this.AddItemToInventory("Tapir_Meat_Raw");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Alpha5))         {             this.AddItemToInventory("Dry_leaf");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Alpha6))         {             this.AddItemToInventory("Bird_Nest");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Alpha7))         {             this.AddItemToInventory("Log");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Alpha8))         {             this.AddItemToInventory("Bamboo_Log");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Alpha9))         {             this.AddItemToInventory("Bamboo_Long_Stick");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.Alpha0))         {             this.AddItemToInventory("Rope");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F1))         {             this.AddItemToInventory("metal_armor");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F2))         {             this.AddItemToInventory("metal_blade");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F3))         {             this.AddItemToInventory("metal_axe");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F4))         {             this.AddItemToInventory("Metal_pickaxe");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F5))         {             this.AddItemToInventory("Metal_arrow");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F6))         {             this.AddItemToInventory("Obsidian_Stone");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F7))         {             this.AddItemToInventory("Bone");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F9))         {             this.AddItemToInventory("Bidon");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F10))         {             this.AddItemToInventory("Pot");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F11))         {             this.AddItemToInventory("Mud_Turtle_Meat_Raw");         }         if (Input.GetKey(KeyCode.RightControl) && Input.GetKeyDown(KeyCode.F12))         {             this.AddItemToInventory("safezone_totem");

           }

        }     }

泥沏滤水器过滤速度100倍+上层液体不减  MudWaterCollector.UpdateFiltering

整段改成

private void UpdateFiltering(float delta_time)     {         bool flag = false;         if (this.m_CollectorData.m_Amount > 0f && this.m_ContainerData.m_Amount < this.m_ContainerData.m_Capacity)         {             if (SleepController.Get().IsActive() && !SleepController.Get().IsWakingUp())             {                 delta_time = Player.GetSleepTimeFactor();             }             float num = delta_time * 50f;             if (num > this.m_CollectorData.m_Amount)             {                 num = this.m_CollectorData.m_Amount;             }             this.m_ContainerData.m_Amount += num;             flag = true;         }         if (this.m_Particle.activeSelf != flag)         {             this.m_Particle.SetActive(flag);         }         base.ReplSetDirty();     }

}

死亡只掉落手中的道具 DeathController.Respawn

查找并删除 this.DropInventory();

多人联机数 P2PSession

查找 P2PSession.MAX_PLAYERS = 4;

将4修改为你需要的数值

随处建造 ConstructionGhost.UpdateProhibitionType

整段修改为

public void UpdateProhibitionType(bool check_is_snapped = true)     {         if (this.m_AdditionalPlacingConditions.Contains(ConstructionGhost.GhostPlacingCondition.IsSnapped) && !this.m_ConstructionToAttachTo && EnumTools.IsItemToAttachToTree(this.m_ResultItemID) && this.m_SelectedSlot != null)         {             if (this.m_SelectedSlot.m_Construction != null)             {                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;             Vector3 center = this.m_BoxCollider.bounds.center;             Vector3 vector = this.m_BoxCollider.size * 0.5f;             center.y += this.m_ColliderShrinkBottom * 0.5f;             vector.y -= this.m_ColliderShrinkBottom;             vector.y = Mathf.Max(vector.y, 0f);             int num = Physics.OverlapBoxNonAlloc(center, vector, ConstructionGhost.s_CollidersTemp, this.m_BoxCollider.transform.rotation);             for (int i = 0; i < num; i++)             {                 Collider collider = ConstructionGhost.s_CollidersTemp[i];                 ConstructionGhost constructionGhost = collider.gameObject.GetComponent();                 if (!constructionGhost && collider.gameObject.transform.parent)                 {                     constructionGhost = collider.gameObject.GetComponentInParent();                 }                 if (constructionGhost && constructionGhost != this && constructionGhost.m_ResultItemID == this.m_ResultItemID)                 {                     this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                     return;                 }             }             return;         }         else         {             if (this.GetConstructForbidden() == ConstructionGhost.ConstructForbidden.Forbidden)             {                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             if (this.m_UseExpandedBoundsTocheckRegrowingTrees)             {                 this.UpdateExpandedBounds();             }             if (this.AreExtendedBoundsCollidingWithTrunk() || this.AreExtendedBoundsCollidingWithRegrowingTree())             {                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             if (!this.m_CanBePlacedOnTopOfConstruction && this.m_OnTopOfConstruction)             {                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             if (check_is_snapped && this.m_AdditionalPlacingConditions.Contains(ConstructionGhost.GhostPlacingCondition.IsSnapped) && !this.m_ConstructionToAttachTo)             {                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             if (this.m_SelectedSlot)             {                 foreach (ConstructionSlot constructionSlot in this.m_SelectedSlot.gameObject.GetComponents())                 {                     if (constructionSlot.m_Construction && constructionSlot.m_Construction.gameObject.activeSelf && (!constructionSlot.m_Construction.m_Info.IsWall() || this.m_ResultInfo.IsWall()) && (constructionSlot.m_Construction.m_Info.IsWall() || !this.m_ResultInfo.IsWall()))                     {                         this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                         return;                     }                 }             }             if (ItemInfo.IsStoneRing(this.m_ResultItemID) && this.m_Firecamp && this.m_Firecamp.m_StoneRing)             {                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             if (this.m_Corners != null)             {                 foreach (BoxCollider boxCollider in this.m_Corners)                 {                     bool enabled = boxCollider.enabled;                     boxCollider.enabled = true;                     bool flag = this.IsInAir(boxCollider.bounds.center, boxCollider.bounds.min);                     boxCollider.enabled = enabled;                     if (flag)                     {                         this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                         return;                     }                 }             }             if (this.IsOnUpperLevel() && this.m_UpperLevelCorners != null)             {                 foreach (BoxCollider boxCollider2 in this.m_UpperLevelCorners)                 {                     bool enabled2 = boxCollider2.enabled;                     boxCollider2.enabled = true;                     Vector3 center2 = boxCollider2.bounds.center;                     center2.y += boxCollider2.bounds.max.y;                     bool flag2 = this.IsCornerInAir(center2, boxCollider2.bounds.min);                     boxCollider2.enabled = enabled2;                     if (flag2)                     {                         this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                         return;                     }                 }             }             this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;             if (this.m_AllignToTerrain && !this.m_Smoker && this.m_FirecampRacks.Count == 0 && Vector3.Angle(base.transform.up, Vector3.up) > this.m_MaxAllignAngle)             {                 this.ClearCollidingPlants();                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             Vector3 center3 = this.m_BoxCollider.bounds.center;             Vector3 vector2 = this.m_BoxCollider.size * 0.5f;             center3.y += this.m_ColliderShrinkBottom * 0.5f;             vector2.y -= this.m_ColliderShrinkBottom;             vector2.y = Mathf.Max(vector2.y, 0f);             this.m_Colliders.Clear();             if (this.m_TestColliders != null)             {                 foreach (BoxCollider boxCollider3 in this.m_TestColliders)                 {                     Vector3 size = boxCollider3.size;                     size.x *= boxCollider3.transform.localScale.x;                     size.y *= boxCollider3.transform.localScale.y;                     size.z *= boxCollider3.transform.localScale.z;                     int num2 = Physics.OverlapBoxNonAlloc(boxCollider3.bounds.center, size * 0.5f, ConstructionGhost.s_CollidersTemp, boxCollider3.transform.rotation);                     for (int k = 0; k < num2; k++)                     {                         Collider collider2 = ConstructionGhost.s_CollidersTemp[k];                         if (!this.m_Colliders.Contains(collider2) && !this.m_TestColliders.Contains(collider2))                         {                             if (this.m_ResultItemID != ItemID.TroughFood && this.m_ResultItemID != ItemID.TroughWater && collider2.gameObject.GetComponent())                             {                                 this.ClearCollidingPlants();                                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                 return;                             }                             if (collider2.isTrigger && !collider2.gameObject.GetComponent())                             {                                 Spikes component = collider2.gameObject.GetComponent();                                 Acre exists = collider2.gameObject.transform.parent ? collider2.gameObject.transform.parent.GetComponent() : null;                                 FramePlacingObstacle component2 = collider2.gameObject.GetComponent();                                 ConstructBlockSensor component3 = collider2.gameObject.GetComponent();                                 if (component3)                                 {                                     if (this.ShouldIgnoreConstructionBlocker(component3))                                     {                                         goto IL_6DF;                                     }                                     this.TryToShowRestrictedAreaHint();                                 }                                 if (!component && !exists && !component2 && !component3)                                 {                                     goto IL_6DF;                                 }                             }                             if (!(collider2.gameObject == Terrain.activeTerrain.gameObject) && !(collider2.transform.parent == base.transform))                             {                                 this.m_Colliders.Add(collider2);                             }                         }                         IL_6DF:;                     }                 }             }             else             {                 int num3 = Physics.OverlapBoxNonAlloc(center3, vector2, ConstructionGhost.s_CollidersTemp, this.m_BoxCollider.transform.rotation);                 this.m_Colliders.Resize(num3);                 for (int l = 0; l < num3; l++)                 {                     this.m_Colliders[l] = ConstructionGhost.s_CollidersTemp[l];                 }             }             this.m_Colliders.Remove(Player.Get().m_Collider);             this.m_Colliders.Remove(this.m_BoxCollider);             if (this.m_AdditionalPlacingConditions.Contains(ConstructionGhost.GhostPlacingCondition.NeedFirecamp) && this.m_Firecamp)             {                 this.m_Colliders.Remove(this.m_Firecamp.m_Collider);                 if (this.m_Firecamp.m_StoneRing)                 {                     this.m_Colliders.Remove(this.m_Firecamp.m_StoneRing.m_Collider);                 }             }             if ((ItemInfo.IsFirecamp(this.m_ResultItemID) || ItemInfo.IsStoneRing(this.m_ResultItemID)) && this.m_FirecampRacks.Count > 0)             {                 foreach (FirecampRack firecampRack in this.m_FirecampRacks)                 {                     this.m_Colliders.Remove(firecampRack.m_Collider);                 }             }             if ((ItemInfo.IsFirecamp(this.m_ResultItemID) || ItemInfo.IsStoneRing(this.m_ResultItemID)) && this.m_Smoker)             {                 this.m_Colliders.Remove(this.m_Smoker.m_Collider);             }             if (ConstructionChainController.Get().IsActive())             {                 foreach (ConstructionGhostChain constructionGhostChain in ConstructionChainController.Get().m_Chain)                 {                     this.m_Colliders.Remove(constructionGhostChain.m_Collider);                 }             }             if (this.m_ResultItemID == ItemID.TroughFood || this.m_ResultItemID == ItemID.TroughWater)             {                 bool flag3 = false;                 using (List.Enumerator enumerator4 = this.m_Colliders.GetEnumerator())                 {                     while (enumerator4.MoveNext())                     {                         if (enumerator4.Current.gameObject.GetComponent() != null)                         {                             flag3 = true;                             break;                         }                     }                 }                 if (!flag3)                 {                     this.ClearCollidingPlants();                     this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                     return;                 }             }             if (this.m_ResultItemID != ItemID.Stick_Fish_Trap && this.m_ResultItemID != ItemID.Big_Stick_Fish_Trap)             {                 foreach (Collider collider3 in this.m_Colliders)                 {                     Item component4 = collider3.gameObject.GetComponent();                     if (!(component4 != null) || component4.m_Info == null || component4.m_Info.IsConstruction() || component4.m_IsPlant || component4.m_IsTree)                     {                         Farm component5 = collider3.gameObject.GetComponent();                         if (component5)                         {                             if (this.m_ResultItemID != ItemID.TroughFood && this.m_ResultItemID != ItemID.TroughWater)                             {                                 this.ClearCollidingPlants();                                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                 return;                             }                             if ((this.m_ResultItemID == ItemID.TroughFood || this.m_ResultItemID == ItemID.TroughWater) && this.m_Colliders.Contains(component5.m_DoorArea))                             {                                 this.ClearCollidingPlants();                                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                 return;                             }                         }                         if (collider3.isTrigger)                         {                             if ((this.m_ResultItemID == ItemID.building_frame || this.m_ResultItemID == ItemID.building_bamboo_frame || this.m_ResultItemID == ItemID.wooden_frame_triangle || this.m_ResultItemID == ItemID.bamboo_frame_triangle) && collider3.gameObject.GetComponent())                             {                                 this.ClearCollidingPlants();                                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                 return;                             }                             UnityEngine.Object component6 = collider3.gameObject.GetComponent();                             Acre exists2 = collider3.gameObject.transform.parent ? collider3.gameObject.transform.parent.GetComponent() : null;                             ConstructBlockSensor component7 = collider3.gameObject.GetComponent();                             if (component6 || exists2 || component7)                             {                                 if (component7)                                 {                                     if (this.ShouldIgnoreConstructionBlocker(component7))                                     {                                         continue;                                     }                                     this.TryToShowRestrictedAreaHint();                                 }                                 this.ClearCollidingPlants();                                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                 return;                             }                             ConstructionGhost component8 = collider3.gameObject.GetComponent();                             if (!(component8 != null))                             {                                 continue;                             }                             if (component8.m_ResultItemID == ItemID.mud_mixer)                             {                                 this.ClearCollidingPlants();                                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                 return;                             }                             using (List.Enumerator enumerator6 = component8.m_Steps.GetEnumerator())                             {                                 while (enumerator6.MoveNext())                                 {                                     GhostStep ghostStep = enumerator6.Current;                                     foreach (GhostSlot ghostSlot in ghostStep.m_Slots)                                     {                                         if (base.m_Collider.bounds.Intersects(ghostSlot.m_Collider.bounds))                                         {                                             this.ClearCollidingPlants();                                             this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                             return;                                         }                                     }                                 }                                 continue;                             }                         }                         if (!this.m_ConstructionToAttachTo || (!(collider3.gameObject == this.m_ConstructionToAttachTo.gameObject) && !(collider3.gameObject == Terrain.activeTerrain.gameObject)))                         {                             ConstructionGhost component9 = collider3.gameObject.GetComponent();                             if (component9 != null)                             {                                 foreach (GhostStep ghostStep2 in component9.m_Steps)                                 {                                     foreach (GhostSlot ghostSlot2 in ghostStep2.m_Slots)                                     {                                         if (base.m_Collider.bounds.Intersects(ghostSlot2.m_Collider.bounds))                                         {                                             this.ClearCollidingPlants();                                             this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                             return;                                         }                                     }                                 }                             }                             Construction construction = collider3.gameObject.GetComponent();                             if (!construction && collider3.gameObject.transform.parent)                             {                                 construction = collider3.gameObject.GetComponentInParent();                             }                             if (construction)                             {                                 if (!(construction == this.m_ConstructionToAttachTo) && (this.IsBalcony(this.m_ResultItemID) || this.IsFrameTriangle(this.m_ResultItemID) || this.IsFrameTriangle(construction.GetInfoID()) || (this.m_ConstructionToAttachTo && this.IsFrameTriangle(this.m_ConstructionToAttachTo.GetInfoID())) || !this.m_ConstructionToAttachTo || !this.m_ConstructionToAttachTo.IsConstructionConnected(construction)))                                 {                                     if (ConstructionChainController.Get().IsActive())                                     {                                         if (ConstructionChainController.Get().IsStartOrEnd(construction))                                         {                                             continue;                                         }                                         if (construction.m_Info.IsWall())                                         {                                             this.ClearCollidingPlants();                                             this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                             return;                                         }                                         bool flag4 = false;                                         for (int m = 0; m < 2; m++)                                         {                                             Construction construction2 = (m == 0) ? ConstructionChainController.Get().GetStartConstructionToAttachTo() : ConstructionChainController.Get().GetEndConstructionToAttachTo();                                             if (construction2 && !this.IsBalcony(this.m_ResultItemID) && !this.IsFrameTriangle(this.m_ResultItemID) && !this.IsFrameTriangle(construction.GetInfoID()) && (!this.m_ConstructionToAttachTo || !this.IsFrameTriangle(construction2.GetInfoID())) && construction2 && construction2.IsConstructionConnected(construction))                                             {                                                 flag4 = true;                                                 break;                                             }                                         }                                         if (flag4)                                         {                                             continue;                                         }                                     }                                     if (this.m_SelectedSlot && this.m_SelectedSlot.m_ParentConstruction)                                     {                                         int num4 = this.m_SelectedSlot.m_UpperLevelSlot ? (this.m_SelectedSlot.m_ParentConstruction.m_Level + 1) : this.m_SelectedSlot.m_ParentConstruction.m_Level;                                         if (construction.m_Level != num4)                                         {                                             continue;                                         }                                     }                                     if ((!this.IsOnUpperLevel() || construction.m_Level != 0) && (this.IsOnUpperLevel() || construction.m_Level                                     {                                         this.ClearCollidingPlants();                                         this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                         return;                                     }                                 }                             }                             else                             {                                 ConstructionGhost exists3 = null;                                 if (collider3.transform.parent)                                 {                                     exists3 = collider3.transform.parent.GetComponent();                                 }                                 if (!collider3.gameObject.IsWater() && !this.m_LayerMasksToIgnore.Contains(collider3.gameObject.layer) && !collider3.isTrigger && !exists3 && !this.HackForTreePlatformFloor(collider3))                                 {                                     this.ClearCollidingPlants();                                     this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                                     return;                                 }                             }                         }                     }                 }             }             if (this.m_ResultItemID == ItemID.farm)             {                 center3 = this.m_BoxCollider.bounds.center;                 vector2 = this.m_BoxCollider.size * 0.5f;                 vector2.y = Mathf.Max(vector2.y, 0f);                 int num5 = Physics.OverlapBoxNonAlloc(center3, vector2, ConstructionGhost.s_CollidersTemp, this.m_BoxCollider.transform.rotation);                 this.m_Colliders.Resize(num5);                 for (int n = 0; n < num5; n++)                 {                     this.m_Colliders[n] = ConstructionGhost.s_CollidersTemp[n];                 }                 this.m_Colliders.Remove(Player.Get().m_Collider);                 this.m_Colliders.Remove(this.m_BoxCollider);             }             Collider collider4 = null;             foreach (Collider collider5 in this.m_Colliders)             {                 if (collider5.gameObject.IsWater())                 {                     collider4 = collider5;                     break;                 }             }             if (this.m_AdditionalPlacingConditions.Contains(ConstructionGhost.GhostPlacingCondition.MustBeInWater) && !collider4)             {                 if (this.m_Hook)                 {                     center3 = this.m_Hook.bounds.center;                     vector2 = this.m_Hook.size * 0.5f;                     int num6 = Physics.OverlapBoxNonAlloc(center3, vector2, ConstructionGhost.s_CollidersTemp, this.m_Hook.transform.rotation);                     for (int num7 = 0; num7 < num6; num7++)                     {                         if (ConstructionGhost.s_CollidersTemp[num7].gameObject.IsWater())                         {                             return;                         }                     }                 }                 this.ClearCollidingPlants();                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             if (this.m_AdditionalPlacingConditions.Contains(ConstructionGhost.GhostPlacingCondition.MustBeInWater) && collider4 && this.m_Hook)             {                 this.ClearCollidingPlants();                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             if ((this.m_AdditionalPlacingConditions.Contains(ConstructionGhost.GhostPlacingCondition.CantBeInWater) || this.m_AdditionalPlacingConditions.Contains(ConstructionGhost.GhostPlacingCondition.NeedFirecamp)) && collider4)             {                 this.ClearCollidingPlants();                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             if (collider4 && this.m_MaxDepthOfWater > 0f && collider4.bounds.max.y - this.m_BoxCollider.bounds.min.y > this.m_MaxDepthOfWater)             {                 this.ClearCollidingPlants();                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             if (this.m_AdditionalPlacingConditions.Contains(ConstructionGhost.GhostPlacingCondition.Whatever) || this.m_AdditionalPlacingConditions.Contains(ConstructionGhost.GhostPlacingCondition.CantBeInWater) || this.m_ResultItemID == ItemID.bamboo_platform || this.m_ResultItemID == ItemID.bamboo_platform_triangle)             {                 List list = new List();                 foreach (Collider collider6 in this.m_Colliders)                 {                     if (this.m_LayerMasksToIgnore.Contains(collider6.gameObject.layer) && collider6.gameObject.layer != this.m_ItemLayer)                     {                         if (!this.m_CollidingPlants.ContainsKey(collider6.gameObject))                         {                             this.AddCollidingPlant(collider6.gameObject);                         }                         list.Add(collider6.gameObject);                     }                 }                 int num8 = 0;                 while (num8 < this.m_CollidingPlants.Keys.Count)                 {                     if (!list.Contains(this.m_CollidingPlants.ElementAt(num8).Key))                     {                         this.RemoveCollidingPlant(this.m_CollidingPlants.ElementAt(num8).Key);                     }                     else                     {                         num8++;                     }                 }             }             if (this.m_ConstructionBelow && this.m_ConstructionBelow.m_Level >= 3)             {                 this.ClearCollidingPlants();                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             if (this.m_CollidingPlants.Count > 0)             {                 this.m_ProhibitionType = ConstructionGhost.ProhibitionType.None;                 return;             }             return;         }     }

  }

F8一键完成蓝图 ConstructionGhost.UpdateState

整段修改为

    public virtual void UpdateState()     {         if (this.IsReady() || Input.GetKeyDown(KeyCode.F8))         {             this.SetState(ConstructionGhost.GhostState.Ready);         }         ConstructionGhost.GhostState state = this.m_State;         if (state == ConstructionGhost.GhostState.Dragging)         {             this.UpdateRotation();             this.UpdateTransform();             this.UpdateColor();             this.UpdateShaderProps();             return;         }         if (state != ConstructionGhost.GhostState.Building)         {             return;         }         this.UpdateShaderProps();         if (this.ReplIsOwner() && this.IsReady())         {             this.SetState(ConstructionGhost.GhostState.Ready);         }     }

  }

无敌模式 MainLevel.UpdateInputsDebug

整段改成

private void UpdateInputsDebug()

{ if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.G)) { Cheats.m_GodMode = !Cheats.m_GodMode; return; }

功能

左Ctrl+G开启无敌模式

无限视距 UpdateSizeAndOpacity

建筑大师 Construction.TakeDamage

第一步 定义 m_NoSpawn

搜索类 Cheats.

添加 public static bool m_NoSpawn;

第二步 添加按键,开启 m_NoSpawn

搜索类 MainLevel.UpdateInputsDebug

在原文段之后添加代码

else if (Input.GetKeyUp(KeyCode.H))             {                 Cheats.m_NoSpawn = !Cheats.m_NoSpawn;             }

整段变成

 private void UpdateInputsDebug() { if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.G)) { Cheats.m_GodMode = !Cheats.m_GodMode; return; } if (Input.GetKeyDown(KeyCode.KeypadPeriod)) { this.m_TODTime.ProgressTime = !this.m_TODTime.ProgressTime; } else if (Input.GetKeyUp(KeyCode.H))             {                 Cheats.m_NoSpawn = !Cheats.m_NoSpawn;             }       } }

说明

左Ctrl+G开启无敌模式

左Ctrl+H开启 建筑大师m_NoSpawn

小键盘.冻结时间

第三步 设置摧毁效果

搜索类 Construction.TakeDamage

CTRL+F搜索if (this.m_CurrentHitsCount >= this.m_ConstructionInfo.m_HitsCountToDestroy)将上面代码及其以后整个替换成         if (this.m_CurrentHitsCount > (Cheats.m_GodMode ? 1 : this.m_ConstructionInfo.m_HitsCountToDestroy) || Cheats.m_GodMode)         {             if (Cheats.m_NoSpawn)             {                 UnityEngine.Object.Destroy(base.gameObject);             }             else             {                 this.DestroyMe(true, false, true, true);             }         }         else         {             this.m_LastDamageTime = Time.time;             base.HitShake();         }         return true;     } }

说明

开启无敌模式和m_NoSpawn时,玩家可以一击拆除建筑,且不掉材料。

第四步 设置文字提醒显示

搜索类 MainLevel.UpdateInputsDebug

整段改成

        if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.G))         {             Cheats.m_GodMode = !Cheats.m_GodMode;             string str = "无敌模式\u00a0-\u00a0";             if (Cheats.m_GodMode)             {                 HUDMessages.Get().AddMessage(str + "已开启", new Color?(new Color(21f, 228f, 142f, 1f)), HUDMessageIcon.None, "", null);                 return;             }             HUDMessages.Get().AddMessage(str + "已关闭", new Color?(new Color(224f, 66f, 54f, 1f)), HUDMessageIcon.None, "", null);             return;         }         else if (Input.GetKeyDown(KeyCode.KeypadPeriod))         {             this.m_TODTime.ProgressTime = !this.m_TODTime.ProgressTime;             string str2 = "时间冻结\u00a0-\u00a0";             if (this.m_TODTime.ProgressTime)             {                 HUDMessages.Get().AddMessage(str2 + "已关闭", new Color?(new Color(21f, 228f, 142f, 1f)), HUDMessageIcon.None, "", null);                 return;             }             HUDMessages.Get().AddMessage(str2 + "已开启", new Color?(new Color(224f, 66f, 54f, 1f)), HUDMessageIcon.None, "", null);             return;         }         else         {             if (Input.GetKeyDown(KeyCode.Keypad9))             {                 SaveGame.Save();                 return;             }             if (!Input.GetKeyUp(KeyCode.H))             {                 return;             }             Cheats.m_NoSpawn = !Cheats.m_NoSpawn;             string str3 = "建筑大师\u00a0-\u00a0";             if (Cheats.m_NoSpawn)             {                 HUDMessages.Get().AddMessage(str3 + "已开启", new Color?(new Color(21f, 228f, 142f, 1f)), HUDMessageIcon.None, "", null);                 return;             }             HUDMessages.Get().AddMessage(str3 + "已关闭", new Color?(new Color(224f, 66f, 54f, 1f)), HUDMessageIcon.None, "", null);             return;         }     } }

说明

增加了一个保存的功能

debugmod主要功能

★F1刷物品F3传送F4加技能点F5刷敌对AI  F6调整状态  ctrl+U开启所有建筑蓝图 搜索ItemsManager.UpdateDebug     private void UpdateDebug()下面替换成下面代码     {         if (Input.GetKeyDown(KeyCode.F1))         {             MenuInGameManager.Get().ShowScreen(typeof(MenuDebugItem));             return;         }         if (Input.GetKeyDown(KeyCode.F3))         {             MenuInGameManager.Get().ShowScreen(typeof(MenuDebugSpawners));             return;         }         if (Input.GetKeyDown(KeyCode.F4))         {             MenuInGameManager.Get().ShowScreen(typeof(MenuDebugSkills));             return;         }         if (Input.GetKeyDown(KeyCode.F5))         {             MenuInGameManager.Get().ShowScreen(typeof(MenuDebugAI));             return;         }         if (Input.GetKeyDown(KeyCode.F6))         {             MenuInGameManager.Get().ShowScreen(typeof(MenuDebugWounds));             return;         }         if (this.m_DebugSpawnID != ItemID.None && Input.GetKeyDown(KeyCode.F2))         {             Localization localization = GreenHellGame.Instance.GetLocalization();             Vector3 forward = Player.Get().GetHeadTransform().forward;             Vector3 vector = Player.Get().GetHeadTransform().position + 0.5f * forward;             RaycastHit raycastHit;             vector = (Physics.Raycast(vector, forward, out raycastHit, 3f) ? raycastHit.point : (vector + forward * 2f));             this.CreateItem(this.m_DebugSpawnID, true, vector - forward * 0.2f, Player.Get().transform.rotation, false);             string text = localization.Get(this.m_DebugSpawnID.ToString(), true);             text = ((text.IndexOf("MISSING TEXT") == -1) ? text : this.m_DebugSpawnID.ToString());             HUDMessages.Get().AddMessage(string.Format("物品【{0}】创建成功", text), new Color?(new Color(224f, 66f, 54f, 1f)), HUDMessageIcon.None, "", null);         }         if (Input.GetKeyDown(KeyCode.P))         {             this.UnlockItemInNotepad(ItemID.Logs_Bed);         }         if (Input.GetKey(KeyCode.U) && Input.GetKey(KeyCode.LeftControl))         {             this.UnlockAllItemsInNotepad();             PlayerDiseasesModule.Get().UnlockAllDiseasesInNotepad();             PlayerDiseasesModule.Get().UnlockAllDiseasesTratmentInNotepad();             PlayerDiseasesModule.Get().UnlockAllSymptomsInNotepad();             PlayerDiseasesModule.Get().UnlockAllSymptomTreatmentsInNotepad();             PlayerInjuryModule.Get().UnlockAllInjuryState();             PlayerInjuryModule.Get().UnlockAllInjuryStateTreatment();             PlayerInjuryModule.Get().UnlockAllKnownInjuries();             this.UnloackAllConsumed();             this.UnlockAllCrafted();             this.UnlockAllBoiledData();             this.UnlockAllCollected();             this.UnlockAllItemInfos();             MapTab mapTab = (MapTab)MenuNotepad.Get().m_Tabs[MenuNotepad.MenuNotepadTab.MapTab];             if (mapTab == null)             {                 return;             }             mapTab.UnlockAll(true);         }     } }

“保存并退出”按钮改随处保存

第一步 更改按钮定义

搜索类 m_SaveAndQuitButton

修改为 m_SaveButton

搜索类 SaveAndQuit

修改为 Save

第二步 更改按钮描述

搜索类 MenuInGame

找到 MenuInGame_SaveAndQuit

改为 MenuInGame_Save

此时游戏内“保存并退出”按钮变更为“保存游戏”

第三步 删除对话

搜索类 OnSaveAndQuit

中间直接改成

            {                 SaveGame.Save();                 return;             }

此时点击游戏内“保存游戏”,不再需要确认,而是直接保存游戏。

第四步 功能实现

搜索类 UpdateSaveAndQuit

删除 this.ReturnToMainMenu();

此时点击游戏内“保存游戏”,不再跳到主菜单。

四、关于部分功能的说明

1.随处建造本身就包含了解除限高,因此不要纠结为什么这里面没有解除限高。类似问题还有很多,其实这都不是问题。

2.“冰箱”的意思是放进去的食物、花朵不会腐败。如果你需要干燥的花朵来进行种植,就别放冰箱了。

3.图标修改会导致长按y自动整理背包时,部分图标溢出背包界面。这时候可以点击相关页面的图标,重置图标错误。举例来说,比如我使用自动整理背包,整理烟草业、船子草、羽毛……这个原料界面,出现错误的时候,我只需要点一下背包页面那五个的中间那个图标就可以了。

4.F8一键生成并不是立即生成instantly build,立即生成是指拉完蓝图以后立即生成。考虑到配合随处建造,立即生成可能会造成一些问题。包括,但不限于泥巴平台拉到水面以下导致河床一堆“粑粑”异常难看、火堆卡贴图去不掉、多重建筑等等问题。

其实立即生成instantly build还会包含一个范围问题。网上的建议是直接删了,这样会导致一些问题,比如亚马逊之魂第三章需要修复图腾。如果你直接删除了Range()的范围限制,那么你刚进亚马逊之魂才开始第一章的时候,第三章的图腾可能已经完成了,但由于你没有开第三章的图,没有和第三章哈巴库长老对话,从而失去第三章重建图腾的信任度,这样会导致第三章剧情比较难进行。另外就是如果有玩家在房间开挂,同样会导致这个问题产生。

5.正常情况下,“多人房”一般不和“无限视距”一起用,因为多人房超过4个人时,必定是多出来的那些玩家在游戏中都没有名字。至于是不是具有无限视距,对房间里的人来说没有任何意义。因为当你使用“多人房”mod时,原本的这4名玩家也可能失去名字,不被其他人看到,或者看不到别人的名字。房间前4名玩家出现这个bug的时候,玩家原地睡觉并且立即醒来可能会取消这个bug效果。

6.无敌以及以上代码全部经过多个版本测试并无bug。如果你的代码不能运行,只能是你的输入有错误。你可以尝试在群里询问其他mod制作者,记得配上你的截图代码段,以便寻找错误。

五、最后

感谢您能看到最后。如果还有什么问题,可以来群里讨论。最后祝您中秋快乐!阖家团圆。

我们的讨论群:

绿色地狱一群:751219981

绿色地狱二群:211609466

绿色地狱三群:557062795