Skip to content

Commit

Permalink
Fix MCE API changes, fastJSON embedding, intermediate work on stackin…
Browse files Browse the repository at this point in the history
…g, added icon assets
  • Loading branch information
AnnanFay committed Oct 3, 2021
1 parent 3846891 commit 152446c
Show file tree
Hide file tree
Showing 6 changed files with 163 additions and 13 deletions.
26 changes: 20 additions & 6 deletions CraftingSkill/CraftingConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,15 @@ public class CraftingConfig
private ConfigVariable<float> __DamageStart = new ConfigVariable<float>("Attributes", "DamageStart", 0.8f);
private ConfigVariable<float> __DamageStop = new ConfigVariable<float>("Attributes", "DamageStop", 1.3f);

// Cauldron: It's not crafting so no experience, but if we did
// Cauldron/Oven: It's not crafting so no experience, but if we did
// Stonecutter: should probably be 2 or 3, but only thing right now is shitty sharpening stone
// Artisan: is used by Epic Loot?, will likely have vanilla items in future
// Guessing at 2 for now
private ConfigVariable<int> __TierModifierInventory = new ConfigVariable<int>("StationBalancing", "TierModifierInventory", 0);
private ConfigVariable<int> __TierModifierWorkbench = new ConfigVariable<int>("StationBalancing", "TierModifierWorkbench", 0);
private ConfigVariable<int> __TierModifierForge = new ConfigVariable<int>("StationBalancing", "TierModifierForge", 2);
private ConfigVariable<int> __TierModifierCauldron = new ConfigVariable<int>("StationBalancing", "TierModifierCauldron", 3);
private ConfigVariable<int> __TierModifierOven = new ConfigVariable<int>("StationBalancing", "TierModifierOven", 3);
private ConfigVariable<int> __TierModifierStonecutter = new ConfigVariable<int>("StationBalancing", "TierModifierStonecutter", 1);
private ConfigVariable<int> __TierModifierArtisan = new ConfigVariable<int>("StationBalancing", "TierModifierArtisan", 2);
private ConfigVariable<int> __TierModifierDefault = new ConfigVariable<int>("StationBalancing", "TierModifierDefault", 0);
Expand All @@ -69,7 +70,8 @@ public class CraftingConfig
public int TierModifierInventory {get => __TierModifierInventory.Value; }
public int TierModifierWorkbench {get => __TierModifierWorkbench.Value; }
public int TierModifierForge {get => __TierModifierForge.Value; }
public int TierModifierCauldron {get => __TierModifierCauldron.Value; }
public int TierModifierCauldron { get => __TierModifierCauldron.Value; }
public int TierModifierOven { get => __TierModifierOven.Value; }
public int TierModifierStonecutter {get => __TierModifierStonecutter.Value; }
public int TierModifierArtisan {get => __TierModifierArtisan.Value; }
public int TierModifierDefault {get => __TierModifierDefault.Value; }
Expand All @@ -84,12 +86,23 @@ public void InitConfig(string mod_id, ConfigFile config)
// Bind<int>("General", "NexusID", NEXUS_ID, "Nexus mod ID for updates");

Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == "ModConfigEnforcer");

