#TimberAPI

1 messages ยท Page 7 of 1

stone shoal
#

In that case it doesn't need to be instantiated

spring radish
stone shoal
#

Well yeah that works, but that kinda ugly ๐Ÿ™‚

spring radish
#

but yea a "base class" (or interface) that defines public static T Default (or public static T GetDefault() may work)

#

maybe?

    interface WithDefault<T> {
        public static T Default;
    };

    public record BuilderPriorityToolSpec : ComponentSpec, WithDefault<BuilderPriorityToolSpec>
{
}
#

and then constrain the type passed to GetSpecOrDefault to implement WithDefault<T>

stone shoal
#

Yeah just did that

#

the T is a bit unfortunate but already better

#

Then just have an extension method which will return the default prop if it extends my component otherwise throw error.

#

Downside, you can't do it with anything that doesn't have the abstract class

spring radish
#

that should have failed to compile,

#

Foo doesn't define DefaultValue, it defines Value

stone shoal
#

oh

#

kek

#

what

#

Ohh

#

Forgot to default defaulty

spring radish
#

ohhhhh, Default is the "zero" value gotcha,

#

that's neater

stone shoal
#

I think I "fixed" all toolspecs wrong

spring radish
#

but then is Bar<T> even needed,

#

couldn't you just call new T() if the spec is missing?

#

(except for caching the singleton)

stone shoal
spring radish
#

yea

stone shoal
#

The downside, you need to have this extended version

spring radish
#

You could hide the instantiated defaults in a cache,

#

a bit ugly though

stone shoal
#

But maybe that's a plusside as well shrug. So you only retrieve defaulted specs when a developer wants it to be that way

spring radish
#

do you care about making the Default readonly?

stone shoal
#

How you mean ?

spring radish
#

in the fiddle, I can change the value of Test with Foo.Default.Test = 2;

stone shoal
#

Oh yea, that I don't want ๐Ÿ˜›

#

It's not a default if it's changable ThinkingIT

spring radish
#

yea

#

there's also a readonly record struct

stone shoal
spring radish
#

but it can't inherit

stone shoal
#

I think this is fine, at least for the first version

spring radish
#

ahh public int Test {get; } = 4; fixes that

stone shoal
spring radish
#

If you add {get; } or {get; init; } then the value is readonly

stone shoal
#

Yeah

spring radish
#

but then I guess it's readonly for the regular record too,

#

which is maybe okay,

stone shoal
#

It is

spring radish
#

because most (all?) existing specs have {get; init; } on their fields

stone shoal
#

all

#

specs should not change after cached

#

At least, for their code PandaDevil

#

Anyway, fixed the generated specs, I think

#

Still not ingame something about missing required Type for ToolGroupSpec. shrug

#

But no more complains from the SpecService

spring radish
#

That's logged by SpecTypeCache.GetType

#

I wonder when SpecTypeCache.Create is called

#

oh, field default value in BlueprintDeserializer

#

yea, that's going to be called before mods are loaded

#

you could overwrite it in your modstarter

#

I don't think anything fancy needs to be done, just call Create again

stone shoal
#

Neet you don't have to do [Serialize(true, null)] anymore

#

Wait whut ThinkingIT

#

If you use sourceName, you need both

#

I expected it to be just a name difference

stone shoal
#

One of the latest exception. Probably:

