-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path_VBSPINFO_GENERATION_DETAILS.TXT
7984 lines (7711 loc) · 839 KB
/
_VBSPINFO_GENERATION_DETAILS.TXT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
THE EXHAUSTIVE PROCESS OF EXTRACTING ALL *.LMP'S IN ONE BATCH FILE
==================================================================
This is an extensive analysis to find "potentially useful" lumps and
the future automated process for tracking changes -- where the hexedits
will eventually "feed" off the *.TXT documentation itself.
Early in R&D it was the zeroing, iteration and failure that took
a lot of time. Since "EFFECTS/CLEARDRAW" and the elimination of
requiring LUMP 3 VERTEXES / LUMP 12 EDGES edit, the hex edits
themselves are becoming faster to do than the time it takes to
decompile the maps and extract the *.LMP's.
That's resolved here, by getting it all over with at once.
Lighting *.LMP's are included because they're simple texel bitmaps
and fun to play with and only amass to ~310 MB -- the exception
is PAKFILE's which account for ~700 MB and are 100% ignored here.
The several flavors of BSPSource 1.3.18 decompiles complement
this VBSPINFO work, absolutely maximizing an immediate toolset.
Algorithmically, the future of this *.BAT script is something like:
TRACKING L4D2 *.LMP FILE HEXEDITS -- Java / Go / PowerShell / etc.
1. Verify all client *.BSP SHA1's match the expected
2. Maintain a tab-delimited *.TXT file "spreadsheet":
+ Allow any number of tabs, so it can be formatted
neatly, but data entries must always be separated
by at least one
+ Section off by mapname (sorta like "anv_mapfixes.nut")
then, in like an embedded IF statement, by LUMP #:
"MAP" "c1m1_hotel"
"LUMP" "18 BRUSHES"
DESCRIBE_EDIT_HERE ARRAY_INDEX VALUE
Repeat...
3. Program needs to understand the relevant BSP structures, to
look at the above *.TXT file, then when it sees the map run
VBSPINFO to extract the *.LMP, there's no need to rename it
since the LUMP SYSTEM requires contiguous renaming BUT see
"Left 4 Orange (Alpha)"'s "_FILE_GENERATION_DETAILS.TXT"
for more details on that nightmare.
4. Ignore the "DESCRIBE_EDIT_HERE" comment, find the ARRAY_INDEX,
then implement the modified value.
This is just the start of figuring out generation of *.LMP's in real-time,
entirely on the client, where all they have to download is an executable
and the *.TXT file that tells it what to do. This system was originally
conceived when *.BSP edits were thought to be necessary, but since they're
*.LMP's, it might be a little over-kill for such a low-risk thing, but
allows the actual *.LMP hexedit implementation to "feed" off the documentation
of the changes itself.
Furthermore, support *.HTML conversion of that document, where screenshot
links inside the *.TXT will have previews/embeds on the *.HTML making it
even more friendly.
LET'S GET STARTED
=================
VBSPINFO exclusions and renamings are very tricky... following is an
analysis of lumps that were excluded (for good reason), and exceptions
of 0-byte files I'll have to be weary of:
"curling_stadium":
The *.BAT script has lines for all 62 maps for these:
08_LUMP_LIGHTING
15_LUMP_WORLDLIGHTS
But note that only "curling_stadium" produces non-0
lumps for them, 6.6 MB and 7000 bytes respectively,
so only that map will have these (VBSPINFO will still
have lines for the other maps, but empty lumps do not
produce any files with that, whereas with BSPSource's
BSPInfo that produces 0-byte *.BIN header-less files).
"c5m1_waterfront_sndscape":
53_LUMP_LIGHTING_HDR:
FYI: "credits" is compiled with HDR so it's non-0.
For "c5m1_waterfront_sndscape", this is 0-bytes,
and its 08_LUMP_LIGHTING is also 0-bytes, hence
why loading the map enforces "mat_fullbright 1".
Also 0-bytes for "curling_stadium".
I'm extracting all lighting from all 62 maps
and uploading them, even though they're 2-6 MB++,
because they can be easily modded as texel bitmaps.
62_LUMP_PHYSLEVEL:
This lump is 0-bytes for all maps, except for
"c5m1_waterfront_sndscape" where it is 4.6 MB.
Thus, this is included in the *.BAT script
for all 62 maps, but VBSPINFO only produces
files for this one non-0 lump.
All of these are always 0-bytes for all 62 maps so excluded
from the *.BAT script entirely:
22_LUMP_PROPCOLLISION
23_LUMP_PROPHULLS
24_LUMP_PROPHULLVERTS
25_LUMP_PROPTRIS
32_LUMP_DISP_LIGHTMAP_ALPHAS
38_LUMP_PRIMVERTS
49_LUMP_PROP_BLOB
50_LUMP_WATEROVERLAYS
57_LUMP_XZIPPAKFILE
63_LUMP_DISP_MULTIBLEND
All maps have these lumps as non-0 -- except for these maps,
for these specific lumps... everything listed below is 0-bytes
and, like the WATER lump, identifies environmental differences
(and other differences yet to be discovered) between the maps:
26_LUMP_DISPINFO credits
26_LUMP_DISPINFO curling_stadium
33_LUMP_DISP_VERTS credits
33_LUMP_DISP_VERTS curling_stadium
34_LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS credits
34_LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS curling_stadium
37_LUMP_PRIMITIVES credits
39_LUMP_PRIMINDICES credits
41_LUMP_CLIPPORTALVERTS c3m2_swamp
41_LUMP_CLIPPORTALVERTS c3m3_shantytown
41_LUMP_CLIPPORTALVERTS c14m1_junkyard
41_LUMP_CLIPPORTALVERTS credits
41_LUMP_CLIPPORTALVERTS curling_stadium
42_LUMP_CUBEMAPS credits
42_LUMP_CUBEMAPS curling_stadium
48_LUMP_DISP_TRIS credits
48_LUMP_DISP_TRIS curling_stadium
54_LUMP_WORLDLIGHTS_HDR c5m1_waterfront_sndscape
54_LUMP_WORLDLIGHTS_HDR curling_stadium
60_LUMP_OVERLAY_FADES credits
61_LUMP_OVERLAY_SYSTEM_LEVELS credits
All 62 maps never bother extracting the PAKFILE. Combined, all
of them are ~700 MB, and while "curling_stadium"'s PAKFILE is
only ~0.2 MB (the smallest, "credits" is actually 1.3 MB), these
files contain STRING_TABLES and ENV_CUBEMAP SCREENSHOTS and other
archived texture data that's just not worth manipulating.
40_LUMP_PAKFILE
Outliers / random factoids:
58_LUMP_FACES_HDR:
0-bytes for "c5m1_waterfront_sndscape" because VRAD
was never run at all (hence "mat_fullbright 1" forcing)
0-bytes for "curling_stadium", but VRAD was run to
produce the other 6.6 MB lighting file, but HDR unchecked.
45/62 maps have this lump at 12 bytes and are 100% identical,
most likely because OCCLUSION goes against BSP optimization:
09_LUMP_OCCLUSION
These maps might've cared a bit less about optimization
or needed func_occluders (etc.?) for specific cases:
1,492 c7m1_docks
864 c7m2_barge
232 c7m3_port
984 c8m1_apartment
176 c8m3_sewers
1,716 c8m5_rooftop
2,044 c9m1_alleys
108 c10m1_caves
2,776 c10m3_ranchhouse
1,124 c10m4_mainstreet
468 c10m5_houseboat
1,220 c11m1_greenhouse
704 c11m2_offices
1,160 c11m3_garage
980 c11m4_terminal
284 c12m5_cornfield
108 c14m2_lighthouse
33/62 maps have this at 0-bytes. Swampy areas, all of Hard Rain,
basically any map with water has this non-0... when NOT 0-bytes,
note they're still small and all range 12-352 bytes:
36_LUMP_LEAFWATERDATA
This is only 0-bytes for "credits" -- makes sense, there's no overlays:
45_LUMP_OVERLAYS
4-bytes for all 62 maps:
59_LUMP_MAP_FLAGS
Total stats:
862 lumps empty
2657 lumps have a comma in filesize and thus are over 1,000-bytes
449 lumps were specially compared (270 above / 179 below)
Combined, 862+2657+449 and 62*64 both = 3968.
179 lumps follow -- these are all lumps where the filesize lacked a
comma, and their sheer smallness provides some quick insight into
how useful those lumps probably won't be for those specific maps,
and they weren't covered in prior analysis -- this is just a final
effort to discern purpose of these lumps through comparison alone,
even though "lacking a comma" isn't that compelling/conclusive:
01_LUMP_PLANES 840 credits
02_LUMP_TEXDATA 64 credits
02_LUMP_TEXDATA 800 curling_stadium
02_LUMP_TEXDATA 992 tutorial_standards
03_LUMP_VERTEXES 756 credits
04_LUMP_VISIBILITY 345 c12m1_hilltop
04_LUMP_VISIBILITY 44 credits
05_LUMP_NODES 864 credits
06_LUMP_TEXINFO 288 credits
10_LUMP_LEAFS 928 credits
11_LUMP_FACEIDS 70 credits
12_LUMP_EDGES 412 credits
13_LUMP_SURFEDGES 712 credits
14_LUMP_MODELS 48 credits
14_LUMP_MODELS 624 curling_stadium
16_LUMP_LEAFFACES 70 credits
17_LUMP_LEAFBRUSHES 64 credits
18_LUMP_BRUSHES 120 credits
19_LUMP_BRUSHSIDES 480 credits
20_LUMP_AREAS 216 c1m1_hotel
20_LUMP_AREAS 80 c1m2_streets
20_LUMP_AREAS 232 c1m3_mall
20_LUMP_AREAS 168 c1m4_atrium
20_LUMP_AREAS 264 c2m1_highway
20_LUMP_AREAS 176 c2m2_fairgrounds
20_LUMP_AREAS 104 c2m3_coaster
20_LUMP_AREAS 136 c2m4_barns
20_LUMP_AREAS 120 c2m5_concert
20_LUMP_AREAS 112 c3m1_plankcountry
20_LUMP_AREAS 24 c3m2_swamp
20_LUMP_AREAS 24 c3m3_shantytown
20_LUMP_AREAS 312 c3m4_plantation
20_LUMP_AREAS 152 c4m1_milltown_a
20_LUMP_AREAS 112 c4m2_sugarmill_a
20_LUMP_AREAS 112 c4m3_sugarmill_b
20_LUMP_AREAS 152 c4m4_milltown_b
20_LUMP_AREAS 152 c4m5_milltown_escape
20_LUMP_AREAS 128 c5m1_waterfront
20_LUMP_AREAS 104 c5m1_waterfront_sndscape
20_LUMP_AREAS 120 c5m2_park
20_LUMP_AREAS 144 c5m3_cemetery
20_LUMP_AREAS 408 c5m4_quarter
20_LUMP_AREAS 48 c5m5_bridge
20_LUMP_AREAS 152 c6m1_riverbank
20_LUMP_AREAS 128 c6m2_bedlam
20_LUMP_AREAS 120 c6m3_port
20_LUMP_AREAS 136 c7m1_docks
20_LUMP_AREAS 96 c7m2_barge
20_LUMP_AREAS 88 c7m3_port
20_LUMP_AREAS 240 c8m1_apartment
20_LUMP_AREAS 384 c8m2_subway
20_LUMP_AREAS 440 c8m3_sewers
20_LUMP_AREAS 688 c8m4_interior
20_LUMP_AREAS 64 c8m5_rooftop
20_LUMP_AREAS 176 c9m1_alleys
20_LUMP_AREAS 256 c9m2_lots
20_LUMP_AREAS 56 c10m1_caves
20_LUMP_AREAS 112 c10m2_drainage
20_LUMP_AREAS 128 c10m3_ranchhouse
20_LUMP_AREAS 240 c10m4_mainstreet
20_LUMP_AREAS 88 c10m5_houseboat
20_LUMP_AREAS 136 c11m1_greenhouse
20_LUMP_AREAS 144 c11m2_offices
20_LUMP_AREAS 240 c11m3_garage
20_LUMP_AREAS 320 c11m4_terminal
20_LUMP_AREAS 64 c11m5_runway
20_LUMP_AREAS 88 c12m1_hilltop
20_LUMP_AREAS 192 c12m2_traintunnel
20_LUMP_AREAS 80 c12m3_bridge
20_LUMP_AREAS 128 c12m4_barn
20_LUMP_AREAS 96 c12m5_cornfield
20_LUMP_AREAS 64 c13m1_alpinecreek
20_LUMP_AREAS 48 c13m2_southpinestream
20_LUMP_AREAS 48 c13m3_memorialbridge
20_LUMP_AREAS 104 c13m4_cutthroatcreek
20_LUMP_AREAS 24 c14m1_junkyard
20_LUMP_AREAS 56 c14m2_lighthouse
20_LUMP_AREAS 16 credits
20_LUMP_AREAS 16 curling_stadium
20_LUMP_AREAS 56 tutorial_standards
20_LUMP_AREAS 56 tutorial_standards_vs
21_LUMP_AREAPORTALS 252 c1m2_streets
21_LUMP_AREAPORTALS 852 c1m3_mall
21_LUMP_AREAPORTALS 492 c1m4_atrium
21_LUMP_AREAPORTALS 636 c2m2_fairgrounds
21_LUMP_AREAPORTALS 348 c2m3_coaster
21_LUMP_AREAPORTALS 612 c2m4_barns
21_LUMP_AREAPORTALS 348 c2m5_concert
21_LUMP_AREAPORTALS 756 c3m1_plankcountry
21_LUMP_AREAPORTALS 12 c3m2_swamp
21_LUMP_AREAPORTALS 12 c3m3_shantytown
21_LUMP_AREAPORTALS 972 c5m1_waterfront
21_LUMP_AREAPORTALS 852 c5m1_waterfront_sndscape
21_LUMP_AREAPORTALS 612 c5m2_park
21_LUMP_AREAPORTALS 684 c5m3_cemetery
21_LUMP_AREAPORTALS 84 c5m5_bridge
21_LUMP_AREAPORTALS 852 c6m1_riverbank
21_LUMP_AREAPORTALS 876 c6m3_port
21_LUMP_AREAPORTALS 876 c7m1_docks
21_LUMP_AREAPORTALS 780 c7m2_barge
21_LUMP_AREAPORTALS 756 c7m3_port
21_LUMP_AREAPORTALS 252 c8m5_rooftop
21_LUMP_AREAPORTALS 156 c10m1_caves
21_LUMP_AREAPORTALS 516 c10m2_drainage
21_LUMP_AREAPORTALS 804 c10m3_ranchhouse
21_LUMP_AREAPORTALS 540 c10m5_houseboat
21_LUMP_AREAPORTALS 948 c11m1_greenhouse
21_LUMP_AREAPORTALS 708 c11m2_offices
21_LUMP_AREAPORTALS 156 c11m5_runway
21_LUMP_AREAPORTALS 204 c12m1_hilltop
21_LUMP_AREAPORTALS 804 c12m2_traintunnel
21_LUMP_AREAPORTALS 300 c12m3_bridge
21_LUMP_AREAPORTALS 780 c12m4_barn
21_LUMP_AREAPORTALS 876 c12m5_cornfield
21_LUMP_AREAPORTALS 204 c13m1_alpinecreek
21_LUMP_AREAPORTALS 84 c13m2_southpinestream
21_LUMP_AREAPORTALS 84 c13m3_memorialbridge
21_LUMP_AREAPORTALS 420 c13m4_cutthroatcreek
21_LUMP_AREAPORTALS 12 c14m1_junkyard
21_LUMP_AREAPORTALS 348 c14m2_lighthouse
21_LUMP_AREAPORTALS 12 credits
21_LUMP_AREAPORTALS 12 curling_stadium
21_LUMP_AREAPORTALS 132 tutorial_standards
21_LUMP_AREAPORTALS 132 tutorial_standards_vs
27_LUMP_ORIGINALFACES 392 credits
28_LUMP_PHYSDISP 307 c8m5_rooftop
28_LUMP_PHYSDISP 2 credits
28_LUMP_PHYSDISP 2 curling_stadium
28_LUMP_PHYSDISP 304 tutorial_standards
28_LUMP_PHYSDISP 304 tutorial_standards_vs
30_LUMP_VERTNORMALS 216 credits
30_LUMP_VERTNORMALS 720 tutorial_standards
30_LUMP_VERTNORMALS 732 tutorial_standards_vs
31_LUMP_VERTNORMALINDICES 300 credits
35_LUMP_GAME_LUMP 60 credits
43_LUMP_TEXDATA_STRING_DATA 605 curling_stadium
43_LUMP_TEXDATA_STRING_DATA 61 credits
43_LUMP_TEXDATA_STRING_DATA 757 tutorial_standards
43_LUMP_TEXDATA_STRING_DATA 826 tutorial_standards_vs
44_LUMP_TEXDATA_STRING_TABLE 908 c1m1_hotel
44_LUMP_TEXDATA_STRING_TABLE 896 c1m2_streets
44_LUMP_TEXDATA_STRING_TABLE 916 c2m1_highway
44_LUMP_TEXDATA_STRING_TABLE 712 c2m4_barns
44_LUMP_TEXDATA_STRING_TABLE 500 c2m5_concert
44_LUMP_TEXDATA_STRING_TABLE 540 c3m1_plankcountry
44_LUMP_TEXDATA_STRING_TABLE 320 c3m2_swamp
44_LUMP_TEXDATA_STRING_TABLE 492 c3m3_shantytown
44_LUMP_TEXDATA_STRING_TABLE 496 c3m4_plantation
44_LUMP_TEXDATA_STRING_TABLE 976 c4m2_sugarmill_a
44_LUMP_TEXDATA_STRING_TABLE 976 c4m3_sugarmill_b
44_LUMP_TEXDATA_STRING_TABLE 640 c5m1_waterfront
44_LUMP_TEXDATA_STRING_TABLE 708 c5m2_park
44_LUMP_TEXDATA_STRING_TABLE 864 c5m3_cemetery
44_LUMP_TEXDATA_STRING_TABLE 320 c5m5_bridge
44_LUMP_TEXDATA_STRING_TABLE 800 c6m3_port
44_LUMP_TEXDATA_STRING_TABLE 920 c7m1_docks
44_LUMP_TEXDATA_STRING_TABLE 904 c7m2_barge
44_LUMP_TEXDATA_STRING_TABLE 680 c7m3_port
44_LUMP_TEXDATA_STRING_TABLE 380 c11m5_runway
44_LUMP_TEXDATA_STRING_TABLE 576 c12m1_hilltop
44_LUMP_TEXDATA_STRING_TABLE 808 c12m3_bridge
44_LUMP_TEXDATA_STRING_TABLE 968 c12m4_barn
44_LUMP_TEXDATA_STRING_TABLE 712 c12m5_cornfield
44_LUMP_TEXDATA_STRING_TABLE 568 c13m1_alpinecreek
44_LUMP_TEXDATA_STRING_TABLE 592 c13m2_southpinestream
44_LUMP_TEXDATA_STRING_TABLE 532 c13m3_memorialbridge
44_LUMP_TEXDATA_STRING_TABLE 720 c13m4_cutthroatcreek
44_LUMP_TEXDATA_STRING_TABLE 972 c14m1_junkyard
44_LUMP_TEXDATA_STRING_TABLE 896 c14m2_lighthouse
44_LUMP_TEXDATA_STRING_TABLE 8 credits
44_LUMP_TEXDATA_STRING_TABLE 100 curling_stadium
44_LUMP_TEXDATA_STRING_TABLE 124 tutorial_standards
44_LUMP_TEXDATA_STRING_TABLE 136 tutorial_standards_vs
46_LUMP_LEAFMINDISTTOWATER 58 credits
47_LUMP_FACE_MACRO_TEXTURE_INFO 70 credits
51_LUMP_LEAF_AMBIENT_INDEX_HDR 116 credits
52_LUMP_LEAF_AMBIENT_INDEX 116 credits
55_LUMP_LEAF_AMBIENT_LIGHTING_HDR 112 credits
56_LUMP_LEAF_AMBIENT_LIGHTING 812 credits
SUMMARY
=======
These are the 64 lumps that VBSPINFO can extract, and I'll use
the *.BAT script to post-fix these names to those created *.LMP's:
00_LUMP_ENTITIES
01_LUMP_PLANES
02_LUMP_TEXDATA
03_LUMP_VERTEXES
04_LUMP_VISIBILITY
05_LUMP_NODES
06_LUMP_TEXINFO
07_LUMP_FACES
08_LUMP_LIGHTING
09_LUMP_OCCLUSION
10_LUMP_LEAFS
11_LUMP_FACEIDS
12_LUMP_EDGES
13_LUMP_SURFEDGES
14_LUMP_MODELS
15_LUMP_WORLDLIGHTS
16_LUMP_LEAFFACES
17_LUMP_LEAFBRUSHES
18_LUMP_BRUSHES
19_LUMP_BRUSHSIDES
20_LUMP_AREAS
21_LUMP_AREAPORTALS
22_LUMP_PROPCOLLISION
23_LUMP_PROPHULLS
24_LUMP_PROPHULLVERTS
25_LUMP_PROPTRIS
26_LUMP_DISPINFO
27_LUMP_ORIGINALFACES
28_LUMP_PHYSDISP
29_LUMP_PHYSCOLLIDE
30_LUMP_VERTNORMALS
31_LUMP_VERTNORMALINDICES
32_LUMP_DISP_LIGHTMAP_ALPHAS
33_LUMP_DISP_VERTS
34_LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS
35_LUMP_GAME_LUMP
36_LUMP_LEAFWATERDATA
37_LUMP_PRIMITIVES
38_LUMP_PRIMVERTS
39_LUMP_PRIMINDICES
40_LUMP_PAKFILE
41_LUMP_CLIPPORTALVERTS
42_LUMP_CUBEMAPS
43_LUMP_TEXDATA_STRING_DATA
44_LUMP_TEXDATA_STRING_TABLE
45_LUMP_OVERLAYS
46_LUMP_LEAFMINDISTTOWATER
47_LUMP_FACE_MACRO_TEXTURE_INFO
48_LUMP_DISP_TRIS
49_LUMP_PROP_BLOB
50_LUMP_WATEROVERLAYS
51_LUMP_LEAF_AMBIENT_INDEX_HDR
52_LUMP_LEAF_AMBIENT_INDEX
53_LUMP_LIGHTING_HDR
54_LUMP_WORLDLIGHTS_HDR
55_LUMP_LEAF_AMBIENT_LIGHTING_HDR
56_LUMP_LEAF_AMBIENT_LIGHTING
57_LUMP_XZIPPAKFILE
58_LUMP_FACES_HDR
59_LUMP_MAP_FLAGS
60_LUMP_OVERLAY_FADES
61_LUMP_OVERLAY_SYSTEM_LEVELS
62_LUMP_PHYSLEVEL
63_LUMP_DISP_MULTIBLEND
And these 11 lumps aren't wanted, because all 62 maps are always
0-bytes and PAKFILE's are just too large (especially Hard Rain,
which exceeds Github's filesize upload limit):
22_LUMP_PROPCOLLISION
23_LUMP_PROPHULLS
24_LUMP_PROPHULLVERTS
25_LUMP_PROPTRIS
32_LUMP_DISP_LIGHTMAP_ALPHAS
38_LUMP_PRIMVERTS
49_LUMP_PROP_BLOB
50_LUMP_WATEROVERLAYS
57_LUMP_XZIPPAKFILE
63_LUMP_DISP_MULTIBLEND
40_LUMP_PAKFILE
Leaves these 53 *.LMP's, which the *.BAT will try to extract for,
for all 62 maps (but none if empty, for cases documented above):
00_LUMP_ENTITIES
01_LUMP_PLANES
02_LUMP_TEXDATA
03_LUMP_VERTEXES
04_LUMP_VISIBILITY
05_LUMP_NODES
06_LUMP_TEXINFO
07_LUMP_FACES
08_LUMP_LIGHTING
09_LUMP_OCCLUSION
10_LUMP_LEAFS
11_LUMP_FACEIDS
12_LUMP_EDGES
13_LUMP_SURFEDGES
14_LUMP_MODELS
15_LUMP_WORLDLIGHTS
16_LUMP_LEAFFACES
17_LUMP_LEAFBRUSHES
18_LUMP_BRUSHES
19_LUMP_BRUSHSIDES
20_LUMP_AREAS
21_LUMP_AREAPORTALS
26_LUMP_DISPINFO
27_LUMP_ORIGINALFACES
28_LUMP_PHYSDISP
29_LUMP_PHYSCOLLIDE
30_LUMP_VERTNORMALS
31_LUMP_VERTNORMALINDICES
33_LUMP_DISP_VERTS
34_LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS
35_LUMP_GAME_LUMP
36_LUMP_LEAFWATERDATA
37_LUMP_PRIMITIVES
39_LUMP_PRIMINDICES
41_LUMP_CLIPPORTALVERTS
42_LUMP_CUBEMAPS
43_LUMP_TEXDATA_STRING_DATA
44_LUMP_TEXDATA_STRING_TABLE
45_LUMP_OVERLAYS
46_LUMP_LEAFMINDISTTOWATER
47_LUMP_FACE_MACRO_TEXTURE_INFO
48_LUMP_DISP_TRIS
51_LUMP_LEAF_AMBIENT_INDEX_HDR
52_LUMP_LEAF_AMBIENT_INDEX
53_LUMP_LIGHTING_HDR
54_LUMP_WORLDLIGHTS_HDR
55_LUMP_LEAF_AMBIENT_LIGHTING_HDR
56_LUMP_LEAF_AMBIENT_LIGHTING
58_LUMP_FACES_HDR
59_LUMP_MAP_FLAGS
60_LUMP_OVERLAY_FADES
61_LUMP_OVERLAY_SYSTEM_LEVELS
62_LUMP_PHYSLEVEL
That's not all -- once VBSPINFO runs through all of those, I'll
need to do a renaming operation on the files it makes -- that
will require specific hand-tuning to account for lumps that were
0-bytes only for specific maps.
That's why I did such extensive analysis on 0-byte exceptions,
to be able to reconcile them, and get the renamings right without
having to view the *.LMP file header of all these to determine
how it should be named.
In short: The *.BAT script includes all 62 maps, including all LIGHTING
where VBSPINFO returns no files for lumps which were 0-bytes, but entirely
excludes lumps where it's 0-bytes for every single map, and all PAKFILES.
LMPFIX IS NOT VIABLE
====================
HHD Hex Editor Neo is a bad text editor, so it's bad with LUMP 0 ENTITIES.
Which can be edited with Notepad++ or any text editor, then thrown into lmpfix
to fix the headers (i.e. "fileLen"):
http://steamreview.org/external/vdc/lmpfix.zip
lmpfix.zip's readme.txt
Fixes up standalone Source Engine entity lumps (.lmp files), in order to facilitate hand-editing by haxxors such as yourself.
Usage: lmpfix [-r] [-q] <lmp files>
-r: Rebuild headers from scratch
-q: No console output, don't pause on exit
lmpfix.zip's lmpfix.cpp
#include <tchar.h>
#include <iostream>
#include <fstream>
#define MAX_PATH 260
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
if(argc == 1)
{
cout << "\nLMPFIX 1.0\n**********\nFixes up standalone Source Engine entity lumps (.lmp files), in order to facilitate hand-editing by haxxors such as yourself.\n\n Usage: lmpfix [-r] [-q] <lmp files>\n\n\t-r: Rebuild headers from scratch\n\t-q: No console output, don't pause on exit\n";
return 0;
}
int lmp_header[5] =
{
20, // lump header length
0, // lump ID, always 0 in extracted lumps
0, // lump version, again always 0
-1, // lump bytes, will be set for each file
1234 // map version, unknown if rebuilding
};
bool rebuild, quiet = false;
for (int i=1;i<argc;i++)
{
if ( wcscmp(argv[i],L"-r") == 0)
{
rebuild = true;
continue;
}
if ( wcscmp(argv[i],L"-q") == 0)
{
quiet = true;
continue;
}
fstream lump;
lump.open(argv[i],ios_base::binary|ios_base::in|ios_base::out);
char mbpath[MAX_PATH];
wcstombs_s(0,mbpath,argv[i],MAX_PATH);
if (!lump)
{
if (!quiet)
{
cout << "Could not open \"" << mbpath << "\". ";
system("pause");
}
return 1;
}
lump.seekg(0,ios_base::end);
int len = int(lump.tellg()) - 20;
#ifdef _DEBUG
lump.seekg(12);
int decl_len;
lump.read((char*)&decl_len,sizeof(int));
char buf[40];
sprintf_s(buf,"%i vs %i",decl_len,len);
cout << buf << endl;
#endif
if (rebuild)
{
lmp_header[3] = len;
lump.seekp(0);
lump.write((char*)&lmp_header[0],sizeof(lmp_header));
}
else
{
for (int j=0;j<19;j++)
{
lump.seekg(j);
if (j == 12)
{
lump.seekp(j);
lump.write((char*)&len,sizeof(len));
j += sizeof(len);
continue;
}
if (lump.peek() == 0x20) // Notepad corruption
{
lump.seekp(j); // calling peek(), get() etc. corrupts the g/p pointers!
lump.put('\0');
}
}
}
lump.close();
if (!quiet)
{
cout << "Header for \"" << mbpath;
if (rebuild)
cout << "\" rebuilt. ";
else
cout << "\" fixed up. ";
}
}
if (!quiet)
system("pause");
return 0;
}
Rayman1103's process for LUMP 0:
+ Create new entities in decompiled VMF
+ Have a 2nd VMF with 0 entities, then copy/paste new entities into it
+ Then create a *.LMP file from that new VMF that only had the new stuff
+ Now you have a *.LMP with only the new data to copy/paste into official *.LMP
ENTITY lump's header is WAY DIFFERENT from LUMP 35 GAME LUMP, so should be
ignored. LMPFIX assumes it's LUMP 0... but updating "fileLen" simply
requires taking the *.LMP's filesize, -20 from it, then update the Hex.
VBSPINFO BATCH (*.BAT) CREATION PROCESS
=======================================
Preface:
I'm extracting *.LMP's from the *.BSP files directly.
ENTITIES 0 lump is simple compared to the others, so the resulting
*.LMP 0 files from these operations ARE_OLDER than the lump 0 files
introduced with TLS.
To have the most up-to-date TLS lump files, see the actual *.LMP 0
files that were shipped with TLS.
These VBSPINFO extractions are about 1:1 precisely representing the
BSP files themselves, independent of anything else.
The *.VMF decompiles I also do will have some include the TLS *.LMP
files, though, so the *.VMF's can be more up-to-date than other
Github sources for decompiled maps.
Firstly, I copied all lines from "Lump Hashes and Information.txt":
NOTE:
Above documentation planned that I'd identify the 0-byte
files manually -- turns out, BSPSource's BSPInfo extracted
*.BIN files already gave me all the "friendly names" for
all the lumps AND Github rejected my 0-byte files... so by
using this, I already have a perfect starting reference.
https://github.com/Tsuey/L4D2-BSP-Lump-Editing/blob/main/Lump%20Hashes%20and%20Information.txt
Extracting all *.LMP files with VBSPINFO can 100% ignore Scavenge/Survival:
1. Any change that's relevant to those modes will simply require
a copy/paste of the same *.LMP file used for Coop/Versus
2. In a perfect world, Kerry could add a new *.LMP file extension
that is loaded for Coop/Versus + Scavenge + Survival all at once
to avoid the needless copy/paste
There's one "Kerry QoL" that I'm going to assume won't happen:
Have him allow it so *.LMP files named _0 through _63 are always
read 0-63, instead of ENTITIES lump being (for example) _0 and
then the BRUSHES lump being _1... which can be confusing
It will_not_be_confusing for this base VBSPINFO pass, though,
since I'll name them according to their actual LUMP #'s... they'll
just need to given the proper _1/_2 increment to be compatible
with the live game.
As a quick reminder, from "_FILE_GENERATION_DETAILS.TXT":
These maps need to start at _l_0 since TLS didn't replace any lumps:
c5m1_waterfront_sndscape
credits
curling_stadium
tutorial_standards
tutorial_standards_vs
That means, every_single_other_map starts at _l_1 since they will
already have Rayman1103's ENTITIES 0 *.LMP files in the live game.
Again, this numbering is not_relevant to this VBSPINFO pass
because I'll number everything according to their actual lump #'s.
Some statistics and expected results:
62*64 = 3968 *.LMP files theoretically possible
that is the number of BSPSource's BSPInfo total extracted *.BIN
files, since that produced files even though they were 0-bytes
but in reality, 10 lumps are always empty for all 62 maps
and an 11th lump for PAKFILE can and should be skipped for all 62
I'm already including the LIGHTING lumps, even though for mods
they don't hold much potential since zero'ing them does not
produce results, they need to retain full "Bitmap" file sizes
so this becomes 3968 - (11*64) or 3968 - 704 or 3264
when all is done there must be less than or equal to 3264 *.LMP files
it will be less than that, since some maps have 0-bytes for some
files but not for others
Now we return to "Lump Hashes and Information.txt" to run a few passes to
clean out the undesirable *.BIN files:
Find "\.bin" and Bookmark/Cut all 3968 lines
That leaves 188 lines that are irrelevant, such as BSP / LMP
hashes, screenshot, and this TXT file itself
Remove all 0-byte *.BIN files:
Find and Bookmark/Cut " AM 0 A "
862 lines were cut out and all verified as 0-bytes
These are 862 files that VBSPINFO would've refused
to produce, this it doesn't create *.LMP's for lumps
that are genuinely empty
3106 lines remain
STATISTIC: The above means that all the following 28 lumps are
seen as 0-bytes at least once... but not necessarily always,
as said before only 10 of these are always 0-bytes for ALL maps:
** Seems like a lot, but there are plenty of one-offs
** Reminder:
58_LUMP_FACES_HDR is used if 53_LUMP_LIGHTING_HDR
is non-0, which means VRAD+HDR was run.
If no HDR, then 07_LUMP_FACES is used. All 62 maps
have non-0 FACES because it critically defines the
faces that make up the map's geometry. The largest
and smallest 07_LUMP_FACES are:
1,054,368 \c11m4_terminal\07_LUMP_FACES.bin
1,960 \credits\07_LUMP_FACES.bin
Which corresponds to how complex interior geometry is.
"EFFECTS/CLEARDRAW" for making faces invisible:
If 53_LUMP_LIGHTING_HDR is non-0, then
modify only 58_LUMP_FACES_HDR
If 53_LUMP_LIGHTING_HDR is 0-bytes, then
modify only 07_LUMP_FACES
Only the "developer" like SNDSCAPE have 0-byte lighting.
** Anyway, here's those 28...
08_LUMP_LIGHTING.bin
15_LUMP_WORLDLIGHTS.bin
22_LUMP_PROPCOLLISION.bin
23_LUMP_PROPHULLS.bin
24_LUMP_PROPHULLVERTS.bin
25_LUMP_PROPTRIS.bin
26_LUMP_DISPINFO.bin
32_LUMP_DISP_LIGHTMAP_ALPHAS.bin
33_LUMP_DISP_VERTS.bin
34_LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS.bin
36_LUMP_LEAFWATERDATA.bin
37_LUMP_PRIMITIVES.bin
38_LUMP_PRIMVERTS.bin
39_LUMP_PRIMINDICES.bin
41_LUMP_CLIPPORTALVERTS.bin
42_LUMP_CUBEMAPS.bin
45_LUMP_OVERLAYS.bin
48_LUMP_DISP_TRIS.bin
49_LUMP_PROP_BLOB.bin
50_LUMP_WATEROVERLAYS.bin
53_LUMP_LIGHTING_HDR.bin
54_LUMP_WORLDLIGHTS_HDR.bin
57_LUMP_XZIPPAKFILE.bin
58_LUMP_FACES_HDR.bin
60_LUMP_OVERLAY_FADES.bin
61_LUMP_OVERLAY_SYSTEM_LEVELS.bin
62_LUMP_PHYSLEVEL.bin
63_LUMP_DISP_MULTIBLEND.bin
3106 lines remain
Github's 25 MB file limit is_not_worth_fighting:
Github has a uploading limit for 25 MB. If you use the
browser mode for uploading
https://qifengzhou.github.io/2018/04/29/Upload%20files%20bigger%20than%2025%20MB%20to%20Github/
Git Large File Storage (LFS) replaces large files such as
audio samples, videos, datasets, and graphics with text
pointers inside Git, while storing the file contents on
a remote server like GitHub.com or GitHub Enterprise
https://git-lfs.github.com/
Text pointers? Remote server? Even if I went up to 100 MB limit it
sounds like they still won't be stored on Github at all anyway
Find and Bookmark/Cut all lines with "40_LUMP_PAKFILE":
3106 lines original
62 PAKFILE lines removed
3044 lines remain
Intermission: Let's create a *.BAT file right now that uses VBSPINFO to
extract all 62 of those PAKFILE's, which won't be put on Github, but I
will keep them locally for possible reference in the future... since, they
still have somewhat actionable data in them, it's just simpler data that
isn't going to be nearly as complicated as editing BSP clips / geometry.
That process:
Complex RegEx's used:
Find ^"C:\\(.*) -X40 "(.*)\.bsp"\n
Replace "C:\\\1 -X40 "\2\.bsp"\nmove "\2_l_0\.lmp" "J:\\__PATH__\\Compiled PC Live BSP's \(Extracted Lumps VBSPINFO only PAKFILE\)\\\2_l_0 -- 40_LUMP_PAKFILE\.lmp"\n
Resulting 128-line BATCH (*.BAT) file, ran via double-click (if "as Admin"
even with the CD it will root to C:\Windows\System32\ and not find any of
the BSP files), it ran, then produced 62 *.lmp files as desired:
cd "J:\__PATH__\Compiled PC Live BSP's (Again and Identical)\"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c1m1_hotel.bsp"
move "c1m1_hotel_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c1m1_hotel_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c1m2_streets.bsp"
move "c1m2_streets_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c1m2_streets_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c1m3_mall.bsp"
move "c1m3_mall_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c1m3_mall_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c1m4_atrium.bsp"
move "c1m4_atrium_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c1m4_atrium_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c2m1_highway.bsp"
move "c2m1_highway_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c2m1_highway_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c2m2_fairgrounds.bsp"
move "c2m2_fairgrounds_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c2m2_fairgrounds_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c2m3_coaster.bsp"
move "c2m3_coaster_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c2m3_coaster_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c2m4_barns.bsp"
move "c2m4_barns_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c2m4_barns_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c2m5_concert.bsp"
move "c2m5_concert_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c2m5_concert_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c3m1_plankcountry.bsp"
move "c3m1_plankcountry_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c3m1_plankcountry_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c3m2_swamp.bsp"
move "c3m2_swamp_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c3m2_swamp_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c3m3_shantytown.bsp"
move "c3m3_shantytown_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c3m3_shantytown_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c3m4_plantation.bsp"
move "c3m4_plantation_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c3m4_plantation_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c4m1_milltown_a.bsp"
move "c4m1_milltown_a_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c4m1_milltown_a_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c4m2_sugarmill_a.bsp"
move "c4m2_sugarmill_a_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c4m2_sugarmill_a_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c4m3_sugarmill_b.bsp"
move "c4m3_sugarmill_b_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c4m3_sugarmill_b_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c4m4_milltown_b.bsp"
move "c4m4_milltown_b_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c4m4_milltown_b_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c4m5_milltown_escape.bsp"
move "c4m5_milltown_escape_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c4m5_milltown_escape_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c5m1_waterfront.bsp"
move "c5m1_waterfront_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c5m1_waterfront_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c5m1_waterfront_sndscape.bsp"
move "c5m1_waterfront_sndscape_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c5m1_waterfront_sndscape_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c5m2_park.bsp"
move "c5m2_park_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c5m2_park_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c5m3_cemetery.bsp"
move "c5m3_cemetery_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c5m3_cemetery_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c5m4_quarter.bsp"
move "c5m4_quarter_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c5m4_quarter_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c5m5_bridge.bsp"
move "c5m5_bridge_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c5m5_bridge_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c6m1_riverbank.bsp"
move "c6m1_riverbank_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c6m1_riverbank_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c6m2_bedlam.bsp"
move "c6m2_bedlam_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c6m2_bedlam_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c6m3_port.bsp"
move "c6m3_port_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c6m3_port_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c7m1_docks.bsp"
move "c7m1_docks_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c7m1_docks_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c7m2_barge.bsp"
move "c7m2_barge_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c7m2_barge_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c7m3_port.bsp"
move "c7m3_port_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c7m3_port_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c8m1_apartment.bsp"
move "c8m1_apartment_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c8m1_apartment_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c8m2_subway.bsp"
move "c8m2_subway_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c8m2_subway_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c8m3_sewers.bsp"
move "c8m3_sewers_l_0.lmp" "J:\__PATH__\Compiled PC Live BSP's (Extracted Lumps VBSPINFO only PAKFILE)\c8m3_sewers_l_0 -- 40_LUMP_PAKFILE.lmp"
"C:\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\bin\vbspinfo.exe" -X40 "c8m4_interior.bsp"