if (assembly != null)
{
Debug.Log("[CraftingSkill] Mod Config Enforcer detected, registering mod...");
var configManagerType = assembly.GetType("ModConfigEnforcer.ConfigManager");
Traverse.Create(configManagerType).Method("RegisterMod", mod_id, config).GetValue(mod_id, config);
try
{
// Try to register using MCE
Debug.Log("[CraftingSkill] Mod Config Enforcer detected, registering mod...");
var configManagerType = assembly.GetType("ModConfigEnforcer.ConfigManager");
Debug.Log("configManagerType: " + configManagerType.ToString());
var traverse = Traverse.Create(configManagerType);
var serverConfigReceivedDelegateType = (Type)traverse.Type("ServerConfigReceivedDelegate").GetValue();
Type[] paramTypes = { typeof(string), typeof(ConfigFile), serverConfigReceivedDelegateType };
traverse.Method("RegisterMod", paramTypes).GetValue(mod_id, config, null);
} catch (Exception e) {
// registering mod failed, API may have changed
// pretend MCE doesn't exist
assembly = null;
}
}
else
{
Expand All @@ -115,6 +128,7 @@ public void InitConfig(string mod_id, ConfigFile config)
__TierModifierWorkbench.init(assembly, config, mod_id);
__TierModifierForge.init(assembly, config, mod_id);
__TierModifierCauldron.init(assembly, config, mod_id);
__TierModifierOven.init(assembly, config, mod_id);
__TierModifierStonecutter.init(assembly, config, mod_id);
__TierModifierArtisan.init(assembly, config, mod_id);
__TierModifierDefault.init(assembly, config, mod_id);
Expand Down
45 changes: 42 additions & 3 deletions CraftingSkill/CraftingSkill.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,55 @@ public class CraftingSkillsPlugin : BaseUnityPlugin
{
public const String MOD_ID = "annanfay.mod.crafting_skill";
public const string MOD_NAME = "CraftingSkill";
public const string MOD_VERSION = "0.0.1";
public const string MOD_VERSION = "0.0.2";
public const int CRAFTING_SKILL_ID = 1605;

Harmony harmony;

private static CraftingConfig config = new CraftingConfig();

public CraftingSkillsPlugin() {
LoadEmbeddedAssembly("fastJSON.dll");
}

private static void LoadEmbeddedAssembly(string assemblyName)
{
// RandyKnapp https://github.com/RandyKnapp/ValheimMods/blob/719e1a6dc419f9075c46b3eb4e3eb53285b7ffda/EpicLoot-Addon-Helheim/Helheim.cs#L58
var stream = GetManifestResourceStream(assemblyName);
if (stream == null)
{
Debug.LogError($"Could not load embedded assembly ({assemblyName})!");
return;
}

using (stream)
{
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
Assembly.Load(data);
}
}

public static Stream GetManifestResourceStream(string filename)
{
var assembly = Assembly.GetCallingAssembly();
var fullname = assembly.GetManifestResourceNames().SingleOrDefault(x => x.EndsWith(filename));
if (!string.IsNullOrEmpty(fullname))
{
return assembly.GetManifestResourceStream(fullname);
}

return null;
}

void Awake()
{
config.InitConfig(MOD_ID, Config);

harmony = new Harmony(MOD_ID);
harmony.PatchAll();

SkillInjector.RegisterNewSkill(CRAFTING_SKILL_ID, "Crafting", "Describes crafting ability", 1.0f, LoadIconTexture(), Skills.SkillType.Unarmed);
SkillInjector.RegisterNewSkill(CRAFTING_SKILL_ID, "Crafting", "Craft higher quality items as you level", 1.0f, LoadIconTexture(), Skills.SkillType.Unarmed);

ExtendedItemData.LoadExtendedItemData += QualityComponent.OnNewExtendedItemData;
ExtendedItemData.NewExtendedItemData += QualityComponent.OnNewExtendedItemData;
Expand Down Expand Up @@ -177,6 +211,8 @@ public static float GetCraftTierMod(Recipe recipe)
return config.TierModifierWorkbench;
case "$piece_cauldron":
return config.TierModifierCauldron;
case "$piece_oven":
return config.TierModifierOven;
case "$piece_stonecutter":
return config.TierModifierStonecutter;
case "$piece_artisanstation":
Expand Down Expand Up @@ -246,7 +282,10 @@ Recipe ___m_craftRecipe
// # - identifier: `$piece_workbench` in game name: Workbench
// # - identifier: `$piece_cauldron` in game name: Cauldron
// # - identifier: `$piece_stonecutter` in game name: Stonecutter
// Also $piece_artisanstation (added at some point after above list)
// See also (added at some point after above list):
// - $piece_artisanstation
// - $piece_oven

string craftingStationName = ___m_craftRecipe.m_craftingStation?.m_name;
bool isNoStation = craftingStationName == null;
bool isForgeRecipe = craftingStationName == "$piece_forge";
Expand Down
14 changes: 10 additions & 4 deletions CraftingSkill/CraftingSkill.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@
<Reference Include="ExtendedItemDataFramework">
<HintPath>..\..\ValheimLibs\ExtendedItemDataFramework.dll</HintPath>
</Reference>
<Reference Include="fastJSON">
<Reference Include="fastJSON, Version=2.4.0.0, Culture=neutral, PublicKeyToken=6b75a806b86095cd, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\ValheimLibs\fastJSON.dll</HintPath>
</Reference>
<Reference Include="HarmonyXInterop">
Expand Down Expand Up @@ -136,11 +137,16 @@
<Compile Include="QualityComponent.cs" />
<Compile Include="StackableQuality.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="..\..\ValheimLibs\fastJSON.dll">
<Link>fastJSON.dll</Link>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>
xcopy /y /d "$(TargetDir)CraftingSkill.dll" "M:\Valheim\Valheim_solo\BepInEx\plugins"
xcopy /y /d "$(ProjectDir)CraftingSkillIcon.png" "M:\Valheim\Valheim_solo\BepInEx\plugins"
xcopy /y /d "$(TargetDir)CraftingSkill.dll" "M:\SteamLibrary\SteamApps\common\Valheim\BepInEx\plugins\CraftingSkill"
xcopy /y /d "$(ProjectDir)CraftingSkillIcon.png" "M:\SteamLibrary\SteamApps\common\Valheim\BepInEx\plugins\CraftingSkill"
</PostBuildEvent>
</PropertyGroup>
</Project>
</Project>
5 changes: 5 additions & 0 deletions CraftingSkill/StackableQuality.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ public class StackableQuality

// Defaults return weighted average over stack

public StackableQuality()
{
this.Qualities = new List<Quality>();
}

public int Quantity {
get {
return Qualities.Sum(q => q.Quantity);
Expand Down
Binary file added CraftingSkill/assets/crafting_skill.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
86 changes: 86 additions & 0 deletions CraftingSkill/assets/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 152446c

Please sign in to comment.