• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javaandroidc++linuxc#objective-ccocoa誰得qtrubypythongamewindowsbathyscaphephpguic翻訳omegattwitterframeworktestbtronarduinovb.net計画中(planning stage)directxpreviewerゲームエンジンdom

First Machine Age's Mods (Combined repo.)


Commit MetaInfo

Revisão2a8c2860be405f484196a20090f6d4631d897f91 (tree)
Hora2020-03-24 10:45:07
Autormelchior <melchior@user...>
Commitermelchior

Mensagem de Log

Initial version: Metal Recovery Anvil

Mudança Sumário

Diff

--- /dev/null
+++ b/AnvilMetalRecovery/AnvilMetalRecovery.csproj
@@ -0,0 +1,84 @@
1+<?xml version="1.0" encoding="utf-8"?>
2+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+ <PropertyGroup>
4+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6+ <ProjectGuid>{3EC9A581-655C-4F68-898C-4E773C292082}</ProjectGuid>
7+ <OutputType>Library</OutputType>
8+ <RootNamespace>AnvilMetalRecovery</RootNamespace>
9+ <AssemblyName>AnvilMetalRecovery</AssemblyName>
10+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
11+ </PropertyGroup>
12+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
13+ <DebugSymbols>true</DebugSymbols>
14+ <DebugType>full</DebugType>
15+ <Optimize>false</Optimize>
16+ <OutputPath>bin\Debug</OutputPath>
17+ <DefineConstants>DEBUG;</DefineConstants>
18+ <ErrorReport>prompt</ErrorReport>
19+ <WarningLevel>4</WarningLevel>
20+ <ConsolePause>false</ConsolePause>
21+ <CustomCommands>
22+ <CustomCommands>
23+ <Command type="AfterBuild" command="7z -tzip a ${ProjectName}_${ProjectConfig}.zip" workingdir="${TargetDir}" />
24+ <Command type="AfterClean" command="rm -f *.zip" workingdir="${TargetDir}" />
25+ </CustomCommands>
26+ </CustomCommands>
27+ </PropertyGroup>
28+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
29+ <Optimize>true</Optimize>
30+ <OutputPath>bin\Release</OutputPath>
31+ <ErrorReport>prompt</ErrorReport>
32+ <WarningLevel>4</WarningLevel>
33+ <ConsolePause>false</ConsolePause>
34+ </PropertyGroup>
35+ <ItemGroup>
36+ <Reference Include="System" />
37+ <Reference Include="VintagestoryAPI">
38+ <HintPath>vs_libs\VintagestoryAPI.dll</HintPath>
39+ <Private>False</Private>
40+ </Reference>
41+ <Reference Include="VintagestoryLib">
42+ <HintPath>vs_libs\VintagestoryLib.dll</HintPath>
43+ <Private>False</Private>
44+ </Reference>
45+ <Reference Include="VSCreativeMod">
46+ <HintPath>vs_libs\VSCreativeMod.dll</HintPath>
47+ <Private>False</Private>
48+ </Reference>
49+ <Reference Include="VSEssentials">
50+ <HintPath>vs_libs\VSEssentials.dll</HintPath>
51+ <Private>False</Private>
52+ </Reference>
53+ <Reference Include="VSSurvivalMod">
54+ <HintPath>vs_libs\VSSurvivalMod.dll</HintPath>
55+ <Private>False</Private>
56+ </Reference>
57+ </ItemGroup>
58+ <ItemGroup>
59+ <Compile Include="MetalRecoverySystem.cs" />
60+ <Compile Include="Properties\AssemblyInfo.cs" />
61+ <Compile Include="MetalRecovery_BlockEntityAnvil.cs" />
62+ </ItemGroup>
63+ <ItemGroup>
64+ <None Include="modinfo.json">
65+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
66+ </None>
67+ <None Include="assets\fma\itemtypes\shavings\metal_shavings.json">
68+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
69+ </None>
70+ <None Include="assets\fma\shapes\item\shavings\metal_shavings.json">
71+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
72+ </None>
73+ </ItemGroup>
74+ <ItemGroup>
75+ <Folder Include="assets\" />
76+ <Folder Include="assets\fma\" />
77+ <Folder Include="assets\fma\shapes\" />
78+ <Folder Include="assets\fma\itemtypes\" />
79+ <Folder Include="assets\fma\itemtypes\shavings\" />
80+ <Folder Include="assets\fma\shapes\item\" />
81+ <Folder Include="assets\fma\shapes\item\shavings\" />
82+ </ItemGroup>
83+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
84+</Project>
\ No newline at end of file
--- /dev/null
+++ b/AnvilMetalRecovery/MetalRecoverySystem.cs
@@ -0,0 +1,74 @@
1+using System;
2+
3+using Vintagestory.API.Common;
4+using Vintagestory.API.Server;
5+using Vintagestory.Common;
6+using Vintagestory.Server;
7+
8+namespace AnvilMetalRecovery
9+{
10+ public class MetalRecoverySystem : ModSystem
11+ {
12+ internal const string anvilKey = @"Anvil";
13+
14+ private ICoreAPI CoreAPI;
15+ private ICoreServerAPI ServerAPI;
16+ private ServerCoreAPI ServerCore { get; set; }
17+
18+ public override bool AllowRuntimeReload {
19+ get { return false; }
20+ }
21+
22+ public override bool ShouldLoad(EnumAppSide forSide)
23+ {
24+ return forSide.IsServer( );
25+ }
26+
27+ public override double ExecuteOrder( )
28+ {
29+ return 0.11d;
30+ }
31+
32+ public override void Start(ICoreAPI api)
33+ {
34+ base.Start(api);
35+ this.CoreAPI = api;
36+ }
37+
38+ public override void StartServerSide(ICoreServerAPI api)
39+ {
40+ base.StartServerSide(api);
41+
42+ this.ServerAPI = api;
43+
44+
45+ if (api is ServerCoreAPI) {
46+ ServerCore = api as ServerCoreAPI;
47+ }
48+ else {
49+ Mod.Logger.Error("Cannot access 'ServerCoreAPI' class: API (implimentation) has changed, Contact Developer!");
50+ return;
51+ }
52+ //ServerAPI.ClassRegistry.GetBlockEntityClass
53+ //ServerAPI.RegisterBlockEntityClass(anvilKey, typeof(MetalRecovery_BlockEntityAnvil));
54+
55+ ServerCore.ClassRegistryNative.ReplaceBlockEntityType(anvilKey, typeof(MetalRecovery_BlockEntityAnvil));
56+
57+ Mod.Logger.VerboseDebug("Anvil Metal Recovery - should be installed...");
58+ }
59+ }
60+
61+
62+ internal static class Helpers
63+ {
64+ internal static void ReplaceBlockEntityType(this ClassRegistry registry, string className, Type blockentity)
65+ {
66+ if (registry.blockEntityClassnameToTypeMapping.ContainsKey(className)) {
67+ //replace it
68+ registry.blockEntityClassnameToTypeMapping[className] = blockentity;
69+ registry.blockEntityTypeToClassnameMapping[blockentity] = className;
70+ }
71+ }
72+ }
73+}
74+
--- /dev/null
+++ b/AnvilMetalRecovery/MetalRecovery_BlockEntityAnvil.cs
@@ -0,0 +1,102 @@
1+using System;
2+using System.IO;
3+
4+using Vintagestory.API.Common;
5+using Vintagestory.API.Config;
6+using Vintagestory.API.Datastructures;
7+using Vintagestory.API.MathTools;
8+using Vintagestory.GameContent;
9+
10+namespace AnvilMetalRecovery
11+{
12+ public class MetalRecovery_BlockEntityAnvil : BlockEntityAnvil
13+ {
14+ private uint SplitCount;
15+
16+
17+ private ILogger Logger { get; set; }
18+
19+ public static AssetLocation MetalShavingsCode {
20+ get
21+ {
22+ return new AssetLocation(@"fma", @"metal_shaving");
23+ }
24+ }
25+
26+ public override void Initialize(ICoreAPI api)
27+ {
28+ base.Initialize(api);
29+ Logger = api.World.Logger;
30+#if DEBUG
31+ Logger.VerboseDebug("Metal Recovery - Initialize");
32+#endif
33+ }
34+
35+ public override void FromTreeAtributes(ITreeAttribute tree, IWorldAccessor worldForResolving)
36+ {
37+ base.FromTreeAtributes(tree, worldForResolving);
38+ Logger = worldForResolving.Logger;
39+#if DEBUG
40+ Logger.VerboseDebug("Metal Recovery - FromTreeAtributes");
41+#endif
42+ //Get SplitCount
43+ }
44+
45+ public override void ToTreeAttributes(ITreeAttribute tree)
46+ {
47+ base.ToTreeAttributes(tree);
48+#if DEBUG
49+ Logger.VerboseDebug("Metal Recovery - ToTreeAttributes");
50+#endif
51+ //Set SplitCount
52+ }
53+
54+ public override void OnSplit(Vec3i voxelPos)
55+ {
56+ if (Voxels[voxelPos.X, voxelPos.Y, voxelPos.Z] == ( byte )EnumVoxelMaterial.Metal) {
57+#if DEBUG
58+ Logger.VerboseDebug("Split some {0} @{1}, Total:{2}", this.BaseMaterial.Collectible.LastCodePart( ), voxelPos, SplitCount);
59+#endif
60+ SplitCount++;
61+ }
62+
63+ base.OnSplit(voxelPos);
64+
65+ }
66+
67+ //Would be great if this returned a bool!
68+ public override void CheckIfFinished(IPlayer byPlayer)
69+ {
70+ base.CheckIfFinished(byPlayer);
71+ // base.MatchesRecipe( ) -- Private; argh
72+ /*
73+ this.Voxels = new byte[16, 6, 16];
74+ this.workItemStack = null;
75+ this.selectedRecipeId = -1;
76+
77+ base.MarkDirty (false);
78+ */
79+
80+ if (SplitCount > 0 && this.WorkItemStack == null && this.SelectedRecipe == null) {
81+ int metalShavings = ( int )(SplitCount / 5);
82+
83+ if (metalShavings > 0)
84+ {
85+ #if DEBUG
86+ Logger.VerboseDebug("RecoveryAnvil: Smithing done - recover: {0} shavings of {1}", metalShavings, this.BaseMaterial.Collectible.LastCodePart( ));
87+ #endif
88+
89+ Item metalShavingsItem = Api.World.GetItem(MetalShavingsCode.WithPathAppendix("-" + this.BaseMaterial.Collectible.LastCodePart( )));
90+ ItemStack metalShavingsStack = new ItemStack(metalShavingsItem, ( int )(SplitCount / 5));
91+
92+ if (byPlayer != null) {
93+ byPlayer.InventoryManager.TryGiveItemstack(metalShavingsStack, false);
94+ //Api.World.SpawnItemEntity(metalShavingsStack, Pos.ToVec3d( ).Add(0.5, 0.5, 0.5));
95+ }
96+ }
97+ }
98+
99+
100+ }
101+ }
102+}
\ No newline at end of file
--- /dev/null
+++ b/AnvilMetalRecovery/Properties/AssemblyInfo.cs
@@ -0,0 +1,27 @@
1+using System.Reflection;
2+using System.Runtime.CompilerServices;
3+
4+// Information about this assembly is defined by the following attributes.
5+// Change them to the values specific to your project.
6+
7+[assembly: AssemblyTitle("AnvilMetalRecovery")]
8+[assembly: AssemblyDescription("")]
9+[assembly: AssemblyConfiguration("")]
10+[assembly: AssemblyCompany("")]
11+[assembly: AssemblyProduct("")]
12+[assembly: AssemblyCopyright("librarian")]
13+[assembly: AssemblyTrademark("")]
14+[assembly: AssemblyCulture("")]
15+
16+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
17+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
18+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
19+
20+[assembly: AssemblyVersion("1.0.*")]
21+
22+// The following attributes are used to specify the signing key for the assembly,
23+// if desired. See the Mono documentation for more information about signing.
24+
25+//[assembly: AssemblyDelaySign(false)]
26+//[assembly: AssemblyKeyFile("")]
27+
--- /dev/null
+++ b/AnvilMetalRecovery/assets/fma/itemtypes/shavings/metal_shavings.json
@@ -0,0 +1,167 @@
1+{
2+ code: "metal_shaving",
3+
4+ maxstacksize: 128,
5+ attributes: {
6+ handbook: {
7+ excludeByType: {
8+ "*-chromium": true,
9+ "*-platinum": true,
10+ "*-titanium": true,
11+ "*-rhodium": true,
12+ "*-stainlessteel": true,
13+ "*-uranium": true
14+ }
15+ }
16+ },
17+ variantgroups: [
18+ { code: "metal", loadFromProperties: "game:block/metal" },
19+ ],
20+ storageFlags: 5,
21+
22+ shape: { base: "fma:item/shavings/metal_shavings" },
23+ textures: {
24+ "metal": { base: "game:block/metal/ingot/{metal}" },
25+ },
26+ creativeinventory: { "general": ["*"], "items": ["*"] },
27+ materialDensityByType: {
28+ "*-copper": 8960,
29+ "*-brass": 8500,
30+ "*-tinbronze": 7600,
31+ "*-bismuthbronze": 7900,
32+ "*-blackbronze": 9000,
33+ "*-iron": 7870,
34+ "*-gold": 19300,
35+ "*-lead": 11300,
36+ "*-tin": 7260,
37+ "*-chromium": 7150,
38+ "*-platinum": 21500,
39+ "*-titanium": 4510,
40+ "*-zinc": 7140,
41+ "*-silver": 10500,
42+ "*-bismuth": 9790,
43+ "*-molybdochalkos": 9600
44+ },
45+ combustiblePropsByType: {
46+ "*-copper": {
47+ meltingPoint: 1084,
48+ meltingDuration: 30,
49+ smeltedRatio: 20,
50+ smeltedStack: { type: "item", code: "game:ingot-copper" }
51+ },
52+ "*-brass": {
53+ meltingPoint: 920,
54+ meltingDuration: 30,
55+ smeltedRatio: 20,
56+ smeltedStack: { type: "item", code: "game:ingot-brass" }
57+ },
58+ "*-tinbronze": {
59+ meltingPoint: 950,
60+ meltingDuration: 30,
61+ smeltedRatio: 20,
62+ smeltedStack: { type: "item", code: "game:ingot-tinbronze" }
63+ },
64+ "*-bismuthbronze": {
65+ meltingPoint: 850,
66+ meltingDuration: 30,
67+ smeltedRatio: 20,
68+ smeltedStack: { type: "item", code: "game:ingot-bismuthbronze" }
69+ },
70+ "*-blackbronze": {
71+ meltingPoint: 1020,
72+ meltingDuration: 30,
73+ smeltedRatio: 20,
74+ smeltedStack: { type: "item", code: "game:ingot-blackbronze" }
75+ },
76+ "*-iron": {
77+ meltingPoint: 1482,
78+ meltingDuration: 30,
79+ smeltedRatio: 20,
80+ smeltedStack: { type: "item", code: "game:ingot-iron" }
81+ },
82+ "*-gold": {
83+ meltingPoint: 1063,
84+ meltingDuration: 30,
85+ smeltedRatio: 20,
86+ smeltedStack: { type: "item", code: "game:ingot-gold", }
87+ },
88+ "*-lead": {
89+ meltingPoint: 327,
90+ meltingDuration: 30,
91+ smeltedRatio: 20,
92+ smeltedStack: { type: "item", code: "game:ingot-lead" }
93+ },
94+ "*-tin": {
95+ meltingPoint: 232,
96+ meltingDuration: 30,
97+ smeltedRatio: 20,
98+ smeltedStack: { type: "item", code: "game:ingot-tin" }
99+ },
100+ "*-chromium": {
101+ meltingPoint: 1907,
102+ meltingDuration: 30,
103+ smeltedRatio: 20,
104+ smeltedStack: { type: "item", code: "game:ingot-chromium" }
105+ },
106+ "*-platinum": {
107+ meltingPoint: 1770,
108+ meltingDuration: 30,
109+ smeltedRatio: 20,
110+ smeltedStack: { type: "item", code: "game:ingot-platinum" }
111+ },
112+ "*-titanium": {
113+ meltingPoint: 1668,
114+ meltingDuration: 30,
115+ smeltedRatio: 20,
116+ smeltedStack: { type: "item", code: "game:ingot-titanium" }
117+ },
118+ "*-zinc": {
119+ meltingPoint: 419,
120+ meltingDuration: 30,
121+ smeltedRatio: 20,
122+ smeltedStack: { type: "item", code: "game:ingot-zinc" }
123+ },
124+ "*-silver": {
125+ meltingPoint: 961,
126+ meltingDuration: 30,
127+ smeltedRatio: 20,
128+ smeltedStack: { type: "item", code: "game:ingot-silver" }
129+ },
130+ "*-bismuth": {
131+ meltingPoint: 271,
132+ meltingDuration: 30,
133+ smeltedRatio: 20,
134+ smeltedStack: { type: "item", code: "game:ingot-bismuth" }
135+ },
136+ "*-molybdochalkos": {
137+ meltingPoint: 902,
138+ meltingDuration: 30,
139+ smeltedRatio: 20,
140+ smeltedStack: { type: "item", code: "game:ingot-molybdochalkos" }
141+ }
142+ },
143+ guiTransform: {
144+ translation: { x: 2, y: 0, z: 0 },
145+ rotation: { x: 149, y: -36, z: 0 },
146+ origin: { x: 0.5, y: 0.1, z: 0.5 },
147+ scale: 3.5
148+ },
149+ fpHandTransform: {
150+ translation: { x: 0, y: 0.1, z: 0 },
151+ rotation: { x: 65, y: 21, z: -6 },
152+ origin: { x: 0.5, y: 0.1, z: 0.5 },
153+ scale: 2.15
154+ },
155+ tpHandTransform: {
156+ translation: { x: -0.77, y: -0.15, z: -0.64 },
157+ rotation: { x: 0, y: -71, z: 18 },
158+ origin: { x: 0.5, y: 0.1, z: 0.5 },
159+ scale: 0.75
160+ },
161+ groundTransform: {
162+ translation: { x: 0, y: 0, z: 0 },
163+ rotation: { x: 0, y: 0, z: 0 },
164+ origin: { x: 0.5, y: 0, z: 0.5 },
165+ scale: 4.8
166+ }
167+}
--- /dev/null
+++ b/AnvilMetalRecovery/assets/fma/shapes/item/shavings/metal_shavings.json
@@ -0,0 +1,86 @@
1+{
2+ "editor": {
3+ "allAngles": false,
4+ "singleTexture": false
5+ },
6+ "textureWidth": 16,
7+ "textureHeight": 16,
8+ "textures": {
9+ "metal": "game:block/metal/ingot/metal"
10+ },
11+ "elements": [
12+ {
13+ "name": "Shave1",
14+ "from": [ 8.0, 0.0, 8.0 ],
15+ "to": [ 9.0, 1.0, 9.0 ],
16+ "rotationOrigin": [ 8.0, 0.0, 8.0 ],
17+ "faces": {
18+ "north": { "texture": "#metal", "uv": [ 0.5, 1.5, 1.5, 2.5 ] },
19+ "east": { "texture": "#metal", "uv": [ 1.0, 1.5, 2.0, 2.5 ] },
20+ "south": { "texture": "#metal", "uv": [ 0.5, 0.0, 1.5, 1.0 ] },
21+ "west": { "texture": "#metal", "uv": [ 0.0, 2.0, 1.0, 3.0 ] },
22+ "up": { "texture": "#metal", "uv": [ 1.0, 1.5, 2.0, 2.5 ] },
23+ "down": { "texture": "#metal", "uv": [ 1.0, 1.5, 2.0, 2.5 ] }
24+ }
25+ },
26+ {
27+ "name": "Shave2",
28+ "from": [ 9.0, 0.0, 7.0 ],
29+ "to": [ 10.0, 1.0, 8.0 ],
30+ "rotationOrigin": [ 8.0, 0.0, 8.0 ],
31+ "rotationY": 45.0,
32+ "faces": {
33+ "north": { "texture": "#metal", "uv": [ 14.0, 13.5, 15.0, 14.5 ] },
34+ "east": { "texture": "#metal", "uv": [ 12.5, 14.5, 13.5, 15.5 ] },
35+ "south": { "texture": "#metal", "uv": [ 8.0, 4.0, 9.0, 5.0 ] },
36+ "west": { "texture": "#metal", "uv": [ 14.5, 1.0, 15.5, 2.0 ] },
37+ "up": { "texture": "#metal", "uv": [ 12.5, 4.5, 13.5, 5.5 ] },
38+ "down": { "texture": "#metal", "uv": [ 10.0, 9.0, 11.0, 10.0 ] }
39+ }
40+ },
41+ {
42+ "name": "Shave3",
43+ "from": [ 10.0, 0.0, 8.0 ],
44+ "to": [ 11.0, 1.0, 9.0 ],
45+ "rotationOrigin": [ 8.0, 0.0, 8.0 ],
46+ "rotationY": 22.5,
47+ "faces": {
48+ "north": { "texture": "#metal", "uv": [ 2.5, 3.0, 3.5, 4.0 ] },
49+ "east": { "texture": "#metal", "uv": [ 3.5, 3.0, 4.5, 4.0 ] },
50+ "south": { "texture": "#metal", "uv": [ 2.0, 4.5, 3.0, 5.5 ] },
51+ "west": { "texture": "#metal", "uv": [ 0.0, 6.5, 1.0, 7.5 ] },
52+ "up": { "texture": "#metal", "uv": [ 11.5, 5.0, 12.5, 6.0 ] },
53+ "down": { "texture": "#metal", "uv": [ 7.0, 10.5, 8.0, 11.5 ] }
54+ }
55+ },
56+ {
57+ "name": "Shave4",
58+ "from": [ 9.4, 0.0, 8.5 ],
59+ "to": [ 10.4, 1.0, 9.5 ],
60+ "rotationOrigin": [ 9.0, 0.0, 8.0 ],
61+ "rotationY": -7.0,
62+ "faces": {
63+ "north": { "texture": "#metal", "uv": [ 5.5, 4.5, 6.5, 5.5 ] },
64+ "east": { "texture": "#metal", "uv": [ 2.5, 4.0, 3.5, 5.0 ] },
65+ "south": { "texture": "#metal", "uv": [ 2.5, 5.0, 3.5, 6.0 ] },
66+ "west": { "texture": "#metal", "uv": [ 1.0, 5.0, 2.0, 6.0 ] },
67+ "up": { "texture": "#metal", "uv": [ 2.5, 5.0, 3.5, 6.0 ] },
68+ "down": { "texture": "#metal", "uv": [ 1.5, 1.0, 2.5, 2.0 ] }
69+ }
70+ },
71+ {
72+ "name": "Shave5",
73+ "from": [ 8.5, 1.0, 8.1 ],
74+ "to": [ 9.5, 2.0, 9.1 ],
75+ "rotationOrigin": [ 9.0, 1.0, 8.0 ],
76+ "rotationY": 8.0,
77+ "faces": {
78+ "north": { "texture": "#metal", "uv": [ 4.0, 5.0, 5.0, 6.0 ] },
79+ "east": { "texture": "#metal", "uv": [ 6.0, 7.5, 7.0, 8.5 ] },
80+ "south": { "texture": "#metal", "uv": [ 7.0, 9.5, 8.0, 10.5 ] },
81+ "west": { "texture": "#metal", "uv": [ 7.5, 8.5, 8.5, 9.5 ] },
82+ "up": { "texture": "#metal", "uv": [ 7.0, 6.0, 8.0, 7.0 ] },
83+ "down": { "texture": "#metal", "uv": [ 4.0, 1.5, 5.0, 2.5 ] }
84+ }
85+ }
86+ ]}
\ No newline at end of file
--- /dev/null
+++ b/AnvilMetalRecovery/modinfo.json
@@ -0,0 +1,12 @@
1+{
2+ "type": "code",
3+ "name": "Anvil Metal Recovery",
4+ "description" : "Get back that lost scrap and smithing discards!",
5+ "authors": ["Melchior"],
6+ "version": "0.1.0",
7+ "dependencies": {
8+ "game": "1.12.11",
9+ "survival": ""
10+ },
11+ "website": "http://nowebsite.nope"
12+}