Carbon Copy plugin for VS
修訂 | 86d1411ba92f0116f2dd57ab46892518934e7a2a (tree) |
---|---|
時間 | 2020-04-17 06:48:12 |
作者 | melchior <melchior@user...> |
Commiter | melchior |
Version update; items export list V0.1.4
@@ -60,9 +60,11 @@ | ||
60 | 60 | <ItemGroup> |
61 | 61 | <Compile Include="CarbonCopyMod.cs" /> |
62 | 62 | <Compile Include="Properties\AssemblyInfo.cs" /> |
63 | + <Compile Include="ClientCommands\CarbonCopyCommand.cs" /> | |
63 | 64 | </ItemGroup> |
64 | 65 | <ItemGroup> |
65 | 66 | <Folder Include="VS_Libs\" /> |
67 | + <Folder Include="ClientCommands\" /> | |
66 | 68 | </ItemGroup> |
67 | 69 | <ItemGroup> |
68 | 70 | <None Include="modinfo.json"> |
@@ -1,7 +1,7 @@ | ||
1 | 1 | using System; |
2 | - | |
3 | 2 | using System.Collections.Generic; |
4 | 3 | using System.IO; |
4 | + | |
5 | 5 | using Vintagestory.API.Client; |
6 | 6 | using Vintagestory.API.Common; |
7 | 7 | using Vintagestory.API.Common.Entities; |
@@ -9,256 +9,35 @@ using Vintagestory.API.Config; | ||
9 | 9 | using Vintagestory.API.MathTools; |
10 | 10 | using Vintagestory.API.Server; |
11 | 11 | |
12 | -namespace VCMiscMods | |
12 | +namespace CarbonCopy | |
13 | 13 | { |
14 | 14 | public class CarbonCopyMod : ModSystem |
15 | 15 | { |
16 | - private const int _highlightSlot = 42; | |
17 | - private const string _exportPath = @"Exports"; | |
18 | 16 | |
19 | 17 | private ICoreAPI API { get; set; } |
20 | 18 | private ICoreServerAPI ServerAPI { get; set; } |
21 | 19 | private ICoreClientAPI ClientAPI { get; set; } |
22 | 20 | |
23 | - private BlockPos start; | |
24 | - private BlockPos end; | |
25 | - private bool validSelection; | |
26 | - private List<BlockPos> markedBlocks; | |
27 | - private List<int> colorList; | |
28 | 21 | |
29 | - public CarbonCopyMod() | |
30 | - { | |
31 | - this.markedBlocks = new List<BlockPos>( ); | |
32 | - this.colorList = new List<int> { ColorUtil.ToRgba(180, 0, 195, 0) }; | |
33 | - } | |
34 | 22 | |
35 | 23 | public override bool ShouldLoad(EnumAppSide forSide) |
36 | 24 | { |
37 | - return forSide.IsClient(); | |
25 | + return forSide.IsClient( ); | |
38 | 26 | } |
39 | 27 | |
40 | 28 | public override void StartClientSide(ICoreClientAPI api) |
41 | - { | |
42 | - this.API = api; | |
43 | - this.ClientAPI = api as ICoreClientAPI; | |
44 | - | |
45 | - if (api.Side == EnumAppSide.Client) { | |
46 | - | |
47 | - ClientAPI.RegisterCommand("export", "Export Carbon copies of selections locally.", "mark: start/end/ (x/y/z), save [name], clear", CarbonCopyCommand); | |
48 | - Mod.Logger.Notification("Registered Carbon Copy command (export)"); | |
49 | - | |
50 | - } | |
51 | - | |
52 | - base.StartClientSide(api); | |
53 | - } | |
54 | - | |
55 | - /* .export | |
56 | - * mark | |
57 | - * mark start | |
58 | - * mark end | |
59 | - * mark start x+1 | |
60 | - * mark end y-1 | |
61 | - * mark start z+20 | |
62 | - * mark clear | |
63 | - * save {NAME} | |
64 | - * | |
65 | - * | |
66 | - */ | |
67 | - | |
68 | - private void CarbonCopyCommand(int groupId, CmdArgs args) | |
69 | - { | |
70 | - if (args.Length > 0) { | |
71 | - string command = args.PopWord( ); | |
72 | - | |
73 | - switch (command) { | |
74 | - | |
75 | - case "mark": | |
76 | - | |
77 | - Process_MarkSubcommand(args); | |
78 | - | |
79 | - break; | |
80 | - | |
81 | - case "save": | |
82 | - if (validSelection) { | |
83 | - var filename = args.PopWord("export_" + Math.Round(DateTime.UtcNow.TimeOfDay.TotalSeconds)); | |
84 | - Process_SaveCommand(filename); | |
85 | - } | |
86 | - break; | |
87 | - | |
88 | - case "clear": | |
89 | - Process_ClearCommand( ); | |
90 | - break; | |
91 | - | |
92 | - case "dumpblocklist": | |
93 | - Dump_BlockList( ); | |
94 | - break; | |
95 | - | |
96 | - default: | |
97 | - ClientAPI.ShowChatMessage("Wrong argument? mark/save/clear"); | |
98 | - break; | |
99 | - } | |
100 | - } else { | |
101 | - ClientAPI.ShowChatMessage("Need arguments; must be: mark/save/clear"); | |
102 | - } | |
103 | - } | |
104 | - | |
105 | - private void Process_MarkSubcommand(CmdArgs args ) | |
106 | - { | |
107 | - if (args.Length > 0) { | |
108 | - string subCommand = args.PopWord( ).ToLowerInvariant( ); | |
109 | - | |
110 | - | |
111 | - switch (subCommand) { | |
112 | - case "start": | |
113 | - if (this.start == null) { | |
114 | - this.start = ClientAPI.World.Player.Entity.LocalPos.AsBlockPos.Copy( ); | |
115 | - } | |
116 | - BendBlockPosition(this.start, args); | |
117 | - | |
118 | - ClientAPI.ShowChatMessage(string.Format("Marked start; ({0}).", start)); | |
119 | - break; | |
120 | - | |
121 | - case "end": | |
122 | - if (this.end == null) { | |
123 | - this.end = ClientAPI.World.Player.Entity.LocalPos.AsBlockPos.Copy( ); | |
124 | - } | |
125 | - BendBlockPosition(this.end, args); | |
126 | - | |
127 | - ClientAPI.ShowChatMessage(string.Format("Marked end; ({0}).", end)); | |
128 | - break; | |
129 | - | |
130 | - default: | |
131 | - ClientAPI.ShowChatMessage("Mark: start or end ?"); | |
132 | - break; | |
133 | - } | |
134 | - | |
135 | - this.validSelection = false; | |
136 | - | |
137 | - if (this.start != null && | |
138 | - this.end != null && | |
139 | - ClientAPI.World.BulkBlockAccessor.IsValidPos(this.start) && | |
140 | - ClientAPI.World.BulkBlockAccessor.IsValidPos(this.end) | |
141 | - ) { | |
142 | - | |
143 | - //Calc. Vol: | |
144 | - var size = start.DistanceTo(end); | |
145 | - | |
146 | - if (size > 1) { | |
147 | - | |
148 | - this.validSelection = true; | |
149 | - | |
150 | - this.markedBlocks.Clear( ); | |
151 | - | |
152 | - ClientAPI.World.BulkBlockAccessor.WalkBlocks(start, end, addToMarked); | |
153 | - | |
154 | - ClientAPI.World.HighlightBlocks(ClientAPI.World.Player, _highlightSlot, this.markedBlocks, colorList, EnumHighlightBlocksMode.Absolute, EnumHighlightShape.Arbitrary); | |
155 | - | |
156 | - ClientAPI.ShowChatMessage(string.Format("Marked area: {0:f1}diag = {1} blocks", size, markedBlocks.Count)); | |
157 | - } | |
158 | - else { | |
159 | - ClientAPI.ShowChatMessage("Marked area: volume too small"); ; | |
160 | - } | |
161 | - } | |
162 | - } | |
163 | - else { | |
164 | - ClientAPI.ShowChatMessage("Mark: start / end (x,y,z +-1#)"); | |
165 | - } | |
166 | - | |
167 | - } | |
168 | - | |
169 | - private void BendBlockPosition(BlockPos position, CmdArgs args) | |
170 | - { | |
171 | - char? axis = args.PopChar( ); | |
172 | - int? offset = args.PopInt( ); | |
173 | - | |
174 | - if (axis.HasValue && offset.HasValue) { | |
175 | - switch (Char.ToLowerInvariant(axis.Value)) { | |
176 | - | |
177 | - case 'x': | |
178 | - ClientAPI.ShowChatMessage(string.Format("applied X offset {0},", offset.Value)); | |
179 | - position.Add(dx:offset.Value, dy:0, dz:0); | |
180 | - break; | |
181 | - | |
182 | - case 'y': | |
183 | - ClientAPI.ShowChatMessage(string.Format("applied Y offset {0},", offset.Value)); | |
184 | - position.Add(dx:0, dy:offset.Value, dz:0); | |
185 | - break; | |
186 | - | |
187 | - case 'z': | |
188 | - ClientAPI.ShowChatMessage(string.Format("applied Z offset {0},", offset.Value)); | |
189 | - position.Add(dx:0, dy:0, dz:offset.Value); | |
190 | - break; | |
191 | - | |
192 | - default: | |
193 | - //Nothing to do. | |
194 | - break; | |
195 | - }} | |
196 | - } | |
197 | - | |
198 | - private void addToMarked(Block aBlock, BlockPos aPos) | |
199 | - { | |
200 | - this.markedBlocks.Add(aPos.Copy()); | |
201 | - } | |
202 | - | |
203 | - private void Process_SaveCommand(string filename) | |
204 | - { | |
205 | - if (validSelection) { | |
206 | - | |
207 | - BlockSchematic blockExport = new BlockSchematic( ); | |
208 | - | |
209 | - blockExport.Init(ClientAPI.World.BlockAccessor); | |
210 | - | |
211 | - blockExport.AddArea(ClientAPI.World, this.start, this.end); | |
212 | - | |
213 | - if (blockExport.Pack(ClientAPI.World, this.start))//What should start Be? | |
214 | - { | |
215 | - ClientAPI.ShowChatMessage(string.Format("Export packed OK: {0} Blocks {1} Entities {2} BlockEntity", blockExport.BlockIds.Count, blockExport.Entities.Count, blockExport.BlockEntities.Count)); | |
216 | - | |
217 | - filename = Path.Combine(ClientAPI.GetOrCreateDataPath(_exportPath), filename); | |
218 | - | |
219 | - blockExport.Save(filename); | |
220 | - | |
221 | - Process_ClearCommand( ); | |
222 | - } else { | |
223 | - ClientAPI.ShowChatMessage("Error; can't pack for export..."); | |
224 | - } | |
225 | - } | |
226 | - } | |
227 | - | |
228 | - | |
229 | - private void Process_ClearCommand( ) | |
230 | 29 | { |
231 | - this.start = null; | |
232 | - this.end = null; | |
233 | - this.validSelection = false; | |
234 | - this.markedBlocks.Clear( ); | |
235 | - ClientAPI.World.HighlightBlocks(ClientAPI.World.Player, _highlightSlot, this.markedBlocks, EnumHighlightBlocksMode.Absolute, EnumHighlightShape.Arbitrary); | |
30 | + this.API = api; | |
31 | + this.ClientAPI = api as ICoreClientAPI; | |
236 | 32 | |
237 | - ClientAPI.ShowChatMessage("Mark(s) Cleared."); | |
238 | - } | |
239 | - | |
240 | - private void Dump_BlockList( ) | |
241 | - { | |
242 | - var filename = Path.Combine(ClientAPI.GetOrCreateDataPath(_exportPath), "vs_block_list_export_" + GameVersion.OverallVersion + ".tsv"); | |
243 | - | |
244 | - using (StreamWriter reporter = new StreamWriter(filename)) { | |
245 | - | |
246 | - reporter.WriteLine("MC Block Name\tVS Block Name\tVS ID#\tMaterial\t"); | |
247 | - | |
248 | - foreach (var block in ClientAPI.World.Blocks) { | |
249 | - if (block.Id != 0 && !block.IsMissing && block.Code.Domain == GlobalConstants.DefaultDomain) { | |
250 | - reporter.WriteLine($"<FILL>\t{block.Code.Path}\t{block.BlockId}\t{block.BlockMaterial}"); | |
33 | + if (api.Side == EnumAppSide.Client) { | |
251 | 34 | |
35 | + ClientAPI.RegisterCommand(new CarbonCopyCommand(ClientAPI)); | |
36 | + Mod.Logger.Notification("Registered Carbon Copy command (export)"); | |
252 | 37 | } |
253 | 38 | |
39 | + base.StartClientSide(api); | |
254 | 40 | } |
255 | - | |
256 | - reporter.Flush( ); | |
257 | - } | |
258 | - | |
259 | - ClientAPI.ShowChatMessage("Created Block List...."); | |
260 | - } | |
261 | - | |
262 | 41 | } |
263 | 42 | } |
264 | 43 |
@@ -0,0 +1,278 @@ | ||
1 | +using System; | |
2 | +using System.Collections.Generic; | |
3 | +using System.IO; | |
4 | + | |
5 | +using Vintagestory.API.Client; | |
6 | +using Vintagestory.API.Common; | |
7 | +using Vintagestory.API.Config; | |
8 | +using Vintagestory.API.MathTools; | |
9 | + | |
10 | +namespace CarbonCopy | |
11 | +{ | |
12 | + public class CarbonCopyCommand : ClientChatCommand | |
13 | + { | |
14 | + private const int _highlightSlot = 42; | |
15 | + private const string _exportPath = @"Exports"; | |
16 | + private const string _name = @"export"; | |
17 | + | |
18 | + private ICoreClientAPI ClientAPI { get; set; } | |
19 | + private ILogger Logger { get; set; } | |
20 | + | |
21 | + private BlockPos start; | |
22 | + private BlockPos end; | |
23 | + private bool validSelection; | |
24 | + private List<BlockPos> markedBlocks; | |
25 | + private List<int> colorList; | |
26 | + | |
27 | + public CarbonCopyCommand( ) | |
28 | + { | |
29 | + this.markedBlocks = new List<BlockPos>( ); | |
30 | + this.colorList = new List<int> { ColorUtil.ToRgba(180, 0, 195, 0) }; | |
31 | + } | |
32 | + | |
33 | + public CarbonCopyCommand(ICoreClientAPI clientAPI) | |
34 | + { | |
35 | + this.Command = _name; | |
36 | + this.Syntax = @"mark: start/end/ (x/y/z), save [name], clear; dump {items/blocks}"; | |
37 | + this.Description = "Export crbon-copies of block selections locally.(as 'mex' file)"; | |
38 | + | |
39 | + ClientAPI = clientAPI; | |
40 | + Logger = clientAPI.Logger; | |
41 | + } | |
42 | + | |
43 | + | |
44 | + | |
45 | + /* .export | |
46 | + * mark | |
47 | + * mark start | |
48 | + * mark end | |
49 | + * mark start x+1 | |
50 | + * mark end y-1 | |
51 | + * mark start z+20 | |
52 | + * mark clear | |
53 | + * save {NAME} | |
54 | + * | |
55 | + * | |
56 | + */ | |
57 | + | |
58 | + public override void CallHandler(IPlayer player, int groupId, CmdArgs args) | |
59 | + { | |
60 | + if (args.Length > 0) { | |
61 | + string command = args.PopWord( ); | |
62 | + | |
63 | + switch (command) { | |
64 | + | |
65 | + case "mark": | |
66 | + | |
67 | + Process_MarkSubcommand(args); | |
68 | + | |
69 | + break; | |
70 | + | |
71 | + case "save": | |
72 | + if (validSelection) { | |
73 | + var filename = args.PopWord("export_" + Math.Round(DateTime.UtcNow.TimeOfDay.TotalSeconds)); | |
74 | + Process_SaveCommand(filename); | |
75 | + } | |
76 | + break; | |
77 | + | |
78 | + case "clear": | |
79 | + Process_ClearCommand( ); | |
80 | + break; | |
81 | + | |
82 | + case "dump": | |
83 | + string ofType = args.PopWord("blocks"); | |
84 | + if (ofType == "items") { Dump_ItemList( ); } else { Dump_BlockList( ); } | |
85 | + break; | |
86 | + | |
87 | + default: | |
88 | + ClientAPI.ShowChatMessage("Unrecognised argument..."); | |
89 | + break; | |
90 | + } | |
91 | + } | |
92 | + else { | |
93 | + ClientAPI.ShowChatMessage("Needs a command: mark/save/clear/dump"); | |
94 | + } | |
95 | + } | |
96 | + | |
97 | + private void Process_MarkSubcommand(CmdArgs args) | |
98 | + { | |
99 | + if (args.Length > 0) { | |
100 | + string subCommand = args.PopWord( ).ToLowerInvariant( ); | |
101 | + | |
102 | + | |
103 | + switch (subCommand) { | |
104 | + case "start": | |
105 | + if (this.start == null) { | |
106 | + this.start = ClientAPI.World.Player.Entity.LocalPos.AsBlockPos.Copy( ); | |
107 | + } | |
108 | + BendBlockPosition(this.start, args); | |
109 | + | |
110 | + ClientAPI.ShowChatMessage(string.Format("Marked start; ({0}).", start)); | |
111 | + break; | |
112 | + | |
113 | + case "end": | |
114 | + if (this.end == null) { | |
115 | + this.end = ClientAPI.World.Player.Entity.LocalPos.AsBlockPos.Copy( ); | |
116 | + } | |
117 | + BendBlockPosition(this.end, args); | |
118 | + | |
119 | + ClientAPI.ShowChatMessage(string.Format("Marked end; ({0}).", end)); | |
120 | + break; | |
121 | + | |
122 | + default: | |
123 | + ClientAPI.ShowChatMessage("Mark: start or end ?"); | |
124 | + break; | |
125 | + } | |
126 | + | |
127 | + this.validSelection = false; | |
128 | + | |
129 | + if (this.start != null && | |
130 | + this.end != null && | |
131 | + ClientAPI.World.BulkBlockAccessor.IsValidPos(this.start) && | |
132 | + ClientAPI.World.BulkBlockAccessor.IsValidPos(this.end) | |
133 | + ) { | |
134 | + | |
135 | + //Calc. Vol: | |
136 | + var size = start.DistanceTo(end); | |
137 | + | |
138 | + if (size > 1) { | |
139 | + | |
140 | + this.validSelection = true; | |
141 | + | |
142 | + this.markedBlocks.Clear( ); | |
143 | + | |
144 | + ClientAPI.World.BulkBlockAccessor.WalkBlocks(start, end, addToMarked); | |
145 | + | |
146 | + ClientAPI.World.HighlightBlocks(ClientAPI.World.Player, _highlightSlot, this.markedBlocks, colorList, EnumHighlightBlocksMode.Absolute, EnumHighlightShape.Arbitrary); | |
147 | + | |
148 | + ClientAPI.ShowChatMessage(string.Format("Marked area: {0:f1}diag = {1} blocks", size, markedBlocks.Count)); | |
149 | + } | |
150 | + else { | |
151 | + ClientAPI.ShowChatMessage("Marked area: volume too small"); ; | |
152 | + } | |
153 | + } | |
154 | + } | |
155 | + else { | |
156 | + ClientAPI.ShowChatMessage("Mark: start / end (x,y,z +-1#)"); | |
157 | + } | |
158 | + | |
159 | + } | |
160 | + | |
161 | + private void BendBlockPosition(BlockPos position, CmdArgs args) | |
162 | + { | |
163 | + char? axis = args.PopChar( ); | |
164 | + int? offset = args.PopInt( ); | |
165 | + | |
166 | + if (axis.HasValue && offset.HasValue) { | |
167 | + switch (Char.ToLowerInvariant(axis.Value)) { | |
168 | + | |
169 | + case 'x': | |
170 | + ClientAPI.ShowChatMessage(string.Format("applied X offset {0},", offset.Value)); | |
171 | + position.Add(dx: offset.Value, dy: 0, dz: 0); | |
172 | + break; | |
173 | + | |
174 | + case 'y': | |
175 | + ClientAPI.ShowChatMessage(string.Format("applied Y offset {0},", offset.Value)); | |
176 | + position.Add(dx: 0, dy: offset.Value, dz: 0); | |
177 | + break; | |
178 | + | |
179 | + case 'z': | |
180 | + ClientAPI.ShowChatMessage(string.Format("applied Z offset {0},", offset.Value)); | |
181 | + position.Add(dx: 0, dy: 0, dz: offset.Value); | |
182 | + break; | |
183 | + | |
184 | + default: | |
185 | + //Nothing to do. | |
186 | + break; | |
187 | + } | |
188 | + } | |
189 | + } | |
190 | + | |
191 | + private void addToMarked(Block aBlock, BlockPos aPos) | |
192 | + { | |
193 | + this.markedBlocks.Add(aPos.Copy( )); | |
194 | + } | |
195 | + | |
196 | + private void Process_SaveCommand(string filename) | |
197 | + { | |
198 | + if (validSelection) { | |
199 | + | |
200 | + BlockSchematic blockExport = new BlockSchematic( ); | |
201 | + | |
202 | + blockExport.Init(ClientAPI.World.BlockAccessor); | |
203 | + | |
204 | + blockExport.AddArea(ClientAPI.World, this.start, this.end); | |
205 | + | |
206 | + if (blockExport.Pack(ClientAPI.World, this.start))//What should start Be? | |
207 | + { | |
208 | + ClientAPI.ShowChatMessage(string.Format("Export packed OK: {0} Blocks {1} Entities {2} BlockEntity", blockExport.BlockIds.Count, blockExport.Entities.Count, blockExport.BlockEntities.Count)); | |
209 | + | |
210 | + filename = Path.Combine(ClientAPI.GetOrCreateDataPath(_exportPath), filename); | |
211 | + | |
212 | + blockExport.Save(filename); | |
213 | + | |
214 | + Process_ClearCommand( ); | |
215 | + } | |
216 | + else { | |
217 | + ClientAPI.ShowChatMessage("Error; can't pack for export..."); | |
218 | + } | |
219 | + } | |
220 | + } | |
221 | + | |
222 | + | |
223 | + private void Process_ClearCommand( ) | |
224 | + { | |
225 | + this.start = null; | |
226 | + this.end = null; | |
227 | + this.validSelection = false; | |
228 | + this.markedBlocks.Clear( ); | |
229 | + ClientAPI.World.HighlightBlocks(ClientAPI.World.Player, _highlightSlot, this.markedBlocks, EnumHighlightBlocksMode.Absolute, EnumHighlightShape.Arbitrary); | |
230 | + | |
231 | + ClientAPI.ShowChatMessage("Mark(s) Cleared."); | |
232 | + } | |
233 | + | |
234 | + private void Dump_BlockList( ) | |
235 | + { | |
236 | + var filename = Path.Combine(ClientAPI.GetOrCreateDataPath(_exportPath), "vs_block_list_export_" + GameVersion.OverallVersion + ".tsv"); | |
237 | + | |
238 | + using (StreamWriter reporter = new StreamWriter(filename, false)) { | |
239 | + | |
240 | + reporter.WriteLine("MC Block Name\tVS Block Name\tVS ID#\tMaterial\t"); | |
241 | + Logger.VerboseDebug("Dumping {0} Blocks", ClientAPI.World.Blocks.Count); | |
242 | + foreach (var block in ClientAPI.World.Blocks.FindAll(blk => blk.Code != null && blk.Code.Domain == GlobalConstants.DefaultDomain)) { | |
243 | + if (block.Id != 0 && !block.IsMissing ) { | |
244 | + reporter.WriteLine($"____\t{block.Code.Path}\t{block.BlockId}\t{block.BlockMaterial}"); | |
245 | + | |
246 | + } | |
247 | + | |
248 | + } | |
249 | + | |
250 | + reporter.Flush( ); | |
251 | + } | |
252 | + | |
253 | + ClientAPI.ShowChatMessage("Created Block List...."); | |
254 | + } | |
255 | + | |
256 | + private void Dump_ItemList( ) | |
257 | + { | |
258 | + var filename = Path.Combine(ClientAPI.GetOrCreateDataPath(_exportPath), "vs_item_list_export_" + GameVersion.OverallVersion + ".tsv"); | |
259 | + | |
260 | + using (StreamWriter reporter = new StreamWriter(filename, false)) { | |
261 | + | |
262 | + reporter.WriteLine("MC Item Name\tVS Item Name\tVS ID#\tStorage Flags\tMax Stack Size\tC.I. Tabs\t"); | |
263 | + Logger.VerboseDebug("Dumping {0} Items", ClientAPI.World.Items.Count); | |
264 | + foreach (var item in ClientAPI.World.Items.FindAll(itm => itm.Code != null && itm.Code.Domain == GlobalConstants.DefaultDomain)) { | |
265 | + if (item.Id != 0 && !item.IsMissing) { | |
266 | + reporter.WriteLine($"____\t{item.Code.Path}\t{item.ItemId}\t{String.Join(",", item.StorageFlags)}\t{item.MaxStackSize}\t{(item.CreativeInventoryTabs != null ? String.Join(",",item.CreativeInventoryTabs): " ")}"); | |
267 | + } | |
268 | + | |
269 | + } | |
270 | + | |
271 | + reporter.Flush( ); | |
272 | + } | |
273 | + | |
274 | + ClientAPI.ShowChatMessage("Created Items List...."); | |
275 | + } | |
276 | + } | |
277 | +} | |
278 | + |
@@ -3,7 +3,7 @@ | ||
3 | 3 | "name": "Carbon-Copy", |
4 | 4 | "description" : "Export schematics from MP (clientside!)", |
5 | 5 | "authors": ["Melchior"], |
6 | - "version": "0.1.3", | |
6 | + "version": "0.1.4", | |
7 | 7 | "side": "client", |
8 | 8 | "dependencies": { |
9 | 9 | "game": "1.11.0" |