First Machine Age's Mods (Combined repo.)
修订版 | 266e3e3fbc60bc37e3e76954998ebd35f1616c84 (tree) |
---|---|
时间 | 2021-05-04 06:17:02 |
作者 | melchior <melchior@user...> |
Commiter | melchior |
W.I.P. Almost working harmonized B.E.A.
@@ -72,7 +72,6 @@ | ||
72 | 72 | <ItemGroup> |
73 | 73 | <Compile Include="MetalRecoverySystem.cs" /> |
74 | 74 | <Compile Include="Properties\AssemblyInfo.cs" /> |
75 | - <Compile Include="BlockEntities\MetalRecovery_BlockEntityAnvil.cs" /> | |
76 | 75 | <Compile Include="Helpers.cs" /> |
77 | 76 | <Compile Include="EntityBehaviors\HotbarObserverBehavior.cs" /> |
78 | 77 | <Compile Include="EntityBehaviors\HotbarObserverData.cs" /> |
@@ -110,6 +109,7 @@ | ||
110 | 109 | <None Include="assets\fma\itemtypes\metal\fragments.json"> |
111 | 110 | <CopyToOutputDirectory>Always</CopyToOutputDirectory> |
112 | 111 | </None> |
112 | + <None Include="BlockEntities\MetalRecovery_BlockEntityAnvil.cs" /> | |
113 | 113 | </ItemGroup> |
114 | 114 | <ItemGroup> |
115 | 115 | <Folder Include="assets\" /> |
@@ -1,4 +1,5 @@ | ||
1 | 1 | using System; |
2 | +using System.Linq; | |
2 | 3 | using System.Text; |
3 | 4 | |
4 | 5 | using HarmonyLib; |
@@ -11,7 +12,7 @@ using Vintagestory.GameContent; | ||
11 | 12 | namespace AnvilMetalRecovery |
12 | 13 | { |
13 | 14 | /// <summary> |
14 | - /// Harmony patcher class to generate Bus-Events from Anvil, and other-effects | |
15 | + /// Harmony patcher class to wrap B.E. Anvil class | |
15 | 16 | /// </summary> |
16 | 17 | [HarmonyPatch(typeof(BlockEntityAnvil))] |
17 | 18 | public class AnvilDaptor |
@@ -21,9 +22,9 @@ namespace AnvilMetalRecovery | ||
21 | 22 | [HarmonyPatch(nameof(BlockEntityAnvil.OnSplit))] |
22 | 23 | private static void Prefix_OnSplit(Vec3i voxelPos, BlockEntityAnvil __instance) |
23 | 24 | { |
24 | - SmithAssist anvil = __instance as SmithAssist; | |
25 | + var anvil = new SmithAssist(__instance); | |
25 | 26 | |
26 | - if (anvil.IsShavable && anvil.Voxels[voxelPos.X, voxelPos.Y, voxelPos.Z] == ( byte )EnumVoxelMaterial.Metal) { | |
27 | + if (anvil.IsShavable && anvil.Voxel(voxelPos.X, voxelPos.Y, voxelPos.Z) == EnumVoxelMaterial.Metal) { | |
27 | 28 | #if DEBUG |
28 | 29 | anvil.Logger.VerboseDebug("Split some {0} @{1}, Total:{2}", anvil.BaseMetal, voxelPos, anvil.SplitCount); |
29 | 30 | #endif |
@@ -34,31 +35,53 @@ namespace AnvilMetalRecovery | ||
34 | 35 | |
35 | 36 | [HarmonyPostfix] |
36 | 37 | [HarmonyPatch(nameof(BlockEntityAnvil.GetBlockInfo))] |
37 | - private static void Postfix_GetBlockInfo(IPlayer forPlayer, StringBuilder dsc, BlockEntityAnvil __instance) | |
38 | + private static void Postfix_GetBlockInfo(IPlayer forPlayer, ref StringBuilder dsc, BlockEntityAnvil __instance) | |
38 | 39 | { |
39 | - SmithAssist anvil = __instance as SmithAssist; | |
40 | + var anvil = new SmithAssist(__instance); | |
40 | 41 | |
41 | - if (anvil.IsShavable && anvil.SplitCount > 0 && anvil.BaseMaterial != null) { | |
42 | - dsc.AppendFormat("[ {0} ÷ {1} ] = {2}", anvil.SplitCount, SmithAssist.splitValue, Lang.GetUnformatted($"fma:item-metal_shaving-{anvil.BaseMetal}")); | |
42 | + if (anvil.BaseMaterial != null && anvil.IsShavable && anvil.SplitCount > 0) | |
43 | + { | |
44 | + dsc.AppendFormat("[ {0} ÷ {1} ] : {2}", anvil.SplitCount, SmithAssist.shavingValue, Lang.GetUnformatted($"fma:item-metal_shaving-{anvil.BaseMetal}")); | |
45 | + } | |
43 | 46 | } |
44 | 47 | |
48 | + [HarmonyPrefix] | |
49 | + [HarmonyPatch(nameof(BlockEntityAnvil.CheckIfFinished))] | |
50 | + private static void Prefix_CheckIfFinished(IPlayer byPlayer, BlockEntityAnvil __instance) | |
51 | + { | |
52 | + var anvil = new SmithAssist(__instance); | |
53 | + if (anvil.WorkMatchesRecipe( )) | |
54 | + { | |
55 | + anvil.IssueShavings(byPlayer ); | |
56 | + } | |
45 | 57 | } |
46 | 58 | |
59 | + /* [HarmonyReversePatch] | |
60 | + private bool MatchesRecipe() //But faster? | |
61 | + */ | |
62 | + | |
47 | 63 | |
48 | 64 | } |
49 | 65 | |
50 | 66 | /// <summary> |
51 | 67 | /// Special tools for handling the Anvil's data/state, ect... |
52 | 68 | /// </summary> |
53 | - internal class SmithAssist : BlockEntityAnvil | |
69 | + internal class SmithAssist | |
54 | 70 | { |
71 | + private readonly BlockEntityAnvil bea; | |
72 | + | |
55 | 73 | internal const string splitCountKey = @"splitCount"; |
56 | - internal const uint splitValue = 5; | |
74 | + internal const uint shavingValue = 5; | |
75 | + | |
76 | + internal SmithAssist(BlockEntityAnvil a) | |
77 | + { | |
78 | + this.bea = a; | |
79 | + } | |
57 | 80 | |
58 | 81 | internal ILogger Logger { |
59 | 82 | get |
60 | 83 | { |
61 | - return Api.World.Logger; | |
84 | + return bea.Api.World.Logger; | |
62 | 85 | } |
63 | 86 | } |
64 | 87 |
@@ -69,15 +92,21 @@ namespace AnvilMetalRecovery | ||
69 | 92 | } |
70 | 93 | } |
71 | 94 | |
95 | + // public byte[,,] Voxels = new byte[16, 6, 16]; | |
96 | + internal EnumVoxelMaterial Voxel( int X , int Y , int Z ) | |
97 | + { | |
98 | + return (EnumVoxelMaterial)bea.Voxels[X, Y, Z]; | |
99 | + } | |
100 | + | |
72 | 101 | |
73 | 102 | internal int SplitCount { |
74 | 103 | get |
75 | 104 | { |
76 | - return this.WorkItemStack?.Attributes.TryGetInt(splitCountKey) ?? 0; | |
105 | + return bea.WorkItemStack?.Attributes.TryGetInt(splitCountKey) ?? 0; | |
77 | 106 | } |
78 | 107 | set |
79 | 108 | { |
80 | - this.WorkItemStack?.Attributes.SetInt(splitCountKey, value); | |
109 | + bea.WorkItemStack?.Attributes.SetInt(splitCountKey, value); | |
81 | 110 | } |
82 | 111 | } |
83 | 112 |
@@ -85,14 +114,14 @@ namespace AnvilMetalRecovery | ||
85 | 114 | get |
86 | 115 | { |
87 | 116 | //this.SelectedRecipe <-- things that are recoverable? |
88 | - return this.WorkItemStack?.Collectible?.FirstCodePart( ).Equals(@"ironbloom") == false; | |
117 | + return bea.WorkItemStack?.Collectible?.FirstCodePart( ).Equals(@"ironbloom") == false; | |
89 | 118 | } |
90 | 119 | } |
91 | 120 | |
92 | 121 | internal IAnvilWorkable AnvilWorkpiece { |
93 | 122 | get |
94 | 123 | { |
95 | - if (this.WorkItemStack != null && this.WorkItemStack.Collectible is IAnvilWorkable) { return this.WorkItemStack.Collectible as IAnvilWorkable; } | |
124 | + if (bea.WorkItemStack != null && bea.WorkItemStack.Collectible is IAnvilWorkable) { return bea.WorkItemStack.Collectible as IAnvilWorkable; } | |
96 | 125 | |
97 | 126 | return null; |
98 | 127 | } |
@@ -101,7 +130,7 @@ namespace AnvilMetalRecovery | ||
101 | 130 | internal ItemStack BaseMaterial { |
102 | 131 | get |
103 | 132 | { |
104 | - if (this.WorkItemStack != null) return AnvilWorkpiece.GetBaseMaterial(this.WorkItemStack);//Right?? | |
133 | + if (bea.WorkItemStack != null) return AnvilWorkpiece.GetBaseMaterial(bea.WorkItemStack);//Right?? | |
105 | 134 | return null; |
106 | 135 | } |
107 | 136 | } |
@@ -112,6 +141,63 @@ namespace AnvilMetalRecovery | ||
112 | 141 | return this?.BaseMaterial?.Collectible.LastCodePart( ); |
113 | 142 | } |
114 | 143 | } |
144 | + | |
145 | + internal int MetalVoxelCount { | |
146 | + get { return bea.Voxels.OfType<byte>( ).Count(vox => vox == (byte)EnumVoxelMaterial.Metal); } | |
147 | + } | |
148 | + | |
149 | + | |
150 | + internal void IssueShavings(IPlayer byPlayer ) | |
151 | + { | |
152 | + if (this.SplitCount > 0) { | |
153 | + int shavingsCount = ( int )(SplitCount / shavingValue); | |
154 | + | |
155 | + if (shavingsCount > 0) | |
156 | + { | |
157 | + #if DEBUG | |
158 | + Logger.VerboseDebug("RecoveryAnvil: Smithing done - recover: {0} shavings of {1}", shavingsCount, BaseMaterial); | |
159 | + #endif | |
160 | + | |
161 | + Item metalShavingsItem = bea.Api.World.GetItem(MetalShavingsCode.WithPathAppendix("-" + BaseMaterial)); | |
162 | + | |
163 | + if (metalShavingsItem != null) | |
164 | + { | |
165 | + ItemStack metalShavingsStack = new ItemStack(metalShavingsItem, shavingsCount); | |
166 | + | |
167 | + if (byPlayer != null) { | |
168 | + if (byPlayer.InventoryManager.TryGiveItemstack(metalShavingsStack, false) == false) { byPlayer.Entity.World.SpawnItemEntity(metalShavingsStack, byPlayer.Entity.Pos.XYZ); } | |
169 | + } | |
170 | + } | |
171 | + else | |
172 | + { | |
173 | + Logger.Warning("Missing or Invalid Item: {0} ", MetalShavingsCode.WithPathAppendix("-" + BaseMaterial)); | |
174 | + } | |
175 | + this.SplitCount = 0; | |
176 | + } | |
177 | + } | |
178 | + } | |
179 | + | |
180 | + /// <summary> | |
181 | + /// Copy-Paste, from 'BEAnvil.cs' | |
182 | + /// </summary> | |
183 | + /// <returns>The matches recipe.</returns> | |
184 | + internal bool WorkMatchesRecipe() | |
185 | + { | |
186 | + if (bea.SelectedRecipe == null) return false; | |
187 | + | |
188 | + int ymax = Math.Min(6, bea.SelectedRecipe.QuantityLayers);//Why ignore higher layers? | |
189 | + | |
190 | + var theRecipie = bea.recipeVoxels; //RotatedRecipeVoxels | |
191 | + | |
192 | + for (int x = 0; x < 16; x++) { | |
193 | + for (int y = 0; y < ymax; y++) { | |
194 | + for (int z = 0; z < 16; z++) { | |
195 | + byte desiredMat = ( byte )(theRecipie[x, y, z] ? EnumVoxelMaterial.Metal : EnumVoxelMaterial.Empty); | |
196 | + | |
197 | + if (bea.Voxels[x, y, z] != desiredMat) { return false; } } } } | |
198 | + | |
199 | + return true; | |
200 | + } | |
115 | 201 | } |
116 | 202 | } |
117 | 203 |
@@ -27,13 +27,13 @@ namespace AnvilMetalRecovery | ||
27 | 27 | |
28 | 28 | protected void RegenerateCombustablePropsByVariant(ItemSlot slot) |
29 | 29 | { |
30 | - if (this.CombustibleProps != null || slot.Itemstack.Collectible.CombustibleProps != null) return; | |
30 | + if (this.CombustibleProps != null || ( slot.Empty == false && slot.Itemstack.Collectible.CombustibleProps != null)) return; | |
31 | 31 | |
32 | 32 | var ingotAssetCode = _ingotPrefix.AppendPathVariant(Metal);//Wildcard find? excluding domain? |
33 | 33 | var ingotEntry = api.World.GetItem(ingotAssetCode); |
34 | 34 | var metalSmeltProps = ingotEntry?.CombustibleProps?.Clone( ); |
35 | 35 | |
36 | - if (metalSmeltProps != null) | |
36 | + if ((ingotEntry != null || !ingotEntry.IsMissing) && metalSmeltProps != null) | |
37 | 37 | { |
38 | 38 | metalSmeltProps.SmeltedRatio = Ratio; |
39 | 39 |
@@ -46,7 +46,7 @@ namespace AnvilMetalRecovery | ||
46 | 46 | else |
47 | 47 | { |
48 | 48 | #if DEBUG |
49 | - api.Logger.VerboseDebug("Non-existant Ingot: {0}", ingotAssetCode.ToString( )); | |
49 | + api.Logger.VerboseDebug("Non-existant Ingot or C.Props: {0}", ingotAssetCode.ToString( )); | |
50 | 50 | #endif |
51 | 51 | } |
52 | 52 | } |
@@ -42,7 +42,7 @@ namespace AnvilMetalRecovery | ||
42 | 42 | protected string MetalName(ItemStack itemStack) |
43 | 43 | { |
44 | 44 | //TODO: generic 'material' Language entries... |
45 | - if (itemStack == null || itemStack.Attributes == null) return String.Empty; | |
45 | + if (itemStack == null || itemStack.Attributes == null) return @"?"; | |
46 | 46 | var sliced = Lang.GetUnformatted("item-"+MetalCode(itemStack).Path).Split(' '); |
47 | 47 | return String.Join(" ", sliced.Take(sliced.Length - 1)); |
48 | 48 | } |
@@ -129,7 +129,7 @@ namespace AnvilMetalRecovery | ||
129 | 129 | |
130 | 130 | public override void OnModifiedInInventorySlot(IWorldAccessor world, ItemSlot slot, ItemStack extractedStack = null) |
131 | 131 | { |
132 | - RegenerateCombustablePropsFromStack(slot.Itemstack); | |
132 | + if (!slot.Empty) RegenerateCombustablePropsFromStack(slot.Itemstack); | |
133 | 133 | } |
134 | 134 | |
135 | 135 | //Merge (same) metal piles together? Upto 100 units. |
@@ -155,8 +155,10 @@ namespace AnvilMetalRecovery | ||
155 | 155 | |
156 | 156 | if (metalCode != null ) |
157 | 157 | { |
158 | - var sourceMetalItem = api.World.GetItem(metalCode); | |
159 | - | |
158 | + var sourceMetalItem = api.World.GetItem(metalCode); | |
159 | + | |
160 | + if (sourceMetalItem == null || sourceMetalItem.IsMissing || sourceMetalItem.CombustibleProps == null) return; | |
161 | + | |
160 | 162 | CombustibleProps = new CombustibleProperties( ) { |
161 | 163 | SmeltingType = EnumSmeltType.Smelt, |
162 | 164 | MeltingPoint = sourceMetalItem.CombustibleProps.MeltingPoint, |
@@ -169,7 +171,7 @@ namespace AnvilMetalRecovery | ||
169 | 171 | contStack.Collectible.CombustibleProps = CombustibleProps.Clone( ); |
170 | 172 | |
171 | 173 | #if DEBUG |
172 | - api.Logger.VerboseDebug("Melt point: {0}, Duration: {1}, Ratio: {2}, Out.stk: {3} * {4}", this.CombustibleProps.MeltingPoint,this.CombustibleProps.MeltingDuration,this.CombustibleProps.SmeltedRatio, this.CombustibleProps.SmeltedStack.ResolvedItemstack.Item.Code.ToString(),this.CombustibleProps.SmeltedStack.StackSize ); | |
174 | + api.Logger.VerboseDebug("Melt point: {0}, Duration: {1}, Ratio: {2}, Out.stk: {3} * {4}", this.CombustibleProps.MeltingPoint,this.CombustibleProps.MeltingDuration,this.CombustibleProps.SmeltedRatio, this.CombustibleProps.SmeltedStack.ResolvedItemstack.Item.Code.ToString(),this.CombustibleProps.SmeltedStack.StackSize ); | |
173 | 175 | #endif |
174 | 176 | } |
175 | 177 |
@@ -1,16 +1,13 @@ | ||
1 | -using System; | |
2 | -using System.Collections.Generic; | |
1 | +using System.Collections.Generic; | |
3 | 2 | using System.Linq; |
4 | -using System.Linq.Expressions; | |
3 | + | |
4 | +using HarmonyLib; | |
5 | 5 | |
6 | 6 | using Vintagestory.API.Client; |
7 | 7 | using Vintagestory.API.Common; |
8 | -using Vintagestory.API.Datastructures; | |
9 | 8 | using Vintagestory.API.Server; |
10 | 9 | using Vintagestory.Client.NoObf; |
11 | -using Vintagestory.Common; | |
12 | 10 | using Vintagestory.Server; |
13 | -using Vintagestory.ServerMods; | |
14 | 11 | |
15 | 12 | namespace AnvilMetalRecovery |
16 | 13 | { |
@@ -71,7 +68,11 @@ namespace AnvilMetalRecovery | ||
71 | 68 | |
72 | 69 | RegisterItemMappings( ); |
73 | 70 | |
74 | - //TODO: Setup HARMONY Patches | |
71 | + #if DEBUG | |
72 | + //Harmony.DEBUG = true; | |
73 | + #endif | |
74 | + var harmony = new Harmony(this.Mod.Info.ModID); | |
75 | + harmony.PatchAll( ); | |
75 | 76 | |
76 | 77 | base.Start(api); |
77 | 78 | } |
@@ -89,9 +90,7 @@ namespace AnvilMetalRecovery | ||
89 | 90 | return; |
90 | 91 | } |
91 | 92 | |
92 | - //ServerAPI.ClassRegistry.GetBlockEntityClass | |
93 | - //ServerAPI.RegisterBlockEntityClass(anvilKey, typeof(MetalRecovery_BlockEntityAnvil)); | |
94 | - ServerCore.ClassRegistryNative.ReplaceBlockEntityType(anvilKey, typeof(MetalRecovery_BlockEntityAnvil)); | |
93 | + //ServerCore.ClassRegistryNative.ReplaceBlockEntityType(anvilKey, typeof(MetalRecovery_BlockEntityAnvil)); | |
95 | 94 | |
96 | 95 | ServerCore.Event.ServerRunPhase(EnumServerRunPhase.GameReady, MaterialDataGathering); |
97 | 96 |
@@ -118,7 +117,7 @@ namespace AnvilMetalRecovery | ||
118 | 117 | return; |
119 | 118 | } |
120 | 119 | |
121 | - ClientCore.ClassRegistryNative.ReplaceBlockEntityType(anvilKey, typeof(MetalRecovery_BlockEntityAnvil)); | |
120 | + //ClientCore.ClassRegistryNative.ReplaceBlockEntityType(anvilKey, typeof(MetalRecovery_BlockEntityAnvil)); | |
122 | 121 | |
123 | 122 | Mod.Logger.VerboseDebug("Anvil Metal Recovery - should be installed..."); |
124 | 123 | } |
@@ -8,7 +8,7 @@ | ||
8 | 8 | "textureSizes": { |
9 | 9 | }, |
10 | 10 | "textures": { |
11 | - "metal": "game:block/metal/plate/copper" | |
11 | + "metal": "block/metal/ingot/lead" | |
12 | 12 | }, |
13 | 13 | "elements": [ |
14 | 14 | { |
@@ -16,12 +16,12 @@ | ||
16 | 16 | "from": [ 5.0, 0.0, 5.0 ], |
17 | 17 | "to": [ 9.0, 2.0, 8.0 ], |
18 | 18 | "faces": { |
19 | - "north": { "texture": "#metal", "uv": [ 0.0, 0.0, 4.0, 2.0 ] }, | |
20 | - "east": { "texture": "#metal", "uv": [ 0.0, 0.0, 3.0, 2.0 ] }, | |
21 | - "south": { "texture": "#metal", "uv": [ 0.0, 0.0, 4.0, 2.0 ] }, | |
22 | - "west": { "texture": "#metal", "uv": [ 0.0, 0.0, 3.0, 2.0 ] }, | |
23 | - "up": { "texture": "#metal", "uv": [ 0.0, 0.0, 4.0, 3.0 ] }, | |
24 | - "down": { "texture": "#metal", "uv": [ 0.0, 0.0, 4.0, 3.0 ] } | |
19 | + "north": { "texture": "#metal", "uv": [ 1.0, 2.5, 5.0, 4.5 ] }, | |
20 | + "east": { "texture": "#metal", "uv": [ 5.5, 5.5, 8.5, 7.5 ] }, | |
21 | + "south": { "texture": "#metal", "uv": [ 8.5, 3.0, 12.5, 5.0 ] }, | |
22 | + "west": { "texture": "#metal", "uv": [ 10.0, 7.0, 13.0, 9.0 ] }, | |
23 | + "up": { "texture": "#metal", "uv": [ 7.0, 8.5, 11.0, 11.5 ] }, | |
24 | + "down": { "texture": "#metal", "uv": [ 8.0, 3.0, 12.0, 6.0 ] } | |
25 | 25 | }, |
26 | 26 | "children": [ |
27 | 27 | { |
@@ -32,12 +32,12 @@ | ||
32 | 32 | "rotationX": 51.0, |
33 | 33 | "rotationY": 3.0, |
34 | 34 | "faces": { |
35 | - "north": { "texture": "#metal", "uv": [ 0.0, 0.0, 8.0, 1.0 ] }, | |
36 | - "east": { "texture": "#metal", "uv": [ 0.0, 0.0, 1.0, 1.0 ] }, | |
37 | - "south": { "texture": "#metal", "uv": [ 0.0, 0.0, 8.0, 1.0 ] }, | |
38 | - "west": { "texture": "#metal", "uv": [ 0.0, 0.0, 1.0, 1.0 ] }, | |
39 | - "up": { "texture": "#metal", "uv": [ 0.0, 0.0, 8.0, 1.0 ] }, | |
40 | - "down": { "texture": "#metal", "uv": [ 0.0, 0.0, 8.0, 1.0 ] } | |
35 | + "north": { "texture": "#metal", "uv": [ 7.5, 12.5, 15.5, 13.5 ] }, | |
36 | + "east": { "texture": "#metal", "uv": [ 7.0, 8.0, 8.0, 9.0 ] }, | |
37 | + "south": { "texture": "#metal", "uv": [ 1.5, 3.0, 9.5, 4.0 ] }, | |
38 | + "west": { "texture": "#metal", "uv": [ 6.5, 6.0, 7.5, 7.0 ] }, | |
39 | + "up": { "texture": "#metal", "uv": [ 4.0, 4.5, 12.0, 5.5 ] }, | |
40 | + "down": { "texture": "#metal", "uv": [ 2.5, 6.5, 10.5, 7.5 ] } | |
41 | 41 | } |
42 | 42 | }, |
43 | 43 | { |
@@ -78,12 +78,12 @@ | ||
78 | 78 | "rotationX": -14.0, |
79 | 79 | "rotationZ": -25.0, |
80 | 80 | "faces": { |
81 | - "north": { "texture": "#metal", "uv": [ 0.0, 0.0, 1.5, 1.5 ] }, | |
82 | - "east": { "texture": "#metal", "uv": [ 0.0, 0.0, 6.0, 1.5 ] }, | |
83 | - "south": { "texture": "#metal", "uv": [ 0.0, 0.0, 1.5, 1.5 ] }, | |
84 | - "west": { "texture": "#metal", "uv": [ 0.0, 0.0, 6.0, 1.5 ] }, | |
85 | - "up": { "texture": "#metal", "uv": [ 0.0, 0.0, 1.5, 6.0 ] }, | |
86 | - "down": { "texture": "#metal", "uv": [ 0.0, 0.0, 1.5, 6.0 ] } | |
81 | + "north": { "texture": "#metal", "uv": [ 9.5, 3.5, 11.0, 5.0 ] }, | |
82 | + "east": { "texture": "#metal", "uv": [ 5.5, 5.5, 11.5, 7.0 ] }, | |
83 | + "south": { "texture": "#metal", "uv": [ 8.5, 9.5, 10.0, 11.0 ] }, | |
84 | + "west": { "texture": "#metal", "uv": [ 5.0, 7.0, 11.0, 8.5 ] }, | |
85 | + "up": { "texture": "#metal", "uv": [ 12.0, 5.5, 13.5, 11.5 ] }, | |
86 | + "down": { "texture": "#metal", "uv": [ 1.0, 5.5, 2.5, 11.5 ] } | |
87 | 87 | } |
88 | 88 | }, |
89 | 89 | { |
@@ -93,12 +93,12 @@ | ||
93 | 93 | "rotationOrigin": [ -1.0, 0.0, -1.0 ], |
94 | 94 | "rotationY": -53.0, |
95 | 95 | "faces": { |
96 | - "north": { "texture": "#metal", "uv": [ 0.0, 0.0, 0.5, 0.5 ] }, | |
97 | - "east": { "texture": "#metal", "uv": [ 0.0, 0.0, 3.5, 0.5 ] }, | |
98 | - "south": { "texture": "#metal", "uv": [ 0.0, 0.0, 0.5, 0.5 ] }, | |
99 | - "west": { "texture": "#metal", "uv": [ 0.0, 0.0, 3.5, 0.5 ] }, | |
100 | - "up": { "texture": "#metal", "uv": [ 0.0, 0.0, 0.5, 3.5 ] }, | |
101 | - "down": { "texture": "#metal", "uv": [ 0.0, 0.0, 0.5, 3.5 ] } | |
96 | + "north": { "texture": "#metal", "uv": [ 3.5, 3.0, 4.0, 3.5 ] }, | |
97 | + "east": { "texture": "#metal", "uv": [ 7.5, 5.0, 11.0, 5.5 ] }, | |
98 | + "south": { "texture": "#metal", "uv": [ 4.5, 4.5, 5.0, 5.0 ] }, | |
99 | + "west": { "texture": "#metal", "uv": [ 7.0, 7.0, 10.5, 7.5 ] }, | |
100 | + "up": { "texture": "#metal", "uv": [ 6.5, 9.0, 7.0, 12.5 ] }, | |
101 | + "down": { "texture": "#metal", "uv": [ 6.0, 6.5, 6.5, 10.0 ] } | |
102 | 102 | } |
103 | 103 | }, |
104 | 104 | { |
@@ -169,11 +169,11 @@ | ||
169 | 169 | "rotationY": 174.0, |
170 | 170 | "faces": { |
171 | 171 | "north": { "texture": "#metal", "uv": [ 0.0, 0.0, 0.5, 0.5 ] }, |
172 | - "east": { "texture": "#metal", "uv": [ 0.0, 0.0, 3.5, 0.5 ] }, | |
172 | + "east": { "texture": "#metal", "uv": [ 5.5, 3.5, 9.0, 4.0 ] }, | |
173 | 173 | "south": { "texture": "#metal", "uv": [ 0.0, 0.0, 0.5, 0.5 ] }, |
174 | - "west": { "texture": "#metal", "uv": [ 0.0, 0.0, 3.5, 0.5 ] }, | |
175 | - "up": { "texture": "#metal", "uv": [ 0.0, 0.0, 0.5, 3.5 ] }, | |
176 | - "down": { "texture": "#metal", "uv": [ 0.0, 0.0, 0.5, 3.5 ] } | |
174 | + "west": { "texture": "#metal", "uv": [ 4.5, 6.0, 8.0, 6.5 ] }, | |
175 | + "up": { "texture": "#metal", "uv": [ 6.5, 9.0, 7.0, 12.5 ] }, | |
176 | + "down": { "texture": "#metal", "uv": [ 4.5, 5.5, 5.0, 9.0 ] } | |
177 | 177 | } |
178 | 178 | }, |
179 | 179 | { |