[Error  : Unity Log] InvalidCastException: Invalid cast from 'System.Int32' to 'Timberborn.SerializationSystem.ObjectSave'.
Stack trace:
System.Convert.DefaultToType (System.IConvertible value, System.Type targetType, System.IFormatProvider provider) (at <ed969b0e627d471da4848289f9c322df>:0)
System.Int32.System.IConvertible.ToType (System.Type type, System.IFormatProvider provider) (at <ed969b0e627d471da4848289f9c322df>:0)
System.Convert.ChangeType (System.Object value, System.Type conversionType, System.IFormatProvider provider) (at <ed969b0e627d471da4848289f9c322df>:0)
System.Convert.ChangeType (System.Object value, System.Type conversionType) (at <ed969b0e627d471da4848289f9c322df>:0)
Timberborn.SerializationSystem.PrimitiveTypeSerialization.Deserialize (System.Object value, System.Type type) (at <0aed9953773e4367a91cc8c16fd4e08d>:0)
Rethrow as ArgumentException: Exception while deserializing 0 to Timberborn.SerializationSystem.ObjectSave
Timberborn.SerializationSystem.PrimitiveTypeSerialization.Deserialize (System.Object value, System.Type type) (at <0aed9953773e4367a91cc8c16fd4e08d>:0)
Timberborn.SerializationSystem.ObjectSave.TryGet (System.String name, System.Type type, System.Object& value) (at <0aed9953773e4367a91cc8c16fd4e08d>:0)
Timberborn.SerializationSystem.ObjectSave.Get[T] (System.String name) (at <0aed9953773e4367a91cc8c16fd4e08d>:0)
#
Timberborn.BlueprintSystem.BasicDeserializer.DeserializeSingle (Timberborn.SerializationSystem.ObjectSave objectSave, System.Reflection.PropertyInfo serializedProperty) (at <45ba439b519648d3a2fd00386db8f8d6>:0)
Timberborn.BlueprintSystem.BasicDeserializer.GetValue (Timberborn.SerializationSystem.ObjectSave objectSave, System.Reflection.PropertyInfo serializedProperty) (at <45ba439b519648d3a2fd00386db8f8d6>:0)
Timberborn.BlueprintSystem.BasicDeserializer.Deserialize (Timberborn.SerializationSystem.ObjectSave objectSave, System.Type type) (at <45ba439b519648d3a2fd00386db8f8d6>:0)
Timberborn.BlueprintSystem.BlueprintDeserializer.DeserializeSpec (System.String specProperty, Timberborn.SerializationSystem.ObjectSave specObject) (at <45ba439b519648d3a2fd00386db8f8d6>:0)
Timberborn.BlueprintSystem.BlueprintDeserializer+<Deserialize>d__5.MoveNext () (at <45ba439b519648d3a2fd00386db8f8d6>:0)
Timberborn.BlueprintSystem.Blueprint.Create (System.Collections.Generic.IEnumerable`1[T] specs) (at <45ba439b519648d3a2fd00386db8f8d6>:0)
Timberborn.BlueprintSystem.SpecService+CachedBlueprint.get_Value () (at <45ba439b519648d3a2fd00386db8f8d6>:0)
Timberborn.BlueprintSystem.SpecService+<GetSpecs>d__9`1[T].MoveNext () (at <45ba439b519648d3a2fd00386db8f8d6>:0)
System.Linq.Enumerable.Count[TSource] (System.Collections.Generic.IEnumerable`1[T] source) (at <df4e462ab02c4b6493ccedf77f247b33>:0)
TimberApi.Tools.ToolSystem.ToolSpecService.Load () (at <bafac25fee814d9185c941259a8e075a>:0)
(wrapper dynamic-method) Timberborn.SingletonSystem.SingletonLifecycleService.DMD<Timberborn.SingletonSystem.SingletonLifecycleService::LoadSingletons>(Timberborn.SingletonSystem.SingletonLifecycleService)
(wrapper dynamic-method) Timberborn.SingletonSystem.SingletonLifecycleService.DMD<Timberborn.SingletonSystem.SingletonLifecycleService::LoadAll>(Timberborn.SingletonSystem.SingletonLifecycleService)
Timberborn.SingletonSystem.SingletonLifecycleUnityAdapter.Start () (at <4d4c9d6b82054
stone shoal
#

Why is my immutable array like

#

not there

#

@quiet delta I think this is a bug.

[Serialize(true)]
public string[] Scenes { get; init; } = new string[] { "Game" };
#

It seems to become null, and not my default one. Also tried with immutableArray, same problem.

#

Anyway, I have all Tools running except prioritizing tools. IDK, idc for now

#

Error on the ToolGroupSpec. But that's probably fixed fast with the fix of this morning

spring radish
#

sounds like nice progress

stone shoal
#

So many errors lmao

spring radish
#

There were ~1k, so any less than that is a win

#

although most of those are from warning about duplicate dlls that I can't figure out and don't seem to actually be causing any issue

stone shoal
#

You can't call T.Default on generic item even though you say it should be of that class type

#

Is implemented in .net 7 though...

#

So would need to resort in reflections and I think just creating a new one than is as fast ThinkingIT

spring radish
#

you'd have to define a new abstract class with two generics,

stone shoal
#
public abstract record OptionalComponentSpec<T> : ComponentSpec where T : new()
{
    public static T Default { get; } = new T();
}
#
    public static T GetSpecOrDefault<T>(this Blueprint blueprint) where T : OptionalComponentSpec<T>, new()
    {
        var result = blueprint.GetSpec<T>();

        if (result != null)
        {
            return result;
        }

        T.Default <-- not working
    }
spring radish
#

what about:

#
public abstract record OptionalComponentSpec<S, T> : ComponentSpec where T : new()
{
    public static T<S> Default { get; } = new T<S>();
}
#

or something like that

stone shoal
#

how would that change something ?

#

I can't get the method/prop Default when using generics

#

But gotta eat, probably just going for a static dictionary, that caches the requested types. And clears it in unload.

spring radish
#

isn't that code missing a final return?

stone shoal
#

Yeah it was just for showing what cannot be done

spring radish
#

Cannot do non-virtual member lookup in 'T' because it is a type parameter, blegh

stone shoal
#

T.StaticProp is a .net 7 feature

spring radish
#

and (new T()).Default doesn't seem to work either

#

cannot be accessed with an instance reference; qualify it with a type name instead

stone shoal
#

Well if you do new T. You already have it so it would not require a default prop anymore

spring radish
#

yea

stone shoal
#

Ill just to for the ugly way. And make a static list

#

Hopefully it never breaks HappyFT

spring radish
#
return (T)typeof(T).GetProperty("Default", BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy).GetValue(null);
#

๐Ÿคฎ

stone shoal
#

Yeah defests the speed of the static. But its still same instance across which would be good

spring radish
#

yea, and if you're going to cache the PropertyInfo, then might as well just cache the default instance

stone shoal
#

A FROZEN dictionary

#

Nice

#

C# has way to many kinds of lists

spring radish
#

only if you know the items at construction time, (which in this case is easy)

stone shoal
#

what

stone shoal
#
Debug.LogWarning(toolGroupExtensionSpec.Layout);
Debug.LogWarning(new ToolGroupExtensionSpec().Layout);

First log is null, second gives a value

#

The return of the first is return new T();

#

I hitnk

#

ThinkingIT Why am I ordering on a layout

#

Okay so I guess setting a default value after the getter and setter does not work.

#

Don't know for sure, since it's not a clean test area

stone shoal
#

I think something is missing

stone shoal
#

I tried

#

I need to think this over

#

Blueprints have more limitations for customizability compared the old specs which breaks the bottombar

spring radish
#

and they're all from TimberApi.DebugTool.csproj

#

ignoring all of those, there's only 6 warnings, and 11 errors when trying to build the solution,

#

0.7.9.1 has everything I need though, so all good ๐Ÿ‘

quiet delta
stone shoal
median plinth
#

Oh sweet TimberAPI is fixed HappyFT Noticed it because the people started asking about updates in my steam mods lmao

stone shoal
#

The most user required feature is not implemented ๐Ÿ˜›

primal wind
vast otter
#

Ya exacly bottombar is not yet fixed so its base game atm

vast otter
#

Ps take it easy @stone shoal its fine๐Ÿ™‚ i atleast has alot of work to do anyway๐Ÿ˜›

worn apex
#

I have an issue with the UIBuilder. As you can see, the bars are offset on the GameMinMaxSlider. Can you reproduce?
currently creating it like that:

            visualElementBuilder.AddComponent(UIBuilder.Create<GameMinMaxSlider>()
                .Small()
                .SetName("in_stock")
                .SetLocKey("Ximsa.EmploymentAutomation.None")
                .SetLowLimit(0)
                .SetHighLimit(1)
                .Build());
stone shoal
#

Are you on U7 or U6

worn apex
#

both actually ๐Ÿ˜… but i won't be sad if it isnt fixed for u6

stone shoal
#

I might take a look in the weekend

primal wind
#

Is it possible to add some property like tapi_deferto to the component instead and just assign it a new default component to fob off everything to?

#

maybe that will get round the inability to use T.Default?

#

or maybe it's like c++ where you gotta use friend or something prior to your callback's header?

#

or maybe you just gotta return null/nil/whatever to indicate to try the next function?

stone shoal
#

That problem is annoying but it is actually mostly only a problem due an earlier problem:
#1064983064020799498 message

But even if that's fixed this is an even bigger issue which is atm just a hard limitation (haven't tried with constructor so might try that)
#1064983064020799498 message

primal wind
#

ah, the old inheritance gotcha. The bane of flexible programming

stone shoal
#

Because I could just say. Don't use the type as the name of the file you are looking for. Here is a string the the specification I want to have and give the deserializer to convert it.

primal wind
#

Hmm, how about something like: { "TapiToolGroupSpec": { "ToolGroupSpec": { ... }, ... }? You could fob off the ToolGroupSpec to the original initially then apply the extras afterwords. By making it a subspec you prevent the spec handler from not passing you the info/object you need

stone shoal
#

No don't think so. This way you still cannot reuse the existing files of the ToolGroupSpec.
I am going to solve this problem with just generating my own TimberApiToolGroupSpec with all data I need. And then use the spec generator to generate them at runtime.

primal wind
#

I'm assuming the reason you didn't just go with "ToolGroupSpec" : {...}, "ToolGroupExtensionSpec" {...} is because the spec handler doesn't pass on previous spec's object or something?

stone shoal
#

Problem is I need to have the extension spec in all other specs to retrieve them with GetSpec. Therefore was the .Default workaround. And it did work. but still not quite handy

#

So I got everything to work that way, but <#1064983064020799498 message> made it hard to continue

primal wind
#

Well if you do it the TapiSpec: { TBSpec: {} } way you can get that default group state to pass on.. I assume

stone shoal
#

as in files

#

The one Timberborn has created to be a ToolGroup

#

Not the reuse of the code

primal wind
#

well either way if tapi is the one launching the spec handler for the regular group then you can grab the object it passes back to reuse right?

stone shoal
#

there is no spec handler anymore

#

that's the problem FacePalmLotus

primal wind
#

What about on initialisation of tapi you just create a new Timberborn.ToolSystem.ToolGroupSpec object inside your TimberApiToolGroupSpec and then fob off the toolgroupspec subgroup to it before continuing to handle the rest?

stone shoal
#

New weekend

#

Will TimberApi be fixed !?

severe solar
#

๐Ÿคž

stone shoal
brisk ether
#

Default dark mode? chefs kiss

stone shoal
brisk ether
#

I never touched it in this phone before so idk

#

But anyway, the site looks nice thanks for doing this

stone shoal
#

@quiet delta Comming back at the default values for optional props. I read this method

    [OriginalAttributes(MethodAttributes.Private)]
    public static object GetDefault(PropertyInfo serializedProperty)
    {
      string name = serializedProperty.Name;
      Type propertyType = serializedProperty.PropertyType;
      if (!serializedProperty.GetCustomAttribute<SerializeAttribute>().IsOptional)
        throw new ArgumentException("Missing required specification field: " + name, name);
      return !propertyType.IsValueType ? (object) null : Activator.CreateInstance(propertyType);
    }

Maybe I am just wrong but it actually already should have given back the default but just is not yet working, or was it not yet tried to implement?

spring radish
#

for ValueTypes only though?

calm copper
#

@stone shoal Is v0.7.9.1 supposed to run with u7? Or is it "the partially compatible" version?

spring radish
#

It's supposed to work with U7, but it's only partially there,

#

The U7 compatible bits are present, the incompatible bits are missing,

calm copper
#

Ok, then, I'll live with my local solution for now. The only thing I needed from TAPI was dependency container.

quiet delta
#

But the c# default, so 0 for numbers etc

spring radish
#

yea, that's what the function is being asked to do -- return the default of the properties type

#

if you want support for non-"type-default" values, then SerializeAttribute would need to gain a way to specify the default value you want

#

facinating, ILSpy and AssetRipper decompile the same method slightly differently:

    private static object GetDefault(PropertyInfo serializedProperty)
    {
      string name = serializedProperty.Name;
      Type propertyType = serializedProperty.PropertyType;
      if (serializedProperty.GetCustomAttribute<SerializeAttribute>().IsOptional)
      {
        if (!propertyType.IsValueType)
        {
          return null;
        }
        return Activator.CreateInstance(propertyType);
      }
      throw new ArgumentException("Missing required specification field: " + name, name);
    }
stone shoal
#

Oh found it

#

Dependency container should exist

calm copper
#

However, I saw some "test" error messages in the logs.

stone shoal
calm copper
#

But I can try to replay it.

#

They don't seem the real errors, though.

stone shoal
#

Yeah they are logs

#

Foe when the scene changed in the scene manager

#

Which now is the context manager

calm copper
#

For me, if anything is "red" - it's the problem ๐Ÿ™‚ It's why I was so fast to come back and asking if the mod is compatible.

#

My "traces" are always "yellow" (warnings).

stone shoal
stone shoal
#

@vast otter have you ever been able to set the position of a group ThinkingIT

#

It should be right

vast otter
#

You mean the order right then yes

stone shoal
#

Yeah

vast otter
#

Both a tool group and a existing tool

stone shoal
#

There is like no usage of the Order... like how as well as devmode doesn't work

vast otter
#

Not sure 100% sure what you mean?

No usage of being able to tell the order of sub groups and main groups?

like i add decoration cubes in the middle and tunnels i want at the end๐Ÿค”

stone shoal
#

As far I can usee the Order in a toolgroup is not used. But might be looking in wrong place

vast otter
#

Its used i am able to place decoration in the middle ๐Ÿค”

stone shoal
#

Alright

#

ThinkingIT something goes wrong when I generate 2 specs of the same

#

yeah okay that's a bug, was always there just never had to use it before.

#

Won't be too much problem for now

#

I see, it's not used from the class which is just there for information if someone wanted to know it.

#

Order is done by the spec directly

stone shoal
#

@vast otter and idk who else used the ToolSystem. Should be working now.
Usage info:

Want to change a ToolGroupSpec?

Use the following, it's inside ToolGroups folder, File name = TimberApiToolGroup.[name_of_group].json

{
  "TimberApiToolGroupSpec": {
      Id
      Order
      NameLocKey
      Icon
      FallbackGroup
      Type
      GroupId
      Layout 
      Section
      DevMode
      Hidden
  }
}

Most things are not required , if it's an existing ToolGroup. You can only use the parts you want to change like with any other spec.

!! Modifying toolgroups with the ToolGroupSpec might lead to things not working.
You should be able to make a normal ToolGroupSpec, but having 2 files with same ToolGroup isn't recommended at this point.

ToolGroupSpec

ToolGroupInformation has been removed, use the GetSpec<> to retrieve alternate information for your group information.

ToolSpec

  • ToolSpecification is changed to ToolSpec.
  • BaseToolFactory has been removed, not more needed due blueprint mechanic IToolFactory needs to be used for everything now.
  • ToolInformation has been removed, use the GetSpec<> on toolSpec for retrieve alternate information for your tool.
  • Generated specs are located in Tools, with following name scheme Tool.[PrefabName].json
  • If you want to change the bottombar section (spaces in between) you need to add a BottomBarSpec to the blueprint, with a property Section which is a number.

Spec:

{
  "ToolSpec": {
    Id
    GroupId // Optional, null
    Scenes // Optional, ["Game"]
    Section // Optional, "BottomBar"
    Type
    Layout // optional, "Default"
    Order
    Icon
    NameLocKey
    DescriptionLocKey
    Hidden// optional, false
    DevMode // optional, false
  }
}
#

Known problems

  • It logs a few missing keys in dictionary (localization), don't know where they comming from atm.
  • ToolGroupSpec should not be used to modify existing toolgroups.
  • SpecGeneration can't have multiple same specs, was already a bug since creation just wasn't done before.
#

If anyone is able to test it a bit out before I upload it ๐Ÿ™‚

young tendon
#

Unluckily donโ€˜t have much spare time at the moment, but Iโ€˜ll give it a go as soon as I can!

vast otter
#

me 2 maybe @quasi igloo , @austere tangle, @lofty lark or @primal wind is interested and give it a go

acoustic eagle
#

With only Harmony and TimberApi in the mods folder, version 0.7.10.0 crashes for me loading in existing saves and starting a new game.

quasi igloo
#

Looks like he forgot to include a blank definition for Timberborn.ToolSystem.ToolButtonService.GetToolButton[TTool]

#

That's the problem with the new blueprint system.
You MUST have at least 1 entry for it. Which means if you're making an API like this, you have to include a blank example for every blueprint spec.

#

maybe, either way, there's an empty array there.

stone shoal
#

But it's about the tutorial stuff maybe I had other faction

vast otter
stone shoal
#

ThinkingIT Weird, it doesn't crash on my existing folktails but does If I start a new one

vast otter
#

Ironteeth works (or is it secound launch?)

stone shoal
#

Maybe it's possible to skip the tutorial nowadays in a save and it will skip that part of the code ThinkingIT

quasi igloo
#

which one of these things is it that lets me move things from 1 group to another, ToolSpec?

primal wind
quasi igloo
#

Loaded all 3 faction savegames (3rd being Emberpelts), and started a Folktails, no crashes.

stone shoal
#

Everything is the same as before, except for the ToolInformation

quasi igloo
#

what am I doing... I'm doing it all wrong.

stone shoal
quasi igloo
#

So I need to not do that, but make new things

stone shoal
#

Not sure if I follow

#

I think you only need to do what you did with other specs is, Change name, and add a wrapper around the existing json with the current spec name

quasi igloo
#

It's entirely a me problem.

#

Since I want to do something different than I did in U6

#

Though, I'm going to end up with an issue where my mod moves the things, but then more groups also moves the same things. Is there a way to account for that?

primal wind
#

@vast otter this about right for the paths2 subgroup? getting a crash while trying the tool spec and this was the 1st issue I found, "subgroup_paths2 not found"

vast otter
primal wind
#

Well I assume this is a result of one of your mods referencing a group it expects tapi to create with one of it's own tool specs but I saw no sign of the blueprint. I forgot which mod actually uses that group to begin with but I remember you mentioning that one of your mods just that for the time being while tapi was working on toolspec. I just copied the staircase group and edited every mention of staircase in the group to paths2

vast otter
#

but do you have staircase active else the asset will not be found for the icon

primal wind
#

yeah I have it, had it the moment the mod manager realised it should be updated

#

and yes I do have it enabled XD

vast otter
#

no idea then and have other things to focus on

primal wind
#

well which mod was supposed to use the group so I know where to look for it

vast otter
primal wind
#

oh, I assumed you just encased everything in the assumed specname to have at least half support for it when it's implemented

vast otter
#

but the souce #1064983064020799498 message tell you to use TimberApiToolGroupSpec for TAPI

primal wind
#

well starting with the original toolgroups and fixing them after I finish fixing the tool specs, at least TB recognises the originals without issue

#

or is it that tapi is only looking at it's custom ones, not the native ones?

#

if so that's a pain but at least fixable

stone shoal
#

If it's a **new **ToolGroup, you can make it like a normal one if you want to. If it's a modification to a ToolGroup you should use the TimberApiToolGroup

primal wind
#

Also besides a rando crash from steam side 1st time I tried, the 2nd try (no edits) worked just fine

#

And just for clarity

#

hadn't even finished fixing the tool spec files XD

#

still gotta try the building spec next. I'll finish with tool spec file fixes 1st then see if my bentos are being loaded

stone shoal
primal wind
#

darn :|

stone shoal
#

Might be hard to fix even

primal wind
#

mega darn :|

stone shoal
#

I can't set these spec files....

#

because of the init;. And doesn't publicize it for some reason

vast otter
#

๐Ÿ˜ฎ

primal wind
#

Then just go with "TimberApiBuildingSpec", I'll adapt

stone shoal
#

Thats not really the problem

#

They use the spec to set the values which I cannot change anymore

#

before it was a on a scriptable object with just a normal prop

#

Serialized field

primal wind
#

Oh, you mean you had to replace the bottombar altogether?

stone shoal
#

what ?

#

Bottombar has nothing to do with the building spec ThinkingIT

primal wind
#

Is that not what you meant?

stone shoal
#

The feature that you can change recipes etc is broken because I cannot set the new values

primal wind
#

recipes can still be changed normally, it's just the list that's the issue

#

if you can just figure out how to access the RecipeListSpec component or whatever it was called (I think it was that) then should be able to edit the spec

stone shoal
#

I was just looking at the wrong BuildingSpec, looked at my own

primal wind
#

face palm moment? I do it all the time XD

stone shoal
#

Just being tired the last 5 moths (4 years up down)

#

Anyway, will check it out next weekend

primal wind
#

fair enough, as long as you have a lead now :)

stone shoal
#

Don't think it would be too hard

primal wind
#

g2n, for now I'm happy to have my groups back :D

stone shoal
#

If I have some feedback that the Bottombar is working everything should be fixed next weekend probably

primal wind
#

yeah just finishing off the tool spec fixes then I'll post to moregroups channel (if there's one), may end up having to stop midway to attend gospel though

primal wind
#

welp there DOES appear to be an issue, mighta shown in previous screenshot but I didn't notice until this try when I had finished fixing the tool spec files. It seems the "GroupId" of the groups is not being honoured well. I had my tanks group out in the open while the warehouse and pile groups were in the storage group like they were supposed to be. the dynamites was likewise out in the open instead of being in the landscaping group. Not sure if it's tapi or just the way I had set the groups. I'll upload a zip of my copy of more groups now then get ready for gospel

stone shoal
#

Why do you have the same group twice ?

#

One as ToolGroup and one as TimberApiToolGroup

quasi igloo
#

I'm just thinking how to have maximum compatability with More Groups as possible, and the only way of doing that I can think of is basically just to define the same thing they do, again.

but that means that you end up with 2 identicle TimberApiToolGroup definitions.

#

The alternative is to do an IF this group exists, move it, but nothing about Timberborn is really built that way.

vast otter
#

why not add those file to more group so if its installed it moves them ThinkingIT

quasi igloo
#

I don't mind doing that, but I also need a default that doesn't completely destroy the paths group.

vast otter
#

ya ThinkingIT

quasi igloo
#

ja

#

I'm not sure the best way of doing things.

primal wind
#

Nope, no change :|

stone shoal
#

hmm

primal wind
stone shoal
#

But sometimes it works ?

primal wind
#

Not from my experience

stone shoal
#

An you just want to put a group in a group ?

primal wind
#

I just want the groups to go where they're declared to go in the spec files

acoustic eagle
#

Works fine for me. Pictures taken with an moregroups version converted from 2.2.4.

primal wind
#

It's great that the tools go where they're supposed to but strange that the tool groups don't go where they're supposed to despite being given the same property

#

weird

#

I'll take a look at my log

#

Nope, can't find the source issue. Did notice some things @vast otter should look at though, also noticed why my BotBats weren't even showing in the warehouse item lists

#

hmm, maybe it's an incompatibility with toolfinder? I'll try without, only installed it as a substitute for MG

primal wind
#

nope that wasn't it, had to fix an issue with my botbats mod before I could check that but done with that now. Was just missing an icon for the botbats. The one I scaled down for it was the power icon from the bottom bar. realised after that would be confusing with the gear icon so gonna change it for the science icon XD

#

not that the bats showed though :|

vast otter
primal wind
#

yeah that seems to work (was fixing more issues with my bot batteries mod, all I need now is to insert the recipe into the grease factory)

#

noticed an issue that has been overlooked so far, missing the priority group

#

it's in both of the recent screen shots, mine and juf's

young tendon
stone shoal
#

Guess it was the priority :)(

young tendon
# stone shoal Sounds great ๐Ÿ™‚

How is "Scenes" in the ToolSpec supposed to be used. That "Game" is default is fine for me. I just considered adding the optional ones, and I can't get Scene to work quickly.

"Scenes": ["Game"],
"Scenes": [Game],
"Scenes": "Game",

stone shoal
#

its an array

#

But game is the only scene it works so,....

young tendon
# stone shoal its an array

I assumed as much due to the [ ]. But an array can have a single entry...?
But what you're essentially saying is that it isn't supported yet?

stone shoal
#

And single entry still require array format

young tendon
# stone shoal Yes

Good enough for me. The reason for asking was mainly to ensure it wasn't a bug. ๐Ÿ˜‰

stone shoal
#

@quiet delta Bluerpint is now a lazy list does that mean I can just add to it at another time and should be fine ThinkingIT

#

And the IObjectSerializer hmmm will check that out in the weekend if I feel better

quiet delta
stone shoal
#

ThinkingIT wasn't it an immutableDictionary before ?

#

Well at least the _cacheedBlueprints

#

The rest I am not quite sure of

quiet delta
#

it was something like Dictionary<Type, List<CachedBlueprint>> so we basically simplified CachedBlueprint into Lazy<Blueprint>

#

and also there is the IBlueprintModifierProvider interface now, which may help you with dynamic blueprint overwriting

stone shoal
#

Maybe I just completely overlooked that one than ThinkingIT. That would mean I could just added to it with my generator later on all along

quiet delta
stone shoal
#

Ill split the UIBuilder from TimberApi for now. So that one can work standalone, and do the rest another time ๐Ÿ™‚

#

Thanks for the info, i'm sure I could do it myself normally. But I'm not sure if I could have updated without all the help so far!

quiet delta
#

no worries

dim marten
#

Hello today's experimental patch crashes this

stone shoal
cinder fern
#

Ironic that the message above that was from a Dev saying "No worries"

solemn walrus
#

In Goodfellas, the next scene they burn down the restaurant from the laughing scene

spring radish
#

I'm wondering if I should bother to update the Steam Update Buttons manifest

primal wind
stone shoal
#

Since it probably does not require any updates besides presets. Which even if i wasnt updating it anyone could remake it

#

And it also does not require harmony so thats a plus

solemn walrus
#

I tried to fix this last night and searched Timber APT, talked my way into the DMs of someone named ROSร‰ who said she'd get right on it, also that I'm an idiot...got a good feeling

stone shoal
solemn walrus
#

its a joke, there is a song APT by ROSร‰, I'm playing the comedic role of the idiot who misspelled API

stone shoal
#

I see

full acorn
#

@stone shoal would you be open to me making a pipeline to fetch updated DLLs for TimberAPI and hosting them on GitHub so I can install them as a package in Unity?

#

Then Ideally someone could add the mod as a package in Unity and then it's just always updated

stone shoal
#

Because the stuff of emka isn't a dll either ?

full acorn
#

Yeah Mod Settigns isn't hosted as DLLs on GitHub yet, though harmony is

#

I was looking into how to subscribe to the mod update webhook on mod.io and then I could make an automation to fetch the files and update a github repo

#

@vast otter What was it you used for that discord server?

vast otter
#

ps is in the comment for each bot channel the url to the bot used on my server ๐Ÿ˜‰

full acorn
#

Ah, yep, there it is KEKW

full acorn
#

aw damnit it's written in rust

#

why can't everything be written in C#, sad noises

stone shoal
#

What is C#

vast otter
#

Is there not a api for c# / unity?

#

Or was it only for games ๐Ÿค”

full acorn
#

There is aye, but I was hoping I could just YOINK the code to figure out what it's doing

vast otter
#

Wait @severe solar your old plugin for thunderkit could that be of use?

solemn walrus
#

so, how'd things go today with regard to updating?

primal wind
quasi igloo
#

Other than Iron Oxide.

full acorn
quasi igloo
#

For charging.

#

On portable devices, like phones.

full acorn
#

But then you have USB 2 over type C, Type C low speed, high speed, PD, etc

stone shoal
#

@quiet delta Do you have an example of a enum used in a spec ?

#
public record BuilderPriorityToolSpec : ComponentSpec
{
    [Serialize]
    public Priority Priority { get; init; }
}
#

Seems like mine is crashing

ebon sparrow
#

GoodSpec has VisibleContainer

stone shoal
#

hhmm

#

[Serializable] this should fix it probably, but the enum is a timberborn enum so can't really change that

ebon sparrow
#

I'm 99% sure it is not that - we don't care about that attribute in our system

#

it is for Unity, so it can be used in prefabs

stone shoal
#

Ah I see

#

Timberborn.SerializationSystem.PrimitiveTypeSerialization.DeserializeEnum (System.Object value, System.Type type) (at <256ed191de6344a691466c98964a1715>:0)
Timberborn.SerializationSystem.PrimitiveTypeSerialization.Deserialize (System.Object value, System.Type type) (at <256ed191de6344a691466c98964a1715>:0)

#

Well almost done with the test can at least test it I suppose

ebon sparrow
#

yep, I removed Serializable from VisibleContainer, since it is not needed leftover - and everything starts just fine

stone shoal
#

yeah didn't work ๐Ÿ™‚

brisk ether
stone shoal
#

Funny

#

I created another spec with the same name even without knowing

#

BuilderPriorityToolSpec

#

Didn't crash with same class error as before ThinkingIT maybe something changed

#

Altough something doesnt work either way

stone shoal
#

Its fixed as far i csn do right now

#

All important stuff is working. In a not clean way swagyes

vast otter
#

Same format as alpha version?

stone shoal
primal wind
vast otter
#

ThinkingIT you both disable and update EntityLinkerSystem? ๐Ÿ˜›

#

ps do tell if you want access to the server thats generating posts for mod updates

stone shoal
#

No thanks ๐Ÿ™‚

vast otter
#

time to debug some mods and work on more groups ๐Ÿ™‚

stone shoal
#

Some people on steam say it does not work

#

But I cannot start the game anymore, becaues it's not downloading the mod

vast otter
#

try unsub and sub or verify game files

stone shoal
#

It's stuck on validating

#

It won't download anything

#

Steam kinda works wonky on my pc for some reason

#

Just in general

vast otter
#

๐Ÿ˜ฎ

vast otter
#

even if i can fix this as i want to support timberapi i think it can be a problem for other mods ThinkingIT

stone shoal
vast otter
#

ThinkingIT and here i had them in the folder Toolgroup ๐Ÿ˜ฎ but if i created TimberApiToolGroupSpec files with the same content it works in the same folder

#

but have released a "hotfix"

#

but will do a test if renamed the folder if they work

neat burrow
#

i have v0.7.11.0 updated. timber api loaded alone will allow the game to load. simple flood gate triggers (v7.0.0) or steam update button (v0.1.2) checked off causes a crash. do we know if its timber or the mods causing the crash, or do you need logs?

vast otter
#

Its split of to seperate mod and not all mods has updated req

neat burrow
#

do i run both timber builder and api?

stone shoal
neat burrow
#

ok, i'll try

spring radish
#

Did the "dynamic" properties feature make it into the release? I know it has been shown off a bit, I was wondering if it was available or not.

stone shoal
#

You mean the @mod stuff?

spring radish
#

yea

#

With respect to a request (#1264533154983710800 message) to not move the staircase into a group on its own.

#

I was wondering if there was an easy way to only move it into a group if other mods that installed things into the Staircase subgroup.

#

I guess the easiest would be to put the "set subgroup of stairs" to the various mods that install additional staircases (and remove it from More Groups)

#

Assuming that multiple mods installing the same override would be compatible.

vast otter
#

so if more group is installed move them to its folder? ThinkingIT

spring radish
#

The alternate would be to conditionally move the stairs if a mod (or mods) are installed,

#

initially I thought to make it conditional in More Groups (based on other mods installed),

#

but yea, putting it in other mods (conditional on More Groups) would probably be better.

vast otter
spring radish
#

The most complex way (and simplest for mod authors) would be for Timber API to "collapse" subgroups if they only have a single item.

#

or maybe it's an adjustable setting, because I could imagine someone asking that subgroups with 2 items should also be collapsed -- it depends on how much space you have on your screen

stone shoal
#

Why just with 1, why are 2 allowed ?

spring radish
#

player preferance,

stone shoal
#

Even harder to make xD, and the mod owner groups it so shrug

#

Automatic flattening doesn't seem like a good option imo

stone shoal
spring radish
#

yea

stone shoal
#

I think ThinkingIT

spring radish
#

Is that only if the value is different?

vast otter
stone shoal
#

Ah

#

Your naming is wrong

vast otter
#

??

stone shoal
#

TimberApiToolGroupSpec -> TimberApiToolGroup in the file name

vast otter
#

i see

stone shoal
#

The normal ones are tranfered to those and how you did it. It just created 2 toolgroups

vast otter
#

yepp that was the problem ๐Ÿ‘

spring radish
#

ToolGroupSpec doesn't have a GroupId field, should it even be included?

spring radish
#

shouldn't it be on TimberApiToolGroupSpec only?

stone shoal
#

It does nothing in that matter so shrug

#

It won't hurt

#

Until you think it should do something

#

Maybe later on I can fix some things and have the workings like before so it can be reused

vast otter
spring radish
#

it'll cause warnings to be printed into the Player.log won't it?

vast otter
#

hmm could be ya

#

will have to test it later

spring radish
#

I was also thinking that if the "automatic" conversion of ToolGroupSpec to TimberApiToolGroupSpec was hard to get working (but I think you fixed it now right?) then you could just convert them offline and include the new specs with the mod.

#

it would mean having to manually update them when the game introduces new specs. Mod authors would also have to provide both (but they'll need to do that anyways if they want TimberAPI to be an optional dep)

stone shoal
#

And @spring radish i could check in weekend maybe for that feature. It was implemented but not sure how far

spring radish
#

yea, no rush. I have nowhere I can think of where it would be used.

#

except as a workaround for this "only one item in a subgroup" issue

brisk ether
#

Sorry if I sparked a headache for you all

spring radish
#

which is easy to work around by just deleting the spec for that tool

calm copper
#

@stone shoal Yo! Just to clarify. The specification system is no more. And so far, there is no ETA to have a working replacement.

I'm not going to ask a dumb question "when will we have the working version!!!". Just need to understand how to shift my priorities in terms of the mods updates ("Automation" is on a hard block for the TAPI tools system).

stone shoal
#

What does not work?

#

What has tapi to do with specification system?

#

And the tool system is already been implemented with last update

calm copper
#

Pardon me, but it sounds like the thing I need is not working.

stone shoal
stone shoal
# calm copper

Specifications have always been a Timberborn feature.

Pre update 6. TimberApi made it possible to make you load them with just files.

After update 6 its done by Timberborn itself.

Update 7 is now called blueprints.

calm copper
#

๐Ÿ‘ Will check it.

#

Yesterday, I didn't see it. For the record ๐Ÿคฃ

stone shoal
#

You checked at the wrong place

#

Newest verion isnt stated at "other version"

#

Unless a newer version isnt the active version...

calm copper
#

My "yesterday" was 02/26. I would not say for the rest of the world.

stone shoal
#

Its here now 28e

calm copper
stone shoal
#

Was uploaded like 24 hours ago or something like that at least

#

Netherlands

#

Europe

calm copper
#

California. 02/28 started 3 hours ago.

stone shoal
#

Im youe future

#

But somewhere in the chat here is talked how the new toolspec works

#

I created a whole info thingy when giving the pre release few days ago.

calm copper
#

I will do tests with 7.11.

stone shoal
#

Oki

#

Emka or knatte can help you with blueprint stuff in general

#

I csn help if its specific to TimberApi blueprint otherwise i dont have the mental cpacity

calm copper
#

Anyway, I have ILSpy and Harmony ๐Ÿคฃ

stone shoal
#

Not sure if he already set it live

primal wind
#

do you have any ideas for getting the building blueprint system to work? if not you could create new objects that you have control over to replace the originals, in which case I would start by making a function that takes the original and copies over all properties to a new object. You could then fob off duplication duties to that as and when you encounter a buildings blueprint

#

If you need to change the name of the resulting object you could silently recognise the tool blueprints for the originals as being for the new copies too. Could do a try { get("tapi_" + tool.name) } else { get(tool.name) } in tool blueprint implementation

solemn walrus
#

I'm sorry to interrupt any work being done, but if all the mods I'm using are updated (TAPI, More Groups, Bob's Platforms) and the game crashes still when I load a map from last week, is it that the save will never work again due to the updates being so much different?

neat burrow
#

It's depends on what mods you were using and what's broken. Sometimes if you get the crash log and post it someone can look at it and see what happened. My crashes have been simple u6-u7 fixes or waiting on U7 updates. I haven't logged in to older builds since I know certain mods are broken so it won't load

spring radish
#

Request:

InvalidOperationException: Sequence contains more than one matching element
  at System.Linq.Enumerable.Single[TSource] (System.Collections.Generic.IEnumerable`1[T] source, System.Func`2[T,TResult] predicate) [0x0004a] in <41d1bd92f95542f4aa33290b7e44d57e>:0 
  at TimberApi.Tools.ToolSystem.Tools.PlaceableObject.PlaceableObjectToolFactory.Create (TimberApi.Tools.ToolSystem.ToolSpec toolSpec, Timberborn.ToolSystem.ToolGroup toolGroup) [0x0001e] in <226f21d0a2bf409595632106f280afb2>:0 
  at TimberApi.Tools.ToolSystem.ToolService.Load () [0x00064] in <226f21d0a2bf409595632106f280afb2>:0 

Please could PlaceableObjectToolFactory.Create catch the InvalidOperationException and add context if which PrefabName is being looked for. It would help significantly when debugging.

#

potentially it may be better to do in ToolService.Load

#

that way it doesn't need to be done in each and every factory

spring radish
#

Another request: For ToolSpec could you make Order a float/double/decimal type. It would make it easier to insert items between existing items that 1 order different

#

Mostly it's the new zipline and tubeway buildings in GreedyBuilders that are annoying me. Instead of Z1, Z2, Z3, T1, T2, T3, they're showing up as Z1, T1, Z2, T2, Z3, T3.

#

ohhh, that wouldn't actually be very hard to fix with the way it is atm,

#

their Orders are 40, 41, 42 and bridges only start at 50

#

So Tubeways could just be moved to say 45, 46, 47

#

@primal wind Could you override the Order for Tubeway buildings to make them appear after all the Zipline buildings?

#

I guess the only issue would be what's the order for mod buildings like tiny tubeway extra ziplines

#

I guess that's up to theapologist316 and Bobingabout

calm copper
#

I see the new ToolSpec doesn't have ToolInformation. What's the suggested way to pass a custom data now?

spring radish
#

Define your own extension?

#

some discussion back here, I don't know if the new style ended up being used or not

#

It looks like yes,

#

see example of how PlaceableObjectToolSpec is used

calm copper
#

Well, defining own spec is only a half of the task. The other half is loading the data from the specification file.

#

In IToolFactory.Create I only have the group and toll specs, and they don;t seem to have anything that would let me getting the file.

calm copper
#

Hmm, and the loading will happen behind the scene?

spring radish
#

I think the loading has already happened,

#

I think when the json file is deserialized all of it is consumed

#

ohhh, I see these specs are not loaded from json files,

#

try it anyway,

#

ohhh, SpecService.Load

#

different Specs in the same Blueprint are treated and completely separate?

#

and TAPI has a GeneratedSpec which works slightly differently

#

so maybe you can only do it via ISpecGenerator

#

and not via .json files

calm copper
#

Like, having two different files: one to define a tool and another to provide data for it?

spring radish
#

no, I don't think it matters if the Specs are in 2 blueprints, or 1, they're not loaded together

#

i.e. 2 blueprints each with 1 spec, or 1 blueprint with 2 specs, both result in two completely separately loaded specs.

calm copper
#

Hmm. The group doesn't get created.

{
  "TimberApiToolGroupSpec": {
  "Id": "AutomationToolGroupId",
  "Layout": "Blue",
  "Order": 10000,
  "Icon": "Sprites/IgorZ/automation-group",
  "NameLocKey": "IgorZ.Automation.ToolGroup.Main.DisplayName",
  "FallbackGroup": false,
  }
}

What do I do wrong?

spring radish
#

what's the filename?

#

TimberApiToolGroup.AutomationToolGroupId.json?

calm copper
#

TimberApiToolGroup.Subgroup_Automation.json

vast otter
calm copper
vast otter
#

Correct

#

Same with basegame

cinder fern
#

@vast otter with More Group, how are the 2nd group buttons work? Since the ToolGroupButton only defines List<ToolButton>? My mod wants to scan for all tools but I think I will miss them for those using MoreGroup.

vast otter
#

It uses timberapis rewrite of bottombar to allow creation of subgroups and move items with toolspecs

#

(all done with jsons and timberapi)

cinder fern
#

oh so it totally "disappears" the game's ToolGroupButton?

calm copper
#

Eventually, I managed to create a group and a tool programmatically. This is even better. For long time I was thinking about creating automation tools in runtime (you create a script, then you assign it to a tool), but never had enough courage to get into details of the tools creation.

cinder fern
#

I stopped before because I thought I needed Unity/Asset Bundle ๐Ÿ˜› turned out I could just leave the Sprites out

stone shoal
stone shoal
stone shoal
#

And now you csn use it for your custom data in a simpler way than before

calm copper
stone shoal
#

#1064983064020799498 message

calm copper
stone shoal
calm copper
#

"Create a spec". Hmm. How? ๐Ÿ™‚

#

Like design a class in C#?

spring radish
calm copper
#

Yeah, I saw this code. And I got lost at:

var genericToolSpec = toolSpec.GetSpec<GenericToolSpec>();

Looks like magic to me. How does it know what I need?!?! ๐Ÿคฃ

stone shoal
#

Although i thought you cannot have multiple same prefabs name anyway. Pretty sure would conflict

stone shoal
calm copper
#

Now, I figured out, I can add tools in runtime. Probably not the groups, but adding tools is already a big step. Dynamic tools is a feature that I need badly.

stone shoal
#

Why not the groups?

calm copper
# stone shoal Why not the groups?

I can add groups in runtime, but only during the configure stage. I need to add stuff during the game. I bet I can use Harmony to fix it, but for now I'm fine with adding only tools ๐Ÿ™‚

stone shoal
#

Ahh, okay goodluck

calm copper
primal wind
#

I might just make a separate mod that GreedyBuilders and MoreGroups can optionally depend on to correct the tool item order. I think I would do it so the order is added onto some form of the tool group's order and/or faction order multiplied by maybe 1000 to allow room for many tools

#

You know what I will make that mod, I'll call it "Re-order Vanilla Tools" with the id "ReorderVanillaTools", just so @vast otter is aware of what to add as an optional dependency I'll ping him :)

#

What would be nice is if the tool order become something like an IP address where it would be <faction>.<group>.<mod>.<tool>

cobalt flax
#

Just making sure you are aware that there is a crash when opening the map editor with TimberAPI (U7) enabled.

#

The only mods enabled when it happened were Harmony, TimberAPI, and KnatteMaterials. Disabling TimberAPI fixed the crash.

primal wind
#

oof

calm copper
#

Making the tools refactoring, I also stumbled upon the custom cursors. Now, they are specs too DamIT

#

I almost believed, I can get away from the specs ๐Ÿคฃ

calm copper
#

@stone shoal Do I understand it correctly that the tool groups at the second level and up, is the TAPI feature? Trying to add a group button to another group button... and cannot see how ๐Ÿ™‚

calm copper
#

@stone shoal I found something strange. I implement a class like this

sealed class AutomationButtons : IBottomBarElementProvider {
}

It's bound to Bindito. On the vanilla game, this component gets executed as expected and IBottomBarElementProvider.GetElement gets called. However, with TAPI, this component never had a call. Is this an intended behavior?

calm copper
#

Heh. I give up. I just cannot make this specs system working AngryFT

spring radish
calm copper
spring radish
#

yea

#

well, unless you hook into the bits that get auto-upgraded

calm copper
#

Now, I need to patch TAPI to make the tools in runtime kekw

#

Using Harmony to patch another mod is kind of a new level to me.

spring radish
#

that seems like a weird requirement,

#

It would be better to send a PR

calm copper
spring radish
#

just rebuild the code yourself?

#

hmm, it miight not have the very latest code,

calm copper
spring radish
#

yea, that's the link to the TAPI src

#

it's how I upgraded the Steam Update Buttons mod to the new UIBuilder code before it was released,

calm copper
#

I spent hours to figure out how to patch the stock game code and got almost working solution. Then, I enabled TAPI ๐Ÿคฃ

spring radish
#

heh

calm copper
#

Btw, I got a nasty issue with the publicizer:

  TestFactory.cs(36, 15): [CS0507] 'AutomationRuleSpec.EqualityContract': cannot change access modifiers when overriding 'public' inherited member 'ComponentSpec.EqualityContract'

I recall this issue was mentioned in this channel. Anyone knows how to fix it wihtout disabling publicizing?

spring radish
#

where/what is TestFactory?

calm copper
#

It's my own class. The actual error comes from this code:

public record AutomationRuleSpec : ComponentSpec {
  [Serialize]
  public string Condition { get; init; }
}
#

Due to the TAPI and stock code is publicized in my project, the inheritance works weird.

#

Publicizing of ComponentSpec makes the troubles.

spring radish
#

buuut Condition is a new field?

calm copper
spring radish
#

ohhh, because EqualityContract is something special?

calm copper
#

Tbh, I have no idea what is this "EqualityContract".

#

But I guess it's something about the records in C#

spring radish
#

it's normally defined as protected override

calm copper
#

The records are expected to handle the fields "magically". I'm not supposed to provuide any equality methods.

spring radish
#

yea, the method is implemeted by the compiler,

#

it's a "bug" in the publizer, it shouldn't be making that particular method public

calm copper
#

Any idea how to exclude a specific class from publicizing?

#

This is my project setup:

    <ItemGroup>
      <PackageReference Include="BepInEx.AssemblyPublicizer.MSBuild" Version="0.4.2" PrivateAssets="all" />
      <Reference Include="..\Dependencies\GameRoot\Timberborn_Data\Managed\Timberborn.*.dll" Publicize="true" />
      <Reference Include="..\Dependencies\GameRoot\Timberborn_Data\Managed\Unity*.dll" Publicize="false"/>
      <Reference Include="..\Dependencies\GameRoot\Timberborn_Data\Managed\Bindito.*.dll" Publicize="false"/>
      <Reference Include="..\Dependencies\GameRoot\Timberborn_Data\Managed\UnityEngine.UIElementsModule.dll" Publicize="true"/>
    </ItemGroup>
#

I wish there was a rule "exclude"

spring radish
#

Try version 0.4.3

calm copper
#

Lol. I just got it fixed.

#
    <ItemGroup>
      <PackageReference Include="BepInEx.AssemblyPublicizer.MSBuild" Version="0.4.2" PrivateAssets="all" />
      <Reference Include="..\Dependencies\GameRoot\Timberborn_Data\Managed\Timberborn.*.dll" Publicize="true" />
      <Reference Include="..\Dependencies\GameRoot\Timberborn_Data\Managed\Timberborn.BlueprintSystem.dll" Publicize="false" />
      <Reference Include="..\Dependencies\GameRoot\Timberborn_Data\Managed\Unity*.dll" Publicize="false"/>
      <Reference Include="..\Dependencies\GameRoot\Timberborn_Data\Managed\Bindito.*.dll" Publicize="false"/>
    </ItemGroup>

The order of the lines is important.

#

The last line overrides the previous lines setup. Not sure if this is an intended behavior, but it works.

spring radish
#

yea, because the bug was created by theapologist316

calm copper
spring radish
#

niiice

#

so I publized all the dll's from the Managed folder,

#

then Windows Defender got all angry about the System.ServiceModel.dll

#

and System.Windows.Forms.dll

#

because they "can launch a binary"

calm copper
#

At this point, I'm close to make my mod working with the specs, lol ๐Ÿคฃ

#

Or not.

#

Well, I still cannot get my custom data from the blueprint (used to be "specification"). The magic didn't work.

toolSpec.GetSpec<AutomationRuleSpec>()

Gives me NULL even though there is a relevant section:

    "AutomationRuleSpec": {
       "Condition": "loh!"
    }
spring radish
#

can you show the whole file

#

(off-topic, Firefly Blue Ghost is about to attempt landing on the moon, T-2minutes)

calm copper
#
{
  "ToolSpec": {
    "Id": "Automation.Tmpl.Terrain.2LevelsDynamite",
    "GroupId": "AutomationToolGroupId",
    "Type": "MySpec",
    "Order": 1,
    "Icon": "Sprites/BottomBar/IgorZ.Automation/tool-dynamite-x2",
    "NameLocKey": "IgorZ.Automation.Tool.tmpl.2LevelsDynamite.DisplayName",
    "DescriptionLocKey": "IgorZ.Automation.Tool.tmpl.XLevelsDynamite.Description",
    "AutomationRuleSpec": {
       "Condition": "loh!"
    }
  },
    "AutomationRuleSpec": {
       "Condition": "loh!"
    }
}

This is an experimental version. With teh section at below I get a default instance.

#

Not NULL, but still not what I'd like to have.

calm copper
stone shoal
#

What does the class look like of the spec

#

Aj

#

Ah

calm copper
#

Now, I think (may be falsely) that I understand the new system ๐Ÿ™‚

stone shoal
#

And yes the old way of generation of tools is disabled HappyFT

#

Only generic tools can be implemented in both tapi and normal

cinder fern
#

@vast otter hi not sure if this is TimberAPI or More Groups thing but I have this code to grab all available buttons, it works for the vanilla but with More Groups, things go missing. is it easy to add support for More Groups?

    void ScanAllButtons(Action<ToolGroupButton>? onGroupFound, Action<ToolButtonInfo>? onButtonFound)
    {
        foreach (var btn in toolButtons._rootButtons)
        {
            if (btn is ToolGroupButton grp)
            {
                onGroupFound?.Invoke(grp);
                if (onButtonFound is null) { continue; }

                ScanGroupButtons(grp, onButtonFound);
            }
            else if (btn is ToolButton toolBtn && onButtonFound is not null)
            {
                onButtonFound?.Invoke(new(null, toolBtn));
            }
        }
    }

    void ScanGroupButtons(ToolGroupButton grp, Action<ToolButtonInfo> onButtonFound)
    {
        foreach (var btn in grp._toolButtons)
        {
            onButtonFound.Invoke(new(grp, btn));
        }
    }
spring radish
#

It's going to be part of TimberAPI,

cinder fern
#

toolButtons is ToolButtonService toolButtons btw

spring radish
#

More Groups doesn't have any code

cinder fern
#

yeah in that case I need to know how I can scan all the buttons from the TimberApi interface I guess

spring radish
#

yea and then make it conditional based on if TAPI is detected as loaded or not,

#

(which you can just do with Type.GetType())

solemn walrus
#

@spring radish I did as you suggested and unloaded all mods and loaded just harmony and TAPI, it worked fine. Loading others in to see which causes the issue is a project for another weekend.

cinder fern
stone shoal
#

Otherwise I have also a service which extends that for tools or button i think

calm copper
#

@stone shoal It seems, the group button order behavior has changed. In my setup, I had order 1000 for the blue section. Assuming, I want to place my group button the last in the blue section. But now, I get this.

#

Check the very right image with "play" image. That's me.

cinder fern
#

which one should I be scanning instead?

stone shoal
calm copper
calm copper
#

The ordering should be countined with the section, not globally.

stone shoal
#

Section is not based on a min or max order

#

Look at the GitHub l. You need to add a BottomBarSe tionSpec

calm copper
# stone shoal What?

There are three sections. Blue, Green and "whatever". The position used to work within the section. Now, it's global.

stone shoal
#

I have no idea what you mean with that.

calm copper
#

I need to add my group button to the "blue" section at the end of it. How I do it now?

stone shoal
#

Look at the GitHub sadBlobRegor . Add a bottombarspec

#

To the file

#

BottomBarSpec
{
Section = 0,
}

calm copper
#

That's the stock logic.

stone shoal
#

So?

calm copper
#

Ibn the blueprints, it's "Layout": "Blue"

spring radish
#

๐Ÿ‘† like this (but in the blueprint json)

calm copper
stone shoal
spring radish
#

so something like:

{
  "TimberApiToolGroupSpec": {
    "Id": "AutomationToolGroupId",
    "Layout": "Blue",
    "Order": 10000,
    "Icon": "Sprites/BottomBar/IgorZ.Automation/automation-group",
    "NameLocKey": "IgorZ.Automation.ToolGroup.Main.DisplayName",
    "FallbackGroup": false,
  },
  "BottomBarSpec": {
    "Section": "0"
  }
}
calm copper
#

Let's start it from a new page. Where THIS group button will appear?

{
  "TimberApiToolGroupSpec": {
    "Id": "AutomationToolGroupId",
    "Layout": "Blue",
    "Order": 10000,
    "Icon": "Sprites/BottomBar/IgorZ.Automation/automation-group",
    "NameLocKey": "IgorZ.Automation.ToolGroup.Main.DisplayName",
    "FallbackGroup": false,
  }
}
stone shoal
#

...
Question: how do i add it in this section
Answer: you need to add this
Q: im not going to look DamIT

stone shoal
calm copper
stone shoal
spring radish
#

add

  "BottomBarSpec": {
    "Section": "0"
  }

to the file

#

y/n?

stone shoal
stone shoal
calm copper
#

But seriously, folks, when you point to a sample of the code, can you give a bit more background on where to look specifically? C'mon.

spring radish
stone shoal
#

I said you need to add Bottombarspec.

But i could have line highlighted it

#

If inwas on my pc i could probably fiven a better example

calm copper
stone shoal
#

But next time ill only help when im on pc since this wasnt working out. Mb

calm copper
stone shoal
#

Its fine

calm copper
#

It works, after all. Thank you, folks!

spring radish
#

nice that's useful

#

because I may add an icon for Tool Finder in the same place,

calm copper
#

What does this "Section" thing mean anyway? Is "Layout" now deprecated?

#

Or do we need both?

spring radish
#

I think layout is the style of the button (i.e. what color and shape)

calm copper
#

Just checked. Dropping of the "Layout": "Blue" has no effect. The button appeared in the blue section anyway.

stone shoal
calm copper
# stone shoal That a bug

My bad. It's now green ๐Ÿคฃ It's shown at the exact same location, but it's green. So, yes - we need both.

spring radish
#

Maybe it could be renamed to Style? (or really add a new Style field, and load from both)

calm copper
#

"Layout" is for the color (Style). BottomBarSpec is for the position. As @spring radish has correctly mentioned.

spring radish
#

Is the latest code pushed to github? I think the last fixes for 0.7.11.0 are missing?

calm copper
#

@stone shoal I just wonder. Is there a reason to have style and position of the group button decided separately? Blue/green/common concept has an idea. So, maybe just apply the style based on the section?

spring radish
#

or the default style/layout could be based on the section.

#

(it's currently hard-coded to Green)

stone shoal
# calm copper <@144547314718081024> I just wonder. Is there a reason to have style and positio...

Everything in the tool system is made with seperation in mind. Instead of everything being entangled with the default bottombar.

  • I named it Layout because it can be something completely different. Like a wonder is I believe structurial different and so it the settings box now.
  • You can create your own layout if you wanted to I just made the timberborn one possible by default. (eg. you can make a group look like a wonder).
  • Making the style based on position makes it very bottombar specific again not flexible anymore.
#

Like you could make your own "SideBar" for your custom tools and still use the same system and have teh Section be SideBar instead of BottomBar. Than it won't be placed in the bottombar anymore.

spring radish
#

yea, but you could add a DefaultLayout per-ToolGroup, so that it didn't need to be set on every item

#

blegh, I keep getting ToolGroups and Tools confused,

vast otter
#

but is not building section default?

stone shoal
#

It is, and I would assume most groups would be made for buildings so that what's it defaults to as layout.

spring radish
#

oh, I see the Tool / ToolGroup doesn't know anything about Section, because that's a BottomBar setting

stone shoal
#

You can also set it to -1 and and it goes before the blue stuf with a space between them

spring radish
#

so, eg: FPP Camera could add a TopBar ๐Ÿ™‚

spring radish
#

although it shouldn't be instead of FPP Camera, but in another mod,

stone shoal
#

BottomBar in my code is purely UI.

stone shoal
spring radish
#

If another mod wanted to use it, then it shouldn't need to depend on FPP Camera,

#

like if the timelapse camera mod was ever updated (as a random example)

stone shoal
#

Well yeah, but that would be their choice shrug. If you want to add a new section specific to your mod you could do it.

#

If you want to make a specific section for many users to use, It would better be a different mod that just creates a section

spring radish
#

yea

calm copper
#

Folks, I guess, with the new spec system, we cannot load the data dynamically. Here is what I had in the old tool system:

  "ToolInformation": {
    "TemplateFamilyName": "Terrain.DynamiteDigging",
    "Rules": [
      {
        "Condition": { "TypeId": "IgorZ.Automation.Conditions.ObjectFinishedCondition" },
        "Action": { "TypeId": "IgorZ.Automation.Actions.DetonateDynamiteAction", "Repeat": 1 }
      }
    ]
  }

My own code was desterilizing the object, so JSON could have any data. Now, the data in JSON must match a spec to be loaded properly. Any way to overcome it? I can make a spec and pack the parameters into it in some form of serialization, but I like the old approach.

primal wind
calm copper
#

That's what I named "pack". The down side of such approach is that I will need to add the translation code in every class that is being deserialized. It's like a dozen of classes as of now.

calm copper
# stone shoal What you mean with dynamic?

Dynamic means the "spec" is not pre-made. I have many classes with different paremeters. They already implement deserialization logic via IObjectLoader. In the old system, this code worked for both the tool loading and the entities loading. Now, I need an alternative way to load data from the tool spec. and going over all class and making yet another branch to load from the tool is not exactly how I want to spend my time.

#

The cheapest way I see for now, is making a spec for something like this:

        "Action": { "TypeId": "IgorZ.Automation.Actions.DetonateDynamiteAction", "Params": [{"Name": "Repeat", "Value": "1"}] }

Then, read it, translate it, and serialize via IObjectSaver.

stone shoal
#

Otherwise you can maybe just make the type object and do something with that?

calm copper
stone shoal
#

It Returns a interface where you can call create on based on the toolspec type

calm copper
#

Hmm. I will see, thanks.

civic mountain
#

Hi, I'm trying to modify the science cost of a vanilla building (district crossing), seems like TimberAPI can help with this, but I'm struggling to find any docs or examples. Can someone point me in the right direction? Thanks

solemn walrus
#

You can use The Architect's Toolkit for a heavy-handed way to remove science costs.

#

Essentially, unlocking the buildings then saving the map as a custom map.

civic mountain
#

It seems like making a spec file to modify it is very straightforward, I just want to see an example so I can glean the file/folder structure necessary

spring radish
#

Making spec/blueprint files is easy yes,

#

but the science cost of a building is not stored in a spec/blueprint file

#

If you use AssetRipper to extract the files, you can see what's in blueprints, and what's not

stone shoal
civic mountain
#

no worries ๐Ÿ™‚

stone shoal
#

Or well not for update 7. It works just fine for update 6

quasi igloo
#

Iimagine making a subgroup on the bottom bar would be fairly involved without TAPI, right?

#

I want to add a new subgroup for tubeway bridges on Emberpelts. Since I don't want to force TAPI to play Emberpelts just for toolbar neatness, I was just wondering if there's an ideal way to do things without it.

#

I'm thinking the best option us to just make an extra button on the bottom bar for bridges, but if TAPI is installed, move the tools to a new group for tubeway bridges.

#

Or have knatte anke put it in more groups.

brisk ether
#

Out of curiosity, tapi feels decently light from what I've seen, is there a reason to avoid it other than just keeping the literal list of dependencies short?

quasi igloo
#

No, that's it, keep dependencies short.

I have nothing against tapi, but to a lot of people, for U6, just being able to install Emberpelts and nothing else was a big selling point.

I often see people avoid mods with lots of dependencies.

#

I'm not against using it, I just don't want to make it a requirement for my biggest mod.

#

People I play games with will often just pick random mods from the steam workshop, install them all with no regards for dependencies or incompatabilities, then wonder why nothing works.

brisk ether
#

I feel that

quasi igloo
#

And as the groups modder, it's then up to me to go through the list and "Fix it", which usually requires dropping a few mods, and me writing a compatability patch specifically for the mod set, to make the ones we kept play nice together.

#

Seriously, our barotrauma mod pack last year had 3 mods in it that I wrote just to make mods in the pack play nice together.

#

But that's like, thr 2 extremes.

  1. Installs only the mod they want without dependencies.
  2. Installs lots of mods that aren't meant to work together.
#

The latest pack, he literally added every monster overhaul from the workshop. The most I could get to work together was 2.

stone shoal
stone shoal
quasi igloo
stone shoal
#

Otherwise i would not have to make it ๐Ÿ˜…

quasi igloo
#

Yeah, then I'll add a new button for bridges to the bottom bar, and include toolspec to move them if TAPI is installed.

brisk ether
#

Looks like I get a crash in the map editor with the most recent version of TimberAPI

#

I disabled a few mods that use TAPI and it crashes still. then I disabled TAPI and the crash went away

stone shoal
#

Yeah others have said that as well

#

Haven't checked it yet

#

I guess because there is nothing for a spec ThinkingIT

spring radish
#

TAPI v0.7.11.0 (with game 0.7.1.1) doesn't seem to draw the toolbar button for wonders correctly.

#

It's also missing the game version on the settings button

#

Also if you click the setting button, and then dismiss the menu with Esc, then mouse input is ignored going forwards.

#

without TAPI on top, with TAPI on bottom

brisk ether
spring radish
#

actually it's only if you press Esc twice, the first time it seems to do nothing.

#

so you get a chance to dismiss the dialog by clicking resume, and avoid it breaking

primal wind
stone shoal
primal wind
spring radish
#

probably something about how it opens the dialog, because the cursor tool becomes unselected (which the base game doesn't do)

spring radish
#

(I considered suggesting ~0.7.1.1~, but I don't think it's distinctive enough)

stone shoal
#

Im not sure why tapi would require to change that behavior ThinkingIT

vast otter
#

if we want to know if tapi is used we look at logs anyway ๐Ÿ˜›

vast otter
#

or atleast should not as its done in a different way than ingame last i heard

stone shoal
brisk ether
#

It's happened to me when I click this button: But I'm not sure if I can make it happen frequently

stone shoal
#

So it's not always ?

brisk ether
#

Yeah, I just checked. I clicked this, then hit Esc twice and now the game is ignoring all mouse and keyboard inputs other than Escape

stone shoal
#

So you can't click on a group?

brisk ether
#

Nope

stone shoal
#

Why hit esc twice ThinkingIT. Doesn't 1 esc already cloase the dialog ?

brisk ether
#

Nope

#

When it's frozen like this, I can hit esc to get the menu back up and that's the only thing I can then click on

stone shoal
#

I seee

#

Okay that's maybe new ThinkingIT

#

It doesn't even close

#

Before it just kept the group open and had to click on another

brisk ether
#

Huh

stone shoal
#

Hmm

#

So it's only why you try to close it with esc. weird

brisk ether
#

Let me try something

#

If I open the main menu with Esc instead of clicking the button, I can hit esc again and nothing goes wrong.
If I open it with the settings button, then click resume with the mouse then same deal. It's fine.
It's only if I close the menu with esc (twice) after I open it with that button

stone shoal
#

yeah

#

It should have closed though with the first click

brisk ether
#

Hmm, now the water is invisible ๐Ÿ˜ what is happening

stone shoal
#

Okay this was also in update 6 shrug

#

Seems like no one had problems with it

brisk ether
#

Oh got it back now. I clicked something to build and esc'd out of the build tool and it's back now

stone shoal
#

It's a very specific bug though

primal wind
stone shoal
brisk ether
#

Of course ๐Ÿ™‚

stone shoal
#

yea

vast otter
primal wind
#

Something I saw in the #๐Ÿš€mod-users channel made me think of something that should be added to the tool & tool group blueprints since tapi is already replacing the bottom bar. "TreeId", would reference the id of both tools and tool groups alike so that "tech tree" style mods can be made. As for the UI, dunno yet, can leave that to the wayside until you're happy with the underlying implementation

stone shoal
#

I cannot find a question in this paragraph. Just a add this for fun and giggles

vast otter
stone shoal
#

ps. With the new blueprint system anyone can add any new spec to any blueprint. Even within my own system I have different specs for different information

primal wind
#

combined id is so that the groups themselves can hide their decedents still. the reason I don't suggest a different mod for this is because of how many depend on tapi and the need to keep more groups around for stuff that's not falling into the tech tree

stone shoal
#

And its not really something for TimberApi. The mod that adds a tech tree csn use the current system to make something like that

#

And a mod that creates a tech tree doesnt even need to do it that way. timefall_purple_shrug

primal wind
#

No the mod that adds a tech can't use the current system. This is because they can't say Tool.GearShop... depends on Tool.Lumbermill... for example. There's only the option of saying X tool depends on Y group. The TreeId is for resolving that without breaking the existing system, meaning tool X that defines Y TreeId depends on tool/group Y

stone shoal
#

suprisedPika its like you describing the functionality for a completely very specific mod.

#

The mod that wants that can add it to the tool blueprint if thats the way they want to do it. Or a complete other way

#

Like a ToolTreeSpec having like the dependend spec id. Their costs. Making time or something

#

But it has nothing to do with TimberApi or any other mod in that matter. The Tool tree mod you want can add it.

#

And sinply use a tool id to identify a tool it wants to unlock.

primal wind
#

I don't see a reason it has to be a separate mod, I'd rather you find time when you're in the mood to experiment with different ways to gel the 2 systems together and then release the result. I'm not hung up on it being in the here and now, just it being a future goal at some point to expand the tooling system to support tech trees

#

also the TreeId was just an example name, you can name it whatever you want if something better comes to mind

stone shoal
#

There is no point in adding support for 1 specific mod. Which is literly the job of that said mod

#

And the tool system can just be used for that specific mod

#

The only thing i hear you say is. I want s tree tool mod but dont want to make it.

primal wind
#

It's not that I want it but others do, I was just saying that if it's made then I'd rather it be a part of tapi so I can still use building specs etc when they get implemented since I'm sure a tree mod would cause problems with that if it was done separatly

stone shoal
#

But im sorry to explain it. I should have said PepeOk way sooner and because I already knew it would be pointless to try and explain. My bad.

primal wind
#

but for those who don't mind tapi as a dependency I'm sure they'd appreciate being able to use both tech trees and everything else tapi has to offer

#

should be easier to implement too since you can just disable buttons for the tech tree effect in whatever UI you make for that side of things

stone shoal
#

Im not going to implement a tech tree mode. Thats not an feature of an API FacePalmLotus

primal wind
#

not as difficult as say the building spec modifying game objects

stone shoal
#

@vast otter you understand what im saying right?

#

Anyone csn easily disabled buttons with the tool system of TimberApi

primal wind
#

but it's not so easy to replace the UI right?

stone shoal
#

Why does the ui need to be changed due a tech tree mod

#

You just disable a button

primal wind
#

bottombar could switch to a panel for selections? I dunno, I was only looking for it to be an optional feature

stone shoal
#

And if you want to replace the ui. Yes its also simply done. Since the bottombar is nothing more of ordered buttons which are generated by TimberApi.

#

Blueprints dont even have optionals anymore SakuShrug

primal wind
#

I'll take your word for it, and I assume anyone watching this convo will too

stone shoal
#

So like I try to say. Id have to make litarly a tech tree mod for well you. To be used

#

While thats just a single use mod imo

primal wind
#

I thought the tapi groups/tools were implemented with .optional as an option?

stone shoal
#

Thats not a tapi thing

#

Or well not anymore

#

And i mean a field inside a spec needs to be specified with blueprints now.

primal wind
#

oh, you mean that's just an automatic addon from TB side of things?

stone shoal
#

Yes its since they added mod support

vast otter
primal wind
#

I'm still not convinced but whatever, I don't think I'm able to convince you either so we'll just agree to disagree

stone shoal
spring radish
#

I patch the Enabled property for Tool Finder. It makes the tool disappear correctly.

#

Specifically ToolButton.ToolEnabled

raven geyser
#

I'm not used to C# so this is a guess, could it be in the following code that toolSpec is set to null:

    public void Load()
    {
        _toolSpecifications = specService.GetSpecs<ToolSpec>()
            .Where(toolSpec => toolSpec.Scenes == null ? ContextManager.CurrentContext == "Game" : toolSpec.Scenes.Contains(ContextManager.CurrentContext))
            .ToImmutableDictionary(specification => specification.Id.ToLower());
    }
brisk ether
#

Because if I remember correctly, that mod enabled in u6 would cause my game to crash if I went into the map editor and if it was disabled but TAPI wasn't, the map editor worked fine

#

So if that's the mod you're referring to, lol?

raven geyser
#

yes ๐Ÿ™‚

#

I'll try a different one as well

spring radish
#

I seem to remember something about GetSpecs won't return an empty list and will trigger a crash instead,

brisk ether
#

0.1.6: updated dependency to TimberApi 0.7.8.0, this resolves the game crashing when using the map editor
I ๐Ÿ’ฏ% missed this patch note so thanks mod dev for fixing that

#

I guess next time I restart my game I'll re-enable it lol

raven geyser
#

same thing happens with the forest tool. want me to create an issue on github?

brisk ether
#

I feel like the answer to that is typically always yes, make a ticket at least for tracking

#

but I'm not a dev on this mod so ShrugIT

raven geyser
quasi igloo
#

I got around that with most of mine adding a dummy file.

#

They're as blank as possible

#

All the optionals missing, all strings and arrays empty.

spring radish
#

I'm reminded (while watching someone's Youtube video), that TimerAPI doesn't show the game version ๐Ÿ˜ฆ

#

ahh, that's because ShowOptionsButton isn't a Tool, but just a IBottomBarElementProvider

stone shoal
#

1 april i get my MRA for sleep apnea. Hopefully I get better soon after that

brisk ether
#

Good luck, hope you feel better

spring radish
raven geyser
#

MRA did nothing for me:( I can barely sleep without my APAP'

stone shoal
#

Lately it feels it get's worse and the test felt not 100% accurate to me. Because I only slept for like 3.5H while it said it required 6H at least

#

Only had 7 stops an hour though shrug

stone shoal
raven geyser
#

I've been using it nightly for almost 10 years and I can barely sleep without it. So it's hard to remember what it was like before but if I try to sleep without it I'm constantly waking up and I'll have a sore throat in the morning from snoring too much. Plus my wife will sleep in the other room if I don't have it, so that's a big improvement to have her sleep with me

stone shoal
#

Hm yeah that's a long time

#

I don't wake up personally, at least not that I know it's from that. I do get awake like once or twice a night most nights.

#

But I just have an extreme headache, and too tired to do really anything anymore.

raven geyser
#

You might not wake up, but you're not really asleep either. That would explain the tiredness.

stone shoal
#

I have all my hope on this, because my doctor doesn't care at all an this is my only hope ๐Ÿ™‚

#

Funny thing is, I got a sleeping test not even by the doctor but because of jaw surgeon KEKW

solemn walrus
#

took me decades to get a diagnosis for the pain I get only while trying to sleep...decades...tis arthritis. I hope you have something treatable.

stone shoal
#

I feel like problems caused by bad sleep is easily thrown under the rug with like oh its just autism, or inside your head.

topaz crypt
#

Every little thing grows sleep deprivation and insomnia practically exponentially. Sometimes it can be a single thing, but, like a lot of things, is probably a combination of factors (to my understanding).

calm copper
#

Snap! The latest update broke TAPI again SadIT

stone shoal
#

It sure did

#

They should have waited 1 more week SadIT

stone shoal
#

It has been updated for version 0.7.2.0

humble steeple
#

@stone shoal

Only harmony and timberapi are enabled. Got this error on latest build.

stone shoal
humble steeple
#

Checking now

#

I thought that i had enabled auto update on the mod. It says on the workshop you updated it like two ish hours ago or something so i have that version?

#

one second i'll get it

stone shoal
#

Steam doesn't do updating when you want really well

#

Download the steam update mod ๐Ÿ™‚

humble steeple
#

Modded: true, official

  • Harmony (v2.3.3)
  • TimberApi (v0.7.11.0)
stone shoal
#

That's the old version

humble steeple
#

Wth

#

Can you link me your github again so i can just grab it from there?

stone shoal
#

It's not on github, and there is never a build on github

humble steeple
#

There isn't?!?!

#

uhhhh i read it somewhere on github

stone shoal
#

There is a github, there is not a build on github

humble steeple