AutoDropBedding 1.1.0
This commit is contained in:
commit
e1fd2d30d6
41
AutoDropBedding/AutoDropBeddingMenu.cs
Executable file
41
AutoDropBedding/AutoDropBeddingMenu.cs
Executable file
|
@ -0,0 +1,41 @@
|
|||
using AutoDropBedding;
|
||||
|
||||
namespace XRL.World.Parts
|
||||
{
|
||||
public class AutoDropBeddingMenu : IPart
|
||||
{
|
||||
private static string NAME = "SetUpBedroll";
|
||||
|
||||
public override bool WantEvent(int ID, int cascade) =>
|
||||
ID == InventoryActionEvent.ID ||
|
||||
ID == GetCookingActionsEvent.ID ||
|
||||
base.WantEvent(ID, cascade);
|
||||
|
||||
public override bool HandleEvent(GetCookingActionsEvent E)
|
||||
{
|
||||
if (Config.AddMenuOptionToCamp && Helpers.HasBedroll())
|
||||
{
|
||||
Helpers.Log("Adding menu option.");
|
||||
E.AddAction(NAME,
|
||||
"Lay out bedding",
|
||||
NAME,
|
||||
Key: 'b',
|
||||
Default: 0,
|
||||
Priority: 200);
|
||||
}
|
||||
|
||||
return base.HandleEvent(E);
|
||||
}
|
||||
|
||||
public override bool HandleEvent(InventoryActionEvent E)
|
||||
{
|
||||
if (E.Command == NAME)
|
||||
{
|
||||
Helpers.Log("Got setup bed command.");
|
||||
Helpers.PutDownBedroll(campfireCell: E.CellTarget);
|
||||
E.RequestInterfaceExit();
|
||||
}
|
||||
return base.HandleEvent(E);
|
||||
}
|
||||
}
|
||||
}
|
12
AutoDropBedding/Config.cs
Executable file
12
AutoDropBedding/Config.cs
Executable file
|
@ -0,0 +1,12 @@
|
|||
using static XRL.UI.Options;
|
||||
|
||||
namespace AutoDropBedding
|
||||
{
|
||||
public static class Config
|
||||
{
|
||||
public static bool AutoDrop => GetOption("AutoDropBedding_AutoDrop").EqualsNoCase("Yes");
|
||||
public static bool AddMenuOptionToCamp => GetOption("AutoDropBedding_AddMenuOptionToCamp").EqualsNoCase("Yes");
|
||||
public static bool DebugLogging => GetOption("AutoDropBedding_DebugLogging").EqualsNoCase("Yes");
|
||||
public static bool CompanionDrop => GetOption("AutoDropbedding_CompanionDrop").EqualsNoCase("Yes");
|
||||
}
|
||||
}
|
30
AutoDropBedding/Extensions.cs
Executable file
30
AutoDropBedding/Extensions.cs
Executable file
|
@ -0,0 +1,30 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using XRL.World;
|
||||
|
||||
// maybe this is a little extra but whatever
|
||||
namespace AutoDropBedding
|
||||
{
|
||||
public static class Extensions
|
||||
{
|
||||
// todo: find other things that set bedding on fire
|
||||
private static readonly List<string> Firestarters = new List<string>() {"Campfire", "BlueCampfire"};
|
||||
|
||||
public static bool HasAnyLiquid(this Cell cell)
|
||||
{
|
||||
foreach (var _ in cell.GetObjects(o => o.HasPart("LiquidVolume")))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool HasFirestarter(this Cell cell)
|
||||
{
|
||||
foreach (string thing in Firestarters)
|
||||
{
|
||||
if (cell.HasObject(thing))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
25
AutoDropBedding/HarmonyPatches/Patch_Survival_Camp.cs
Executable file
25
AutoDropBedding/HarmonyPatches/Patch_Survival_Camp.cs
Executable file
|
@ -0,0 +1,25 @@
|
|||
using HarmonyLib;
|
||||
using XRL.World;
|
||||
using XRL.World.Parts.Skill;
|
||||
|
||||
namespace AutoDropBedding.HarmonyPatches
|
||||
{
|
||||
[HarmonyPatch(typeof(Survival_Camp), nameof(Survival_Camp.AttemptCamp))]
|
||||
public static class Patch_Survival_Camp
|
||||
{
|
||||
public static void Postfix(ref bool __result, GameObject Actor)
|
||||
{
|
||||
if (__result && Actor.IsPlayer() && Config.AutoDrop)
|
||||
{
|
||||
Helpers.PutDownBedroll(who: Actor, first: true);
|
||||
if (Config.CompanionDrop)
|
||||
{
|
||||
foreach (var companion in Actor.GetCompanions())
|
||||
{
|
||||
Helpers.PutDownBedroll(who: companion, first: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
122
AutoDropBedding/Helpers.cs
Executable file
122
AutoDropBedding/Helpers.cs
Executable file
|
@ -0,0 +1,122 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using XRL.Core;
|
||||
using XRL.Rules;
|
||||
using XRL.World;
|
||||
|
||||
namespace AutoDropBedding
|
||||
{
|
||||
public static class Helpers
|
||||
{
|
||||
public static void Log(string msg)
|
||||
{
|
||||
if (Config.DebugLogging)
|
||||
UnityEngine.Debug.Log("[AutoDropBedding] " + msg);
|
||||
}
|
||||
|
||||
public static List<GameObject> GetBedsInInventory(GameObject who = null)
|
||||
{
|
||||
Helpers.Log("Checking for beds in inventory.");
|
||||
return who.Inventory.GetObjects(o => o.HasPart("Bed"));
|
||||
}
|
||||
|
||||
public static Cell FindNearestCampfire(GameObject who = null)
|
||||
{
|
||||
foreach (var cell in who.CurrentCell.GetAdjacentCells())
|
||||
{
|
||||
if (cell.HasFirestarter())
|
||||
{
|
||||
Helpers.Log("Found campfire in cell " + cell.Pos2D.ToString());
|
||||
return cell;
|
||||
}
|
||||
}
|
||||
Helpers.Log("Couldn't find campfire???");
|
||||
return null;
|
||||
}
|
||||
|
||||
public static bool HasBedroll(GameObject who = null)
|
||||
{
|
||||
if (who == null)
|
||||
who = XRLCore.Core?.Game?.Player?.Body;
|
||||
|
||||
foreach (var _ in GetBedsInInventory(who))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public static Cell PickBedrollCell(Cell dropperCell, Cell campfireCell)
|
||||
{
|
||||
if (dropperCell == null)
|
||||
dropperCell = XRLCore.Core?.Game?.Player?.Body.CurrentCell;
|
||||
|
||||
if (campfireCell == null)
|
||||
campfireCell = FindNearestCampfire(XRLCore.Core?.Game?.Player?.Body);
|
||||
|
||||
Log("Picking cell for bed.");
|
||||
|
||||
List<Cell> nearDropperCells = dropperCell.GetAdjacentCells();
|
||||
nearDropperCells.Add(dropperCell); // ensure bedroll isn't dropped in campfire if dropper is in same cell
|
||||
|
||||
if (campfireCell == null)
|
||||
{
|
||||
Log("Couldn't find a campfire anywhere, falling back to player cell.");
|
||||
return dropperCell;
|
||||
}
|
||||
|
||||
string nearbyMsg = "cells nearby: ";
|
||||
nearDropperCells.ForEach(cell => nearbyMsg += cell.Pos2D.ToString() + " ");
|
||||
Log(nearbyMsg);
|
||||
|
||||
List<Cell> nearCampfireCells = campfireCell.GetAdjacentCells()
|
||||
.Where(cell => cell.IsEmpty() &&
|
||||
cell.IsVisible() &&
|
||||
!cell.HasFirestarter() &&
|
||||
!cell.HasAnyLiquid())
|
||||
.ToList();
|
||||
|
||||
string campMsg = "cells nearby campfire: ";
|
||||
nearCampfireCells.ForEach(cell => campMsg += cell.Pos2D.ToString() + " ");
|
||||
Log(campMsg);
|
||||
|
||||
List<Cell> commonCells = nearDropperCells.Intersect(nearCampfireCells).ToList();
|
||||
|
||||
string commonMsg = "common cells: ";
|
||||
commonCells.ForEach(cell => commonMsg += cell.Pos2D.ToString() + " ");
|
||||
Log(commonMsg);
|
||||
|
||||
// return random cell adjacent to both campfire and bedroll dropper, or dropper cell if none
|
||||
int randy = Stat.GetSeededRandomGenerator(dropperCell.Pos2D.ToString()).Next(0, commonCells.Count);
|
||||
return commonCells.Count > 0 ? commonCells[randy] : dropperCell;
|
||||
}
|
||||
|
||||
public static void PutDownBedroll(GameObject who = null, Cell campfireCell = null, bool first = false)
|
||||
{
|
||||
if (who == null)
|
||||
who = XRLCore.Core?.Game?.Player?.Body;
|
||||
|
||||
if (campfireCell == null)
|
||||
campfireCell = FindNearestCampfire(who);
|
||||
|
||||
if (HasBedroll(who))
|
||||
{
|
||||
Cell bedrollCell = PickBedrollCell(who.CurrentCell, campfireCell);
|
||||
|
||||
GameObject bed;
|
||||
List<GameObject> beds = GetBedsInInventory(who);
|
||||
|
||||
if (first || beds.Count == 1)
|
||||
bed = beds[0];
|
||||
else
|
||||
bed = XRL.UI.PickItem.ShowPicker(beds);
|
||||
|
||||
// why isn't there Inventory.Drop() or something
|
||||
var newBed = bedrollCell.AddObject(bed);
|
||||
who.Inventory.RemoveObject(bed);
|
||||
|
||||
Log("Putting " + newBed.ShortDisplayName + " into cell.");
|
||||
IComponent<GameObject>.XDidY(who, "set out", newBed.a + newBed.ShortDisplayName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
5
AutoDropBedding/ObjectBlueprints.xml
Executable file
5
AutoDropBedding/ObjectBlueprints.xml
Executable file
|
@ -0,0 +1,5 @@
|
|||
<objects>
|
||||
<object Name="Campfire" Load="Merge">
|
||||
<part Name="AutoDropBeddingMenu" />
|
||||
</object>
|
||||
</objects>
|
7
AutoDropBedding/Options.xml
Executable file
7
AutoDropBedding/Options.xml
Executable file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<options>
|
||||
<option ID="AutoDropBedding_AutoDrop" DisplayText="Automatically lay out bedding when using the 'Make Camp' ability" Category="Automation" Type="Checkbox" Default="Yes" />
|
||||
<option ID="AutoDropBedding_AddMenuOptionToCamp" DisplayText="Add 'Lay Out Bedding' option to campfire menu" Category="User Interface" Type="Checkbox" Default="Yes" />
|
||||
<option ID="AutoDropBedding_DebugLogging" DisplayText="Send AutoDropBedding nonsense to Player.log" Category="Debug" Type="Checkbox" Default="No" />
|
||||
<option ID="AutoDropbedding_CompanionDrop" DisplayText="Companions also lay out bedding when using the 'Make Camp' ability" Category="Automation" Type="Checkbox" Default="No" />
|
||||
</options>
|
8
AutoDropBedding/manifest.json
Executable file
8
AutoDropBedding/manifest.json
Executable file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"id": "AutoDropBedding",
|
||||
"title": "{{auto drop bedding|Auto Drop Bedding}}",
|
||||
"description": "Put out a bedroll when you make camp, if you have one. Also adds the option to lay out bedding to the campfire menu.",
|
||||
"version": "1.1.0",
|
||||
"author": "{{paisley|Celediel}}",
|
||||
"previewImage": "preview.png"
|
||||
}
|
BIN
AutoDropBedding/preview.png
Executable file
BIN
AutoDropBedding/preview.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
BIN
AutoDropBedding/screenshot_campfire.png
Executable file
BIN
AutoDropBedding/screenshot_campfire.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
BIN
AutoDropBedding/screenshot_menu.png
Executable file
BIN
AutoDropBedding/screenshot_menu.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 45 KiB |
8
AutoDropBedding/workshop.json
Executable file
8
AutoDropBedding/workshop.json
Executable file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"WorkshopId": 2721168249,
|
||||
"Title": "Auto Drop Bedding",
|
||||
"Description": "Put out a bedroll when you make camp, if you have one. Also adds the option to lay out bedding to the campfire menu.",
|
||||
"Tags": "Script,UX",
|
||||
"Visibility": "2",
|
||||
"ImagePath": "preview.png"
|
||||
}
|
Loading…
Reference in a new issue